X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=sysfs.c;h=8fdb52998409303e3874f84b6fe5a1eea8820aee;hp=d327e3df27d954903a1ea57598e1c5423262beeb;hb=d23534e4646313a67296b295666d165a87bb2c92;hpb=5d504f42782ced8af5438ebc455b084275c86eec diff --git a/sysfs.c b/sysfs.c index d327e3df..8fdb5299 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,25 +473,46 @@ int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev, return 0; } -int sysfs_get_str(struct mdinfo *sra, struct mdinfo *dev, - char *name, char *val, int size) +int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev, + char *name, unsigned long long *val) { - char fname[50]; int n; int fd; - sprintf(fname, "/sys/block/%s/md/%s/%s", - sra->sys_name, dev?dev->sys_name:"", name); - fd = open(fname, O_RDONLY); + + fd = sysfs_get_fd(sra, dev, name); if (fd < 0) return -1; - n = read(fd, val, size); + n = sysfs_fd_get_ll(fd, val); close(fd); + return n; +} + +int sysfs_fd_get_str(int fd, char *val, int size) +{ + int n; + + lseek(fd, 0, 0); + n = read(fd, val, size); if (n <= 0) return -1; val[n] = 0; return n; } +int sysfs_get_str(struct mdinfo *sra, struct mdinfo *dev, + char *name, char *val, int size) +{ + int n; + int fd; + + fd = sysfs_get_fd(sra, dev, name); + if (fd < 0) + return -1; + n = sysfs_fd_get_str(fd, val, size); + close(fd); + return n; +} + int sysfs_set_safemode(struct mdinfo *sra, unsigned long ms) { unsigned long sec; @@ -544,7 +572,7 @@ int sysfs_set_array(struct mdinfo *info, int vers) return rv; } -int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd, int in_sync) +int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd) { char dv[100]; char nm[100]; @@ -570,11 +598,11 @@ int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd, int in_sync) 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) { - if (in_sync) + if (sd->recovery_start == MaxSector) /* This can correctly fail if array isn't started, * yet, so just ignore status for now. */ - sysfs_set_str(sra, sd, "state", "in_sync"); + sysfs_set_str(sra, sd, "state", "insync"); rv |= sysfs_set_num(sra, sd, "slot", sd->disk.raid_disk); } return rv;