Skip to content

Commit

Permalink
NFSv4.1: Fix client id trunking on Linux
Browse files Browse the repository at this point in the history
Currently, our trunking code will check for session trunking, but will
fail to detect client id trunking. This is a problem, because it means
that the client will fail to recognise that the two connections represent
shared state, even if they do not permit a shared session.
By removing the check for the server minor id, and only checking the
major id, we will end up doing the right thing in both cases: we close
down the new nfs_client and fall back to using the existing one.

Fixes: 05f4c35 ("NFS: Discover NFSv4 server trunking when mounting")
Cc: Chuck Lever <[email protected]>
Cc: [email protected] # 3.7.x
Tested-by: Chuck Lever <[email protected]>
Signed-off-by: Trond Myklebust <[email protected]>
  • Loading branch information
trondmypd committed Jan 6, 2015
1 parent 06bed7d commit 1fc0703
Showing 1 changed file with 8 additions and 9 deletions.
17 changes: 8 additions & 9 deletions fs/nfs/nfs4client.c
Original file line number Diff line number Diff line change
Expand Up @@ -566,20 +566,14 @@ static bool nfs4_match_clientids(struct nfs_client *a, struct nfs_client *b)
}

/*
* Returns true if the server owners match
* Returns true if the server major ids match
*/
static bool
nfs4_match_serverowners(struct nfs_client *a, struct nfs_client *b)
nfs4_check_clientid_trunking(struct nfs_client *a, struct nfs_client *b)
{
struct nfs41_server_owner *o1 = a->cl_serverowner;
struct nfs41_server_owner *o2 = b->cl_serverowner;

if (o1->minor_id != o2->minor_id) {
dprintk("NFS: --> %s server owner minor IDs do not match\n",
__func__);
return false;
}

if (o1->major_id_sz != o2->major_id_sz)
goto out_major_mismatch;
if (memcmp(o1->major_id, o2->major_id, o1->major_id_sz) != 0)
Expand Down Expand Up @@ -654,7 +648,12 @@ int nfs41_walk_client_list(struct nfs_client *new,
if (!nfs4_match_clientids(pos, new))
continue;

if (!nfs4_match_serverowners(pos, new))
/*
* Note that session trunking is just a special subcase of
* client id trunking. In either case, we want to fall back
* to using the existing nfs_client.
*/
if (!nfs4_check_clientid_trunking(pos, new))
continue;

atomic_inc(&pos->cl_count);
Expand Down

0 comments on commit 1fc0703

Please sign in to comment.