Commit eb82dd39 authored by Jeff Layton's avatar Jeff Layton Committed by J. Bruce Fields

nfsd: convert fi_deleg_file and ls_file fields to nfsd_file

Have them keep an nfsd_file reference instead of a struct file.
Signed-off-by: default avatarJeff Layton <jeff.layton@primarydata.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent fd4f83fd
...@@ -212,6 +212,7 @@ struct file_lock_list_struct { ...@@ -212,6 +212,7 @@ struct file_lock_list_struct {
static DEFINE_PER_CPU(struct file_lock_list_struct, file_lock_list); static DEFINE_PER_CPU(struct file_lock_list_struct, file_lock_list);
DEFINE_STATIC_PERCPU_RWSEM(file_rwsem); DEFINE_STATIC_PERCPU_RWSEM(file_rwsem);
/* /*
* The blocked_hash is used to find POSIX lock loops for deadlock detection. * The blocked_hash is used to find POSIX lock loops for deadlock detection.
* It is protected by blocked_lock_lock. * It is protected by blocked_lock_lock.
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "blocklayoutxdr.h" #include "blocklayoutxdr.h"
#include "pnfs.h" #include "pnfs.h"
#include "filecache.h"
#define NFSDDBG_FACILITY NFSDDBG_PNFS #define NFSDDBG_FACILITY NFSDDBG_PNFS
...@@ -404,7 +405,7 @@ static void ...@@ -404,7 +405,7 @@ static void
nfsd4_scsi_fence_client(struct nfs4_layout_stateid *ls) nfsd4_scsi_fence_client(struct nfs4_layout_stateid *ls)
{ {
struct nfs4_client *clp = ls->ls_stid.sc_client; struct nfs4_client *clp = ls->ls_stid.sc_client;
struct block_device *bdev = ls->ls_file->f_path.mnt->mnt_sb->s_bdev; struct block_device *bdev = ls->ls_file->nf_file->f_path.mnt->mnt_sb->s_bdev;
bdev->bd_disk->fops->pr_ops->pr_preempt(bdev, NFSD_MDS_PR_KEY, bdev->bd_disk->fops->pr_ops->pr_preempt(bdev, NFSD_MDS_PR_KEY,
nfsd4_scsi_pr_key(clp), 0, true); nfsd4_scsi_pr_key(clp), 0, true);
......
...@@ -169,8 +169,8 @@ nfsd4_free_layout_stateid(struct nfs4_stid *stid) ...@@ -169,8 +169,8 @@ nfsd4_free_layout_stateid(struct nfs4_stid *stid)
spin_unlock(&fp->fi_lock); spin_unlock(&fp->fi_lock);
if (!nfsd4_layout_ops[ls->ls_layout_type]->disable_recalls) if (!nfsd4_layout_ops[ls->ls_layout_type]->disable_recalls)
vfs_setlease(ls->ls_file, F_UNLCK, NULL, (void **)&ls); vfs_setlease(ls->ls_file->nf_file, F_UNLCK, NULL, (void **)&ls);
fput(ls->ls_file); nfsd_file_put(ls->ls_file);
if (ls->ls_recalled) if (ls->ls_recalled)
atomic_dec(&ls->ls_stid.sc_file->fi_lo_recalls); atomic_dec(&ls->ls_stid.sc_file->fi_lo_recalls);
...@@ -197,7 +197,7 @@ nfsd4_layout_setlease(struct nfs4_layout_stateid *ls) ...@@ -197,7 +197,7 @@ nfsd4_layout_setlease(struct nfs4_layout_stateid *ls)
fl->fl_end = OFFSET_MAX; fl->fl_end = OFFSET_MAX;
fl->fl_owner = ls; fl->fl_owner = ls;
fl->fl_pid = current->tgid; fl->fl_pid = current->tgid;
fl->fl_file = ls->ls_file; fl->fl_file = ls->ls_file->nf_file;
status = vfs_setlease(fl->fl_file, fl->fl_type, &fl, NULL); status = vfs_setlease(fl->fl_file, fl->fl_type, &fl, NULL);
if (status) { if (status) {
...@@ -236,13 +236,13 @@ nfsd4_alloc_layout_stateid(struct nfsd4_compound_state *cstate, ...@@ -236,13 +236,13 @@ nfsd4_alloc_layout_stateid(struct nfsd4_compound_state *cstate,
NFSPROC4_CLNT_CB_LAYOUT); NFSPROC4_CLNT_CB_LAYOUT);
if (parent->sc_type == NFS4_DELEG_STID) if (parent->sc_type == NFS4_DELEG_STID)
ls->ls_file = get_file(fp->fi_deleg_file); ls->ls_file = nfsd_file_get(fp->fi_deleg_file);
else else
ls->ls_file = find_any_file(fp); ls->ls_file = find_any_file(fp);
BUG_ON(!ls->ls_file); BUG_ON(!ls->ls_file);
if (nfsd4_layout_setlease(ls)) { if (nfsd4_layout_setlease(ls)) {
fput(ls->ls_file); nfsd_file_put(ls->ls_file);
put_nfs4_file(fp); put_nfs4_file(fp);
kmem_cache_free(nfs4_layout_stateid_cache, ls); kmem_cache_free(nfs4_layout_stateid_cache, ls);
return NULL; return NULL;
...@@ -626,7 +626,7 @@ nfsd4_cb_layout_fail(struct nfs4_layout_stateid *ls) ...@@ -626,7 +626,7 @@ nfsd4_cb_layout_fail(struct nfs4_layout_stateid *ls)
argv[0] = (char *)nfsd_recall_failed; argv[0] = (char *)nfsd_recall_failed;
argv[1] = addr_str; argv[1] = addr_str;
argv[2] = ls->ls_file->f_path.mnt->mnt_sb->s_id; argv[2] = ls->ls_file->nf_file->f_path.mnt->mnt_sb->s_id;
argv[3] = NULL; argv[3] = NULL;
error = call_usermodehelper(nfsd_recall_failed, argv, envp, error = call_usermodehelper(nfsd_recall_failed, argv, envp,
......
...@@ -430,18 +430,18 @@ put_nfs4_file(struct nfs4_file *fi) ...@@ -430,18 +430,18 @@ put_nfs4_file(struct nfs4_file *fi)
} }
} }
static struct file * static struct nfsd_file *
__nfs4_get_fd(struct nfs4_file *f, int oflag) __nfs4_get_fd(struct nfs4_file *f, int oflag)
{ {
if (f->fi_fds[oflag]) if (f->fi_fds[oflag])
return get_file(f->fi_fds[oflag]->nf_file); return nfsd_file_get(f->fi_fds[oflag]);
return NULL; return NULL;
} }
static struct file * static struct nfsd_file *
find_writeable_file_locked(struct nfs4_file *f) find_writeable_file_locked(struct nfs4_file *f)
{ {
struct file *ret; struct nfsd_file *ret;
lockdep_assert_held(&f->fi_lock); lockdep_assert_held(&f->fi_lock);
...@@ -451,10 +451,10 @@ find_writeable_file_locked(struct nfs4_file *f) ...@@ -451,10 +451,10 @@ find_writeable_file_locked(struct nfs4_file *f)
return ret; return ret;
} }
static struct file * static struct nfsd_file *
find_writeable_file(struct nfs4_file *f) find_writeable_file(struct nfs4_file *f)
{ {
struct file *ret; struct nfsd_file *ret;
spin_lock(&f->fi_lock); spin_lock(&f->fi_lock);
ret = find_writeable_file_locked(f); ret = find_writeable_file_locked(f);
...@@ -463,9 +463,10 @@ find_writeable_file(struct nfs4_file *f) ...@@ -463,9 +463,10 @@ find_writeable_file(struct nfs4_file *f)
return ret; return ret;
} }
static struct file *find_readable_file_locked(struct nfs4_file *f) static struct nfsd_file *
find_readable_file_locked(struct nfs4_file *f)
{ {
struct file *ret; struct nfsd_file *ret;
lockdep_assert_held(&f->fi_lock); lockdep_assert_held(&f->fi_lock);
...@@ -475,10 +476,10 @@ static struct file *find_readable_file_locked(struct nfs4_file *f) ...@@ -475,10 +476,10 @@ static struct file *find_readable_file_locked(struct nfs4_file *f)
return ret; return ret;
} }
static struct file * static struct nfsd_file *
find_readable_file(struct nfs4_file *f) find_readable_file(struct nfs4_file *f)
{ {
struct file *ret; struct nfsd_file *ret;
spin_lock(&f->fi_lock); spin_lock(&f->fi_lock);
ret = find_readable_file_locked(f); ret = find_readable_file_locked(f);
...@@ -487,10 +488,10 @@ find_readable_file(struct nfs4_file *f) ...@@ -487,10 +488,10 @@ find_readable_file(struct nfs4_file *f)
return ret; return ret;
} }
struct file * struct nfsd_file *
find_any_file(struct nfs4_file *f) find_any_file(struct nfs4_file *f)
{ {
struct file *ret; struct nfsd_file *ret;
spin_lock(&f->fi_lock); spin_lock(&f->fi_lock);
ret = __nfs4_get_fd(f, O_RDWR); ret = __nfs4_get_fd(f, O_RDWR);
...@@ -934,25 +935,25 @@ nfs4_inc_and_copy_stateid(stateid_t *dst, struct nfs4_stid *stid) ...@@ -934,25 +935,25 @@ nfs4_inc_and_copy_stateid(stateid_t *dst, struct nfs4_stid *stid)
static void put_deleg_file(struct nfs4_file *fp) static void put_deleg_file(struct nfs4_file *fp)
{ {
struct file *filp = NULL; struct nfsd_file *nf = NULL;
spin_lock(&fp->fi_lock); spin_lock(&fp->fi_lock);
if (--fp->fi_delegees == 0) if (--fp->fi_delegees == 0)
swap(filp, fp->fi_deleg_file); swap(nf, fp->fi_deleg_file);
spin_unlock(&fp->fi_lock); spin_unlock(&fp->fi_lock);
if (filp) if (nf)
fput(filp); nfsd_file_put(nf);
} }
static void nfs4_unlock_deleg_lease(struct nfs4_delegation *dp) static void nfs4_unlock_deleg_lease(struct nfs4_delegation *dp)
{ {
struct nfs4_file *fp = dp->dl_stid.sc_file; struct nfs4_file *fp = dp->dl_stid.sc_file;
struct file *filp = fp->fi_deleg_file; struct nfsd_file *nf = fp->fi_deleg_file;
WARN_ON_ONCE(!fp->fi_delegees); WARN_ON_ONCE(!fp->fi_delegees);
vfs_setlease(filp, F_UNLCK, NULL, (void **)&dp); vfs_setlease(nf->nf_file, F_UNLCK, NULL, (void **)&dp);
put_deleg_file(fp); put_deleg_file(fp);
} }
...@@ -1290,11 +1291,14 @@ static void nfs4_free_lock_stateid(struct nfs4_stid *stid) ...@@ -1290,11 +1291,14 @@ static void nfs4_free_lock_stateid(struct nfs4_stid *stid)
{ {
struct nfs4_ol_stateid *stp = openlockstateid(stid); struct nfs4_ol_stateid *stp = openlockstateid(stid);
struct nfs4_lockowner *lo = lockowner(stp->st_stateowner); struct nfs4_lockowner *lo = lockowner(stp->st_stateowner);
struct file *file; struct nfsd_file *nf;
file = find_any_file(stp->st_stid.sc_file); nf = find_any_file(stp->st_stid.sc_file);
if (file) if (nf) {
filp_close(file, (fl_owner_t)lo); get_file(nf->nf_file);
filp_close(nf->nf_file, (fl_owner_t)lo);
nfsd_file_put(nf);
}
nfs4_free_ol_stateid(stid); nfs4_free_ol_stateid(stid);
} }
...@@ -2411,7 +2415,7 @@ static int nfs4_show_deleg(struct seq_file *s, struct nfs4_stid *st) ...@@ -2411,7 +2415,7 @@ static int nfs4_show_deleg(struct seq_file *s, struct nfs4_stid *st)
{ {
struct nfs4_delegation *ds; struct nfs4_delegation *ds;
struct nfs4_file *nf; struct nfs4_file *nf;
struct file *file; struct nfsd_file *file;
ds = delegstateid(st); ds = delegstateid(st);
nf = st->sc_file; nf = st->sc_file;
...@@ -2434,7 +2438,7 @@ static int nfs4_show_deleg(struct seq_file *s, struct nfs4_stid *st) ...@@ -2434,7 +2438,7 @@ static int nfs4_show_deleg(struct seq_file *s, struct nfs4_stid *st)
static int nfs4_show_layout(struct seq_file *s, struct nfs4_stid *st) static int nfs4_show_layout(struct seq_file *s, struct nfs4_stid *st)
{ {
struct nfs4_layout_stateid *ls; struct nfs4_layout_stateid *ls;
struct file *file; struct nfsd_file *file;
ls = container_of(st, struct nfs4_layout_stateid, ls_stid); ls = container_of(st, struct nfs4_layout_stateid, ls_stid);
file = ls->ls_file; file = ls->ls_file;
...@@ -4768,7 +4772,7 @@ static struct file_lock *nfs4_alloc_init_lease(struct nfs4_delegation *dp, ...@@ -4768,7 +4772,7 @@ static struct file_lock *nfs4_alloc_init_lease(struct nfs4_delegation *dp,
fl->fl_end = OFFSET_MAX; fl->fl_end = OFFSET_MAX;
fl->fl_owner = (fl_owner_t)dp; fl->fl_owner = (fl_owner_t)dp;
fl->fl_pid = current->tgid; fl->fl_pid = current->tgid;
fl->fl_file = dp->dl_stid.sc_file->fi_deleg_file; fl->fl_file = dp->dl_stid.sc_file->fi_deleg_file->nf_file;
return fl; return fl;
} }
...@@ -4778,7 +4782,7 @@ nfs4_set_delegation(struct nfs4_client *clp, struct svc_fh *fh, ...@@ -4778,7 +4782,7 @@ nfs4_set_delegation(struct nfs4_client *clp, struct svc_fh *fh,
{ {
int status = 0; int status = 0;
struct nfs4_delegation *dp; struct nfs4_delegation *dp;
struct file *filp; struct nfsd_file *nf;
struct file_lock *fl; struct file_lock *fl;
/* /*
...@@ -4789,8 +4793,8 @@ nfs4_set_delegation(struct nfs4_client *clp, struct svc_fh *fh, ...@@ -4789,8 +4793,8 @@ nfs4_set_delegation(struct nfs4_client *clp, struct svc_fh *fh,
if (fp->fi_had_conflict) if (fp->fi_had_conflict)
return ERR_PTR(-EAGAIN); return ERR_PTR(-EAGAIN);
filp = find_readable_file(fp); nf = find_readable_file(fp);
if (!filp) { if (!nf) {
/* We should always have a readable file here */ /* We should always have a readable file here */
WARN_ON_ONCE(1); WARN_ON_ONCE(1);
return ERR_PTR(-EBADF); return ERR_PTR(-EBADF);
...@@ -4800,17 +4804,17 @@ nfs4_set_delegation(struct nfs4_client *clp, struct svc_fh *fh, ...@@ -4800,17 +4804,17 @@ nfs4_set_delegation(struct nfs4_client *clp, struct svc_fh *fh,
if (nfs4_delegation_exists(clp, fp)) if (nfs4_delegation_exists(clp, fp))
status = -EAGAIN; status = -EAGAIN;
else if (!fp->fi_deleg_file) { else if (!fp->fi_deleg_file) {
fp->fi_deleg_file = filp; fp->fi_deleg_file = nf;
/* increment early to prevent fi_deleg_file from being /* increment early to prevent fi_deleg_file from being
* cleared */ * cleared */
fp->fi_delegees = 1; fp->fi_delegees = 1;
filp = NULL; nf = NULL;
} else } else
fp->fi_delegees++; fp->fi_delegees++;
spin_unlock(&fp->fi_lock); spin_unlock(&fp->fi_lock);
spin_unlock(&state_lock); spin_unlock(&state_lock);
if (filp) if (nf)
fput(filp); nfsd_file_put(nf);
if (status) if (status)
return ERR_PTR(status); return ERR_PTR(status);
...@@ -4823,7 +4827,7 @@ nfs4_set_delegation(struct nfs4_client *clp, struct svc_fh *fh, ...@@ -4823,7 +4827,7 @@ nfs4_set_delegation(struct nfs4_client *clp, struct svc_fh *fh,
if (!fl) if (!fl)
goto out_clnt_odstate; goto out_clnt_odstate;
status = vfs_setlease(fp->fi_deleg_file, fl->fl_type, &fl, NULL); status = vfs_setlease(fp->fi_deleg_file->nf_file, fl->fl_type, &fl, NULL);
if (fl) if (fl)
locks_free_lock(fl); locks_free_lock(fl);
if (status) if (status)
...@@ -4843,7 +4847,7 @@ nfs4_set_delegation(struct nfs4_client *clp, struct svc_fh *fh, ...@@ -4843,7 +4847,7 @@ nfs4_set_delegation(struct nfs4_client *clp, struct svc_fh *fh,
return dp; return dp;
out_unlock: out_unlock:
vfs_setlease(fp->fi_deleg_file, F_UNLCK, NULL, (void **)&dp); vfs_setlease(fp->fi_deleg_file->nf_file, F_UNLCK, NULL, (void **)&dp);
out_clnt_odstate: out_clnt_odstate:
put_clnt_odstate(dp->dl_clnt_odstate); put_clnt_odstate(dp->dl_clnt_odstate);
nfs4_put_stid(&dp->dl_stid); nfs4_put_stid(&dp->dl_stid);
...@@ -5514,7 +5518,7 @@ nfsd4_lookup_stateid(struct nfsd4_compound_state *cstate, ...@@ -5514,7 +5518,7 @@ nfsd4_lookup_stateid(struct nfsd4_compound_state *cstate,
return nfs_ok; return nfs_ok;
} }
static struct file * static struct nfsd_file *
nfs4_find_file(struct nfs4_stid *s, int flags) nfs4_find_file(struct nfs4_stid *s, int flags)
{ {
if (!s) if (!s)
...@@ -5524,7 +5528,7 @@ nfs4_find_file(struct nfs4_stid *s, int flags) ...@@ -5524,7 +5528,7 @@ nfs4_find_file(struct nfs4_stid *s, int flags)
case NFS4_DELEG_STID: case NFS4_DELEG_STID:
if (WARN_ON_ONCE(!s->sc_file->fi_deleg_file)) if (WARN_ON_ONCE(!s->sc_file->fi_deleg_file))
return NULL; return NULL;
return get_file(s->sc_file->fi_deleg_file); return nfsd_file_get(s->sc_file->fi_deleg_file);
case NFS4_OPEN_STID: case NFS4_OPEN_STID:
case NFS4_LOCK_STID: case NFS4_LOCK_STID:
if (flags & RD_STATE) if (flags & RD_STATE)
...@@ -5553,29 +5557,27 @@ nfs4_check_file(struct svc_rqst *rqstp, struct svc_fh *fhp, struct nfs4_stid *s, ...@@ -5553,29 +5557,27 @@ nfs4_check_file(struct svc_rqst *rqstp, struct svc_fh *fhp, struct nfs4_stid *s,
struct file **filpp, bool *tmp_file, int flags) struct file **filpp, bool *tmp_file, int flags)
{ {
int acc = (flags & RD_STATE) ? NFSD_MAY_READ : NFSD_MAY_WRITE; int acc = (flags & RD_STATE) ? NFSD_MAY_READ : NFSD_MAY_WRITE;
struct file *file; struct nfsd_file *nf;
__be32 status; __be32 status;
file = nfs4_find_file(s, flags); nf = nfs4_find_file(s, flags);
if (file) { if (nf) {
status = nfsd_permission(rqstp, fhp->fh_export, fhp->fh_dentry, status = nfsd_permission(rqstp, fhp->fh_export, fhp->fh_dentry,
acc | NFSD_MAY_OWNER_OVERRIDE); acc | NFSD_MAY_OWNER_OVERRIDE);
if (status) { if (status)
fput(file); goto out;
return status;
}
*filpp = file;
} else { } else {
status = nfsd_open(rqstp, fhp, S_IFREG, acc, filpp); status = nfsd_file_acquire(rqstp, fhp, acc, &nf);
if (status) if (status)
return status; return status;
if (tmp_file) if (tmp_file)
*tmp_file = true; *tmp_file = true;
} }
*filpp = get_file(nf->nf_file);
return 0; out:
nfsd_file_put(nf);
return status;
} }
/* /*
...@@ -6393,7 +6395,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -6393,7 +6395,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
struct nfs4_ol_stateid *lock_stp = NULL; struct nfs4_ol_stateid *lock_stp = NULL;
struct nfs4_ol_stateid *open_stp = NULL; struct nfs4_ol_stateid *open_stp = NULL;
struct nfs4_file *fp; struct nfs4_file *fp;
struct file *filp = NULL; struct nfsd_file *nf = NULL;
struct nfsd4_blocked_lock *nbl = NULL; struct nfsd4_blocked_lock *nbl = NULL;
struct file_lock *file_lock = NULL; struct file_lock *file_lock = NULL;
struct file_lock *conflock = NULL; struct file_lock *conflock = NULL;
...@@ -6475,8 +6477,8 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -6475,8 +6477,8 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
/* Fallthrough */ /* Fallthrough */
case NFS4_READ_LT: case NFS4_READ_LT:
spin_lock(&fp->fi_lock); spin_lock(&fp->fi_lock);
filp = find_readable_file_locked(fp); nf = find_readable_file_locked(fp);
if (filp) if (nf)
get_lock_access(lock_stp, NFS4_SHARE_ACCESS_READ); get_lock_access(lock_stp, NFS4_SHARE_ACCESS_READ);
spin_unlock(&fp->fi_lock); spin_unlock(&fp->fi_lock);
fl_type = F_RDLCK; fl_type = F_RDLCK;
...@@ -6487,8 +6489,8 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -6487,8 +6489,8 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
/* Fallthrough */ /* Fallthrough */
case NFS4_WRITE_LT: case NFS4_WRITE_LT:
spin_lock(&fp->fi_lock); spin_lock(&fp->fi_lock);
filp = find_writeable_file_locked(fp); nf = find_writeable_file_locked(fp);
if (filp) if (nf)
get_lock_access(lock_stp, NFS4_SHARE_ACCESS_WRITE); get_lock_access(lock_stp, NFS4_SHARE_ACCESS_WRITE);
spin_unlock(&fp->fi_lock); spin_unlock(&fp->fi_lock);
fl_type = F_WRLCK; fl_type = F_WRLCK;
...@@ -6498,7 +6500,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -6498,7 +6500,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
goto out; goto out;
} }
if (!filp) { if (!nf) {
status = nfserr_openmode; status = nfserr_openmode;
goto out; goto out;
} }
...@@ -6514,7 +6516,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -6514,7 +6516,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
file_lock->fl_type = fl_type; file_lock->fl_type = fl_type;
file_lock->fl_owner = (fl_owner_t)lockowner(nfs4_get_stateowner(&lock_sop->lo_owner)); file_lock->fl_owner = (fl_owner_t)lockowner(nfs4_get_stateowner(&lock_sop->lo_owner));
file_lock->fl_pid = current->tgid; file_lock->fl_pid = current->tgid;
file_lock->fl_file = filp; file_lock->fl_file = nf->nf_file;
file_lock->fl_flags = fl_flags; file_lock->fl_flags = fl_flags;
file_lock->fl_lmops = &nfsd_posix_mng_ops; file_lock->fl_lmops = &nfsd_posix_mng_ops;
file_lock->fl_start = lock->lk_offset; file_lock->fl_start = lock->lk_offset;
...@@ -6536,7 +6538,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -6536,7 +6538,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
spin_unlock(&nn->blocked_locks_lock); spin_unlock(&nn->blocked_locks_lock);
} }
err = vfs_lock_file(filp, F_SETLK, file_lock, conflock); err = vfs_lock_file(nf->nf_file, F_SETLK, file_lock, conflock);
switch (err) { switch (err) {
case 0: /* success! */ case 0: /* success! */
nfs4_inc_and_copy_stateid(&lock->lk_resp_stateid, &lock_stp->st_stid); nfs4_inc_and_copy_stateid(&lock->lk_resp_stateid, &lock_stp->st_stid);
...@@ -6571,8 +6573,8 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -6571,8 +6573,8 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
} }
free_blocked_lock(nbl); free_blocked_lock(nbl);
} }
if (filp) if (nf)
fput(filp); nfsd_file_put(nf);
if (lock_stp) { if (lock_stp) {
/* Bump seqid manually if the 4.0 replay owner is openowner */ /* Bump seqid manually if the 4.0 replay owner is openowner */
if (cstate->replay_owner && if (cstate->replay_owner &&
...@@ -6699,7 +6701,7 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -6699,7 +6701,7 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
{ {
struct nfsd4_locku *locku = &u->locku; struct nfsd4_locku *locku = &u->locku;
struct nfs4_ol_stateid *stp; struct nfs4_ol_stateid *stp;
struct file *filp = NULL; struct nfsd_file *nf = NULL;
struct file_lock *file_lock = NULL; struct file_lock *file_lock = NULL;
__be32 status; __be32 status;
int err; int err;
...@@ -6717,8 +6719,8 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -6717,8 +6719,8 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
&stp, nn); &stp, nn);
if (status) if (status)
goto out; goto out;
filp = find_any_file(stp->st_stid.sc_file); nf = find_any_file(stp->st_stid.sc_file);
if (!filp) { if (!nf) {
status = nfserr_lock_range; status = nfserr_lock_range;
goto put_stateid; goto put_stateid;
} }
...@@ -6726,13 +6728,13 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -6726,13 +6728,13 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
if (!file_lock) { if (!file_lock) {
dprintk("NFSD: %s: unable to allocate lock!\n", __func__); dprintk("NFSD: %s: unable to allocate lock!\n", __func__);
status = nfserr_jukebox; status = nfserr_jukebox;
goto fput; goto put_file;
} }
file_lock->fl_type = F_UNLCK; file_lock->fl_type = F_UNLCK;
file_lock->fl_owner = (fl_owner_t)lockowner(nfs4_get_stateowner(stp->st_stateowner)); file_lock->fl_owner = (fl_owner_t)lockowner(nfs4_get_stateowner(stp->st_stateowner));
file_lock->fl_pid = current->tgid; file_lock->fl_pid = current->tgid;
file_lock->fl_file = filp; file_lock->fl_file = nf->nf_file;
file_lock->fl_flags = FL_POSIX; file_lock->fl_flags = FL_POSIX;
file_lock->fl_lmops = &nfsd_posix_mng_ops; file_lock->fl_lmops = &nfsd_posix_mng_ops;
file_lock->fl_start = locku->lu_offset; file_lock->fl_start = locku->lu_offset;
...@@ -6741,14 +6743,14 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -6741,14 +6743,14 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
locku->lu_length); locku->lu_length);
nfs4_transform_lock_offset(file_lock); nfs4_transform_lock_offset(file_lock);
err = vfs_lock_file(filp, F_SETLK, file_lock, NULL); err = vfs_lock_file(nf->nf_file, F_SETLK, file_lock, NULL);
if (err) { if (err) {
dprintk("NFSD: nfs4_locku: vfs_lock_file failed!\n"); dprintk("NFSD: nfs4_locku: vfs_lock_file failed!\n");
goto out_nfserr; goto out_nfserr;
} }
nfs4_inc_and_copy_stateid(&locku->lu_stateid, &stp->st_stid); nfs4_inc_and_copy_stateid(&locku->lu_stateid, &stp->st_stid);
fput: put_file:
fput(filp); nfsd_file_put(nf);
put_stateid: put_stateid:
mutex_unlock(&stp->st_mutex); mutex_unlock(&stp->st_mutex);
nfs4_put_stid(&stp->st_stid); nfs4_put_stid(&stp->st_stid);
...@@ -6760,7 +6762,7 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, ...@@ -6760,7 +6762,7 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
out_nfserr: out_nfserr:
status = nfserrno(err); status = nfserrno(err);
goto fput; goto put_file;
} }
/* /*
...@@ -6773,17 +6775,17 @@ check_for_locks(struct nfs4_file *fp, struct nfs4_lockowner *lowner) ...@@ -6773,17 +6775,17 @@ check_for_locks(struct nfs4_file *fp, struct nfs4_lockowner *lowner)
{ {
struct file_lock *fl; struct file_lock *fl;
int status = false; int status = false;
struct file *filp = find_any_file(fp); struct nfsd_file *nf = find_any_file(fp);
struct inode *inode; struct inode *inode;
struct file_lock_context *flctx; struct file_lock_context *flctx;
if (!filp) { if (!nf) {
/* Any valid lock stateid should have some sort of access */ /* Any valid lock stateid should have some sort of access */
WARN_ON_ONCE(1); WARN_ON_ONCE(1);
return status; return status;
} }
inode = locks_inode(filp); inode = locks_inode(nf->nf_file);
flctx = inode->i_flctx; flctx = inode->i_flctx;
if (flctx && !list_empty_careful(&flctx->flc_posix)) { if (flctx && !list_empty_careful(&flctx->flc_posix)) {
...@@ -6796,7 +6798,7 @@ check_for_locks(struct nfs4_file *fp, struct nfs4_lockowner *lowner) ...@@ -6796,7 +6798,7 @@ check_for_locks(struct nfs4_file *fp, struct nfs4_lockowner *lowner)
} }
spin_unlock(&flctx->flc_lock); spin_unlock(&flctx->flc_lock);
} }
fput(filp); nfsd_file_put(nf);
return status; return status;
} }
......
...@@ -516,7 +516,7 @@ struct nfs4_file { ...@@ -516,7 +516,7 @@ struct nfs4_file {
*/ */
atomic_t fi_access[2]; atomic_t fi_access[2];
u32 fi_share_deny; u32 fi_share_deny;
struct file *fi_deleg_file; struct nfsd_file *fi_deleg_file;
int fi_delegees; int fi_delegees;
struct knfsd_fh fi_fhandle; struct knfsd_fh fi_fhandle;
bool fi_had_conflict; bool fi_had_conflict;
...@@ -565,7 +565,7 @@ struct nfs4_layout_stateid { ...@@ -565,7 +565,7 @@ struct nfs4_layout_stateid {
spinlock_t ls_lock; spinlock_t ls_lock;
struct list_head ls_layouts; struct list_head ls_layouts;
u32 ls_layout_type; u32 ls_layout_type;
struct file *ls_file; struct nfsd_file *ls_file;
struct nfsd4_callback ls_recall; struct nfsd4_callback ls_recall;
stateid_t ls_recall_sid; stateid_t ls_recall_sid;
bool ls_recalled; bool ls_recalled;
...@@ -657,7 +657,7 @@ static inline void get_nfs4_file(struct nfs4_file *fi) ...@@ -657,7 +657,7 @@ static inline void get_nfs4_file(struct nfs4_file *fi)
{ {
refcount_inc(&fi->fi_ref); refcount_inc(&fi->fi_ref);
} }
struct file *find_any_file(struct nfs4_file *f); struct nfsd_file *find_any_file(struct nfs4_file *f);
/* grace period management */ /* grace period management */
void nfsd4_end_grace(struct nfsd_net *nn); void nfsd4_end_grace(struct nfsd_net *nn);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment