- /* check major number is correct */
- num = -1;
- std = is_standard(dev, &num);
- if (std>0) major_num = get_mdp_major();
- switch(autof) {
- case 2: /* only create is_standard names */
- if (!std && !stb.st_mode) {
- fprintf(stderr, Name
- ": %s does not exist and is not a 'standard' name "
- "so it cannot be created\n", dev);
- return -1;
- }
- break;
- case 3: /* create md, reject std>0 */
- if (std > 0) {
- fprintf(stderr, Name ": that --auto option "
- "not compatable with device named %s\n", dev);
- return -1;
- }
- break;
- case 4: /* create mdp, reject std<0 */
- if (std < 0) {
- fprintf(stderr, Name ": that --auto option "
- "not compatable with device named %s\n", dev);
- return -1;
+ if (cname[0] == 0) {
+ pr_err("%s is an invalid name for an md device (empty!).\n", dev);
+ return -1;
+ }
+ if (num < 0) {
+ /* If cname is 'N' or 'dN', we get dev number
+ * from there.
+ */
+ char *sp = cname;
+ char *ep;
+ if (cname[0] == 'd')
+ sp++;
+ if (isdigit(sp[0]))
+ num = strtoul(sp, &ep, 10);
+ else
+ ep = sp;
+ if (ep == sp || *ep || num < 0)
+ num = -1;
+ else if (cname[0] == 'd')
+ use_mdp = 1;
+ else
+ use_mdp = 0;
+ }
+ }
+
+ /* Now determine device number */
+ /* named 'METADATA' cannot use 'mdp'. */
+ 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);
+ return -1;
+ }
+ if (name && trustworthy == METADATA)
+ use_mdp = 0;
+ if (use_mdp == -1) {
+ if (autof == 4 || autof == 6)
+ use_mdp = 1;
+ else
+ use_mdp = 0;
+ }
+ if (num < 0 && trustworthy == LOCAL && name) {
+ /* if name is numeric, possibly prefixed by
+ * 'md' or '/dev/md', use that for num
+ * if it is not already in use */
+ char *ep;
+ char *n2 = name;
+ if (strncmp(n2, "/dev/", 5) == 0)
+ n2 += 5;
+ if (strncmp(n2, "md", 2) == 0)
+ n2 += 2;
+ if (*n2 == '/')
+ n2++;
+ num = strtoul(n2, &ep, 10);
+ if (ep == n2 || *ep)
+ num = -1;
+ else {
+ sprintf(devnm, "md%s%d", use_mdp ? "_d":"", num);
+ if (mddev_busy(devnm))
+ num = -1;
+ }
+ }
+
+ if (cname[0] == 0 && name) {
+ /* Need to find a name if we can
+ * We don't completely trust 'name'. Truncate to
+ * reasonable length and remove '/'
+ */
+ char *cp;
+ struct map_ent *map = NULL;
+ int conflict = 1;
+ int unum = 0;
+ int cnlen;
+ strncpy(cname, name, 200);
+ cname[200] = 0;
+ for (cp = cname; *cp ; cp++)
+ switch (*cp) {
+ case '/':
+ *cp = '-';
+ break;
+ case ' ':
+ case '\t':
+ *cp = '_';
+ break;