]> err.no Git - linux-2.6/commitdiff
[NET]: Fix hotplug race during device registration.
authorSergey Vlasov <vsu@altlinux.ru>
Mon, 10 Apr 2006 05:32:48 +0000 (22:32 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 10 Apr 2006 05:32:48 +0000 (22:32 -0700)
From: Thomas de Grenier de Latour <degrenier@easyconnect.fr>

On Sun, 9 Apr 2006 21:56:59 +0400,
Sergey Vlasov <vsu@altlinux.ru> wrote:

> However, show_address() does not output anything unless
> dev->reg_state == NETREG_REGISTERED - and this state is set by
> netdev_run_todo() only after netdev_register_sysfs() returns, so in
> the meantime (while netdev_register_sysfs() is busy adding the
> "statistics" attribute group) some process may see an empty "address"
> attribute.

I've tried the attached patch, suggested by Sergey Vlasov on
hotplug-devel@, and as far as i can test it works just fine.

Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c

index dfb62998866ae2e298139164a85ec0757b7f3fc7..2731570eba5b35a21c311dd587057c39805082f1 100644 (file)
@@ -3042,11 +3042,11 @@ void netdev_run_todo(void)
 
                switch(dev->reg_state) {
                case NETREG_REGISTERING:
+                       dev->reg_state = NETREG_REGISTERED;
                        err = netdev_register_sysfs(dev);
                        if (err)
                                printk(KERN_ERR "%s: failed sysfs registration (%d)\n",
                                       dev->name, err);
-                       dev->reg_state = NETREG_REGISTERED;
                        break;
 
                case NETREG_UNREGISTERING: