From: Alex Zhuravlev Date: Thu, 11 Feb 2021 14:33:01 +0000 (+0300) Subject: LU-14423 osd: recognize holes in osd_is_mapped() X-Git-Tag: 2.14.51~160 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=2eaa49ef0f16798d564883b16cea9e96fad52495 LU-14423 osd: recognize holes in osd_is_mapped() ldiskfs_fiemap() can return {0,0,0} for last non-allocated region. osd_is_mapped() should be able to recognize and cache this state. Fixes: 144b5a65c1 ("LU-7132 osd-ldiskfs: speedup rewrites") Signed-off-by: Alex Zhuravlev Change-Id: I03883038c2c0ec84754377a442c4947c7e3021a9 Reviewed-on: https://review.whamcloud.com/41481 Tested-by: jenkins Reviewed-by: Andreas Dilger Reviewed-by: Andrew Perepechko Tested-by: Maloo Reviewed-by: Oleg Drokin --- diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index d2a9c88..f99f625 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -1335,6 +1335,16 @@ static int osd_is_mapped(struct dt_object *dt, __u64 offset, return 0; start = fe.fe_logical >> inode->i_blkbits; + if (fei.fi_extents_mapped == 0) { + /* a special case - no extent found at this offset and forward. + * we can consider this as a hole to EOF. it's safe to cache + * as other threads can not allocate/punch blocks this thread + * is working on (LDLM). */ + cached_extent->start = block; + cached_extent->end = i_size_read(inode) >> inode->i_blkbits; + cached_extent->mapped = 0; + return 0; + } if (start > block) { cached_extent->start = block;