Allow upper layers to determine if a particular rpc_clnt is prepared to provide a backchannel RPC service. Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> --- include/linux/sunrpc/clnt.h | 1 + include/linux/sunrpc/xprt.h | 1 + net/sunrpc/clnt.c | 24 ++++++++++++++++++++++++ net/sunrpc/xprtsock.c | 3 +++ 4 files changed, 29 insertions(+) diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index 70736b9..644c751 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h @@ -171,6 +171,7 @@ int rpc_protocol(struct rpc_clnt *); struct net * rpc_net_ns(struct rpc_clnt *); size_t rpc_max_payload(struct rpc_clnt *); unsigned long rpc_get_timeout(struct rpc_clnt *clnt); +bool rpc_xprt_is_bidirectional(struct rpc_clnt *); void rpc_force_rebind(struct rpc_clnt *); size_t rpc_peeraddr(struct rpc_clnt *, struct sockaddr *, size_t); const char *rpc_peeraddr2str(struct rpc_clnt *, enum rpc_display_format_t); diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index 632685c..4dea441 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h @@ -218,6 +218,7 @@ struct rpc_xprt { * items */ struct list_head bc_pa_list; /* List of preallocated * backchannel rpc_rqst's */ + bool bc_supported; #endif /* CONFIG_SUNRPC_BACKCHANNEL */ struct list_head recv; diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 5e817d6..1793341 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -1347,6 +1347,30 @@ unsigned long rpc_get_timeout(struct rpc_clnt *clnt) EXPORT_SYMBOL_GPL(rpc_get_timeout); /** + * rpc_xprt_is_bidirectional + * @clnt: RPC clnt to query + * + * Returns true if underlying transport supports backchannel service. + */ +#ifdef CONFIG_SUNRPC_BACKCHANNEL +bool rpc_xprt_is_bidirectional(struct rpc_clnt *clnt) +{ + bool ret; + + rcu_read_lock(); + ret = rcu_dereference(clnt->cl_xprt)->bc_supported; + rcu_read_unlock(); + return ret; +} +#else +bool rpc_xprt_is_bidirectional(struct rpc_clnt *clnt) +{ + return false; +} +#endif +EXPORT_SYMBOL_GPL(rpc_xprt_is_bidirectional); + +/** * rpc_force_rebind - force transport to check that remote port is unchanged * @clnt: client to rebind * diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index b4aca48..e2e15a9 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -2864,6 +2864,9 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args) xprt->ops = &xs_tcp_ops; xprt->timeout = &xs_tcp_default_timeout; +#ifdef CONFIG_SUNRPC_BACKCHANNEL + xprt->bc_supported = true; +#endif switch (addr->sa_family) { case AF_INET: -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html