|
@@ -611,20 +611,23 @@ int netpoll_setup(struct netpoll *np)
|
|
|
struct in_device *in_dev;
|
|
|
struct netpoll_info *npinfo;
|
|
|
unsigned long flags;
|
|
|
+ int err;
|
|
|
|
|
|
if (np->dev_name)
|
|
|
ndev = dev_get_by_name(np->dev_name);
|
|
|
if (!ndev) {
|
|
|
printk(KERN_ERR "%s: %s doesn't exist, aborting.\n",
|
|
|
np->name, np->dev_name);
|
|
|
- return -1;
|
|
|
+ return -ENODEV;
|
|
|
}
|
|
|
|
|
|
np->dev = ndev;
|
|
|
if (!ndev->npinfo) {
|
|
|
npinfo = kmalloc(sizeof(*npinfo), GFP_KERNEL);
|
|
|
- if (!npinfo)
|
|
|
+ if (!npinfo) {
|
|
|
+ err = -ENOMEM;
|
|
|
goto release;
|
|
|
+ }
|
|
|
|
|
|
npinfo->rx_flags = 0;
|
|
|
npinfo->rx_np = NULL;
|
|
@@ -645,6 +648,7 @@ int netpoll_setup(struct netpoll *np)
|
|
|
if (!ndev->poll_controller) {
|
|
|
printk(KERN_ERR "%s: %s doesn't support polling, aborting.\n",
|
|
|
np->name, np->dev_name);
|
|
|
+ err = -ENOTSUPP;
|
|
|
goto release;
|
|
|
}
|
|
|
|
|
@@ -655,13 +659,14 @@ int netpoll_setup(struct netpoll *np)
|
|
|
np->name, np->dev_name);
|
|
|
|
|
|
rtnl_lock();
|
|
|
- if (dev_change_flags(ndev, ndev->flags | IFF_UP) < 0) {
|
|
|
+ err = dev_open(ndev);
|
|
|
+ rtnl_unlock();
|
|
|
+
|
|
|
+ if (err) {
|
|
|
printk(KERN_ERR "%s: failed to open %s\n",
|
|
|
- np->name, np->dev_name);
|
|
|
- rtnl_unlock();
|
|
|
+ np->name, ndev->name);
|
|
|
goto release;
|
|
|
}
|
|
|
- rtnl_unlock();
|
|
|
|
|
|
atleast = jiffies + HZ/10;
|
|
|
atmost = jiffies + 4*HZ;
|
|
@@ -699,6 +704,7 @@ int netpoll_setup(struct netpoll *np)
|
|
|
rcu_read_unlock();
|
|
|
printk(KERN_ERR "%s: no IP address for %s, aborting\n",
|
|
|
np->name, np->dev_name);
|
|
|
+ err = -EDESTADDRREQ;
|
|
|
goto release;
|
|
|
}
|
|
|
|
|
@@ -731,7 +737,7 @@ int netpoll_setup(struct netpoll *np)
|
|
|
kfree(npinfo);
|
|
|
np->dev = NULL;
|
|
|
dev_put(ndev);
|
|
|
- return -1;
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static int __init netpoll_init(void) {
|