sprintf(sra->name, "md%d", minor(stb.st_rdev));
else
sprintf(sra->name, "md_d%d",
- minor(stb.st_rdev)/16);
+ minor(stb.st_rdev)>>MdpMinorShift);
} else {
if (devnum >= 0)
sprintf(sra->name, "md%d", devnum);
if (load_sys(fname, buf))
goto abort;
sra->component_size = strtoull(buf, NULL, 0);
+ /* sysfs reports "K", but we want sectors */
+ sra->component_size *= 2;
}
if (options & GET_CHUNK) {
strcpy(base, "chunk_size");
goto abort;
sra->chunk = strtoul(buf, NULL, 0);
}
+ if (options & GET_CACHE) {
+ strcpy(base, "stripe_cache_size");
+ if (load_sys(fname, buf))
+ goto abort;
+ sra->cache_size = strtoul(buf, NULL, 0);
+ }
if (! (options & GET_DEVS))
return sra;
* We cannot trust GET_ARRAY_INFO ioctl as it's
* size field is only 32bits.
* So look in /sys/block/mdXXX/md/component_size
+ *
+ * This returns in units of sectors.
*/
struct stat stb;
char fname[50];
minor(stb.st_rdev));
else
sprintf(fname, "/sys/block/md_d%d/md/component_size",
- minor(stb.st_rdev)/16);
+ minor(stb.st_rdev)>>MdpMinorShift);
fd = open(fname, O_RDONLY);
if (fd < 0)
return 0;
if (n == sizeof(fname))
return 0;
fname[n] = 0;
- return strtoull(fname, NULL, 10);
+ return strtoull(fname, NULL, 10) * 2;
}
int sysfs_set_str(struct sysarray *sra, struct sysdev *dev,