Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 24 Mar 2001 14:15:39 -0800
From:      Dima Dorfman <dima@unixfreak.org>
To:        Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
Cc:        freebsd-hackers@freebsd.org, freebsd-fs@freebsd.org
Subject:   Re: Displaying options for current NFS mounts 
Message-ID:  <20010324221539.A025A3E09@bazooka.unixfreak.org>
In-Reply-To: <Pine.BSF.4.33.0103240909260.9037-100000@deneb.dbai.tuwien.ac.at>; from pfeifer@dbai.tuwien.ac.at on "Sat, 24 Mar 2001 09:17:12 %2B0100 (CET)"

next in thread | previous in thread | raw e-mail | index | archive | help
Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at> writes:
> What I'd like to see is `mount -v' printing
> 
>   vexpert:/files5 on /.amd_mnt/vexpert/files5 (nfs: v3, udp)
>                                                ^^^^^^^^^^^^
> instead of
> 
>   vexpert:/files5 on /.amd_mnt/vexpert/files5 (nfs)
>                                                ^^^
> This kind of information is incredibly useful for debugging, yet I
> haven't found ANY way to obtain it, let alone such a natural one.

IIRC tcpdump can detect NFS3 vs. NFS2, but that's suboptimal.

Implementing the above functionality in mount(8) isn't actually that
hard.  We would need to export the filesystem-specific <fs>_args
structures (e.g., nfs_args, ffs_args) to the userland.  If we do that,
mount(8) will be able to display all kinds of interesting,
filesystem-specific stuff (e.g., NFS version and transport, whether a
mounted CDROM is using Joilet, etc.).

I tried to export this stuff in struct statfs, but ran into a problem:
I'd need the complete definitions of <fs>_args in <sys/mount.h>, but I
can't include, e.g., <nfs/nfs.h> because the latter includes the
former (<sys/mount.h>)!

The patch below kind of implements this functionality.  I only export
nfs_args (not <otherfs>_args), and I only modified mount(8) to print
the NFS version, but printing the transport and others is simple from
there.  To work around the above problem, I pasted the struct nfs_args
definition into mount.h.  It is *horribly* ugly, but it does work.

If some other people display intrest in this, and someone can suggest
a less ugly way of getting the definitions of <fs>_args into mount.h
(the only other way I can think of is to just move all of them from
<fs>/<fs>.h to mount.h permamently), I'll implement this stuff in the
other filesystems.

Regards

					Dima Dorfman
					dima@unixfreak.org

P.S.  If you want to try the patch, you'll need to rebuild at least
the kernel, libc, mount, mountd, and amd, since the size of struct
statfs changes.  I only did those, and it seems to work on my system.

Index: sys/sys/mount.h
===================================================================
RCS file: /st/src/FreeBSD/src/sys/sys/mount.h,v
retrieving revision 1.102
diff -u -r1.102 mount.h
--- sys/sys/mount.h	2001/03/01 20:59:59	1.102
+++ sys/sys/mount.h	2001/03/24 22:03:13
@@ -69,6 +69,44 @@
 #define	MNAMELEN	72	/* length of buffer for returned name */
 #endif
 
+/* XXXDD: from src/sys/nfs/nfs.h! fixme! */
+/*
+ * Arguments to mount NFS
+ */
+#ifndef NFS_ARGS_DEFINED
+#define NFS_ARGS_DEFINED
+#define NFS_ARGSVERSION	3		/* change when nfs_args changes */
+struct nfs_args {
+	int		version;	/* args structure version number */
+	struct sockaddr	*addr;		/* file server address */
+	int		addrlen;	/* length of address */
+	int		sotype;		/* Socket type */
+	int		proto;		/* and Protocol */
+	u_char		*fh;		/* File handle to be mounted */
+	int		fhsize;		/* Size, in bytes, of fh */
+	int		flags;		/* flags */
+	int		wsize;		/* write size in bytes */
+	int		rsize;		/* read size in bytes */
+	int		readdirsize;	/* readdir size in bytes */
+	int		timeo;		/* initial timeout in .1 secs */
+	int		retrans;	/* times to retry send */
+	int		maxgrouplist;	/* Max. size of group list */
+	int		readahead;	/* # of blocks to readahead */
+	int		leaseterm;	/* Term (sec) of lease */
+	int		deadthresh;	/* Retrans threshold */
+	char		*hostname;	/* server's name */
+	int		acregmin;	/* cache attrs for reg files min time */
+	int		acregmax;	/* cache attrs for reg files max time */
+	int		acdirmin;	/* cache attrs for dirs min time */
+	int		acdirmax;	/* cache attrs for dirs max time */
+};
+#endif /* !NFS_ARGS_DEFINED */
+
+/* filesystem-specific mount options */
+union mount_info {
+	struct nfs_args nfs;
+};
+
 struct statfs {
 	long	f_spare2;		/* placeholder */
 	long	f_bsize;		/* fundamental file system block size */
@@ -92,6 +130,7 @@
 	char	f_mntfromname[MNAMELEN];/* mounted filesystem */
 	short	f_spares2;		/* unused spare */
 	long    f_spare[2];		/* unused spare */
+	union mount_info f_mtinfo;	/* filesystem-specific mount info */
 };
 
 #ifdef _KERNEL
