diff options
-rw-r--r-- | fs/nfs/nfs4_fs.h | 10 | ||||
-rw-r--r-- | fs/nfs/nfs4proc.c | 34 | ||||
-rw-r--r-- | include/linux/nfs_xdr.h | 4 |
3 files changed, 46 insertions, 2 deletions
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index acac6f8c3d39..eccf4e93e7d7 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h | |||
@@ -203,8 +203,18 @@ extern int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name, | |||
203 | extern struct nfs4_state_recovery_ops nfs4_reboot_recovery_ops; | 203 | extern struct nfs4_state_recovery_ops nfs4_reboot_recovery_ops; |
204 | extern struct nfs4_state_recovery_ops nfs4_nograce_recovery_ops; | 204 | extern struct nfs4_state_recovery_ops nfs4_nograce_recovery_ops; |
205 | #if defined(CONFIG_NFS_V4_1) | 205 | #if defined(CONFIG_NFS_V4_1) |
206 | extern int nfs4_setup_sequence(struct nfs_client *clp, | ||
207 | struct nfs4_sequence_args *args, struct nfs4_sequence_res *res, | ||
208 | int cache_reply, struct rpc_task *task); | ||
206 | extern void nfs4_destroy_session(struct nfs4_session *session); | 209 | extern void nfs4_destroy_session(struct nfs4_session *session); |
207 | extern struct nfs4_session *nfs4_alloc_session(struct nfs_client *clp); | 210 | extern struct nfs4_session *nfs4_alloc_session(struct nfs_client *clp); |
211 | #else /* CONFIG_NFS_v4_1 */ | ||
212 | static inline int nfs4_setup_sequence(struct nfs_client *clp, | ||
213 | struct nfs4_sequence_args *args, struct nfs4_sequence_res *res, | ||
214 | int cache_reply, struct rpc_task *task) | ||
215 | { | ||
216 | return 0; | ||
217 | } | ||
208 | #endif /* CONFIG_NFS_V4_1 */ | 218 | #endif /* CONFIG_NFS_V4_1 */ |
209 | 219 | ||
210 | extern const u32 nfs4_fattr_bitmap[2]; | 220 | extern const u32 nfs4_fattr_bitmap[2]; |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index a0946a0d116e..c9618080317e 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -280,6 +280,8 @@ static void renew_lease(const struct nfs_server *server, unsigned long timestamp | |||
280 | * If found, we mark the slot as used, update the highest_used_slotid, | 280 | * If found, we mark the slot as used, update the highest_used_slotid, |
281 | * and respectively set up the sequence operation args. | 281 | * and respectively set up the sequence operation args. |
282 | * The slot number is returned if found, or NFS4_MAX_SLOT_TABLE otherwise. | 282 | * The slot number is returned if found, or NFS4_MAX_SLOT_TABLE otherwise. |
283 | * | ||
284 | * Note: must be called with under the slot_tbl_lock. | ||
283 | */ | 285 | */ |
284 | static u8 | 286 | static u8 |
285 | nfs4_find_slot(struct nfs4_slot_table *tbl, struct rpc_task *task) | 287 | nfs4_find_slot(struct nfs4_slot_table *tbl, struct rpc_task *task) |
@@ -288,7 +290,6 @@ nfs4_find_slot(struct nfs4_slot_table *tbl, struct rpc_task *task) | |||
288 | u8 ret_id = NFS4_MAX_SLOT_TABLE; | 290 | u8 ret_id = NFS4_MAX_SLOT_TABLE; |
289 | BUILD_BUG_ON((u8)NFS4_MAX_SLOT_TABLE != (int)NFS4_MAX_SLOT_TABLE); | 291 | BUILD_BUG_ON((u8)NFS4_MAX_SLOT_TABLE != (int)NFS4_MAX_SLOT_TABLE); |
290 | 292 | ||
291 | spin_lock(&tbl->slot_tbl_lock); | ||
292 | dprintk("--> %s used_slots=%04lx highest_used=%d max_slots=%d\n", | 293 | dprintk("--> %s used_slots=%04lx highest_used=%d max_slots=%d\n", |
293 | __func__, tbl->used_slots[0], tbl->highest_used_slotid, | 294 | __func__, tbl->used_slots[0], tbl->highest_used_slotid, |
294 | tbl->max_slots); | 295 | tbl->max_slots); |
@@ -302,7 +303,6 @@ nfs4_find_slot(struct nfs4_slot_table *tbl, struct rpc_task *task) | |||
302 | out: | 303 | out: |
303 | dprintk("<-- %s used_slots=%04lx highest_used=%d slotid=%d \n", | 304 | dprintk("<-- %s used_slots=%04lx highest_used=%d slotid=%d \n", |
304 | __func__, tbl->used_slots[0], tbl->highest_used_slotid, ret_id); | 305 | __func__, tbl->used_slots[0], tbl->highest_used_slotid, ret_id); |
305 | spin_unlock(&tbl->slot_tbl_lock); | ||
306 | return ret_id; | 306 | return ret_id; |
307 | } | 307 | } |
308 | 308 | ||
@@ -312,12 +312,42 @@ static int nfs41_setup_sequence(struct nfs4_session *session, | |||
312 | int cache_reply, | 312 | int cache_reply, |
313 | struct rpc_task *task) | 313 | struct rpc_task *task) |
314 | { | 314 | { |
315 | struct nfs4_slot *slot; | ||
316 | struct nfs4_slot_table *tbl; | ||
317 | u8 slotid; | ||
318 | |||
319 | dprintk("--> %s\n", __func__); | ||
315 | /* slot already allocated? */ | 320 | /* slot already allocated? */ |
316 | if (res->sr_slotid != NFS4_MAX_SLOT_TABLE) | 321 | if (res->sr_slotid != NFS4_MAX_SLOT_TABLE) |
317 | return 0; | 322 | return 0; |
318 | 323 | ||
319 | memset(res, 0, sizeof(*res)); | 324 | memset(res, 0, sizeof(*res)); |
320 | res->sr_slotid = NFS4_MAX_SLOT_TABLE; | 325 | res->sr_slotid = NFS4_MAX_SLOT_TABLE; |
326 | tbl = &session->fc_slot_table; | ||
327 | |||
328 | spin_lock(&tbl->slot_tbl_lock); | ||
329 | slotid = nfs4_find_slot(tbl, task); | ||
330 | if (slotid == NFS4_MAX_SLOT_TABLE) { | ||
331 | rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL); | ||
332 | spin_unlock(&tbl->slot_tbl_lock); | ||
333 | dprintk("<-- %s: no free slots\n", __func__); | ||
334 | return -EAGAIN; | ||
335 | } | ||
336 | spin_unlock(&tbl->slot_tbl_lock); | ||
337 | |||
338 | slot = tbl->slots + slotid; | ||
339 | args->sa_slotid = slotid; | ||
340 | args->sa_cache_this = cache_reply; | ||
341 | |||
342 | dprintk("<-- %s slotid=%d seqid=%d\n", __func__, slotid, slot->seq_nr); | ||
343 | |||
344 | res->sr_slotid = slotid; | ||
345 | res->sr_renewal_time = jiffies; | ||
346 | /* | ||
347 | * sr_status is only set in decode_sequence, and so will remain | ||
348 | * set to 1 if an rpc level failure occurs. | ||
349 | */ | ||
350 | res->sr_status = 1; | ||
321 | return 0; | 351 | return 0; |
322 | } | 352 | } |
323 | 353 | ||
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index db0d1236aae7..4ac14b40efc9 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
@@ -163,11 +163,15 @@ struct nfs4_slot { | |||
163 | 163 | ||
164 | struct nfs4_sequence_args { | 164 | struct nfs4_sequence_args { |
165 | struct nfs4_session *sa_session; | 165 | struct nfs4_session *sa_session; |
166 | u8 sa_slotid; | ||
167 | u8 sa_cache_this; | ||
166 | }; | 168 | }; |
167 | 169 | ||
168 | struct nfs4_sequence_res { | 170 | struct nfs4_sequence_res { |
169 | struct nfs4_session *sr_session; | 171 | struct nfs4_session *sr_session; |
170 | u8 sr_slotid; /* slot used to send request */ | 172 | u8 sr_slotid; /* slot used to send request */ |
173 | unsigned long sr_renewal_time; | ||
174 | int sr_status; /* sequence operation status */ | ||
171 | }; | 175 | }; |
172 | 176 | ||
173 | /* | 177 | /* |