mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
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. GitHub-ID: #8 Signed-off-by: Hannes Reinecke <hare@suse.com> Acked-by: Jan Höppner <hoeppner@linux.vnet.ibm.com> Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
This commit is contained in:
committed by
Michael Holzheu
parent
97047896ab
commit
0028f166aa
@@ -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);
|
||||
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]);
|
||||
|
||||
strncpy(info->devname, name, PATH_MAX - 1);
|
||||
info->devname[PATH_MAX - 1] = '\0';
|
||||
}
|
||||
|
||||
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",
|
||||
|
||||
Reference in New Issue
Block a user