Re: [NFS] [PATCH 002 of 13] knfsd: SUNRPC: allow creating an RPC service without registering with portmapper

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Oops.  This one looks old.  Let me see if I can dig up the latest.

On 12/8/06, Trond Myklebust <[email protected]> wrote:
On Fri, 2006-12-08 at 23:01 +1100, NeilBrown wrote:
> From: Chuck Lever <[email protected]>
> 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.

NAK. This one is still buggy.

The NFSv4 callback server should _NOT_ be registering its listening
socket on the RPC server 'temporary' list.

Trond


> Signed-off-by: Chuck Lever <[email protected]>
> Cc: Aurelien Charbon <[email protected]>
> Signed-off-by: Neil Brown <[email protected]>
>
> ### Diffstat output
>  ./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 .prev/fs/lockd/svc.c ./fs/lockd/svc.c
> --- .prev/fs/lockd/svc.c      2006-12-08 13:36:33.000000000 +1100
> +++ ./fs/lockd/svc.c  2006-12-08 13:36:33.000000000 +1100
> @@ -223,23 +223,29 @@ static int find_socket(struct svc_serv *
>       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 .prev/fs/nfs/callback.c ./fs/nfs/callback.c
> --- .prev/fs/nfs/callback.c   2006-12-08 13:36:33.000000000 +1100
> +++ ./fs/nfs/callback.c       2006-12-08 13:36:33.000000000 +1100
> @@ -106,7 +106,6 @@ static void nfs_callback_svc(struct svc_
>  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 | SVC_SOCK_TEMPORARY));
> +     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 .prev/fs/nfsd/nfssvc.c ./fs/nfsd/nfssvc.c
> --- .prev/fs/nfsd/nfssvc.c    2006-12-08 13:36:33.000000000 +1100
> +++ ./fs/nfsd/nfssvc.c        2006-12-08 13:36:33.000000000 +1100
> @@ -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 .prev/include/linux/sunrpc/svcsock.h ./include/linux/sunrpc/svcsock.h
> --- .prev/include/linux/sunrpc/svcsock.h      2006-12-08 13:35:43.000000000 +1100
> +++ ./include/linux/sunrpc/svcsock.h  2006-12-08 13:36:33.000000000 +1100
> @@ -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_delete_socket(struct svc_sock *);
>  int          svc_recv(struct svc_rqst *, long);
>  int          svc_send(struct svc_rqst *);
>
> diff .prev/net/sunrpc/svcsock.c ./net/sunrpc/svcsock.c
> --- .prev/net/sunrpc/svcsock.c        2006-12-08 13:35:43.000000000 +1100
> +++ ./net/sunrpc/svcsock.c    2006-12-08 13:36:33.000000000 +1100
> @@ -1659,9 +1659,11 @@ svc_delete_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,
> @@ -1670,7 +1672,7 @@ int svc_makesock(struct svc_serv *serv,
>       };
>
>       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);
>  }
>
>  /*
>
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys - and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> NFS maillist  -  [email protected]
> https://lists.sourceforge.net/lists/listinfo/nfs


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
NFS maillist  -  [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs



--
"We who cut mere stones must always be envisioning cathedrals"
  -- Quarry worker's creed
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux