summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2008-07-16 13:28:52 -0400
committerSteve Dickson <steved@redhat.com>2008-07-16 13:28:52 -0400
commitba8dd9533e647b70d6e46beed3dcd8d8036b02af (patch)
tree16f0ebffd187ad690327b1f20f900d77f3e7c709
parent8508942e7244017325690e2d0c17429fa0cb9873 (diff)
downloadnfs-utils-ba8dd9533e647b70d6e46beed3dcd8d8036b02af.tar.gz
nfs-utils-ba8dd9533e647b70d6e46beed3dcd8d8036b02af.tar.xz
nfs-utils-ba8dd9533e647b70d6e46beed3dcd8d8036b02af.zip
If portmap is not listening on UDP (as apparently happens with
MS-Windows-Server2003R2SP2), then nfs mounts have to be mounted with -o mountproto=tcp to succeed. In this case a umount will still try UDP and will fail to contact the server. It will still succeed with the local unmount (after a timeout) but exits with a non-zero exit status. This causes /bin/mount to retry so we get a strange error about the filesystem not being mounted. So: get umount to use tcp if "mountproto=tcp" appears in mtab ignore any failure message from the server that would overwrite a success message from the local umount syscall. Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: Steve Dickson <steved@redhat.com>
-rw-r--r--utils/mount/nfsumount.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/utils/mount/nfsumount.c b/utils/mount/nfsumount.c
index 67e9c4b..b2327e0 100644
--- a/utils/mount/nfsumount.c
+++ b/utils/mount/nfsumount.c
@@ -194,9 +194,15 @@ static int do_nfs_umount23(const char *spec, char *opts)
pmap->pm_vers = nfsvers_to_mnt(atoi(p+5));
if (opts && (p = strstr(opts, "mountvers=")) && isdigit(*(p+10)))
pmap->pm_vers = atoi(p+10);
- if (opts && (hasmntopt(&mnt, "udp") || hasmntopt(&mnt, "proto=udp")))
+ if (opts && (hasmntopt(&mnt, "udp")
+ || hasmntopt(&mnt, "proto=udp")
+ || hasmntopt(&mnt, "mountproto=udp")
+ ))
pmap->pm_prot = IPPROTO_UDP;
- if (opts && (hasmntopt(&mnt, "tcp") || hasmntopt(&mnt, "proto=tcp")))
+ if (opts && (hasmntopt(&mnt, "tcp")
+ || hasmntopt(&mnt, "proto=tcp")
+ || hasmntopt(&mnt, "mountproto=tcp")
+ ))
pmap->pm_prot = IPPROTO_TCP;
if (!nfs_gethostbyname(hostname, &mnt_server.saddr)) {
@@ -344,8 +350,13 @@ int nfsumount(int argc, char *argv[])
ret = 0;
if (mc) {
if (!lazy && strcmp(mc->m.mnt_type, "nfs4") != 0)
- ret = do_nfs_umount23(mc->m.mnt_fsname, mc->m.mnt_opts);
- ret = del_mtab(mc->m.mnt_fsname, mc->m.mnt_dir) ?: ret;
+ /* We ignore the error from do_nfs_umount23.
+ * If the actual umount succeeds (in del_mtab),
+ * we don't want to signal an error, as that
+ * could cause /sbin/mount to retry!
+ */
+ do_nfs_umount23(mc->m.mnt_fsname, mc->m.mnt_opts);
+ ret = del_mtab(mc->m.mnt_fsname, mc->m.mnt_dir);
} else if (*spec != '/') {
if (!lazy)
ret = do_nfs_umount23(spec, "tcp,v3");