Page MenuHomeFreeBSD

D58180.id181805.diff
No OneTemporary

D58180.id181805.diff

diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c
--- a/sys/kern/vfs_cache.c
+++ b/sys/kern/vfs_cache.c
@@ -3774,6 +3774,21 @@
vref(vp);
addend = 0;
if (vp->v_type != VDIR) {
+ if ((vp->v_vflag & VV_ROOT) != 0) {
+ struct vnode *covered_vp;
+
+ /* File mount root: resolve via the covered vnode. */
+ vn_lock(vp, LK_RETRY | LK_SHARED);
+ if (VN_IS_DOOMED(vp) ||
+ (covered_vp = vp->v_mount->mnt_vnodecovered) == NULL ||
+ covered_vp->v_mountedhere != vp->v_mount) {
+ vput(vp);
+ return (ENOENT);
+ }
+ vref(covered_vp);
+ vput(vp);
+ vp = covered_vp;
+ }
*buflen -= 1;
buf[*buflen] = '\0';
error = vn_vptocnp(&vp, buf, buflen);
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c
--- a/sys/kern/vfs_mount.c
+++ b/sys/kern/vfs_mount.c
@@ -1182,8 +1182,12 @@
if (error == 0 && vp->v_type != VDIR)
error = ENOTDIR;
}
- if (error == 0 && (fsflags & MNT_EMPTYDIR) != 0)
- error = vn_dir_check_empty(vp);
+ if (error == 0 && (fsflags & MNT_EMPTYDIR) != 0) {
+ if (vp->v_type == VDIR)
+ error = vn_dir_check_empty(vp);
+ else
+ error = ENOTDIR;
+ }
if (error == 0) {
VI_LOCK(vp);
if ((vp->v_iflag & VI_MOUNT) == 0 && vp->v_mountedhere == NULL)

File Metadata

Mime Type
text/plain
Expires
Fri, Aug 7, 8:01 AM (19 h, 40 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36154650
Default Alt Text
D58180.id181805.diff (1 KB)

Event Timeline