NFSD: Separate tracepoints for acquire and create
These tracepoints collect different information: the create case does not open a file, so there's no nf_file available. Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
0ec8e9d153
commit
be0230069f
|
@ -1040,7 +1040,7 @@ nfsd_file_is_cached(struct inode *inode)
|
||||||
}
|
}
|
||||||
|
|
||||||
static __be32
|
static __be32
|
||||||
nfsd_do_file_acquire(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
nfsd_file_do_acquire(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||||
unsigned int may_flags, struct nfsd_file **pnf, bool open)
|
unsigned int may_flags, struct nfsd_file **pnf, bool open)
|
||||||
{
|
{
|
||||||
struct nfsd_file_lookup_key key = {
|
struct nfsd_file_lookup_key key = {
|
||||||
|
@ -1121,6 +1121,7 @@ out:
|
||||||
|
|
||||||
out_status:
|
out_status:
|
||||||
put_cred(key.cred);
|
put_cred(key.cred);
|
||||||
|
if (open)
|
||||||
trace_nfsd_file_acquire(rqstp, key.inode, may_flags, nf, status);
|
trace_nfsd_file_acquire(rqstp, key.inode, may_flags, nf, status);
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
|
@ -1169,7 +1170,7 @@ __be32
|
||||||
nfsd_file_acquire(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
nfsd_file_acquire(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||||
unsigned int may_flags, struct nfsd_file **pnf)
|
unsigned int may_flags, struct nfsd_file **pnf)
|
||||||
{
|
{
|
||||||
return nfsd_do_file_acquire(rqstp, fhp, may_flags, pnf, true);
|
return nfsd_file_do_acquire(rqstp, fhp, may_flags, pnf, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1186,7 +1187,7 @@ __be32
|
||||||
nfsd_file_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
nfsd_file_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||||
unsigned int may_flags, struct nfsd_file **pnf)
|
unsigned int may_flags, struct nfsd_file **pnf)
|
||||||
{
|
{
|
||||||
return nfsd_do_file_acquire(rqstp, fhp, may_flags, pnf, false);
|
return nfsd_file_do_acquire(rqstp, fhp, may_flags, pnf, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -5104,6 +5104,7 @@ static __be32 nfs4_get_vfs_file(struct svc_rqst *rqstp, struct nfs4_file *fp,
|
||||||
goto out_put_access;
|
goto out_put_access;
|
||||||
nf->nf_file = open->op_filp;
|
nf->nf_file = open->op_filp;
|
||||||
open->op_filp = NULL;
|
open->op_filp = NULL;
|
||||||
|
trace_nfsd_file_create(rqstp, access, nf);
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock(&fp->fi_lock);
|
spin_lock(&fp->fi_lock);
|
||||||
|
|
|
@ -782,10 +782,10 @@ DEFINE_NFSD_FILE_EVENT(nfsd_file_unhash_and_dispose);
|
||||||
|
|
||||||
TRACE_EVENT(nfsd_file_acquire,
|
TRACE_EVENT(nfsd_file_acquire,
|
||||||
TP_PROTO(
|
TP_PROTO(
|
||||||
struct svc_rqst *rqstp,
|
const struct svc_rqst *rqstp,
|
||||||
struct inode *inode,
|
const struct inode *inode,
|
||||||
unsigned int may_flags,
|
unsigned int may_flags,
|
||||||
struct nfsd_file *nf,
|
const struct nfsd_file *nf,
|
||||||
__be32 status
|
__be32 status
|
||||||
),
|
),
|
||||||
|
|
||||||
|
@ -793,12 +793,12 @@ TRACE_EVENT(nfsd_file_acquire,
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
TP_STRUCT__entry(
|
||||||
__field(u32, xid)
|
__field(u32, xid)
|
||||||
__field(void *, inode)
|
__field(const void *, inode)
|
||||||
__field(unsigned long, may_flags)
|
__field(unsigned long, may_flags)
|
||||||
__field(int, nf_ref)
|
__field(unsigned int, nf_ref)
|
||||||
__field(unsigned long, nf_flags)
|
__field(unsigned long, nf_flags)
|
||||||
__field(unsigned long, nf_may)
|
__field(unsigned long, nf_may)
|
||||||
__field(struct file *, nf_file)
|
__field(const void *, nf_file)
|
||||||
__field(u32, status)
|
__field(u32, status)
|
||||||
),
|
),
|
||||||
|
|
||||||
|
@ -813,12 +813,50 @@ TRACE_EVENT(nfsd_file_acquire,
|
||||||
__entry->status = be32_to_cpu(status);
|
__entry->status = be32_to_cpu(status);
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_printk("xid=0x%x inode=%p may_flags=%s ref=%d nf_flags=%s nf_may=%s nf_file=%p status=%u",
|
TP_printk("xid=0x%x inode=%p may_flags=%s ref=%u nf_flags=%s nf_may=%s nf_file=%p status=%u",
|
||||||
__entry->xid, __entry->inode,
|
__entry->xid, __entry->inode,
|
||||||
show_nfsd_may_flags(__entry->may_flags),
|
show_nfsd_may_flags(__entry->may_flags),
|
||||||
__entry->nf_ref, show_nf_flags(__entry->nf_flags),
|
__entry->nf_ref, show_nf_flags(__entry->nf_flags),
|
||||||
show_nfsd_may_flags(__entry->nf_may),
|
show_nfsd_may_flags(__entry->nf_may),
|
||||||
__entry->nf_file, __entry->status)
|
__entry->nf_file, __entry->status
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(nfsd_file_create,
|
||||||
|
TP_PROTO(
|
||||||
|
const struct svc_rqst *rqstp,
|
||||||
|
unsigned int may_flags,
|
||||||
|
const struct nfsd_file *nf
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_ARGS(rqstp, may_flags, nf),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(const void *, nf_inode)
|
||||||
|
__field(const void *, nf_file)
|
||||||
|
__field(unsigned long, may_flags)
|
||||||
|
__field(unsigned long, nf_flags)
|
||||||
|
__field(unsigned long, nf_may)
|
||||||
|
__field(unsigned int, nf_ref)
|
||||||
|
__field(u32, xid)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->nf_inode = nf->nf_inode;
|
||||||
|
__entry->nf_file = nf->nf_file;
|
||||||
|
__entry->may_flags = may_flags;
|
||||||
|
__entry->nf_flags = nf->nf_flags;
|
||||||
|
__entry->nf_may = nf->nf_may;
|
||||||
|
__entry->nf_ref = refcount_read(&nf->nf_ref);
|
||||||
|
__entry->xid = be32_to_cpu(rqstp->rq_xid);
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("xid=0x%x inode=%p may_flags=%s ref=%u nf_flags=%s nf_may=%s nf_file=%p",
|
||||||
|
__entry->xid, __entry->nf_inode,
|
||||||
|
show_nfsd_may_flags(__entry->may_flags),
|
||||||
|
__entry->nf_ref, show_nf_flags(__entry->nf_flags),
|
||||||
|
show_nfsd_may_flags(__entry->nf_may), __entry->nf_file
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
TRACE_EVENT(nfsd_file_insert_err,
|
TRACE_EVENT(nfsd_file_insert_err,
|
||||||
|
|
Loading…
Reference in New Issue