From 549e9569c6006433512801ae76b34abc0d3e1ac0 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Thu, 15 May 2008 16:48:37 +1000 Subject: Merge mdmon --- sysfs.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'sysfs.c') diff --git a/sysfs.c b/sysfs.c index f0e9512..34840f7 100644 --- a/sysfs.c +++ b/sysfs.c @@ -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)) -- cgit