--- kern/vfs_subr.c.orig Thu Jan 31 11:27:22 2002 +++ kern/vfs_subr.c Thu Jan 31 15:06:40 2002 @@ -138,6 +138,11 @@ #define SYNCER_MAXDELAY 32 static int syncer_maxdelay = SYNCER_MAXDELAY; /* maximum delay time */ time_t syncdelay = 30; /* max time to delay syncing data */ +time_t asyncdelay = 30; /* time to ignore syncing data */ +/* no syncing done for asyncdelay - syncdelay seconds */ +SYSCTL_INT(_kern, OID_AUTO, asyncdelay, CTLFLAG_RW, &asyncdelay, 0, ""); +static time_t asynccount = 0; /* current time before syncing */ +SYSCTL_INT(_kern, OID_AUTO, asynccount, CTLFLAG_RD, &asynccount, 0, ""); time_t filedelay = 30; /* time to delay syncing files */ SYSCTL_INT(_kern, OID_AUTO, filedelay, CTLFLAG_RW, &filedelay, 0, ""); time_t dirdelay = 29; /* time to delay syncing directories */ @@ -1113,6 +1118,17 @@ for (;;) { kproc_suspend_loop(p); + /* Stop the syncer when syncdelay < asynccount <= asyncdelay */ + asynccount -= 1; + if (asynccount < 0 || asynccount > asyncdelay) + asynccount = asyncdelay; + if (rushjob > 0) + asynccount = syncdelay; + if (asynccount > syncdelay) { + tsleep(&lbolt, PPAUSE, "syncer", 0); + continue; + } + starttime = time_second; /* @@ -2633,6 +2649,7 @@ * perform msync on all vnodes under a mount point * the mount point must be locked. */ +/* JG: Beware I added MNT_LAZY case when called from sync_fsync */ void vfs_msync(struct mount *mp, int flags) { @@ -2643,6 +2660,8 @@ tries = 5; simple_lock(&mntvnode_slock); loop: + if ((mp->mnt_flag & MNT_SOFTDEP) && (flags != MNT_LAZY)) + asynccount = syncdelay; for (vp = TAILQ_FIRST(&mp->mnt_nvnodelist); vp != NULL; vp = nvp) { if (vp->v_mount != mp) { if (--tries > 0) @@ -2926,7 +2945,7 @@ } asyncflag = mp->mnt_flag & MNT_ASYNC; mp->mnt_flag &= ~MNT_ASYNC; - vfs_msync(mp, MNT_NOWAIT); + vfs_msync(mp, MNT_LAZY); VFS_SYNC(mp, MNT_LAZY, ap->a_cred, p); if (asyncflag) mp->mnt_flag |= MNT_ASYNC;