Index: sys/nfs/nfs.h
===================================================================
RCS file: /st/src/FreeBSD/src/sys/nfs/nfs.h,v
retrieving revision 1.57
diff -u -r1.57 nfs.h
--- sys/nfs/nfs.h	2001/02/18 13:30:19	1.57
+++ sys/nfs/nfs.h	2001/03/24 22:03:13
@@ -116,6 +116,8 @@
 /*
  * Arguments to mount NFS
  */
+#ifndef NFS_ARGS_DEFINED
+#define NFS_ARGS_DEFINED
 #define NFS_ARGSVERSION	3		/* change when nfs_args changes */
 struct nfs_args {
 	int		version;	/* args structure version number */
@@ -141,6 +143,7 @@
 	int		acdirmin;	/* cache attrs for dirs min time */
 	int		acdirmax;	/* cache attrs for dirs max time */
 };
+#endif /* !NFS_ARGS_DEFINED */
 
 /*
  * NFS mount option flags
Index: sys/nfs/nfs_vfsops.c
===================================================================
RCS file: /st/src/FreeBSD/src/sys/nfs/nfs_vfsops.c,v
retrieving revision 1.94
diff -u -r1.94 nfs_vfsops.c
--- sys/nfs/nfs_vfsops.c	2001/03/01 20:59:19	1.94
+++ sys/nfs/nfs_vfsops.c	2001/03/24 22:03:14
@@ -307,6 +307,9 @@
 		sbp->f_type = mp->mnt_vfc->vfc_typenum;
 		bcopy(mp->mnt_stat.f_mntonname, sbp->f_mntonname, MNAMELEN);
 		bcopy(mp->mnt_stat.f_mntfromname, sbp->f_mntfromname, MNAMELEN);
+		bcopy((caddr_t)&mp->mnt_stat.f_mtinfo.nfs,
+		    (caddr_t)&sbp->f_mtinfo.nfs,
+		    sizeof(mp->mnt_stat.f_mtinfo.nfs));
 	}
 	nfsm_reqdone;
 	vput(vp);
@@ -892,6 +895,7 @@
 	bcopy((caddr_t)argp->fh, (caddr_t)nmp->nm_fh, argp->fhsize);
 	bcopy(hst, mp->mnt_stat.f_mntfromname, MNAMELEN);
 	bcopy(pth, mp->mnt_stat.f_mntonname, MNAMELEN);
+	bcopy(argp, &mp->mnt_stat.f_mtinfo.nfs, sizeof(*argp));
 	nmp->nm_nam = nam;
 	/* Set up the sockets and per-host congestion */
 	nmp->nm_sotype = argp->sotype;
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/24 22:03:14
@@ -50,6 +50,9 @@
 #include <sys/stat.h>
 #include <sys/wait.h>
 
+#include <nfs/rpcv2.h>
+#include <nfs/nfs.h>
+
 #include <err.h>
 #include <errno.h>
 #include <fstab.h>
@@ -530,6 +533,20 @@
 			(void)printf(", reads: sync %ld async %ld",
 			    sfp->f_syncreads, sfp->f_asyncreads);
 	}
+
+	/*
+	 * File-system specific options.
+	 */
+	if (strcmp(sfp->f_fstypename, "nfs") == 0) {
+		struct nfs_args *nfsa = &sfp->f_mtinfo.nfs;
+
+		if (nfsa->version != NFS_ARGSVERSION) {
+			(void)printf("\n");
+			errx(1, "nfs_args version mismatch");
+		}
+		(void)printf(", %s",
+		    (nfsa->flags & NFSMNT_NFSV3) ? "v3" : "v2");
+	}
 	(void)printf(")\n");
 }
 

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




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