| From foo@baz Thu Mar 28 21:57:57 CET 2019 |
| From: YueHaibing <yuehaibing@huawei.com> |
| Date: Tue, 19 Mar 2019 10:16:53 +0800 |
| Subject: net-sysfs: call dev_hold if kobject_init_and_add success |
| |
| From: YueHaibing <yuehaibing@huawei.com> |
| |
| [ Upstream commit a3e23f719f5c4a38ffb3d30c8d7632a4ed8ccd9e ] |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/core/net-sysfs.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/net/core/net-sysfs.c |
| +++ b/net/core/net-sysfs.c |
| @@ -917,6 +917,8 @@ static int rx_queue_add_kobject(struct n |
| if (error) |
| return error; |
| |
| + dev_hold(queue->dev); |
| + |
| if (dev->sysfs_rx_queue_group) { |
| error = sysfs_create_group(kobj, dev->sysfs_rx_queue_group); |
| if (error) { |
| @@ -926,7 +928,6 @@ static int rx_queue_add_kobject(struct n |
| } |
| |
| kobject_uevent(kobj, KOBJ_ADD); |
| - dev_hold(queue->dev); |
| |
| return error; |
| } |
| @@ -1327,6 +1328,8 @@ static int netdev_queue_add_kobject(stru |
| if (error) |
| return error; |
| |
| + dev_hold(queue->dev); |
| + |
| #ifdef CONFIG_BQL |
| error = sysfs_create_group(kobj, &dql_group); |
| if (error) { |
| @@ -1336,7 +1339,6 @@ static int netdev_queue_add_kobject(stru |
| #endif |
| |
| kobject_uevent(kobj, KOBJ_ADD); |
| - dev_hold(queue->dev); |
| |
| return 0; |
| } |