Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 25 Mar 2001 14:29:20 -0800
From:      Dima Dorfman <dima@unixfreak.org>
To:        Boris Popov <bp@butya.kz>
Cc:        Peter Pentchev <roam@orbitel.bg>, Bruce Evans <bde@zeta.org.au>, Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>, freebsd-hackers@FreeBSD.ORG, freebsd-fs@FreeBSD.ORG, phk@freebsd.org
Subject:   Re: Displaying options for current NFS mounts 
Message-ID:  <20010325222920.D1E863E09@bazooka.unixfreak.org>
In-Reply-To: <Pine.BSF.4.21.0103251746060.76801-100000@lion.butya.kz>; from bp@butya.kz on "Sun, 25 Mar 2001 17:49:14 %2B0700 (ALMST)"

next in thread | previous in thread | raw e-mail | index | archive | help
Boris Popov <bp@butya.kz> writes:
> 	This is not a bikeshed, but sysctl is the wrong interface to do
> this. Use VFSs/VOPs instead. This isn't a big problem with passing string
> from kernel to userland.

I like your idea of using the extattr interface.  It isn't a perfect
match, since ideally this would be a VFS operation, but it works quite
well.  The only modifications required are to mount(8) to try to get
this attribute, and then to any filesystem which wishes to support it.

Below is a patch which makes the necessary changes to mount(8), and
adds support for this to NFS.  It's amazingly simple, and doesn't
interfere with anything else (i.e., you don't have to rebuild half the
world to use it).  The only thing I don't like is that the "mountopts"
and "mountopts_verbose" constants aren't macroized, but that can be
easily solved (I just didn't know where to put them).  With it,
mount(8) outputs stuff like this:

dima@spike% /sbin/mount -vt nfs
pid295@spike:/host on /host (nfs, v2, udp, hard, intr)
pid295@spike:/st on /st (nfs, v2, udp, hard, intr)
bazooka:/a on /.amd/bazooka/host/a (nfs, nodev, nosuid, v3, tcp, hard, intr)
bazooka:/b on /.amd/bazooka/host/b (nfs, nodev, nosuid, v3, tcp, hard, intr)

Comments?  Suggestions?

Thanks in advance

					Dima Dorfman
					dima@unixfreak.org

P.S.  Would anyone have a fit if I wrote man pages for
extattr_get_file, extattr_set_file, and extattr_delete_file?


Index: sbin/mount/mount.c
===================================================================
RCS file: /st/src/FreeBSD/src/sbin/mount/mount.c,v
retrieving revision 1.41
diff -u -r1.41 mount.c
--- sbin/mount/mount.c	2000/11/22 17:54:56	1.41
+++ sbin/mount/mount.c	2001/03/25 22:16:14
@@ -49,6 +49,7 @@
 #include <sys/mount.h>
 #include <sys/stat.h>
 #include <sys/wait.h>
+#include <sys/uio.h>
 
 #include <err.h>
 #include <errno.h>
@@ -505,6 +506,8 @@
 	int flags;
 	struct opt *o;
 	struct passwd *pw;
+	struct iovec iov;
+	char buf[128];
 
 	(void)printf("%s on %s (%s", sfp->f_mntfromname, sfp->f_mntonname,
 	    sfp->f_fstypename);
@@ -515,6 +518,11 @@
 			(void)printf(", %s", o->o_name);
 			flags &= ~o->o_opt;
 		}
+	iov.iov_base = buf;
+	iov.iov_len = sizeof(buf);
+	if (extattr_get_file(sfp->f_mntonname,
+	    verbose ? "mountopts_verbose" : "mountopts", &iov, 1) > 0)
+		(void)printf(", %s", iov.iov_base);
 	if (sfp->f_owner) {
 		(void)printf(", mounted by ");
 		if ((pw = getpwuid(sfp->f_owner)) != NULL)
Index: sys/nfs/nfs_vnops.c
===================================================================
RCS file: /st/src/FreeBSD/src/sys/nfs/nfs_vnops.c,v
retrieving revision 1.164
diff -u -r1.164 nfs_vnops.c
--- sys/nfs/nfs_vnops.c	2001/02/28 04:13:11	1.164
+++ sys/nfs/nfs_vnops.c	2001/03/25 22:16:14
@@ -62,6 +62,7 @@
 #include <sys/lockf.h>
 #include <sys/stat.h>
 #include <sys/sysctl.h>
+#include <sys/sbuf.h>
 
 #include <vm/vm.h>
 #include <vm/vm_extern.h>
@@ -130,6 +131,7 @@
 static int	nfs_print __P((struct vop_print_args *));
 static int	nfs_advlock __P((struct vop_advlock_args *));
 static int	nfs_bwrite __P((struct vop_bwrite_args *));
+static int	nfs_getextattr __P((struct vop_getextattr_args *));
 /*
  * Global vfs data structures for nfs
  */
@@ -169,6 +171,7 @@
 	{ &vop_symlink_desc,		(vop_t *) nfs_symlink },
 	{ &vop_unlock_desc,		(vop_t *) vop_stdunlock },
 	{ &vop_write_desc,		(vop_t *) nfs_write },
+	{ &vop_getextattr_desc,		(vop_t *) nfs_getextattr },
 	{ NULL, NULL }
 };
 static struct vnodeopv_desc nfsv2_vnodeop_opv_desc =
@@ -3397,4 +3400,51 @@
 		}
 	}
 	return (VOCALL(fifo_vnodeop_p, VOFFSET(vop_close), ap));
+}
+
+/*
+ * Get extended attributes.  Currently this is only used to retrieve
+ * filesystem-specific mount options for consumption by mount(8).
+ */
+static int
+nfs_getextattr(ap)
+	struct vop_getextattr_args /*{
+		IN struct vnode *a_vp;
+		IN const char *a_name;
+		INOUT struct uio *a_uio;
+		IN struct ucred *a_cred;
+		IN struct proc *a_p;
+	}; */ *ap;
+{
+	struct nfsmount *nmp = VFSTONFS(ap->a_vp->v_mount);
+	struct sbuf sb;
+	char *outp;
+	int outl, verbose = 0, error = 0;
+
+	/* XXX macroize "mountopts" and "mountopts_verbose"! */
+	if (strncmp(ap->a_name, "mountopts", 9) != 0)
+		return (ENOENT);
+	if (strncmp(ap->a_name, "mountopts_verbose", 17) == 0)
+		verbose = 1;
+
+	sbuf_new(&sb, NULL, 128, 0);
+	sbuf_printf(&sb, "%s", nmp->nm_flag & NFSMNT_NFSV3 ? "v3" : "v2");
+	sbuf_printf(&sb, ", %s",
+	    (nmp->nm_sotype == SOCK_DGRAM) ? "udp" : "tcp");
+	if (nmp->nm_flag & NFSMNT_SOFT)
+		sbuf_cat(&sb, ", soft");
+	else if (verbose)
+		sbuf_cat(&sb, ", hard");
+	if (nmp->nm_flag & NFSMNT_INT)
+		sbuf_cat(&sb, ", intr");
+	sbuf_finish(&sb);
+
+	outp = sbuf_data(&sb);
+	outl = sbuf_len(&sb) + 1;
+	if (outl > ap->a_uio->uio_resid)
+		outl = ap->a_uio->uio_resid;
+	if (outl > 0)
+		error = uiomove(outp, outl, ap->a_uio);
+	sbuf_delete(&sb);
+	return (error);
 }

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-fs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010325222920.D1E863E09>