Commit 5fa89fb9 authored by Michael Lyle's avatar Michael Lyle Committed by Jens Axboe

bcache: don't write back data if reading it failed

If an IO operation fails, and we didn't successfully read data from the
cache, don't writeback invalid/partial data to the backing disk.
Signed-off-by: default avatarMichael Lyle <mlyle@lyle.org>
Reviewed-by: default avatarColy Li <colyli@suse.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 23850102
...@@ -179,13 +179,21 @@ static void write_dirty(struct closure *cl) ...@@ -179,13 +179,21 @@ static void write_dirty(struct closure *cl)
struct dirty_io *io = container_of(cl, struct dirty_io, cl); struct dirty_io *io = container_of(cl, struct dirty_io, cl);
struct keybuf_key *w = io->bio.bi_private; struct keybuf_key *w = io->bio.bi_private;
dirty_init(w); /*
bio_set_op_attrs(&io->bio, REQ_OP_WRITE, 0); * IO errors are signalled using the dirty bit on the key.
io->bio.bi_iter.bi_sector = KEY_START(&w->key); * If we failed to read, we should not attempt to write to the
bio_set_dev(&io->bio, io->dc->bdev); * backing device. Instead, immediately go to write_dirty_finish
io->bio.bi_end_io = dirty_endio; * to clean up.
*/
if (KEY_DIRTY(&w->key)) {
dirty_init(w);
bio_set_op_attrs(&io->bio, REQ_OP_WRITE, 0);
io->bio.bi_iter.bi_sector = KEY_START(&w->key);
bio_set_dev(&io->bio, io->dc->bdev);
io->bio.bi_end_io = dirty_endio;
closure_bio_submit(&io->bio, cl); closure_bio_submit(&io->bio, cl);
}
continue_at(cl, write_dirty_finish, io->dc->writeback_write_wq); continue_at(cl, write_dirty_finish, io->dc->writeback_write_wq);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment