aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2012-11-20 12:49:27 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-12-05 18:29:47 -0500
commit464ee9f966404786ba4c6be35dc8362ee8e6ba4e (patch)
tree1a095938b9b674a1617050e2cc824837686d7af6 /include
parentf4af6e2abc8efb1695203a2b76876edf80f79960 (diff)
NFSv4.1: Ensure that the client tracks the server target_highest_slotid
Dynamic slot allocation in NFSv4.1 depends on the client being able to track the server's target value for the highest slotid in the slot table. See the reference in Section 2.10.6.1 of RFC5661. To avoid ordering problems in the case where 2 SEQUENCE replies contain conflicting updates to this target value, we also introduce a generation counter, to track whether or not an RPC containing a SEQUENCE operation was launched before or after the last update. Also rename the nfs4_slot_table target_max_slots field to 'target_highest_slotid' to avoid confusion with a slot table size or number of slots. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'include')
-rw-r--r--include/linux/nfs_fs_sb.h5
-rw-r--r--include/linux/nfs_xdr.h2
2 files changed, 5 insertions, 2 deletions
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
index b0412873d29c..57d406997def 100644
--- a/include/linux/nfs_fs_sb.h
+++ b/include/linux/nfs_fs_sb.h
@@ -217,8 +217,9 @@ struct nfs4_slot_table {
217 u32 max_slots; /* # slots in table */ 217 u32 max_slots; /* # slots in table */
218 u32 highest_used_slotid; /* sent to server on each SEQ. 218 u32 highest_used_slotid; /* sent to server on each SEQ.
219 * op for dynamic resizing */ 219 * op for dynamic resizing */
220 u32 target_max_slots; /* Set by CB_RECALL_SLOT as 220 u32 target_highest_slotid; /* Server max_slot target */
221 * the new max_slots */ 221 unsigned long generation; /* Generation counter for
222 target_highest_slotid */
222 struct completion complete; 223 struct completion complete;
223}; 224};
224 225
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index deb31bbbb857..08c47db7417f 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -188,6 +188,7 @@ struct nfs4_channel_attrs {
188/* nfs41 sessions slot seqid */ 188/* nfs41 sessions slot seqid */
189struct nfs4_slot { 189struct nfs4_slot {
190 struct nfs4_slot_table *table; 190 struct nfs4_slot_table *table;
191 unsigned long generation;
191 unsigned long renewal_time; 192 unsigned long renewal_time;
192 u32 slot_nr; 193 u32 slot_nr;
193 u32 seq_nr; 194 u32 seq_nr;
@@ -202,6 +203,7 @@ struct nfs4_sequence_res {
202 struct nfs4_slot *sr_slot; /* slot used to send request */ 203 struct nfs4_slot *sr_slot; /* slot used to send request */
203 int sr_status; /* sequence operation status */ 204 int sr_status; /* sequence operation status */
204 u32 sr_status_flags; 205 u32 sr_status_flags;
206 u32 sr_target_highest_slotid;
205}; 207};
206 208
207struct nfs4_get_lease_time_args { 209struct nfs4_get_lease_time_args {