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 982e55d3ab..0544b99d07 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 @@ -761,46 +761,6 @@ cd_io(void* cookie, io_request* request) } -static status_t -cd_read(void* cookie, off_t pos, void* buffer, size_t* _length) -{ - size_t length = *_length; - - IORequest request; - status_t status = request.Init(pos, (addr_t)buffer, length, false, 0); - if (status != B_OK) - return status; - - status = cd_io(cookie, &request); - if (status != B_OK) - return status; - - status = request.Wait(0, 0); - *_length = request.TransferredBytes(); - return status; -} - - -static status_t -cd_write(void* cookie, off_t pos, const void* buffer, size_t* _length) -{ - size_t length = *_length; - - IORequest request; - status_t status = request.Init(pos, (addr_t)buffer, length, true, 0); - if (status != B_OK) - return status; - - status = cd_io(cookie, &request); - if (status != B_OK) - return status; - - status = request.Wait(0, 0); - *_length = request.TransferredBytes(); - return status; -} - - static status_t cd_ioctl(void* cookie, uint32 op, void* buffer, size_t length) { @@ -1186,8 +1146,8 @@ struct device_module_info sSCSICDDevice = { cd_open, cd_close, cd_free, - cd_read, - cd_write, + NULL, // read + NULL, // write cd_io, cd_ioctl, diff --git a/src/add-ons/kernel/drivers/disk/scsi/scsi_disk/scsi_disk.cpp b/src/add-ons/kernel/drivers/disk/scsi/scsi_disk/scsi_disk.cpp index 09dfc03c59..09426ec9df 100644 --- a/src/add-ons/kernel/drivers/disk/scsi/scsi_disk/scsi_disk.cpp +++ b/src/add-ons/kernel/drivers/disk/scsi/scsi_disk/scsi_disk.cpp @@ -325,54 +325,6 @@ das_free(void* cookie) } -static status_t -das_read(void* cookie, off_t pos, void* buffer, size_t* _length) -{ - das_handle* handle = (das_handle*)cookie; - size_t length = *_length; - - IORequest request; - status_t status = request.Init(pos, (addr_t)buffer, length, false, 0); - if (status != B_OK) - return status; - - status = handle->info->io_scheduler->ScheduleRequest(&request); - if (status != B_OK) - return status; - - status = request.Wait(0, 0); - *_length = request.TransferredBytes(); - if (status != B_OK) - dprintf("das_read: request.Wait() returned: %s\n", strerror(status)); - - return status; -} - - -static status_t -das_write(void* cookie, off_t pos, const void* buffer, size_t* _length) -{ - das_handle* handle = (das_handle*)cookie; - size_t length = *_length; - - IORequest request; - status_t status = request.Init(pos, (addr_t)buffer, length, true, 0); - if (status != B_OK) - return status; - - status = handle->info->io_scheduler->ScheduleRequest(&request); - if (status != B_OK) - return status; - - status = request.Wait(0, 0); - *_length = request.TransferredBytes(); - if (status != B_OK) - dprintf("das_write: request.Wait() returned: %s\n", strerror(status)); - - return status; -} - - static status_t das_io(void *cookie, io_request *request) { @@ -702,8 +654,8 @@ struct device_module_info sSCSIDiskDevice = { das_open, das_close, das_free, - das_read, - das_write, + NULL, // read + NULL, // write das_io, das_ioctl, diff --git a/src/add-ons/kernel/drivers/disk/virtual/virtio_block/virtio_block.cpp b/src/add-ons/kernel/drivers/disk/virtual/virtio_block/virtio_block.cpp index 802318850a..5a1aee1cd5 100644 --- a/src/add-ons/kernel/drivers/disk/virtual/virtio_block/virtio_block.cpp +++ b/src/add-ons/kernel/drivers/disk/virtual/virtio_block/virtio_block.cpp @@ -335,57 +335,6 @@ virtio_block_free(void* cookie) } -static status_t -virtio_block_read(void* cookie, off_t pos, void* buffer, size_t* _length) -{ - CALLED(); - virtio_block_handle* handle = (virtio_block_handle*)cookie; - size_t length = *_length; - - IORequest request; - status_t status = request.Init(pos, (addr_t)buffer, length, false, 0); - if (status != B_OK) - return status; - - status = handle->info->io_scheduler->ScheduleRequest(&request); - if (status != B_OK) - return status; - - status = request.Wait(0, 0); - *_length = request.TransferredBytes(); - if (status != B_OK) - dprintf("virtio_block_read: request.Wait() returned: %s\n", strerror(status)); - - return status; -} - - -static status_t -virtio_block_write(void* cookie, off_t pos, const void* buffer, - size_t* _length) -{ - CALLED(); - virtio_block_handle* handle = (virtio_block_handle*)cookie; - size_t length = *_length; - - IORequest request; - status_t status = request.Init(pos, (addr_t)buffer, length, true, 0); - if (status != B_OK) - return status; - - status = handle->info->io_scheduler->ScheduleRequest(&request); - if (status != B_OK) - return status; - - status = request.Wait(0, 0); - *_length = request.TransferredBytes(); - if (status != B_OK) - dprintf("virtio_block_write: request.Wait() returned: %s\n", strerror(status)); - - return status; -} - - static status_t virtio_block_io(void *cookie, io_request *request) { @@ -655,8 +604,8 @@ struct device_module_info sVirtioBlockDevice = { virtio_block_open, virtio_block_close, virtio_block_free, - virtio_block_read, - virtio_block_write, + NULL, // read + NULL, // write virtio_block_io, virtio_block_ioctl, diff --git a/src/system/kernel/device_manager/AbstractModuleDevice.cpp b/src/system/kernel/device_manager/AbstractModuleDevice.cpp index c03675db52..e053fabf2d 100644 --- a/src/system/kernel/device_manager/AbstractModuleDevice.cpp +++ b/src/system/kernel/device_manager/AbstractModuleDevice.cpp @@ -7,6 +7,8 @@ #include "AbstractModuleDevice.h" +#include "IORequest.h" + AbstractModuleDevice::AbstractModuleDevice() : @@ -65,11 +67,34 @@ AbstractModuleDevice::Open(const char* path, int openMode, void** _cookie) } +status_t +AbstractModuleDevice::_DoIO(void* cookie, off_t pos, + void* buffer, size_t* _length, bool isWrite) +{ + IORequest request; + status_t status = request.Init(pos, (addr_t)buffer, *_length, isWrite, 0); + if (status != B_OK) + return status; + + status = IO(cookie, &request); + if (status != B_OK) + return status; + + status = request.Wait(0, 0); + *_length = request.TransferredBytes(); + return status; +} + + status_t AbstractModuleDevice::Read(void* cookie, off_t pos, void* buffer, size_t* _length) { - if (Module()->read == NULL) - return BaseDevice::Read(cookie, pos, buffer, _length); + if (Module()->read == NULL) { + if (Module()->io == NULL) + return BaseDevice::Read(cookie, pos, buffer, _length); + + return _DoIO(cookie, pos, buffer, _length, false); + } return Module()->read(cookie, pos, buffer, _length); } @@ -77,8 +102,12 @@ AbstractModuleDevice::Read(void* cookie, off_t pos, void* buffer, size_t* _lengt status_t AbstractModuleDevice::Write(void* cookie, off_t pos, const void* buffer, size_t* _length) { - if (Module()->write == NULL) - return BaseDevice::Write(cookie, pos, buffer, _length); + if (Module()->write == NULL) { + if (Module()->io == NULL) + return BaseDevice::Write(cookie, pos, buffer, _length); + + return _DoIO(cookie, pos, const_cast(buffer), _length, true); + } return Module()->write(cookie, pos, buffer, _length); } diff --git a/src/system/kernel/device_manager/AbstractModuleDevice.h b/src/system/kernel/device_manager/AbstractModuleDevice.h index 3e6a833a53..2c6763abc0 100644 --- a/src/system/kernel/device_manager/AbstractModuleDevice.h +++ b/src/system/kernel/device_manager/AbstractModuleDevice.h @@ -45,6 +45,10 @@ public: virtual status_t Close(void* cookie); virtual status_t Free(void* cookie); +protected: + status_t _DoIO(void* cookie, off_t pos, + void* buffer, size_t* _length, bool isWrite); + protected: device_node* fNode; int32 fInitialized;