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 <behlendorf1@llnl.gov>
Closes #1215
Closes zfsonlinux/spl#143
Closes zfsonlinux/spl#97
This commit is contained in:
Ned Bass 2013-01-22 14:33:01 -08:00 committed by Brian Behlendorf
parent 09a661e960
commit 1305d33a4b

View File

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