s.raiddisks, optarg);
exit(2);
}
- s.raiddisks = parse_num(optarg);
- if (s.raiddisks <= 0) {
+ if (parse_num(&s.raiddisks, optarg) != 0 || s.raiddisks <= 0) {
pr_err("invalid number of raid devices: %s\n",
optarg);
exit(2);
case O(ASSEMBLE, Nodes):
case O(GROW, Nodes):
case O(CREATE, Nodes):
- c.nodes = parse_num(optarg);
- if (c.nodes < 2) {
+ if (parse_num(&c.nodes, optarg) != 0 || c.nodes < 2) {
pr_err("clustered array needs two nodes at least: %s\n",
optarg);
exit(2);
s.level);
exit(2);
}
- s.sparedisks = parse_num(optarg);
- if (s.sparedisks < 0) {
+ if (parse_num(&s.sparedisks, optarg) != 0 || s.sparedisks < 0) {
pr_err("invalid number of spare-devices: %s\n",
optarg);
exit(2);
}
if (strcmp(optarg, "dev") == 0)
ident.super_minor = -2;
- else {
- ident.super_minor = parse_num(optarg);
- if (ident.super_minor < 0) {
- pr_err("Bad super-minor number: %s.\n", optarg);
- exit(2);
- }
+ else if (parse_num(&ident.super_minor, optarg) != 0 || ident.super_minor < 0) {
+ pr_err("Bad super-minor number: %s.\n", optarg);
+ exit(2);
}
continue;
case O(MONITOR,'r'): /* rebuild increments */
case O(MONITOR,Increment):
- increments = atoi(optarg);
- if (increments > 99 || increments < 1) {
+ if (parse_num(&increments, optarg) != 0
+ || increments > 99 || increments < 1) {
pr_err("please specify positive integer between 1 and 99 as rebuild increments.\n");
exit(2);
}
case O(BUILD,'d'): /* delay for bitmap updates */
case O(CREATE,'d'):
if (c.delay)
- pr_err("only specify delay once. %s ignored.\n",
- optarg);
- else {
- c.delay = parse_num(optarg);
- if (c.delay < 1) {
- pr_err("invalid delay: %s\n",
- optarg);
- exit(2);
- }
+ pr_err("only specify delay once. %s ignored.\n", optarg);
+ else if (parse_num(&c.delay, optarg) != 0 || c.delay < 1) {
+ pr_err("invalid delay: %s\n", optarg);
+ exit(2);
}
continue;
case O(MONITOR,'f'): /* daemonise */
case O(GROW, WriteBehind):
case O(BUILD, WriteBehind):
- case O(CREATE, WriteBehind): /* write-behind mode */
+ case O(CREATE, WriteBehind):
s.write_behind = DEFAULT_MAX_WRITE_BEHIND;
- if (optarg) {
- s.write_behind = parse_num(optarg);
- if (s.write_behind < 0 ||
- s.write_behind > 16383) {
- pr_err("Invalid value for maximum outstanding write-behind writes: %s.\n\tMust be between 0 and 16383.\n", optarg);
- exit(2);
- }
+ if (parse_num(&s.write_behind, optarg) != 0 ||
+ s.write_behind < 0 || s.write_behind > 16383) {
+ pr_err("Invalid value for maximum outstanding write-behind writes: %s.\n\tMust be between 0 and 16383.\n",
+ optarg);
+ exit(2);
}
continue;
-
case O(INCREMENTAL, 'r'):
case O(INCREMENTAL, RebuildMapOpt):
rebuild_map = 1;
mdfd = open_mddev(devlist->devname, 1);
if (mdfd < 0)
exit(1);
- } else
+ } else {
+ char *bname = basename(devlist->devname);
+
+ if (strlen(bname) > MD_NAME_MAX) {
+ pr_err("Name %s is too long.\n", devlist->devname);
+ exit(1);
+ }
/* non-existent device is OK */
mdfd = open_mddev(devlist->devname, 0);
+ }
if (mdfd == -2) {
pr_err("device %s exists but is not an md array.\n", devlist->devname);
exit(1);
}
if (locked)
cluster_release_dlmlock();
- if (mdfd > 0)
- close(mdfd);
+ close_fd(&mdfd);
exit(rv);
}