From owner-freebsd-hackers Sat Mar 24 14:15:56 2001 Delivered-To: freebsd-hackers@freebsd.org Received: from bazooka.unixfreak.org (bazooka.unixfreak.org [63.198.170.138]) by hub.freebsd.org (Postfix) with ESMTP id 38DB737B718; Sat, 24 Mar 2001 14:15:40 -0800 (PST) (envelope-from dima@unixfreak.org) Received: from spike.unixfreak.org (spike [63.198.170.139]) by bazooka.unixfreak.org (Postfix) with ESMTP id A025A3E09; Sat, 24 Mar 2001 14:15:39 -0800 (PST) To: Gerald Pfeifer Cc: freebsd-hackers@freebsd.org, freebsd-fs@freebsd.org Subject: Re: Displaying options for current NFS mounts In-Reply-To: ; from pfeifer@dbai.tuwien.ac.at on "Sat, 24 Mar 2001 09:17:12 +0100 (CET)" Date: Sat, 24 Mar 2001 14:15:39 -0800 From: Dima Dorfman Message-Id: <20010324221539.A025A3E09@bazooka.unixfreak.org> Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG Gerald Pfeifer 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 _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 _args in , but I can't include, e.g., because the latter includes the former ()! The patch below kind of implements this functionality. I only export nfs_args (not _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 _args into mount.h (the only other way I can think of is to just move all of them from /.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 #include +#include +#include + #include #include #include @@ -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