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:
Sebastian Huber
2012-10-31 11:54:39 +01:00
parent 20e1e769f8
commit 9f0a68ce5a
19 changed files with 146 additions and 121 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 {