md: add 'recovery_start' per-device sysfs attribute
Enable external metadata arrays to manage rebuild checkpointing via a md/dev-XXX/recovery_start attribute which reflects rdev->recovery_offset Also update resync_start_store to allow 'none' to be written, for consistency. Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
@@ -2551,12 +2551,49 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
|
||||
static struct rdev_sysfs_entry rdev_size =
|
||||
__ATTR(size, S_IRUGO|S_IWUSR, rdev_size_show, rdev_size_store);
|
||||
|
||||
|
||||
static ssize_t recovery_start_show(mdk_rdev_t *rdev, char *page)
|
||||
{
|
||||
unsigned long long recovery_start = rdev->recovery_offset;
|
||||
|
||||
if (test_bit(In_sync, &rdev->flags) ||
|
||||
recovery_start == MaxSector)
|
||||
return sprintf(page, "none\n");
|
||||
|
||||
return sprintf(page, "%llu\n", recovery_start);
|
||||
}
|
||||
|
||||
static ssize_t recovery_start_store(mdk_rdev_t *rdev, const char *buf, size_t len)
|
||||
{
|
||||
unsigned long long recovery_start;
|
||||
|
||||
if (cmd_match(buf, "none"))
|
||||
recovery_start = MaxSector;
|
||||
else if (strict_strtoull(buf, 10, &recovery_start))
|
||||
return -EINVAL;
|
||||
|
||||
if (rdev->mddev->pers &&
|
||||
rdev->raid_disk >= 0)
|
||||
return -EBUSY;
|
||||
|
||||
rdev->recovery_offset = recovery_start;
|
||||
if (recovery_start == MaxSector)
|
||||
set_bit(In_sync, &rdev->flags);
|
||||
else
|
||||
clear_bit(In_sync, &rdev->flags);
|
||||
return len;
|
||||
}
|
||||
|
||||
static struct rdev_sysfs_entry rdev_recovery_start =
|
||||
__ATTR(recovery_start, S_IRUGO|S_IWUSR, recovery_start_show, recovery_start_store);
|
||||
|
||||
static struct attribute *rdev_default_attrs[] = {
|
||||
&rdev_state.attr,
|
||||
&rdev_errors.attr,
|
||||
&rdev_slot.attr,
|
||||
&rdev_offset.attr,
|
||||
&rdev_size.attr,
|
||||
&rdev_recovery_start.attr,
|
||||
NULL,
|
||||
};
|
||||
static ssize_t
|
||||
@@ -3101,7 +3138,9 @@ resync_start_store(mddev_t *mddev, const char *buf, size_t len)
|
||||
|
||||
if (mddev->pers)
|
||||
return -EBUSY;
|
||||
if (!*buf || (*e && *e != '\n'))
|
||||
if (cmd_match(buf, "none"))
|
||||
n = MaxSector;
|
||||
else if (!*buf || (*e && *e != '\n'))
|
||||
return -EINVAL;
|
||||
|
||||
mddev->recovery_cp = n;
|
||||
|
Reference in New Issue
Block a user