Subject: Attempt to get eject failures back to ioctl(CDROMEJECT)

Currently the CDROMEJECT ioctl always succeeds; it'd be nice if we
managed to get the errno passed back through the request.

This patch tries to do that.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
---
 block/ll_rw_blk.c          |    9 +++++++--
 drivers/block/virtio_blk.c |    2 +-
 include/linux/blkdev.h     |    2 ++
 3 files changed, 10 insertions(+), 3 deletions(-)

diff -r a7da575b248f block/ll_rw_blk.c
--- a/block/ll_rw_blk.c	Wed Nov 14 15:44:39 2007 +1100
+++ b/block/ll_rw_blk.c	Wed Nov 14 17:33:55 2007 +1100
@@ -261,6 +261,7 @@ static void rq_init(struct request_queue
 	rq->end_io_data = NULL;
 	rq->completion_data = NULL;
 	rq->next_rq = NULL;
+	rq->errno = 0;
 }
 
 /**
@@ -2657,7 +2658,9 @@ int blk_execute_rq(struct request_queue 
 	blk_execute_rq_nowait(q, bd_disk, rq, at_head, blk_end_sync_rq);
 	wait_for_completion(&wait);
 
-	if (rq->errors)
+	if (rq->errno)
+		err = rq->errno;
+	else if (rq->errors)
 		err = -EIO;
 
 	return err;
@@ -3427,8 +3430,10 @@ static int __end_that_request_first(stru
 	 * extend uptodate bool to allow < 0 value to be direct io error
 	 */
 	error = 0;
-	if (end_io_error(uptodate))
+	if (end_io_error(uptodate)) {
+		req->errno = uptodate;
 		error = !uptodate ? -EIO : uptodate;
+	}
 
 	/*
 	 * for a REQ_BLOCK_PC request, we want to carry any eventual
diff -r a7da575b248f drivers/block/virtio_blk.c
--- a/drivers/block/virtio_blk.c	Wed Nov 14 15:44:39 2007 +1100
+++ b/drivers/block/virtio_blk.c	Wed Nov 14 17:33:55 2007 +1100
@@ -51,7 +51,7 @@ static bool blk_done(struct virtqueue *v
 			uptodate = 1;
 			break;
 		case VIRTIO_BLK_S_UNSUPP:
-			uptodate = -ENOTTY;
+			uptodate = -ENOSYS;
 			break;
 		default:
 			uptodate = 0;
diff -r a7da575b248f include/linux/blkdev.h
--- a/include/linux/blkdev.h	Wed Nov 14 15:44:39 2007 +1100
+++ b/include/linux/blkdev.h	Wed Nov 14 17:33:55 2007 +1100
@@ -281,6 +281,8 @@ struct request {
 
 	int tag;
 	int errors;
+	/* If this isn't set, assume -EIO. */
+	int errno;
 
 	int ref_count;
 
