nfsd: fix pNFS return on close semantics
For the sake of forgetful clients, the server should return the layouts to the file system on 'last close' of a file (assuming that there are no delegations outstanding to that particular client) or on delegreturn (assuming that there are no opens on a file from that particular client). In theory the information is all there in current data structures, but it's not efficiently available; nfs4_file->fi_ref includes references on the file across all clients, but we need a per-(client, file) count. Walking through lots of stateid's to calculate this on each close or delegreturn would be painful. This patch introduces infrastructure to maintain per-client opens and delegation counters on a per-file basis. [hch: ported to the mainline pNFS support, merged various fixes from Jeff] Signed-off-by: Sachin Bhamare <sachin.bhamare@primarydata.com> Signed-off-by: Jeff Layton <jlayton@primarydata.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:

committed by
J. Bruce Fields

parent
ebe9cb3bb1
commit
8287f009bd
@@ -126,6 +126,7 @@ struct nfs4_delegation {
|
||||
struct list_head dl_perfile;
|
||||
struct list_head dl_perclnt;
|
||||
struct list_head dl_recall_lru; /* delegation recalled */
|
||||
struct nfs4_clnt_odstate *dl_clnt_odstate;
|
||||
u32 dl_type;
|
||||
time_t dl_time;
|
||||
/* For recall: */
|
||||
@@ -464,6 +465,17 @@ static inline struct nfs4_lockowner * lockowner(struct nfs4_stateowner *so)
|
||||
return container_of(so, struct nfs4_lockowner, lo_owner);
|
||||
}
|
||||
|
||||
/*
|
||||
* Per-client state indicating no. of opens and outstanding delegations
|
||||
* on a file from a particular client.'od' stands for 'open & delegation'
|
||||
*/
|
||||
struct nfs4_clnt_odstate {
|
||||
struct nfs4_client *co_client;
|
||||
struct nfs4_file *co_file;
|
||||
struct list_head co_perfile;
|
||||
atomic_t co_odcount;
|
||||
};
|
||||
|
||||
/*
|
||||
* nfs4_file: a file opened by some number of (open) nfs4_stateowners.
|
||||
*
|
||||
@@ -485,6 +497,7 @@ struct nfs4_file {
|
||||
struct list_head fi_delegations;
|
||||
struct rcu_head fi_rcu;
|
||||
};
|
||||
struct list_head fi_clnt_odstate;
|
||||
/* One each for O_RDONLY, O_WRONLY, O_RDWR: */
|
||||
struct file * fi_fds[3];
|
||||
/*
|
||||
@@ -526,6 +539,7 @@ struct nfs4_ol_stateid {
|
||||
struct list_head st_perstateowner;
|
||||
struct list_head st_locks;
|
||||
struct nfs4_stateowner * st_stateowner;
|
||||
struct nfs4_clnt_odstate * st_clnt_odstate;
|
||||
unsigned char st_access_bmap;
|
||||
unsigned char st_deny_bmap;
|
||||
struct nfs4_ol_stateid * st_openstp;
|
||||
|
Reference in New Issue
Block a user