Skip to content

Commit

Permalink
NFS construct consistent co_ownerid for v4.1
Browse files Browse the repository at this point in the history
As stated in section 2.4 of RFC 5661, subsequent instances of the client need
to present the same co_ownerid. Concatinate the client's IP dot address,
host name, and the rpc_auth pseudoflavor to form the co_ownerid.

Signed-off-by: Andy Adamson <[email protected]>
Signed-off-by: Trond Myklebust <[email protected]>
  • Loading branch information
androsadamson authored and Trond Myklebust committed Jan 26, 2011
1 parent 27dc1cd commit c7a360b
Showing 1 changed file with 10 additions and 20 deletions.
30 changes: 10 additions & 20 deletions fs/nfs/nfs4proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
#include <linux/module.h>
#include <linux/sunrpc/bc_xprt.h>
#include <linux/xattr.h>
#include <linux/utsname.h>

#include "nfs4_fs.h"
#include "delegation.h"
Expand Down Expand Up @@ -4572,27 +4573,16 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
*p = htonl((u32)clp->cl_boot_time.tv_nsec);
args.verifier = &verifier;

while (1) {
args.id_len = scnprintf(args.id, sizeof(args.id),
"%s/%s %u",
clp->cl_ipaddr,
rpc_peeraddr2str(clp->cl_rpcclient,
RPC_DISPLAY_ADDR),
clp->cl_id_uniquifier);

status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);

if (status != -NFS4ERR_CLID_INUSE)
break;

if (signalled())
break;

if (++clp->cl_id_uniquifier == 0)
break;
}
args.id_len = scnprintf(args.id, sizeof(args.id),
"%s/%s.%s/%u",
clp->cl_ipaddr,
init_utsname()->nodename,
init_utsname()->domainname,
clp->cl_rpcclient->cl_auth->au_flavor);

status = nfs4_check_cl_exchange_flags(clp->cl_exchange_flags);
status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
if (!status)
status = nfs4_check_cl_exchange_flags(clp->cl_exchange_flags);
dprintk("<-- %s status= %d\n", __func__, status);
return status;
}
Expand Down

0 comments on commit c7a360b

Please sign in to comment.