Re: [PATCH 6/7] multipathd: Add auto_resize config option

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

 



On Thu, 2023-11-02 at 18:15 -0400, Benjamin Marzinski wrote:
> This option gives multipathd the ability to automatically resize a
> device when it detects that all of the path devices have changed. By
> default it is set to never, and multipathd will continue to work like
> it
> always has, where a users must manually resize a multipath device.
> 
> Signed-off-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx>
> ---
>  libmultipath/config.c         |  2 ++
>  libmultipath/config.h         |  3 +++
>  libmultipath/configure.c      |  1 +
>  libmultipath/defaults.h       |  1 +
>  libmultipath/dict.c           | 48
> +++++++++++++++++++++++++++++++++++
>  libmultipath/dict.h           |  1 +
>  libmultipath/hwtable.c        |  1 +
>  libmultipath/propsel.c        | 17 +++++++++++++
>  libmultipath/propsel.h        |  1 +
>  libmultipath/structs.h        |  8 ++++++
>  multipath/multipath.conf.5.in | 16 ++++++++++++
>  multipathd/main.c             | 24 +++++++++++++++++-
>  12 files changed, 122 insertions(+), 1 deletion(-)
> 
> diff --git a/libmultipath/config.c b/libmultipath/config.c
> index 9d90f512..e6024955 100644
> --- a/libmultipath/config.c
> +++ b/libmultipath/config.c
> @@ -464,6 +464,7 @@ merge_hwe (struct hwentry * dst, struct hwentry *
> src)
>  	merge_num(ghost_delay);
>  	merge_num(all_tg_pt);
>  	merge_num(recheck_wwid);
> +	merge_num(auto_resize);

Why make this a hardware-specific option? Isn't it sufficient to just
set this in the defaults section? I can hardly imagine users wanting
auto-resize for one array and not for another.

Other than that, looks good to me (one nit below).

Martin


> diff --git a/multipath/multipath.conf.5.in
> b/multipath/multipath.conf.5.in
> index 41f3927e..c90383cf 100644
> --- a/multipath/multipath.conf.5.in
> +++ b/multipath/multipath.conf.5.in
> @@ -1333,6 +1333,22 @@ The default is: \fBno\fR
>  .
>  .
>  .TP
> +.B auto_resize
> +Controls when multipathd will automatically resize a multipath
> device.  If set
> +to \fInever\fR, multipath devices must always be manually resized by
> either
> +running \fBmultipathd resize map <name>\fR or \fRmultipath -r
> <name>\fR.  If

I suggest not mentioning "multipath -r" here.

> +set to \fIgrow_only\fR, when multipathd detects that all of a
> multipath
> +device's paths have increased in size, it will automatically grow
> the multipath
> +device to the new size. If set to \fIgrow_shrink\fR, multipathd will
> also
> +automatically shrink the device once it detects all of its paths
> have decreased
> +in size.
> +.RS
> +.TP
> +The default is: \fBnever\fR
> +.RE
> +.
> +.
> +.TP
>  .B enable_foreign
>  Enables or disables foreign libraries (see section
>  .I FOREIGN MULTIPATH SUPPORT
> diff --git a/multipathd/main.c b/multipathd/main.c
> index 3b4c5b09..ac733491 100644
> --- a/multipathd/main.c
> +++ b/multipathd/main.c
> @@ -1633,7 +1633,6 @@ uev_update_path (struct uevent *uev, struct
> vectors * vecs)
>  		ro = uevent_get_disk_ro(uev);
>  		if (needs_ro_update(mpp, ro)) {
>  			condlog(2, "%s: update path write_protect to
> '%d' (uevent)", uev->kernel, ro);
> -
>  			if (mpp->wait_for_udev)
>  				mpp->wait_for_udev = 2;
>  			else {
> @@ -1648,6 +1647,29 @@ uev_update_path (struct uevent *uev, struct
> vectors * vecs)
>  				}
>  			}
>  		}
> +		if (mpp->auto_resize != AUTO_RESIZE_NEVER &&
> +		    !mpp->wait_for_udev) {
> +			struct pathgroup *pgp;
> +			struct path *pp2;
> +			unsigned int i, j;
> +			unsigned long long orig_size = mpp->size;
> +
> +			if (!pp->size || pp->size == mpp->size ||
> +                            (pp->size < mpp->size &&

There's a whitespace issue here (space indentation).

> +			     mpp->auto_resize ==
> AUTO_RESIZE_GROW_ONLY))
> +				goto out;
> +
> +			vector_foreach_slot(mpp->pg, pgp, i)
> +				vector_foreach_slot (pgp->paths,
> pp2, j)
> +					if (pp2->size && pp2->size
> != pp->size)
> +						goto out;
> +			retval = resize_map(mpp, pp->size, vecs);
> +			if (retval == 2)
> +				condlog(2, "%s: map removed during
> resize", pp->dev);
> +			else if (retval == 0)
> +				condlog(2, "%s: resized map from
> %llu to %llu",
> +					mpp->alias, orig_size, pp-
> >size);
> +		}
>  	}
>  out:
>  	lock_cleanup_pop(vecs->lock);






[Index of Archives]     [DM Crypt]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Packaging]     [Fedora SELinux]     [Yosemite Discussion]     [KDE Users]     [Fedora Docs]

  Powered by Linux