Re: [PATCH] umount: fix problems when portmap doesn't listen on UDP.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jul 15, 2008 at 8:52 AM, Neil Brown <neilb@xxxxxxx> wrote:
>
> Another patch that can be pulled from
>     git://neil.brown.name/nfs-utils for-steved
>
> This and the next deal with problems with the new 'string based
> option' code when portmap can only be contacted via TCP.
>
> Some people seem to turn of string based options to avoid this
> problem:
>  https://bugs.launchpad.net/ubuntu/+bug/213444/comments/23
>
> This can partly be avoided using mountproto=tcp, but that
>  a/ shouldn't be needed (isn't with the old code)
>  b/ doesn't help the unmount case.
>
> This first patch make umount work better if mountproto=tcp was given
> to mount.
> The next patch gives mountproto=tcp to mount if it is needed.
>
> NeilBrown
>
>
>
> From 863af3c54b574a588ac6d7bd05a1f250784159bd Mon Sep 17 00:00:00 2001
> From: Neil Brown <neilb@xxxxxxx>
> Date: Tue, 15 Jul 2008 17:36:57 +1000
>
> 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@xxxxxxx>
> ---
>  utils/mount/nfsumount.c |   19 +++++++++++++++----
>  1 files changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/utils/mount/nfsumount.c b/utils/mount/nfsumount.c
> index 285273b..9e1855d 100644
> --- a/utils/mount/nfsumount.c
> +++ b/utils/mount/nfsumount.c
> @@ -203,9 +203,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;

That's a good fix.  I have a patch later in my IPv6 series that does
this along with many other things.  Again, it's reasonable to address
this now.

>
>        if (!nfs_gethostbyname(hostname, &mnt_server.saddr)) {
> @@ -347,8 +353,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);

Well, NFSv2/v3 UMNT is advisory only.  I think this should have been
ignoring the result of the UMNT RPC already anyway.  In fact, Solaris
doesn't even wait for the RPC reply... (and we shouldn't either --
that will just block the umount if the server isn't available).

But I've never seen /sbin/mount retry a umount request... so I don't
quite understand the new comment here.  I could be off base...

>        } else if (*spec != '/') {
>                if (!lazy)
>                        ret = do_nfs_umount23(spec, "tcp,v3");

If you're going to ignore the return code above, why not here as well?
 And you might as well make do_nfs_umount23() return void while you're
at it.

If you do that, you can move your new comment to a block comment in
front of do_nfs_umount23() -- that would be easier to read, I think.

> --
> 1.5.6.2

-- 
Chuck Lever
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux