]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
s390/dasd: Copy detected format information to secondary device
authorStefan Haberland <sth@linux.ibm.com>
Tue, 10 Mar 2026 14:23:30 +0000 (15:23 +0100)
committerJens Axboe <axboe@kernel.dk>
Tue, 10 Mar 2026 14:58:38 +0000 (08:58 -0600)
During online processing for a DASD device an IO operation is started to
determine the format of the device. CDL format contains specifically
sized blocks at the beginning of the disk.

For a PPRC secondary device no real IO operation is possible therefore
this IO request can not be started and this step is skipped for online
processing of secondary devices. This is generally fine since the
secondary is a copy of the primary device.

In case of an additional partition detection that is run after a swap
operation the format information is needed to properly drive partition
detection IO.

Currently the information is not passed leading to IO errors during
partition detection and a wrongly detected partition table which in turn
might lead to data corruption on the disk with the wrong partition table.

Fix by passing the format information from primary to secondary device.

Fixes: 413862caad6f ("s390/dasd: add copy pair swap capability")
Cc: stable@vger.kernel.org #6.1
Reviewed-by: Jan Hoeppner <hoeppner@linux.ibm.com>
Acked-by: Eduard Shishkin <edward6@linux.ibm.com>
Signed-off-by: Stefan Haberland <sth@linux.ibm.com>
Link: https://patch.msgid.link/20260310142330.4080106-3-sth@linux.ibm.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/s390/block/dasd_eckd.c

index e8f0e302a625baa2997699116bd9eed862c71078..c0f665a2929d9f6e2f0e5bb5b6ee59baab3cb77b 100644 (file)
@@ -6135,6 +6135,7 @@ static void copy_pair_set_active(struct dasd_copy_relation *copy, char *new_busi
 static int dasd_eckd_copy_pair_swap(struct dasd_device *device, char *prim_busid,
                                    char *sec_busid)
 {
+       struct dasd_eckd_private *prim_priv, *sec_priv;
        struct dasd_device *primary, *secondary;
        struct dasd_copy_relation *copy;
        struct dasd_block *block;
@@ -6155,6 +6156,9 @@ static int dasd_eckd_copy_pair_swap(struct dasd_device *device, char *prim_busid
        if (!secondary)
                return DASD_COPYPAIRSWAP_SECONDARY;
 
+       prim_priv = primary->private;
+       sec_priv = secondary->private;
+
        /*
         * usually the device should be quiesced for swap
         * for paranoia stop device and requeue requests again
@@ -6187,6 +6191,13 @@ static int dasd_eckd_copy_pair_swap(struct dasd_device *device, char *prim_busid
                dasd_device_remove_stop_bits(primary, DASD_STOPPED_QUIESCE);
        }
 
+       /*
+        * The secondary device never got through format detection, but since it
+        * is a copy of the primary device, the format is exactly the same;
+        * therefore, the detected layout can simply be copied.
+        */
+       sec_priv->uses_cdl = prim_priv->uses_cdl;
+
        /* re-enable device */
        dasd_device_remove_stop_bits(primary, DASD_STOPPED_PPRC);
        dasd_device_remove_stop_bits(secondary, DASD_STOPPED_PPRC);