From da824985c9b51759e86d6a5e86a66475dd979926 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 11 Aug 2017 14:05:56 -0700 Subject: [PATCH] 4.12-stable patches added patches: btrfs-remove-false-alert-when-fiemap-range-is-smaller-than-on-disk-extent.patch --- ...range-is-smaller-than-on-disk-extent.patch | 92 +++++++++++++++++++ queue-4.12/series | 1 + 2 files changed, 93 insertions(+) create mode 100644 queue-4.12/btrfs-remove-false-alert-when-fiemap-range-is-smaller-than-on-disk-extent.patch diff --git a/queue-4.12/btrfs-remove-false-alert-when-fiemap-range-is-smaller-than-on-disk-extent.patch b/queue-4.12/btrfs-remove-false-alert-when-fiemap-range-is-smaller-than-on-disk-extent.patch new file mode 100644 index 00000000000..bbffa33a27d --- /dev/null +++ b/queue-4.12/btrfs-remove-false-alert-when-fiemap-range-is-smaller-than-on-disk-extent.patch @@ -0,0 +1,92 @@ +From 848c23b78fafdcd3270b06a30737f8dbd70c347f Mon Sep 17 00:00:00 2001 +From: Qu Wenruo +Date: Thu, 22 Jun 2017 10:01:21 +0800 +Subject: btrfs: Remove false alert when fiemap range is smaller than on-disk extent + +From: Qu Wenruo + +commit 848c23b78fafdcd3270b06a30737f8dbd70c347f upstream. + +Commit 4751832da990 ("btrfs: fiemap: Cache and merge fiemap extent before +submit it to user") introduced a warning to catch unemitted cached +fiemap extent. + +However such warning doesn't take the following case into consideration: + +0 4K 8K +|<---- fiemap range --->| +|<----------- On-disk extent ------------------>| + +In this case, the whole 0~8K is cached, and since it's larger than +fiemap range, it break the fiemap extent emit loop. +This leaves the fiemap extent cached but not emitted, and caught by the +final fiemap extent sanity check, causing kernel warning. + +This patch removes the kernel warning and renames the sanity check to +emit_last_fiemap_cache() since it's possible and valid to have cached +fiemap extent. + +Reported-by: David Sterba +Reported-by: Adam Borowski +Fixes: 4751832da990 ("btrfs: fiemap: Cache and merge fiemap extent ...") +Signed-off-by: Qu Wenruo +Signed-off-by: David Sterba +Cc: Holger Hoffstätte +Signed-off-by: Greg Kroah-Hartman + +--- + fs/btrfs/extent_io.c | 28 ++++++++++++---------------- + 1 file changed, 12 insertions(+), 16 deletions(-) + +--- a/fs/btrfs/extent_io.c ++++ b/fs/btrfs/extent_io.c +@@ -4463,29 +4463,25 @@ try_submit_last: + } + + /* +- * Sanity check for fiemap cache ++ * Emit last fiemap cache + * +- * All fiemap cache should be submitted by emit_fiemap_extent() +- * Iteration should be terminated either by last fiemap extent or +- * fieinfo->fi_extents_max. +- * So no cached fiemap should exist. ++ * The last fiemap cache may still be cached in the following case: ++ * 0 4k 8k ++ * |<- Fiemap range ->| ++ * |<------------ First extent ----------->| ++ * ++ * In this case, the first extent range will be cached but not emitted. ++ * So we must emit it before ending extent_fiemap(). + */ +-static int check_fiemap_cache(struct btrfs_fs_info *fs_info, +- struct fiemap_extent_info *fieinfo, +- struct fiemap_cache *cache) ++static int emit_last_fiemap_cache(struct btrfs_fs_info *fs_info, ++ struct fiemap_extent_info *fieinfo, ++ struct fiemap_cache *cache) + { + int ret; + + if (!cache->cached) + return 0; + +- /* Small and recoverbale problem, only to info developer */ +-#ifdef CONFIG_BTRFS_DEBUG +- WARN_ON(1); +-#endif +- btrfs_warn(fs_info, +- "unhandled fiemap cache detected: offset=%llu phys=%llu len=%llu flags=0x%x", +- cache->offset, cache->phys, cache->len, cache->flags); + ret = fiemap_fill_next_extent(fieinfo, cache->offset, cache->phys, + cache->len, cache->flags); + cache->cached = false; +@@ -4701,7 +4697,7 @@ int extent_fiemap(struct inode *inode, s + } + out_free: + if (!ret) +- ret = check_fiemap_cache(root->fs_info, fieinfo, &cache); ++ ret = emit_last_fiemap_cache(root->fs_info, fieinfo, &cache); + free_extent_map(em); + out: + btrfs_free_path(path); diff --git a/queue-4.12/series b/queue-4.12/series index 81fc734a90f..aa6d8645db4 100644 --- a/queue-4.12/series +++ b/queue-4.12/series @@ -14,3 +14,4 @@ igmp-fix-regression-caused-by-igmp-sysctl-namespace-code.patch udp-consistently-apply-ufo-or-fragmentation.patch packet-fix-tp_reserve-race-in-packet_set_ring.patch scsi-sg-only-check-for-dxfer_len-greater-than-256m.patch +btrfs-remove-false-alert-when-fiemap-range-is-smaller-than-on-disk-extent.patch -- 2.47.3