Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=482fb94e1b0c2efe8258334aa2a68d4f4a91de9c
Commit:     482fb94e1b0c2efe8258334aa2a68d4f4a91de9c
Parent:     6b174337e5126de834a971d3edc3681bbfa45e2c
Author:     Chuck Lever <[EMAIL PROTECTED]>
AuthorDate: Mon Feb 12 00:53:29 2007 -0800
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Mon Feb 12 09:48:35 2007 -0800

    [PATCH] knfsd: SUNRPC: allow creating an RPC service without registering 
with portmapper
    
    Sometimes we need to create an RPC service but not register it with the 
local
    portmapper.  NFSv4 delegation callback, for example.
    
    Change the svc_makesock() API to allow optionally creating temporary or
    permanent sockets, optionally registering with the local portmapper, and 
make
    it return the ephemeral port of the new socket.
    
    Signed-off-by: Chuck Lever <[EMAIL PROTECTED]>
    Cc: Aurelien Charbon <[EMAIL PROTECTED]>
    Signed-off-by: Neil Brown <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 fs/lockd/svc.c                 |   26 ++++++++++++++++----------
 fs/nfs/callback.c              |   20 +++++++++-----------
 fs/nfsd/nfssvc.c               |    6 ++++--
 include/linux/sunrpc/svcsock.h |    2 +-
 net/sunrpc/svcsock.c           |    6 ++++--
 5 files changed, 34 insertions(+), 26 deletions(-)

diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
index 8ca1808..2c3d5ac 100644
--- a/fs/lockd/svc.c
+++ b/fs/lockd/svc.c
@@ -223,23 +223,29 @@ static int find_socket(struct svc_serv *serv, int proto)
        return found;
 }
 
+/*
+ * Make any sockets that are needed but not present.
+ * If nlm_udpport or nlm_tcpport were set as module
+ * options, make those sockets unconditionally
+ */
 static int make_socks(struct svc_serv *serv, int proto)
 {
-       /* Make any sockets that are needed but not present.
-        * If nlm_udpport or nlm_tcpport were set as module
-        * options, make those sockets unconditionally
-        */
-       static int              warned;
+       static int warned;
        int err = 0;
+
        if (proto == IPPROTO_UDP || nlm_udpport)
                if (!find_socket(serv, IPPROTO_UDP))
-                       err = svc_makesock(serv, IPPROTO_UDP, nlm_udpport);
-       if (err == 0 && (proto == IPPROTO_TCP || nlm_tcpport))
+                       err = svc_makesock(serv, IPPROTO_UDP, nlm_udpport,
+                                               SVC_SOCK_DEFAULTS);
+       if (err >= 0 && (proto == IPPROTO_TCP || nlm_tcpport))
                if (!find_socket(serv, IPPROTO_TCP))
-                       err= svc_makesock(serv, IPPROTO_TCP, nlm_tcpport);
-       if (!err)
+                       err = svc_makesock(serv, IPPROTO_TCP, nlm_tcpport,
+                                               SVC_SOCK_DEFAULTS);
+
+       if (err >= 0) {
                warned = 0;
-       else if (warned++ == 0)
+               err = 0;
+       } else if (warned++ == 0)
                printk(KERN_WARNING
                       "lockd_up: makesock failed, error=%d\n", err);
        return err;
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c
index 7933e2e..a070109 100644
--- a/fs/nfs/callback.c
+++ b/fs/nfs/callback.c
@@ -106,7 +106,6 @@ static void nfs_callback_svc(struct svc_rqst *rqstp)
 int nfs_callback_up(void)
 {
        struct svc_serv *serv;
-       struct svc_sock *svsk;
        int ret = 0;
 
        lock_kernel();
@@ -119,17 +118,14 @@ int nfs_callback_up(void)
        ret = -ENOMEM;
        if (!serv)
                goto out_err;
-       /* FIXME: We don't want to register this socket with the portmapper */
-       ret = svc_makesock(serv, IPPROTO_TCP, nfs_callback_set_tcpport);
-       if (ret < 0)
+
+       ret = svc_makesock(serv, IPPROTO_TCP, nfs_callback_set_tcpport,
+                                                       SVC_SOCK_ANONYMOUS);
+       if (ret <= 0)
                goto out_destroy;
-       if (!list_empty(&serv->sv_permsocks)) {
-               svsk = list_entry(serv->sv_permsocks.next,
-                               struct svc_sock, sk_list);
-               nfs_callback_tcpport = ntohs(inet_sk(svsk->sk_sk)->sport);
-               dprintk ("Callback port = 0x%x\n", nfs_callback_tcpport);
-       } else
-               BUG();
+       nfs_callback_tcpport = ret;
+       dprintk("Callback port = 0x%x\n", nfs_callback_tcpport);
+
        ret = svc_create_thread(nfs_callback_svc, serv);
        if (ret < 0)
                goto out_destroy;
@@ -140,6 +136,8 @@ out:
        unlock_kernel();
        return ret;
 out_destroy:
+       dprintk("Couldn't create callback socket or server thread; err = %d\n",
+               ret);
        svc_destroy(serv);
 out_err:
        nfs_callback_info.users--;
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index fbf5d51..d7759ce 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -235,7 +235,8 @@ static int nfsd_init_socks(int port)
 
        error = lockd_up(IPPROTO_UDP);
        if (error >= 0) {
-               error = svc_makesock(nfsd_serv, IPPROTO_UDP, port);
+               error = svc_makesock(nfsd_serv, IPPROTO_UDP, port,
+                                       SVC_SOCK_DEFAULTS);
                if (error < 0)
                        lockd_down();
        }
@@ -245,7 +246,8 @@ static int nfsd_init_socks(int port)
 #ifdef CONFIG_NFSD_TCP
        error = lockd_up(IPPROTO_TCP);
        if (error >= 0) {
-               error = svc_makesock(nfsd_serv, IPPROTO_TCP, port);
+               error = svc_makesock(nfsd_serv, IPPROTO_TCP, port,
+                                       SVC_SOCK_DEFAULTS);
                if (error < 0)
                        lockd_down();
        }
diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h
index cef11a6..f030409 100644
--- a/include/linux/sunrpc/svcsock.h
+++ b/include/linux/sunrpc/svcsock.h
@@ -62,7 +62,7 @@ struct svc_sock {
 /*
  * Function prototypes.
  */
-int            svc_makesock(struct svc_serv *, int, unsigned short);
+int            svc_makesock(struct svc_serv *, int, unsigned short, int flags);
 void           svc_close_socket(struct svc_sock *);
 int            svc_recv(struct svc_rqst *, long);
 int            svc_send(struct svc_rqst *);
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index 27ba34a..d120fad 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -1689,9 +1689,11 @@ void svc_close_socket(struct svc_sock *svsk)
  * @serv: RPC server structure
  * @protocol: transport protocol to use
  * @port: port to use
+ * @flags: requested socket characteristics
  *
  */
-int svc_makesock(struct svc_serv *serv, int protocol, unsigned short port)
+int svc_makesock(struct svc_serv *serv, int protocol, unsigned short port,
+                       int flags)
 {
        struct sockaddr_in sin = {
                .sin_family             = AF_INET,
@@ -1700,7 +1702,7 @@ int svc_makesock(struct svc_serv *serv, int protocol, 
unsigned short port)
        };
 
        dprintk("svc: creating socket proto = %d\n", protocol);
-       return svc_create_socket(serv, protocol, &sin, SVC_SOCK_DEFAULTS);
+       return svc_create_socket(serv, protocol, &sin, flags);
 }
 
 /*
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to