aboutsummaryrefslogtreecommitdiffstats
path: root/module/zfs/zap.c
diff options
context:
space:
mode:
authorNed Bass <[email protected]>2013-01-22 14:33:01 -0800
committerBrian Behlendorf <[email protected]>2013-01-23 16:31:16 -0800
commit1305d33a4b0f8b10cea61989330cc5d059cfa7cb (patch)
tree51b326b613314ab6602e97e845afc0971a2e8cb6 /module/zfs/zap.c
parent09a661e960df49f1256ba4c5ae15f6956d27df84 (diff)
fzap_cursor_move_to_key() should drop l_rwlock
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 <[email protected]> Closes #1215 Closes zfsonlinux/spl#143 Closes zfsonlinux/spl#97
Diffstat (limited to 'module/zfs/zap.c')
-rw-r--r--module/zfs/zap.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/module/zfs/zap.c b/module/zfs/zap.c
index fd3021be6..a6c8c82ff 100644
--- a/module/zfs/zap.c
+++ b/module/zfs/zap.c
@@ -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);
}