forked from Minki/linux
SUNRPC: track whether a request is coming from a loop-back interface.
If an incoming NFS request is coming from the local host, then nfsd will need to perform some special handling. So detect that possibility and make the source visible in rq_local. Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
c789102c20
commit
ef11ce2487
@ -254,6 +254,7 @@ struct svc_rqst {
|
||||
u32 rq_prot; /* IP protocol */
|
||||
unsigned short
|
||||
rq_secure : 1; /* secure port */
|
||||
unsigned short rq_local : 1; /* local request */
|
||||
|
||||
void * rq_argp; /* decoded arguments */
|
||||
void * rq_resp; /* xdr'd results */
|
||||
|
@ -64,6 +64,7 @@ struct svc_xprt {
|
||||
#define XPT_DETACHED 10 /* detached from tempsocks list */
|
||||
#define XPT_LISTENER 11 /* listening endpoint */
|
||||
#define XPT_CACHE_AUTH 12 /* cache auth info */
|
||||
#define XPT_LOCAL 13 /* connection from loopback interface */
|
||||
|
||||
struct svc_serv *xpt_server; /* service for transport */
|
||||
atomic_t xpt_reserved; /* space on outq that is rsvd */
|
||||
|
@ -43,6 +43,19 @@ static inline int rpc_reply_expected(struct rpc_task *task)
|
||||
(task->tk_msg.rpc_proc->p_decode != NULL);
|
||||
}
|
||||
|
||||
static inline int sock_is_loopback(struct sock *sk)
|
||||
{
|
||||
struct dst_entry *dst;
|
||||
int loopback = 0;
|
||||
rcu_read_lock();
|
||||
dst = rcu_dereference(sk->sk_dst_cache);
|
||||
if (dst && dst->dev &&
|
||||
(dst->dev->features & NETIF_F_LOOPBACK))
|
||||
loopback = 1;
|
||||
rcu_read_unlock();
|
||||
return loopback;
|
||||
}
|
||||
|
||||
int svc_send_common(struct socket *sock, struct xdr_buf *xdr,
|
||||
struct page *headpage, unsigned long headoffset,
|
||||
struct page *tailpage, unsigned long tailoffset);
|
||||
|
@ -874,6 +874,10 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt)
|
||||
}
|
||||
svc_xprt_set_local(&newsvsk->sk_xprt, sin, slen);
|
||||
|
||||
if (sock_is_loopback(newsock->sk))
|
||||
set_bit(XPT_LOCAL, &newsvsk->sk_xprt.xpt_flags);
|
||||
else
|
||||
clear_bit(XPT_LOCAL, &newsvsk->sk_xprt.xpt_flags);
|
||||
if (serv->sv_stats)
|
||||
serv->sv_stats->nettcpconn++;
|
||||
|
||||
@ -1119,6 +1123,7 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp)
|
||||
|
||||
rqstp->rq_xprt_ctxt = NULL;
|
||||
rqstp->rq_prot = IPPROTO_TCP;
|
||||
rqstp->rq_local = !!test_bit(XPT_LOCAL, &svsk->sk_xprt.xpt_flags);
|
||||
|
||||
p = (__be32 *)rqstp->rq_arg.head[0].iov_base;
|
||||
calldir = p[1];
|
||||
|
Loading…
Reference in New Issue
Block a user