net: Introduce possible_net_t
authorEric W. Biederman <ebiederm@xmission.com>
Thu, 12 Mar 2015 04:06:44 +0000 (23:06 -0500)
committerDavid S. Miller <davem@davemloft.net>
Thu, 12 Mar 2015 18:39:40 +0000 (14:39 -0400)
Having to say
> #ifdef CONFIG_NET_NS
>  struct net *net;
> #endif

in structures is a little bit wordy and a little bit error prone.

Instead it is possible to say:
> typedef struct {
> #ifdef CONFIG_NET_NS
>       struct net *net;
> #endif
> } possible_net_t;

And then in a header say:

>  possible_net_t net;

Which is cleaner and easier to use and easier to test, as the
possible_net_t is always there no matter what the compile options.

Further this allows read_pnet and write_pnet to be functions in all
cases which is better at catching typos.

This change adds possible_net_t, updates the definitions of read_pnet
and write_pnet, updates optional struct net * variables that
write_pnet uses on to have the type possible_net_t, and finally fixes
up the b0rked users of read_pnet and write_pnet.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
16 files changed:
include/linux/netdevice.h
include/net/cfg80211.h
include/net/genetlink.h
include/net/inet_hashtables.h
include/net/ip_vs.h
include/net/neighbour.h
include/net/net_namespace.h
include/net/netfilter/nf_conntrack.h
include/net/sock.h
include/net/xfrm.h
net/9p/trans_fd.c
net/ipv4/ipmr.c
net/ipv6/addrlabel.c
net/ipv6/ip6mr.c
net/openvswitch/datapath.h
net/packet/internal.h

