--- /dev/null
+From hoeppner@linux.ibm.com Tue Aug 27 15:13:30 2024
+From: "Jan Höppner" <hoeppner@linux.ibm.com>
+Date: Tue, 20 Aug 2024 16:13:07 +0200
+Subject: Revert "s390/dasd: Establish DMA alignment"
+To: gregkh@linuxfoundation.org
+Cc: stable@vger.kernel.org, sth@linux.ibm.com
+Message-ID: <20240820141307.2869182-1-hoeppner@linux.ibm.com>
+
+From: "Jan Höppner" <hoeppner@linux.ibm.com>
+
+This reverts commit bc792884b76f ("s390/dasd: Establish DMA alignment").
+
+Quoting the original commit:
+ linux-next commit bf8d08532bc1 ("iomap: add support for dma aligned
+ direct-io") changes the alignment requirement to come from the block
+ device rather than the block size, and the default alignment
+ requirement is 512-byte boundaries. Since DASD I/O has page
+ alignments for IDAW/TIDAW requests, let's override this value to
+ restore the expected behavior.
+
+I mentioned TIDAW, but that was wrong. TIDAWs have no distinct alignment
+requirement (per p. 15-70 of POPS SA22-7832-13):
+
+ Unless otherwise specified, TIDAWs may designate
+ a block of main storage on any boundary and length
+ up to 4K bytes, provided the specified block does not
+ cross a 4 K-byte boundary.
+
+IDAWs do, but the original commit neglected that while ECKD DASD are
+typically formatted in 4096-byte blocks, they don't HAVE to be. Formatting
+an ECKD volume with smaller blocks is permitted (dasdfmt -b xxx), and the
+problematic commit enforces alignment properties to such a device that
+will result in errors, such as:
+
+ [test@host ~]# lsdasd -l a367 | grep blksz
+ blksz: 512
+ [test@host ~]# mkfs.xfs -f /dev/disk/by-path/ccw-0.0.a367-part1
+ meta-data=/dev/dasdc1 isize=512 agcount=4, agsize=230075 blks
+ = sectsz=512 attr=2, projid32bit=1
+ = crc=1 finobt=1, sparse=1, rmapbt=1
+ = reflink=1 bigtime=1 inobtcount=1 nrext64=1
+ data = bsize=4096 blocks=920299, imaxpct=25
+ = sunit=0 swidth=0 blks
+ naming =version 2 bsize=4096 ascii-ci=0, ftype=1
+ log =internal log bsize=4096 blocks=16384, version=2
+ = sectsz=512 sunit=0 blks, lazy-count=1
+ realtime =none extsz=4096 blocks=0, rtextents=0
+ error reading existing superblock: Invalid argument
+ mkfs.xfs: pwrite failed: Invalid argument
+ libxfs_bwrite: write failed on (unknown) bno 0x70565c/0x100, err=22
+ mkfs.xfs: Releasing dirty buffer to free list!
+ found dirty buffer (bulk) on free list!
+ mkfs.xfs: pwrite failed: Invalid argument
+ ...snipped...
+
+The original commit omitted the FBA discipline for just this reason,
+but the formatted block size of the other disciplines was overlooked.
+The solution to all of this is to revert to the original behavior,
+such that the block size can be respected.
+
+But what of the original problem? That was manifested with a direct-io
+QEMU guest, where QEMU itself was changed a month or two later with
+commit 25474d90aa ("block: use the request length for iov alignment")
+such that the blamed kernel commit is unnecessary.
+
+Note: This is an adapted version of the original upstream commit
+2a07bb64d801 ("s390/dasd: Remove DMA alignment").
+
+Cc: stable@vger.kernel.org # 6.0+
+Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/s390/block/dasd_diag.c | 1 -
+ drivers/s390/block/dasd_eckd.c | 1 -
+ 2 files changed, 2 deletions(-)
+
+--- a/drivers/s390/block/dasd_diag.c
++++ b/drivers/s390/block/dasd_diag.c
+@@ -639,7 +639,6 @@ static void dasd_diag_setup_blk_queue(st
+ /* With page sized segments each segment can be translated into one idaw/tidaw */
+ blk_queue_max_segment_size(q, PAGE_SIZE);
+ blk_queue_segment_boundary(q, PAGE_SIZE - 1);
+- blk_queue_dma_alignment(q, PAGE_SIZE - 1);
+ }
+
+ static int dasd_diag_pe_handler(struct dasd_device *device,
+--- a/drivers/s390/block/dasd_eckd.c
++++ b/drivers/s390/block/dasd_eckd.c
+@@ -6888,7 +6888,6 @@ static void dasd_eckd_setup_blk_queue(st
+ /* With page sized segments each segment can be translated into one idaw/tidaw */
+ blk_queue_max_segment_size(q, PAGE_SIZE);
+ blk_queue_segment_boundary(q, PAGE_SIZE - 1);
+- blk_queue_dma_alignment(q, PAGE_SIZE - 1);
+ }
+
+ static struct ccw_driver dasd_eckd_driver = {