All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steve Dickson <SteveD@redhat.com>
To: Chuck Lever <chuck.lever@oracle.com>
Cc: Dan McGee <dpmcgee@gmail.com>, linux-nfs@vger.kernel.org
Subject: Re: [PATCH] showmount: try v3 before falling back to v1
Date: Tue, 05 Jan 2010 18:24:00 -0500	[thread overview]
Message-ID: <4B43CA10.8080907@RedHat.com> (raw)
In-Reply-To: <F262923D-5E5F-403D-86FC-601AD8F464A1@oracle.com>



On 01/05/2010 05:31 PM, Chuck Lever wrote:
> 
> On Jan 5, 2010, at 3:41 PM, Steve Dickson wrote:
> 
>> Revised patch incorporating the code review comments...
>>
>> steved.
>>
>> commit a96b79f57f49ce5b4d05b6b9da79bdec03b13764
>> Author: Steve Dickson <steved@redhat.com>
>> Date:   Tue Jan 5 15:39:00 2010 -0500
>>
>>    showmount: Try the highest mount version then fall back to lower ones
>>
>>    Showmount should try the highest mount version first then fall
>>    back to the lower ones when the server returns a RPC_PROGVERSMISMATCH
>>    error. The idea being not using the lower mount versions will begin
>>    the process of moving away from NFSv2 support.
>>
>>    Signed-off-by: Steve Dickson <steved@redhat.com>
>>
>> diff --git a/utils/showmount/showmount.c b/utils/showmount/showmount.c
>> index 418e8b9..74cf116 100644
>> --- a/utils/showmount/showmount.c
>> +++ b/utils/showmount/showmount.c
>> @@ -78,29 +78,36 @@ static void usage(FILE *fp, int n)
>>     exit(n);
>> }
>>
>> -static const char *nfs_sm_pgmtbl[] = {
>> +static const char *mount_pgm_tbl[] = {
>>     "showmount",
>>     "mount",
>>     "mountd",
>>     NULL,
>> };
>>
>> +static const rpcvers_t mount_vers_tbl[] = {
>> +    MOUNTVERS_NFSV3,
>> +    MOUNTVERS_POSIX,
>> +    MOUNTVERS,
>> +};
>> +static const int max_vers_tblsz =
>> +    (sizeof(mount_vers_tbl)/sizeof(mount_vers_tbl[0]));
>> +
>> /*
>>  * Generate an RPC client handle connected to the mountd service
>>  * at @hostname, or die trying.
>>  *
>>  * Supports both AF_INET and AF_INET6 server addresses.
>>  */
>> -static CLIENT *nfs_get_mount_client(const char *hostname)
>> +static CLIENT *nfs_get_mount_client(const char *hostname, rpcvers_t
>> vers)
>> {
>> -    rpcprog_t program = nfs_getrpcbyname(MOUNTPROG, nfs_sm_pgmtbl);
>> +    rpcprog_t program = nfs_getrpcbyname(MOUNTPROG, mount_pgm_tbl);
>>     CLIENT *client;
>>
>> -    client = clnt_create(hostname, program, MOUNTVERS, "tcp");
>> +    client = clnt_create(hostname, program, vers, "tcp");
>>     if (client)
>>         return client;
>> -
>> -    client = clnt_create(hostname, program, MOUNTVERS, "udp");
>> +    client = clnt_create(hostname, program, vers, "udp");
>>     if (client)
>>         return client;
>>
>> @@ -123,6 +130,7 @@ int main(int argc, char **argv)
>>     int i;
>>     int n;
>>     int maxlen;
>> +    int unsigned vers=0;
>>     char **dumpv;
>>
>>     program_name = argv[0];
>> @@ -185,7 +193,8 @@ int main(int argc, char **argv)
>>         break;
>>     }
>>
>> -    mclient = nfs_get_mount_client(hostname);
>> +again:
>> +    mclient = nfs_get_mount_client(hostname, mount_vers_tbl[vers]);
>>     mclient->cl_auth = authunix_create_default();
>>     total_timeout.tv_sec = TOTAL_TIMEOUT;
>>     total_timeout.tv_usec = 0;
>> @@ -197,6 +206,10 @@ int main(int argc, char **argv)
>>             (xdrproc_t) xdr_void, NULL,
>>             (xdrproc_t) xdr_exports, (caddr_t) &exportlist,
>>             total_timeout);
>> +        if (clnt_stat == RPC_PROGVERSMISMATCH) {
>> +            if (++vers <  max_vers_tblsz)
>> +                goto again;
>> +        }
> 
> If you're going to do this, you should destroy the clnt before
> retrying.  Better yet you can use CLNT_CONTROL() to change the RPC
> version of the clnt on the fly... that way you don't have to destroy the
> clnt and create a new one, which has to try creating both "tcp" and
> "udp" in some cases, making for a long timeout each time if the server
> doesn't support "tcp".
This is a very short lived command and 99.9% of the time this code will
not executed... so I guess I was not too worried about opening a couple
extra fd in the every unlikely case a server does not support v3... 

> 
> My preference however, is to do the simple thing, and use
> clnt_create_vers(3t) in nfs_get_mount_client().  AFAICT you wouldn't
> need any of this extra logic or the new table.
Yes I saw clnt_create_vers()... but I thought staying backwards
compatible with the glibc was a better idea... 

steved. 


  reply	other threads:[~2010-01-05 23:24 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-05  1:34 [PATCH] showmount: try v3 before falling back to v1 Dan McGee
2010-01-05 17:31 ` Chuck Lever
2010-01-05 18:38   ` Steve Dickson
     [not found]     ` <4B438712.1080101-AfCzQyP5zfLQT0dZR+AlfA@public.gmane.org>
2010-01-05 19:23       ` Chuck Lever
2010-01-05 20:38         ` Steve Dickson
     [not found]           ` <4B43A328.5000702-AfCzQyP5zfLQT0dZR+AlfA@public.gmane.org>
2010-01-05 21:36             ` Dan McGee
2010-01-05 20:41 ` Steve Dickson
     [not found]   ` <4B43A3EF.4080401-AfCzQyP5zfLQT0dZR+AlfA@public.gmane.org>
2010-01-05 22:31     ` Chuck Lever
2010-01-05 23:24       ` Steve Dickson [this message]
     [not found]         ` <4B43CA10.8080907-AfCzQyP5zfLQT0dZR+AlfA@public.gmane.org>
2010-01-06 13:37           ` Chuck Lever
2010-01-07 16:37 ` 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=4B43CA10.8080907@RedHat.com \
    --to=steved@redhat.com \
    --cc=chuck.lever@oracle.com \
    --cc=dpmcgee@gmail.com \
    --cc=linux-nfs@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.