From: Kent Overstreet Date: Fri, 28 Mar 2025 15:29:04 +0000 (-0400) Subject: bcachefs: Don't return 0 size holes from bch2_seek_hole() X-Git-Tag: v6.15-rc1~83^2~21 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=af3d4c276a9171d142044effb2c43fb6df92a787;p=thirdparty%2Flinux.git 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 --- 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); }