bcachefs: Fix an error path race
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 25 Oct 2019 22:54:58 +0000 (18:54 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:30 +0000 (17:08 -0400)
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: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fs-io.c

index c539ed3aa48ddffec6f9b1d80b693670de359653..93f6cdbbf7c72705c8c33eb1dca5de759d288e44 100644 (file)
@@ -491,7 +491,12 @@ static void bch2_set_page_dirty(struct bch_fs *c,
                unsigned sectors = sectors_to_reserve(&s->s[i],
                                                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;
                res->disk.sectors -= sectors;