Skip to content

Commit c4ba999

Browse files
committed
Merge branch 'dev_get_by_index'
Ying Xue says: ==================== use appropriate APIs to get interfaces Under rtnl_lock protection, we should use __dev_get_name/index() rather than dev_get_name()/index() to find interface handlers because the former interfaces can help us avoid to change interface reference counter. v2 changes: - Change return value of nl80211_set_wiphy() to 0 in patch #10 by johannes's suggestion. - Add 'Acked-by' into several patches which were acknowledged by corresponding maintainers. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 85a5bac + 7f2b856 commit c4ba999

File tree

10 files changed

+124
-187
lines changed

10 files changed

+124
-187
lines changed

drivers/net/bonding/bond_main.c

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3213,37 +3213,34 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
32133213
if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
32143214
return -EPERM;
32153215

3216-
slave_dev = dev_get_by_name(net, ifr->ifr_slave);
3216+
slave_dev = __dev_get_by_name(net, ifr->ifr_slave);
32173217

32183218
pr_debug("slave_dev=%p:\n", slave_dev);
32193219

32203220
if (!slave_dev)
3221-
res = -ENODEV;
3222-
else {
3223-
pr_debug("slave_dev->name=%s:\n", slave_dev->name);
3224-
switch (cmd) {
3225-
case BOND_ENSLAVE_OLD:
3226-
case SIOCBONDENSLAVE:
3227-
res = bond_enslave(bond_dev, slave_dev);
3228-
break;
3229-
case BOND_RELEASE_OLD:
3230-
case SIOCBONDRELEASE:
3231-
res = bond_release(bond_dev, slave_dev);
3232-
break;
3233-
case BOND_SETHWADDR_OLD:
3234-
case SIOCBONDSETHWADDR:
3235-
bond_set_dev_addr(bond_dev, slave_dev);
3236-
res = 0;
3237-
break;
3238-
case BOND_CHANGE_ACTIVE_OLD:
3239-
case SIOCBONDCHANGEACTIVE:
3240-
res = bond_option_active_slave_set(bond, slave_dev);
3241-
break;
3242-
default:
3243-
res = -EOPNOTSUPP;
3244-
}
3221+
return -ENODEV;
32453222

3246-
dev_put(slave_dev);
3223+
pr_debug("slave_dev->name=%s:\n", slave_dev->name);
3224+
switch (cmd) {
3225+
case BOND_ENSLAVE_OLD:
3226+
case SIOCBONDENSLAVE:
3227+
res = bond_enslave(bond_dev, slave_dev);
3228+
break;
3229+
case BOND_RELEASE_OLD:
3230+
case SIOCBONDRELEASE:
3231+
res = bond_release(bond_dev, slave_dev);
3232+
break;
3233+
case BOND_SETHWADDR_OLD:
3234+
case SIOCBONDSETHWADDR:
3235+
bond_set_dev_addr(bond_dev, slave_dev);
3236+
res = 0;
3237+
break;
3238+
case BOND_CHANGE_ACTIVE_OLD:
3239+
case SIOCBONDCHANGEACTIVE:
3240+
res = bond_option_active_slave_set(bond, slave_dev);
3241+
break;
3242+
default:
3243+
res = -EOPNOTSUPP;
32473244
}
32483245

32493246
return res;

drivers/net/eql.c

Lines changed: 42 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,7 @@ static int __eql_insert_slave(slave_queue_t *queue, slave_t *slave)
395395
if (duplicate_slave)
396396
eql_kill_one_slave(queue, duplicate_slave);
397397

398+
dev_hold(slave->dev);
398399
list_add(&slave->list, &queue->all_slaves);
399400
queue->num_slaves++;
400401
slave->dev->flags |= IFF_SLAVE;
@@ -413,39 +414,35 @@ static int eql_enslave(struct net_device *master_dev, slaving_request_t __user *
413414
if (copy_from_user(&srq, srqp, sizeof (slaving_request_t)))
414415
return -EFAULT;
415416

416-
slave_dev = dev_get_by_name(&init_net, srq.slave_name);
417-
if (slave_dev) {
418-
if ((master_dev->flags & IFF_UP) == IFF_UP) {
419-
/* slave is not a master & not already a slave: */
420-
if (!eql_is_master(slave_dev) &&
421-
!eql_is_slave(slave_dev)) {
422-
slave_t *s = kmalloc(sizeof(*s), GFP_KERNEL);
423-
equalizer_t *eql = netdev_priv(master_dev);
424-
int ret;
425-
426-
if (!s) {
427-
dev_put(slave_dev);
428-
return -ENOMEM;
429-
}
430-
431-
memset(s, 0, sizeof(*s));
432-
s->dev = slave_dev;
433-
s->priority = srq.priority;
434-
s->priority_bps = srq.priority;
435-
s->priority_Bps = srq.priority / 8;
436-
437-
spin_lock_bh(&eql->queue.lock);
438-
ret = __eql_insert_slave(&eql->queue, s);
439-
if (ret) {
440-
dev_put(slave_dev);
441-
kfree(s);
442-
}
443-
spin_unlock_bh(&eql->queue.lock);
444-
445-
return ret;
446-
}
417+
slave_dev = __dev_get_by_name(&init_net, srq.slave_name);
418+
if (!slave_dev)
419+
return -ENODEV;
420+
421+
if ((master_dev->flags & IFF_UP) == IFF_UP) {
422+
/* slave is not a master & not already a slave: */
423+
if (!eql_is_master(slave_dev) && !eql_is_slave(slave_dev)) {
424+
slave_t *s = kmalloc(sizeof(*s), GFP_KERNEL);
425+
equalizer_t *eql = netdev_priv(master_dev);
426+
int ret;
427+
428+
if (!s)
429+
return -ENOMEM;
430+
431+
memset(s, 0, sizeof(*s));
432+
s->dev = slave_dev;
433+
s->priority = srq.priority;
434+
s->priority_bps = srq.priority;
435+
s->priority_Bps = srq.priority / 8;
436+
437+
spin_lock_bh(&eql->queue.lock);
438+
ret = __eql_insert_slave(&eql->queue, s);
439+
if (ret)
440+
kfree(s);
441+
442+
spin_unlock_bh(&eql->queue.lock);
443+
444+
return ret;
447445
}
448-
dev_put(slave_dev);
449446
}
450447

451448
return -EINVAL;
@@ -461,24 +458,20 @@ static int eql_emancipate(struct net_device *master_dev, slaving_request_t __use
461458
if (copy_from_user(&srq, srqp, sizeof (slaving_request_t)))
462459
return -EFAULT;
463460

464-
slave_dev = dev_get_by_name(&init_net, srq.slave_name);
465-
ret = -EINVAL;
466-
if (slave_dev) {
467-
spin_lock_bh(&eql->queue.lock);
468-
469-
if (eql_is_slave(slave_dev)) {
470-
slave_t *slave = __eql_find_slave_dev(&eql->queue,
471-
slave_dev);
461+
slave_dev = __dev_get_by_name(&init_net, srq.slave_name);
462+
if (!slave_dev)
463+
return -ENODEV;
472464

473-
if (slave) {
474-
eql_kill_one_slave(&eql->queue, slave);
475-
ret = 0;
476-
}
465+
ret = -EINVAL;
466+
spin_lock_bh(&eql->queue.lock);
467+
if (eql_is_slave(slave_dev)) {
468+
slave_t *slave = __eql_find_slave_dev(&eql->queue, slave_dev);
469+
if (slave) {
470+
eql_kill_one_slave(&eql->queue, slave);
471+
ret = 0;
477472
}
478-
dev_put(slave_dev);
479-
480-
spin_unlock_bh(&eql->queue.lock);
481473
}
474+
spin_unlock_bh(&eql->queue.lock);
482475

483476
return ret;
484477
}
@@ -494,7 +487,7 @@ static int eql_g_slave_cfg(struct net_device *dev, slave_config_t __user *scp)
494487
if (copy_from_user(&sc, scp, sizeof (slave_config_t)))
495488
return -EFAULT;
496489

497-
slave_dev = dev_get_by_name(&init_net, sc.slave_name);
490+
slave_dev = __dev_get_by_name(&init_net, sc.slave_name);
498491
if (!slave_dev)
499492
return -ENODEV;
500493

@@ -510,8 +503,6 @@ static int eql_g_slave_cfg(struct net_device *dev, slave_config_t __user *scp)
510503
}
511504
spin_unlock_bh(&eql->queue.lock);
512505

513-
dev_put(slave_dev);
514-
515506
if (!ret && copy_to_user(scp, &sc, sizeof (slave_config_t)))
516507
ret = -EFAULT;
517508

@@ -529,7 +520,7 @@ static int eql_s_slave_cfg(struct net_device *dev, slave_config_t __user *scp)
529520
if (copy_from_user(&sc, scp, sizeof (slave_config_t)))
530521
return -EFAULT;
531522

532-
slave_dev = dev_get_by_name(&init_net, sc.slave_name);
523+
slave_dev = __dev_get_by_name(&init_net, sc.slave_name);
533524
if (!slave_dev)
534525
return -ENODEV;
535526

@@ -548,8 +539,6 @@ static int eql_s_slave_cfg(struct net_device *dev, slave_config_t __user *scp)
548539
}
549540
spin_unlock_bh(&eql->queue.lock);
550541

551-
dev_put(slave_dev);
552-
553542
return ret;
554543
}
555544

drivers/net/vxlan.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -741,10 +741,9 @@ static int vxlan_fdb_parse(struct nlattr *tb[], struct vxlan_dev *vxlan,
741741
if (nla_len(tb[NDA_IFINDEX]) != sizeof(u32))
742742
return -EINVAL;
743743
*ifindex = nla_get_u32(tb[NDA_IFINDEX]);
744-
tdev = dev_get_by_index(net, *ifindex);
744+
tdev = __dev_get_by_index(net, *ifindex);
745745
if (!tdev)
746746
return -EADDRNOTAVAIL;
747-
dev_put(tdev);
748747
} else {
749748
*ifindex = 0;
750749
}

drivers/staging/cxt1e1/linux.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -770,9 +770,9 @@ do_del_chan (struct net_device *musycc_dev, void *data)
770770
if (cp.channum > 999)
771771
return -EINVAL;
772772
snprintf (buf, sizeof(buf), CHANNAME "%d", cp.channum);
773-
if (!(dev = dev_get_by_name (&init_net, buf)))
774-
return -ENOENT;
775-
dev_put (dev);
773+
dev = __dev_get_by_name(&init_net, buf);
774+
if (!dev)
775+
return -ENODEV;
776776
ret = do_deluser (dev, 1);
777777
if (ret)
778778
return ret;
@@ -792,19 +792,18 @@ do_reset (struct net_device *musycc_dev, void *data)
792792
char buf[sizeof (CHANNAME) + 3];
793793

794794
sprintf (buf, CHANNAME "%d", i);
795-
if (!(ndev = dev_get_by_name(&init_net, buf)))
796-
continue;
795+
ndev = __dev_get_by_name(&init_net, buf);
796+
if (!ndev)
797+
continue;
797798
priv = dev_to_hdlc (ndev)->priv;
798799

799800
if ((unsigned long) (priv->ci) ==
800801
(unsigned long) (netdev_priv(musycc_dev)))
801802
{
802803
ndev->flags &= ~IFF_UP;
803-
dev_put (ndev);
804804
netif_stop_queue (ndev);
805805
do_deluser (ndev, 1);
806-
} else
807-
dev_put (ndev);
806+
}
808807
}
809808
return 0;
810809
}

