mirror of
https://github.com/torvalds/linux.git
synced 2024-11-01 13:03:25 +01:00
md: Add new_level sysfs interface
Now reshape supports two ways: with backup file or without backup file. For the situation without backup file, it needs to change data offset. It doesn't need systemd service mdadm-grow-continue. So it can finish the reshape job in one process environment. It can know the new level from mdadm --grow command and can change to new level after reshape finishes. For the situation with backup file, it needs systemd service mdadm-grow-continue to monitor reshape progress. So there are two process envolved. One is mdadm --grow command whick kicks off reshape and wakes up mdadm-grow-continue service. The second process is the service, which doesn't know the new level from the first process. In kernel space mddev->new_level is used to record the new level when doing reshape. This patch adds a new interface to help mdadm update new_level and sync it to metadata. Then mdadm-grow-continue can read the right new_level. Commit log revised by Song Liu. Please refer to the link for more details. Signed-off-by: Xiao Ni <xni@redhat.com> Link: https://lore.kernel.org/r/20240904235453.99120-1-xni@redhat.com Signed-off-by: Song Liu <song@kernel.org>
This commit is contained in:
parent
2d2b3bc145
commit
d981ed8419
1 changed files with 29 additions and 0 deletions
|
@ -4052,6 +4052,34 @@ level_store(struct mddev *mddev, const char *buf, size_t len)
|
|||
static struct md_sysfs_entry md_level =
|
||||
__ATTR(level, S_IRUGO|S_IWUSR, level_show, level_store);
|
||||
|
||||
static ssize_t
|
||||
new_level_show(struct mddev *mddev, char *page)
|
||||
{
|
||||
return sprintf(page, "%d\n", mddev->new_level);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
new_level_store(struct mddev *mddev, const char *buf, size_t len)
|
||||
{
|
||||
unsigned int n;
|
||||
int err;
|
||||
|
||||
err = kstrtouint(buf, 10, &n);
|
||||
if (err < 0)
|
||||
return err;
|
||||
err = mddev_lock(mddev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
mddev->new_level = n;
|
||||
md_update_sb(mddev, 1);
|
||||
|
||||
mddev_unlock(mddev);
|
||||
return len;
|
||||
}
|
||||
static struct md_sysfs_entry md_new_level =
|
||||
__ATTR(new_level, 0664, new_level_show, new_level_store);
|
||||
|
||||
static ssize_t
|
||||
layout_show(struct mddev *mddev, char *page)
|
||||
{
|
||||
|
@ -5583,6 +5611,7 @@ __ATTR(serialize_policy, S_IRUGO | S_IWUSR, serialize_policy_show,
|
|||
|
||||
static struct attribute *md_default_attrs[] = {
|
||||
&md_level.attr,
|
||||
&md_new_level.attr,
|
||||
&md_layout.attr,
|
||||
&md_raid_disks.attr,
|
||||
&md_uuid.attr,
|
||||
|
|
Loading…
Reference in a new issue