Print this page
patch as-lock-macro-simplification

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/ufs/ufs_vnops.c
          +++ new/usr/src/uts/common/fs/ufs/ufs_vnops.c
↓ open down ↓ 5645 lines elided ↑ open up ↑
5646 5646          }
5647 5647  
5648 5648          /*
5649 5649           * a_lock has to be acquired before entering the lockfs protocol
5650 5650           * because that is the order in which pagefault works. Also we cannot
5651 5651           * block on a_lock here because this waiting writer will prevent
5652 5652           * further readers like ufs_read from progressing and could cause
5653 5653           * deadlock between ufs_read/ufs_map/pagefault when a quiesce is
5654 5654           * pending.
5655 5655           */
5656      -        while (!AS_LOCK_TRYENTER(as, &as->a_lock, RW_WRITER)) {
     5656 +        while (!AS_LOCK_TRYENTER(as, RW_WRITER)) {
5657 5657                  ufs_map_alock_retry_cnt++;
5658 5658                  delay(RETRY_LOCK_DELAY);
5659 5659          }
5660 5660  
5661 5661          /*
5662 5662           * We can't hold as->a_lock and wait for lockfs to succeed because
5663 5663           * the proc tools might hang on a_lock, so call ufs_lockfs_trybegin()
5664 5664           * instead.
5665 5665           */
5666 5666          if (error = ufs_lockfs_trybegin(ufsvfsp, &ulp, ULOCKFS_MAP_MASK)) {
5667 5667                  /*
5668 5668                   * ufs_lockfs_trybegin() did not succeed. It is safer to give up
5669 5669                   * as->a_lock and wait for ulp->ul_fs_lock status to change.
5670 5670                   */
5671 5671                  ufs_map_lockfs_retry_cnt++;
5672      -                AS_LOCK_EXIT(as, &as->a_lock);
     5672 +                AS_LOCK_EXIT(as);
5673 5673                  as_rangeunlock(as);
5674 5674                  if (error == EIO)
5675 5675                          goto out;
5676 5676  
5677 5677                  mutex_enter(&ulp->ul_lock);
5678 5678                  while (ulp->ul_fs_lock & ULOCKFS_MAP_MASK) {
5679 5679                          if (ULOCKFS_IS_SLOCK(ulp) || ufsvfsp->vfs_nointr) {
5680 5680                                  cv_wait(&ulp->ul_cv, &ulp->ul_lock);
5681 5681                          } else {
5682 5682                                  sigintr(&smask, 1);
↓ open down ↓ 969 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX