diff options
-rw-r--r-- | fs/nfsd/nfs4recover.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index d0fc003d130a..ea95a2bc21b5 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c | |||
@@ -1286,6 +1286,22 @@ nfsd4_umh_cltrack_create(struct nfs4_client *clp) | |||
1286 | char *hexid, *has_session, *grace_start; | 1286 | char *hexid, *has_session, *grace_start; |
1287 | struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id); | 1287 | struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id); |
1288 | 1288 | ||
1289 | /* | ||
1290 | * With v4.0 clients, there's little difference in outcome between a | ||
1291 | * create and check operation, and we can end up calling into this | ||
1292 | * function multiple times per client (once for each openowner). So, | ||
1293 | * for v4.0 clients skip upcalling once the client has been recorded | ||
1294 | * on stable storage. | ||
1295 | * | ||
1296 | * For v4.1+ clients, the outcome of the two operations is different, | ||
1297 | * so we must ensure that we upcall for the create operation. v4.1+ | ||
1298 | * clients call this on RECLAIM_COMPLETE though, so we should only end | ||
1299 | * up doing a single create upcall per client. | ||
1300 | */ | ||
1301 | if (clp->cl_minorversion == 0 && | ||
1302 | test_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags)) | ||
1303 | return; | ||
1304 | |||
1289 | hexid = bin_to_hex_dup(clp->cl_name.data, clp->cl_name.len); | 1305 | hexid = bin_to_hex_dup(clp->cl_name.data, clp->cl_name.len); |
1290 | if (!hexid) { | 1306 | if (!hexid) { |
1291 | dprintk("%s: can't allocate memory for upcall!\n", __func__); | 1307 | dprintk("%s: can't allocate memory for upcall!\n", __func__); |