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