From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Pankaj Raghav <p.raghav@samsung.com>,
Hannes Reinecke <hare@suse.de>,
"Darrick J . Wong" <djwong@kernel.org>,
Dave Chinner <dchinner@redhat.com>,
Daniel Gomez <da.gomez@samsung.com>,
Christian Brauner <brauner@kernel.org>,
Sasha Levin <sashal@kernel.org>,
linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: [PATCH AUTOSEL 6.10 14/70] iomap: fix iomap_dio_zero() for fs bs > system page size
Date: Fri, 4 Oct 2024 14:20:12 -0400 [thread overview]
Message-ID: <20241004182200.3670903-14-sashal@kernel.org> (raw)
In-Reply-To: <20241004182200.3670903-1-sashal@kernel.org>
From: Pankaj Raghav <p.raghav@samsung.com>
[ Upstream commit 10553a91652d995274da63fc317470f703765081 ]
iomap_dio_zero() will pad a fs block with zeroes if the direct IO size
< fs block size. iomap_dio_zero() has an implicit assumption that fs block
size < page_size. This is true for most filesystems at the moment.
If the block size > page size, this will send the contents of the page
next to zero page(as len > PAGE_SIZE) to the underlying block device,
causing FS corruption.
iomap is a generic infrastructure and it should not make any assumptions
about the fs block size and the page size of the system.
Signed-off-by: Pankaj Raghav <p.raghav@samsung.com>
Link: https://lore.kernel.org/r/20240822135018.1931258-7-kernel@pankajraghav.com
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Daniel Gomez <da.gomez@samsung.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
fs/iomap/buffered-io.c | 4 ++--
fs/iomap/direct-io.c | 45 ++++++++++++++++++++++++++++++++++++------
2 files changed, 41 insertions(+), 8 deletions(-)
diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index d465589902790..d505636035af3 100644
--- a/fs/iomap/buffered-io.c
+++ b/fs/iomap/buffered-io.c
@@ -1992,10 +1992,10 @@ iomap_writepages(struct address_space *mapping, struct writeback_control *wbc,
}
EXPORT_SYMBOL_GPL(iomap_writepages);
-static int __init iomap_init(void)
+static int __init iomap_buffered_init(void)
{
return bioset_init(&iomap_ioend_bioset, 4 * (PAGE_SIZE / SECTOR_SIZE),
offsetof(struct iomap_ioend, io_bio),
BIOSET_NEED_BVECS);
}
-fs_initcall(iomap_init);
+fs_initcall(iomap_buffered_init);
diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c
index f3b43d223a46e..c02b266bba525 100644
--- a/fs/iomap/direct-io.c
+++ b/fs/iomap/direct-io.c
@@ -11,6 +11,7 @@
#include <linux/iomap.h>
#include <linux/backing-dev.h>
#include <linux/uio.h>
+#include <linux/set_memory.h>
#include <linux/task_io_accounting_ops.h>
#include "trace.h"
@@ -27,6 +28,13 @@
#define IOMAP_DIO_WRITE (1U << 30)
#define IOMAP_DIO_DIRTY (1U << 31)
+/*
+ * Used for sub block zeroing in iomap_dio_zero()
+ */
+#define IOMAP_ZERO_PAGE_SIZE (SZ_64K)
+#define IOMAP_ZERO_PAGE_ORDER (get_order(IOMAP_ZERO_PAGE_SIZE))
+static struct page *zero_page;
+
struct iomap_dio {
struct kiocb *iocb;
const struct iomap_dio_ops *dops;
@@ -232,13 +240,20 @@ void iomap_dio_bio_end_io(struct bio *bio)
}
EXPORT_SYMBOL_GPL(iomap_dio_bio_end_io);
-static void iomap_dio_zero(const struct iomap_iter *iter, struct iomap_dio *dio,
+static int iomap_dio_zero(const struct iomap_iter *iter, struct iomap_dio *dio,
loff_t pos, unsigned len)
{
struct inode *inode = file_inode(dio->iocb->ki_filp);
- struct page *page = ZERO_PAGE(0);
struct bio *bio;
+ if (!len)
+ return 0;
+ /*
+ * Max block size supported is 64k
+ */
+ if (WARN_ON_ONCE(len > IOMAP_ZERO_PAGE_SIZE))
+ return -EINVAL;
+
bio = iomap_dio_alloc_bio(iter, dio, 1, REQ_OP_WRITE | REQ_SYNC | REQ_IDLE);
fscrypt_set_bio_crypt_ctx(bio, inode, pos >> inode->i_blkbits,
GFP_KERNEL);
@@ -246,8 +261,9 @@ static void iomap_dio_zero(const struct iomap_iter *iter, struct iomap_dio *dio,
bio->bi_private = dio;
bio->bi_end_io = iomap_dio_bio_end_io;
- __bio_add_page(bio, page, len, 0);
+ __bio_add_page(bio, zero_page, len, 0);
iomap_dio_submit_bio(iter, dio, bio, pos);
+ return 0;
}
/*
@@ -356,8 +372,10 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
if (need_zeroout) {
/* zero out from the start of the block to the write offset */
pad = pos & (fs_block_size - 1);
- if (pad)
- iomap_dio_zero(iter, dio, pos - pad, pad);
+
+ ret = iomap_dio_zero(iter, dio, pos - pad, pad);
+ if (ret)
+ goto out;
}
/*
@@ -431,7 +449,8 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
/* zero out from the end of the write to the end of the block */
pad = pos & (fs_block_size - 1);
if (pad)
- iomap_dio_zero(iter, dio, pos, fs_block_size - pad);
+ ret = iomap_dio_zero(iter, dio, pos,
+ fs_block_size - pad);
}
out:
/* Undo iter limitation to current extent */
@@ -753,3 +772,17 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
return iomap_dio_complete(dio);
}
EXPORT_SYMBOL_GPL(iomap_dio_rw);
+
+static int __init iomap_dio_init(void)
+{
+ zero_page = alloc_pages(GFP_KERNEL | __GFP_ZERO,
+ IOMAP_ZERO_PAGE_ORDER);
+
+ if (!zero_page)
+ return -ENOMEM;
+
+ set_memory_ro((unsigned long)page_address(zero_page),
+ 1U << IOMAP_ZERO_PAGE_ORDER);
+ return 0;
+}
+fs_initcall(iomap_dio_init);
--
2.43.0
next prev parent reply other threads:[~2024-10-04 18:22 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-04 18:19 [PATCH AUTOSEL 6.10 01/70] bpf: Call the missed btf_record_free() when map creation fails Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 02/70] selftests/bpf: Fix ARG_PTR_TO_LONG {half-,}uninitialized test Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 03/70] bpf: Fix a sdiv overflow issue Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 04/70] bpf: Check percpu map value size first Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 05/70] bpftool: Fix undefined behavior in qsort(NULL, 0, ...) Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 06/70] bpftool: Fix undefined behavior caused by shifting into the sign bit Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 07/70] s390/boot: Compile all files with the same march flag Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 08/70] s390/facility: Disable compile time optimization for decompressor code Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 09/70] s390/mm: Add cond_resched() to cmm_alloc/free_pages() Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 10/70] bpf, x64: Fix a jit convergence issue Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 11/70] ext4: fix i_data_sem unlock order in ext4_ind_migrate() Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 12/70] ext4: avoid use-after-free in ext4_ext_show_leaf() Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 13/70] ext4: ext4_search_dir should return a proper error Sasha Levin
2024-10-04 18:20 ` Sasha Levin [this message]
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 15/70] ext4: don't set SB_RDONLY after filesystem errors Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 16/70] ext4: nested locking for xattr inode Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 17/70] s390/cpum_sf: Remove WARN_ON_ONCE statements Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 18/70] s390/traps: Handle early warnings gracefully Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 19/70] bpf: Prevent tail call between progs attached to different hooks Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 20/70] ktest.pl: Avoid false positives with grub2 skip regex Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 21/70] RDMA/mad: Improve handling of timed out WRs of mad agent Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 22/70] soundwire: intel_bus_common: enable interrupts before exiting reset Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 23/70] PCI: Add function 0 DMA alias quirk for Glenfly Arise chip Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 24/70] RDMA/rtrs-srv: Avoid null pointer deref during path establishment Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 25/70] clk: bcm: bcm53573: fix OF node leak in init Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 26/70] PCI: Add ACS quirk for Qualcomm SA8775P Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 27/70] i2c: i801: Use a different adapter-name for IDF adapters Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 28/70] PCI: Mark Creative Labs EMU20k2 INTx masking as broken Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 29/70] i3c: master: cdns: Fix use after free vulnerability in cdns_i3c_master Driver Due to Race Condition Sasha Levin
2024-10-04 18:20 ` Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 30/70] RISC-V: Don't have MAX_PHYSMEM_BITS exceed phys_addr_t Sasha Levin
2024-10-04 18:20 ` Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 31/70] io_uring: check if we need to reschedule during overflow flush Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 32/70] ntb: ntb_hw_switchtec: Fix use after free vulnerability in switchtec_ntb_remove due to race condition Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 33/70] mfd: intel_soc_pmic_chtwc: Make Lenovo Yoga Tab 3 X90F DMI match less strict Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 34/70] riscv: Omit optimized string routines when using KASAN Sasha Levin
2024-10-04 18:20 ` Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 35/70] riscv: avoid Imbalance in RAS Sasha Levin
2024-10-04 18:20 ` Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 36/70] RDMA/mlx5: Enforce umem boundaries for explicit ODP page faults Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 37/70] PCI: qcom: Disable mirroring of DBI and iATU register space in BAR region Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 38/70] PCI: endpoint: Assign PCI domain number for endpoint controllers Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 39/70] soundwire: cadence: re-check Peripheral status with delayed_work Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 40/70] riscv/kexec_file: Fix relocation type R_RISCV_ADD16 and R_RISCV_SUB16 unknown Sasha Levin
2024-10-04 18:20 ` Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 41/70] media: videobuf2-core: clear memory related fields in __vb2_plane_dmabuf_put() Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 42/70] remoteproc: imx_rproc: Use imx specific hook for find_loaded_rsc_table Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 43/70] clk: imx: Remove CLK_SET_PARENT_GATE for DRAM mux for i.MX7D Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 44/70] fuse: allow O_PATH fd for FUSE_DEV_IOC_BACKING_OPEN Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 45/70] fuse: handle idmappings properly in ->write_iter() Sasha Levin
2024-10-07 10:05 ` Miklos Szeredi
2024-10-11 13:50 ` Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 46/70] serial: protect uart_port_dtr_rts() in uart_shutdown() too Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 47/70] usb: typec: tipd: Free IRQ only if it was requested before Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 48/70] usb: chipidea: udc: enable suspend interrupt after usb reset Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 49/70] usb: dwc2: Adjust the timing of USB Driver Interrupt Registration in the Crashkernel Scenario Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 50/70] xhci: dbc: Fix STALL transfer event handling Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 51/70] comedi: ni_routing: tools: Check when the file could not be opened Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 52/70] LoongArch: Fix memleak in pci_acpi_scan_root() Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 53/70] netfilter: nf_nat: don't try nat source port reallocation for reverse dir clash Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 54/70] netfilter: nf_reject: Fix build warning when CONFIG_BRIDGE_NETFILTER=n Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 55/70] virtio_pmem: Check device status before requesting flush Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 56/70] tools/iio: Add memory allocation failure check for trigger_name Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 57/70] staging: vme_user: added bound check to geoid Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 58/70] usb: gadget: uvc: Fix ERR_PTR dereference in uvc_v4l2.c Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 59/70] dm vdo: don't refer to dedupe_context after releasing it Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 60/70] driver core: bus: Fix double free in driver API bus_register() Sasha Levin
2024-10-04 18:20 ` [PATCH AUTOSEL 6.10 61/70] driver core: bus: Return -EIO instead of 0 when show/store invalid bus attribute Sasha Levin
2024-10-04 18:21 ` [PATCH AUTOSEL 6.10 62/70] scsi: lpfc: Add ELS_RSP cmd to the list of WQEs to flush in lpfc_els_flush_cmd() Sasha Levin
2024-10-04 18:21 ` [PATCH AUTOSEL 6.10 63/70] scsi: lpfc: Ensure DA_ID handling completion before deleting an NPIV instance Sasha Levin
2024-10-04 18:21 ` [PATCH AUTOSEL 6.10 64/70] scsi: lpfc: Revise TRACE_EVENT log flag severities from KERN_ERR to KERN_WARNING Sasha Levin
2024-10-04 18:21 ` [PATCH AUTOSEL 6.10 65/70] drm/xe/oa: Fix overflow in oa batch buffer Sasha Levin
2024-10-04 18:21 ` [PATCH AUTOSEL 6.10 66/70] drm/amdgpu: nuke the VM PD/PT shadow handling Sasha Levin
2024-10-04 18:21 ` [PATCH AUTOSEL 6.10 67/70] drm/amd/display: Check null pointer before dereferencing se Sasha Levin
2024-10-04 18:21 ` [PATCH AUTOSEL 6.10 68/70] fbcon: Fix a NULL pointer dereference issue in fbcon_putcs Sasha Levin
2024-10-04 18:21 ` [PATCH AUTOSEL 6.10 69/70] smb: client: fix UAF in async decryption Sasha Levin
2024-10-04 18:21 ` [PATCH AUTOSEL 6.10 70/70] fbdev: sisfb: Fix strbuf array overflow 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=20241004182200.3670903-14-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=brauner@kernel.org \
--cc=da.gomez@samsung.com \
--cc=dchinner@redhat.com \
--cc=djwong@kernel.org \
--cc=hare@suse.de \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=p.raghav@samsung.com \
--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 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.