[prev in list] [next in list] [prev in thread] [next in thread]
List: haiku-commits
Subject: [haiku-commits] haiku: hrev57059 - src/add-ons/kernel/drivers/disk/usb/usb_disk
From: waddlesplash <waddlesplash () gmail ! com>
Date: 2023-05-31 19:01:13
Message-ID: 20230531190113.3CC4D3F7A5 () turing ! freelists ! org
[Download RAW message or body]
hrev57059 adds 1 changeset to branch 'master'
old head: cb1df90e30197426c6c64685c5ceebf15c6742f5
new head: 1eb7837ddd0004ea84e71c7517cdeb601d73fcd2
overview: https://git.haiku-os.org/haiku/log/?qt=range&q=1eb7837ddd00+%5Ecb1df90e3019
----------------------------------------------------------------------------
1eb7837ddd00: usb_disk: Ensure we are in a consistent locking state before calling \
free.
Should fix the KDL in #16745.
[ Augustin Cavalier <waddlesplash@gmail.com> ]
----------------------------------------------------------------------------
Revision: hrev57059
Commit: 1eb7837ddd0004ea84e71c7517cdeb601d73fcd2
URL: https://git.haiku-os.org/haiku/commit/?id=1eb7837ddd00
Author: Augustin Cavalier <waddlesplash@gmail.com>
Date: Wed May 31 19:01:03 2023 UTC
Ticket: https://dev.haiku-os.org/ticket/16745
----------------------------------------------------------------------------
1 file changed, 8 insertions(+), 2 deletions(-)
src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp | 10 ++++++++--
----------------------------------------------------------------------------
diff --git a/src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp \
b/src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp index \
dd260d2c94..f94d092081 100644
--- a/src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp
+++ b/src/add-ons/kernel/drivers/disk/usb/usb_disk/usb_disk.cpp
@@ -142,7 +142,8 @@ get_dma_resource(disk_device *device, uint32 blockSize)
void
usb_disk_free_device_and_luns(disk_device *device)
{
- mutex_lock(&device->lock);
+ ASSERT_LOCKED_MUTEX(&device->lock);
+
for (int32 i = 0; i < device->dma_resources.Count(); i++)
delete device->dma_resources[i];
for (uint8 i = 0; i < device->lun_count; i++)
@@ -1231,6 +1232,7 @@ usb_disk_device_removed(void *cookie)
{
TRACE("device_removed(0x%p)\n", cookie);
disk_device *device = (disk_device *)cookie;
+ mutex_lock(&device->lock);
for (uint8 i = 0; i < device->lun_count; i++)
gDeviceManager->unpublish_device(device->node, device->luns[i]->name);
@@ -1240,6 +1242,8 @@ usb_disk_device_removed(void *cookie)
gUSBModule->cancel_queued_transfers(device->bulk_out);
if (device->open_count == 0)
usb_disk_free_device_and_luns(device);
+ else
+ mutex_unlock(&device->lock);
}
@@ -1476,13 +1480,15 @@ usb_disk_free(void *cookie)
device_lun *lun = (device_lun *)cookie;
disk_device *device = lun->device;
- MutexLocker locker(device->lock);
+ mutex_lock(&device->lock);
device->open_count--;
if (device->open_count == 0 && device->removed) {
// we can simply free the device here as it has been removed from
// the device list in the device removed notification hook
usb_disk_free_device_and_luns(device);
+ } else {
+ mutex_unlock(&device->lock);
}
return B_OK;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic