]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.12-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Aug 2017 21:05:56 +0000 (14:05 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Aug 2017 21:05:56 +0000 (14:05 -0700)
added patches:
btrfs-remove-false-alert-when-fiemap-range-is-smaller-than-on-disk-extent.patch

queue-4.12/btrfs-remove-false-alert-when-fiemap-range-is-smaller-than-on-disk-extent.patch [new file with mode: 0644]
queue-4.12/series

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 (file)
index 0000000..bbffa33
--- /dev/null
@@ -0,0 +1,92 @@
+From 848c23b78fafdcd3270b06a30737f8dbd70c347f Mon Sep 17 00:00:00 2001
+From: Qu Wenruo <quwenruo@cn.fujitsu.com>
+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 <quwenruo@cn.fujitsu.com>
+
+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 <dsterba@suse.cz>
+Reported-by: Adam Borowski <kilobyte@angband.pl>
+Fixes: 4751832da990 ("btrfs: fiemap: Cache and merge fiemap extent ...")
+Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
+Signed-off-by: David Sterba <dsterba@suse.com>
+Cc: Holger Hoffstätte <holger@applied-asynchrony.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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);
index 81fc734a90f0668d67b64af76a14e9d5aa0343b7..aa6d8645db43a09768a287dcfffdae3e19ef01f7 100644 (file)
@@ -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