mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
md/raid5-cache: in r5l_do_submit_io(), submit io->split_bio first
In r5l_do_submit_io(), it is necessary to check io->split_bio before submit io->current_bio. This is because, endio of current_bio may free the whole IO unit, and thus change io->split_bio. Signed-off-by: Song Liu <songliubraving@fb.com> Signed-off-by: Shaohua Li <shli@fb.com>
This commit is contained in:
parent
29efc390b9
commit
bb3338d347
@ -622,20 +622,30 @@ static void r5l_do_submit_io(struct r5l_log *log, struct r5l_io_unit *io)
|
||||
__r5l_set_io_unit_state(io, IO_UNIT_IO_START);
|
||||
spin_unlock_irqrestore(&log->io_list_lock, flags);
|
||||
|
||||
/*
|
||||
* In case of journal device failures, submit_bio will get error
|
||||
* and calls endio, then active stripes will continue write
|
||||
* process. Therefore, it is not necessary to check Faulty bit
|
||||
* of journal device here.
|
||||
*
|
||||
* We can't check split_bio after current_bio is submitted. If
|
||||
* io->split_bio is null, after current_bio is submitted, current_bio
|
||||
* might already be completed and the io_unit is freed. We submit
|
||||
* split_bio first to avoid the issue.
|
||||
*/
|
||||
if (io->split_bio) {
|
||||
if (io->has_flush)
|
||||
io->split_bio->bi_opf |= REQ_PREFLUSH;
|
||||
if (io->has_fua)
|
||||
io->split_bio->bi_opf |= REQ_FUA;
|
||||
submit_bio(io->split_bio);
|
||||
}
|
||||
|
||||
if (io->has_flush)
|
||||
io->current_bio->bi_opf |= REQ_PREFLUSH;
|
||||
if (io->has_fua)
|
||||
io->current_bio->bi_opf |= REQ_FUA;
|
||||
submit_bio(io->current_bio);
|
||||
|
||||
if (!io->split_bio)
|
||||
return;
|
||||
|
||||
if (io->has_flush)
|
||||
io->split_bio->bi_opf |= REQ_PREFLUSH;
|
||||
if (io->has_fua)
|
||||
io->split_bio->bi_opf |= REQ_FUA;
|
||||
submit_bio(io->split_bio);
|
||||
}
|
||||
|
||||
/* deferred io_unit will be dispatched here */
|
||||
|
Loading…
Reference in New Issue
Block a user