diff options
Diffstat (limited to 'drivers/block/xen-blkback/blkback.c')
-rw-r--r-- | drivers/block/xen-blkback/blkback.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index 6d1cc3df2ac6..1a0faf6370ca 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c | |||
@@ -679,6 +679,16 @@ static int dispatch_discard_io(struct xen_blkif *blkif, | |||
679 | return err; | 679 | return err; |
680 | } | 680 | } |
681 | 681 | ||
682 | static int dispatch_other_io(struct xen_blkif *blkif, | ||
683 | struct blkif_request *req, | ||
684 | struct pending_req *pending_req) | ||
685 | { | ||
686 | free_req(pending_req); | ||
687 | make_response(blkif, req->u.other.id, req->operation, | ||
688 | BLKIF_RSP_EOPNOTSUPP); | ||
689 | return -EIO; | ||
690 | } | ||
691 | |||
682 | static void xen_blk_drain_io(struct xen_blkif *blkif) | 692 | static void xen_blk_drain_io(struct xen_blkif *blkif) |
683 | { | 693 | { |
684 | atomic_set(&blkif->drain, 1); | 694 | atomic_set(&blkif->drain, 1); |
@@ -800,17 +810,30 @@ __do_block_io_op(struct xen_blkif *blkif) | |||
800 | 810 | ||
801 | /* Apply all sanity checks to /private copy/ of request. */ | 811 | /* Apply all sanity checks to /private copy/ of request. */ |
802 | barrier(); | 812 | barrier(); |
803 | if (unlikely(req.operation == BLKIF_OP_DISCARD)) { | 813 | |
814 | switch (req.operation) { | ||
815 | case BLKIF_OP_READ: | ||
816 | case BLKIF_OP_WRITE: | ||
817 | case BLKIF_OP_WRITE_BARRIER: | ||
818 | case BLKIF_OP_FLUSH_DISKCACHE: | ||
819 | if (dispatch_rw_block_io(blkif, &req, pending_req)) | ||
820 | goto done; | ||
821 | break; | ||
822 | case BLKIF_OP_DISCARD: | ||
804 | free_req(pending_req); | 823 | free_req(pending_req); |
805 | if (dispatch_discard_io(blkif, &req)) | 824 | if (dispatch_discard_io(blkif, &req)) |
806 | break; | 825 | goto done; |
807 | } else if (dispatch_rw_block_io(blkif, &req, pending_req)) | 826 | break; |
827 | default: | ||
828 | if (dispatch_other_io(blkif, &req, pending_req)) | ||
829 | goto done; | ||
808 | break; | 830 | break; |
831 | } | ||
809 | 832 | ||
810 | /* Yield point for this unbounded loop. */ | 833 | /* Yield point for this unbounded loop. */ |
811 | cond_resched(); | 834 | cond_resched(); |
812 | } | 835 | } |
813 | 836 | done: | |
814 | return more_to_do; | 837 | return more_to_do; |
815 | } | 838 | } |
816 | 839 | ||