]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdopen.c
array_try_spare(): missing map_unlock()
[thirdparty/mdadm.git] / mdopen.c
index 293ac25d6a5fb02b9b0b8e100060c0b09d45f544..555ab84f6d4de832cdbf3b2d0355887ddd196288 100644 (file)
--- a/mdopen.c
+++ b/mdopen.c
@@ -1,7 +1,7 @@
 /*
  * mdadm - manage Linux "md" devices aka RAID arrays.
  *
- * Copyright (C) 2001-2006 Neil Brown <neilb@suse.de>
+ * Copyright (C) 2001-2009 Neil Brown <neilb@suse.de>
  *
  *
  *    This program is free software; you can redistribute it and/or modify
  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  *    Author: Neil Brown
- *    Email: <neilb@cse.unsw.edu.au>
- *    Paper: Neil Brown
- *           School of Computer Science and Engineering
- *           The University of New South Wales
- *           Sydney, 2052
- *           Australia
+ *    Email: <neilb@suse.de>
  */
 
 #include "mdadm.h"
@@ -48,7 +43,7 @@ void make_parts(char *dev, int cnt)
        int odig = odig; /* quiet gcc -Os unitialized warning */
        int i;
        int nlen = strlen(dev) + 20;
-       char *name = malloc(nlen);
+       char *name;
        int dig = isdigit(dev[strlen(dev)-1]);
        char orig[1024];
        char sym[1024];
@@ -57,6 +52,7 @@ void make_parts(char *dev, int cnt)
        if (cnt==0) cnt=4;
        if (lstat(dev, &stb)!= 0)
                return;
+
        if (S_ISLNK(stb.st_mode)) {
                int len = readlink(dev, orig, sizeof(orig));
                if (len < 0 || len > 1000)
@@ -68,6 +64,7 @@ void make_parts(char *dev, int cnt)
                minor_num = minor(stb.st_rdev);
        } else
                   return;
+       name = malloc(nlen);
        for (i=1; i <= cnt ; i++) {
                struct stat stb2;
                snprintf(name, nlen, "%s%s%d", dev, dig?"p":"", i);
@@ -97,6 +94,7 @@ void make_parts(char *dev, int cnt)
                if (err == 0 && stat(name, &stb2) == 0)
                        add_dev(name, &stb2, 0, NULL);
        }
+       free(name);
 }
 
 
@@ -161,7 +159,6 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
 
 
        if (dev) {
-               
                if (strncmp(dev, "/dev/md/", 8) == 0) {
                        strcpy(cname, dev+8);
                } else if (strncmp(dev, "/dev/", 5) == 0) {
@@ -312,7 +309,7 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
                }
        }
 
-       if (dev)
+       if (dev && dev[0] == '/')
                strcpy(chosen, dev);
        else if (cname[0] == 0)
                strcpy(chosen, devname);
@@ -363,8 +360,12 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
 
                        if (lstat(chosen, &stb) == 0) {
                                char buf[300];
+                               ssize_t link_len = readlink(chosen, buf, sizeof(buf)-1);
+                               if (link_len >= 0)
+                                       buf[link_len] = '\0';
+
                                if ((stb.st_mode & S_IFMT) != S_IFLNK ||
-                                   readlink(chosen, buf, 300) <0 ||
+                                   link_len < 0 ||
                                    strcmp(buf, devname) != 0) {
                                        fprintf(stderr, Name ": %s exists - ignoring\n",
                                                chosen);
@@ -393,6 +394,8 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
 int open_mddev(char *dev, int report_errors)
 {
        int mdfd = open(dev, O_RDWR);
+       if (mdfd < 0 && errno == EACCES)
+               mdfd = open(dev, O_RDONLY);
        if (mdfd < 0) {
                if (report_errors)
                        fprintf(stderr, Name ": error opening %s: %s\n",