public inbox for linux-nfs@vger.kernel.org
 help / color / mirror / Atom feed
From: "Chuck Lever" <chuck.lever@oracle.com>
To: "Neil Brown" <neilb@suse.de>
Cc: "Steve Dickson" <SteveD@redhat.com>, linux-nfs@vger.kernel.org
Subject: Re: [PATCH] umount: fix problems when portmap doesn't listen on UDP.
Date: Tue, 15 Jul 2008 11:42:59 -0400	[thread overview]
Message-ID: <76bd70e30807150842t7f16ae1aq7be4530b8a690c58@mail.gmail.com> (raw)
In-Reply-To: <18556.40326.764642.102066-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>

On Tue, Jul 15, 2008 at 8:52 AM, Neil Brown <neilb@suse.de> 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@suse.de>
> 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@suse.de>
> ---
>  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

  parent reply	other threads:[~2008-07-15 15:43 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-15 12:52 [PATCH] umount: fix problems when portmap doesn't listen on UDP Neil Brown
     [not found] ` <18556.40326.764642.102066-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2008-07-15 15:42   ` Chuck Lever [this message]
2008-07-16 18:49   ` Steve Dickson
2008-07-17  2:44     ` Neil Brown
     [not found]       ` <18558.45595.59801.775326-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2008-07-17 10:18         ` Steve Dickson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=76bd70e30807150842t7f16ae1aq7be4530b8a690c58@mail.gmail.com \
    --to=chuck.lever@oracle.com \
    --cc=SteveD@redhat.com \
    --cc=chucklever@gmail.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=neilb@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox