From nobody Wed Oct 15 22:45:57 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 28822174EE5; Sun, 24 Mar 2024 23:35:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711323335; cv=none; b=FybbMggsRgxpFkPJ/fAgM2HE6bTxUTFDDvOKhIOJKvYq/89sIVi6Iae2nztRO9Sg4TrGbDYypyjD8cTi7yKeSiYsvtleYhi1330J7UlBdnlNJxlcuevfK3AvKDLhGCp+ZPV9UYpavmbEwGB5S9ONVnGnoTzmpHJ6oiAVdIlfFVE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711323335; c=relaxed/simple; bh=dU5rKxIRdpARhzb/iQNx1mD2zTtGGTT1rLng1T61/JY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Zj1XY8O4aDIw9AQiVPeWJulTY/JVjEtJnCMu8uDUOpa7qO20KZpZRUmfXO4UvwddMYnj78eBJVtOvGvWiL+0Tl2hJa/jz4viywSJdjFjy/zLQcwFktQofNtHpmSbsjFnzGLEusGhTaNl0iDBOQkHhVuxUfOUsfSIBVzxWSFkCo8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RhrCD2cp; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="RhrCD2cp" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 13016C43390; Sun, 24 Mar 2024 23:35:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1711323333; bh=dU5rKxIRdpARhzb/iQNx1mD2zTtGGTT1rLng1T61/JY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RhrCD2cpwgrBMBsTURsOmmhuJ1hjqufXoVGhkPBAE1VA0Bi36+3JLNKFTOU0IX63G W/6VHyzwRC7a2dB/PvG7wZYvRS1mv7Kj0TBOORC3EUnRhwkIbWQ3WSkmx3kSImO4YM X/4KR2zLr4sUWLCVmPr9dSN4LoOl568dX80cjre8hskyfbBYfImKsXu8ghOXt3AAtq 829aMLfaor6pbj0/TXMVCM9NU8HMY66MN+sNd4cPVOQTpl/HZX6oh0fBROUuJdJg+5 ldC+eVJjKCct2j/+RpTOUaE7aBtSi71fBYtxbndCV0tHERcJIrSqXm6r8+Mm8l9ebk Y97xiEqOyJWBw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Stefan Haberland , Jan Hoeppner , Jens Axboe , Sasha Levin Subject: [PATCH 5.15 034/317] s390/dasd: add query PPRC function Date: Sun, 24 Mar 2024 19:30:14 -0400 Message-ID: <20240324233458.1352854-35-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240324233458.1352854-1-sashal@kernel.org> References: <20240324233458.1352854-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Stefan Haberland [ Upstream commit 3f217cceb6846e7533511fc69bc774cdba37ff7d ] Add function to query the Peer-to-Peer-Remote-Copy (PPRC) state of a device by reading the related structure through a read subsystem data call. Signed-off-by: Stefan Haberland Reviewed-by: Jan Hoeppner Link: https://lore.kernel.org/r/20220920192616.808070-3-sth@linux.ibm.com Signed-off-by: Jens Axboe Stable-dep-of: c3116e62ddef ("s390/dasd: fix double module refcount decreme= nt") Signed-off-by: Sasha Levin --- drivers/s390/block/dasd_eckd.c | 66 ++++++++++++++++++++++++++++++++++ drivers/s390/block/dasd_eckd.h | 6 ++++ drivers/s390/block/dasd_int.h | 32 +++++++++++++++++ 3 files changed, 104 insertions(+) diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index cf80db7a74a3d..76f861c2ce614 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c @@ -6105,6 +6105,71 @@ static int dasd_hosts_print(struct dasd_device *devi= ce, struct seq_file *m) return 0; } =20 +/* + * Perform Subsystem Function - Peer-to-Peer Remote Copy Extended Query + */ +static int dasd_eckd_query_pprc_status(struct dasd_device *device, + struct dasd_pprc_data_sc4 *data) +{ + struct dasd_pprc_data_sc4 *pprc_data; + struct dasd_psf_prssd_data *prssdp; + struct dasd_ccw_req *cqr; + struct ccw1 *ccw; + int rc; + + cqr =3D dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */ + 1 /* RSSD */, + sizeof(*prssdp) + sizeof(*pprc_data) + 1, + device, NULL); + if (IS_ERR(cqr)) { + DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", + "Could not allocate query PPRC status request"); + return PTR_ERR(cqr); + } + cqr->startdev =3D device; + cqr->memdev =3D device; + cqr->block =3D NULL; + cqr->retries =3D 256; + cqr->expires =3D 10 * HZ; + + /* Prepare for Read Subsystem Data */ + prssdp =3D (struct dasd_psf_prssd_data *)cqr->data; + memset(prssdp, 0, sizeof(struct dasd_psf_prssd_data)); + prssdp->order =3D PSF_ORDER_PRSSD; + prssdp->suborder =3D PSF_SUBORDER_PPRCEQ; + prssdp->varies[0] =3D PPRCEQ_SCOPE_4; + pprc_data =3D (struct dasd_pprc_data_sc4 *)(prssdp + 1); + + ccw =3D cqr->cpaddr; + ccw->cmd_code =3D DASD_ECKD_CCW_PSF; + ccw->count =3D sizeof(struct dasd_psf_prssd_data); + ccw->flags |=3D CCW_FLAG_CC; + ccw->flags |=3D CCW_FLAG_SLI; + ccw->cda =3D (__u32)(addr_t)prssdp; + + /* Read Subsystem Data - query host access */ + ccw++; + ccw->cmd_code =3D DASD_ECKD_CCW_RSSD; + ccw->count =3D sizeof(*pprc_data); + ccw->flags |=3D CCW_FLAG_SLI; + ccw->cda =3D (__u32)(addr_t)pprc_data; + + cqr->buildclk =3D get_tod_clock(); + cqr->status =3D DASD_CQR_FILLED; + + rc =3D dasd_sleep_on_interruptible(cqr); + if (rc =3D=3D 0) { + *data =3D *pprc_data; + } else { + DBF_EVENT_DEVID(DBF_WARNING, device->cdev, + "PPRC Extended Query failed with rc=3D%d\n", + rc); + rc =3D -EOPNOTSUPP; + } + + dasd_sfree_request(cqr, cqr->memdev); + return rc; +} + /* * Perform Subsystem Function - CUIR response */ @@ -6723,6 +6788,7 @@ static struct dasd_discipline dasd_eckd_discipline = =3D { .ext_pool_exhaust =3D dasd_eckd_ext_pool_exhaust, .ese_format =3D dasd_eckd_ese_format, .ese_read =3D dasd_eckd_ese_read, + .pprc_status =3D dasd_eckd_query_pprc_status, }; =20 static int __init diff --git a/drivers/s390/block/dasd_eckd.h b/drivers/s390/block/dasd_eckd.h index 65e4630ad2aea..ed83a9a55191b 100644 --- a/drivers/s390/block/dasd_eckd.h +++ b/drivers/s390/block/dasd_eckd.h @@ -66,9 +66,15 @@ * Perform Subsystem Function / Sub-Orders */ #define PSF_SUBORDER_QHA 0x1C /* Query Host Access */ +#define PSF_SUBORDER_PPRCEQ 0x50 /* PPRC Extended Query */ #define PSF_SUBORDER_VSQ 0x52 /* Volume Storage Query */ #define PSF_SUBORDER_LCQ 0x53 /* Logical Configuration Query */ =20 +/* + * PPRC Extended Query Scopes + */ +#define PPRCEQ_SCOPE_4 0x04 /* Scope 4 for PPRC Extended Query */ + /* * CUIR response condition codes */ diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h index d94ae067f085e..2ee8bc035b34a 100644 --- a/drivers/s390/block/dasd_int.h +++ b/drivers/s390/block/dasd_int.h @@ -260,6 +260,37 @@ struct dasd_uid { char vduit[33]; }; =20 +/* + * PPRC Status data + */ +struct dasd_pprc_header { + __u8 entries; /* 0 Number of device entries */ + __u8 unused; /* 1 unused */ + __u16 entry_length; /* 2-3 Length of device entry */ + __u32 unused2; /* 4-7 unused */ +} __packed; + +struct dasd_pprc_dev_info { + __u8 state; /* 0 Copy State */ + __u8 flags; /* 1 Flags */ + __u8 reserved1[2]; /* 2-3 reserved */ + __u8 prim_lss; /* 4 Primary device LSS */ + __u8 primary; /* 5 Primary device address */ + __u8 sec_lss; /* 6 Secondary device LSS */ + __u8 secondary; /* 7 Secondary device address */ + __u16 pprc_id; /* 8-9 Peer-to-Peer Remote Copy ID */ + __u8 reserved2[12]; /* 10-21 reserved */ + __u16 prim_cu_ssid; /* 22-23 Pimary Control Unit SSID */ + __u8 reserved3[12]; /* 24-35 reserved */ + __u16 sec_cu_ssid; /* 36-37 Secondary Control Unit SSID */ + __u8 reserved4[90]; /* 38-127 reserved */ +} __packed; + +struct dasd_pprc_data_sc4 { + struct dasd_pprc_header header; + struct dasd_pprc_dev_info dev_info[5]; +} __packed; + /* * the struct dasd_discipline is * sth like a table of virtual functions, if you think of dasd_eckd @@ -388,6 +419,7 @@ struct dasd_discipline { struct dasd_ccw_req *(*ese_format)(struct dasd_device *, struct dasd_ccw_req *, struct irb *); int (*ese_read)(struct dasd_ccw_req *, struct irb *); + int (*pprc_status)(struct dasd_device *, struct dasd_pprc_data_sc4 *); }; =20 extern struct dasd_discipline *dasd_diag_discipline_pointer; --=20 2.43.0