]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Add missing dmu_buf_unlock_parent() calls to dbuf_read_impl()
authorBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 10 Feb 2020 22:54:12 +0000 (14:54 -0800)
committerGitHub <noreply@github.com>
Mon, 10 Feb 2020 22:54:12 +0000 (14:54 -0800)
As explained by the comment in dbuf_read() and above dbuf_read_impl().
Under all circumstances the parent lock specified by dblt should be
dropped when existing dbuf_read_impl().  This was not being done for
two exist paths.  Additionally, ensure the mutex is unlocked before
dropping the parent lock.

Reviewed-by: Paul Dagnelie <pcd@delphix.com>
Reviewed-by: Igor Kozhukhov <igor@dilos.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #9968

module/zfs/dbuf.c

index 02478605fca3da3e3548662fb61322bdb7b92d82..0256f3a4cccf54dfb2a4f9ddaf3a59e432abaccb 100644 (file)
@@ -1321,6 +1321,7 @@ dbuf_read_impl(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags,
                if (err != 0) {
                        DB_DNODE_EXIT(db);
                        mutex_exit(&db->db_mtx);
+                       dmu_buf_unlock_parent(db, dblt, tag);
                        return (err);
                }
 
@@ -1390,6 +1391,7 @@ dbuf_read_impl(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags,
                    SPA_FEATURE_REDACTED_DATASETS));
                DB_DNODE_EXIT(db);
                mutex_exit(&db->db_mtx);
+               dmu_buf_unlock_parent(db, dblt, tag);
                return (SET_ERROR(EIO));
        }
 
@@ -1414,8 +1416,8 @@ dbuf_read_impl(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags,
        err = dbuf_read_verify_dnode_crypt(db, flags);
        if (err != 0) {
                DB_DNODE_EXIT(db);
-               dmu_buf_unlock_parent(db, dblt, tag);
                mutex_exit(&db->db_mtx);
+               dmu_buf_unlock_parent(db, dblt, tag);
                return (err);
        }