aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4state.c
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2012-06-05 10:40:47 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-06-28 17:20:47 -0400
commit1a2dd948e2b1e27476982bc7dd6961585823aec5 (patch)
tree523ac8af6c059375c1700cd3a6d56565cde9ac0c /fs/nfs/nfs4state.c
parent8ed27d4fb1ce95e65f5a3b26b02d3b77135cc7a1 (diff)
NFSv4.1: Handle slot recalls before doing state recovery
Handling a slot recall situation should always takes precedence over state recovery to allow the server to manage its resources. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/nfs4state.c')
-rw-r--r--fs/nfs/nfs4state.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 76bbac367880..da62f66a85ad 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -1814,7 +1814,6 @@ static int nfs4_recall_slot(struct nfs_client *clp)
1814 spin_unlock(&fc_tbl->slot_tbl_lock); 1814 spin_unlock(&fc_tbl->slot_tbl_lock);
1815 1815
1816 kfree(old); 1816 kfree(old);
1817 nfs4_end_drain_session(clp);
1818 return 0; 1817 return 0;
1819} 1818}
1820 1819
@@ -1920,6 +1919,16 @@ static void nfs4_state_manager(struct nfs_client *clp)
1920 continue; 1919 continue;
1921 } 1920 }
1922 1921
1922 /* Recall session slots */
1923 if (test_and_clear_bit(NFS4CLNT_RECALL_SLOT, &clp->cl_state)
1924 && nfs4_has_session(clp)) {
1925 section = "recall slot";
1926 status = nfs4_recall_slot(clp);
1927 if (status < 0)
1928 goto out_error;
1929 continue;
1930 }
1931
1923 /* First recover reboot state... */ 1932 /* First recover reboot state... */
1924 if (test_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state)) { 1933 if (test_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state)) {
1925 section = "reclaim reboot"; 1934 section = "reclaim reboot";
@@ -1953,16 +1962,6 @@ static void nfs4_state_manager(struct nfs_client *clp)
1953 nfs_client_return_marked_delegations(clp); 1962 nfs_client_return_marked_delegations(clp);
1954 continue; 1963 continue;
1955 } 1964 }
1956 /* Recall session slots */
1957 if (test_and_clear_bit(NFS4CLNT_RECALL_SLOT, &clp->cl_state)
1958 && nfs4_has_session(clp)) {
1959 section = "recall slot";
1960 status = nfs4_recall_slot(clp);
1961 if (status < 0)
1962 goto out_error;
1963 continue;
1964 }
1965
1966 1965
1967 nfs4_clear_state_manager_bit(clp); 1966 nfs4_clear_state_manager_bit(clp);
1968 /* Did we race with an attempt to give us more work? */ 1967 /* Did we race with an attempt to give us more work? */