diff options
author | Neil Brown <neilb@suse.de> | 2008-05-15 16:48:17 +1000 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2008-05-15 16:48:17 +1000 |
commit | 2503d23b5a113adee89b2631770a8dbfd9ca1351 (patch) | |
tree | bde23be86ea483e866d71408e708f6dcd03dc30b /sysfs.c | |
parent | 5f8097beb973842287e5ac6e2d2644accb04cf25 (diff) | |
download | mdadm-2503d23b5a113adee89b2631770a8dbfd9ca1351.tar.gz mdadm-2503d23b5a113adee89b2631770a8dbfd9ca1351.tar.xz mdadm-2503d23b5a113adee89b2631770a8dbfd9ca1351.zip |
More ddf stuff
Diffstat (limited to 'sysfs.c')
-rw-r--r-- | sysfs.c | 53 |
1 files changed, 53 insertions, 0 deletions
@@ -310,3 +310,56 @@ 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; +} |