diff options
author | luoqi <luoqi@FreeBSD.org> | 1998-09-24 15:02:46 +0000 |
---|---|---|
committer | luoqi <luoqi@FreeBSD.org> | 1998-09-24 15:02:46 +0000 |
commit | 10b871784989ebe6bac8297b1c4e59a331f45854 (patch) | |
tree | 7a64a8392bf41b5cb155b40d4e9f7ca98001b89a /sys/kern/vfs_extattr.c | |
parent | b9b9de1a625de23d5df1a400dc7282ea693f1ce8 (diff) | |
download | FreeBSD-src-10b871784989ebe6bac8297b1c4e59a331f45854.zip FreeBSD-src-10b871784989ebe6bac8297b1c4e59a331f45854.tar.gz |
Eliminate a race in VOP_FSYNC() when softupdates is enabled.
Submitted by: Kirk McKusick <mckusick@McKusick.COM>
Two minor changes are also included,
1. Remove gratuitious checks for error return from vn_lock with LK_RETRY set,
vn_lock should always succeed in these cases.
2. Back out change rev. 1.36->1.37, which unnecessarily makes async mount
a little more unstable. It also keeps us in sync with other BSDs.
Suggested by: Bruce Evans <bde@zeta.org.au>
Diffstat (limited to 'sys/kern/vfs_extattr.c')
-rw-r--r-- | sys/kern/vfs_extattr.c | 51 |
1 files changed, 15 insertions, 36 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c index 6ab0ea7..ec543ab 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.105 1998/07/15 02:32:13 bde Exp $ + * $Id: vfs_syscalls.c,v 1.106 1998/09/10 02:27:52 tegge Exp $ */ /* For 4.3 integer FS ID compatibility */ @@ -1818,10 +1818,7 @@ setfflags(p, vp, flags) 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 @@ setfmode(p, vp, mode) { 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 @@ setfown(p, vp, uid, gid) { 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 @@ setutimes(p, vp, tv, nullflag) 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 @@ fsync(p, uap) 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); } |