aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/nfsd/nfs4state.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 6367c445d015..7e817d13cd82 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1487,6 +1487,7 @@ nfsd4_create_session(struct svc_rqst *rqstp,
1487 struct nfs4_client *conf, *unconf; 1487 struct nfs4_client *conf, *unconf;
1488 struct nfsd4_session *new; 1488 struct nfsd4_session *new;
1489 struct nfsd4_clid_slot *cs_slot = NULL; 1489 struct nfsd4_clid_slot *cs_slot = NULL;
1490 bool confirm_me = false;
1490 int status = 0; 1491 int status = 0;
1491 1492
1492 nfs4_lock_state(); 1493 nfs4_lock_state();
@@ -1509,7 +1510,6 @@ nfsd4_create_session(struct svc_rqst *rqstp,
1509 cs_slot->sl_seqid, cr_ses->seqid); 1510 cs_slot->sl_seqid, cr_ses->seqid);
1510 goto out; 1511 goto out;
1511 } 1512 }
1512 cs_slot->sl_seqid++;
1513 } else if (unconf) { 1513 } else if (unconf) {
1514 if (!same_creds(&unconf->cl_cred, &rqstp->rq_cred) || 1514 if (!same_creds(&unconf->cl_cred, &rqstp->rq_cred) ||
1515 !rpc_cmp_addr(sa, (struct sockaddr *) &unconf->cl_addr)) { 1515 !rpc_cmp_addr(sa, (struct sockaddr *) &unconf->cl_addr)) {
@@ -1525,8 +1525,7 @@ nfsd4_create_session(struct svc_rqst *rqstp,
1525 goto out; 1525 goto out;
1526 } 1526 }
1527 1527
1528 cs_slot->sl_seqid++; /* from 0 to 1 */ 1528 confirm_me = true;
1529 move_to_confirmed(unconf);
1530 conf = unconf; 1529 conf = unconf;
1531 } else { 1530 } else {
1532 status = nfserr_stale_clientid; 1531 status = nfserr_stale_clientid;
@@ -1546,10 +1545,13 @@ nfsd4_create_session(struct svc_rqst *rqstp,
1546 status = nfs_ok; 1545 status = nfs_ok;
1547 memcpy(cr_ses->sessionid.data, new->se_sessionid.data, 1546 memcpy(cr_ses->sessionid.data, new->se_sessionid.data,
1548 NFS4_MAX_SESSIONID_LEN); 1547 NFS4_MAX_SESSIONID_LEN);
1548 cs_slot->sl_seqid++;
1549 cr_ses->seqid = cs_slot->sl_seqid; 1549 cr_ses->seqid = cs_slot->sl_seqid;
1550 1550
1551 /* cache solo and embedded create sessions under the state lock */ 1551 /* cache solo and embedded create sessions under the state lock */
1552 nfsd4_cache_create_session(cr_ses, cs_slot, status); 1552 nfsd4_cache_create_session(cr_ses, cs_slot, status);
1553 if (confirm_me)
1554 move_to_confirmed(conf);
1553out: 1555out:
1554 nfs4_unlock_state(); 1556 nfs4_unlock_state();
1555 dprintk("%s returns %d\n", __func__, ntohl(status)); 1557 dprintk("%s returns %d\n", __func__, ntohl(status));