Re: [PATCH v6 15/18] s390/dasd: Detect ESE volumes from the on-disk format label
[email protected] Sat, 01 Aug 2026 11:38:35 +0000
| Newsgroups | org.kernel.vger.linux-s390 |
|---|---|
| Message-ID | <[email protected]> |
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider: New issues: - [Medium] The in-memory ESE label cache (`private->ese_label_valid`) is not invalidated when track 0 is formatted without an ESE label, leaving the driver with a stale ESE state that no longer matches the physical disk. Pre-existing issues: - [High] Fatal NULL pointer dereference in `dasd_release_space()` for devices whose discipline lacks the `is_ese` method (e.g., FBA or DIAG devices). -- --- Patch [15]: [PATCH v6 15/18] s390/dasd: Detect ESE volumes from the on-disk format label --- commit d17ebb7bd94d36c62afdabb020d82a8a18a64bba Author: Stefan Haberland <[email protected]> Subject: s390/dasd: Detect ESE volumes from the on-disk format label This commit updates the DASD driver to detect Extent Space Efficient (ESE) volumes by reading the format label from track 0 during device bring-up. It caches this label and derives the ESE status from it, allowing volumes copied from ESE storage to maintain their thin-provisioned handling on different hardware. > diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c > index ebffb3364c33c..35a970e006fd0 100644 > --- a/drivers/s390/block/dasd_eckd.c > +++ b/drivers/s390/block/dasd_eckd.c [ ... ] > @@ -3224,23 +3353,35 @@ static int dasd_eckd_format_device(struct dasd_device *base, > struct dasd_eckd_private *private = base->private; > int rc; > > rc = dasd_eckd_format_process_data(base, fdata, enable_pav, 0, NULL, > 0, NULL); > + if (fdata->start_unit != 0) > + return rc; > + > + if (rc) { > + /* > + * The format failed, so the label cached speculatively during > + * CCW build may not match the disk; drop it so is_ese() falls > + * back to the hardware field until the next successful format > + * or bring-up. > + */ > + private->ese_label_valid = false; > + return rc; > + } [Severity: Medium] When track 0 is formatted, what happens if no ESE label is written? If a user issues the BIODASDFMT ioctl with start_unit == 0 and a non-CDL layout (e.g., intensity & 0x08 == 0), dasd_eckd_build_format() might not write a new label. The physical label on track 0 is then zeroed or destroyed by the format. However, dasd_eckd_format_device() only clears private->ese_label_valid on failure. Could this regression leave the driver using a stale ESE state that no longer matches the physical disk after a successful format? [ ... ] > @@ -4241,6 +4382,14 @@ static int dasd_eckd_release_space_trks(struct dasd_device *device, > static int dasd_eckd_release_space(struct dasd_device *device, > struct format_data_t *rdata) > { > + /* > + * Space release (and thus a quick format) requires real ESE hardware. > + * is_ese() may be true from a copied label on non-ESE hardware, so gate > + * on the hardware capability, not on is_ese(). > + */ > + if (!dasd_eckd_ese_capable(device)) > + return -EOPNOTSUPP; > + [Severity: High] This isn't a bug introduced by this patch, but does the ioctl path for space release have a NULL pointer dereference for devices without an is_ese method? In drivers/s390/block/dasd_ioctl.c, dasd_release_space() contains this check: if (!device->discipline->is_ese && !device->discipline->is_ese(device)) return -ENOTSUPP; Since it uses a logical AND (&&) instead of OR (||), if the discipline (e.g., FBA or DIAG) lacks the is_ese method, the first operand evaluates to true. Will this force the evaluation of the second operand, immediately dereferencing the NULL function pointer when a user issues the BIODASDRAS ioctl? > if (rdata->intensity & DASD_FMT_INT_ESE_FULL) > return dasd_eckd_release_space_full(device); -- Sashiko AI review ยท https://sashiko.dev/#/patchset/[email protected]?part=15