bin/151736: mount_nullfs patch to add support for exposing sockets and fifos of layered filesystems

John Hixson john at ixsystems.com
Tue Oct 26 00:10:11 UTC 2010


>Number:         151736
>Category:       bin
>Synopsis:       mount_nullfs patch to add support for exposing sockets and fifos of layered filesystems
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Oct 26 00:10:09 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     John Hixson
>Release:        9.0-CURRENT
>Organization:
iXsystems
>Environment:
FreeBSD thinkbsd 9.0-CURRENT FreeBSD 9.0-CURRENT #7: Fri Oct 22 12:26:59 PDT 2010     john at thinkbsd:/usr/obj/usr/src/sys/THINKBSD  amd64

>Description:
This patch modifies mount_nullfs to have the -i option that will tell the lower layer nullfs code to expose sockets and fifo's from the layered filesystem across the nullfs mount. The nullfs code has been changed to allow this. 
>How-To-Repeat:

>Fix:


Patch attached with submission follows:

diff -urN sbin/mount_nullfs.orig/mount_nullfs.8 sbin/mount_nullfs/mount_nullfs.8
--- sbin/mount_nullfs.orig/mount_nullfs.8	2006-04-19 12:21:42.000000000 -0700
+++ sbin/mount_nullfs/mount_nullfs.8	2010-10-25 16:50:35.000000000 -0700
@@ -73,6 +73,8 @@
 .Pp
 The options are as follows:
 .Bl -tag -width indent
+.It Fl i
+Expose sockets and fifos across the nullfs mounted filesystem.
 .It Fl o
 Options are specified with a
 .Fl o
@@ -80,6 +82,13 @@
 See the
 .Xr mount 8
 man page for possible options and their meanings.
+The following nullfs specific options are available:
+.Pp
+.Bl -tag -width "ipc" -compact
+.It Cm ipc
+Same as
+.Fl i .
+.El
 .El
 .Pp
 The null layer has two purposes.
diff -urN sbin/mount_nullfs.orig/mount_nullfs.c sbin/mount_nullfs/mount_nullfs.c
--- sbin/mount_nullfs.orig/mount_nullfs.c	2009-12-29 14:53:27.000000000 -0800
+++ sbin/mount_nullfs/mount_nullfs.c	2010-10-25 16:57:31.000000000 -0700
@@ -48,6 +48,8 @@
 #include <sys/mount.h>
 #include <sys/uio.h>
 
+#include <fs/nullfs/null.h>
+
 #include <err.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -68,16 +70,25 @@
 int
 main(int argc, char *argv[])
 {
-	struct iovec iov[6];
-	int ch, mntflags;
+	struct iovec *iov;
 	char source[MAXPATHLEN];
 	char target[MAXPATHLEN];
+	char fstype[] = "nullfs";
+	int ch, iovlen, mntflags, nullfs_flags;
 
-	mntflags = 0;
-	while ((ch = getopt(argc, argv, "o:")) != -1)
+	iov = NULL;
+	getmnt_silent = 1;
+	iovlen = mntflags = nullfs_flags = 0;
+	while ((ch = getopt(argc, argv, "io:")) != -1)
 		switch(ch) {
+		case 'i':
+			nullfs_flags |= NULLFSMNT_IPC;
+			break;
 		case 'o':
 			getmntopts(optarg, mopts, &mntflags, 0);
+			if (strncmp(optarg, "ipc", 3) == 0)
+				nullfs_flags |= NULLFSMNT_IPC;
+
 			break;
 		case '?':
 		default:
@@ -97,20 +108,14 @@
 		errx(EX_USAGE, "%s (%s) and %s are not distinct paths",
 		    argv[0], target, argv[1]);
 
-	iov[0].iov_base = strdup("fstype");
-	iov[0].iov_len = sizeof("fstype");
-	iov[1].iov_base = strdup("nullfs");
-	iov[1].iov_len = strlen(iov[1].iov_base) + 1;
-	iov[2].iov_base = strdup("fspath");
-	iov[2].iov_len = sizeof("fspath");
-	iov[3].iov_base = source;
-	iov[3].iov_len = strlen(source) + 1;
-	iov[4].iov_base = strdup("target");
-	iov[4].iov_len = sizeof("target");
-	iov[5].iov_base = target;
-	iov[5].iov_len = strlen(target) + 1;
+	build_iovec(&iov, &iovlen, "fstype", fstype, (size_t)-1);
+	build_iovec(&iov, &iovlen, "fspath", source, (size_t)-1);
+	build_iovec(&iov, &iovlen, "target", target, (size_t)-1);
+
+	if (nullfs_flags & NULLFSMNT_IPC)
+		build_iovec(&iov, &iovlen, "ipc", NULL, 0);
 
-	if (nmount(iov, 6, mntflags))
+	if (nmount(iov, iovlen, mntflags))
 		err(1, NULL);
 	exit(0);
 }
@@ -134,6 +139,6 @@
 usage(void)
 {
 	(void)fprintf(stderr,
-		"usage: mount_nullfs [-o options] target mount-point\n");
+		"usage: mount_nullfs [-o options] [-i] target mount-point\n");
 	exit(1);
 }
diff -urN sys/fs/nullfs.orig/null.h sys/fs/nullfs/null.h
--- sys/fs/nullfs.orig/null.h	2005-03-15 05:49:33.000000000 -0800
+++ sys/fs/nullfs/null.h	2010-10-25 11:19:16.000000000 -0700
@@ -39,6 +39,8 @@
 	struct vnode	*nullm_rootvp;	/* Reference to root null_node */
 };
 
+#define	NULLFSMNT_IPC	0x00000001
+
 #ifdef _KERNEL
 /*
  * A cache of vnode references
diff -urN sys/fs/nullfs.orig/null_subr.c sys/fs/nullfs/null_subr.c
--- sys/fs/nullfs.orig/null_subr.c	2009-05-31 07:54:20.000000000 -0700
+++ sys/fs/nullfs/null_subr.c	2010-10-25 16:55:31.000000000 -0700
@@ -230,6 +230,11 @@
 	xp->null_vnode = vp;
 	xp->null_lowervp = lowervp;
 	vp->v_type = lowervp->v_type;
+
+	if (vfs_getopt(mp->mnt_optnew, "ipc", NULL, NULL) == 0)
+		if (vp->v_type == VSOCK || vp->v_type == VFIFO)
+	 		vp->v_un = lowervp->v_un;
+
 	vp->v_data = xp;
 	vp->v_vnlock = lowervp->v_vnlock;
 	if (vp->v_vnlock == NULL)


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list