diff options
author | Benjamin Romer <benjamin.romer@unisys.com> | 2014-08-18 15:29:44 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-08-26 02:16:06 +0200 |
commit | 81e4c97e667f465d6f250a7a9ce6af04c3e6bce0 (patch) | |
tree | 1b25e1f3dde7681fa5e69603719e77e3f16fafc6 | |
parent | staging: unisys: fix spacing in uislib.c (diff) | |
download | linux-81e4c97e667f465d6f250a7a9ce6af04c3e6bce0.tar.xz linux-81e4c97e667f465d6f250a7a9ce6af04c3e6bce0.zip |
staging: unisys: simplify destroy_bus() in uislib.c
The destroy_bus() function is heavily indented and many lines extend past the
right margin. This patch simplifies the function without changing its effects.
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/unisys/uislib/uislib.c | 84 |
1 files changed, 44 insertions, 40 deletions
diff --git a/drivers/staging/unisys/uislib/uislib.c b/drivers/staging/unisys/uislib/uislib.c index 84f40a28ace9..17cfc21ada0a 100644 --- a/drivers/staging/unisys/uislib/uislib.c +++ b/drivers/staging/unisys/uislib/uislib.c @@ -276,53 +276,19 @@ destroy_bus(CONTROLVM_MESSAGE *msg, char *buf) { int i; struct bus_info *bus, *prev = NULL; + struct guest_msgs cmd; u32 busNo; busNo = msg->cmd.destroyBus.busNo; - /* find and delete the bus */ read_lock(&BusListLock); - for (bus = BusListHead; bus; prev = bus, bus = bus->next) { - if (bus->busNo == busNo) { - /* found the bus - ensure that all device - * slots are NULL - */ - for (i = 0; i < bus->deviceCount; i++) { - if (bus->device[i] != NULL) { - LOGERR("CONTROLVM_BUS_DESTROY Failed: device %i attached to bus %d.", - i, busNo); - read_unlock(&BusListLock); - return CONTROLVM_RESP_ERROR_BUS_DEVICE_ATTACHED; - } - } - read_unlock(&BusListLock); - /* the msg is bound for virtpci; send - * guest_msgs struct to callback - */ - if (!msg->hdr.Flags.server) { - struct guest_msgs cmd; - cmd.msgtype = GUEST_DEL_VBUS; - cmd.del_vbus.busNo = busNo; - if (!VirtControlChanFunc) { - LOGERR("CONTROLVM_BUS_DESTROY Failed: virtpci callback not registered."); - return CONTROLVM_RESP_ERROR_VIRTPCI_DRIVER_FAILURE; - } - if (!VirtControlChanFunc(&cmd)) { - LOGERR("CONTROLVM_BUS_DESTROY Failed: virtpci GUEST_DEL_VBUS returned error."); - return CONTROLVM_RESP_ERROR_VIRTPCI_DRIVER_CALLBACK_ERROR; - } - } - /* remove the bus from the list */ - write_lock(&BusListLock); - if (prev) /* not at head */ - prev->next = bus->next; - else - BusListHead = bus->next; - BusListCount--; - write_unlock(&BusListLock); + bus = BusListHead; + while (bus) { + if (bus->busNo == busNo) break; - } + prev = bus; + bus = bus->next; } if (!bus) { @@ -331,6 +297,44 @@ destroy_bus(CONTROLVM_MESSAGE *msg, char *buf) read_unlock(&BusListLock); return CONTROLVM_RESP_ERROR_ALREADY_DONE; } + + /* verify that this bus has no devices. */ + for (i = 0; i < bus->deviceCount; i++) { + if (bus->device[i] != NULL) { + LOGERR("CONTROLVM_BUS_DESTROY Failed: device %i attached to bus %d.", + i, busNo); + read_unlock(&BusListLock); + return CONTROLVM_RESP_ERROR_BUS_DEVICE_ATTACHED; + } + } + read_unlock(&BusListLock); + + if (msg->hdr.Flags.server) + goto remove; + + /* client messages require us to call the virtpci callback associated + with this bus. */ + cmd.msgtype = GUEST_DEL_VBUS; + cmd.del_vbus.busNo = busNo; + if (!VirtControlChanFunc) { + LOGERR("CONTROLVM_BUS_DESTROY Failed: virtpci callback not registered."); + return CONTROLVM_RESP_ERROR_VIRTPCI_DRIVER_FAILURE; + } + if (!VirtControlChanFunc(&cmd)) { + LOGERR("CONTROLVM_BUS_DESTROY Failed: virtpci GUEST_DEL_VBUS returned error."); + return CONTROLVM_RESP_ERROR_VIRTPCI_DRIVER_CALLBACK_ERROR; + } + + /* finally, remove the bus from the list */ +remove: + write_lock(&BusListLock); + if (prev) /* not at head */ + prev->next = bus->next; + else + BusListHead = bus->next; + BusListCount--; + write_unlock(&BusListLock); + if (bus->pBusChannel) { uislib_iounmap(bus->pBusChannel); bus->pBusChannel = NULL; |