]> git.proxmox.com Git - mirror_zfs-debian.git/commitdiff
fzap_cursor_move_to_key() should drop l_rwlock
authorNed Bass <bass6@llnl.gov>
Tue, 22 Jan 2013 22:33:01 +0000 (14:33 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 24 Jan 2013 00:31:16 +0000 (16:31 -0800)
Callers of zap_deref_leaf() must be careful to drop leaf->l_rwlock
since that function returns with the lock held on success.  All other
callers drop the lock correctly but it seems fzap_cursor_move_to_key()
does not.  This may block writers or cause VERIFY failures when the
lock is freed.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #1215
Closes zfsonlinux/spl#143
Closes zfsonlinux/spl#97

module/zfs/zap.c

index fd3021be6df5d4649fd63d87fdd48ce8fb58da0b..a6c8c82ff70270a44ae80de880575938f5e44e44 100644 (file)
@@ -1257,13 +1257,13 @@ fzap_cursor_move_to_key(zap_cursor_t *zc, zap_name_t *zn)
                return (err);
 
        err = zap_leaf_lookup(l, zn, &zeh);
-       if (err != 0)
-               return (err);
-
-       zc->zc_leaf = l;
-       zc->zc_hash = zeh.zeh_hash;
-       zc->zc_cd = zeh.zeh_cd;
+       if (err == 0) {
+               zc->zc_leaf = l;
+               zc->zc_hash = zeh.zeh_hash;
+               zc->zc_cd = zeh.zeh_cd;
+       }
 
+       rw_exit(&l->l_rwlock);
        return (err);
 }