index cede40d9cac97c295bbf2198f36b20499421cc2b..ddab1a2a07a0bc11f840f81bd36ad38adcdd0012 100644 (file)
@@ -1721,9 +1721,7 @@ struct net_device {
        struct netpoll_info __rcu       *npinfo;
 #endif
 
-#ifdef CONFIG_NET_NS
-       struct net              *nd_net;
-#endif
+       possible_net_t                  nd_net;
 
        /* mid-layer private */
        union {
@@ -1863,9 +1861,7 @@ struct net *dev_net(const struct net_device *dev)
 static inline
 void dev_net_set(struct net_device *dev, struct net *net)
 {
-#ifdef CONFIG_NET_NS
-       dev->nd_net = net;
-#endif
+       write_pnet(&dev->nd_net, net);
 }
 
 static inline bool netdev_uses_dsa(struct net_device *dev)
index 64e09e1e809960be7daaef505e2e39dbab01c238..f977abec07f6bfca42432633d2728a3c34468dc8 100644 (file)
@@ -3183,10 +3183,8 @@ struct wiphy {
        const struct ieee80211_ht_cap *ht_capa_mod_mask;
        const struct ieee80211_vht_cap *vht_capa_mod_mask;
 
-#ifdef CONFIG_NET_NS
        /* the network namespace this phy lives in currently */
-       struct net *_net;
-#endif
+       possible_net_t _net;
 
 #ifdef CONFIG_CFG80211_WEXT
        const struct iw_handler_def *wext;
index 0574abd3db86bc0a796819a387dfc751adfcb04d..a9af1cc8c1bc6089d0facdf56001274cf7993a5a 100644 (file)
@@ -92,9 +92,7 @@ struct genl_info {
        struct genlmsghdr *     genlhdr;
        void *                  userhdr;
        struct nlattr **        attrs;
-#ifdef CONFIG_NET_NS
-       struct net *            _net;
-#endif
+       possible_net_t          _net;
        void *                  user_ptr[2];
        struct sock *           dst_sk;
 };
index dd1950a7e2730e0024f1c82fac8ab20f9b533fe5..bcd64756e5fe7f8a05bbdb8c3de0d5a554ecb9d8 100644 (file)
@@ -76,9 +76,7 @@ struct inet_ehash_bucket {
  * ports are created in O(1) time?  I thought so. ;-)  -DaveM
  */
 struct inet_bind_bucket {
-#ifdef CONFIG_NET_NS
-       struct net              *ib_net;
-#endif
+       possible_net_t          ib_net;
        unsigned short          port;
        signed char             fastreuse;
        signed char             fastreuseport;
index 20fd23398537c393968d57e94b0027f1e6bca03b..4e3731ee4eac802e24e5d7259d0e4db36566d2f6 100644 (file)
@@ -47,13 +47,13 @@ static inline struct net *skb_net(const struct sk_buff *skb)
         * Start with the most likely hit
         * End with BUG
         */
-       if (likely(skb->dev && skb->dev->nd_net))
+       if (likely(skb->dev && dev_net(skb->dev)))
                return dev_net(skb->dev);
        if (skb_dst(skb) && skb_dst(skb)->dev)
                return dev_net(skb_dst(skb)->dev);
        WARN(skb->sk, "Maybe skb_sknet should be used in %s() at line:%d\n",
                      __func__, __LINE__);
-       if (likely(skb->sk && skb->sk->sk_net))
+       if (likely(skb->sk && sock_net(skb->sk)))
                return sock_net(skb->sk);
        pr_err("There is no net ptr to find in the skb in %s() line:%d\n",
                __func__, __LINE__);
@@ -71,11 +71,11 @@ static inline struct net *skb_sknet(const struct sk_buff *skb)
 #ifdef CONFIG_NET_NS
 #ifdef CONFIG_IP_VS_DEBUG
        /* Start with the most likely hit */
-       if (likely(skb->sk && skb->sk->sk_net))
+       if (likely(skb->sk && sock_net(skb->sk)))
                return sock_net(skb->sk);
        WARN(skb->dev, "Maybe skb_net should be used instead in %s() line:%d\n",
                       __func__, __LINE__);
-       if (likely(skb->dev && skb->dev->nd_net))
+       if (likely(skb->dev && dev_net(skb->dev)))
                return dev_net(skb->dev);
        pr_err("There is no net ptr to find in the skb in %s() line:%d\n",
                __func__, __LINE__);
index d48b8ec8b5f4aaa797b5ff1ff0aac5291cb032a4..e7bdf517080231469d1f86f2e737fe32a32c636c 100644 (file)
@@ -65,9 +65,7 @@ enum {
 };
 
 struct neigh_parms {
-#ifdef CONFIG_NET_NS
-       struct net *net;
-#endif
+       possible_net_t net;
        struct net_device *dev;
        struct list_head list;
        int     (*neigh_setup)(struct neighbour *);
@@ -167,9 +165,7 @@ struct neigh_ops {
 
 struct pneigh_entry {
        struct pneigh_entry     *next;
-#ifdef CONFIG_NET_NS
-       struct net              *net;
-#endif
+       possible_net_t          net;
        struct net_device       *dev;
        u8                      flags;
        u8                      key[0];
index fab51ceeabf3c3132ce7808a8a845585a2d9515f..f733656404de0ea5cba33c83a641e37dc4e4d5e5 100644 (file)
@@ -231,24 +231,27 @@ int net_eq(const struct net *net1, const struct net *net2)
 #endif
 
 
+typedef struct {
 #ifdef CONFIG_NET_NS
+       struct net *net;
+#endif
+} possible_net_t;
 
-static inline void write_pnet(struct net **pnet, struct net *net)
+static inline void write_pnet(possible_net_t *pnet, struct net *net)
 {
-       *pnet = net;
+#ifdef CONFIG_NET_NS
+       pnet->net = net;
+#endif
 }
 
-static inline struct net *read_pnet(struct net * const *pnet)
+static inline struct net *read_pnet(const possible_net_t *pnet)
 {
-       return *pnet;
-}
-
+#ifdef CONFIG_NET_NS
+       return pnet->net;
 #else
-
-#define write_pnet(pnet, net)  do { (void)(net);} while (0)
-#define read_pnet(pnet)                (&init_net)
-
+       return &init_net;
 #endif
+}
 
 #define for_each_net(VAR)                              \
        list_for_each_entry(VAR, &net_namespace_list, list)
index 74f271a172dd181ad0dd521395e5480f29250cff..095433b8a8b03dec4b99057dd7165c9dc6d7846f 100644 (file)
@@ -95,9 +95,8 @@ struct nf_conn {
        /* Timer function; drops refcnt when it goes off. */
        struct timer_list timeout;
 
-#ifdef CONFIG_NET_NS
-       struct net *ct_net;
-#endif
+       possible_net_t ct_net;
+
        /* all members below initialized via memset */
        u8 __nfct_init_offset[0];
 
index 95b2c1c220f990b6ee116feb40a585344788a418..9411c3421dd3ec4c02c51275a223b41972eb7df1 100644 (file)
@@ -190,9 +190,7 @@ struct sock_common {
                struct hlist_nulls_node skc_portaddr_node;
        };
        struct proto            *skc_prot;
-#ifdef CONFIG_NET_NS
-       struct net              *skc_net;
-#endif
+       possible_net_t          skc_net;
 
 #if IS_ENABLED(CONFIG_IPV6)
        struct in6_addr         skc_v6_daddr;
index dc4865e90fe489c4859659b3a937e7c1f8a7a4bb..d0ac7d7be8a71cdc13c444677b5bef4f3aa82fc9 100644 (file)
@@ -126,9 +126,7 @@ struct xfrm_state_walk {
 
 /* Full description of state of transformer. */
 struct xfrm_state {
-#ifdef CONFIG_NET_NS
-       struct net              *xs_net;
-#endif
+       possible_net_t          xs_net;
        union {
                struct hlist_node       gclist;
                struct hlist_node       bydst;
@@ -522,9 +520,7 @@ struct xfrm_policy_queue {
 };
 
 struct xfrm_policy {
-#ifdef CONFIG_NET_NS
-       struct net              *xp_net;
-#endif
+       possible_net_t          xp_net;
        struct hlist_node       bydst;
        struct hlist_node       byidx;
 
index 80d08f6664cbb5611eef291b959facd5332a61ef..3e3d82d8ff70506c2878d4b55bf44269ed26b5cb 100644 (file)
@@ -940,7 +940,7 @@ p9_fd_create_tcp(struct p9_client *client, const char *addr, char *args)
        sin_server.sin_family = AF_INET;
        sin_server.sin_addr.s_addr = in_aton(addr);
        sin_server.sin_port = htons(opts.port);
-       err = __sock_create(read_pnet(&current->nsproxy->net_ns), PF_INET,
+       err = __sock_create(current->nsproxy->net_ns, PF_INET,
                            SOCK_STREAM, IPPROTO_TCP, &csocket, 1);
        if (err) {
                pr_err("%s (%d): problem creating socket\n",
@@ -988,7 +988,7 @@ p9_fd_create_unix(struct p9_client *client, const char *addr, char *args)
 
        sun_server.sun_family = PF_UNIX;
        strcpy(sun_server.sun_path, addr);
-       err = __sock_create(read_pnet(&current->nsproxy->net_ns), PF_UNIX,
+       err = __sock_create(current->nsproxy->net_ns, PF_UNIX,
                            SOCK_STREAM, 0, &csocket, 1);
        if (err < 0) {
                pr_err("%s (%d): problem creating socket\n",
index 9d78427652d23e33a46ab7ce2d4b6dbac1660781..5b188832800f1a63243729bf581642c7241a3a2a 100644 (file)
@@ -73,9 +73,7 @@
 
 struct mr_table {
        struct list_head        list;
-#ifdef CONFIG_NET_NS
-       struct net              *net;
-#endif
+       possible_net_t          net;
        u32                     id;
        struct sock __rcu       *mroute_sk;
        struct timer_list       ipmr_expire_timer;
index 59c793040498fd16d432e69e3fdf8d3170f290f9..3cc50e2d3bf543a3af03a574c83a42d3e96ba99f 100644 (file)
@@ -29,9 +29,7 @@
  * Policy Table
  */
 struct ip6addrlbl_entry {
-#ifdef CONFIG_NET_NS
-       struct net *lbl_net;
-#endif
+       possible_net_t lbl_net;
        struct in6_addr prefix;
        int prefixlen;
        int ifindex;
@@ -237,9 +235,7 @@ static struct ip6addrlbl_entry *ip6addrlbl_alloc(struct net *net,
        newp->addrtype = addrtype;
        newp->label = label;
        INIT_HLIST_NODE(&newp->list);
-#ifdef CONFIG_NET_NS
-       newp->lbl_net = net;
-#endif
+       write_pnet(&newp->lbl_net, net);
        atomic_set(&newp->refcnt, 1);
        return newp;
 }
index 34b682617f504359cecff4447c6015f90623e949..4b9315aa273e323c24e673467db1b6f5c293bcf9 100644 (file)
@@ -56,9 +56,7 @@
 
 struct mr6_table {
        struct list_head        list;
-#ifdef CONFIG_NET_NS
-       struct net              *net;
-#endif
+       possible_net_t          net;
        u32                     id;
        struct sock             *mroute6_sk;
        struct timer_list       ipmr_expire_timer;
index 3ece94563079fb154d437d75e90db23b055d6a0a..4ec4a480b147030c3e2938c4ba612d4e7d5e10be 100644 (file)
@@ -84,10 +84,8 @@ struct datapath {
        /* Stats. */
        struct dp_stats_percpu __percpu *stats_percpu;
 
-#ifdef CONFIG_NET_NS
        /* Network namespace ref. */
-       struct net *net;
-#endif
+       possible_net_t net;
 
        u32 user_features;
 };
index cdddf6a303996b1a512a7a3896362acc31635f0e..fe6e20caea1d9bcd3711b3ad29a8de2ae40cd1bc 100644 (file)
@@ -74,9 +74,7 @@ extern struct mutex fanout_mutex;
 #define PACKET_FANOUT_MAX      256
 
 struct packet_fanout {
-#ifdef CONFIG_NET_NS
-       struct net              *net;
-#endif
+       possible_net_t          net;
        unsigned int            num_members;
        u16                     id;
        u8                      type;