Commit 9337057d4335053dc14934a60d9c3e8fe4e32039

Authored by Boaz Harrosh
Committed by David S. Miller
1 parent 68c1f3a96c

um: Proper Fix for f25c80a4: remove duplicate structure field initialization

uml_net_set_mac() was broken and luckily it was never used, before.
What it was trying to do is spin_lock before memcopy the mac address.
Linus attempted to fix it in assumption that someone decided the
lock was needed. But since it was never ever used at all, and was
just dead code, I think we can assume that it is not needed, after
all.

On the other hand patch [f25c80a4] was trying to use eth_mac_addr()
in eth_configure(), *which was the real fallout*. Because of state
checks done inside eth_mac_addr() the address was never set. I have
not reintroduced the memcpy wrapper, but I've put a comment for future
cats.

The code now is back to exactly as it was before [f25c80a4]. With
the cleanup applied. If the spin_lock is indeed needed then a contender
should supply a test case that fails, then fix it with the proper
locking, as a separate unrelated patch.

CC: Julia Lawall <julia@diku.dk>
CC: David S. Miller <davem@davemloft.net>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: Al Viro <viro@ZenIV.linux.org.uk>
Tested-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 1 changed file with 3 additions and 14 deletions Side-by-side Diff

arch/um/drivers/net_kern.c
... ... @@ -255,18 +255,6 @@
255 255 netif_wake_queue(dev);
256 256 }
257 257  
258   -static int uml_net_set_mac(struct net_device *dev, void *addr)
259   -{
260   - struct uml_net_private *lp = netdev_priv(dev);
261   - struct sockaddr *hwaddr = addr;
262   -
263   - spin_lock_irq(&lp->lock);
264   - eth_mac_addr(dev, hwaddr->sa_data);
265   - spin_unlock_irq(&lp->lock);
266   -
267   - return 0;
268   -}
269   -
270 258 static int uml_net_change_mtu(struct net_device *dev, int new_mtu)
271 259 {
272 260 dev->mtu = new_mtu;
... ... @@ -373,7 +361,7 @@
373 361 .ndo_start_xmit = uml_net_start_xmit,
374 362 .ndo_set_multicast_list = uml_net_set_multicast_list,
375 363 .ndo_tx_timeout = uml_net_tx_timeout,
376   - .ndo_set_mac_address = uml_net_set_mac,
  364 + .ndo_set_mac_address = eth_mac_addr,
377 365 .ndo_change_mtu = uml_net_change_mtu,
378 366 .ndo_validate_addr = eth_validate_addr,
379 367 };
... ... @@ -472,7 +460,8 @@
472 460 ((*transport->user->init)(&lp->user, dev) != 0))
473 461 goto out_unregister;
474 462  
475   - eth_mac_addr(dev, device->mac);
  463 + /* don't use eth_mac_addr, it will not work here */
  464 + memcpy(dev->dev_addr, device->mac, ETH_ALEN);
476 465 dev->mtu = transport->user->mtu;
477 466 dev->netdev_ops = &uml_netdev_ops;
478 467 dev->ethtool_ops = &uml_net_ethtool_ops;