Skip to content

Commit b41848b

Browse files
Stephen HemmingerDavid S. Miller
authored andcommitted
netpoll setup error handling
The beast was not always healthy. When it was sick, it tended to be laconic and not tell anyone the real problem. A few small changes had it telling the world about its problems, if they really wanted to hear. Signed-off-by: Stephen Hemminger <[email protected]>
1 parent b6cd27e commit b41848b

File tree

2 files changed

+18
-9
lines changed

2 files changed

+18
-9
lines changed

drivers/net/netconsole.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ __setup("netconsole=", option_setup);
102102

103103
static int init_netconsole(void)
104104
{
105+
int err;
106+
105107
if(strlen(config))
106108
option_setup(config);
107109

@@ -110,8 +112,9 @@ static int init_netconsole(void)
110112
return 0;
111113
}
112114

113-
if(netpoll_setup(&np))
114-
return -EINVAL;
115+
err = netpoll_setup(&np);
116+
if (err)
117+
return err;
115118

116119
register_console(&netconsole);
117120
printk(KERN_INFO "netconsole: network logging started\n");

net/core/netpoll.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -611,20 +611,23 @@ int netpoll_setup(struct netpoll *np)
611611
struct in_device *in_dev;
612612
struct netpoll_info *npinfo;
613613
unsigned long flags;
614+
int err;
614615

615616
if (np->dev_name)
616617
ndev = dev_get_by_name(np->dev_name);
617618
if (!ndev) {
618619
printk(KERN_ERR "%s: %s doesn't exist, aborting.\n",
619620
np->name, np->dev_name);
620-
return -1;
621+
return -ENODEV;
621622
}
622623

623624
np->dev = ndev;
624625
if (!ndev->npinfo) {
625626
npinfo = kmalloc(sizeof(*npinfo), GFP_KERNEL);
626-
if (!npinfo)
627+
if (!npinfo) {
628+
err = -ENOMEM;
627629
goto release;
630+
}
628631

629632
npinfo->rx_flags = 0;
630633
npinfo->rx_np = NULL;
@@ -645,6 +648,7 @@ int netpoll_setup(struct netpoll *np)
645648
if (!ndev->poll_controller) {
646649
printk(KERN_ERR "%s: %s doesn't support polling, aborting.\n",
647650
np->name, np->dev_name);
651+
err = -ENOTSUPP;
648652
goto release;
649653
}
650654

@@ -655,13 +659,14 @@ int netpoll_setup(struct netpoll *np)
655659
np->name, np->dev_name);
656660

657661
rtnl_lock();
658-
if (dev_change_flags(ndev, ndev->flags | IFF_UP) < 0) {
662+
err = dev_open(ndev);
663+
rtnl_unlock();
664+
665+
if (err) {
659666
printk(KERN_ERR "%s: failed to open %s\n",
660-
np->name, np->dev_name);
661-
rtnl_unlock();
667+
np->name, ndev->name);
662668
goto release;
663669
}
664-
rtnl_unlock();
665670

666671
atleast = jiffies + HZ/10;
667672
atmost = jiffies + 4*HZ;
@@ -699,6 +704,7 @@ int netpoll_setup(struct netpoll *np)
699704
rcu_read_unlock();
700705
printk(KERN_ERR "%s: no IP address for %s, aborting\n",
701706
np->name, np->dev_name);
707+
err = -EDESTADDRREQ;
702708
goto release;
703709
}
704710

@@ -731,7 +737,7 @@ int netpoll_setup(struct netpoll *np)
731737
kfree(npinfo);
732738
np->dev = NULL;
733739
dev_put(ndev);
734-
return -1;
740+
return err;
735741
}
736742

737743
static int __init netpoll_init(void) {

0 commit comments

Comments
 (0)