/*
* mdadm - manage Linux "md" devices aka RAID arrays.
*
- * Copyright (C) 2001-2012 Neil Brown <neilb@suse.de>
+ * Copyright (C) 2001-2013 Neil Brown <neilb@suse.de>
*
*
* This program is free software; you can redistribute it and/or modify
/* name *must* be mdXX or md_dXX in this context */
if (num < 0 ||
(strcmp(cname, "md") != 0 && strcmp(cname, "md_d") != 0)) {
- pr_err("%s is an invalid name "
- "for an md device. Try /dev/md/%s\n",
+ pr_err("%s is an invalid name for an md device. Try /dev/md/%s\n",
dev, dev+5);
return -1;
}
* empty.
*/
if (strchr(cname, '/') != NULL) {
- pr_err("%s is an invalid name "
- "for an md device.\n", dev);
+ pr_err("%s is an invalid name for an md device.\n", dev);
return -1;
}
if (cname[0] == 0) {
- pr_err("%s is an invalid name "
- "for an md device (empty!).", dev);
+ pr_err("%s is an invalid name for an md device (empty!).", dev);
return -1;
}
if (num < 0) {
if (name && name[0] == 0)
name = NULL;
if (name && trustworthy == METADATA && use_mdp == 1) {
- pr_err("%s is not allowed for a %s container. "
- "Consider /dev/md%d.\n", dev, name, num);
+ pr_err("%s is not allowed for a %s container. Consider /dev/md%d.\n", dev, name, num);
return -1;
}
if (name && trustworthy == METADATA)
if (md_get_version(mdfd) <= 0) {
close(mdfd);
if (report_errors)
- pr_err("%s does not appear to be "
- "an md device\n", dev);
+ pr_err("%s does not appear to be an md device\n", dev);
return -2;
}
return mdfd;
}
+
+char *find_free_devnm(int use_partitions)
+{
+ static char devnm[32];
+ int devnum;
+ for (devnum = 127; devnum != 128;
+ devnum = devnum ? devnum-1 : (1<<20)-1) {
+
+ if (use_partitions)
+ sprintf(devnm, "md_d%d", devnum);
+ else
+ sprintf(devnm, "md%d", devnum);
+ if (mddev_busy(devnm))
+ continue;
+ if (!conf_name_is_free(devnm))
+ continue;
+ if (!use_udev()) {
+ /* make sure it is new to /dev too, at least as a
+ * non-standard */
+ int devid = devnm2devid(devnm);
+ if (devid) {
+ char *dn = map_dev(major(devid),
+ minor(devid), 0);
+ if (dn && ! is_standard(dn, NULL))
+ continue;
+ }
+ }
+ break;
+ }
+ if (devnum == 128)
+ return NULL;
+ return devnm;
+}