mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-01-13 19:50:25 +03:00
Condition variable usage, zp->r_{rd,wr}_cv
The following incorrect usage of cv_broadcast() was caught by code inspection. The cv_broadcast() function must be called under the associated mutex to preventing racing with cv_wait(). Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
parent
8c0712fd88
commit
a298dbde92
@ -486,7 +486,7 @@ zfs_range_unlock_reader(znode_t *zp, rl_t *remove, list_t *free_list)
|
|||||||
*/
|
*/
|
||||||
if (remove->r_cnt == 1) {
|
if (remove->r_cnt == 1) {
|
||||||
avl_remove(tree, remove);
|
avl_remove(tree, remove);
|
||||||
mutex_exit(&zp->z_range_lock);
|
|
||||||
if (remove->r_write_wanted)
|
if (remove->r_write_wanted)
|
||||||
cv_broadcast(&remove->r_wr_cv);
|
cv_broadcast(&remove->r_wr_cv);
|
||||||
|
|
||||||
@ -530,7 +530,6 @@ zfs_range_unlock_reader(znode_t *zp, rl_t *remove, list_t *free_list)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_exit(&zp->z_range_lock);
|
|
||||||
kmem_free(remove, sizeof (rl_t));
|
kmem_free(remove, sizeof (rl_t));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -554,7 +553,6 @@ zfs_range_unlock(rl_t *rl)
|
|||||||
if (rl->r_type == RL_WRITER) {
|
if (rl->r_type == RL_WRITER) {
|
||||||
/* writer locks can't be shared or split */
|
/* writer locks can't be shared or split */
|
||||||
avl_remove(&zp->z_range_avl, rl);
|
avl_remove(&zp->z_range_avl, rl);
|
||||||
mutex_exit(&zp->z_range_lock);
|
|
||||||
if (rl->r_write_wanted)
|
if (rl->r_write_wanted)
|
||||||
cv_broadcast(&rl->r_wr_cv);
|
cv_broadcast(&rl->r_wr_cv);
|
||||||
|
|
||||||
@ -569,6 +567,7 @@ zfs_range_unlock(rl_t *rl)
|
|||||||
*/
|
*/
|
||||||
zfs_range_unlock_reader(zp, rl, &free_list);
|
zfs_range_unlock_reader(zp, rl, &free_list);
|
||||||
}
|
}
|
||||||
|
mutex_exit(&zp->z_range_lock);
|
||||||
|
|
||||||
while ((free_rl = list_head(&free_list)) != NULL) {
|
while ((free_rl = list_head(&free_list)) != NULL) {
|
||||||
list_remove(&free_list, free_rl);
|
list_remove(&free_list, free_rl);
|
||||||
@ -599,11 +598,13 @@ zfs_range_reduce(rl_t *rl, uint64_t off, uint64_t len)
|
|||||||
mutex_enter(&zp->z_range_lock);
|
mutex_enter(&zp->z_range_lock);
|
||||||
rl->r_off = off;
|
rl->r_off = off;
|
||||||
rl->r_len = len;
|
rl->r_len = len;
|
||||||
mutex_exit(&zp->z_range_lock);
|
|
||||||
if (rl->r_write_wanted)
|
if (rl->r_write_wanted)
|
||||||
cv_broadcast(&rl->r_wr_cv);
|
cv_broadcast(&rl->r_wr_cv);
|
||||||
if (rl->r_read_wanted)
|
if (rl->r_read_wanted)
|
||||||
cv_broadcast(&rl->r_rd_cv);
|
cv_broadcast(&rl->r_rd_cv);
|
||||||
|
|
||||||
|
mutex_exit(&zp->z_range_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user