diff options
author | YueHaibing <yuehaibing@huawei.com> | 2019-03-18 22:16:53 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-03-19 16:45:58 -0400 |
commit | a3e23f719f5c4a38ffb3d30c8d7632a4ed8ccd9e (patch) | |
tree | 18873532e319e52799711a7bfc4bd1e8d69787c4 | |
parent | 223a960c01227e4dbcb6f9fa06b47d73bda21274 (diff) |
net-sysfs: call dev_hold if kobject_init_and_add success
In netdev_queue_add_kobject and rx_queue_add_kobject,
if sysfs_create_group failed, kobject_put will call
netdev_queue_release to decrease dev refcont, however
dev_hold has not be called. So we will see this while
unregistering dev:
unregister_netdevice: waiting for bcsh0 to become free. Usage count = -1
Reported-by: Hulk Robot <hulkci@huawei.com>
Fixes: d0d668371679 ("net: don't decrement kobj reference count on init failure")
Signed-off-by: YueHaibing <yuehaibing@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/core/net-sysfs.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 4ff661f6f989..8f8b7b6c2945 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
@@ -928,6 +928,8 @@ static int rx_queue_add_kobject(struct net_device *dev, int index) | |||
928 | if (error) | 928 | if (error) |
929 | return error; | 929 | return error; |
930 | 930 | ||
931 | dev_hold(queue->dev); | ||
932 | |||
931 | if (dev->sysfs_rx_queue_group) { | 933 | if (dev->sysfs_rx_queue_group) { |
932 | error = sysfs_create_group(kobj, dev->sysfs_rx_queue_group); | 934 | error = sysfs_create_group(kobj, dev->sysfs_rx_queue_group); |
933 | if (error) { | 935 | if (error) { |
@@ -937,7 +939,6 @@ static int rx_queue_add_kobject(struct net_device *dev, int index) | |||
937 | } | 939 | } |
938 | 940 | ||
939 | kobject_uevent(kobj, KOBJ_ADD); | 941 | kobject_uevent(kobj, KOBJ_ADD); |
940 | dev_hold(queue->dev); | ||
941 | 942 | ||
942 | return error; | 943 | return error; |
943 | } | 944 | } |
@@ -1464,6 +1465,8 @@ static int netdev_queue_add_kobject(struct net_device *dev, int index) | |||
1464 | if (error) | 1465 | if (error) |
1465 | return error; | 1466 | return error; |
1466 | 1467 | ||
1468 | dev_hold(queue->dev); | ||
1469 | |||
1467 | #ifdef CONFIG_BQL | 1470 | #ifdef CONFIG_BQL |
1468 | error = sysfs_create_group(kobj, &dql_group); | 1471 | error = sysfs_create_group(kobj, &dql_group); |
1469 | if (error) { | 1472 | if (error) { |
@@ -1473,7 +1476,6 @@ static int netdev_queue_add_kobject(struct net_device *dev, int index) | |||
1473 | #endif | 1476 | #endif |
1474 | 1477 | ||
1475 | kobject_uevent(kobj, KOBJ_ADD); | 1478 | kobject_uevent(kobj, KOBJ_ADD); |
1476 | dev_hold(queue->dev); | ||
1477 | 1479 | ||
1478 | return 0; | 1480 | return 0; |
1479 | } | 1481 | } |