Commit 406d6d5a authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Fix an error path race

On IO error, bch2_writepages_io_done() will set the page state to
indicate nothing's already reserved (since the write didn't happen, we
don't know what's already reserved). This can race with the buffered IO
path, in between getting a disk reservation and calling
bch2_set_page_dirty().
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 92384391
...@@ -491,7 +491,12 @@ static void bch2_set_page_dirty(struct bch_fs *c, ...@@ -491,7 +491,12 @@ static void bch2_set_page_dirty(struct bch_fs *c,
unsigned sectors = sectors_to_reserve(&s->s[i], unsigned sectors = sectors_to_reserve(&s->s[i],
res->disk.nr_replicas); res->disk.nr_replicas);
BUG_ON(sectors > res->disk.sectors); /*
* This can happen if we race with the error path in
* bch2_writepage_io_done():
*/
sectors = min_t(unsigned, sectors, res->disk.sectors);
s->s[i].replicas_reserved += sectors; s->s[i].replicas_reserved += sectors;
res->disk.sectors -= sectors; res->disk.sectors -= sectors;
......
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