diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-08-13 03:16:52 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-08-13 03:17:17 -0400 |
commit | ce609c7c87c167ab69df89d75550d42734324e10 (patch) | |
tree | 875e55ce2dc66687406c251cc9e73be6c518ae96 | |
parent | 9ef7b784cb7eed750893b7aa4957681fdcfb8ff6 (diff) |
bcachefs: Mark space as unallocated on write failure
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r-- | fs/bcachefs/fs-io.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c index 2cb1d4f61ad2..93681dbba102 100644 --- a/fs/bcachefs/fs-io.c +++ b/fs/bcachefs/fs-io.c @@ -1278,12 +1278,20 @@ static void bch2_writepage_io_done(struct closure *cl) struct bio *bio = &io->op.op.wbio.bio; struct bvec_iter_all iter; struct bio_vec *bvec; - unsigned i; + unsigned i, j; if (io->op.op.error) { bio_for_each_segment_all(bvec, bio, i, iter) { + struct bch_page_state *s; + SetPageError(bvec->bv_page); mapping_set_error(bvec->bv_page->mapping, -EIO); + + lock_page(bvec->bv_page); + s = bch2_page_state(bvec->bv_page); + for (j = 0; j < PAGE_SECTORS; j++) + s->s[j].nr_replicas = 0; + unlock_page(bvec->bv_page); } } |