aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/state.h
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@redhat.com>2013-04-01 16:37:12 -0400
committerJ. Bruce Fields <bfields@redhat.com>2013-04-08 09:55:32 -0400
commit9411b1d4c7df26dca6bc6261b5dc87a5b4c81e5c (patch)
tree43fe6d0f9e83740f0b2e7b4691b3fb374c03fd17 /fs/nfsd/state.h
parent41d22663cb6a4108091c050cba3c470a3e175dd9 (diff)
nfsd4: cleanup handling of nfsv4.0 closed stateid's
Closed stateid's are kept around a little while to handle close replays in the 4.0 case. So we stash them in the last-used stateid in the oo_last_closed_stateid field of the open owner. We can free that in encode_seqid_op_tail once the seqid on the open owner is next incremented. But we don't want to do that on the close itself; so we set NFS4_OO_PURGE_CLOSE flag set on the open owner, skip freeing it the first time through encode_seqid_op_tail, then when we see that flag set next time we free it. This is unnecessarily baroque. Instead, just move the logic that increments the seqid out of the xdr code and into the operation code itself. The justification given for the current placement is that we need to wait till the last minute to be sure we know whether the status is a sequence-id-mutating error or not, but examination of the code shows that can't actually happen. Reported-by: Yanchuan Nian <ycnian@gmail.com> Tested-by: Yanchuan Nian <ycnian@gmail.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd/state.h')
-rw-r--r--fs/nfsd/state.h4
1 files changed, 1 insertions, 3 deletions
diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h
index 7674bc806200..13ec4853e9af 100644
--- a/fs/nfsd/state.h
+++ b/fs/nfsd/state.h
@@ -355,7 +355,6 @@ struct nfs4_openowner {
355 struct nfs4_ol_stateid *oo_last_closed_stid; 355 struct nfs4_ol_stateid *oo_last_closed_stid;
356 time_t oo_time; /* time of placement on so_close_lru */ 356 time_t oo_time; /* time of placement on so_close_lru */
357#define NFS4_OO_CONFIRMED 1 357#define NFS4_OO_CONFIRMED 1
358#define NFS4_OO_PURGE_CLOSE 2
359#define NFS4_OO_NEW 4 358#define NFS4_OO_NEW 4
360 unsigned char oo_flags; 359 unsigned char oo_flags;
361}; 360};
@@ -363,7 +362,7 @@ struct nfs4_openowner {
363struct nfs4_lockowner { 362struct nfs4_lockowner {
364 struct nfs4_stateowner lo_owner; /* must be first element */ 363 struct nfs4_stateowner lo_owner; /* must be first element */
365 struct list_head lo_owner_ino_hash; /* hash by owner,file */ 364 struct list_head lo_owner_ino_hash; /* hash by owner,file */
366 struct list_head lo_perstateid; /* for lockowners only */ 365 struct list_head lo_perstateid;
367 struct list_head lo_list; /* for temporary uses */ 366 struct list_head lo_list; /* for temporary uses */
368}; 367};
369 368
@@ -477,7 +476,6 @@ extern struct nfs4_client_reclaim *nfs4_client_to_reclaim(const char *name,
477 struct nfsd_net *nn); 476 struct nfsd_net *nn);
478extern bool nfs4_has_reclaimed_state(const char *name, struct nfsd_net *nn); 477extern bool nfs4_has_reclaimed_state(const char *name, struct nfsd_net *nn);
479extern void put_client_renew(struct nfs4_client *clp); 478extern void put_client_renew(struct nfs4_client *clp);
480extern void nfsd4_purge_closed_stateid(struct nfs4_stateowner *);
481 479
482/* nfs4recover operations */ 480/* nfs4recover operations */
483extern int nfsd4_client_tracking_init(struct net *net); 481extern int nfsd4_client_tracking_init(struct net *net);