Subject: [PATCH] [FEAT LS1501] dasdfmt: Add new formatting modes From: Jan Höppner Summary: dasdfmt: Add new formatting modes Description: Introduce new formatting modes 'quick' and 'expand' to either format an earlier formatted DASD that could potentially be re-initialized very easily or format unformatted tracks at the end of a device that was previously extended. Also add the command line argument --check to provide a function that checks a DASD volume for correct formatting. Upstream-ID: - Problem-ID: LS1501 Upstream-Description: dasdfmt: Make the IOCTL BLKSSZGET reusable The IOCTL BLKSSZGET is used to get blocksize information of a device. Since it is used several times already and could be used for new features as well, move the call to a separate function and make it reusable. Signed-off-by: Jan Höppner Signed-off-by: Stefan Haberland Signed-off-by: Jan Höppner --- dasdfmt/dasdfmt.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) --- a/dasdfmt/dasdfmt.c +++ b/dasdfmt/dasdfmt.c @@ -252,6 +252,17 @@ static void get_device_info(dasdfmt_info } /* + * Retrieve blocksize of device + */ +static void get_blocksize(unsigned int *blksize) +{ + if (ioctl(filedes, BLKSSZGET, blksize) != 0) + ERRMSG_EXIT(EXIT_FAILURE, "%s: the ioctl to get the blocksize " + "of the device failed (%s).\n", prog_name, + strerror(errno)); +} + +/* * check for disk type and set some variables (e.g. usage count) */ static void check_disk(dasdfmt_info_t *info) @@ -510,7 +521,7 @@ static void dasdfmt_print_info(dasdfmt_i */ static int dasdfmt_get_volser(dasdfmt_info_t *info, char *volser) { - int blksize; + unsigned int blksize; int f; volume_label_t vlabel; @@ -519,9 +530,7 @@ static int dasdfmt_get_volser(dasdfmt_in ERRMSG_EXIT(EXIT_FAILURE, "%s: Unable to open device %s: %s\n", prog_name, info->devname, strerror(errno)); - if (ioctl(filedes, BLKSSZGET, &blksize) != 0) - ERRMSG_EXIT(EXIT_FAILURE, "%s: (label pos) IOCTL BLKSSZGET " - "failed (%s).\n", prog_name, strerror(errno)); + get_blocksize(&blksize); if (close(f) != 0) ERRMSG("%s: error during close: %s\ncontinuing...\n", @@ -551,7 +560,8 @@ static void dasdfmt_write_labels(dasdfmt format4_label_t f4; format5_label_t f5; format7_label_t f7; - int rc, blksize; + unsigned int blksize; + int rc; void *ipl1_record, *ipl2_record; int ipl1_record_len, ipl2_record_len; @@ -559,9 +569,7 @@ static void dasdfmt_write_labels(dasdfmt if (info->verbosity > 0) printf("Retrieving dasd information... "); - if (ioctl(filedes, BLKSSZGET, &blksize) != 0) - ERRMSG_EXIT(EXIT_FAILURE, "%s: (write labels) IOCTL BLKSSZGET " - "failed (%s).\n", prog_name, strerror(errno)); + get_blocksize(&blksize); /* * Don't rely on the cylinders returned by HDIO_GETGEO, they might be