Make get_component_size() work with named array.

get_component_size() still assumes that all array are
 /sys/block/md%d or /sys/block/md_d%d
and so doesn't work with e.g. /sys/block/md_foo.

This cause "mdadm --detail" to report
   Used Dev Size : unknown
and causes problems when added spares and in other circumstances.

So change it to use stat2devnm() which does the right thing with all
types of array names.

Reported-and-tested-by: Robert LeBlanc <robert@leblancnet.us>
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
This commit is contained in:
NeilBrown 2016-12-22 13:14:59 +11:00 committed by Jes Sorensen
parent 6df5d1833f
commit c07566f14c
1 changed files with 2 additions and 8 deletions

10
sysfs.c
View File

@ -400,14 +400,8 @@ unsigned long long get_component_size(int fd)
int n;
if (fstat(fd, &stb))
return 0;
if (major(stb.st_rdev) != (unsigned)get_mdp_major())
snprintf(fname, MAX_SYSFS_PATH_LEN,
"/sys/block/md%d/md/component_size",
(int)minor(stb.st_rdev));
else
snprintf(fname, MAX_SYSFS_PATH_LEN,
"/sys/block/md_d%d/md/component_size",
(int)minor(stb.st_rdev)>>MdpMinorShift);
snprintf(fname, MAX_SYSFS_PATH_LEN,
"/sys/block/%s/md/component_size", stat2devnm(&stb));
fd = open(fname, O_RDONLY);
if (fd < 0)
return 0;