diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2007-07-16 16:28:36 -0400 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2007-07-20 16:10:50 +1000 |
commit | f014bb7f4dbdc45572849465a6410512abffa7ea (patch) | |
tree | 393cde056c7107cfefb1a5932c2cb737aa44b5c4 /utils/mount/mount.c | |
parent | 28e4224b9bbfc355c83e17df74c47221afacd560 (diff) | |
download | nfs-utils-f014bb7f4dbdc45572849465a6410512abffa7ea.tar.gz nfs-utils-f014bb7f4dbdc45572849465a6410512abffa7ea.tar.xz nfs-utils-f014bb7f4dbdc45572849465a6410512abffa7ea.zip |
mount.nfs: Always preset nfs_mount_version
nfs_mount_version is a global integer that is set based on a guess
about which nfs_mount_data version is appropriate for the kernel we're
running on.
Make it always available and have the correct value before calling mount
and unmount so they don't have to worry about setting it themselves.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Neil Brown <neilb@suse.de>
Diffstat (limited to 'utils/mount/mount.c')
-rw-r--r-- | utils/mount/mount.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/utils/mount/mount.c b/utils/mount/mount.c index 2dc0aec..96b5697 100644 --- a/utils/mount/mount.c +++ b/utils/mount/mount.c @@ -26,6 +26,7 @@ #include <errno.h> #include <fcntl.h> #include <sys/mount.h> +#include <sys/utsname.h> #include <getopt.h> #include <mntent.h> #include <pwd.h> @@ -43,6 +44,7 @@ #include "error.h" char *progname; +int nfs_mount_data_version; int nomtab; int verbose; int sloppy; @@ -128,6 +130,51 @@ static const struct opt_map opt_map[] = { { NULL, 0, 0, 0 } }; +#define MAKE_VERSION(p,q,r) (65536 * (p) + 256 * (q) + (r)) + +int linux_version_code(void) +{ + struct utsname my_utsname; + int p, q, r; + + if (uname(&my_utsname) == 0) { + p = atoi(strtok(my_utsname.release, ".")); + q = atoi(strtok(NULL, ".")); + r = atoi(strtok(NULL, ".")); + return MAKE_VERSION(p,q,r); + } + return 0; +} + +/* + * Choose the version of the nfs_mount_data structure that is appropriate + * for the kernel that is doing the mount. + * + * NFS_MOUNT_VERSION: maximum version supported by these sources + * nfs_mount_data_version: maximum version supported by the running kernel + */ +static void discover_nfs_mount_data_version(void) +{ + int kernel_version = linux_version_code(); + + if (kernel_version) { + if (kernel_version < MAKE_VERSION(2, 1, 32)) + nfs_mount_data_version = 1; + else if (kernel_version < MAKE_VERSION(2, 2, 18)) + nfs_mount_data_version = 3; + else if (kernel_version < MAKE_VERSION(2, 3, 0)) + nfs_mount_data_version = 4; + else if (kernel_version < MAKE_VERSION(2, 3, 99)) + nfs_mount_data_version = 3; + else if (kernel_version < MAKE_VERSION(2, 6, 3)) + nfs_mount_data_version = 4; + else + nfs_mount_data_version = 6; + } + if (nfs_mount_data_version > NFS_MOUNT_VERSION) + nfs_mount_data_version = NFS_MOUNT_VERSION; +} + /* Try to build a canonical options string. */ static char * fix_opts_string (int flags, const char *extra_opts) { const struct opt_map *om; @@ -362,6 +409,8 @@ int main(int argc, char *argv[]) progname = basename(argv[0]); + discover_nfs_mount_data_version(); + if(!strncmp(progname, "umount", strlen("umount"))) { if(argc < 2) { umount_usage(); |