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);