Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 23 Sep 1998 01:15:38 -0400 (EDT)
From:      Luoqi Chen <luoqi@watermarkgroup.com>
To:        current@FreeBSD.ORG
Subject:   Official softupdates patch for testers
Message-ID:  <199809230515.BAA08476@lor.watermarkgroup.com>

next in thread | raw e-mail | index | archive | help
The following is the official patch to fix the 'initiate_write_filepage' panic,
plus two changes requested by Bruce Evans,
1. Do not test for vn_lock() failures if LK_RETRY flag bit is set, vn_lock
   can't fail in this case.
2. In fsync() syscall, always call VOP_FSYNC() with MNT_WAIT flag. This would
   make it a little safer for async mount and keep us in sync with other BSDs.
Please send any feedback to me <luoqi@freebsd.org>. Thanks.
-lq

Index: sys/sys/buf.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/buf.h,v
retrieving revision 1.56
diff -u -r1.56 buf.h
--- buf.h	1998/09/15 08:55:01	1.56
+++ buf.h	1998/09/23 04:50:50
@@ -48,6 +48,7 @@
 
 struct buf;
 struct mount;
+struct vnode;
 
 /*
  * To avoid including <ufs/ffs/softdep.h> 
@@ -63,6 +64,7 @@
 	void	(*io_start) __P((struct buf *));
 	void	(*io_complete) __P((struct buf *));
 	void	(*io_deallocate) __P((struct buf *));
+	int	(*io_fsync) __P((struct vnode *));
 	int	(*io_sync) __P((struct mount *));
 } bioops;
 
Index: sys/kern/vfs_syscalls.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/vfs_syscalls.c,v
retrieving revision 1.106
diff -u -r1.106 vfs_syscalls.c
--- vfs_syscalls.c	1998/09/10 02:27:52	1.106
+++ vfs_syscalls.c	1998/09/23 04:53:41
@@ -1818,10 +1818,7 @@
 	struct vattr vattr;
 
 	VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
-	if (error = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p)) {
-		return error;
-	}
-		
+	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
 	VATTR_NULL(&vattr);
 	vattr.va_flags = flags;
 	error = VOP_SETATTR(vp, &vattr, p->p_ucred, p);
@@ -1892,12 +1889,9 @@
 {
 	int error;
 	struct vattr vattr;
-	VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
 
-	if (error = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p)) {
-		return error;
-	}
-		
+	VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
+	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
 	VATTR_NULL(&vattr);
 	vattr.va_mode = mode & ALLPERMS;
 	error = VOP_SETATTR(vp, &vattr, p->p_ucred, p);
@@ -1998,12 +1992,9 @@
 {
 	int error;
 	struct vattr vattr;
-	VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
 
-	if (error = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p)) {
-		return error;
-	}
-		
+	VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
+	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
 	VATTR_NULL(&vattr);
 	vattr.va_uid = uid;
 	vattr.va_gid = gid;
@@ -2115,11 +2106,7 @@
 	struct vattr vattr;
 
 	VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
-
-	if (error = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p)) {
-		return error;
-	}
-		
+	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
 	VATTR_NULL(&vattr);
 	vattr.va_atime.tv_sec = tv[0].tv_sec;
 	vattr.va_atime.tv_nsec = tv[0].tv_usec * 1000;
@@ -2421,22 +2408,14 @@
 	if (error = getvnode(p->p_fd, SCARG(uap, fd), &fp))
 		return (error);
 	vp = (struct vnode *)fp->f_data;
-	if ((error = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p)) == NULL) {
-		if (vp->v_object) {
-			vm_object_page_clean(vp->v_object, 0, 0, FALSE);
-		}
-		if (vp->v_mount && (vp->v_mount->mnt_flag & MNT_SOFTDEP)) {
-			error = VOP_FSYNC(vp, fp->f_cred, MNT_LAZY, p);
-		} else {
-			error = VOP_FSYNC(vp, fp->f_cred,
-				(vp->v_mount && (vp->v_mount->mnt_flag & MNT_ASYNC)) ? 
-				MNT_NOWAIT : MNT_WAIT, p);
-		}
-		VOP_UNLOCK(vp, 0, p);
-
-		if ((vp->v_mount->mnt_flag & MNT_SOFTDEP) && bioops.io_sync)
-			(*bioops.io_sync)(NULL);
-	}
+	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
+	if (vp->v_object)
+		vm_object_page_clean(vp->v_object, 0, 0, FALSE);
+	if ((error = VOP_FSYNC(vp, fp->f_cred, MNT_WAIT, p)) == 0 &&
+	    vp->v_mount && (vp->v_mount->mnt_flag & MNT_SOFTDEP) &&
+	    bioops.io_fsync)
+		error = (*bioops.io_fsync)(vp);
+	VOP_UNLOCK(vp, 0, p);
 	return (error);
 }
 
Index: sys/ufs/ffs/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/22 23:36:57
@@ -249,9 +249,5 @@
 	}
 	splx(s);
 	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)
-		error = softdep_fsync(vp);
-	return (error);
+	return (UFS_UPDATE(vp, &tv, &tv, ap->a_waitfor == MNT_WAIT));
 }
Index: contrib/sys/softupdates/ffs_softdep.c
===================================================================
RCS file: /home/ncvs/src/contrib/sys/softupdates/ffs_softdep.c,v
retrieving revision 1.13
diff -u -r1.13 ffs_softdep.c
--- ffs_softdep.c	1998/08/12 20:46:47	1.13
+++ ffs_softdep.c	1998/09/23 04:54:32
@@ -209,6 +209,7 @@
 	softdep_disk_io_initiation,		/* io_start */
 	softdep_disk_write_complete,		/* io_complete */
 	softdep_deallocate_dependencies,	/* io_deallocate */
+	softdep_fsync,				/* io_fsync */
 	softdep_process_worklist,		/* io_sync */
 };
 

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?199809230515.BAA08476>