tipc: Fix misleading error code when enabling Ethernet bearers
authorAllan Stephens <allan.stephens@windriver.com>
Fri, 3 Sep 2010 08:33:42 +0000 (08:33 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 7 Sep 2010 01:12:57 +0000 (18:12 -0700)
Cause TIPC to return EAGAIN if it is unable to enable a new Ethernet
bearer because one or more recently disabled Ethernet bearers are
temporarily consuming resources during shut down.  (The previous error
code, EDQUOT, is now returned only if all available Ethernet bearer
data structures are fully enabled at the time the request to enable an
additional bearer is received.)

Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/eth_media.c

index 81253d0b24b9d0cd2780602cac850f95d379c070..673fdf0b3222f9ae439e4d3e522439bbc13b8b56 100644 (file)
@@ -142,6 +142,16 @@ static int enable_bearer(struct tipc_bearer *tb_ptr)
        struct eth_bearer *eb_ptr = &eth_bearers[0];
        struct eth_bearer *stop = &eth_bearers[MAX_ETH_BEARERS];
        char *driver_name = strchr((const char *)tb_ptr->name, ':') + 1;
+       int pending_dev = 0;
+
+       /* Find unused Ethernet bearer structure */
+
+       while (eb_ptr->dev) {
+               if (!eb_ptr->bearer)
+                       pending_dev++;
+               if (++eb_ptr == stop)
+                       return pending_dev ? -EAGAIN : -EDQUOT;
+       }
 
        /* Find device with specified name */