Add an exported function for transport modules to [un]register themselves
with the sunrpc server side transport switch.

Signed-off-by: Tom Tucker <[EMAIL PROTECTED]>
---

 include/linux/sunrpc/svcsock.h |    6 +++++
 net/sunrpc/svcsock.c           |   50 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 0 deletions(-)

diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h
index 7def951..cc911ab 100644
--- a/include/linux/sunrpc/svcsock.h
+++ b/include/linux/sunrpc/svcsock.h
@@ -13,6 +13,7 @@ #include <linux/sunrpc/svc.h>
 
 struct svc_xprt {
        const char              *xpt_name;
+       struct module           *xpt_owner;
        int                     (*xpt_recvfrom)(struct svc_rqst *rqstp);
        int                     (*xpt_sendto)(struct svc_rqst *rqstp);
        /*
@@ -45,7 +46,10 @@ struct svc_xprt {
         * Accept a pending connection, for connection-oriented transports
         */
        int                     (*xpt_accept)(struct svc_sock *svsk);
+       /* Transport list link */
+       struct list_head        xpt_list;
 };
+extern struct list_head svc_transport_list;
 
 /*
  * RPC server socket.
@@ -102,6 +106,8 @@ #define     SK_LISTENER     11                      /* 
listener (e.
 /*
  * Function prototypes.
  */
+int            svc_register_transport(struct svc_xprt *xprt);
+int            svc_unregister_transport(struct svc_xprt *xprt);
 int            svc_makesock(struct svc_serv *, int, unsigned short, int flags);
 void           svc_force_close_socket(struct svc_sock *);
 int            svc_recv(struct svc_rqst *, long);
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index 6acf22f..6183951 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -91,6 +91,54 @@ static struct svc_deferred_req *svc_defe
 static int svc_deferred_recv(struct svc_rqst *rqstp);
 static struct cache_deferred_req *svc_defer(struct cache_req *req);
 
+/* List of registered transports */
+static spinlock_t svc_transport_lock = SPIN_LOCK_UNLOCKED;
+LIST_HEAD(svc_transport_list);
+
+int svc_register_transport(struct svc_xprt *xprt)
+{
+       struct svc_xprt *ops;
+       int res;
+
+       dprintk("svc: Adding svc transport '%s'\n",
+               xprt->xpt_name);
+
+       res = -EEXIST;
+       INIT_LIST_HEAD(&xprt->xpt_list);
+       spin_lock(&svc_transport_lock);
+       list_for_each_entry(ops, &svc_transport_list, xpt_list) {
+               if (xprt == ops)
+                       goto out;
+       }
+       list_add_tail(&xprt->xpt_list, &svc_transport_list);
+       res = 0;
+out:
+       spin_unlock(&svc_transport_lock);
+       return res;
+}
+EXPORT_SYMBOL_GPL(svc_register_transport);
+
+int svc_unregister_transport(struct svc_xprt *xprt)
+{
+       struct svc_xprt *ops;
+       int res = 0;
+
+       dprintk("svc: Removing svc transport '%s'\n", xprt->xpt_name);
+
+       spin_lock(&svc_transport_lock);
+       list_for_each_entry(ops, &svc_transport_list, xpt_list) {
+               if (xprt == ops) {
+                       list_del_init(&ops->xpt_list);
+                       goto out;
+               }
+       }
+       res = -ENOENT;
+ out:
+       spin_unlock(&svc_transport_lock);
+       return res;
+}
+EXPORT_SYMBOL_GPL(svc_unregister_transport);
+
 /* apparently the "standard" is that clients close
  * idle connections after 5 minutes, servers after
  * 6 minutes
@@ -887,6 +935,7 @@ svc_udp_has_wspace(struct svc_sock *svsk
 
 static const struct svc_xprt svc_udp_xprt = {
        .xpt_name = "udp",
+       .xpt_owner = THIS_MODULE,
        .xpt_recvfrom = svc_udp_recvfrom,
        .xpt_sendto = svc_udp_sendto,
        .xpt_detach = svc_sock_detach,
@@ -1346,6 +1395,7 @@ svc_tcp_has_wspace(struct svc_sock *svsk
 
 static const struct svc_xprt svc_tcp_xprt = {
        .xpt_name = "tcp",
+       .xpt_owner = THIS_MODULE,
        .xpt_recvfrom = svc_tcp_recvfrom,
        .xpt_sendto = svc_tcp_sendto,
        .xpt_detach = svc_sock_detach,
_______________________________________________
general mailing list
general@lists.openfabrics.org
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to