aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/xen-blkback/blkback.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block/xen-blkback/blkback.c')
-rw-r--r--drivers/block/xen-blkback/blkback.c31
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
682static 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
682static void xen_blk_drain_io(struct xen_blkif *blkif) 692static 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 836done:
814 return more_to_do; 837 return more_to_do;
815} 838}
816 839