Print this page
5045 use atomic_{inc,dec}_* instead of atomic_add_*
*** 931,941 ****
*/
ufs_thread_suspend(&ufsvfsp->vfs_reclaim);
ufs_thread_suspend(&ufsvfsp->vfs_delete);
mutex_enter(&ulp->ul_lock);
! atomic_add_long(&ufs_quiesce_pend, 1);
/*
* Quit if there is another lockfs request in progress
* that is waiting for existing ufs_vnops to complete.
*/
--- 931,941 ----
*/
ufs_thread_suspend(&ufsvfsp->vfs_reclaim);
ufs_thread_suspend(&ufsvfsp->vfs_delete);
mutex_enter(&ulp->ul_lock);
! atomic_inc_ulong(&ufs_quiesce_pend);
/*
* Quit if there is another lockfs request in progress
* that is waiting for existing ufs_vnops to complete.
*/
*** 1161,1171 ****
!(ufsvfsp->vfs_fsfx.fx_flags & (UFSMNT_ONERROR_PANIC >> 4)))
(void) ufs_fault(ufsvfsp->vfs_root,
ulp->ul_lockfs.lf_comment && ulp->ul_lockfs.lf_comlen > 0 ?
ulp->ul_lockfs.lf_comment: "user-applied error lock");
! atomic_add_long(&ufs_quiesce_pend, -1);
mutex_exit(&ulp->ul_lock);
vfs_unlock(vfsp);
if (ULOCKFS_IS_HLOCK(&ufsvfsp->vfs_ulockfs))
poll_events |= POLLERR;
--- 1161,1171 ----
!(ufsvfsp->vfs_fsfx.fx_flags & (UFSMNT_ONERROR_PANIC >> 4)))
(void) ufs_fault(ufsvfsp->vfs_root,
ulp->ul_lockfs.lf_comment && ulp->ul_lockfs.lf_comlen > 0 ?
ulp->ul_lockfs.lf_comment: "user-applied error lock");
! atomic_dec_ulong(&ufs_quiesce_pend);
mutex_exit(&ulp->ul_lock);
vfs_unlock(vfsp);
if (ULOCKFS_IS_HLOCK(&ufsvfsp->vfs_ulockfs))
poll_events |= POLLERR;
*** 1200,1210 ****
ULOCKFS_CLR_BUSY(ulp);
LOCKFS_CLR_BUSY(&ulp->ul_lockfs);
errexit:
! atomic_add_long(&ufs_quiesce_pend, -1);
mutex_exit(&ulp->ul_lock);
vfs_unlock(vfsp);
/*
* Allow both the delete thread and the reclaim thread to
--- 1200,1210 ----
ULOCKFS_CLR_BUSY(ulp);
LOCKFS_CLR_BUSY(&ulp->ul_lockfs);
errexit:
! atomic_dec_ulong(&ufs_quiesce_pend);
mutex_exit(&ulp->ul_lock);
vfs_unlock(vfsp);
/*
* Allow both the delete thread and the reclaim thread to
*** 1297,1310 ****
return (EINTR);
}
}
if (mask & ULOCKFS_FWLOCK) {
! atomic_add_long(&ulp->ul_falloc_cnt, 1);
ULOCKFS_SET_FALLOC(ulp);
} else {
! atomic_add_long(&ulp->ul_vnops_cnt, 1);
}
return (0);
}
--- 1297,1310 ----
return (EINTR);
}
}
if (mask & ULOCKFS_FWLOCK) {
! atomic_inc_ulong(&ulp->ul_falloc_cnt);
ULOCKFS_SET_FALLOC(ulp);
} else {
! atomic_inc_ulong(&ulp->ul_vnops_cnt);
}
return (0);
}
*** 1378,1388 ****
* never see the value of zero for ctr - a livelock kind of scenario.
*/
ctr = (mask & ULOCKFS_FWLOCK) ?
&ulp->ul_falloc_cnt : &ulp->ul_vnops_cnt;
if (!ULOCKFS_IS_SLOCK(ulp)) {
! atomic_add_long(ctr, 1);
op_cnt_incremented++;
}
/*
* If the lockfs state (indicated by ul_fs_lock) is not just
--- 1378,1388 ----
* never see the value of zero for ctr - a livelock kind of scenario.
*/
ctr = (mask & ULOCKFS_FWLOCK) ?
&ulp->ul_falloc_cnt : &ulp->ul_vnops_cnt;
if (!ULOCKFS_IS_SLOCK(ulp)) {
! atomic_inc_ulong(ctr);
op_cnt_incremented++;
}
/*
* If the lockfs state (indicated by ul_fs_lock) is not just
*** 1397,1407 ****
* so make use of ufs_quiesce_pend to disallow vnode operations when a
* quiesce is in progress.
*/
if (!ULOCKFS_IS_JUSTULOCK(ulp) || ufs_quiesce_pend) {
if (op_cnt_incremented)
! if (!atomic_add_long_nv(ctr, -1))
cv_broadcast(&ulp->ul_cv);
mutex_enter(&ulp->ul_lock);
error = ufs_check_lockfs(ufsvfsp, ulp, mask);
mutex_exit(&ulp->ul_lock);
if (error) {
--- 1397,1407 ----
* so make use of ufs_quiesce_pend to disallow vnode operations when a
* quiesce is in progress.
*/
if (!ULOCKFS_IS_JUSTULOCK(ulp) || ufs_quiesce_pend) {
if (op_cnt_incremented)
! if (!atomic_dec_ulong_nv(ctr))
cv_broadcast(&ulp->ul_cv);
mutex_enter(&ulp->ul_lock);
error = ufs_check_lockfs(ufsvfsp, ulp, mask);
mutex_exit(&ulp->ul_lock);
if (error) {
*** 1512,1529 ****
/* fallocate thread */
if (ULOCKFS_IS_FALLOC(ulp) && info->flags & ULOCK_INFO_FALLOCATE) {
/* Clear the thread's fallocate state */
info->flags &= ~ULOCK_INFO_FALLOCATE;
! if (!atomic_add_long_nv(&ulp->ul_falloc_cnt, -1)) {
mutex_enter(&ulp->ul_lock);
ULOCKFS_CLR_FALLOC(ulp);
cv_broadcast(&ulp->ul_cv);
mutex_exit(&ulp->ul_lock);
}
} else { /* normal thread */
! if (!atomic_add_long_nv(&ulp->ul_vnops_cnt, -1))
cv_broadcast(&ulp->ul_cv);
}
}
/*
--- 1512,1529 ----
/* fallocate thread */
if (ULOCKFS_IS_FALLOC(ulp) && info->flags & ULOCK_INFO_FALLOCATE) {
/* Clear the thread's fallocate state */
info->flags &= ~ULOCK_INFO_FALLOCATE;
! if (!atomic_dec_ulong_nv(&ulp->ul_falloc_cnt)) {
mutex_enter(&ulp->ul_lock);
ULOCKFS_CLR_FALLOC(ulp);
cv_broadcast(&ulp->ul_cv);
mutex_exit(&ulp->ul_lock);
}
} else { /* normal thread */
! if (!atomic_dec_ulong_nv(&ulp->ul_vnops_cnt))
cv_broadcast(&ulp->ul_cv);
}
}
/*
*** 1585,1595 ****
* never see the value of zero for ctr - a livelock kind of scenario.
*/
ctr = (mask & ULOCKFS_FWLOCK) ?
&ulp->ul_falloc_cnt : &ulp->ul_vnops_cnt;
if (!ULOCKFS_IS_SLOCK(ulp)) {
! atomic_add_long(ctr, 1);
op_cnt_incremented++;
}
if (!ULOCKFS_IS_JUSTULOCK(ulp) || ufs_quiesce_pend) {
/*
--- 1585,1595 ----
* never see the value of zero for ctr - a livelock kind of scenario.
*/
ctr = (mask & ULOCKFS_FWLOCK) ?
&ulp->ul_falloc_cnt : &ulp->ul_vnops_cnt;
if (!ULOCKFS_IS_SLOCK(ulp)) {
! atomic_inc_ulong(ctr);
op_cnt_incremented++;
}
if (!ULOCKFS_IS_JUSTULOCK(ulp) || ufs_quiesce_pend) {
/*
*** 1599,1609 ****
* and if ulp->ul_fs_lock allows this operation, increment
* the appropriate counter and proceed (For eg., In case the
* file system is delete locked, a mmap can still go through).
*/
if (op_cnt_incremented)
! if (!atomic_add_long_nv(ctr, -1))
cv_broadcast(&ulp->ul_cv);
mutex_enter(&ulp->ul_lock);
if (ULOCKFS_IS_HLOCK(ulp) ||
(ULOCKFS_IS_ELOCK(ulp) && ufsvfsp->vfs_dontblock))
error = EIO;
--- 1599,1609 ----
* and if ulp->ul_fs_lock allows this operation, increment
* the appropriate counter and proceed (For eg., In case the
* file system is delete locked, a mmap can still go through).
*/
if (op_cnt_incremented)
! if (!atomic_dec_ulong_nv(ctr))
cv_broadcast(&ulp->ul_cv);
mutex_enter(&ulp->ul_lock);
if (ULOCKFS_IS_HLOCK(ulp) ||
(ULOCKFS_IS_ELOCK(ulp) && ufsvfsp->vfs_dontblock))
error = EIO;
*** 1615,1625 ****
if (ulockfs_info_free == NULL)
kmem_free(ulockfs_info_temp,
sizeof (ulockfs_info_t));
return (error);
}
! atomic_add_long(ctr, 1);
if (mask & ULOCKFS_FWLOCK)
ULOCKFS_SET_FALLOC(ulp);
mutex_exit(&ulp->ul_lock);
} else {
/*
--- 1615,1625 ----
if (ulockfs_info_free == NULL)
kmem_free(ulockfs_info_temp,
sizeof (ulockfs_info_t));
return (error);
}
! atomic_inc_ulong(ctr);
if (mask & ULOCKFS_FWLOCK)
ULOCKFS_SET_FALLOC(ulp);
mutex_exit(&ulp->ul_lock);
} else {
/*
*** 1646,1656 ****
if (ulockfs_info_free == NULL)
kmem_free(ulockfs_info_temp,
sizeof (ulockfs_info_t));
return (error);
}
! atomic_add_long(ctr, 1);
if (mask & ULOCKFS_FWLOCK)
ULOCKFS_SET_FALLOC(ulp);
mutex_exit(&ulp->ul_lock);
} else if (mask & ULOCKFS_FWLOCK) {
mutex_enter(&ulp->ul_lock);
--- 1646,1656 ----
if (ulockfs_info_free == NULL)
kmem_free(ulockfs_info_temp,
sizeof (ulockfs_info_t));
return (error);
}
! atomic_inc_ulong(ctr);
if (mask & ULOCKFS_FWLOCK)
ULOCKFS_SET_FALLOC(ulp);
mutex_exit(&ulp->ul_lock);
} else if (mask & ULOCKFS_FWLOCK) {
mutex_enter(&ulp->ul_lock);
*** 1728,1740 ****
}
/*
* First time VOP call
*/
! atomic_add_long(&ulp->ul_vnops_cnt, 1);
if (!ULOCKFS_IS_JUSTULOCK(ulp) || ufs_quiesce_pend) {
! if (!atomic_add_long_nv(&ulp->ul_vnops_cnt, -1))
cv_broadcast(&ulp->ul_cv);
mutex_enter(&ulp->ul_lock);
if (seg->s_ops == &segvn_ops &&
((struct segvn_data *)seg->s_data)->type != MAP_SHARED) {
mask = (ulong_t)ULOCKFS_GETREAD_MASK;
--- 1728,1740 ----
}
/*
* First time VOP call
*/
! atomic_inc_ulong(&ulp->ul_vnops_cnt);
if (!ULOCKFS_IS_JUSTULOCK(ulp) || ufs_quiesce_pend) {
! if (!atomic_dec_ulong_nv(&ulp->ul_vnops_cnt))
cv_broadcast(&ulp->ul_cv);
mutex_enter(&ulp->ul_lock);
if (seg->s_ops == &segvn_ops &&
((struct segvn_data *)seg->s_data)->type != MAP_SHARED) {
mask = (ulong_t)ULOCKFS_GETREAD_MASK;