nfsd: don't take nfsd4_copy ref for OP_OFFLOAD_STATUS
We're not doing any blocking operations for OP_OFFLOAD_STATUS, so taking and putting a reference is a waste of effort. Take the client lock, search for the copy and fetch the wr_bytes_written field and return. Also, make find_async_copy a static function. Signed-off-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: Olga Kornievskaia <kolga@netapp.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
c4a9f0552c
commit
fcb530973b
|
@ -1824,22 +1824,33 @@ out_err:
|
|||
goto out;
|
||||
}
|
||||
|
||||
struct nfsd4_copy *
|
||||
static struct nfsd4_copy *
|
||||
find_async_copy_locked(struct nfs4_client *clp, stateid_t *stateid)
|
||||
{
|
||||
struct nfsd4_copy *copy;
|
||||
|
||||
lockdep_assert_held(&clp->async_lock);
|
||||
|
||||
list_for_each_entry(copy, &clp->async_copies, copies) {
|
||||
if (memcmp(©->cp_stateid.cs_stid, stateid, NFS4_STATEID_SIZE))
|
||||
continue;
|
||||
return copy;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct nfsd4_copy *
|
||||
find_async_copy(struct nfs4_client *clp, stateid_t *stateid)
|
||||
{
|
||||
struct nfsd4_copy *copy;
|
||||
|
||||
spin_lock(&clp->async_lock);
|
||||
list_for_each_entry(copy, &clp->async_copies, copies) {
|
||||
if (memcmp(©->cp_stateid.cs_stid, stateid, NFS4_STATEID_SIZE))
|
||||
continue;
|
||||
copy = find_async_copy_locked(clp, stateid);
|
||||
if (copy)
|
||||
refcount_inc(©->refcount);
|
||||
spin_unlock(&clp->async_lock);
|
||||
return copy;
|
||||
}
|
||||
spin_unlock(&clp->async_lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static __be32
|
||||
nfsd4_offload_cancel(struct svc_rqst *rqstp,
|
||||
|
@ -1925,22 +1936,24 @@ nfsd4_fallocate(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
|||
nfsd_file_put(nf);
|
||||
return status;
|
||||
}
|
||||
|
||||
static __be32
|
||||
nfsd4_offload_status(struct svc_rqst *rqstp,
|
||||
struct nfsd4_compound_state *cstate,
|
||||
union nfsd4_op_u *u)
|
||||
{
|
||||
struct nfsd4_offload_status *os = &u->offload_status;
|
||||
__be32 status = 0;
|
||||
__be32 status = nfs_ok;
|
||||
struct nfsd4_copy *copy;
|
||||
struct nfs4_client *clp = cstate->clp;
|
||||
|
||||
copy = find_async_copy(clp, &os->stateid);
|
||||
if (copy) {
|
||||
spin_lock(&clp->async_lock);
|
||||
copy = find_async_copy_locked(clp, &os->stateid);
|
||||
if (copy)
|
||||
os->count = copy->cp_res.wr_bytes_written;
|
||||
nfs4_put_copy(copy);
|
||||
} else
|
||||
else
|
||||
status = nfserr_bad_stateid;
|
||||
spin_unlock(&clp->async_lock);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
|
|
@ -705,8 +705,6 @@ extern struct nfs4_client_reclaim *nfs4_client_to_reclaim(struct xdr_netobj name
|
|||
extern bool nfs4_has_reclaimed_state(struct xdr_netobj name, struct nfsd_net *nn);
|
||||
|
||||
void put_nfs4_file(struct nfs4_file *fi);
|
||||
extern struct nfsd4_copy *
|
||||
find_async_copy(struct nfs4_client *clp, stateid_t *staetid);
|
||||
extern void nfs4_put_cpntf_state(struct nfsd_net *nn,
|
||||
struct nfs4_cpntf_state *cps);
|
||||
extern __be32 manage_cpntf_state(struct nfsd_net *nn, stateid_t *st,
|
||||
|
|
Loading…
Reference in New Issue