Index: sys/mount.h =================================================================== RCS file: /usr/local/arch/ncvs/src/sys/sys/mount.h,v retrieving revision 1.219 diff -u -r1.219 mount.h --- sys/mount.h 16 Feb 2007 17:32:41 -0000 1.219 +++ sys/mount.h 27 Mar 2007 08:34:35 -0000 @@ -573,15 +573,22 @@ extern int mpsafe_vfs; -#define VFS_NEEDSGIANT(MP) \ +#define VFS_NEEDSGIANT_(MP) \ (!mpsafe_vfs || ((MP) != NULL && ((MP)->mnt_kern_flag & MNTK_MPSAFE) == 0)) +#define VFS_NEEDSGIANT(MP) __extension__ \ +({ \ + struct mount *_mp; \ + _mp = (MP); \ + VFS_NEEDSGIANT_(_mp); \ +}) + #define VFS_LOCK_GIANT(MP) __extension__ \ ({ \ int _locked; \ - struct mount *_MP; \ - _MP = (MP); \ - if (VFS_NEEDSGIANT(_MP)) { \ + struct mount *_mp; \ + _mp = (MP); \ + if (VFS_NEEDSGIANT_(_mp)) { \ mtx_lock(&Giant); \ _locked = 1; \ } else \ @@ -591,7 +598,9 @@ #define VFS_UNLOCK_GIANT(locked) if ((locked)) mtx_unlock(&Giant); #define VFS_ASSERT_GIANT(MP) do \ { \ - if (VFS_NEEDSGIANT((MP))) \ + struct mount *_mp; \ + _mp = (MP); \ + if (VFS_NEEDSGIANT_(_mp)) \ mtx_assert(&Giant, MA_OWNED); \ } while (0) Index: ufs/ffs/ffs_softdep.c =================================================================== RCS file: /usr/local/arch/ncvs/src/sys/ufs/ffs/ffs_softdep.c,v retrieving revision 1.205 diff -u -r1.205 ffs_softdep.c --- ufs/ffs/ffs_softdep.c 20 Mar 2007 10:51:45 -0000 1.205 +++ ufs/ffs/ffs_softdep.c 27 Mar 2007 08:34:35 -0000 @@ -39,7 +39,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/ufs/ffs/ffs_softdep.c,v 1.205 2007/03/20 10:51:45 kib Exp $"); +__FBSDID("$FreeBSD: src/sys/ufs/ffs/ffs_softdep.c,v 1.204 2007/02/23 20:23:35 brian Exp $"); /* * For now we want the safety net that the DIAGNOSTIC and DEBUG flags provide. @@ -722,12 +722,14 @@ struct ufsmount *ump; struct thread *td; int remaining; + int vfslocked; td = curthread; td->td_pflags |= TDP_NORUNNINGBUF; for (;;) { kthread_suspend_check(softdepproc); + vfslocked = VFS_LOCK_GIANT((struct mount *)NULL); ACQUIRE_LOCK(&lk); /* * If requested, try removing inode or removal dependencies. @@ -743,6 +745,7 @@ wakeup_one(&proc_waiting); } FREE_LOCK(&lk); + VFS_UNLOCK_GIANT(vfslocked); remaining = 0; mtx_lock(&mountlist_mtx); for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) { @@ -751,10 +754,12 @@ continue; if (vfs_busy(mp, LK_NOWAIT, &mountlist_mtx, td)) continue; + vfslocked = VFS_LOCK_GIANT(mp); softdep_process_worklist(mp, 0); ump = VFSTOUFS(mp); remaining += ump->softdep_on_worklist - ump->softdep_on_worklist_inprogress; + VFS_UNLOCK_GIANT(vfslocked); mtx_lock(&mountlist_mtx); nmp = TAILQ_NEXT(mp, mnt_list); vfs_unbusy(mp, td);