bcachefs: Check for folios that don't have bch_folio attached
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 27 Mar 2023 20:55:27 +0000 (16:55 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:59 +0000 (17:09 -0400)
With large folios, it's now incidentally possible to end up with a
clean, uptodate folio in the page cache that doesn't have a bch_folio
attached, if a folio has to be split.

This patch fixes __bch2_truncate_folio() to check for this; other code
paths appear to handle it.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fs-io.c

index af5f21a7a6d033fc77d2a64de60e3626851033e7..e805d8ce7bba937c0a775aebdbc68a5d0a576075 100644 (file)
@@ -926,6 +926,8 @@ static void bch2_set_folio_dirty(struct bch_fs *c,
        WARN_ON((u64) folio_pos(folio) + offset + len >
                round_up((u64) i_size_read(&inode->v), block_bytes(c)));
 
+       BUG_ON(!s->uptodate);
+
        spin_lock(&s->lock);
 
        for (i = round_down(offset, block_bytes(c)) >> 9;
@@ -2853,7 +2855,11 @@ static int __bch2_truncate_folio(struct bch_inode_info *inode,
                        goto unlock;
        }
 
-       BUG_ON(!s->uptodate);
+       if (!s->uptodate) {
+               ret = bch2_folio_set(c, inode_inum(inode), &folio, 1);
+               if (ret)
+                       goto unlock;
+       }
 
        for (i = round_up(start_offset, block_bytes(c)) >> 9;
             i < round_down(end_offset, block_bytes(c)) >> 9;