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

Commit 3ee32707 authored by Veaceslav Falico's avatar Veaceslav Falico Committed by David S. Miller
Browse files

net: add sysfs helpers for netdev_adjacent logic



They clean up the code a bit and can be used further.

CC: Ding Tianhong <dingtianhong@huawei.com>
CC: "David S. Miller" <davem@davemloft.net>
CC: Eric Dumazet <edumazet@google.com>
CC: Nicolas Dichtel <nicolas.dichtel@6wind.com>
CC: Cong Wang <amwang@redhat.com>
Signed-off-by: default avatarVeaceslav Falico <vfalico@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b9381985
Loading
Loading
Loading
Loading
+30 −27
Original line number Diff line number Diff line
@@ -4623,13 +4623,36 @@ struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev)
}
EXPORT_SYMBOL(netdev_master_upper_dev_get_rcu);

int netdev_adjacent_sysfs_add(struct net_device *dev,
			      struct net_device *adj_dev,
			      struct list_head *dev_list)
{
	char linkname[IFNAMSIZ+7];
	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);
}
void netdev_adjacent_sysfs_del(struct net_device *dev,
			       char *name,
			       struct list_head *dev_list)
{
	char linkname[IFNAMSIZ+7];
	sprintf(linkname, dev_list == &dev->adj_list.upper ?
		"upper_%s" : "lower_%s", name);
	sysfs_remove_link(&(dev->dev.kobj), linkname);
}

#define netdev_adjacent_is_neigh_list(dev, dev_list) \
		(dev_list == &dev->adj_list.upper || \
		 dev_list == &dev->adj_list.lower)

static int __netdev_adjacent_dev_insert(struct net_device *dev,
					struct net_device *adj_dev,
					struct list_head *dev_list,
					void *private, bool master)
{
	struct netdev_adjacent *adj;
	char linkname[IFNAMSIZ+7];
	int ret;

	adj = __netdev_find_adj(dev, adj_dev, dev_list);
@@ -4652,16 +4675,8 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
	pr_debug("dev_hold for %s, because of link added from %s to %s\n",
		 adj_dev->name, dev->name, adj_dev->name);

	if (dev_list == &dev->adj_list.lower) {
		sprintf(linkname, "lower_%s", adj_dev->name);
		ret = sysfs_create_link(&(dev->dev.kobj),
					&(adj_dev->dev.kobj), linkname);
		if (ret)
			goto free_adj;
	} else if (dev_list == &dev->adj_list.upper) {
		sprintf(linkname, "upper_%s", adj_dev->name);
		ret = sysfs_create_link(&(dev->dev.kobj),
					&(adj_dev->dev.kobj), linkname);
	if (netdev_adjacent_is_neigh_list(dev, dev_list)) {
		ret = netdev_adjacent_sysfs_add(dev, adj_dev, dev_list);
		if (ret)
			goto free_adj;
	}
@@ -4681,14 +4696,8 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
	return 0;

remove_symlinks:
	if (dev_list == &dev->adj_list.lower) {
		sprintf(linkname, "lower_%s", adj_dev->name);
		sysfs_remove_link(&(dev->dev.kobj), linkname);
	} else if (dev_list == &dev->adj_list.upper) {
		sprintf(linkname, "upper_%s", adj_dev->name);
		sysfs_remove_link(&(dev->dev.kobj), linkname);
	}

	if (netdev_adjacent_is_neigh_list(dev, dev_list))
		netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list);
free_adj:
	kfree(adj);
	dev_put(adj_dev);
@@ -4701,7 +4710,6 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev,
					 struct list_head *dev_list)
{
	struct netdev_adjacent *adj;
	char linkname[IFNAMSIZ+7];

	adj = __netdev_find_adj(dev, adj_dev, dev_list);

@@ -4721,13 +4729,8 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev,
	if (adj->master)
		sysfs_remove_link(&(dev->dev.kobj), "master");

	if (dev_list == &dev->adj_list.lower) {
		sprintf(linkname, "lower_%s", adj_dev->name);
		sysfs_remove_link(&(dev->dev.kobj), linkname);
	} else if (dev_list == &dev->adj_list.upper) {
		sprintf(linkname, "upper_%s", adj_dev->name);
		sysfs_remove_link(&(dev->dev.kobj), linkname);
	}
	if (netdev_adjacent_is_neigh_list(dev, dev_list))
		netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list);

	list_del_rcu(&adj->list);
	pr_debug("dev_put for %s, because link removed from %s to %s\n",