File s390-tools-sles15sp5-dasdfmt-Fall-back-to-full-format-if-space-release-fa.patch of Package s390-tools.30305

---
 dasdfmt/dasdfmt.8 |   11 ++++++++---
 dasdfmt/dasdfmt.c |   23 ++++++++++++++++++-----
 2 files changed, 26 insertions(+), 8 deletions(-)

--- a/dasdfmt/dasdfmt.8
+++ b/dasdfmt/dasdfmt.8
@@ -128,12 +128,17 @@ Specify the \fImode\fR to be used to for
 .IP full
 Format the entire disk with the specified blocksize. (default)
 .IP quick
-Format the first two tracks and write label and partition information. Only use
-this option if you are sure that the target DASD already contains a regular
+Format the first two tracks and write label and partition information. Use this
+option only if you are sure that the target DASD already contains a regular
 format with the specified blocksize. A blocksize can optionally be specified
 using \fB-b\fR (\fB--blocksize\fR).
 .br
-For thin-provisioned DASD ESE volumes this is the default mode.
+For thin-provisioned DASD ESE volumes, quick is the default mode. A full space
+release then precedes the formatting step. If this space release fails, dasdfmt
+falls back to a full-format  mode. Formatting stops if the space release fails
+and quick mode was specified explicitly using \fB-M\fR. Specify the
+\fB--no-discard\fR option to omit the space release.
+
 .IP expand
 Format all unformatted tracks at the end of the target DASD. This mode assumes
 that tracks at the beginning of the DASD volume have already been correctly
--- a/dasdfmt/dasdfmt.c
+++ b/dasdfmt/dasdfmt.c
@@ -1267,7 +1267,7 @@ static void dasdfmt_find_start(unsigned
 	format_params->start_unit = first;
 }
 
-static void dasdfmt_release_space(void)
+static int dasdfmt_release_space(void)
 {
 	format_data_t r = {
 		.start_unit = 0,
@@ -1277,12 +1277,21 @@ static void dasdfmt_release_space(void)
 	int err = 0;
 
 	if (!g.ese || g.no_discard)
-		return;
+		return 0;
 
 	printf("Releasing space for the entire %s device...\n", g.dev_path);
 	err = dasd_release_space(g.dev_node, &r);
-	if (err)
+	/*
+	 * Warn or Error on failing RAS depending on QUICK mode set explicitly or automatically
+	 */
+	if (err && !g.mode_specified) {
+		warnx("Could not release space. Falling back to full format.");
+		return 1;
+	} else if (err && g.mode_specified) {
 		error("Could not release space: %s", strerror(err));
+	}
+
+	return 0;
 }
 
 static void dasdfmt_prepare_and_format(unsigned int cylinders, unsigned int heads,
@@ -1483,8 +1492,12 @@ static void do_format_dasd(volume_label_
 			dasdfmt_prepare_and_format(cylinders, heads, p);
 			break;
 		case QUICK:
-			dasdfmt_release_space();
-			dasdfmt_quick_format(cylinders, heads, p);
+			if (dasdfmt_release_space()) {
+				p->stop_unit  = (cylinders * heads) - 1;
+				dasdfmt_prepare_and_format(cylinders, heads, p);
+			} else {
+				dasdfmt_quick_format(cylinders, heads, p);
+			}
 			break;
 		case EXPAND:
 			dasdfmt_expand_format(cylinders, heads, p);
openSUSE Build Service is sponsored by