summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1998-02-08 01:41:33 +0000
committerdyson <dyson@FreeBSD.org>1998-02-08 01:41:33 +0000
commit9f39ec243f618011e7a4ef9ca5816800f5f7482f (patch)
tree8e69365c0034341744fc63da8f18e9d529f4031c
parent38db9a70a8dcbb361febcc60136c04fa8707d2a4 (diff)
downloadFreeBSD-src-9f39ec243f618011e7a4ef9ca5816800f5f7482f.zip
FreeBSD-src-9f39ec243f618011e7a4ef9ca5816800f5f7482f.tar.gz
Fix a problem with vn_lock in fsync.
-rw-r--r--sys/kern/vfs_extattr.c17
-rw-r--r--sys/kern/vfs_syscalls.c17
2 files changed, 18 insertions, 16 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index 7d875bb..af367d1 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_syscalls.c 8.13 (Berkeley) 4/15/94
- * $Id: vfs_syscalls.c,v 1.90 1998/02/04 22:32:41 eivind Exp $
+ * $Id: vfs_syscalls.c,v 1.91 1998/02/06 12:13:32 eivind Exp $
*/
/* For 4.3 integer FS ID compatibility */
@@ -2159,14 +2159,15 @@ fsync(p, uap)
if (error = getvnode(p->p_fd, SCARG(uap, fd), &fp))
return (error);
vp = (struct vnode *)fp->f_data;
- vn_lock(vp, LK_EXCLUSIVE, p);
- if (vp->v_object) {
- vm_object_page_clean(vp->v_object, 0, 0 ,0);
+ if ((error = vn_lock(vp, LK_EXCLUSIVE|LK_RETRY, p)) == NULL) {
+ if (vp->v_object) {
+ vm_object_page_clean(vp->v_object, 0, 0 ,0);
+ }
+ 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);
}
- 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);
return (error);
}
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 7d875bb..af367d1 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_syscalls.c 8.13 (Berkeley) 4/15/94
- * $Id: vfs_syscalls.c,v 1.90 1998/02/04 22:32:41 eivind Exp $
+ * $Id: vfs_syscalls.c,v 1.91 1998/02/06 12:13:32 eivind Exp $
*/
/* For 4.3 integer FS ID compatibility */
@@ -2159,14 +2159,15 @@ fsync(p, uap)
if (error = getvnode(p->p_fd, SCARG(uap, fd), &fp))
return (error);
vp = (struct vnode *)fp->f_data;
- vn_lock(vp, LK_EXCLUSIVE, p);
- if (vp->v_object) {
- vm_object_page_clean(vp->v_object, 0, 0 ,0);
+ if ((error = vn_lock(vp, LK_EXCLUSIVE|LK_RETRY, p)) == NULL) {
+ if (vp->v_object) {
+ vm_object_page_clean(vp->v_object, 0, 0 ,0);
+ }
+ 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);
}
- 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);
return (error);
}
OpenPOWER on IntegriCloud