diff options
author | Neil Brown <neilb@suse.de> | 2008-05-15 16:48:37 +1000 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2008-05-15 16:48:37 +1000 |
commit | 549e9569c6006433512801ae76b34abc0d3e1ac0 (patch) | |
tree | cc17c37e280d4d0acd40009285a497eda693999d /sysfs.c | |
parent | f7dd881f909a7bc552a6de3c1fc4920bb0bfdff2 (diff) | |
download | mdadm-549e9569c6006433512801ae76b34abc0d3e1ac0.tar.gz mdadm-549e9569c6006433512801ae76b34abc0d3e1ac0.tar.xz mdadm-549e9569c6006433512801ae76b34abc0d3e1ac0.zip |
Merge mdmon
Diffstat (limited to 'sysfs.c')
-rw-r--r-- | sysfs.c | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -56,6 +56,29 @@ void sysfs_free(struct mdinfo *sra) } } +int sysfs_open(int devnum, char *devname, char *attr) +{ + char fname[50]; + char sys_name[16]; + int fd; + if (devnum >= 0) + sprintf(sys_name, "md%d", devnum); + else + sprintf(sys_name, "md_d%d", + -1-devnum); + + sprintf(fname, "/sys/block/%s/md/", sys_name); + if (devname) { + strcat(fname, devname); + strcat(fname, "/"); + } + strcat(fname, attr); + fd = open(fname, O_RDWR); + if (fd < 0 && errno == -EACCES) + fd = open(fname, O_RDONLY); + return fd; +} + struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options) { /* Longest possible name in sysfs, mounted at /sys, is @@ -128,6 +151,12 @@ struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options) goto abort; sra->array.layout = strtoul(buf, NULL, 0); } + if (options & GET_DISKS) { + strcpy(base, "raid_disks"); + if (load_sys(fname, buf)) + goto abort; + sra->array.raid_disks = strtoul(buf, NULL, 0); + } if (options & GET_COMPONENT) { strcpy(base, "component_size"); if (load_sys(fname, buf)) |