Commit 354ecbb9 authored by Dr. David Alan Gilbert's avatar Dr. David Alan Gilbert Committed by J. Bruce Fields

knfsd: Add source address to sunrpc svc errors

This patch adds the address of the client that caused an error in
sunrpc/svc.c so that you get errors that look like:

svc: 192.168.66.28, port=709: unknown version (3 for prog 100003, nfsd)

I've seen machines which get bunches of unknown version or similar
errors from time to time, and while the recent patch to add the service
helps to find which service has the wrong version it doesn't help find
the potentially bad client.

The patch is against a checkout of Linus's git tree made on 2007-08-24.

One observation is that the svc_print_addr function prints to a buffer
which in this case makes life a little more complex; it just feels as if
there must be lots of places that print a connection address - is there
a better function to use anywhere?

I think actually there are a few places with semi duplicated code; e.g.
one_sock_name switches on the address family but only currently has
IPV4; I wonder how many other places are similar.
Signed-off-by: default avatarDave Gilbert <linux@treblig.org>
Cc: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
Acked-by: default avatarNeil Brown <neilb@suse.de>
parent 40ee5dc6
...@@ -776,6 +776,30 @@ svc_register(struct svc_serv *serv, int proto, unsigned short port) ...@@ -776,6 +776,30 @@ svc_register(struct svc_serv *serv, int proto, unsigned short port)
return error; return error;
} }
/*
* Printk the given error with the address of the client that caused it.
*/
static int
__attribute__ ((format (printf, 2, 3)))
svc_printk(struct svc_rqst *rqstp, const char *fmt, ...)
{
va_list args;
int r;
char buf[RPC_MAX_ADDRBUFLEN];
if (!net_ratelimit())
return 0;
printk(KERN_WARNING "svc: %s: ",
svc_print_addr(rqstp, buf, sizeof(buf)));
va_start(args, fmt);
r = vprintk(fmt, args);
va_end(args);
return r;
}
/* /*
* Process the RPC request. * Process the RPC request.
*/ */
...@@ -963,14 +987,13 @@ svc_process(struct svc_rqst *rqstp) ...@@ -963,14 +987,13 @@ svc_process(struct svc_rqst *rqstp)
return 0; return 0;
err_short_len: err_short_len:
if (net_ratelimit()) svc_printk(rqstp, "short len %Zd, dropping request\n",
printk("svc: short len %Zd, dropping request\n", argv->iov_len); argv->iov_len);
goto dropit; /* drop request */ goto dropit; /* drop request */
err_bad_dir: err_bad_dir:
if (net_ratelimit()) svc_printk(rqstp, "bad direction %d, dropping request\n", dir);
printk("svc: bad direction %d, dropping request\n", dir);
serv->sv_stats->rpcbadfmt++; serv->sv_stats->rpcbadfmt++;
goto dropit; /* drop request */ goto dropit; /* drop request */
...@@ -1000,8 +1023,7 @@ svc_process(struct svc_rqst *rqstp) ...@@ -1000,8 +1023,7 @@ svc_process(struct svc_rqst *rqstp)
goto sendit; goto sendit;
err_bad_vers: err_bad_vers:
if (net_ratelimit()) svc_printk(rqstp, "unknown version (%d for prog %d, %s)\n",
printk("svc: unknown version (%d for prog %d, %s)\n",
vers, prog, progp->pg_name); vers, prog, progp->pg_name);
serv->sv_stats->rpcbadfmt++; serv->sv_stats->rpcbadfmt++;
...@@ -1011,16 +1033,14 @@ svc_process(struct svc_rqst *rqstp) ...@@ -1011,16 +1033,14 @@ svc_process(struct svc_rqst *rqstp)
goto sendit; goto sendit;
err_bad_proc: err_bad_proc:
if (net_ratelimit()) svc_printk(rqstp, "unknown procedure (%d)\n", proc);
printk("svc: unknown procedure (%d)\n", proc);
serv->sv_stats->rpcbadfmt++; serv->sv_stats->rpcbadfmt++;
svc_putnl(resv, RPC_PROC_UNAVAIL); svc_putnl(resv, RPC_PROC_UNAVAIL);
goto sendit; goto sendit;
err_garbage: err_garbage:
if (net_ratelimit()) svc_printk(rqstp, "failed to decode args\n");
printk("svc: failed to decode args\n");
rpc_stat = rpc_garbage_args; rpc_stat = rpc_garbage_args;
err_bad: err_bad:
......
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