diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-06-05 10:40:47 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-06-28 17:20:47 -0400 |
commit | 1a2dd948e2b1e27476982bc7dd6961585823aec5 (patch) | |
tree | 523ac8af6c059375c1700cd3a6d56565cde9ac0c /fs/nfs/nfs4state.c | |
parent | 8ed27d4fb1ce95e65f5a3b26b02d3b77135cc7a1 (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.c | 21 |
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? */ |