From af3d4c276a9171d142044effb2c43fb6df92a787 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Fri, 28 Mar 2025 11:29:04 -0400 Subject: [PATCH] bcachefs: Don't return 0 size holes from bch2_seek_hole() The hole we find in the btree might be fully dirty in the page cache. If so, keep searching. Signed-off-by: Kent Overstreet --- fs/bcachefs/fs-io.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c index cc366786f0f9a..c80ed3a54e709 100644 --- a/fs/bcachefs/fs-io.c +++ b/fs/bcachefs/fs-io.c @@ -1008,10 +1008,19 @@ static loff_t bch2_seek_hole(struct file *file, u64 offset) ? MAX_LFS_FILESIZE : k.k->p.offset << 9; + /* + * Found a hole in the btree, now make sure it's + * a hole in the pagecache. We might have to + * keep searching if this hole is entirely dirty + * in the page cache: + */ bch2_trans_unlock(trans); - next_hole = bch2_seek_pagecache_hole(&inode->v, - start_offset, end_offset, 0, false); - break; + loff_t pagecache_hole = bch2_seek_pagecache_hole(&inode->v, + start_offset, end_offset, 0, false); + if (pagecache_hole < end_offset) { + next_hole = pagecache_hole; + break; + } } else { offset = max(offset, bkey_start_offset(k.k) << 9); } -- 2.39.5