aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@redhat.com>2012-05-29 14:44:28 -0400
committerJ. Bruce Fields <bfields@redhat.com>2012-05-31 20:30:34 -0400
commitb9831b59f31eca65e1beec01fadf02ca82485813 (patch)
treeb3fb99210c6033f55dd8112549322d54c3d3bcc6
parent32f16b3823b854a1f73bfad43782fbbcfe086090 (diff)
nfsd4: don't remove rebooted client record until confirmation
In the NFSv4.1 client-reboot case we're currently removing the client's previous state in exchange_id. That's wrong--we should be waiting till the confirming create_session. Signed-off-by: J. Bruce Fields <bfields@redhat.com>
-rw-r--r--fs/nfsd/nfs4state.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 8d10760800ad..c91e26d84f06 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1614,7 +1614,8 @@ nfsd4_exchange_id(struct svc_rqst *rqstp,
1614 status = nfserr_clid_inuse; 1614 status = nfserr_clid_inuse;
1615 goto out; 1615 goto out;
1616 } 1616 }
1617 goto expire_client; 1617 expire_client(conf);
1618 goto out_new;
1618 } 1619 }
1619 if (verfs_match) { /* case 2 */ 1620 if (verfs_match) { /* case 2 */
1620 conf->cl_exchange_flags |= EXCHGID4_FLAG_CONFIRMED_R; 1621 conf->cl_exchange_flags |= EXCHGID4_FLAG_CONFIRMED_R;
@@ -1622,8 +1623,6 @@ nfsd4_exchange_id(struct svc_rqst *rqstp,
1622 goto out_copy; 1623 goto out_copy;
1623 } 1624 }
1624 /* case 5, client reboot */ 1625 /* case 5, client reboot */
1625expire_client:
1626 expire_client(conf);
1627 goto out_new; 1626 goto out_new;
1628 } 1627 }
1629 1628
@@ -1805,8 +1804,14 @@ nfsd4_create_session(struct svc_rqst *rqstp,
1805 1804
1806 /* cache solo and embedded create sessions under the state lock */ 1805 /* cache solo and embedded create sessions under the state lock */
1807 nfsd4_cache_create_session(cr_ses, cs_slot, status); 1806 nfsd4_cache_create_session(cr_ses, cs_slot, status);
1808 if (confirm_me) 1807 if (confirm_me) {
1808 unsigned int hash = clientstr_hashval(unconf->cl_recdir);
1809 struct nfs4_client *old =
1810 find_confirmed_client_by_str(conf->cl_recdir, hash);
1811 if (old)
1812 expire_client(old);
1809 move_to_confirmed(conf); 1813 move_to_confirmed(conf);
1814 }
1810out: 1815out:
1811 nfs4_unlock_state(); 1816 nfs4_unlock_state();
1812 dprintk("%s returns %d\n", __func__, ntohl(status)); 1817 dprintk("%s returns %d\n", __func__, ntohl(status));