1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * RPC client multipathing definitions 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2015, 2016, Primary Data, Inc. All rights reserved. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Trond Myklebust <trond.myklebust@primarydata.com> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun #ifndef _NET_SUNRPC_XPRTMULTIPATH_H 10*4882a593Smuzhiyun #define _NET_SUNRPC_XPRTMULTIPATH_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun struct rpc_xprt_iter_ops; 13*4882a593Smuzhiyun struct rpc_xprt_switch { 14*4882a593Smuzhiyun spinlock_t xps_lock; 15*4882a593Smuzhiyun struct kref xps_kref; 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun unsigned int xps_nxprts; 18*4882a593Smuzhiyun unsigned int xps_nactive; 19*4882a593Smuzhiyun atomic_long_t xps_queuelen; 20*4882a593Smuzhiyun struct list_head xps_xprt_list; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun struct net * xps_net; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun const struct rpc_xprt_iter_ops *xps_iter_ops; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct rcu_head xps_rcu; 27*4882a593Smuzhiyun }; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun struct rpc_xprt_iter { 30*4882a593Smuzhiyun struct rpc_xprt_switch __rcu *xpi_xpswitch; 31*4882a593Smuzhiyun struct rpc_xprt * xpi_cursor; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun const struct rpc_xprt_iter_ops *xpi_ops; 34*4882a593Smuzhiyun }; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun struct rpc_xprt_iter_ops { 38*4882a593Smuzhiyun void (*xpi_rewind)(struct rpc_xprt_iter *); 39*4882a593Smuzhiyun struct rpc_xprt *(*xpi_xprt)(struct rpc_xprt_iter *); 40*4882a593Smuzhiyun struct rpc_xprt *(*xpi_next)(struct rpc_xprt_iter *); 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun extern struct rpc_xprt_switch *xprt_switch_alloc(struct rpc_xprt *xprt, 44*4882a593Smuzhiyun gfp_t gfp_flags); 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun extern struct rpc_xprt_switch *xprt_switch_get(struct rpc_xprt_switch *xps); 47*4882a593Smuzhiyun extern void xprt_switch_put(struct rpc_xprt_switch *xps); 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun extern void rpc_xprt_switch_set_roundrobin(struct rpc_xprt_switch *xps); 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun extern void rpc_xprt_switch_add_xprt(struct rpc_xprt_switch *xps, 52*4882a593Smuzhiyun struct rpc_xprt *xprt); 53*4882a593Smuzhiyun extern void rpc_xprt_switch_remove_xprt(struct rpc_xprt_switch *xps, 54*4882a593Smuzhiyun struct rpc_xprt *xprt); 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun extern void xprt_iter_init(struct rpc_xprt_iter *xpi, 57*4882a593Smuzhiyun struct rpc_xprt_switch *xps); 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun extern void xprt_iter_init_listall(struct rpc_xprt_iter *xpi, 60*4882a593Smuzhiyun struct rpc_xprt_switch *xps); 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun extern void xprt_iter_destroy(struct rpc_xprt_iter *xpi); 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun extern struct rpc_xprt_switch *xprt_iter_xchg_switch( 65*4882a593Smuzhiyun struct rpc_xprt_iter *xpi, 66*4882a593Smuzhiyun struct rpc_xprt_switch *newswitch); 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun extern struct rpc_xprt *xprt_iter_xprt(struct rpc_xprt_iter *xpi); 69*4882a593Smuzhiyun extern struct rpc_xprt *xprt_iter_get_xprt(struct rpc_xprt_iter *xpi); 70*4882a593Smuzhiyun extern struct rpc_xprt *xprt_iter_get_next(struct rpc_xprt_iter *xpi); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun extern bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps, 73*4882a593Smuzhiyun const struct sockaddr *sap); 74*4882a593Smuzhiyun #endif 75