From 1305d33a4b0f8b10cea61989330cc5d059cfa7cb Mon Sep 17 00:00:00 2001 From: Ned Bass Date: Tue, 22 Jan 2013 14:33:01 -0800 Subject: [PATCH] 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 Closes #1215 Closes zfsonlinux/spl#143 Closes zfsonlinux/spl#97 --- module/zfs/zap.c | 12 ++++++------ 1 file 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); } -- 2.40.0