Date: Fri, 18 Sep 1998 15:41:19 -0400 (EDT) From: Luoqi Chen <luoqi@watermarkgroup.com> To: current@FreeBSD.ORG Subject: Yet another patch to try for softupdates panic Message-ID: <199809181941.PAA29792@lor.watermarkgroup.com>
next in thread | raw e-mail | index | archive | help
This patch could be the real cure for the `initiate_write_filepage' panic
people were seeing during make -j# world. I have posted another patch
about a week ago (in fact, I have committed it), but it turned out to be
no more than a no-op (thanks to Bruce for pointing it out, it was an
embarrassing silly mistake of mine). I certainly hope this patch will do
its work: this patch should fix a race condition between directory truncation
and file creation that could lead to the `initiate_write_filepage' panic.
-lq
PS. I know it is bad coding style. I'll make it look better if it's
proven to work.
Index: ffs_inode.c
===================================================================
RCS file: /home/ncvs/src/sys/ufs/ffs/ffs_inode.c,v
retrieving revision 1.47
diff -u -r1.47 ffs_inode.c
--- ffs_inode.c 1998/09/15 14:45:28 1.47
+++ ffs_inode.c 1998/09/18 12:41:16
@@ -191,7 +191,7 @@
* rarely, we solve the problem by syncing the file
* so that it will have no data structures left.
*/
- if ((error = VOP_FSYNC(ovp, cred, MNT_WAIT,
+ if ((error = VOP_FSYNC(ovp, cred, MNT_WAIT|0x80000000,
p)) != 0)
return (error);
} else {
Index: ffs_vnops.c
===================================================================
RCS file: /home/ncvs/src/sys/ufs/ffs/ffs_vnops.c,v
retrieving revision 1.51
diff -u -r1.51 ffs_vnops.c
--- ffs_vnops.c 1998/09/07 11:50:19 1.51
+++ ffs_vnops.c 1998/09/18 16:13:01
@@ -126,8 +126,8 @@
struct buf *nbp;
int s, error, passes, skipmeta;
daddr_t lbn;
+ int istrunc = 0;
-
if (vp->v_type == VBLK) {
lbn = INT_MAX;
} else {
@@ -137,6 +137,14 @@
}
/*
+ * XXX hack to solve directory truncation problem
+ */
+ if (ap->a_waitfor & 0x80000000) {
+ istrunc = 1;
+ ap->a_waitfor &= ~0x80000000;
+ }
+
+ /*
* Flush all dirty buffers associated with a vnode.
*/
passes = NIADDR;
@@ -251,7 +259,7 @@
getmicrotime(&tv);
if ((error = UFS_UPDATE(vp, &tv, &tv, ap->a_waitfor == MNT_WAIT)) != 0)
return (error);
- if (DOINGSOFTDEP(vp) && ap->a_waitfor == MNT_WAIT)
+ if (DOINGSOFTDEP(vp) && ap->a_waitfor == MNT_WAIT && !istrunc)
error = softdep_fsync(vp);
return (error);
}
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199809181941.PAA29792>
