forked from pool/s390-tools
7e8b34210d
- Upgraded to version 2.15.1. (bsc#1178250, jsc#SLE-13663) - Added s390-tools-sles15sp3-dasdfmt-Fix-segfault-when-an-incorrect-option-is-spe.patch (bsc#1178313). When specifying an incorrect program option, dasdfmt segfaults as the format string for the corresponding error message has no parameter. - Added s390-tools-sles15sp3-libutil-Compare-proc-entries-to-vfstype.patch (bsc#1178315). The fdasd command was failing if sysfs was mounted this way: mount -t sysfs none /sys To make sure that the mount point of the sysfs is still found when mounted with a device keyword specified other than 'sysfs', check for the filesystem type instead, which is more specific. - Added the following patches for bsc#1178427, and jsc#SLE-13768, Log DASD info for endpoint security * s390-tools-sles15sp3-01-zdev-Add-FC-Endpoint-Security-information-for-DASD-d.patch * s390-tools-sles15sp3-02-lsdasd-Add-FC-Endpoint-Security-information.patch - Added the following patch for bsc#1178628 and jsc#SLE-13765, Converged HiperSockets/Ethernet Interface * s390-tools-sles15sp3-hsci-Add-new-tool-to-control-HiperSockets-Converged-.patch - Added the following patches for bsc#1178992 and jsc#SLE-13772, Add host-key document verification support to genprotimg. * s390-tools-sles15sp3-01-genprotimg-abort-if-one-of-the-recursive-targets-is-.patch * s390-tools-sles15sp3-02-genprotimg-fix-two-memory-leaks.patch * s390-tools-sles15sp3-03-genprotimg-require-argument-for-ramdisk-and-parmfile.patch * s390-tools-sles15sp3-04-genprotimg-add-host-key-document-verification-suppor.patch - Added the following patch for bsc#1178734. Running zcryptstats when many domains are available per cryto card does not produce any output, and is hanging in a loop. * s390-tools-sles15sp3-zcryptstats-Fix-handling-of-partial-results-with-man.patch - Reworked and renamed the following patches to accommodate changes made by IBM to the structure of the dasdfmt command. * s390-tools-sles15-Allow-multiple-device-arguments.patch renamed to s390-tools-sles15sp3-Allow-multiple-device-arguments.patch. * s390-tools-sles15-Format-devices-in-parallel.patch renamed to s390-tools-sles15sp3-Format-devices-in-parallel.patch * dasdfmt-retry-BIODASDINFO-if-device-is-busy.patch renamed to s390-tools-sles15sp3-dasdfmt-retry-BIODASDINFO-if-device-is-busy.patch * s390-tools-sles15-Implement-f-for-backwards-compability.patch renamed to s390-tools-sles15-Implement-Y-yast_mode.patch - Upgraded to version 2.15.0 (jsc#SLE-13662, jsc#SLE-13663, jsc#SLE-13667, jsc#SLE-13724, jsc#SLE-13728, jsc#SLE-13730, jsc#SLE-13739, jsc#SLE-13744, jsc#SLE-13751, jsc#SLE-13755, jsc#SLE-13765, jsc#SLE-13768, jsc#SLE-13777, jsc#SLE-13814, jsc#SLE-13819, jsc#SLE-13820) - Reworked s390-tools-sles12-sysconfig-compatible-dumpconf.patch to fit the current version and renamed it to s390-tools-sles15-sysconfig-compatible-dumpconf.patch - Removed the following obsolete patches: * s390-tools-sles15sp2-01-zkey-Separate-and-rework-CCA-host-library-loading.patch * s390-tools-sles15sp2-02-zkey-Move-utility-functions-into-separate-source-fil.patch * s390-tools-sles15sp2-03-zkey-Add-utility-function-to-get-the-serial-number-o.patch * s390-tools-sles15sp2-04-zkey-Add-utility-function-to-get-the-mkvp-of-a-crypt.patch * s390-tools-sles15sp2-05-zkey-add-function-to-iterate-over-all-available-CCA-.patch * s390-tools-sles15sp2-06-zkey-Add-function-to-print-the-MKVPs-of-APQNs.patch * s390-tools-sles15sp2-07-zkey-Add-function-to-cross-check-APQNs-for-valid-mas.patch * s390-tools-sles15sp2-08-zkey-Add-function-to-obtain-the-mkvp-of-a-secure-key.patch * s390-tools-sles15sp2-09-zkey-Display-MKVP-when-validating-a-secure-key.patch * s390-tools-sles15sp2-10-zkey-Cross-check-APQNs-when-generating-secure-keys.patch * s390-tools-sles15sp2-11-zkey-Cross-check-APQNs-when-validating-secure-keys.patch * s390-tools-sles15sp2-12-zkey-Cross-check-APQNs-when-importing-secure-keys.patch * s390-tools-sles15sp2-13-zkey-Cross-check-APQNs-when-changing-APQN-associatio.patch * s390-tools-sles15sp2-14-zkey-Add-function-to-select-a-specific-CCA-adapter.patch * s390-tools-sles15sp2-15-zkey-Add-function-to-select-a-CCA-adapter-by-mkvp.patch * s390-tools-sles15sp2-16-zkey-Select-CCA-adapter-when-re-enciphering.patch * s390-tools-sles15sp2-17-zkey-cryptsetup-Add-to-new-and-from-old-options.patch * s390-tools-sles15sp2-18-zkey-Display-key-type-with-list-and-validate-command.patch * s390-tools-sles15sp2-19-zkey-Allow-to-filter-list-output-by-key-type.patch * s390-tools-sles15sp2-20-zkey-Allow-to-specify-the-key-type-with-the-generate.patch * s390-tools-sles15sp2-21-zkey-Preparations-for-introducing-a-new-key-type.patch * s390-tools-sles15sp2-22-zkey-Introduce-the-CCA-AESCIPHER-key-type.patch * s390-tools-sles15sp2-23-zkey-Add-wrappers-for-the-new-IOCTLs-with-fallback-t.patch * s390-tools-sles15sp2-24-zkey-Add-helper-functions-to-build-lists-of-APQNs.patch * s390-tools-sles15sp2-25-zkey-Add-support-for-generating-AES-CIPHER-keys.patch * s390-tools-sles15sp2-26-zkey-Add-support-for-validating-AES-CIPHER-keys.patch * s390-tools-sles15sp2-27-zkey-Add-support-for-re-enciphering-AES-CIPHER-keys.patch * s390-tools-sles15sp2-28-zkey-Check-crypto-card-level-during-APQN-cross-check.patch * s390-tools-sles15sp2-29-zkey-Add-helper-function-to-query-the-CCA-firmware-v.patch * s390-tools-sles15sp2-30-zkey-Add-helper-function-to-convert-secure-keys-betw.patch * s390-tools-sles15sp2-31-zkey-Add-helper-function-to-restrict-export-of-secur.patch * s390-tools-sles15sp2-32-zkey-Add-helper-function-to-check-an-AES-CIPHER-key.patch * s390-tools-sles15sp2-33-zkey-Add-key-checks-when-importing-a-CCA-AESCIPHER-k.patch * s390-tools-sles15sp2-34-zkey-Add-convert-command-to-convert-keys-from-one-ty.patch * s390-tools-sles15sp2-35-zkey-Allow-zkey-cryptsetup-setkey-to-set-different-k.patch * s390-tools-sles15sp2-zcrypt-CEX7S-exploitation-support.patch * s390-tools-sles15sp2-zcryptstats-Add-support-for-CEX7.patch * s390-tools-sles15sp2-zkey-Fix-listing-of-keys-on-file-systems-reporting-D.patch * s390-tools-sles15sp2-zkey-Fix-display-of-clear-key-size-for-XTS-keys.patch * s390-tools-sles15sp2-zkey-Fix-display-of-XTS-attribute-for-validate-comma.patch * s390-tools-sles15sp2-zkey-Fix-display-of-clear-key-size-for-CCA-AESCIPHER.patch * s390-tools-sles15sp2-01-zipl-libc-Introduce-vsnprintf.patch * s390-tools-sles15sp2-02-zipl-libc-Fix-potential-buffer-overflow-in-printf.patch * s390-tools-sles15sp2-03-zipl-libc-Replace-sprintf-with-snprintf.patch * s390-tools-sles15sp2-04-zipl-libc-Indicate-truncated-lines-in-printf-with.patch * s390-tools-sles15sp2-01-zpcictl-Initiate-recover-after-reset.patch * s390-tools-sles15sp2-02-zpcictl-Rename-misleading-sysfs_write_data.patch * s390-tools-sles15sp2-03-zpcitctl-Exit-on-error-in-sysfs_report_error.patch * s390-tools-sles15sp2-01-zipl-fix-Wdiscarded-qualifiers.patch * s390-tools-sles15sp2-02-zipl-fix-Waddress-of-packed-member.patch * s390-tools-sles15sp2-03-zipl-remove-some-useless-__packed___-attributes.patch * s390-tools-sles15sp2-04-zipl-Fix-entry-point-for-stand-alone-kdump.patch * s390-tools-sles15sp2-05-zipl-Fix-dependency-generation-in-zipl-boot.patch * s390-tools-sles15sp2-06-zipl-Make-use-of-__packed-macro.patch * s390-tools-sles15sp2-07-zipl-define-__section-macro-and-make-use-of-it.patch * s390-tools-sles15sp2-08-zipl-Make-use-of-__noreturn-macro.patch * s390-tools-sles15sp2-09-zipl-Define-__noinline-macro-and-make-use-of-it.patch * s390-tools-sles15sp2-10-zipl-stage3-Mark-start_kernel-__noreturn.patch * s390-tools-sles15sp2-11-zipl-sclp-Remove-duplicate-macros.patch * s390-tools-sles15sp2-12-zipl-Make-address-size-mask-macros-UL.patch * s390-tools-sles15sp2-13-zipl-libc-Use-stdint.h-instead-of-self-defined-macro.patch * s390-tools-sles15sp2-14-zipl-Consolidate-IMAGE-macros.patch * s390-tools-sles15sp2-15-zipl-Consolidate-STAGE-2-3-macros.patch * s390-tools-sles15sp2-16-zipl-stfle-use-uint64_t-instead-of-u64.patch * s390-tools-sles15sp2-17-zipl-boot-fix-comment-in-stage3.lds.patch * s390-tools-sles15sp2-18-lib-zt_common-add-STATIC_ASSERT-macro.patch * s390-tools-sles15sp2-19-zipl-use-STATIC_ASSERT-macro-for-no-padding-verifica.patch * s390-tools-sles15sp2-20-Support-lib-zt_common.h-to-be-used-in-assembler-and-.patch * s390-tools-sles15sp2-21-zipl-move-IPL-related-definitions-into-separate-head.patch * s390-tools-sles15sp2-22-zipl-move-SIGP-related-functions-and-definitions-int.patch * s390-tools-sles15sp2-23-zipl-add-SIGP_SET_ARCHITECTURE-to-sigp.h-and-use-it.patch * s390-tools-sles15sp2-24-zipl-stage3-make-IPL_DEVICE-definition-consistent-wi.patch * s390-tools-sles15sp2-25-zipl-move-Linux-layout-definitions-into-separate-hea.patch * s390-tools-sles15sp2-26-zipl-tape0-use-constants-defined-in-linux_layout.h.patch * s390-tools-sles15sp2-27-zipl-use-STAGE3_ENTRY-for-STAGE3_LOAD_ADDRESS.patch * s390-tools-sles15sp2-28-zipl-move-loaders-layout-definitions-into-separate-h.patch * s390-tools-sles15sp2-29-zipl-s390.h-rename-inline-macro-into-__always_inline.patch * s390-tools-sles15sp2-30-zipl-move-__always_inline-barrier-__pa32-pa-to-zt_co.patch * s390-tools-sles15sp2-31-zipl-make-BLK_PWRT-unsigned-int.patch * s390-tools-sles15sp2-32-Consolidate-MIN-and-MAX-macros.patch * s390-tools-sles15sp2-33-zipl-remove-libc.h-include-in-s390.h.patch * s390-tools-sles15sp2-34-zipl-move-s390.h-to-include-boot-s390.h.patch * s390-tools-sles15sp2-35-zipl-libc-include-s390.h.patch * s390-tools-sles15sp2-36-include-boot-s390.h-move-panic-and-panic_notify-to-l.patch * s390-tools-sles15sp2-37-include-boot-s390.h-fixes-for-Werror-sign-conversion.patch * s390-tools-sles15sp2-38-zipl-refactor-all-EBCDIC-code-into-separate-files.patch * s390-tools-sles15sp2-39-zipl-sclp-add-macros-for-the-control-program-masks.patch * s390-tools-sles15sp2-40-zipl-sclp-add-sclp_print_ascii.patch * s390-tools-sles15sp2-41-zipl-libc-printf-print-on-linemode-and-ASCII-console.patch * s390-tools-sles15sp2-42-Consolidate-ALIGN-__ALIGN_MASK-ARRAY_SIZE-macros.patch * s390-tools-sles15sp2-43-genprotimg-boot-initial-bootloader-support.patch * s390-tools-sles15sp2-44-genprotimg-boot-use-C-pre-processor-for-linker-scrip.patch * s390-tools-sles15sp2-45-genprotimg-add-relocator-for-stage3b.patch * s390-tools-sles15sp2-46-README.md-remove-useless-empty-line.patch * s390-tools-sles15sp2-47-include-boot-s390.h-add-guard-for-struct-__vector128.patch * s390-tools-sles15sp2-48-genprotimg-introduce-new-tool-for-the-creation-of-PV.patch * s390-tools-sles15sp2-01-zipl-Add-missing-options-to-help-output.patch * s390-tools-sles15sp2-02-zipl-allow-stand-alone-secure-option-on-command-l.patch * s390-tools-sles15sp2-03-zipl-correct-secure-boot-config-handling.patch * s390-tools-sles15sp2-04-zipl-fix-zipl.conf-man-page-example-for-secure-boot.patch * s390-tools-sles15sp2-01-cpumf-add-new-deflate-counters-for-z15.patch * s390-tools-sles15sp2-vmcp-exit-code.patch * s390-tools-sles15sp2-zipl-prevent-endless-loop-during-IPL.patch * s390-tools-sles15sp2-zipl-check-for-valid-ipl-parmblock-lowcore-pointer.patch * s390-tools-sles15sp2-01-zipl-libc-libc_stop-move-noreturn-to-declaration.patch * s390-tools-sles15sp2-02-zipl-stage3-correctly-handle-diag308-response-code.patch * s390-tools-sles15sp2-lsluns-try-harder-to-find-udevadm.patch * s390-tools-sles15sp2-znetconf-introduce-better-ways-to-locate-udevadm.patch * s390-tools-sles15sp2-mon_tools-update-udevadm-location.patch * s390-tools-sles15sp2-lscpumf-change-dflt-ccerror-counter-name.patch * s390-tools-sles15sp2-01-zdev-Introduce-read-only-attributes.patch * s390-tools-sles15sp2-02-zdev-Handle-special-case-in-if-case.patch * s390-tools-sles15sp2-03-zdev-Report-FC-Endpoint-Security-of-zfcp-devices.patch * s390-tools-sles15sp2-04-zfcpdbf-print-HBA-FC-Endpoint-Security-trace-records.patch * s390-tools-sles15sp1-zdev-Also-include-the-ctc-driver-in-the-initrd.patch not in spec file * s390-tools-sles15sp2-Close-file-descriptor-when-checking-for-read-only.patch not in spec file - Added s390-tools-sles15sp2-lscpumf-change-dflt-ccerror-counter-name.patch (bsc#1176508) lscpumf displays counter number 265 as DFLT_CCERROR. This is wrong and differs from the counter name as defined in the Linux kernel version 5.8 and later. - Added the following patches to implement the post-GA feature jsc#ECO-2636 Log FCP link info for endpoint security (bsc#1175477) * s390-tools-sles15sp2-01-zdev-Introduce-read-only-attributes.patch * s390-tools-sles15sp2-02-zdev-Handle-special-case-in-if-case.patch * s390-tools-sles15sp2-03-zdev-Report-FC-Endpoint-Security-of-zfcp-devices.patch * s390-tools-sles15sp2-04-zfcpdbf-print-HBA-FC-Endpoint-Security-trace-records.patch OBS-URL: https://build.opensuse.org/request/show/854117 OBS-URL: https://build.opensuse.org/package/show/Base:System/s390-tools?expand=0&rev=101
474 lines
15 KiB
Diff
474 lines
15 KiB
Diff
From d6582bbaf0f3986a42f562046dc0caa9de89c75e Mon Sep 17 00:00:00 2001
|
|
From: Hannes Reinecke <hare@suse.de>
|
|
Date: Fri, 6 Oct 2017 08:58:17 +0200
|
|
Subject: [PATCH] dasdfmt: Allow multiple device arguments
|
|
|
|
Allow the user to specify several devices as arguments to dasdfmt.
|
|
|
|
Signed-off-by: Hannes Reinecke <hare@suse.com>
|
|
---
|
|
dasdfmt/dasdfmt.8 | 5 +-
|
|
dasdfmt/dasdfmt.c | 175 ++++++++++++++++++++++++++++++------------------------
|
|
2 files changed, 100 insertions(+), 80 deletions(-)
|
|
|
|
diff --git a/dasdfmt/dasdfmt.8 b/dasdfmt/dasdfmt.8
|
|
index 99da9ed..e7fc501 100644
|
|
--- a/dasdfmt/dasdfmt.8
|
|
+++ b/dasdfmt/dasdfmt.8
|
|
@@ -11,14 +11,15 @@ dasdfmt \- formatting of DASD (ECKD) disk drives.
|
|
.br
|
|
[-r \fIcylinder\fR] [-b \fIblksize\fR] [-l \fIvolser\fR] [-d \fIlayout\fR]
|
|
.br
|
|
- [-L] [-V] [-F] [-k] [-C] [-M \fImode\fR] \fIdevice\fR
|
|
+ [-L] [-V] [-F] [-k] [-C] [-M \fImode\fR] \fIdevice\fR [\fIdevice\fR]
|
|
|
|
.SH DESCRIPTION
|
|
-\fBdasdfmt\fR formats a DASD (ECKD) disk drive to prepare it
|
|
+\fBdasdfmt\fR formats one or several DASD (ECKD) disk drive to prepare it
|
|
for usage with Linux for S/390.
|
|
The \fIdevice\fR is the node of the device (e.g. '/dev/dasda').
|
|
Any device node created by udev for kernel 2.6 can be used
|
|
(e.g. '/dev/dasd/0.0.b100/disc').
|
|
+It is possible to specify up to 512 devices.
|
|
.br
|
|
|
|
\fBWARNING\fR: Careless usage of \fBdasdfmt\fR can result in
|
|
--- s390-tools-2.15.1/dasdfmt/dasdfmt.c 2020-10-30 20:43:30.853044638 +0000
|
|
+++ s390-tools-2.15.1/dasdfmt/dasdfmt.c 2020-11-17 23:38:56.457778633 +0000
|
|
@@ -25,6 +25,8 @@
|
|
|
|
#include "dasdfmt.h"
|
|
|
|
+#define MAX_DEVICES 512
|
|
+#define MAX_LENGTH 256
|
|
#define BUSIDSIZE 8
|
|
#define SEC_PER_DAY (60 * 60 * 24)
|
|
#define SEC_PER_HOUR (60 * 60)
|
|
@@ -57,7 +59,9 @@
|
|
static struct dasdfmt_globals {
|
|
dasd_information2_t dasd_info;
|
|
char *dev_path; /* device path entered by user */
|
|
+ char dev_path_array[MAX_DEVICES][MAX_LENGTH]; /* Array of device paths entered by user */
|
|
char *dev_node; /* reliable device node determined by dasdfmt */
|
|
+ char dev_node_array[MAX_DEVICES][MAX_LENGTH]; /* Array of reliable device nodes determined by dasdfmt */
|
|
int verbosity;
|
|
int testmode;
|
|
int withoutprompt;
|
|
@@ -484,15 +488,15 @@
|
|
program_interrupt_in_progress = 1;
|
|
|
|
if (disk_disabled) {
|
|
- printf("Re-accessing the device...\n");
|
|
+ printf("Re-accessing %s...\n", g.dev_path);
|
|
disk_enable();
|
|
}
|
|
|
|
- printf("Rereading the partition table...\n");
|
|
+ printf("Rereading the partition table for %s...\n", g.dev_path);
|
|
rc = dasd_reread_partition_table(g.dev_node, 5);
|
|
if (rc) {
|
|
ERRMSG("%s: (signal handler) Re-reading partition table "
|
|
- "failed. (%s)\n", prog_name, strerror(rc));
|
|
+ "for %s failed. (%s)\n", prog_name, g.dev_path, strerror(rc));
|
|
} else {
|
|
printf("Exiting...\n");
|
|
}
|
|
@@ -512,9 +516,6 @@
|
|
unsigned int maj, min;
|
|
struct stat dev_stat;
|
|
|
|
- if (optind + 1 < argc)
|
|
- error("More than one device specified!");
|
|
-
|
|
if (optind >= argc)
|
|
error("No device specified!");
|
|
|
|
@@ -610,10 +611,10 @@
|
|
error("the ioctl call to retrieve read/write status information failed: %s",
|
|
strerror(err));
|
|
if (ro)
|
|
- error("Disk is read only!");
|
|
+ error("Disk %s is read only!", g.dev_path);
|
|
if (!g.force) {
|
|
if (g.dasd_info.open_count > 1)
|
|
- error("Disk in use!");
|
|
+ error("Disk %s is in use!", g.dev_path);
|
|
}
|
|
if (strncmp(g.dasd_info.type, "ECKD", 4) != 0) {
|
|
warnx("Unsupported disk type");
|
|
@@ -700,7 +701,7 @@
|
|
struct dasd_eckd_characteristics *characteristics;
|
|
|
|
if (g.verbosity > 0)
|
|
- printf("Retrieving disk geometry...\n");
|
|
+ printf("Retrieving disk geometry for %s...\n", g.dev_path);
|
|
|
|
characteristics = (struct dasd_eckd_characteristics *)
|
|
&g.dasd_info.characteristics;
|
|
@@ -728,13 +729,13 @@
|
|
"Cylinders above this limit will not be"
|
|
" accessible as a linux partition!\n"
|
|
"Type \"yes\" to continue, no will leave"
|
|
- " the disk untouched: ", LV_COMPAT_CYL);
|
|
+ " the %s disk untouched: ", LV_COMPAT_CYL, g.dev_path);
|
|
if (fgets(inp_buffer, sizeof(inp_buffer), stdin) == NULL)
|
|
return;
|
|
if (strcasecmp(inp_buffer, "yes") &&
|
|
strcasecmp(inp_buffer, "yes\n")) {
|
|
- printf("Omitting ioctl call (disk will "
|
|
- "NOT be formatted).\n");
|
|
+ printf("Omitting ioctl call (disk %s will "
|
|
+ "NOT be formatted).\n", g.dev_path);
|
|
return;
|
|
}
|
|
}
|
|
@@ -872,7 +873,7 @@
|
|
check_params->start_unit = 0;
|
|
check_params->stop_unit = (cylinders * heads) - 1;
|
|
|
|
- printf("Checking format of the entire disk...\n");
|
|
+ printf("Checking format of the entire %s disk...\n", g.dev_path);
|
|
|
|
if (g.testmode) {
|
|
printf("Test mode active, omitting ioctl.\n");
|
|
@@ -896,7 +897,7 @@
|
|
if (process_tracks(cylinders, heads, check_params))
|
|
error("Use --mode=full to perform a clean format.");
|
|
|
|
- printf("Done. Disk is fine.\n");
|
|
+ printf("Done. Disk %s is fine.\n", g.dev_path);
|
|
}
|
|
|
|
/*
|
|
@@ -946,8 +947,8 @@
|
|
|
|
printf("Device Type: %s Provisioned\n",
|
|
g.ese ? "Thinly" : "Fully");
|
|
- printf("\nI am going to format the device ");
|
|
- printf("%s in the following way:\n", g.dev_path);
|
|
+ printf("\nI am going to format %s ", g.dev_path);
|
|
+ printf("in the following way:\n");
|
|
printf(" Device number of device : 0x%x\n", g.dasd_info.devno);
|
|
printf(" Labelling device : %s\n",
|
|
(g.writenolabel) ? "no" : "yes");
|
|
@@ -1012,7 +1013,7 @@
|
|
int ipl1_record_len, ipl2_record_len;
|
|
|
|
if (g.verbosity > 0)
|
|
- printf("Retrieving dasd information... ");
|
|
+ printf("Retrieving dasd information for %s... ", g.dev_path);
|
|
|
|
get_blocksize(&blksize);
|
|
|
|
@@ -1030,7 +1031,7 @@
|
|
|
|
/* write empty bootstrap (initial IPL records) */
|
|
if (g.verbosity > 0)
|
|
- printf("Writing empty bootstrap...\n");
|
|
+ printf("Writing empty bootstrap to %s...\n", g.dev_path);
|
|
|
|
/*
|
|
* Note: ldl labels do not contain the key field
|
|
@@ -1089,7 +1090,7 @@
|
|
label_position = g.dasd_info.label_block * blksize;
|
|
|
|
if (g.verbosity > 0)
|
|
- printf("Writing label...\n");
|
|
+ printf("Writing label to %s...\n", g.dev_path);
|
|
|
|
rc = lseek(fd, label_position, SEEK_SET);
|
|
if (rc != label_position) {
|
|
@@ -1120,7 +1121,7 @@
|
|
}
|
|
|
|
if (g.verbosity > 0)
|
|
- printf("Writing VTOC... ");
|
|
+ printf("Writing VTOC to %s... ", g.dev_path);
|
|
|
|
label_position = (VTOC_START_CC * heads + VTOC_START_HH) *
|
|
geo.sectors * blksize;
|
|
@@ -1242,7 +1243,7 @@
|
|
if (!g.ese || g.no_discard)
|
|
return;
|
|
|
|
- printf("Releasing space for the entire device...\n");
|
|
+ printf("Releasing space for the entire %s device...\n", g.dev_path);
|
|
err = dasd_release_space(g.dev_node, &r);
|
|
if (err)
|
|
error("Could not release space: %s", strerror(err));
|
|
@@ -1261,20 +1262,21 @@
|
|
int err;
|
|
|
|
if (!(g.withoutprompt && g.verbosity < 1))
|
|
- printf("Formatting the device. This may take a while "
|
|
- "(get yourself a coffee).\n");
|
|
+ printf("Formatting the %s device. This may take a while "
|
|
+ "(get yourself a coffee).\n", g.dev_path);
|
|
|
|
if (g.verbosity > 0)
|
|
- printf("Detaching the device...\n");
|
|
+ printf("Detaching the %s device...\n", g.dev_path);
|
|
|
|
disk_disable(g.dev_node);
|
|
|
|
if (g.verbosity > 0)
|
|
- printf("Invalidate first track...\n");
|
|
+ printf("Invalidate first track on %s...\n", g.dev_path);
|
|
|
|
err = dasd_format_disk(filedes, &temp);
|
|
if (err != 0)
|
|
- error("(invalidate first track) IOCTL BIODASDFMT failed: %s", strerror(err));
|
|
+ error("(invalidate first track) IOCTL BIODASDFMT failed for %s: %s",
|
|
+ g.dev_path, strerror(err));
|
|
|
|
/* except track 0 from standard formatting procss */
|
|
p->start_unit = 1;
|
|
@@ -1282,19 +1284,19 @@
|
|
process_tracks(cylinders, heads, p);
|
|
|
|
if (g.verbosity > 0)
|
|
- printf("formatting tracks complete...\n");
|
|
+ printf("formatting tracks for %s complete...\n", g.dev_path);
|
|
|
|
temp.intensity = p->intensity;
|
|
|
|
if (g.verbosity > 0)
|
|
- printf("Revalidate first track...\n");
|
|
+ printf("Revalidate first track on %s...\n", g.dev_path);
|
|
|
|
err = dasd_format_disk(filedes, &temp);
|
|
if (err != 0)
|
|
error("(re-validate first track) IOCTL BIODASDFMT failed: %s", strerror(err));
|
|
|
|
if (g.verbosity > 0)
|
|
- printf("Re-accessing the device...\n");
|
|
+ printf("Re-accessing the %s device...\n", g.dev_path);
|
|
|
|
disk_enable();
|
|
}
|
|
@@ -1306,18 +1308,18 @@
|
|
format_data_t *p)
|
|
{
|
|
if (!(g.withoutprompt && g.verbosity < 1))
|
|
- printf("Formatting the device. This may take a while "
|
|
- "(get yourself a coffee).\n");
|
|
+ printf("Formatting the %s device. This may take a while "
|
|
+ "(get yourself a coffee).\n", g.dev_path);
|
|
|
|
if (g.verbosity > 0)
|
|
- printf("Detaching the device...\n");
|
|
+ printf("Detaching the %s device...\n", g.dev_path);
|
|
|
|
disk_disable(g.dev_node);
|
|
|
|
process_tracks(cylinders, heads, p);
|
|
|
|
if (g.verbosity > 0)
|
|
- printf("Formatting tracks complete...\n");
|
|
+ printf("formatting tracks for %s complete...\n", g.dev_path);
|
|
|
|
if (g.verbosity > 0)
|
|
printf("Re-accessing the device...\n");
|
|
@@ -1426,16 +1428,16 @@
|
|
if (!g.withoutprompt) {
|
|
printf("\n");
|
|
if (mode != EXPAND)
|
|
- printf("--->> ATTENTION! <<---\nAll data of "
|
|
- "that device will be lost.\n");
|
|
+ printf("--->> ATTENTION! <<---\nAll data on "
|
|
+ "the %s device will be lost.\n", g.dev_path);
|
|
printf("Type \"yes\" to continue, no will leave the "
|
|
"disk untouched: ");
|
|
if (fgets(inp_buffer, sizeof(inp_buffer), stdin) == NULL)
|
|
return;
|
|
if (strcasecmp(inp_buffer, "yes") &&
|
|
strcasecmp(inp_buffer, "yes\n")) {
|
|
- printf("Omitting ioctl call (disk will "
|
|
- "NOT be formatted).\n");
|
|
+ printf("Omitting ioctl call (disk %s will "
|
|
+ "NOT be formatted).\n", g.dev_path);
|
|
return;
|
|
}
|
|
}
|
|
@@ -1453,12 +1455,12 @@
|
|
break;
|
|
}
|
|
|
|
- printf("Finished formatting the device.\n");
|
|
+ printf("Finished formatting the %s device.\n", g.dev_path);
|
|
|
|
if (!(g.writenolabel || mode == EXPAND))
|
|
dasdfmt_write_labels(vlabel, cylinders, heads);
|
|
|
|
- printf("Rereading the partition table... ");
|
|
+ printf("Rereading the partition table for %s... ", g.dev_path);
|
|
err = dasd_reread_partition_table(g.dev_node, 5);
|
|
if (err != 0) {
|
|
ERRMSG("%s: error during rereading the partition "
|
|
@@ -1472,7 +1473,7 @@
|
|
static void eval_format_mode(void)
|
|
{
|
|
if (!g.force && g.mode_specified && g.ese && mode == EXPAND) {
|
|
- warnx("WARNING: The specified device is thin-provisioned");
|
|
+ warnx("WARNING: The specified device, %s, is thin-provisioned", g.dev_path);
|
|
warnx("Format mode 'expand' is not feasible.");
|
|
error("Use --mode=full or --mode=quick to perform a clean format");
|
|
}
|
|
@@ -1495,20 +1496,70 @@
|
|
prog_name = p + 1;
|
|
}
|
|
|
|
+void process_dasd(volume_label_t *orig_vlabel, format_data_t format_params)
|
|
+{
|
|
+ volume_label_t vlabel;
|
|
+ char old_volser[7];
|
|
+ char str[ERR_LENGTH];
|
|
+ unsigned int cylinders, heads; int rc;
|
|
+
|
|
+ rc = dasd_get_info(g.dev_node, &g.dasd_info);
|
|
+ if (rc != 0)
|
|
+ error("the ioctl call to retrieve device information failed: %s", strerror(rc));
|
|
+
|
|
+ g.ese = dasd_sys_ese(g.dev_node);
|
|
+ eval_format_mode();
|
|
+
|
|
+ /* Not sure this next line is needed in the new version of the code. */
|
|
+ memcpy(&vlabel, orig_vlabel, sizeof(vlabel));
|
|
+
|
|
+ /* Either let the user specify the blksize or get it from the kernel */
|
|
+ if (!g.blksize_specified) {
|
|
+ if (!(mode == FULL ||
|
|
+ g.dasd_info.format == DASD_FORMAT_NONE) || g.check)
|
|
+ get_blocksize(&format_params.blksize);
|
|
+ else
|
|
+ format_params = ask_user_for_blksize(format_params);
|
|
+ }
|
|
+
|
|
+ if (g.keep_volser) {
|
|
+ if (g.labelspec)
|
|
+ error("The -k and -l options are mutually exclusive");
|
|
+ if (!(format_params.intensity & DASD_FMT_INT_COMPAT))
|
|
+ error("WARNING: VOLSER cannot be kept when using the ldl format!");
|
|
+
|
|
+ if (dasdfmt_get_volser(old_volser) == 0)
|
|
+ vtoc_volume_label_set_volser(&vlabel, old_volser);
|
|
+ else
|
|
+ error("VOLSER not found on device %s", g.dev_path);
|
|
+ }
|
|
+
|
|
+ check_disk();
|
|
+
|
|
+ if (check_param(str, ERR_LENGTH, &format_params) < 0)
|
|
+ error("%s", str);
|
|
+
|
|
+ set_geo(&cylinders, &heads);
|
|
+ set_label(&vlabel, &format_params, cylinders);
|
|
+
|
|
+ if (g.check)
|
|
+ check_disk_format(cylinders, heads, &format_params);
|
|
+ else
|
|
+ do_format_dasd(&vlabel, &format_params, cylinders, heads);
|
|
+
|
|
+}
|
|
+
|
|
int main(int argc, char *argv[])
|
|
{
|
|
volume_label_t vlabel;
|
|
- char old_volser[7];
|
|
|
|
- char str[ERR_LENGTH];
|
|
char buf[7];
|
|
|
|
char *blksize_param_str = NULL;
|
|
char *reqsize_param_str = NULL;
|
|
char *hashstep_str = NULL;
|
|
|
|
- int rc;
|
|
- unsigned int cylinders, heads;
|
|
+ int rc, numdev = 0, i;
|
|
|
|
/* Establish a handler for interrupt signals. */
|
|
signal(SIGTERM, program_interrupt_signal);
|
|
@@ -1644,6 +1695,9 @@
|
|
break; /* exit loop if finished */
|
|
}
|
|
|
|
+ /* Reset the value of rc since we're going to use it again later. */
|
|
+ rc = 0;
|
|
+
|
|
CHECK_SPEC_MAX_ONCE(g.blksize_specified, "blocksize");
|
|
CHECK_SPEC_MAX_ONCE(g.labelspec, "label");
|
|
CHECK_SPEC_MAX_ONCE(g.writenolabel, "omit-label-writing flag");
|
|
@@ -1662,49 +1716,29 @@
|
|
if (g.print_hashmarks)
|
|
PARSE_PARAM_INTO(g.hashstep, hashstep_str, 10, "hashstep");
|
|
|
|
- get_device_name(optind, argc, argv);
|
|
-
|
|
- rc = dasd_get_info(g.dev_node, &g.dasd_info);
|
|
- if (rc != 0)
|
|
- error("the ioctl call to retrieve device information failed: %s", strerror(rc));
|
|
-
|
|
- g.ese = dasd_sys_ese(g.dev_node);
|
|
- eval_format_mode();
|
|
-
|
|
- /* Either let the user specify the blksize or get it from the kernel */
|
|
- if (!g.blksize_specified) {
|
|
- if (!(mode == FULL ||
|
|
- g.dasd_info.format == DASD_FORMAT_NONE) || g.check)
|
|
- get_blocksize(&format_params.blksize);
|
|
- else
|
|
- format_params = ask_user_for_blksize(format_params);
|
|
- }
|
|
-
|
|
- if (g.keep_volser) {
|
|
- if (g.labelspec)
|
|
- error("The -k and -l options are mutually exclusive");
|
|
- if (!(format_params.intensity & DASD_FMT_INT_COMPAT))
|
|
- error("WARNING: VOLSER cannot be kept when using the ldl format!");
|
|
-
|
|
- if (dasdfmt_get_volser(old_volser) == 0)
|
|
- vtoc_volume_label_set_volser(&vlabel, old_volser);
|
|
- else
|
|
- error("VOLSER not found on device %s", g.dev_path);
|
|
- }
|
|
-
|
|
- check_disk();
|
|
-
|
|
- if (check_param(str, ERR_LENGTH, &format_params) < 0)
|
|
- error("%s", str);
|
|
-
|
|
- set_geo(&cylinders, &heads);
|
|
- set_label(&vlabel, &format_params, cylinders);
|
|
-
|
|
- if (g.check)
|
|
- check_disk_format(cylinders, heads, &format_params);
|
|
- else
|
|
- do_format_dasd(&vlabel, &format_params, cylinders, heads);
|
|
+ while (optind < argc) {
|
|
+ get_device_name(optind, argc, argv);
|
|
+ strncpy(g.dev_path_array[numdev], g.dev_path, strlen(g.dev_path));
|
|
+ strncpy(g.dev_node_array[numdev], g.dev_node, strlen(g.dev_node));
|
|
+
|
|
+ optind++;
|
|
+ numdev++;
|
|
+ }
|
|
+
|
|
+ if (!numdev)
|
|
+ error("%s: No device specified!\n",
|
|
+ prog_name);
|
|
+
|
|
+ if (numdev > 1 && g.labelspec)
|
|
+ error("Specifying a volser to be written doesn't make sense when formatting multiple DASD volumes.");
|
|
+
|
|
+ for (i = 0; i < numdev; i++)
|
|
+ {
|
|
+ strncpy(g.dev_path, g.dev_path_array[i], strlen(g.dev_path_array[i])+1);
|
|
+ strncpy(g.dev_node, g.dev_node_array[i], strlen(g.dev_node_array[i])+1);
|
|
+ process_dasd(&vlabel, format_params);
|
|
+ }
|
|
|
|
free(g.dev_path);
|
|
free(g.dev_node);
|
|
|