mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +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
	 Brian Behlendorf
						Brian Behlendorf