diff options
author | Ursula Braun | 2010-07-23 01:15:05 +0200 |
---|---|---|
committer | David S. Miller | 2010-07-23 21:36:23 +0200 |
commit | 9dc48ccc68b9dfc01c2beee2d4317fb3df3fdce9 (patch) | |
tree | 83d101e637385276ca40af1bb70ecc14ab24e33f /drivers/s390/net/qeth_core_main.c | |
parent | qeth: Clear mac_bits field when switching between Layer 2 and Layer 3 (diff) | |
download | kernel-qcow2-linux-9dc48ccc68b9dfc01c2beee2d4317fb3df3fdce9.tar.gz kernel-qcow2-linux-9dc48ccc68b9dfc01c2beee2d4317fb3df3fdce9.tar.xz kernel-qcow2-linux-9dc48ccc68b9dfc01c2beee2d4317fb3df3fdce9.zip |
qeth: serialize sysfs-triggered device configurations
This patch serializes device removal and other sysfs-triggered
configurations by moving removal of sysfs-attributes to the beginning
of the remove functions. And it serializes online/offline setting
and discipline-switching (causing reestablishing of the net_device)
by making use of a new discipline mutex.
Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/s390/net/qeth_core_main.c')
-rw-r--r-- | drivers/s390/net/qeth_core_main.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 844935fbe6a8..f33da45c35ef 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c @@ -1084,6 +1084,7 @@ static int qeth_setup_card(struct qeth_card *card) spin_lock_init(&card->ip_lock); spin_lock_init(&card->thread_mask_lock); mutex_init(&card->conf_mutex); + mutex_init(&card->discipline_mutex); card->thread_start_mask = 0; card->thread_allowed_mask = 0; card->thread_running_mask = 0; @@ -4348,16 +4349,18 @@ static void qeth_core_remove_device(struct ccwgroup_device *gdev) struct qeth_card *card = dev_get_drvdata(&gdev->dev); QETH_DBF_TEXT(SETUP, 2, "removedv"); - if (card->discipline.ccwgdriver) { - card->discipline.ccwgdriver->remove(gdev); - qeth_core_free_discipline(card); - } if (card->info.type == QETH_CARD_TYPE_OSN) { qeth_core_remove_osn_attributes(&gdev->dev); } else { qeth_core_remove_device_attributes(&gdev->dev); } + + if (card->discipline.ccwgdriver) { + card->discipline.ccwgdriver->remove(gdev); + qeth_core_free_discipline(card); + } + debug_unregister(card->debug); write_lock_irqsave(&qeth_core_card_list.rwlock, flags); list_del(&card->list); |