Page MenuHomeFreeBSD

D59158.diff
No OneTemporary

D59158.diff

diff --git a/lib/libutil/mntopts.c b/lib/libutil/mntopts.c
--- a/lib/libutil/mntopts.c
+++ b/lib/libutil/mntopts.c
@@ -138,7 +138,7 @@
if (realpath(path, resolved) == NULL || stat(resolved, &sb) != 0)
return (1);
- if (!S_ISDIR(sb.st_mode) && !S_ISREG(sb.st_mode)) {
+ if (!S_ISDIR(sb.st_mode) && !S_ISREG(sb.st_mode) && !S_ISSOCK(sb.st_mode)) {
errno = ENOTDIR;
return (1);
}
diff --git a/sbin/mount_nullfs/mount_nullfs.8 b/sbin/mount_nullfs/mount_nullfs.8
--- a/sbin/mount_nullfs/mount_nullfs.8
+++ b/sbin/mount_nullfs/mount_nullfs.8
@@ -30,7 +30,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd March 24, 2024
+.Dd August 24, 2026
.Dt MOUNT_NULLFS 8
.Os
.Sh NAME
@@ -62,7 +62,9 @@
.Pp
The
.Nm
-utility supports mounting both directories and single files.
+utility supports mounting directories, regular files and
+.Xr unix 4
+sockets.
Both
.Ar target
and
diff --git a/sbin/mount_nullfs/mount_nullfs.c b/sbin/mount_nullfs/mount_nullfs.c
--- a/sbin/mount_nullfs/mount_nullfs.c
+++ b/sbin/mount_nullfs/mount_nullfs.c
@@ -98,13 +98,13 @@
err(EX_USAGE, "%s", target);
if (stat_realpath(argv[1], mountpoint, &mountpoint_stat) != 0)
err(EX_USAGE, "%s", mountpoint);
- if (!S_ISDIR(target_stat.st_mode) && !S_ISREG(target_stat.st_mode))
- errx(EX_USAGE, "%s: must be either a file or directory",
+ if (!S_ISDIR(target_stat.st_mode) && !S_ISREG(target_stat.st_mode) && !S_ISSOCK(target_stat.st_mode))
+ errx(EX_USAGE, "%s: must be either a file, a socket or a directory",
target);
if ((target_stat.st_mode & S_IFMT) !=
(mountpoint_stat.st_mode & S_IFMT))
errx(EX_USAGE,
- "%s: must be same type as %s (file or directory)",
+ "%s: must be same type as %s (file, socket or directory)",
mountpoint, target);
build_iovec(&iov, &iovlen, "fstype", nullfs, (size_t)-1);
diff --git a/sys/fs/nullfs/null_vfsops.c b/sys/fs/nullfs/null_vfsops.c
--- a/sys/fs/nullfs/null_vfsops.c
+++ b/sys/fs/nullfs/null_vfsops.c
@@ -175,7 +175,7 @@
* Lower vnode must be the same type as the covered vnode - we
* don't allow mounting directories to files or vice versa.
*/
- if ((lowerrootvp->v_type != VDIR && lowerrootvp->v_type != VREG) ||
+ if ((lowerrootvp->v_type != VDIR && lowerrootvp->v_type != VREG && lowerrootvp->v_type != VSOCK) ||
lowerrootvp->v_type != mp->mnt_vnodecovered->v_type) {
NULLFSDEBUG("nullfs_mount: target must be same type as fspath");
vput(lowerrootvp);
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
@@ -3292,7 +3292,7 @@
if ((error = namei(&nd)) != 0)
return (error);
- if (nd.ni_vp->v_type == VREG && nd.ni_dvp->v_type != VDIR &&
+ if ((nd.ni_vp->v_type == VREG || nd.ni_vp->v_type == VSOCK) && nd.ni_dvp->v_type != VDIR &&
(nd.ni_vp->v_vflag & VV_ROOT) != 0) {
struct vnode *covered_vp;
@@ -5729,7 +5729,7 @@
vp = fpl->tvp;
vp_seqc = fpl->tvp_seqc;
- VNPASS(vp->v_type == VDIR || vp->v_type == VREG || vp->v_type == VBAD, vp);
+ VNPASS(vp->v_type == VDIR || vp->v_type == VREG || vp->v_type == VSOCK || vp->v_type == VBAD, vp);
mp = atomic_load_ptr(&vp->v_mountedhere);
if (__predict_false(mp == NULL)) {
return (0);
@@ -5786,7 +5786,7 @@
vp = fpl->tvp;
vp_seqc = fpl->tvp_seqc;
- VNPASS(vp->v_type == VDIR || vp->v_type == VREG || vp->v_type == VBAD, vp);
+ VNPASS(vp->v_type == VDIR || vp->v_type == VREG || vp->v_type == VSOCK || vp->v_type == VBAD, vp);
mp = atomic_load_ptr(&vp->v_mountedhere);
if (__predict_false(mp == NULL)) {
return (0);
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
@@ -1171,12 +1171,12 @@
if (error == 0)
error = vinvalbuf(vp, V_SAVE, 0, 0);
if (vfsp->vfc_flags & VFCF_FILEMOUNT) {
- if (error == 0 && vp->v_type != VDIR && vp->v_type != VREG)
+ if (error == 0 && vp->v_type != VDIR && vp->v_type != VREG && vp->v_type != VSOCK)
error = EINVAL;
/*
* For file mounts, ensure that there is only one hardlink to the file.
*/
- if (error == 0 && vp->v_type == VREG && va.va_nlink != 1)
+ if (error == 0 && (vp->v_type == VREG || vp->v_type == VSOCK) && va.va_nlink != 1)
error = EINVAL;
} else {
if (error == 0 && vp->v_type != VDIR)
@@ -1700,7 +1700,7 @@
* Don't allow stacking file mounts to work around problems with the way
* that namei sets nd.ni_dvp to vp_crossmp for these.
*/
- if (vp->v_type == VREG)
+ if (vp->v_type == VREG || vp->v_type == VSOCK)
fsflags |= MNT_NOCOVER;
if ((fsflags & MNT_UPDATE) == 0) {
if ((vp->v_vflag & VV_ROOT) != 0 &&

File Metadata

Mime Type
text/plain
Expires
Mon, Aug 31, 8:22 PM (3 h, 58 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37490020
Default Alt Text
D59158.diff (4 KB)

Event Timeline