]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 21 Feb 2019 12:35:51 +0000 (13:35 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 21 Feb 2019 12:35:51 +0000 (13:35 +0100)
added patches:
btrfs-remove-false-alert-when-fiemap-range-is-smaller-than-on-disk-extent.patch

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

diff --git a/queue-4.9/btrfs-remove-false-alert-when-fiemap-range-is-smaller-than-on-disk-extent.patch b/queue-4.9/btrfs-remove-false-alert-when-fiemap-range-is-smaller-than-on-disk-extent.patch
new file mode 100644 (file)
index 0000000..a483ceb
--- /dev/null
@@ -0,0 +1,91 @@
+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>
+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 ace384169beaa1a1095ea177332b82ade06aa69b..f0e519ca6f004caf0199ebfd67fc9fed7af9bd2f 100644 (file)
@@ -14,4 +14,5 @@ tcp-clear-icsk_backoff-in-tcp_write_queue_purge.patch
 vxlan-test-dev-flags-iff_up-before-calling-netif_rx.patch
 net-stmmac-fix-a-race-in-eee-enable-callback.patch
 net-ipv4-use-a-dedicated-counter-for-icmp_v4-redirect-packets.patch
+btrfs-remove-false-alert-when-fiemap-range-is-smaller-than-on-disk-extent.patch
 x86-livepatch-treat-r_x86_64_plt32-as-r_x86_64_pc32.patch