mirror of
https://github.com/torvalds/linux
synced 2024-10-16 00:10:42 +00:00
NFSD: Add tracepoints in nfsd4_decode/encode_compound()
For troubleshooting purposes, record failures to decode NFSv4 operation arguments and encode operation results. trace_nfsd_compound_decode_err() replaces the dprintk() call sites that are embedded in READ_* macros that are about to be removed. Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
0dfdad1c1d
commit
08281341be
|
@ -54,6 +54,8 @@
|
||||||
#include "pnfs.h"
|
#include "pnfs.h"
|
||||||
#include "filecache.h"
|
#include "filecache.h"
|
||||||
|
|
||||||
|
#include "trace.h"
|
||||||
|
|
||||||
#ifdef CONFIG_NFSD_V4_SECURITY_LABEL
|
#ifdef CONFIG_NFSD_V4_SECURITY_LABEL
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -2248,9 +2250,14 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
|
||||||
READ_BUF(4);
|
READ_BUF(4);
|
||||||
op->opnum = be32_to_cpup(p++);
|
op->opnum = be32_to_cpup(p++);
|
||||||
|
|
||||||
if (nfsd4_opnum_in_range(argp, op))
|
if (nfsd4_opnum_in_range(argp, op)) {
|
||||||
op->status = nfsd4_dec_ops[op->opnum](argp, &op->u);
|
op->status = nfsd4_dec_ops[op->opnum](argp, &op->u);
|
||||||
else {
|
if (op->status != nfs_ok)
|
||||||
|
trace_nfsd_compound_decode_err(argp->rqstp,
|
||||||
|
argp->opcnt, i,
|
||||||
|
op->opnum,
|
||||||
|
op->status);
|
||||||
|
} else {
|
||||||
op->opnum = OP_ILLEGAL;
|
op->opnum = OP_ILLEGAL;
|
||||||
op->status = nfserr_op_illegal;
|
op->status = nfserr_op_illegal;
|
||||||
}
|
}
|
||||||
|
@ -5203,6 +5210,8 @@ nfsd4_encode_operation(struct nfsd4_compoundres *resp, struct nfsd4_op *op)
|
||||||
!nfsd4_enc_ops[op->opnum]);
|
!nfsd4_enc_ops[op->opnum]);
|
||||||
encoder = nfsd4_enc_ops[op->opnum];
|
encoder = nfsd4_enc_ops[op->opnum];
|
||||||
op->status = encoder(resp, op->status, &op->u);
|
op->status = encoder(resp, op->status, &op->u);
|
||||||
|
if (op->status)
|
||||||
|
trace_nfsd_compound_encode_err(rqstp, op->opnum, op->status);
|
||||||
if (opdesc && opdesc->op_release)
|
if (opdesc && opdesc->op_release)
|
||||||
opdesc->op_release(&op->u);
|
opdesc->op_release(&op->u);
|
||||||
xdr_commit_encode(xdr);
|
xdr_commit_encode(xdr);
|
||||||
|
|
|
@ -28,6 +28,24 @@
|
||||||
rqstp->rq_xprt->xpt_remotelen); \
|
rqstp->rq_xprt->xpt_remotelen); \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
|
#define NFSD_TRACE_PROC_RES_FIELDS \
|
||||||
|
__field(unsigned int, netns_ino) \
|
||||||
|
__field(u32, xid) \
|
||||||
|
__field(unsigned long, status) \
|
||||||
|
__array(unsigned char, server, sizeof(struct sockaddr_in6)) \
|
||||||
|
__array(unsigned char, client, sizeof(struct sockaddr_in6))
|
||||||
|
|
||||||
|
#define NFSD_TRACE_PROC_RES_ASSIGNMENTS(error) \
|
||||||
|
do { \
|
||||||
|
__entry->netns_ino = SVC_NET(rqstp)->ns.inum; \
|
||||||
|
__entry->xid = be32_to_cpu(rqstp->rq_xid); \
|
||||||
|
__entry->status = be32_to_cpu(error); \
|
||||||
|
memcpy(__entry->server, &rqstp->rq_xprt->xpt_local, \
|
||||||
|
rqstp->rq_xprt->xpt_locallen); \
|
||||||
|
memcpy(__entry->client, &rqstp->rq_xprt->xpt_remote, \
|
||||||
|
rqstp->rq_xprt->xpt_remotelen); \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
TRACE_EVENT(nfsd_garbage_args_err,
|
TRACE_EVENT(nfsd_garbage_args_err,
|
||||||
TP_PROTO(
|
TP_PROTO(
|
||||||
const struct svc_rqst *rqstp
|
const struct svc_rqst *rqstp
|
||||||
|
@ -127,6 +145,56 @@ TRACE_EVENT(nfsd_compound_status,
|
||||||
__get_str(name), __entry->status)
|
__get_str(name), __entry->status)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
TRACE_EVENT(nfsd_compound_decode_err,
|
||||||
|
TP_PROTO(
|
||||||
|
const struct svc_rqst *rqstp,
|
||||||
|
u32 args_opcnt,
|
||||||
|
u32 resp_opcnt,
|
||||||
|
u32 opnum,
|
||||||
|
__be32 status
|
||||||
|
),
|
||||||
|
TP_ARGS(rqstp, args_opcnt, resp_opcnt, opnum, status),
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
NFSD_TRACE_PROC_RES_FIELDS
|
||||||
|
|
||||||
|
__field(u32, args_opcnt)
|
||||||
|
__field(u32, resp_opcnt)
|
||||||
|
__field(u32, opnum)
|
||||||
|
),
|
||||||
|
TP_fast_assign(
|
||||||
|
NFSD_TRACE_PROC_RES_ASSIGNMENTS(status)
|
||||||
|
|
||||||
|
__entry->args_opcnt = args_opcnt;
|
||||||
|
__entry->resp_opcnt = resp_opcnt;
|
||||||
|
__entry->opnum = opnum;
|
||||||
|
),
|
||||||
|
TP_printk("op=%u/%u opnum=%u status=%lu",
|
||||||
|
__entry->resp_opcnt, __entry->args_opcnt,
|
||||||
|
__entry->opnum, __entry->status)
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(nfsd_compound_encode_err,
|
||||||
|
TP_PROTO(
|
||||||
|
const struct svc_rqst *rqstp,
|
||||||
|
u32 opnum,
|
||||||
|
__be32 status
|
||||||
|
),
|
||||||
|
TP_ARGS(rqstp, opnum, status),
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
NFSD_TRACE_PROC_RES_FIELDS
|
||||||
|
|
||||||
|
__field(u32, opnum)
|
||||||
|
),
|
||||||
|
TP_fast_assign(
|
||||||
|
NFSD_TRACE_PROC_RES_ASSIGNMENTS(status)
|
||||||
|
|
||||||
|
__entry->opnum = opnum;
|
||||||
|
),
|
||||||
|
TP_printk("opnum=%u status=%lu",
|
||||||
|
__entry->opnum, __entry->status)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
DECLARE_EVENT_CLASS(nfsd_fh_err_class,
|
DECLARE_EVENT_CLASS(nfsd_fh_err_class,
|
||||||
TP_PROTO(struct svc_rqst *rqstp,
|
TP_PROTO(struct svc_rqst *rqstp,
|
||||||
struct svc_fh *fhp,
|
struct svc_fh *fhp,
|
||||||
|
|
Loading…
Reference in a new issue