[PATCH] md: expose device slot information via sysfs
This the role that a device has in an array can be viewed and set. Signed-off-by: Neil Brown <neilb@suse.de> Acked-by: Greg KH <greg@kroah.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
2bf071bf50
commit
014236d2b8
@@ -236,6 +236,14 @@ Each directory contains:
|
|||||||
providing an ongoing count for arrays with metadata managed by
|
providing an ongoing count for arrays with metadata managed by
|
||||||
userspace.
|
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
|
An active md device will also contain and entry for each active device
|
||||||
in the array. These are named
|
in the array. These are named
|
||||||
|
@@ -1630,10 +1630,45 @@ errors_store(mdk_rdev_t *rdev, const char *buf, size_t len)
|
|||||||
static struct rdev_sysfs_entry rdev_errors =
|
static struct rdev_sysfs_entry rdev_errors =
|
||||||
__ATTR(errors, 0644, errors_show, errors_store);
|
__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[] = {
|
static struct attribute *rdev_default_attrs[] = {
|
||||||
&rdev_state.attr,
|
&rdev_state.attr,
|
||||||
&rdev_super.attr,
|
&rdev_super.attr,
|
||||||
&rdev_errors.attr,
|
&rdev_errors.attr,
|
||||||
|
&rdev_slot.attr,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
static ssize_t
|
static ssize_t
|
||||||
|
Reference in New Issue
Block a user