From owner-freebsd-fs Fri Feb 27 07:49:26 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id HAA05689 for freebsd-fs-outgoing; Fri, 27 Feb 1998 07:49:26 -0800 (PST) (envelope-from owner-freebsd-fs@FreeBSD.ORG) Received: from ns1.yes.no (ns1.yes.no [195.119.24.10]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id HAA05669 for ; Fri, 27 Feb 1998 07:49:22 -0800 (PST) (envelope-from eivind@bitbox.follo.net) Received: from bitbox.follo.net (bitbox.follo.net [194.198.43.36]) by ns1.yes.no (8.8.7/8.8.7) with ESMTP id PAA01491 for ; Fri, 27 Feb 1998 15:49:20 GMT Received: (from eivind@localhost) by bitbox.follo.net (8.8.6/8.8.6) id QAA00374; Fri, 27 Feb 1998 16:48:59 +0100 (MET) Message-ID: <19980227164859.25557@follo.net> Date: Fri, 27 Feb 1998 16:48:59 +0100 From: Eivind Eklund To: fs@FreeBSD.ORG Subject: syncer / SMP question Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 0.89.1i Sender: owner-freebsd-fs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org I was looking at implementing an incremental syncer for UFS, as a sort of "let's get to know the FS-code" project, and noticed something that looked like really strange code in the sync() syscall. Is there any reason why the below wouldn't be a benign change? The extra simplelock-call looks especially weird - it looks like either the lock is released somewhere else, or we'll have the mountlist locked many times. If it looks like a benign change, what would I do to test it properly? I can allocate a scratch machine to do this if there is no need for really long-running tests. I can probably even do a scratchable SMP-box. cvs diff: Diffing . Index: vfs_syscalls.c =================================================================== RCS file: /home/ncvs/src/sys/kern/vfs_syscalls.c,v retrieving revision 1.93 diff -u -u -5 -r1.93 vfs_syscalls.c --- vfs_syscalls.c 1998/02/15 04:17:09 1.93 +++ vfs_syscalls.c 1998/02/27 15:37:16 @@ -480,24 +480,21 @@ register struct mount *mp, *nmp; int asyncflag; simple_lock(&mountlist_slock); for (mp = mountlist.cqh_first; mp != (void *)&mountlist; mp = nmp) { + nmp = mp->mnt_list.cqe_next; if (vfs_busy(mp, LK_NOWAIT, &mountlist_slock, p)) { - nmp = mp->mnt_list.cqe_next; continue; } if ((mp->mnt_flag & MNT_RDONLY) == 0) { asyncflag = mp->mnt_flag & MNT_ASYNC; mp->mnt_flag &= ~MNT_ASYNC; vfs_msync(mp, MNT_NOWAIT); VFS_SYNC(mp, MNT_NOWAIT, p != NULL ? p->p_ucred : NOCRED, p); - if (asyncflag) - mp->mnt_flag |= MNT_ASYNC; + mp->mnt_flag |= asyncflag; } - simple_lock(&mountlist_slock); - nmp = mp->mnt_list.cqe_next; vfs_unbusy(mp, p); } simple_unlock(&mountlist_slock); #if 0 /* Eivind. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-fs" in the body of the message