Re: [PATCH] md: allow changing set_name of running array

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Aug 30 2017, Michał Mirosław wrote:

> Allow changing active array's set_name. This is the only way to
> safely update superblock on an array which carries a mounted fs.

Do you really need to change the set_name of an active array?

The name is only used when the array is actived, so wait until the next
time the array is stopped, and change the name then.

You can boot with a rescue CD or similar and use "--assemble
--update=name", or with a bit of effort you could get the normal boot
sequence to change the name.

I wouldn't object to adding something to mdadm so that it would read
something from mdadm.conf, and update the set name at boot time.

What is the underlying problem that you are trying to solve here?

Thanks,
NeilBrown


>
> Signed-off-by: Michał Mirosław <mirq-linux@xxxxxxxxxxxx>
> ---
>  drivers/md/md.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 79 insertions(+)
>
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index caca5d689cdc..59aa10669bef 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -5051,6 +5051,84 @@ static struct md_sysfs_entry md_consistency_policy =
>  __ATTR(consistency_policy, S_IRUGO | S_IWUSR, consistency_policy_show,
>         consistency_policy_store);
>  
> +static ssize_t
> +set_name_show(struct mddev *mddev, char *page)
> +{
> +	struct mdp_superblock_1 *sb;
> +	struct md_rdev *rdev;
> +	int err;
> +
> +	err = mddev_lock(mddev);
> +	if (err)
> +		return err;
> +
> +	/* only version-1 superblocks carry a MD set's name */
> +	err = -ENXIO;
> +	if (mddev->major_version != 1)
> +		goto out_unlock;
> +
> +	err = -EINVAL;
> +	rdev_for_each(rdev, mddev) {
> +		if (WARN_ON(!rdev->sb_loaded))
> +			continue;
> +
> +		sb = page_address(rdev->sb_page);
> +		err = sprintf(page, "%.32s\n", sb->set_name);
> +		break;
> +	}
> +
> +out_unlock:
> +	mddev_unlock(mddev);
> +	return err;
> +}
> +
> +static ssize_t
> +set_name_store(struct mddev *mddev, const char *buf, size_t buflen)
> +{
> +	struct mdp_superblock_1 *sb;
> +	struct md_rdev *rdev;
> +	size_t len = buflen;
> +	int err;
> +
> +	if (len && buf[len - 1] == '\n')
> +		--len;
> +
> +	if (len > sizeof(sb->set_name))
> +		return -ENOSPC;
> +
> +	err = mddev_lock(mddev);
> +	if (err)
> +		return err;
> +
> +	/* only version-1 superblocks carry a MD set's name */
> +	err = -ENXIO;
> +	if (mddev->major_version != 1)
> +		goto out_unlock;
> +
> +	err = -EROFS;
> +	if (mddev->ro)
> +		goto out_unlock;
> +
> +	rdev_for_each(rdev, mddev) {
> +		if (WARN_ON(!rdev->sb_loaded))
> +			continue;
> +
> +		sb = page_address(rdev->sb_page);
> +		memcpy(sb->set_name, buf, len);
> +		memset(&sb->set_name[len], 0, sizeof(sb->set_name) - len);
> +	}
> +
> +	md_update_sb(mddev, 1);
> +	err = buflen;
> +
> +out_unlock:
> +	mddev_unlock(mddev);
> +	return err;
> +}
> +
> +static struct md_sysfs_entry md_set_name =
> +__ATTR(set_name, S_IRUGO | S_IWUSR, set_name_show, set_name_store);
> +
>  static struct attribute *md_default_attrs[] = {
>  	&md_level.attr,
>  	&md_layout.attr,
> @@ -5067,6 +5145,7 @@ static struct attribute *md_default_attrs[] = {
>  	&md_array_size.attr,
>  	&max_corr_read_errors.attr,
>  	&md_consistency_policy.attr,
> +	&md_set_name.attr,
>  	NULL,
>  };
>  
> -- 
> 2.11.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-raid" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux