Skip to content

Commit c1c87c2

Browse files
Christoph Hellwigaxboe
authored andcommitted
loop: make do_req_filebacked more robust
Use a switch statement to iterate over the possible operations and error out if it's an incorrect one. Signed-off-by: Jens Axboe <[email protected]>
1 parent f0225ca commit c1c87c2

File tree

1 file changed

+22
-33
lines changed

1 file changed

+22
-33
lines changed

drivers/block/loop.c

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -510,14 +510,10 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
510510
return 0;
511511
}
512512

513-
514-
static inline int lo_rw_simple(struct loop_device *lo,
515-
struct request *rq, loff_t pos, bool rw)
513+
static int do_req_filebacked(struct loop_device *lo, struct request *rq)
516514
{
517515
struct loop_cmd *cmd = blk_mq_rq_to_pdu(rq);
518-
519-
if (cmd->use_aio)
520-
return lo_rw_aio(lo, cmd, pos, rw);
516+
loff_t pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset;
521517

522518
/*
523519
* lo_write_simple and lo_read_simple should have been covered
@@ -528,37 +524,30 @@ static inline int lo_rw_simple(struct loop_device *lo,
528524
* of the req at one time. And direct read IO doesn't need to
529525
* run flush_dcache_page().
530526
*/
531-
if (rw == WRITE)
532-
return lo_write_simple(lo, rq, pos);
533-
else
534-
return lo_read_simple(lo, rq, pos);
535-
}
536-
537-
static int do_req_filebacked(struct loop_device *lo, struct request *rq)
538-
{
539-
loff_t pos;
540-
int ret;
541-
542-
pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset;
543-
544-
if (op_is_write(req_op(rq))) {
545-
if (req_op(rq) == REQ_OP_FLUSH)
546-
ret = lo_req_flush(lo, rq);
547-
else if (req_op(rq) == REQ_OP_DISCARD)
548-
ret = lo_discard(lo, rq, pos);
549-
else if (lo->transfer)
550-
ret = lo_write_transfer(lo, rq, pos);
527+
switch (req_op(rq)) {
528+
case REQ_OP_FLUSH:
529+
return lo_req_flush(lo, rq);
530+
case REQ_OP_DISCARD:
531+
return lo_discard(lo, rq, pos);
532+
case REQ_OP_WRITE:
533+
if (lo->transfer)
534+
return lo_write_transfer(lo, rq, pos);
535+
else if (cmd->use_aio)
536+
return lo_rw_aio(lo, cmd, pos, WRITE);
551537
else
552-
ret = lo_rw_simple(lo, rq, pos, WRITE);
553-
554-
} else {
538+
return lo_write_simple(lo, rq, pos);
539+
case REQ_OP_READ:
555540
if (lo->transfer)
556-
ret = lo_read_transfer(lo, rq, pos);
541+
return lo_read_transfer(lo, rq, pos);
542+
else if (cmd->use_aio)
543+
return lo_rw_aio(lo, cmd, pos, READ);
557544
else
558-
ret = lo_rw_simple(lo, rq, pos, READ);
545+
return lo_read_simple(lo, rq, pos);
546+
default:
547+
WARN_ON_ONCE(1);
548+
return -EIO;
549+
break;
559550
}
560-
561-
return ret;
562551
}
563552

564553
struct switch_request {

0 commit comments

Comments
 (0)