nfsd: Store the filehandle with the struct nfs4_file
For use when we may not have a struct inode. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> Signed-off-by: Jeff Layton <jlayton@primarydata.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
fc8e5a644c
commit
e2cf80d73f
|
@ -2833,7 +2833,8 @@ static struct nfs4_file *nfsd4_alloc_file(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* OPEN Share state helper functions */
|
/* OPEN Share state helper functions */
|
||||||
static void nfsd4_init_file(struct nfs4_file *fp, struct inode *ino)
|
static void nfsd4_init_file(struct nfs4_file *fp, struct inode *ino,
|
||||||
|
struct knfsd_fh *fh)
|
||||||
{
|
{
|
||||||
unsigned int hashval = file_hashval(ino);
|
unsigned int hashval = file_hashval(ino);
|
||||||
|
|
||||||
|
@ -2845,6 +2846,7 @@ static void nfsd4_init_file(struct nfs4_file *fp, struct inode *ino)
|
||||||
INIT_LIST_HEAD(&fp->fi_delegations);
|
INIT_LIST_HEAD(&fp->fi_delegations);
|
||||||
ihold(ino);
|
ihold(ino);
|
||||||
fp->fi_inode = ino;
|
fp->fi_inode = ino;
|
||||||
|
fh_copy_shallow(&fp->fi_fhandle, fh);
|
||||||
fp->fi_had_conflict = false;
|
fp->fi_had_conflict = false;
|
||||||
fp->fi_lease = NULL;
|
fp->fi_lease = NULL;
|
||||||
fp->fi_share_deny = 0;
|
fp->fi_share_deny = 0;
|
||||||
|
@ -3049,14 +3051,14 @@ find_file(struct inode *ino)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nfs4_file *
|
static struct nfs4_file *
|
||||||
find_or_add_file(struct inode *ino, struct nfs4_file *new)
|
find_or_add_file(struct inode *ino, struct nfs4_file *new, struct knfsd_fh *fh)
|
||||||
{
|
{
|
||||||
struct nfs4_file *fp;
|
struct nfs4_file *fp;
|
||||||
|
|
||||||
spin_lock(&state_lock);
|
spin_lock(&state_lock);
|
||||||
fp = find_file_locked(ino);
|
fp = find_file_locked(ino);
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
nfsd4_init_file(new, ino);
|
nfsd4_init_file(new, ino, fh);
|
||||||
fp = new;
|
fp = new;
|
||||||
}
|
}
|
||||||
spin_unlock(&state_lock);
|
spin_unlock(&state_lock);
|
||||||
|
@ -3711,7 +3713,7 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
|
||||||
* and check for delegations in the process of being recalled.
|
* and check for delegations in the process of being recalled.
|
||||||
* If not found, create the nfs4_file struct
|
* If not found, create the nfs4_file struct
|
||||||
*/
|
*/
|
||||||
fp = find_or_add_file(ino, open->op_file);
|
fp = find_or_add_file(ino, open->op_file, ¤t_fh->fh_handle);
|
||||||
if (fp != open->op_file) {
|
if (fp != open->op_file) {
|
||||||
status = nfs4_check_deleg(cl, open, &dp);
|
status = nfs4_check_deleg(cl, open, &dp);
|
||||||
if (status)
|
if (status)
|
||||||
|
|
|
@ -396,6 +396,7 @@ struct nfs4_file {
|
||||||
struct file *fi_deleg_file;
|
struct file *fi_deleg_file;
|
||||||
struct file_lock *fi_lease;
|
struct file_lock *fi_lease;
|
||||||
atomic_t fi_delegees;
|
atomic_t fi_delegees;
|
||||||
|
struct knfsd_fh fi_fhandle;
|
||||||
struct inode *fi_inode;
|
struct inode *fi_inode;
|
||||||
bool fi_had_conflict;
|
bool fi_had_conflict;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue