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 */
 
 #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 */
 
                (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);
 
        }
        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++;
 
 
        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];