summaryrefslogtreecommitdiffstats
path: root/sysfs.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2009-07-14 15:12:30 +1000
committerNeilBrown <neilb@suse.de>2009-07-14 15:12:30 +1000
commita628848379c07c79485a49c7f0c684ece02ae3b7 (patch)
treed1e28049a377cfdf8d350b9981f0670c373114bc /sysfs.c
parentfe77a154b1be42c65f15f0dad363f100de923489 (diff)
downloadmdadm-a628848379c07c79485a49c7f0c684ece02ae3b7.tar.gz
mdadm-a628848379c07c79485a49c7f0c684ece02ae3b7.tar.xz
mdadm-a628848379c07c79485a49c7f0c684ece02ae3b7.zip
restripe: support saving when not all devices are present.
Diffstat (limited to 'sysfs.c')
-rw-r--r--sysfs.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/sysfs.c b/sysfs.c
index b615663..56fd968 100644
--- a/sysfs.c
+++ b/sysfs.c
@@ -442,21 +442,28 @@ int sysfs_uevent(struct mdinfo *sra, char *event)
return 0;
}
-int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
- char *name, unsigned long long *val)
+int sysfs_get_fd(struct mdinfo *sra, struct mdinfo *dev,
+ char *name)
{
char fname[50];
- char buf[50];
- int n;
int fd;
- char *ep;
+
sprintf(fname, "/sys/block/%s/md/%s/%s",
sra->sys_name, dev?dev->sys_name:"", name);
- fd = open(fname, O_RDONLY);
+ fd = open(fname, O_RDWR);
if (fd < 0)
- return -1;
+ fd = open(fname, O_RDONLY);
+ return fd;
+}
+
+int sysfs_fd_get_ll(int fd, unsigned long long *val)
+{
+ char buf[50];
+ int n;
+ char *ep;
+
+ lseek(fd, 0, 0);
n = read(fd, buf, sizeof(buf));
- close(fd);
if (n <= 0)
return -1;
buf[n] = 0;
@@ -466,6 +473,20 @@ int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
return 0;
}
+int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
+ char *name, unsigned long long *val)
+{
+ int n;
+ int fd;
+
+ fd = sysfs_get_fd(sra, dev, name);
+ if (fd < 0)
+ return -1;
+ n = sysfs_fd_get_ll(fd, val);
+ close(fd);
+ return n;
+}
+
int sysfs_get_str(struct mdinfo *sra, struct mdinfo *dev,
char *name, char *val, int size)
{