diff --git a/src/add-ons/kernel/drivers/disk/scsi/scsi_cd/scsi_cd.cpp b/src/add-ons/kernel/drivers/disk/scsi/scsi_cd/scsi_cd.cpp index bfc2e148a8..5708a227c8 100644 --- a/src/add-ons/kernel/drivers/disk/scsi/scsi_cd/scsi_cd.cpp +++ b/src/add-ons/kernel/drivers/disk/scsi/scsi_cd/scsi_cd.cpp @@ -1,10 +1,11 @@ /* - * Copyright 2004-2009, Haiku, Inc. All rights reserved. + * Copyright 2004-2010, Haiku, Inc. All rights reserved. * Copyright 2002-2003, Thomas Kurschel. All rights reserved. * * Distributed under the terms of the MIT License. */ + /*! Peripheral driver to handle CD-ROM drives. To be more precisely, it supports CD-ROM and WORM drives (well - I've never _seen_ a WORM driver). @@ -586,12 +587,9 @@ cd_init_device(void* _info, void** _cookie) cd_driver_info* info = (cd_driver_info*)_info; // and get (initial) capacity - scsi_ccb *request = info->scsi->alloc_ccb(info->scsi_device); - if (request == NULL) - return B_NO_MEMORY; - - sSCSIPeripheral->check_capacity(info->scsi_periph_device, request); - info->scsi->free_ccb(request); + status_t status = update_capacity(info); + if (status != B_OK) + return status; *_cookie = info; return B_OK; @@ -929,6 +927,9 @@ cd_media_changed(cd_driver_info* info, scsi_ccb* request) // do a capacity check // TBD: is this a good idea (e.g. if this is an empty CD)? sSCSIPeripheral->check_capacity(info->scsi_periph_device, request); + + if (info->io_scheduler != NULL) + info->io_scheduler->MediaChanged(); } diff --git a/src/system/kernel/device_manager/IOCache.cpp b/src/system/kernel/device_manager/IOCache.cpp index a20005a462..384471dafb 100644 --- a/src/system/kernel/device_manager/IOCache.cpp +++ b/src/system/kernel/device_manager/IOCache.cpp @@ -133,6 +133,16 @@ IOCache::SetDeviceCapacity(off_t deviceCapacity) AutoLocker cacheLocker(fCache); fDeviceCapacity = deviceCapacity; +} + + +void +IOCache::MediaChanged() +{ + TRACE("%p->IOCache::MediaChanged()\n", this); + + MutexLocker serializationLocker(fSerializationLock); + AutoLocker cacheLocker(fCache); // new media -- burn all cached data while (vm_page* page = fCache->pages.Root()) { diff --git a/src/system/kernel/device_manager/IOCache.h b/src/system/kernel/device_manager/IOCache.h index 3668795267..e92e3bdf2a 100644 --- a/src/system/kernel/device_manager/IOCache.h +++ b/src/system/kernel/device_manager/IOCache.h @@ -26,6 +26,7 @@ public: virtual status_t Init(const char* name); virtual void SetDeviceCapacity(off_t deviceCapacity); + virtual void MediaChanged(); virtual status_t ScheduleRequest(IORequest* request); diff --git a/src/system/kernel/device_manager/IOScheduler.cpp b/src/system/kernel/device_manager/IOScheduler.cpp index 7bcd975bd1..bc898a0090 100644 --- a/src/system/kernel/device_manager/IOScheduler.cpp +++ b/src/system/kernel/device_manager/IOScheduler.cpp @@ -66,3 +66,9 @@ void IOScheduler::SetDeviceCapacity(off_t deviceCapacity) { } + + +void +IOScheduler::MediaChanged() +{ +} diff --git a/src/system/kernel/device_manager/IOScheduler.h b/src/system/kernel/device_manager/IOScheduler.h index 6c03ebae26..6de0e9f21d 100644 --- a/src/system/kernel/device_manager/IOScheduler.h +++ b/src/system/kernel/device_manager/IOScheduler.h @@ -46,6 +46,7 @@ public: virtual void SetCallback(io_callback callback, void* data); virtual void SetDeviceCapacity(off_t deviceCapacity); + virtual void MediaChanged(); virtual status_t ScheduleRequest(IORequest* request) = 0;