From: NeilBrown This the role that a device has in an array can be viewed and set. Signed-off-by: Neil Brown Cc: Greg KH Signed-off-by: Andrew Morton --- Documentation/md.txt | 8 ++++++++ drivers/md/md.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff -puN Documentation/md.txt~md-expose-device-slot-information-via-sysfs Documentation/md.txt --- devel/Documentation/md.txt~md-expose-device-slot-information-via-sysfs 2005-12-12 02:04:34.000000000 -0800 +++ devel-akpm/Documentation/md.txt 2005-12-12 02:04:34.000000000 -0800 @@ -236,6 +236,14 @@ Each directory contains: providing an ongoing count for arrays with metadata managed by userspace. + slot + This gives the role that the device has in the array. It will + either be 'none' if the device is not active in the array + (i.e. is a spare or has failed) or an integer less than the + 'raid_disks' number for the array indicating which possition + it currently fills. This can only be set while assembling an + array. A device for which this is set is assumed to be working. + An active md device will also contain and entry for each active device in the array. These are named diff -puN drivers/md/md.c~md-expose-device-slot-information-via-sysfs drivers/md/md.c --- devel/drivers/md/md.c~md-expose-device-slot-information-via-sysfs 2005-12-12 02:04:34.000000000 -0800 +++ devel-akpm/drivers/md/md.c 2005-12-12 02:04:34.000000000 -0800 @@ -1630,10 +1630,45 @@ errors_store(mdk_rdev_t *rdev, const cha static struct rdev_sysfs_entry rdev_errors = __ATTR(errors, 0644, errors_show, errors_store); +static ssize_t +slot_show(mdk_rdev_t *rdev, char *page) +{ + if (rdev->raid_disk < 0) + return sprintf(page, "none\n"); + else + return sprintf(page, "%d\n", rdev->raid_disk); +} + +static ssize_t +slot_store(mdk_rdev_t *rdev, const char *buf, size_t len) +{ + char *e; + int slot = simple_strtoul(buf, &e, 10); + if (strncmp(buf, "none", 4)==0) + slot = -1; + else if (e==buf || (*e && *e!= '\n')) + return -EINVAL; + if (rdev->mddev->pers) + /* Cannot set slot in active array (yet) */ + return -EBUSY; + if (slot >= rdev->mddev->raid_disks) + return -ENOSPC; + rdev->raid_disk = slot; + /* assume it is working */ + rdev->flags = 0; + set_bit(In_sync, &rdev->flags); + return len; +} + + +static struct rdev_sysfs_entry rdev_slot = +__ATTR(slot, 0644, slot_show, slot_store); + static struct attribute *rdev_default_attrs[] = { &rdev_state.attr, &rdev_super.attr, &rdev_errors.attr, + &rdev_slot.attr, NULL, }; static ssize_t _