Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 336ca57c authored by Eric W. Biederman's avatar Eric W. Biederman Committed by David S. Miller
Browse files

net-sysfs: Use rtnl_trylock in sysfs methods.



The earlier patch to fix the deadlock between a network device going
away and writing to sysfs attributes was incomplete.
- It did not set signal_pending so we would leak ERSTARTSYS to user space.
- It used ERESTARTSYS which only restarts if sigaction configures it to.
- It did not cover store and show for ifalias.

So fix all of these up and use the new helper restart_syscall so we get
the details correct on what it takes.

Signed-off-by: default avatarEric W. Biederman <ebiederm@aristanetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 690cc3ff
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ static ssize_t netdev_store(struct device *dev, struct device_attribute *attr,
		goto err;

	if (!rtnl_trylock())
		return -ERESTARTSYS;
		return restart_syscall();

	if (dev_isalive(net)) {
		if ((ret = (*set)(net, new)) == 0)
@@ -225,7 +225,8 @@ static ssize_t store_ifalias(struct device *dev, struct device_attribute *attr,
	if (len >  0 && buf[len - 1] == '\n')
		--count;

	rtnl_lock();
	if (!rtnl_trylock())
		return restart_syscall();
	ret = dev_set_alias(netdev, buf, count);
	rtnl_unlock();

@@ -238,7 +239,8 @@ static ssize_t show_ifalias(struct device *dev,
	const struct net_device *netdev = to_net_dev(dev);
	ssize_t ret = 0;

	rtnl_lock();
	if (!rtnl_trylock())
		return restart_syscall();
	if (netdev->ifalias)
		ret = sprintf(buf, "%s\n", netdev->ifalias);
	rtnl_unlock();