net/batman-adv/hard-interface.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,13 @@ static bool batadv_is_on_batman_iface(const struct net_device *net_dev)
8787
return false;
8888

8989
/* recurse over the parent device */
90-
parent_dev = dev_get_by_index(&init_net, net_dev->iflink);
90+
parent_dev = __dev_get_by_index(&init_net, net_dev->iflink);
9191
/* if we got a NULL parent_dev there is something broken.. */
9292
if (WARN(!parent_dev, "Cannot find parent device"))
9393
return false;
9494

9595
ret = batadv_is_on_batman_iface(parent_dev);
9696

97-
if (parent_dev)
98-
dev_put(parent_dev);
9997
return ret;
10098
}
10199

net/caif/chnl_net.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ static int chnl_net_open(struct net_device *dev)
285285
goto error;
286286
}
287287

288-
lldev = dev_get_by_index(dev_net(dev), llifindex);
288+
lldev = __dev_get_by_index(dev_net(dev), llifindex);
289289

290290
if (lldev == NULL) {
291291
pr_debug("no interface?\n");
@@ -307,7 +307,6 @@ static int chnl_net_open(struct net_device *dev)
307307
mtu = min_t(int, dev->mtu, lldev->mtu - (headroom + tailroom));
308308
mtu = min_t(int, GPRS_PDP_MTU, mtu);
309309
dev_set_mtu(dev, mtu);
310-
dev_put(lldev);
311310

312311
if (mtu < 100) {
313312
pr_warn("CAIF Interface MTU too small (%d)\n", mtu);

net/can/gw.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -839,21 +839,21 @@ static int cgw_create_job(struct sk_buff *skb, struct nlmsghdr *nlh)
839839
if (!gwj->ccgw.src_idx || !gwj->ccgw.dst_idx)
840840
goto out;
841841

842-
gwj->src.dev = dev_get_by_index(&init_net, gwj->ccgw.src_idx);
842+
gwj->src.dev = __dev_get_by_index(&init_net, gwj->ccgw.src_idx);
843843

844844
if (!gwj->src.dev)
845845
goto out;
846846

847847
if (gwj->src.dev->type != ARPHRD_CAN)
848-
goto put_src_out;
848+
goto out;
849849

850-
gwj->dst.dev = dev_get_by_index(&init_net, gwj->ccgw.dst_idx);
850+
gwj->dst.dev = __dev_get_by_index(&init_net, gwj->ccgw.dst_idx);
851851

852852
if (!gwj->dst.dev)
853-
goto put_src_out;
853+
goto out;
854854

855855
if (gwj->dst.dev->type != ARPHRD_CAN)
856-
goto put_src_dst_out;
856+
goto out;
857857

858858
gwj->limit_hops = limhops;
859859

@@ -862,11 +862,6 @@ static int cgw_create_job(struct sk_buff *skb, struct nlmsghdr *nlh)
862862
err = cgw_register_filter(gwj);
863863
if (!err)
864864
hlist_add_head_rcu(&gwj->list, &cgw_list);
865-
866-
put_src_dst_out:
867-
dev_put(gwj->dst.dev);
868-
put_src_out:
869-
dev_put(gwj->src.dev);
870865
out:
871866
if (err)
872867
kmem_cache_free(cgw_cache, gwj);

net/dcb/dcbnl.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,21 +1688,17 @@ static int dcb_doit(struct sk_buff *skb, struct nlmsghdr *nlh)
16881688
if (!tb[DCB_ATTR_IFNAME])
16891689
return -EINVAL;
16901690

1691-
netdev = dev_get_by_name(net, nla_data(tb[DCB_ATTR_IFNAME]));
1691+
netdev = __dev_get_by_name(net, nla_data(tb[DCB_ATTR_IFNAME]));
16921692
if (!netdev)
16931693
return -ENODEV;
16941694

1695-
if (!netdev->dcbnl_ops) {
1696-
ret = -EOPNOTSUPP;
1697-
goto out;
1698-
}
1695+
if (!netdev->dcbnl_ops)
1696+
return -EOPNOTSUPP;
16991697

17001698
reply_skb = dcbnl_newmsg(fn->type, dcb->cmd, portid, nlh->nlmsg_seq,
17011699
nlh->nlmsg_flags, &reply_nlh);
1702-
if (!reply_skb) {
1703-
ret = -ENOBUFS;
1704-
goto out;
1705-
}
1700+
if (!reply_skb)
1701+
return -ENOBUFS;
17061702

17071703
ret = fn->cb(netdev, nlh, nlh->nlmsg_seq, tb, reply_skb);
17081704
if (ret < 0) {
@@ -1714,7 +1710,6 @@ static int dcb_doit(struct sk_buff *skb, struct nlmsghdr *nlh)
17141710

17151711
ret = rtnl_unicast(reply_skb, net, portid);
17161712
out:
1717-
dev_put(netdev);
17181713
return ret;
17191714
}
17201715

net/decnet/dn_route.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1666,12 +1666,8 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh)
16661666

16671667
if (fld.flowidn_iif) {
16681668
struct net_device *dev;
1669-
if ((dev = dev_get_by_index(&init_net, fld.flowidn_iif)) == NULL) {
1670-
kfree_skb(skb);
1671-
return -ENODEV;
1672-
}
1673-
if (!dev->dn_ptr) {
1674-
dev_put(dev);
1669+
dev = __dev_get_by_index(&init_net, fld.flowidn_iif);
1670+
if (!dev || !dev->dn_ptr) {
16751671
kfree_skb(skb);
16761672
return -ENODEV;
16771673
}
@@ -1693,8 +1689,6 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh)
16931689
err = dn_route_output_key((struct dst_entry **)&rt, &fld, 0);
16941690
}
16951691

1696-
if (skb->dev)
1697-
dev_put(skb->dev);
16981692
skb->dev = NULL;
16991693
if (err)
17001694
goto out_free;

0 commit comments

Comments
 (0)