diff options
author | dyson <dyson@FreeBSD.org> | 1998-02-08 01:41:33 +0000 |
---|---|---|
committer | dyson <dyson@FreeBSD.org> | 1998-02-08 01:41:33 +0000 |
commit | 9f39ec243f618011e7a4ef9ca5816800f5f7482f (patch) | |
tree | 8e69365c0034341744fc63da8f18e9d529f4031c | |
parent | 38db9a70a8dcbb361febcc60136c04fa8707d2a4 (diff) | |
download | FreeBSD-src-9f39ec243f618011e7a4ef9ca5816800f5f7482f.zip FreeBSD-src-9f39ec243f618011e7a4ef9ca5816800f5f7482f.tar.gz |
Fix a problem with vn_lock in fsync.
-rw-r--r-- | sys/kern/vfs_extattr.c | 17 | ||||
-rw-r--r-- | sys/kern/vfs_syscalls.c | 17 |
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); } |