From: Sasha Levin <Alexander.Levin@microsoft.com>
To: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"stable@vger.kernel.org" <stable@vger.kernel.org>
Cc: Filipe Manana <fdmanana@suse.com>,
Sasha Levin <Alexander.Levin@microsoft.com>
Subject: [PATCH AUTOSEL for 3.18 32/53] Btrfs: send, fix file hole not being preserved due to inline extent
Date: Thu, 8 Mar 2018 05:03:20 +0000 [thread overview]
Message-ID: <20180308050230.8876-32-alexander.levin@microsoft.com> (raw)
In-Reply-To: <20180308050230.8876-1-alexander.levin@microsoft.com>
From: Filipe Manana <fdmanana@suse.com>
[ Upstream commit e1cbfd7bf6dabdac561c75d08357571f44040a45 ]
Normally we don't have inline extents followed by regular extents, but
there's currently at least one harmless case where this happens. For
example, when the page size is 4Kb and compression is enabled:
$ mkfs.btrfs -f /dev/sdb
$ mount -o compress /dev/sdb /mnt
$ xfs_io -f -c "pwrite -S 0xaa 0 4K" -c "fsync" /mnt/foobar
$ xfs_io -c "pwrite -S 0xbb 8K 4K" -c "fsync" /mnt/foobar
In this case we get a compressed inline extent, representing 4Kb of
data, followed by a hole extent and then a regular data extent. The
inline extent was not expanded/converted to a regular extent exactly
because it represents 4Kb of data. This does not cause any apparent
problem (such as the issue solved by commit e1699d2d7bf6
("btrfs: add missing memset while reading compressed inline extents"))
except trigger an unexpected case in the incremental send code path
that makes us issue an operation to write a hole when it's not needed,
resulting in more writes at the receiver and wasting space at the
receiver.
So teach the incremental send code to deal with this particular case.
The issue can be currently triggered by running fstests btrfs/137 with
compression enabled (MOUNT_OPTIONS="-o compress" ./check btrfs/137).
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
---
fs/btrfs/send.c | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
index fc2472ef5011..a7c4e2f205dd 100644
--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -4663,13 +4663,19 @@ static int is_extent_unchanged(struct send_ctx *sctx,
while (key.offset < ekey->offset + left_len) {
ei = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
right_type = btrfs_file_extent_type(eb, ei);
- if (right_type != BTRFS_FILE_EXTENT_REG) {
+ if (right_type != BTRFS_FILE_EXTENT_REG &&
+ right_type != BTRFS_FILE_EXTENT_INLINE) {
ret = 0;
goto out;
}
right_disknr = btrfs_file_extent_disk_bytenr(eb, ei);
- right_len = btrfs_file_extent_num_bytes(eb, ei);
+ if (right_type == BTRFS_FILE_EXTENT_INLINE) {
+ right_len = btrfs_file_extent_inline_len(eb, slot, ei);
+ right_len = PAGE_ALIGN(right_len);
+ } else {
+ right_len = btrfs_file_extent_num_bytes(eb, ei);
+ }
right_offset = btrfs_file_extent_offset(eb, ei);
right_gen = btrfs_file_extent_generation(eb, ei);
@@ -4683,6 +4689,19 @@ static int is_extent_unchanged(struct send_ctx *sctx,
goto out;
}
+ /*
+ * We just wanted to see if when we have an inline extent, what
+ * follows it is a regular extent (wanted to check the above
+ * condition for inline extents too). This should normally not
+ * happen but it's possible for example when we have an inline
+ * compressed extent representing data with a size matching
+ * the page size (currently the same as sector size).
+ */
+ if (right_type == BTRFS_FILE_EXTENT_INLINE) {
+ ret = 0;
+ goto out;
+ }
+
left_offset_fixed = left_offset;
if (key.offset < ekey->offset) {
/* Fix the right offset for 2a and 7. */
--
2.14.1
next prev parent reply other threads:[~2018-03-08 5:11 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-08 5:03 [PATCH AUTOSEL for 3.18 01/53] usb: gadget: dummy_hcd: Fix wrong power status bit clear/reset in dummy_hub_control() Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 02/53] perf session: Don't rely on evlist in pipe mode Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 03/53] scsi: sg: check for valid direction before starting the request Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 04/53] scsi: sg: close race condition in sg_remove_sfp_usercontext() Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 05/53] kprobes/x86: Fix kprobe-booster not to boost far call instructions Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 06/53] kprobes/x86: Set kprobes pages read-only Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 07/53] wil6210: fix memory access violation in wil_memcpy_from/toio_32 Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 08/53] platform/x86: asus-nb-wmi: Add wapf4 quirk for the X302UA Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 09/53] x86: i8259: export legacy_pic symbol Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 10/53] Input: ar1021_i2c - fix too long name in driver's device table Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 12/53] cpufreq/sh: Replace racy task affinity logic Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 11/53] ACPI/processor: " Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 14/53] i2c: i2c-scmi: add a MS HID Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 13/53] genirq: Use irqd_get_trigger_type to compare the trigger type for shared IRQs Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 16/53] [media] media/dvb-core: Race condition when writing to CAM Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 15/53] net: ipv6: send unsolicited NA on admin up Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 17/53] spi: dw: Disable clock after unregistering the host Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 18/53] ath: Fix updating radar flags for coutry code India Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 19/53] scsi: virtio_scsi: Always try to read VPD pages Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 20/53] KVM: PPC: Book3S PR: Exit KVM on failed mapping Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 21/53] tcp: remove poll() flakes with FastOpen Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 22/53] e1000e: fix timing for 82579 Gigabit Ethernet controller Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 23/53] ALSA: hda - Fix headset microphone detection for ASUS N551 and N751 Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 24/53] IB/ipoib: Update broadcast object if PKey value was changed in index 0 Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 25/53] HSI: ssi_protocol: double free in ssip_pn_xmit() Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 27/53] mmc: host: omap_hsmmc: checking for NULL instead of IS_ERR() Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 26/53] Fix driver usage of 128B WQEs when WQ_CREATE is V1 Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 28/53] wan: pc300too: abort path on failure Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 29/53] qlcnic: fix unchecked return value Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 30/53] scsi: mac_esp: Replace bogus memory barrier with spinlock Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 31/53] rndis_wlan: add return value validation Sasha Levin
2018-03-08 5:03 ` Sasha Levin [this message]
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 33/53] mac80211: don't parse encrypted management frames in ieee80211_frame_acked Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 34/53] mfd: palmas: Reset the POWERHOLD mux during power off Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 36/53] ipmi/watchdog: fix wdog hang on panic waiting for ipmi response Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 35/53] ARM: DRA7: clockdomain: Change the CLKTRCTRL of CM_PCIE_CLKSTCTRL to SW_WKUP Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 37/53] bnx2x: Align RX buffers Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 38/53] power: supply: pda_power: move from timer to delayed_work Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 39/53] md/raid10: skip spare disk as 'first' disk Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 40/53] ia64: fix module loading for gcc-5.4 Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 41/53] video: fbdev: udlfb: Fix buffer on stack Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 42/53] sm501fb: don't return zero on failure path in sm501fb_start() Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 44/53] drm/msm: fix leak in failed get_pages Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 43/53] cifs: small underflow in cnvrtDosUnixTm() Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 45/53] media: bt8xx: Fix err 'bt878_probe()' Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 46/53] media: [RESEND] media: dvb-frontends: Add delay to Si2168 restart Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 48/53] IB/ipoib: Avoid memory leak if the SA returns a different DGID Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 47/53] mmc: avoid removing non-removable hosts during suspend Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 51/53] drm/omap: DMM: Check for DMM readiness after successful transaction commit Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 49/53] RDMA/cma: Use correct size when writing netlink stats Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 50/53] vgacon: Set VGA struct resource types Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 52/53] pinctrl: Really force states during suspend/resume Sasha Levin
2018-03-08 5:03 ` [PATCH AUTOSEL for 3.18 53/53] clk: si5351: Rename internal plls to avoid name collisions Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180308050230.8876-32-alexander.levin@microsoft.com \
--to=alexander.levin@microsoft.com \
--cc=fdmanana@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®