0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _NET_SUNRPC_XPRTMULTIPATH_H
0010 #define _NET_SUNRPC_XPRTMULTIPATH_H
0011
0012 struct rpc_xprt_iter_ops;
0013 struct rpc_sysfs_xprt_switch;
0014 struct rpc_xprt_switch {
0015 spinlock_t xps_lock;
0016 struct kref xps_kref;
0017
0018 unsigned int xps_id;
0019 unsigned int xps_nxprts;
0020 unsigned int xps_nactive;
0021 unsigned int xps_nunique_destaddr_xprts;
0022 atomic_long_t xps_queuelen;
0023 struct list_head xps_xprt_list;
0024
0025 struct net * xps_net;
0026
0027 const struct rpc_xprt_iter_ops *xps_iter_ops;
0028
0029 struct rpc_sysfs_xprt_switch *xps_sysfs;
0030 struct rcu_head xps_rcu;
0031 };
0032
0033 struct rpc_xprt_iter {
0034 struct rpc_xprt_switch __rcu *xpi_xpswitch;
0035 struct rpc_xprt * xpi_cursor;
0036
0037 const struct rpc_xprt_iter_ops *xpi_ops;
0038 };
0039
0040
0041 struct rpc_xprt_iter_ops {
0042 void (*xpi_rewind)(struct rpc_xprt_iter *);
0043 struct rpc_xprt *(*xpi_xprt)(struct rpc_xprt_iter *);
0044 struct rpc_xprt *(*xpi_next)(struct rpc_xprt_iter *);
0045 };
0046
0047 extern struct rpc_xprt_switch *xprt_switch_alloc(struct rpc_xprt *xprt,
0048 gfp_t gfp_flags);
0049
0050 extern struct rpc_xprt_switch *xprt_switch_get(struct rpc_xprt_switch *xps);
0051 extern void xprt_switch_put(struct rpc_xprt_switch *xps);
0052
0053 extern void rpc_xprt_switch_set_roundrobin(struct rpc_xprt_switch *xps);
0054
0055 extern void rpc_xprt_switch_add_xprt(struct rpc_xprt_switch *xps,
0056 struct rpc_xprt *xprt);
0057 extern void rpc_xprt_switch_remove_xprt(struct rpc_xprt_switch *xps,
0058 struct rpc_xprt *xprt, bool offline);
0059
0060 extern void xprt_iter_init(struct rpc_xprt_iter *xpi,
0061 struct rpc_xprt_switch *xps);
0062
0063 extern void xprt_iter_init_listall(struct rpc_xprt_iter *xpi,
0064 struct rpc_xprt_switch *xps);
0065
0066 extern void xprt_iter_init_listoffline(struct rpc_xprt_iter *xpi,
0067 struct rpc_xprt_switch *xps);
0068
0069 extern void xprt_iter_destroy(struct rpc_xprt_iter *xpi);
0070
0071 extern void xprt_iter_rewind(struct rpc_xprt_iter *xpi);
0072
0073 extern struct rpc_xprt_switch *xprt_iter_xchg_switch(
0074 struct rpc_xprt_iter *xpi,
0075 struct rpc_xprt_switch *newswitch);
0076
0077 extern struct rpc_xprt *xprt_iter_xprt(struct rpc_xprt_iter *xpi);
0078 extern struct rpc_xprt *xprt_iter_get_xprt(struct rpc_xprt_iter *xpi);
0079 extern struct rpc_xprt *xprt_iter_get_next(struct rpc_xprt_iter *xpi);
0080
0081 extern bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
0082 const struct sockaddr *sap);
0083
0084 extern void xprt_multipath_cleanup_ids(void);
0085
0086 #endif