mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-25 08:02:56 +00:00
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 <axboe@fb.com>
This commit is contained in:
parent
f0225cacfe
commit
c1c87c2ba9
1 changed files with 23 additions and 34 deletions
|
@ -510,14 +510,10 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int do_req_filebacked(struct loop_device *lo, struct request *rq)
|
||||||
static inline int lo_rw_simple(struct loop_device *lo,
|
|
||||||
struct request *rq, loff_t pos, bool rw)
|
|
||||||
{
|
{
|
||||||
struct loop_cmd *cmd = blk_mq_rq_to_pdu(rq);
|
struct loop_cmd *cmd = blk_mq_rq_to_pdu(rq);
|
||||||
|
loff_t pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset;
|
||||||
if (cmd->use_aio)
|
|
||||||
return lo_rw_aio(lo, cmd, pos, rw);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* lo_write_simple and lo_read_simple should have been covered
|
* 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,
|
||||||
* of the req at one time. And direct read IO doesn't need to
|
* of the req at one time. And direct read IO doesn't need to
|
||||||
* run flush_dcache_page().
|
* run flush_dcache_page().
|
||||||
*/
|
*/
|
||||||
if (rw == WRITE)
|
switch (req_op(rq)) {
|
||||||
return lo_write_simple(lo, rq, pos);
|
case REQ_OP_FLUSH:
|
||||||
else
|
return lo_req_flush(lo, rq);
|
||||||
return lo_read_simple(lo, rq, pos);
|
case REQ_OP_DISCARD:
|
||||||
}
|
return lo_discard(lo, rq, pos);
|
||||||
|
case REQ_OP_WRITE:
|
||||||
static int do_req_filebacked(struct loop_device *lo, struct request *rq)
|
|
||||||
{
|
|
||||||
loff_t pos;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset;
|
|
||||||
|
|
||||||
if (op_is_write(req_op(rq))) {
|
|
||||||
if (req_op(rq) == REQ_OP_FLUSH)
|
|
||||||
ret = lo_req_flush(lo, rq);
|
|
||||||
else if (req_op(rq) == REQ_OP_DISCARD)
|
|
||||||
ret = lo_discard(lo, rq, pos);
|
|
||||||
else if (lo->transfer)
|
|
||||||
ret = lo_write_transfer(lo, rq, pos);
|
|
||||||
else
|
|
||||||
ret = lo_rw_simple(lo, rq, pos, WRITE);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if (lo->transfer)
|
if (lo->transfer)
|
||||||
ret = lo_read_transfer(lo, rq, pos);
|
return lo_write_transfer(lo, rq, pos);
|
||||||
|
else if (cmd->use_aio)
|
||||||
|
return lo_rw_aio(lo, cmd, pos, WRITE);
|
||||||
else
|
else
|
||||||
ret = lo_rw_simple(lo, rq, pos, READ);
|
return lo_write_simple(lo, rq, pos);
|
||||||
|
case REQ_OP_READ:
|
||||||
|
if (lo->transfer)
|
||||||
|
return lo_read_transfer(lo, rq, pos);
|
||||||
|
else if (cmd->use_aio)
|
||||||
|
return lo_rw_aio(lo, cmd, pos, READ);
|
||||||
|
else
|
||||||
|
return lo_read_simple(lo, rq, pos);
|
||||||
|
default:
|
||||||
|
WARN_ON_ONCE(1);
|
||||||
|
return -EIO;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct switch_request {
|
struct switch_request {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue