Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Drivers: Staging: cxt1e1: use __dev_get_name instead of dev_get_name to find interfaces

The following call chain denotes that both do_reset() and do_del_chan()
are protected under rtnl_lock. If we use __dev_get_by_name() instead of
dev_get_by_name() to find interface handlers in them, this would help
us avoid to change interface reference counter.

dev_ioctl()
rtnl_lock()
dev_ifsioc()
c4_ioctl()
do_reset()
do_del_chan()
rtnl_unlock()

Signed-off-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Ying Xue and committed by
David S. Miller
bdffbb8e 85a5bac9

+7 -8
+7 -8
drivers/staging/cxt1e1/linux.c
··· 770 770 if (cp.channum > 999) 771 771 return -EINVAL; 772 772 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; 776 776 ret = do_deluser (dev, 1); 777 777 if (ret) 778 778 return ret; ··· 792 792 char buf[sizeof (CHANNAME) + 3]; 793 793 794 794 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; 797 798 priv = dev_to_hdlc (ndev)->priv; 798 799 799 800 if ((unsigned long) (priv->ci) == 800 801 (unsigned long) (netdev_priv(musycc_dev))) 801 802 { 802 803 ndev->flags &= ~IFF_UP; 803 - dev_put (ndev); 804 804 netif_stop_queue (ndev); 805 805 do_deluser (ndev, 1); 806 - } else 807 - dev_put (ndev); 806 + } 808 807 } 809 808 return 0; 810 809 }