[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