]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - sysfs.c
Create a container member
[thirdparty/mdadm.git] / sysfs.c
diff --git a/sysfs.c b/sysfs.c
index 03b09fd84baf849caed42830da12e72775fc7512..8b5a6ff507c8b4165107b2ac5520fa7c1c9d1003 100644 (file)
--- a/sysfs.c
+++ b/sysfs.c
@@ -34,7 +34,7 @@ int load_sys(char *path, char *buf)
                return -1;
        n = read(fd, buf, 1024);
        close(fd);
-       if (n <=0 || n >= 1024)
+       if (n <0 || n >= 1024)
                return -1;
        buf[n] = 0;
        if (buf[n-1] == '\n')
@@ -84,10 +84,10 @@ struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options)
                if (ioctl(fd, RAID_VERSION, &vers) != 0)
                        return NULL;
                if (major(stb.st_rdev)==9)
-                       sprintf(sra->sys_name, "md%d", minor(stb.st_rdev));
+                       sprintf(sra->sys_name, "md%d", (int)minor(stb.st_rdev));
                else
                        sprintf(sra->sys_name, "md_d%d",
-                               minor(stb.st_rdev)>>MdpMinorShift);
+                               (int)minor(stb.st_rdev)>>MdpMinorShift);
        } else {
                if (devnum >= 0)
                        sprintf(sra->sys_name, "md%d", devnum);
@@ -103,10 +103,11 @@ struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options)
                strcpy(base, "metadata_version");
                if (load_sys(fname, buf))
                        goto abort;
-               if (strncmp(buf, "none", 4) == 0)
+               if (strncmp(buf, "none", 4) == 0) {
                        sra->array.major_version =
                                sra->array.minor_version = -1;
-               else if (strncmp(buf, "external:", 9) == 0) {
+                       strcpy(sra->text_version, "");
+               } else if (strncmp(buf, "external:", 9) == 0) {
                        sra->array.major_version = -1;
                        sra->array.minor_version = -2;
                        strcpy(sra->text_version, buf+9);
@@ -245,10 +246,10 @@ unsigned long long get_component_size(int fd)
        if (fstat(fd, &stb)) return 0;
        if (major(stb.st_rdev) == 9)
                sprintf(fname, "/sys/block/md%d/md/component_size",
-                       minor(stb.st_rdev));
+                       (int)minor(stb.st_rdev));
        else
                sprintf(fname, "/sys/block/md_d%d/md/component_size",
-                       minor(stb.st_rdev)>>MdpMinorShift);
+                       (int)minor(stb.st_rdev)>>MdpMinorShift);
        fd = open(fname, O_RDONLY);
        if (fd < 0)
                return 0;
@@ -309,3 +310,57 @@ int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
                return -1;
        return 0;
 }
+
+int sysfs_set_array(struct mdinfo *sra,
+                   struct mdinfo *info)
+{
+       int rv = 0;
+       sra->array = info->array;
+
+       if (info->array.level < 0)
+               return 0; /* FIXME */
+       rv |= sysfs_set_str(sra, NULL, "level",
+                           map_num(pers, info->array.level));
+       rv |= sysfs_set_num(sra, NULL, "raid_disks", info->array.raid_disks);
+       rv |= sysfs_set_num(sra, NULL, "chunk_size", info->array.chunk_size);
+       rv |= sysfs_set_num(sra, NULL, "layout", info->array.layout);
+       rv |= sysfs_set_num(sra, NULL, "component_size", info->component_size);
+       sra->array = info->array;
+       return rv;
+}
+
+int sysfs_add_disk(struct mdinfo *sra, int fd, struct mdinfo *sd)
+{
+       char dv[100];
+       char nm[100];
+       struct mdinfo *sd2;
+       char *dname;
+       int rv;
+
+       sprintf(dv, "%d:%d", sd->disk.major, sd->disk.minor);
+       rv = sysfs_set_str(sra, NULL, "new_dev", dv);
+       if (rv)
+               return rv;
+
+       memset(nm, 0, sizeof(nm));
+       sprintf(dv, "/sys/dev/block/%d:%d", sd->disk.major, sd->disk.minor);
+       if (readlink(dv, nm, sizeof(nm)) < 0)
+               return -1;
+       dname = strrchr(nm, '/');
+       if (dname) dname++;
+       strcpy(sd->sys_name, "dev-");
+       strcpy(sd->sys_name+4, dname);
+
+       rv |= sysfs_set_num(sra, sd, "offset", sd->data_offset);
+       rv |= sysfs_set_num(sra, sd, "size", (sd->component_size+1) / 2);
+       if (sra->array.level != LEVEL_CONTAINER) {
+               rv |= sysfs_set_num(sra, sd, "slot", sd->disk.raid_disk);
+//             rv |= sysfs_set_str(sra, sd, "state", "in_sync");
+       }
+       sd2 = malloc(sizeof(*sd2));
+       *sd2 = *sd;
+       sd2->next = sra->devs;
+       sra->devs = sd2;
+
+       return rv;
+}