b5ca2618dd
Implemented parallel formatting patches, other misc. changes OBS-URL: https://build.opensuse.org/request/show/535008 OBS-URL: https://build.opensuse.org/package/show/Base:System/s390-tools?expand=0&rev=22
234 lines
8.4 KiB
Diff
234 lines
8.4 KiB
Diff
From a4101cc9bf1d18b698ead344e6be6fe311fda41d Mon Sep 17 00:00:00 2001
|
|
From: Hannes Reinecke <hare@suse.de>
|
|
Date: Thu, 5 Oct 2017 09:59:41 +0200
|
|
Subject: [PATCH] dasdfmt: Fixup device name handling
|
|
|
|
get_device_name() contains a chunk of unreachable code, as the
|
|
'name' argument is never filled with any value.
|
|
So turn things around to have get_device_name() always fill the
|
|
'name' argument with the real device name, and remove the
|
|
devname entry from the dasdfmt_info_t structure.
|
|
|
|
Signed-off-by: Hannes Reinecke <hare@suse.com>
|
|
---
|
|
dasdfmt/dasdfmt.c | 70 ++++++++++++++++++++++++-------------------------------
|
|
dasdfmt/dasdfmt.h | 1 -
|
|
2 files changed, 30 insertions(+), 41 deletions(-)
|
|
|
|
diff --git a/dasdfmt/dasdfmt.c b/dasdfmt/dasdfmt.c
|
|
index 4cf423d..3da7902 100644
|
|
--- a/dasdfmt/dasdfmt.c
|
|
+++ b/dasdfmt/dasdfmt.c
|
|
@@ -456,7 +456,7 @@ static void program_interrupt_signal(int sig)
|
|
/*
|
|
* check given device name for blanks and some special characters
|
|
*/
|
|
-static void get_device_name(dasdfmt_info_t *info, char *name, int argc,
|
|
+static void get_device_name(dasdfmt_info_t *info, char *devname, int argc,
|
|
char *argv[])
|
|
{
|
|
struct util_proc_dev_entry dev_entry;
|
|
@@ -470,32 +470,20 @@ static void get_device_name(dasdfmt_info_t *info, char *name, int argc,
|
|
ERRMSG_EXIT(EXIT_MISUSE, "%s: No device specified!\n",
|
|
prog_name);
|
|
|
|
- if (info->device_id < argc) {
|
|
- strcpy(info->devname, argv[info->device_id]);
|
|
- } else {
|
|
- if ((strchr(name, ' ') != NULL) || (strchr(name, '#') != NULL) ||
|
|
- (strchr(name, '[') != NULL) || (strchr(name, ']') != NULL) ||
|
|
- (strchr(name, '!') != NULL) || (strchr(name, '>') != NULL) ||
|
|
- (strchr(name, '(') != NULL) || (strchr(name, '<') != NULL) ||
|
|
- (strchr(name, ')') != NULL) || (strchr(name, ':') != NULL) ||
|
|
- (strchr(name, '&') != NULL) || (strchr(name, ';') != NULL))
|
|
- ERRMSG_EXIT(EXIT_MISUSE, "%s: Your filename contains "
|
|
- "blanks or special characters!\n",
|
|
- prog_name);
|
|
-
|
|
- strncpy(info->devname, name, PATH_MAX - 1);
|
|
- info->devname[PATH_MAX - 1] = '\0';
|
|
- }
|
|
+ if (strlen(argv[info->device_id]) >= PATH_MAX)
|
|
+ ERRMSG_EXIT(EXIT_MISUSE, "%s: device name too long!\n",
|
|
+ prog_name);
|
|
+ strcpy(devname, argv[info->device_id]);
|
|
|
|
- if (stat(info->devname, &dev_stat) != 0)
|
|
+ if (stat(devname, &dev_stat) != 0)
|
|
ERRMSG_EXIT(EXIT_MISUSE, "%s: Could not get information for "
|
|
- "device node %s: %s\n", prog_name, info->devname,
|
|
+ "device node %s: %s\n", prog_name, devname,
|
|
strerror(errno));
|
|
|
|
if (minor(dev_stat.st_rdev) & PARTN_MASK) {
|
|
ERRMSG_EXIT(EXIT_MISUSE, "%s: Unable to format partition %s. "
|
|
"Please specify a device.\n", prog_name,
|
|
- info->devname);
|
|
+ devname);
|
|
}
|
|
|
|
if (util_proc_dev_get_entry(dev_stat.st_rdev, 1, &dev_entry) == 0) {
|
|
@@ -505,7 +493,7 @@ static void get_device_name(dasdfmt_info_t *info, char *name, int argc,
|
|
prog_name, dev_entry.name);
|
|
} else {
|
|
printf("%s WARNING: Unable to get driver name for device node %s",
|
|
- prog_name, info->devname);
|
|
+ prog_name, devname);
|
|
}
|
|
}
|
|
|
|
@@ -586,7 +574,7 @@ static void check_layout(dasdfmt_info_t *info, unsigned int intensity)
|
|
/*
|
|
* check for disk type and set some variables (e.g. usage count)
|
|
*/
|
|
-static void check_disk(dasdfmt_info_t *info)
|
|
+static void check_disk(dasdfmt_info_t *info, char *devname)
|
|
{
|
|
int ro, errno_save;
|
|
|
|
@@ -609,13 +597,13 @@ static void check_disk(dasdfmt_info_t *info)
|
|
if (strncmp(info->dasd_info.type, "ECKD", 4) != 0) {
|
|
ERRMSG_EXIT(EXIT_FAILURE,
|
|
"%s: Unsupported disk type\n%s is not an "
|
|
- "ECKD disk!\n", prog_name, info->devname);
|
|
+ "ECKD disk!\n", prog_name, devname);
|
|
}
|
|
|
|
- if (dasd_sys_raw_track_access(info->devname)) {
|
|
+ if (dasd_sys_raw_track_access(devname)) {
|
|
ERRMSG_EXIT(EXIT_FAILURE,
|
|
"%s: Device '%s' is in raw-track access mode\n",
|
|
- prog_name, info->devname);
|
|
+ prog_name, devname);
|
|
}
|
|
}
|
|
|
|
@@ -935,7 +923,8 @@ static format_data_t ask_user_for_blksize(format_data_t params)
|
|
/*
|
|
* print all information needed to format the device
|
|
*/
|
|
-static void dasdfmt_print_info(dasdfmt_info_t *info, volume_label_t *vlabel,
|
|
+static void dasdfmt_print_info(dasdfmt_info_t *info, char *devname,
|
|
+ volume_label_t *vlabel,
|
|
unsigned int cylinders, unsigned int heads,
|
|
format_data_t *p)
|
|
{
|
|
@@ -945,7 +934,7 @@ static void dasdfmt_print_info(dasdfmt_info_t *info, volume_label_t *vlabel,
|
|
cylinders, heads, (cylinders * heads));
|
|
|
|
printf("\nI am going to format the device ");
|
|
- printf("%s in the following way:\n", info->devname);
|
|
+ printf("%s in the following way:\n", devname);
|
|
printf(" Device number of device : 0x%x\n", info->dasd_info.devno);
|
|
printf(" Labelling device : %s\n",
|
|
(info->writenolabel) ? "no" : "yes");
|
|
@@ -1376,7 +1365,8 @@ static void dasdfmt_quick_format(dasdfmt_info_t *info, unsigned int cylinders,
|
|
disk_disabled = 0;
|
|
}
|
|
|
|
-static void do_format_dasd(dasdfmt_info_t *info, volume_label_t *vlabel,
|
|
+static void do_format_dasd(dasdfmt_info_t *info, char *devname,
|
|
+ volume_label_t *vlabel,
|
|
format_data_t *p, unsigned int cylinders,
|
|
unsigned int heads)
|
|
{
|
|
@@ -1399,19 +1389,19 @@ static void do_format_dasd(dasdfmt_info_t *info, volume_label_t *vlabel,
|
|
}
|
|
|
|
if ((info->verbosity > 0) || !info->withoutprompt || info->testmode)
|
|
- dasdfmt_print_info(info, vlabel, cylinders, heads, p);
|
|
+ dasdfmt_print_info(info, devname, vlabel, cylinders, heads, p);
|
|
|
|
- count = u2s_get_host_access_count(info->devname);
|
|
+ count = u2s_get_host_access_count(devname);
|
|
if (info->force_host) {
|
|
if (count > 1) {
|
|
ERRMSG_EXIT(EXIT_FAILURE,
|
|
"\n%s: Disk %s is online on OS instances in %d different LPARs.\n"
|
|
"Note: Your installation might include z/VM systems that are configured to\n"
|
|
"automatically vary on disks, regardless of whether they are subsequently used.\n\n",
|
|
- prog_name, info->devname, count);
|
|
+ prog_name, devname, count);
|
|
} else if (count < 0) {
|
|
ERRMSG("\nHosts access information not available for disk %s.\n\n",
|
|
- info->devname);
|
|
+ devname);
|
|
return;
|
|
}
|
|
} else if (count > 1)
|
|
@@ -1420,7 +1410,7 @@ static void do_format_dasd(dasdfmt_info_t *info, volume_label_t *vlabel,
|
|
"Ensure that the disk is not being used by a system outside your LPAR.\n"
|
|
"Note: Your installation might include z/VM systems that are configured to\n"
|
|
"automatically vary on disks, regardless of whether they are subsequently used.\n",
|
|
- info->devname, count);
|
|
+ devname, count);
|
|
|
|
if (!info->testmode) {
|
|
if (!info->withoutprompt) {
|
|
@@ -1471,7 +1461,6 @@ int main(int argc, char *argv[])
|
|
{
|
|
dasdfmt_info_t info = {
|
|
.dasd_info = {0},
|
|
- {0}
|
|
};
|
|
volume_label_t vlabel;
|
|
char old_volser[7];
|
|
@@ -1648,10 +1637,10 @@ int main(int argc, char *argv[])
|
|
|
|
get_device_name(&info, dev_filename, argc, argv);
|
|
|
|
- filedes = open(info.devname, O_RDWR);
|
|
+ filedes = open(dev_filename, O_RDWR);
|
|
if (filedes == -1)
|
|
ERRMSG_EXIT(EXIT_FAILURE, "%s: Unable to open device %s: %s\n",
|
|
- prog_name, info.devname, strerror(errno));
|
|
+ prog_name, dev_filename, strerror(errno));
|
|
|
|
get_device_info(&info);
|
|
|
|
@@ -1675,16 +1664,16 @@ int main(int argc, char *argv[])
|
|
exit(1);
|
|
}
|
|
|
|
- if (dasdfmt_get_volser(info.devname,
|
|
+ if (dasdfmt_get_volser(dev_filename,
|
|
&info.dasd_info, old_volser) == 0)
|
|
vtoc_volume_label_set_volser(&vlabel, old_volser);
|
|
else
|
|
ERRMSG_EXIT(EXIT_FAILURE,
|
|
"%s: VOLSER not found on device %s\n",
|
|
- prog_name, info.devname);
|
|
+ prog_name, dev_filename);
|
|
}
|
|
|
|
- check_disk(&info);
|
|
+ check_disk(&info, dev_filename);
|
|
|
|
if (check_param(str, ERR_LENGTH, &format_params) < 0)
|
|
ERRMSG_EXIT(EXIT_MISUSE, "%s: %s\n", prog_name, str);
|
|
@@ -1695,7 +1684,8 @@ int main(int argc, char *argv[])
|
|
if (info.check)
|
|
check_disk_format(&info, cylinders, heads, &format_params);
|
|
else
|
|
- do_format_dasd(&info, &vlabel, &format_params, cylinders, heads);
|
|
+ do_format_dasd(&info, dev_filename, &vlabel,
|
|
+ &format_params, cylinders, heads);
|
|
|
|
if (close(filedes) != 0)
|
|
ERRMSG("%s: error during close: %s\ncontinuing...\n",
|
|
diff --git a/dasdfmt/dasdfmt.h b/dasdfmt/dasdfmt.h
|
|
index 7c6f0bd..9ce3b92 100644
|
|
--- a/dasdfmt/dasdfmt.h
|
|
+++ b/dasdfmt/dasdfmt.h
|
|
@@ -291,7 +291,6 @@ typedef struct bootstrap2 {
|
|
|
|
typedef struct dasdfmt_info {
|
|
dasd_information2_t dasd_info;
|
|
- char devname[PATH_MAX];
|
|
int verbosity;
|
|
int testmode;
|
|
int withoutprompt;
|
|
--
|
|
1.7.12.4
|
|
|