Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os 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>

authored by

NeilBrown and committed by
J. Bruce Fields
ef11ce24 c789102c

+20
+1
include/linux/sunrpc/svc.h
··· 254 254 u32 rq_prot; /* IP protocol */ 255 255 unsigned short 256 256 rq_secure : 1; /* secure port */ 257 + unsigned short rq_local : 1; /* local request */ 257 258 258 259 void * rq_argp; /* decoded arguments */ 259 260 void * rq_resp; /* xdr'd results */
+1
include/linux/sunrpc/svc_xprt.h
··· 64 64 #define XPT_DETACHED 10 /* detached from tempsocks list */ 65 65 #define XPT_LISTENER 11 /* listening endpoint */ 66 66 #define XPT_CACHE_AUTH 12 /* cache auth info */ 67 + #define XPT_LOCAL 13 /* connection from loopback interface */ 67 68 68 69 struct svc_serv *xpt_server; /* service for transport */ 69 70 atomic_t xpt_reserved; /* space on outq that is rsvd */
+13
net/sunrpc/sunrpc.h
··· 43 43 (task->tk_msg.rpc_proc->p_decode != NULL); 44 44 } 45 45 46 + static inline int sock_is_loopback(struct sock *sk) 47 + { 48 + struct dst_entry *dst; 49 + int loopback = 0; 50 + rcu_read_lock(); 51 + dst = rcu_dereference(sk->sk_dst_cache); 52 + if (dst && dst->dev && 53 + (dst->dev->features & NETIF_F_LOOPBACK)) 54 + loopback = 1; 55 + rcu_read_unlock(); 56 + return loopback; 57 + } 58 + 46 59 int svc_send_common(struct socket *sock, struct xdr_buf *xdr, 47 60 struct page *headpage, unsigned long headoffset, 48 61 struct page *tailpage, unsigned long tailoffset);
+5
net/sunrpc/svcsock.c
··· 874 874 } 875 875 svc_xprt_set_local(&newsvsk->sk_xprt, sin, slen); 876 876 877 + if (sock_is_loopback(newsock->sk)) 878 + set_bit(XPT_LOCAL, &newsvsk->sk_xprt.xpt_flags); 879 + else 880 + clear_bit(XPT_LOCAL, &newsvsk->sk_xprt.xpt_flags); 877 881 if (serv->sv_stats) 878 882 serv->sv_stats->nettcpconn++; 879 883 ··· 1123 1119 1124 1120 rqstp->rq_xprt_ctxt = NULL; 1125 1121 rqstp->rq_prot = IPPROTO_TCP; 1122 + rqstp->rq_local = !!test_bit(XPT_LOCAL, &svsk->sk_xprt.xpt_flags); 1126 1123 1127 1124 p = (__be32 *)rqstp->rq_arg.head[0].iov_base; 1128 1125 calldir = p[1];