summaryrefslogtreecommitdiffstats
path: root/fs/bcachefs/fs-io.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-03-27 16:55:27 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:59 -0400
commit34fdcf0632a5e549c5bfed1847a6d6995606ec17 (patch)
tree619ac66b860e353731dd1a7e9a29d7ada054858e /fs/bcachefs/fs-io.c
parent9567413c82d9dbad24ff6edd0dd160da8b6d9d8f (diff)
downloadlinux-34fdcf0632a5e549c5bfed1847a6d6995606ec17.tar.gz
linux-34fdcf0632a5e549c5bfed1847a6d6995606ec17.tar.bz2
linux-34fdcf0632a5e549c5bfed1847a6d6995606ec17.zip
bcachefs: Check for folios that don't have bch_folio attached
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>
Diffstat (limited to 'fs/bcachefs/fs-io.c')
-rw-r--r--fs/bcachefs/fs-io.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c
index af5f21a7a6d0..e805d8ce7bba 100644
--- a/fs/bcachefs/fs-io.c
+++ b/fs/bcachefs/fs-io.c
@@ -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;