Return-Path: linux-nfs-owner@vger.kernel.org Received: from mx12.netapp.com ([216.240.18.77]:3514 "EHLO mx12.netapp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754076Ab3BDQPp convert rfc822-to-8bit (ORCPT ); Mon, 4 Feb 2013 11:15:45 -0500 From: "Myklebust, Trond" To: "J. Bruce Fields" CC: Jeff Layton , "chuck.lever@oracle.com" , "linux-nfs@vger.kernel.org" Subject: Re: [PATCH] sunrpc: move address copy/cmp/convert routines and prototypes from clnt.h to addr.h Date: Mon, 4 Feb 2013 16:15:43 +0000 Message-ID: <4FA345DA4F4AE44899BD2B03EEEC2FA91835C73B@SACEXCMBX04-PRD.hq.netapp.com> References: <1359991431-25579-1-git-send-email-jlayton@redhat.com> <20130204160955.GD815@fieldses.org> In-Reply-To: <20130204160955.GD815@fieldses.org> Content-Type: text/plain; charset=US-ASCII MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org List-ID: On Mon, 2013-02-04 at 11:09 -0500, J. Bruce Fields wrote: > On Mon, Feb 04, 2013 at 10:23:51AM -0500, Jeff Layton wrote: > > These routines are used by server and client code, so having them in a > > separate header would be best. > > I'll apply this and the scope id patch if it gets Trond's ACK. > > (Or they have my ACK if Trond wants to take them.) Feel free to take them through the nfsd tree. Acked-by: Trond Myklebust > --b. > > > > > Signed-off-by: Jeff Layton > > --- > > fs/lockd/clntlock.c | 2 +- > > fs/lockd/host.c | 1 + > > fs/lockd/mon.c | 1 + > > fs/lockd/svcsubs.c | 2 +- > > fs/nfs/dns_resolve.c | 1 + > > fs/nfs/nfs4client.c | 1 + > > fs/nfs/nfs4filelayoutdev.c | 1 + > > fs/nfs/nfs4namespace.c | 1 + > > fs/nfs/super.c | 1 + > > fs/nfsd/nfs4state.c | 2 +- > > fs/nfsd/nfscache.c | 2 +- > > fs/nfsd/nfsctl.c | 2 +- > > include/linux/sunrpc/addr.h | 170 ++++++++++++++++++++++++++++++++++++++++ > > include/linux/sunrpc/clnt.h | 155 ------------------------------------ > > net/sunrpc/addr.c | 3 +- > > net/sunrpc/clnt.c | 1 + > > net/sunrpc/rpcb_clnt.c | 1 + > > net/sunrpc/svcauth_unix.c | 2 +- > > net/sunrpc/xprtrdma/transport.c | 1 + > > net/sunrpc/xprtsock.c | 1 + > > 20 files changed, 189 insertions(+), 162 deletions(-) > > create mode 100644 include/linux/sunrpc/addr.h > > > > diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c > > index ca0a080..4885b53 100644 > > --- a/fs/lockd/clntlock.c > > +++ b/fs/lockd/clntlock.c > > @@ -11,7 +11,7 @@ > > #include > > #include > > #include > > -#include > > +#include > > #include > > #include > > #include > > diff --git a/fs/lockd/host.c b/fs/lockd/host.c > > index 0e17090..764c4d2 100644 > > --- a/fs/lockd/host.c > > +++ b/fs/lockd/host.c > > @@ -13,6 +13,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > #include > > diff --git a/fs/lockd/mon.c b/fs/lockd/mon.c > > index 3c2cfc6..1812f02 100644 > > --- a/fs/lockd/mon.c > > +++ b/fs/lockd/mon.c > > @@ -12,6 +12,7 @@ > > #include > > > > #include > > +#include > > #include > > #include > > #include > > diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c > > index 0deb5f6..8064435 100644 > > --- a/fs/lockd/svcsubs.c > > +++ b/fs/lockd/svcsubs.c > > @@ -13,7 +13,7 @@ > > #include > > #include > > #include > > -#include > > +#include > > #include > > #include > > #include > > diff --git a/fs/nfs/dns_resolve.c b/fs/nfs/dns_resolve.c > > index 0ff1f4c..178fb24 100644 > > --- a/fs/nfs/dns_resolve.c > > +++ b/fs/nfs/dns_resolve.c > > @@ -10,6 +10,7 @@ > > > > #include > > #include > > +#include > > #include > > #include "dns_resolve.h" > > > > diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c > > index acc3472..e5f2fad 100644 > > --- a/fs/nfs/nfs4client.c > > +++ b/fs/nfs/nfs4client.c > > @@ -6,6 +6,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > #include > > diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c > > index b720064..1fe284f 100644 > > --- a/fs/nfs/nfs4filelayoutdev.c > > +++ b/fs/nfs/nfs4filelayoutdev.c > > @@ -31,6 +31,7 @@ > > #include > > #include > > #include > > +#include > > > > #include "internal.h" > > #include "nfs4session.h" > > diff --git a/fs/nfs/nfs4namespace.c b/fs/nfs/nfs4namespace.c > > index 1e09eb7..0dd7660 100644 > > --- a/fs/nfs/nfs4namespace.c > > +++ b/fs/nfs/nfs4namespace.c > > @@ -14,6 +14,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > #include "internal.h" > > diff --git a/fs/nfs/super.c b/fs/nfs/super.c > > index c25cadf8..3250b41 100644 > > --- a/fs/nfs/super.c > > +++ b/fs/nfs/super.c > > @@ -31,6 +31,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > #include > > diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c > > index 4db46aa..8c2bdfa 100644 > > --- a/fs/nfsd/nfs4state.c > > +++ b/fs/nfsd/nfs4state.c > > @@ -40,7 +40,7 @@ > > #include > > #include > > #include > > -#include > > +#include > > #include "xdr4.h" > > #include "vfs.h" > > #include "current_stateid.h" > > diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c > > index cb655f3..07b4c19 100644 > > --- a/fs/nfsd/nfscache.c > > +++ b/fs/nfsd/nfscache.c > > @@ -9,7 +9,7 @@ > > */ > > > > #include > > -#include > > +#include > > #include > > #include > > > > diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c > > index 65889ec..29c3f0d 100644 > > --- a/fs/nfsd/nfsctl.c > > +++ b/fs/nfsd/nfsctl.c > > @@ -10,7 +10,7 @@ > > > > #include > > #include > > -#include > > +#include > > #include > > #include > > #include > > diff --git a/include/linux/sunrpc/addr.h b/include/linux/sunrpc/addr.h > > new file mode 100644 > > index 0000000..07d8e53 > > --- /dev/null > > +++ b/include/linux/sunrpc/addr.h > > @@ -0,0 +1,170 @@ > > +/* > > + * linux/include/linux/sunrpc/addr.h > > + * > > + * Various routines for copying and comparing sockaddrs and for > > + * converting them to and from presentation format. > > + */ > > +#ifndef _LINUX_SUNRPC_ADDR_H > > +#define _LINUX_SUNRPC_ADDR_H > > + > > +#include > > +#include > > +#include > > +#include > > + > > +size_t rpc_ntop(const struct sockaddr *, char *, const size_t); > > +size_t rpc_pton(struct net *, const char *, const size_t, > > + struct sockaddr *, const size_t); > > +char * rpc_sockaddr2uaddr(const struct sockaddr *, gfp_t); > > +size_t rpc_uaddr2sockaddr(struct net *, const char *, const size_t, > > + struct sockaddr *, const size_t); > > + > > +static inline unsigned short rpc_get_port(const struct sockaddr *sap) > > +{ > > + switch (sap->sa_family) { > > + case AF_INET: > > + return ntohs(((struct sockaddr_in *)sap)->sin_port); > > + case AF_INET6: > > + return ntohs(((struct sockaddr_in6 *)sap)->sin6_port); > > + } > > + return 0; > > +} > > + > > +static inline void rpc_set_port(struct sockaddr *sap, > > + const unsigned short port) > > +{ > > + switch (sap->sa_family) { > > + case AF_INET: > > + ((struct sockaddr_in *)sap)->sin_port = htons(port); > > + break; > > + case AF_INET6: > > + ((struct sockaddr_in6 *)sap)->sin6_port = htons(port); > > + break; > > + } > > +} > > + > > +#define IPV6_SCOPE_DELIMITER '%' > > +#define IPV6_SCOPE_ID_LEN sizeof("%nnnnnnnnnn") > > + > > +static inline bool __rpc_cmp_addr4(const struct sockaddr *sap1, > > + const struct sockaddr *sap2) > > +{ > > + const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sap1; > > + const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sap2; > > + > > + return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr; > > +} > > + > > +static inline bool __rpc_copy_addr4(struct sockaddr *dst, > > + const struct sockaddr *src) > > +{ > > + const struct sockaddr_in *ssin = (struct sockaddr_in *) src; > > + struct sockaddr_in *dsin = (struct sockaddr_in *) dst; > > + > > + dsin->sin_family = ssin->sin_family; > > + dsin->sin_addr.s_addr = ssin->sin_addr.s_addr; > > + return true; > > +} > > + > > +#if IS_ENABLED(CONFIG_IPV6) > > +static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, > > + const struct sockaddr *sap2) > > +{ > > + const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sap1; > > + const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2; > > + > > + if (!ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr)) > > + return false; > > + else if (ipv6_addr_type(&sin1->sin6_addr) & IPV6_ADDR_LINKLOCAL) > > + return sin1->sin6_scope_id == sin2->sin6_scope_id; > > + > > + return true; > > +} > > + > > +static inline bool __rpc_copy_addr6(struct sockaddr *dst, > > + const struct sockaddr *src) > > +{ > > + const struct sockaddr_in6 *ssin6 = (const struct sockaddr_in6 *) src; > > + struct sockaddr_in6 *dsin6 = (struct sockaddr_in6 *) dst; > > + > > + dsin6->sin6_family = ssin6->sin6_family; > > + dsin6->sin6_addr = ssin6->sin6_addr; > > + dsin6->sin6_scope_id = ssin6->sin6_scope_id; > > + return true; > > +} > > +#else /* !(IS_ENABLED(CONFIG_IPV6) */ > > +static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, > > + const struct sockaddr *sap2) > > +{ > > + return false; > > +} > > + > > +static inline bool __rpc_copy_addr6(struct sockaddr *dst, > > + const struct sockaddr *src) > > +{ > > + return false; > > +} > > +#endif /* !(IS_ENABLED(CONFIG_IPV6) */ > > + > > +/** > > + * rpc_cmp_addr - compare the address portion of two sockaddrs. > > + * @sap1: first sockaddr > > + * @sap2: second sockaddr > > + * > > + * Just compares the family and address portion. Ignores port, but > > + * compares the scope if it's a link-local address. > > + * > > + * Returns true if the addrs are equal, false if they aren't. > > + */ > > +static inline bool rpc_cmp_addr(const struct sockaddr *sap1, > > + const struct sockaddr *sap2) > > +{ > > + if (sap1->sa_family == sap2->sa_family) { > > + switch (sap1->sa_family) { > > + case AF_INET: > > + return __rpc_cmp_addr4(sap1, sap2); > > + case AF_INET6: > > + return __rpc_cmp_addr6(sap1, sap2); > > + } > > + } > > + return false; > > +} > > + > > +/** > > + * rpc_copy_addr - copy the address portion of one sockaddr to another > > + * @dst: destination sockaddr > > + * @src: source sockaddr > > + * > > + * Just copies the address portion and family. Ignores port, scope, etc. > > + * Caller is responsible for making certain that dst is large enough to hold > > + * the address in src. Returns true if address family is supported. Returns > > + * false otherwise. > > + */ > > +static inline bool rpc_copy_addr(struct sockaddr *dst, > > + const struct sockaddr *src) > > +{ > > + switch (src->sa_family) { > > + case AF_INET: > > + return __rpc_copy_addr4(dst, src); > > + case AF_INET6: > > + return __rpc_copy_addr6(dst, src); > > + } > > + return false; > > +} > > + > > +/** > > + * rpc_get_scope_id - return scopeid for a given sockaddr > > + * @sa: sockaddr to get scopeid from > > + * > > + * Returns the value of the sin6_scope_id for AF_INET6 addrs, or 0 if > > + * not an AF_INET6 address. > > + */ > > +static inline u32 rpc_get_scope_id(const struct sockaddr *sa) > > +{ > > + if (sa->sa_family != AF_INET6) > > + return 0; > > + > > + return ((struct sockaddr_in6 *) sa)->sin6_scope_id; > > +} > > + > > +#endif /* _LINUX_SUNRPC_ADDR_H */ > > diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h > > index 6a7c261..4a4abde 100644 > > --- a/include/linux/sunrpc/clnt.h > > +++ b/include/linux/sunrpc/clnt.h > > @@ -165,160 +165,5 @@ size_t rpc_peeraddr(struct rpc_clnt *, struct sockaddr *, size_t); > > const char *rpc_peeraddr2str(struct rpc_clnt *, enum rpc_display_format_t); > > int rpc_localaddr(struct rpc_clnt *, struct sockaddr *, size_t); > > > > -size_t rpc_ntop(const struct sockaddr *, char *, const size_t); > > -size_t rpc_pton(struct net *, const char *, const size_t, > > - struct sockaddr *, const size_t); > > -char * rpc_sockaddr2uaddr(const struct sockaddr *, gfp_t); > > -size_t rpc_uaddr2sockaddr(struct net *, const char *, const size_t, > > - struct sockaddr *, const size_t); > > - > > -static inline unsigned short rpc_get_port(const struct sockaddr *sap) > > -{ > > - switch (sap->sa_family) { > > - case AF_INET: > > - return ntohs(((struct sockaddr_in *)sap)->sin_port); > > - case AF_INET6: > > - return ntohs(((struct sockaddr_in6 *)sap)->sin6_port); > > - } > > - return 0; > > -} > > - > > -static inline void rpc_set_port(struct sockaddr *sap, > > - const unsigned short port) > > -{ > > - switch (sap->sa_family) { > > - case AF_INET: > > - ((struct sockaddr_in *)sap)->sin_port = htons(port); > > - break; > > - case AF_INET6: > > - ((struct sockaddr_in6 *)sap)->sin6_port = htons(port); > > - break; > > - } > > -} > > - > > -#define IPV6_SCOPE_DELIMITER '%' > > -#define IPV6_SCOPE_ID_LEN sizeof("%nnnnnnnnnn") > > - > > -static inline bool __rpc_cmp_addr4(const struct sockaddr *sap1, > > - const struct sockaddr *sap2) > > -{ > > - const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sap1; > > - const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sap2; > > - > > - return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr; > > -} > > - > > -static inline bool __rpc_copy_addr4(struct sockaddr *dst, > > - const struct sockaddr *src) > > -{ > > - const struct sockaddr_in *ssin = (struct sockaddr_in *) src; > > - struct sockaddr_in *dsin = (struct sockaddr_in *) dst; > > - > > - dsin->sin_family = ssin->sin_family; > > - dsin->sin_addr.s_addr = ssin->sin_addr.s_addr; > > - return true; > > -} > > - > > -#if IS_ENABLED(CONFIG_IPV6) > > -static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, > > - const struct sockaddr *sap2) > > -{ > > - const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sap1; > > - const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2; > > - > > - if (!ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr)) > > - return false; > > - else if (ipv6_addr_type(&sin1->sin6_addr) & IPV6_ADDR_LINKLOCAL) > > - return sin1->sin6_scope_id == sin2->sin6_scope_id; > > - > > - return true; > > -} > > - > > -static inline bool __rpc_copy_addr6(struct sockaddr *dst, > > - const struct sockaddr *src) > > -{ > > - const struct sockaddr_in6 *ssin6 = (const struct sockaddr_in6 *) src; > > - struct sockaddr_in6 *dsin6 = (struct sockaddr_in6 *) dst; > > - > > - dsin6->sin6_family = ssin6->sin6_family; > > - dsin6->sin6_addr = ssin6->sin6_addr; > > - dsin6->sin6_scope_id = ssin6->sin6_scope_id; > > - return true; > > -} > > -#else /* !(IS_ENABLED(CONFIG_IPV6) */ > > -static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, > > - const struct sockaddr *sap2) > > -{ > > - return false; > > -} > > - > > -static inline bool __rpc_copy_addr6(struct sockaddr *dst, > > - const struct sockaddr *src) > > -{ > > - return false; > > -} > > -#endif /* !(IS_ENABLED(CONFIG_IPV6) */ > > - > > -/** > > - * rpc_cmp_addr - compare the address portion of two sockaddrs. > > - * @sap1: first sockaddr > > - * @sap2: second sockaddr > > - * > > - * Just compares the family and address portion. Ignores port, but > > - * compares the scope if it's a link-local address. > > - * > > - * Returns true if the addrs are equal, false if they aren't. > > - */ > > -static inline bool rpc_cmp_addr(const struct sockaddr *sap1, > > - const struct sockaddr *sap2) > > -{ > > - if (sap1->sa_family == sap2->sa_family) { > > - switch (sap1->sa_family) { > > - case AF_INET: > > - return __rpc_cmp_addr4(sap1, sap2); > > - case AF_INET6: > > - return __rpc_cmp_addr6(sap1, sap2); > > - } > > - } > > - return false; > > -} > > - > > -/** > > - * rpc_copy_addr - copy the address portion of one sockaddr to another > > - * @dst: destination sockaddr > > - * @src: source sockaddr > > - * > > - * Just copies the address portion and family. Ignores port, scope, etc. > > - * Caller is responsible for making certain that dst is large enough to hold > > - * the address in src. Returns true if address family is supported. Returns > > - * false otherwise. > > - */ > > -static inline bool rpc_copy_addr(struct sockaddr *dst, > > - const struct sockaddr *src) > > -{ > > - switch (src->sa_family) { > > - case AF_INET: > > - return __rpc_copy_addr4(dst, src); > > - case AF_INET6: > > - return __rpc_copy_addr6(dst, src); > > - } > > - return false; > > -} > > - > > -/** > > - * rpc_get_scope_id - return scopeid for a given sockaddr > > - * @sa: sockaddr to get scopeid from > > - * > > - * Returns the value of the sin6_scope_id for AF_INET6 addrs, or 0 if > > - * not an AF_INET6 address. > > - */ > > -static inline u32 rpc_get_scope_id(const struct sockaddr *sa) > > -{ > > - if (sa->sa_family != AF_INET6) > > - return 0; > > - > > - return ((struct sockaddr_in6 *) sa)->sin6_scope_id; > > -} > > - > > #endif /* __KERNEL__ */ > > #endif /* _LINUX_SUNRPC_CLNT_H */ > > diff --git a/net/sunrpc/addr.c b/net/sunrpc/addr.c > > index d11418f..a622ad6 100644 > > --- a/net/sunrpc/addr.c > > +++ b/net/sunrpc/addr.c > > @@ -17,7 +17,8 @@ > > */ > > > > #include > > -#include > > +#include > > +#include > > #include > > #include > > > > diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c > > index 822f020..c8193ce 100644 > > --- a/net/sunrpc/clnt.c > > +++ b/net/sunrpc/clnt.c > > @@ -33,6 +33,7 @@ > > #include > > > > #include > > +#include > > #include > > #include > > #include > > diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c > > index 795a0f4..3df764d 100644 > > --- a/net/sunrpc/rpcb_clnt.c > > +++ b/net/sunrpc/rpcb_clnt.c > > @@ -26,6 +26,7 @@ > > #include > > > > #include > > +#include > > #include > > #include > > > > diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c > > index 002ddd9..5085804 100644 > > --- a/net/sunrpc/svcauth_unix.c > > +++ b/net/sunrpc/svcauth_unix.c > > @@ -6,6 +6,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > #include > > @@ -17,7 +18,6 @@ > > #include > > #define RPCDBG_FACILITY RPCDBG_AUTH > > > > -#include > > > > #include "netns.h" > > > > diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c > > index c9aa7a3..66591dc 100644 > > --- a/net/sunrpc/xprtrdma/transport.c > > +++ b/net/sunrpc/xprtrdma/transport.c > > @@ -51,6 +51,7 @@ > > #include > > #include > > #include > > +#include > > > > #include "xprt_rdma.h" > > > > diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c > > index 68b0a81..bbc0915 100644 > > --- a/net/sunrpc/xprtsock.c > > +++ b/net/sunrpc/xprtsock.c > > @@ -33,6 +33,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > #include > > -- > > 1.7.11.7 > >