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

Commit 536b2e92 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

ipv6: no more dev_put() in datagram_send_ctl()



Avoids touching device refcount in datagram_send_ctl(), thanks to RCU

Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 16ba5e8e
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -537,12 +537,17 @@ int datagram_send_ctl(struct net *net,

			addr_type = __ipv6_addr_type(&src_info->ipi6_addr);

			rcu_read_lock();
			if (fl->oif) {
				dev = dev_get_by_index(net, fl->oif);
				if (!dev)
				dev = dev_get_by_index_rcu(net, fl->oif);
				if (!dev) {
					rcu_read_unlock();
					return -ENODEV;
			} else if (addr_type & IPV6_ADDR_LINKLOCAL)
				}
			} else if (addr_type & IPV6_ADDR_LINKLOCAL) {
				rcu_read_unlock();
				return -EINVAL;
			}

			if (addr_type != IPV6_ADDR_ANY) {
				int strict = __ipv6_addr_src_scope(addr_type) <= IPV6_ADDR_SCOPE_LINKLOCAL;
@@ -553,8 +558,7 @@ int datagram_send_ctl(struct net *net,
					ipv6_addr_copy(&fl->fl6_src, &src_info->ipi6_addr);
			}

			if (dev)
				dev_put(dev);
			rcu_read_unlock();

			if (err)
				goto exit_f;