diff options
author | Tomasz Majchrzak <tomasz.majchrzak@intel.com> | 2016-10-27 11:34:16 +0200 |
---|---|---|
committer | Jes Sorensen <Jes.Sorensen@redhat.com> | 2016-11-17 09:46:42 -0500 |
commit | cf52eff58ab9d08e3d016c4f22da8adfc295d7e0 (patch) | |
tree | c9702f2ab1392ea108d6fdcafe85998dbbe4db1b | |
parent | bbb52f2b1dd049a15323d7bccde50e5818abd175 (diff) | |
download | mdadm-cf52eff58ab9d08e3d016c4f22da8adfc295d7e0.tar.gz |
Increase buffer for sysfs disk state
Bad block support has incremented sysfs disk state reported by kernel
("external_bbl") so it became longer than 20 bytes. It causes reshape to
fail as it reads truncated entry from sysfs.
Increase buffer so it can accommodate the string including all state
values currently implemented in kernel at the same time.
Signed-off-by: Tomasz Majchrzak <tomasz.majchrzak@intel.com>
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
-rwxr-xr-x | Grow.c | 6 | ||||
-rw-r--r-- | monitor.c | 4 | ||||
-rw-r--r-- | super-intel.c | 5 |
3 files changed, 9 insertions, 6 deletions
@@ -4048,8 +4048,10 @@ static int grow_backup(struct mdinfo *sra, if (sd->disk.state & (1<<MD_DISK_FAULTY)) continue; if (sd->disk.state & (1<<MD_DISK_SYNC)) { - char sbuf[20]; - if (sysfs_get_str(sra, sd, "state", sbuf, 20) < 0 || + char sbuf[100]; + + if (sysfs_get_str(sra, sd, "state", + sbuf, sizeof(sbuf)) < 0 || strstr(sbuf, "faulty") || strstr(sbuf, "in_sync") == NULL) { /* this device is dead */ @@ -131,8 +131,8 @@ static enum sync_action read_action( int fd) int read_dev_state(int fd) { - char buf[60]; - int n = read_attr(buf, 60, fd); + char buf[100]; + int n = read_attr(buf, sizeof(buf), fd); char *cp; int rv = 0; diff --git a/super-intel.c b/super-intel.c index 1f79eab..5740088 100644 --- a/super-intel.c +++ b/super-intel.c @@ -10708,9 +10708,10 @@ int check_degradation_change(struct mdinfo *info, if (sd->disk.state & (1<<MD_DISK_FAULTY)) continue; if (sd->disk.state & (1<<MD_DISK_SYNC)) { - char sbuf[20]; + char sbuf[100]; + if (sysfs_get_str(info, - sd, "state", sbuf, 20) < 0 || + sd, "state", sbuf, sizeof(sbuf)) < 0 || strstr(sbuf, "faulty") || strstr(sbuf, "in_sync") == NULL) { /* this device is dead */ |