Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * RPC client multipathing definitions
0004  *
0005  * Copyright (c) 2015, 2016, Primary Data, Inc. All rights reserved.
0006  *
0007  * Trond Myklebust <trond.myklebust@primarydata.com>
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