summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2002-09-25 02:13:38 +0000
committerjeff <jeff@FreeBSD.org>2002-09-25 02:13:38 +0000
commit881a59ab9e299260a8156da632d621900864e7ef (patch)
tree1276deec2dad8e342dd606a0e453b0e03a539f9a /sys/kern
parent8ec2a2de7d55e53b72955acc48380f1e5cb307e9 (diff)
downloadFreeBSD-src-881a59ab9e299260a8156da632d621900864e7ef.zip
FreeBSD-src-881a59ab9e299260a8156da632d621900864e7ef.tar.gz
- Properly lock v_vflags in getdirents().
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/vfs_extattr.c18
-rw-r--r--sys/kern/vfs_syscalls.c18
2 files changed, 28 insertions, 8 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index 5ad587c..ad9ae63 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -3075,7 +3075,11 @@ unionread:
return (error);
}
}
- mp_fixme("Accessing vflags w/o vn lock.");
+ /*
+ * XXX We could delay dropping the lock above but
+ * union_dircheckp complicates things.
+ */
+ vn_lock(vp, LK_EXCLUSIVE|LK_RETRY, td);
if ((vp->v_vflag & VV_ROOT) &&
(vp->v_mount->mnt_flag & MNT_UNION)) {
struct vnode *tvp = vp;
@@ -3083,9 +3087,10 @@ unionread:
VREF(vp);
fp->f_data = vp;
fp->f_offset = 0;
- vrele(tvp);
+ vput(tvp);
goto unionread;
}
+ VOP_UNLOCK(vp, 0, td);
}
error = copyout(&loff, SCARG(uap, basep), sizeof(long));
fdrop(fp, td);
@@ -3167,7 +3172,11 @@ unionread:
return (error);
}
}
- mp_fixme("Accessing vflag without vn lock.");
+ /*
+ * XXX We could delay dropping the lock above but
+ * union_dircheckp complicates things.
+ */
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
if ((vp->v_vflag & VV_ROOT) &&
(vp->v_mount->mnt_flag & MNT_UNION)) {
struct vnode *tvp = vp;
@@ -3175,9 +3184,10 @@ unionread:
VREF(vp);
fp->f_data = vp;
fp->f_offset = 0;
- vrele(tvp);
+ vput(tvp);
goto unionread;
}
+ VOP_UNLOCK(vp, 0, td);
}
if (SCARG(uap, basep) != NULL) {
error = copyout(&loff, SCARG(uap, basep), sizeof(long));
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 5ad587c..ad9ae63 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -3075,7 +3075,11 @@ unionread:
return (error);
}
}
- mp_fixme("Accessing vflags w/o vn lock.");
+ /*
+ * XXX We could delay dropping the lock above but
+ * union_dircheckp complicates things.
+ */
+ vn_lock(vp, LK_EXCLUSIVE|LK_RETRY, td);
if ((vp->v_vflag & VV_ROOT) &&
(vp->v_mount->mnt_flag & MNT_UNION)) {
struct vnode *tvp = vp;
@@ -3083,9 +3087,10 @@ unionread:
VREF(vp);
fp->f_data = vp;
fp->f_offset = 0;
- vrele(tvp);
+ vput(tvp);
goto unionread;
}
+ VOP_UNLOCK(vp, 0, td);
}
error = copyout(&loff, SCARG(uap, basep), sizeof(long));
fdrop(fp, td);
@@ -3167,7 +3172,11 @@ unionread:
return (error);
}
}
- mp_fixme("Accessing vflag without vn lock.");
+ /*
+ * XXX We could delay dropping the lock above but
+ * union_dircheckp complicates things.
+ */
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
if ((vp->v_vflag & VV_ROOT) &&
(vp->v_mount->mnt_flag & MNT_UNION)) {
struct vnode *tvp = vp;
@@ -3175,9 +3184,10 @@ unionread:
VREF(vp);
fp->f_data = vp;
fp->f_offset = 0;
- vrele(tvp);
+ vput(tvp);
goto unionread;
}
+ VOP_UNLOCK(vp, 0, td);
}
if (SCARG(uap, basep) != NULL) {
error = copyout(&loff, SCARG(uap, basep), sizeof(long));
OpenPOWER on IntegriCloud