Signed-off-by: David Ahern <dsah...@gmail.com>
---
 include/linux/netdevice.h |  5 +++++
 net/batman-adv/sysfs.c    | 13 +++++++++--
 net/bridge/br_if.c        | 12 ++++++----
 net/bridge/br_sysfs_br.c  | 17 +++++++++-----
 net/bridge/br_sysfs_if.c  |  8 +++++--
 net/core/dev.c            | 57 ++++++++++++++++++++++++++++++++++-------------
 net/core/net-sysfs.c      | 11 +++++----
 net/wireless/core.c       | 15 +++++++++----
 8 files changed, 100 insertions(+), 38 deletions(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 9c23bd2efb56..305d2d42b349 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -4272,6 +4272,11 @@ static inline const char *netdev_reg_state(const struct 
net_device *dev)
        return " (unknown)";
 }
 
+static inline struct kobject *netdev_kobject(struct net_device *dev)
+{
+       return &dev->dev.kobj;
+}
+
 __printf(3, 4)
 void netdev_printk(const char *level, const struct net_device *dev,
                   const char *format, ...);
diff --git a/net/batman-adv/sysfs.c b/net/batman-adv/sysfs.c
index 0ae8b30e4eaa..a8a7294fc054 100644
--- a/net/batman-adv/sysfs.c
+++ b/net/batman-adv/sysfs.c
@@ -735,11 +735,14 @@ static struct batadv_attribute *batadv_vlan_attrs[] = {
 
 int batadv_sysfs_add_meshif(struct net_device *dev)
 {
-       struct kobject *batif_kobject = &dev->dev.kobj;
+       struct kobject *batif_kobject = netdev_kobject(dev);
        struct batadv_priv *bat_priv = netdev_priv(dev);
        struct batadv_attribute **bat_attr;
        int err;
 
+       if (!batif_kobject)
+               return 0;
+
        bat_priv->mesh_obj = kobject_create_and_add(BATADV_SYSFS_IF_MESH_SUBDIR,
                                                    batif_kobject);
        if (!bat_priv->mesh_obj) {
@@ -778,6 +781,9 @@ void batadv_sysfs_del_meshif(struct net_device *dev)
        struct batadv_priv *bat_priv = netdev_priv(dev);
        struct batadv_attribute **bat_attr;
 
+       if (!bat_priv->mesh_obj)
+               return;
+
        for (bat_attr = batadv_mesh_attrs; *bat_attr; ++bat_attr)
                sysfs_remove_file(bat_priv->mesh_obj, &((*bat_attr)->attr));
 
@@ -1132,10 +1138,13 @@ static struct batadv_attribute *batadv_batman_attrs[] = 
{
 
 int batadv_sysfs_add_hardif(struct kobject **hardif_obj, struct net_device 
*dev)
 {
-       struct kobject *hardif_kobject = &dev->dev.kobj;
+       struct kobject *hardif_kobject = netdev_kobject(dev);
        struct batadv_attribute **bat_attr;
        int err;
 
+       if (!hardif_kobject)
+               return 0;
+
        *hardif_obj = kobject_create_and_add(BATADV_SYSFS_IF_BAT_SUBDIR,
                                             hardif_kobject);
 
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index 7f8d05cf9065..a5354436ada8 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -485,6 +485,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
        struct net_bridge_port *p;
        int err = 0;
        unsigned br_hr, dev_hr;
+       struct kobject *kobj;
        bool changed_addr;
 
        /* Don't allow bridging non-ethernet like devices, or DSA-enabled
@@ -521,10 +522,13 @@ int br_add_if(struct net_bridge *br, struct net_device 
*dev)
        if (err)
                goto put_back;
 
-       err = kobject_init_and_add(&p->kobj, &brport_ktype, &(dev->dev.kobj),
-                                  SYSFS_BRIDGE_PORT_ATTR);
-       if (err)
-               goto err1;
+       kobj = netdev_kobject(dev);
+       if (kobj) {
+               err = kobject_init_and_add(&p->kobj, &brport_ktype, kobj,
+                                          SYSFS_BRIDGE_PORT_ATTR);
+               if (err)
+                       goto err1;
+       }
 
        err = br_sysfs_addif(p);
        if (err)
diff --git a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c
index 0b5dd607444c..f6439664ffea 100644
--- a/net/bridge/br_sysfs_br.c
+++ b/net/bridge/br_sysfs_br.c
@@ -917,10 +917,13 @@ static struct bin_attribute bridge_forward = {
  */
 int br_sysfs_addbr(struct net_device *dev)
 {
-       struct kobject *brobj = &dev->dev.kobj;
+       struct kobject *brobj = netdev_kobject(dev);
        struct net_bridge *br = netdev_priv(dev);
        int err;
 
+       if (!brobj)
+               return 0;
+
        err = sysfs_create_group(brobj, &bridge_group);
        if (err) {
                pr_info("%s: can't create group %s/%s\n",
@@ -944,9 +947,9 @@ int br_sysfs_addbr(struct net_device *dev)
        }
        return 0;
  out3:
-       sysfs_remove_bin_file(&dev->dev.kobj, &bridge_forward);
+       sysfs_remove_bin_file(brobj, &bridge_forward);
  out2:
-       sysfs_remove_group(&dev->dev.kobj, &bridge_group);
+       sysfs_remove_group(brobj, &bridge_group);
  out1:
        return err;
 
@@ -954,10 +957,12 @@ int br_sysfs_addbr(struct net_device *dev)
 
 void br_sysfs_delbr(struct net_device *dev)
 {
-       struct kobject *kobj = &dev->dev.kobj;
+       struct kobject *kobj = netdev_kobject(dev);
        struct net_bridge *br = netdev_priv(dev);
 
        kobject_put(br->ifobj);
-       sysfs_remove_bin_file(kobj, &bridge_forward);
-       sysfs_remove_group(kobj, &bridge_group);
+       if (kobj) {
+               sysfs_remove_bin_file(kobj, &bridge_forward);
+               sysfs_remove_group(kobj, &bridge_group);
+       }
 }
diff --git a/net/bridge/br_sysfs_if.c b/net/bridge/br_sysfs_if.c
index 5d5d413a6cf8..4256e78f6c9f 100644
--- a/net/bridge/br_sysfs_if.c
+++ b/net/bridge/br_sysfs_if.c
@@ -283,10 +283,14 @@ int br_sysfs_addif(struct net_bridge_port *p)
 {
        struct net_bridge *br = p->br;
        const struct brport_attribute **a;
+       struct kobject *br_kobj;
        int err;
 
-       err = sysfs_create_link(&p->kobj, &br->dev->dev.kobj,
-                               SYSFS_BRIDGE_PORT_LINK);
+       br_kobj = netdev_kobject(br->dev);
+       if (!br_kobj)
+               return 0;
+
+       err = sysfs_create_link(&p->kobj, br_kobj, SYSFS_BRIDGE_PORT_LINK);
        if (err)
                return err;
 
diff --git a/net/core/dev.c b/net/core/dev.c
index d07aa5ffb511..f166b3bf1895 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5910,22 +5910,33 @@ static int netdev_adjacent_sysfs_add(struct net_device 
*dev,
                              struct net_device *adj_dev,
                              struct list_head *dev_list)
 {
+       struct kobject *dev_kobj, *adj_kobj;
        char linkname[IFNAMSIZ+7];
+       int rc = 0;
 
-       sprintf(linkname, dev_list == &dev->adj_list.upper ?
-               "upper_%s" : "lower_%s", adj_dev->name);
-       return sysfs_create_link(&(dev->dev.kobj), &(adj_dev->dev.kobj),
-                                linkname);
+       dev_kobj = netdev_kobject(dev);
+       adj_kobj = netdev_kobject(adj_dev);
+
+       if (dev_kobj && adj_kobj) {
+               sprintf(linkname, dev_list == &dev->adj_list.upper ?
+                       "upper_%s" : "lower_%s", adj_dev->name);
+               rc = sysfs_create_link(dev_kobj, adj_kobj, linkname);
+       }
+       return rc;
 }
+
 static void netdev_adjacent_sysfs_del(struct net_device *dev,
                               char *name,
                               struct list_head *dev_list)
 {
+       struct kobject *kobj = netdev_kobject(dev);
        char linkname[IFNAMSIZ+7];
 
-       sprintf(linkname, dev_list == &dev->adj_list.upper ?
-               "upper_%s" : "lower_%s", name);
-       sysfs_remove_link(&(dev->dev.kobj), linkname);
+       if (kobj) {
+               sprintf(linkname, dev_list == &dev->adj_list.upper ?
+                       "upper_%s" : "lower_%s", name);
+               sysfs_remove_link(kobj, linkname);
+       }
 }
 
 static inline bool netdev_adjacent_is_neigh_list(struct net_device *dev,
@@ -5976,11 +5987,14 @@ static int __netdev_adjacent_dev_insert(struct 
net_device *dev,
 
        /* Ensure that master link is always the first item in list. */
        if (master) {
-               ret = sysfs_create_link(&(dev->dev.kobj),
-                                       &(adj_dev->dev.kobj), "master");
-               if (ret)
-                       goto remove_symlinks;
+               struct kobject *dev_kobj = netdev_kobject(dev);
+               struct kobject *adj_kobj = netdev_kobject(adj_dev);
 
+               if (dev_kobj && adj_kobj) {
+                       ret = sysfs_create_link(dev_kobj, adj_kobj, "master");
+                       if (ret)
+                               goto remove_symlinks;
+               }
                list_add_rcu(&adj->list, dev_list);
        } else {
                list_add_tail_rcu(&adj->list, dev_list);
@@ -6025,8 +6039,12 @@ static void __netdev_adjacent_dev_remove(struct 
net_device *dev,
                return;
        }
 
-       if (adj->master)
-               sysfs_remove_link(&(dev->dev.kobj), "master");
+       if (adj->master) {
+               struct kobject *kobj = netdev_kobject(dev);
+
+               if (kobj)
+                       sysfs_remove_link(kobj, "master");
+       }
 
        if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list))
                netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list);
@@ -7665,6 +7683,7 @@ void netdev_run_todo(void)
                rcu_barrier();
 
        while (!list_empty(&list)) {
+               struct kobject *kobj;
                struct net_device *dev
                        = list_first_entry(&list, struct net_device, todo_list);
                list_del(&dev->todo_list);
@@ -7702,7 +7721,9 @@ void netdev_run_todo(void)
                wake_up(&netdev_unregistering_wq);
 
                /* Free network device */
-               kobject_put(&dev->dev.kobj);
+               kobj = netdev_kobject(dev);
+               if (kobj)
+                       kobject_put(kobj);
        }
 }
 
@@ -8071,6 +8092,7 @@ EXPORT_SYMBOL(unregister_netdev);
 
 int dev_change_net_namespace(struct net_device *dev, struct net *net, const 
char *pat)
 {
+       struct kobject *kobj;
        int err;
 
        ASSERT_RTNL();
@@ -8136,7 +8158,9 @@ int dev_change_net_namespace(struct net_device *dev, 
struct net *net, const char
        dev_mc_flush(dev);
 
        /* Send a netdev-removed uevent to the old namespace */
-       kobject_uevent(&dev->dev.kobj, KOBJ_REMOVE);
+       kobj = netdev_kobject(dev);
+       if (kobj)
+               kobject_uevent(kobj, KOBJ_REMOVE);
        netdev_adjacent_del_links(dev);
 
        /* Actually switch the network namespace */
@@ -8147,7 +8171,8 @@ int dev_change_net_namespace(struct net_device *dev, 
struct net *net, const char
                dev->ifindex = dev_new_index(net);
 
        /* Send a netdev-add uevent to the new namespace */
-       kobject_uevent(&dev->dev.kobj, KOBJ_ADD);
+       if (kobj)
+               kobject_uevent(kobj, KOBJ_ADD);
        netdev_adjacent_add_links(dev);
 
        /* Fixup kobjects */
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index 65ea0ff4017c..9df53b688f5b 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -1390,10 +1390,13 @@ static int register_queue_kobjects(struct net_device 
*dev)
        int error = 0, txq = 0, rxq = 0, real_rx = 0, real_tx = 0;
 
 #ifdef CONFIG_SYSFS
-       dev->queues_kset = kset_create_and_add("queues",
-           NULL, &dev->dev.kobj);
-       if (!dev->queues_kset)
-               return -ENOMEM;
+       struct kobject *kobj = netdev_kobject(dev);
+
+       if (kobj) {
+               dev->queues_kset = kset_create_and_add("queues", NULL, kobj);
+               if (!dev->queues_kset)
+                       return -ENOMEM;
+       }
        real_rx = dev->real_num_rx_queues;
 #endif
        real_tx = dev->real_num_tx_queues;
diff --git a/net/wireless/core.c b/net/wireless/core.c
index 83ea164f16b3..a73b3efc17b2 100644
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -1122,6 +1122,7 @@ static int cfg80211_netdev_notifier_call(struct 
notifier_block *nb,
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct cfg80211_registered_device *rdev;
        struct cfg80211_sched_scan_request *pos, *tmp;
+       struct kobject *kobj;
 
        if (!wdev)
                return NOTIFY_DONE;
@@ -1160,9 +1161,12 @@ static int cfg80211_netdev_notifier_call(struct 
notifier_block *nb,
                /* can only change netns with wiphy */
                dev->features |= NETIF_F_NETNS_LOCAL;
 
-               if (sysfs_create_link(&dev->dev.kobj, &rdev->wiphy.dev.kobj,
-                                     "phy80211")) {
-                       pr_err("failed to add phy80211 symlink to netdev!\n");
+               kobj = netdev_kobject(dev);
+               if (kobj) {
+                       if (sysfs_create_link(kobj, &rdev->wiphy.dev.kobj,
+                                             "phy80211")) {
+                               pr_err("failed to add phy80211 symlink to 
netdev!\n");
+                       }
                }
                wdev->netdev = dev;
 #ifdef CONFIG_CFG80211_WEXT
@@ -1264,9 +1268,12 @@ static int cfg80211_netdev_notifier_call(struct 
notifier_block *nb,
                 * remove and clean it up.
                 */
                if (!list_empty(&wdev->list)) {
+                       struct kobject *kobj = netdev_kobject(dev);
+
                        nl80211_notify_iface(rdev, wdev,
                                             NL80211_CMD_DEL_INTERFACE);
-                       sysfs_remove_link(&dev->dev.kobj, "phy80211");
+                       if (kobj)
+                               sysfs_remove_link(kobj, "phy80211");
                        list_del_rcu(&wdev->list);
                        rdev->devlist_generation++;
                        cfg80211_mlme_purge_registrations(wdev);
-- 
2.11.0 (Apple Git-81)

Reply via email to