forked from Imagelibrary/rtems
libblock: Block device transfer request API change
Add and use rtems_blkdev_request_done(). Block device transfer requests must signal the completion status now with rtems_blkdev_request_done(). The return value of the block device IO control will be ignored for transfer requests. The first parameter of rtems_blkdev_request_cb is now the transfer request structure. Renamed rtems_blkdev_request::req_done to rtems_blkdev_request::done to break third party drivers at compile time, otherwise this API change would result in runtime errors.
This commit is contained in:
@@ -379,7 +379,7 @@ static int disk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
|
||||
switch (r->req) {
|
||||
case RTEMS_BLKDEV_REQ_READ:
|
||||
case RTEMS_BLKDEV_REQ_WRITE:
|
||||
r->req_done(r->done_arg, RTEMS_SUCCESSFUL);
|
||||
rtems_blkdev_request_done(r, RTEMS_SUCCESSFUL);
|
||||
return 0;
|
||||
default:
|
||||
errno = EINVAL;
|
||||
|
||||
@@ -488,7 +488,7 @@ bdbuf_disk_ioctl (rtems_disk_device *dd, uint32_t req, void* argp)
|
||||
{
|
||||
case RTEMS_BLKDEV_REQ_READ:
|
||||
if (!bdbuf_disk_ioctl_process (bdd, r))
|
||||
errno = EIO;
|
||||
rtems_blkdev_request_done(r, RTEMS_IO_ERROR);
|
||||
else
|
||||
{
|
||||
rtems_blkdev_sg_buffer* sg = r->bufs;
|
||||
@@ -511,15 +511,16 @@ bdbuf_disk_ioctl (rtems_disk_device *dd, uint32_t req, void* argp)
|
||||
remains -= length;
|
||||
}
|
||||
|
||||
r->req_done (r->done_arg, RTEMS_SUCCESSFUL);
|
||||
rtems_blkdev_request_done (r, RTEMS_SUCCESSFUL);
|
||||
}
|
||||
bdbuf_disk_ioctl_leave (bdd, r->bufnum);
|
||||
break;
|
||||
|
||||
case RTEMS_BLKDEV_REQ_WRITE:
|
||||
if (!bdbuf_disk_ioctl_process (bdd, r))
|
||||
errno = EIO;
|
||||
r->req_done (r->done_arg, RTEMS_SUCCESSFUL);
|
||||
rtems_blkdev_request_done(r, RTEMS_IO_ERROR);
|
||||
else
|
||||
rtems_blkdev_request_done(r, RTEMS_SUCCESSFUL);
|
||||
bdbuf_disk_ioctl_leave (bdd, r->bufnum);
|
||||
break;
|
||||
|
||||
|
||||
@@ -32,18 +32,20 @@ static Objects_Id testq_id = OBJECTS_ID_NONE;
|
||||
static int
|
||||
test_disk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
|
||||
{
|
||||
rtems_status_code rc;
|
||||
bdbuf_test_msg msg;
|
||||
size_t msg_size;
|
||||
rtems_status_code rc;
|
||||
bdbuf_test_msg msg;
|
||||
size_t msg_size;
|
||||
rtems_blkdev_request *r;
|
||||
|
||||
switch (req)
|
||||
{
|
||||
case RTEMS_BLKIO_REQUEST:
|
||||
{
|
||||
rtems_blkdev_request *r = argp;
|
||||
rtems_blkdev_sg_buffer *sg;
|
||||
unsigned int i;
|
||||
|
||||
r = argp;
|
||||
|
||||
printk("DISK_DRV: %s ",
|
||||
r->req == RTEMS_BLKDEV_REQ_READ ? "R" :
|
||||
r->req == RTEMS_BLKDEV_REQ_WRITE ? "W" : "?");
|
||||
@@ -71,7 +73,8 @@ test_disk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
|
||||
if (rc != RTEMS_SUCCESSFUL)
|
||||
{
|
||||
printf("Error while sending a message to Test task: %u\n", rc);
|
||||
return -1;
|
||||
rtems_blkdev_request_done(r, RTEMS_IO_ERROR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Wait for a reply from the test task */
|
||||
@@ -81,27 +84,27 @@ test_disk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
|
||||
if (rc != RTEMS_SUCCESSFUL)
|
||||
{
|
||||
printf("Error while reading a message from Test task: %u\n", rc);
|
||||
return rc;
|
||||
rtems_blkdev_request_done(r, RTEMS_IO_ERROR);
|
||||
return 0;
|
||||
}
|
||||
if (msg.type != BDBUF_TEST_MSG_TYPE_DRIVER_REPLY)
|
||||
{
|
||||
printf("Unexpected message comes to test disk driver: %d\n",
|
||||
msg.type);
|
||||
return -1;
|
||||
rtems_blkdev_request_done(r, RTEMS_IO_ERROR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (msg.val.driver_reply.ret_val != 0)
|
||||
{
|
||||
errno = msg.val.driver_reply.ret_errno;
|
||||
rtems_blkdev_request_done(r, RTEMS_IO_ERROR);
|
||||
}
|
||||
else
|
||||
{
|
||||
rtems_blkdev_request *r = (rtems_blkdev_request *)argp;
|
||||
|
||||
r->req_done(r->done_arg, msg.val.driver_reply.res_status);
|
||||
rtems_blkdev_request_done(r, msg.val.driver_reply.res_status);
|
||||
}
|
||||
|
||||
return msg.val.driver_reply.ret_val;
|
||||
return 0;
|
||||
}
|
||||
|
||||
rtems_device_driver
|
||||
|
||||
@@ -64,47 +64,50 @@ static int disk_ioctl(rtems_disk_device *dd, uint32_t req, void *arg)
|
||||
rtems_blkdev_sg_buffer *sg = &r->bufs [i];
|
||||
char *buf = sg->buffer;
|
||||
|
||||
if (sg->length != 1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (r->req) {
|
||||
case RTEMS_BLKDEV_REQ_READ:
|
||||
switch (sg->block) {
|
||||
case BLOCK_READ_IO_ERROR:
|
||||
sc = RTEMS_IO_ERROR;
|
||||
break;
|
||||
case BLOCK_READ_UNSATISFIED:
|
||||
sc = RTEMS_UNSATISFIED;
|
||||
break;
|
||||
case BLOCK_READ_SUCCESSFUL:
|
||||
case BLOCK_WRITE_IO_ERROR:
|
||||
*buf = disk_data [sg->block];
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case RTEMS_BLKDEV_REQ_WRITE:
|
||||
switch (sg->block) {
|
||||
case BLOCK_READ_IO_ERROR:
|
||||
case BLOCK_READ_UNSATISFIED:
|
||||
case BLOCK_READ_SUCCESSFUL:
|
||||
disk_data [sg->block] = *buf;
|
||||
break;
|
||||
case BLOCK_WRITE_IO_ERROR:
|
||||
sc = RTEMS_IO_ERROR;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
if (sg->length == 1) {
|
||||
switch (r->req) {
|
||||
case RTEMS_BLKDEV_REQ_READ:
|
||||
switch (sg->block) {
|
||||
case BLOCK_READ_IO_ERROR:
|
||||
sc = RTEMS_IO_ERROR;
|
||||
break;
|
||||
case BLOCK_READ_UNSATISFIED:
|
||||
sc = RTEMS_UNSATISFIED;
|
||||
break;
|
||||
case BLOCK_READ_SUCCESSFUL:
|
||||
case BLOCK_WRITE_IO_ERROR:
|
||||
*buf = disk_data [sg->block];
|
||||
break;
|
||||
default:
|
||||
sc = RTEMS_IO_ERROR;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case RTEMS_BLKDEV_REQ_WRITE:
|
||||
switch (sg->block) {
|
||||
case BLOCK_READ_IO_ERROR:
|
||||
case BLOCK_READ_UNSATISFIED:
|
||||
case BLOCK_READ_SUCCESSFUL:
|
||||
disk_data [sg->block] = *buf;
|
||||
break;
|
||||
case BLOCK_WRITE_IO_ERROR:
|
||||
sc = RTEMS_IO_ERROR;
|
||||
break;
|
||||
default:
|
||||
sc = RTEMS_IO_ERROR;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
sc = RTEMS_IO_ERROR;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
sc = RTEMS_IO_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
r->req_done(r->done_arg, sc);
|
||||
rtems_blkdev_request_done(r, sc);
|
||||
|
||||
return 0;
|
||||
} else {
|
||||
|
||||
@@ -105,7 +105,7 @@ static int disk_ioctl(rtems_disk_device *dd, uint32_t req, void *arg)
|
||||
set_task_prio(RTEMS_SELF, PRIORITY_SWAPOUT);
|
||||
}
|
||||
|
||||
r->req_done(r->done_arg, sc);
|
||||
rtems_blkdev_request_done(r, sc);
|
||||
|
||||
return 0;
|
||||
} else {
|
||||
|
||||
@@ -55,7 +55,7 @@ static int test_disk_ioctl(rtems_disk_device *dd, uint32_t req, void *arg)
|
||||
++block_access_counts [block];
|
||||
}
|
||||
|
||||
breq->req_done(breq->done_arg, RTEMS_SUCCESSFUL);
|
||||
rtems_blkdev_request_done(breq, RTEMS_SUCCESSFUL);
|
||||
} else {
|
||||
errno = EINVAL;
|
||||
rv = -1;
|
||||
|
||||
@@ -126,7 +126,7 @@ static int test_disk_ioctl(rtems_disk_device *dd, uint32_t req, void *arg)
|
||||
++block_access_counts [block];
|
||||
}
|
||||
|
||||
(*breq->req_done)(breq->done_arg, RTEMS_SUCCESSFUL);
|
||||
rtems_blkdev_request_done(breq, RTEMS_SUCCESSFUL);
|
||||
} else {
|
||||
errno = EINVAL;
|
||||
rv = -1;
|
||||
|
||||
@@ -105,7 +105,7 @@ static int test_disk_ioctl(rtems_disk_device *dd, uint32_t req, void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
(*breq->req_done)(breq->done_arg, sc);
|
||||
rtems_blkdev_request_done(breq, sc);
|
||||
} else {
|
||||
errno = EINVAL;
|
||||
rv = -1;
|
||||
|
||||
@@ -84,7 +84,7 @@ static int test_disk_ioctl(rtems_disk_device *dd, uint32_t req, void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
(*breq->req_done)(breq->done_arg, RTEMS_SUCCESSFUL);
|
||||
rtems_blkdev_request_done(breq, RTEMS_SUCCESSFUL);
|
||||
} else if (req == RTEMS_BLKIO_CAPABILITIES) {
|
||||
*(uint32_t *) arg = RTEMS_BLKDEV_CAP_MULTISECTOR_CONT;
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user