fakelb: move lock out of iteration
authorAlexander Aring <alex.aring@gmail.com>
Sun, 17 May 2015 19:45:04 +0000 (21:45 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 19 May 2015 09:44:46 +0000 (11:44 +0200)
The list need to be protected while iteration which is need when other
list iterates at the same time over this list.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/net/ieee802154/fakelb.c

index c7e7d506224fa3af7b7e67ca94ebd66b71d50924..e1c0195c18aa1b1d49a9a209836f948c75fe1f78 100644 (file)
@@ -193,9 +193,7 @@ err_reg:
 
 static void fakelb_del(struct fakelb_phy *phy)
 {
-       write_lock_bh(&fakelb_lock);
        list_del(&phy->list);
-       write_unlock_bh(&fakelb_lock);
 
        ieee802154_unregister_hw(phy->hw);
        ieee802154_free_hw(phy->hw);
@@ -217,8 +215,10 @@ static int fakelb_probe(struct platform_device *pdev)
        return 0;
 
 err_slave:
+       write_lock_bh(&fakelb_lock);
        list_for_each_entry_safe(phy, tmp, &fakelb_phys, list)
                fakelb_del(phy);
+       write_unlock_bh(&fakelb_lock);
        return err;
 }
 
@@ -226,9 +226,10 @@ static int fakelb_remove(struct platform_device *pdev)
 {
        struct fakelb_phy *phy, *temp;
 
+       write_lock_bh(&fakelb_lock);
        list_for_each_entry_safe(phy, temp, &fakelb_phys, list)
                fakelb_del(phy);
-
+       write_unlock_bh(&fakelb_lock);
        return 0;
 }