From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Jia Guo <guojia12@huawei.com>,
Yiwen Jiang <jiangyiwen@huawei.com>,
Mark Fasheh <mark@fasheh.com>, Joel Becker <jlbec@evilplan.org>,
Junxiao Bi <junxiao.bi@oracle.com>,
Joseph Qi <joseph.qi@huawei.com>,
Andrew Morton <akpm@linux-foundation.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Sasha Levin <sashal@kernel.org>
Subject: [PATCH AUTOSEL 4.14 42/56] ocfs2: clear zero in unaligned direct IO
Date: Fri, 18 Oct 2019 18:07:39 -0400 [thread overview]
Message-ID: <20191018220753.10002-42-sashal@kernel.org> (raw)
In-Reply-To: <20191018220753.10002-1-sashal@kernel.org>
From: Jia Guo <guojia12@huawei.com>
[ Upstream commit 7a243c82ea527cd1da47381ad9cd646844f3b693 ]
Unused portion of a part-written fs-block-sized block is not set to zero
in unaligned append direct write.This can lead to serious data
inconsistencies.
Ocfs2 manage disk with cluster size(for example, 1M), part-written in
one cluster will change the cluster state from UN-WRITTEN to WRITTEN,
VFS(function dio_zero_block) doesn't do the cleaning because bh's state
is not set to NEW in function ocfs2_dio_wr_get_block when we write a
WRITTEN cluster. For example, the cluster size is 1M, file size is 8k
and we direct write from 14k to 15k, then 12k~14k and 15k~16k will
contain dirty data.
We have to deal with two cases:
1.The starting position of direct write is outside the file.
2.The starting position of direct write is located in the file.
We need set bh's state to NEW in the first case. In the second case, we
need mapped twice because bh's state of area out file should be set to
NEW while area in file not.
[akpm@linux-foundation.org: coding style fixes]
Link: http://lkml.kernel.org/r/5292e287-8f1a-fd4a-1a14-661e555e0bed@huawei.com
Signed-off-by: Jia Guo <guojia12@huawei.com>
Reviewed-by: Yiwen Jiang <jiangyiwen@huawei.com>
Cc: Mark Fasheh <mark@fasheh.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Junxiao Bi <junxiao.bi@oracle.com>
Cc: Joseph Qi <joseph.qi@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
fs/ocfs2/aops.c | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c
index 99550f4bd159a..ebeec7530cb60 100644
--- a/fs/ocfs2/aops.c
+++ b/fs/ocfs2/aops.c
@@ -2151,13 +2151,30 @@ static int ocfs2_dio_wr_get_block(struct inode *inode, sector_t iblock,
struct ocfs2_dio_write_ctxt *dwc = NULL;
struct buffer_head *di_bh = NULL;
u64 p_blkno;
- loff_t pos = iblock << inode->i_sb->s_blocksize_bits;
+ unsigned int i_blkbits = inode->i_sb->s_blocksize_bits;
+ loff_t pos = iblock << i_blkbits;
+ sector_t endblk = (i_size_read(inode) - 1) >> i_blkbits;
unsigned len, total_len = bh_result->b_size;
int ret = 0, first_get_block = 0;
len = osb->s_clustersize - (pos & (osb->s_clustersize - 1));
len = min(total_len, len);
+ /*
+ * bh_result->b_size is count in get_more_blocks according to write
+ * "pos" and "end", we need map twice to return different buffer state:
+ * 1. area in file size, not set NEW;
+ * 2. area out file size, set NEW.
+ *
+ * iblock endblk
+ * |--------|---------|---------|---------
+ * |<-------area in file------->|
+ */
+
+ if ((iblock <= endblk) &&
+ ((iblock + ((len - 1) >> i_blkbits)) > endblk))
+ len = (endblk - iblock + 1) << i_blkbits;
+
mlog(0, "get block of %lu at %llu:%u req %u\n",
inode->i_ino, pos, len, total_len);
@@ -2241,6 +2258,9 @@ static int ocfs2_dio_wr_get_block(struct inode *inode, sector_t iblock,
if (desc->c_needs_zero)
set_buffer_new(bh_result);
+ if (iblock > endblk)
+ set_buffer_new(bh_result);
+
/* May sleep in end_io. It should not happen in a irq context. So defer
* it to dio work queue. */
set_buffer_defer_completion(bh_result);
--
2.20.1
next prev parent reply other threads:[~2019-10-18 22:14 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-18 22:06 [f2fs-dev] [PATCH AUTOSEL 4.14 01/56] f2fs: flush quota blocks after turnning it off Sasha Levin
2019-10-18 22:06 ` Sasha Levin
2019-10-18 22:06 ` [PATCH AUTOSEL 4.14 02/56] scsi: lpfc: Fix a duplicate 0711 log message number Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 03/56] sc16is7xx: Fix for "Unexpected interrupt: 8" Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 04/56] powerpc/powernv: hold device_hotplug_lock when calling memtrace_offline_pages() Sasha Levin
2019-10-18 22:07 ` Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 05/56] HID: i2c-hid: add Direkt-Tek DTLAPY133-1 to descriptor override Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 06/56] x86/cpu: Add Atom Tremont (Jacobsville) Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 07/56] HID: i2c-hid: Add Odys Winbook 13 to descriptor override Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 08/56] clk: boston: unregister clks on failure in clk_boston_setup() Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 09/56] scripts/setlocalversion: Improve -dirty check with git-status --no-optional-locks Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 10/56] HID: Add ASUS T100CHI keyboard dock battery quirks Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 11/56] usb: handle warm-reset port requests on hub resume Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 12/56] rtc: pcf8523: set xtal load capacitance from DT Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 13/56] mlxsw: spectrum: Set LAG port collector only when active Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 14/56] ALSA: hda/realtek - Apply ALC294 hp init also for S4 resume Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 15/56] media: vimc: Remove unused but set variables Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 16/56] exec: load_script: Do not exec truncated interpreter path Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 17/56] PCI/PME: Fix possible use-after-free on remove Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 18/56] power: supply: max14656: fix potential use-after-free Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 19/56] iio: adc: meson_saradc: Fix memory allocation order Sasha Levin
2019-10-18 22:07 ` Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 20/56] iio: fix center temperature of bmc150-accel-core Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 21/56] libsubcmd: Make _FORTIFY_SOURCE defines dependent on the feature Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 22/56] perf tests: Avoid raising SEGV using an obvious NULL dereference Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 23/56] perf map: Fix overlapped map handling Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 24/56] perf jevents: Fix period for Intel fixed counters Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 25/56] staging: rtl8188eu: fix null dereference when kzalloc fails Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 26/56] crypto: arm/aes-ce - add dependency on AES library Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 27/56] RDMA/hfi1: Prevent memory leak in sdma_init Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 28/56] RDMA/iwcm: Fix a lock inversion issue Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 29/56] HID: hyperv: Use in-place iterator API in the channel callback Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 30/56] nfs: Fix nfsi->nrequests count error on nfs_inode_remove_request Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 31/56] arm64: ftrace: Ensure synchronisation in PLT setup for Neoverse-N1 #1542419 Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 32/56] tty: serial: owl: Fix the link time qualifier of 'owl_uart_exit()' Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 33/56] tty: n_hdlc: fix build on SPARC Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 34/56] gpio: max77620: Use correct unit for debounce times Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 35/56] fs: cifs: mute -Wunused-const-variable message Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 36/56] serial: mctrl_gpio: Check for NULL pointer Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 37/56] efi/cper: Fix endianness of PCIe class code Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 38/56] efi/x86: Do not clean dummy variable in kexec path Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 39/56] kbuild: fix build error of 'make nsdeps' in clean tree Sasha Levin
2019-10-19 0:13 ` Masahiro Yamada
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 40/56] MIPS: include: Mark __cmpxchg as __always_inline Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 41/56] x86/xen: Return from panic notifier Sasha Levin
2019-10-18 22:07 ` Sasha Levin [this message]
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 43/56] fs: ocfs2: fix possible null-pointer dereferences in ocfs2_xa_prepare_entry() Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 44/56] fs: ocfs2: fix a possible null-pointer dereference in ocfs2_write_end_nolock() Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 45/56] fs: ocfs2: fix a possible null-pointer dereference in ocfs2_info_scan_inode_alloc() Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 46/56] sched/vtime: Fix guest/system mis-accounting on task switch Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 47/56] perf/x86/amd: Change/fix NMI latency mitigation to use a timestamp Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 48/56] iio: adc: ad799x: fix probe error handling Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 49/56] iio: light: opt3001: fix mutex unlock race Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 50/56] MIPS: include: Mark __xchg as __always_inline Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 51/56] MIPS: fw: sni: Fix out of bounds init of o32 stack Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 52/56] USB: usb-skeleton: fix use-after-free after driver unbind Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 53/56] nbd: fix possible sysfs duplicate warning Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 54/56] NFSv4: Fix leak of clp->cl_acceptor string Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 55/56] s390/uaccess: avoid (false positive) compiler warnings Sasha Levin
2019-10-18 22:07 ` [PATCH AUTOSEL 4.14 56/56] tracing: Initialize iter->seq after zeroing in tracing_read_pipe() 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=20191018220753.10002-42-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=guojia12@huawei.com \
--cc=jiangyiwen@huawei.com \
--cc=jlbec@evilplan.org \
--cc=joseph.qi@huawei.com \
--cc=junxiao.bi@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mark@fasheh.com \
--cc=stable@vger.kernel.org \
--cc=torvalds@linux-foundation.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.