Page MenuHomeFreeBSD

D58191.diff
No OneTemporary

D58191.diff

diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c
--- a/sys/kern/vfs_lookup.c
+++ b/sys/kern/vfs_lookup.c
@@ -1487,15 +1487,46 @@
error = EROFS;
goto bad2;
}
- if (!wantparent) {
+ if (wantparent) {
+ /*
+ * Don not return vp_crossmp for the case of mount
+ * over the regular file. Substitute ni_dvp with the
+ * covered vnode.
+ */
+ if (ndp->ni_dvp == vp_crossmp &&
+ (dp->v_vflag & VV_ROOT) != 0 && dp->v_type != VDIR) {
+ struct vnode *mvp;
+
+ vput(ndp->ni_dvp);
+ mvp = dp->v_mount->mnt_vnodecovered;
+ vhold(mvp);
+ ndp->ni_dvp = mvp;
+ if ((cnp->cn_flags & LOCKPARENT) != 0) {
+ int locked;
+
+ locked = VOP_ISLOCKED(dp);
+ vn_lock_pair(dp, locked, true, mvp,
+ LK_EXCLUSIVE, false);
+ vref(mvp);
+ vdrop(mvp);
+ if (VN_IS_DOOMED(dp) || VN_IS_DOOMED(mvp)) {
+ error = ENOENT;
+ goto bad2;
+ }
+ } else {
+ ni_dvp_unlocked = 1;
+ }
+ } else if ((cnp->cn_flags & LOCKPARENT) == 0 &&
+ ndp->ni_dvp != dp) {
+ VOP_UNLOCK(ndp->ni_dvp);
+ ni_dvp_unlocked = 1;
+ }
+ } else {
ni_dvp_unlocked = 2;
if (ndp->ni_dvp != dp)
vput(ndp->ni_dvp);
else
vrele(ndp->ni_dvp);
- } else if ((cnp->cn_flags & LOCKPARENT) == 0 && ndp->ni_dvp != dp) {
- VOP_UNLOCK(ndp->ni_dvp);
- ni_dvp_unlocked = 1;
}
if (cnp->cn_flags & AUDITVNODE1)
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -3819,6 +3819,13 @@
}
#endif
fvp = fromnd.ni_vp;
+ if (fromnd.ni_dvp->v_type != VDIR) {
+ NDFREE_PNBUF(&fromnd);
+ vrele(fromnd.ni_dvp);
+ if (fvp != NULL)
+ vrele(fromnd.ni_vp);
+ return (EBUSY);
+ }
if (exchange && fvp == NULL) {
NDFREE_PNBUF(&fromnd);
vrele(fromnd.ni_dvp);
@@ -3840,7 +3847,7 @@
}
tdvp = tond.ni_dvp;
tvp = tond.ni_vp;
- if (tdvp == vp_crossmp) {
+ if (tdvp->v_type != VDIR) {
/*
* Rename of the root vnode of the mounted
* filesystem. It is possible to get there with the

File Metadata

Mime Type
text/plain
Expires
Mon, Jul 13, 6:28 PM (7 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35032947
Default Alt Text
D58191.diff (1 KB)

Event Timeline