Re: [PATCH 2/8] imsm: FIX: mdadm should process local data

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

 



On Wed, 12 Jan 2011 14:54:34 +0100 Adam Kwolek <adam.kwolek@xxxxxxxxx> wrote:

> When update is created by mdadm, local information should be updated also.
> This makes us to prepare one update for mdmon and second "update" to maintain local changes.
> we can use prepared update for "local/mdadm" metadata update purposes.
> We have 2 cases:
> 1. when metadata is updated by mdmon, we avoid metadata reloading in mdadm.
>    we proceed the same updtate 2 times:
> 	- one time in mdadm for "local update"
>         - second time in mdmon for real metadat update
> 2. when metadata is updated by mdadm (no mdmon running) updates are processed in the same
>    way.
> 	- one time in mdadm for "local update"
> 	- there is no "second time" update but mdadm just flushes
>           metadata to array
>    This let us to avoid code duplication by using prepare and process update functions
>    as for update via mdmon. This makes update preparing mdmon independent
>    and there is no need to maintain the same thing in 2 places in code.
> 

I've applied something like this, but with some clean-ups which make the
previous patch unnecessary.

NeilBrown


> 
> Signed-off-by: Adam Kwolek <adam.kwolek@xxxxxxxxx>
> ---
> 
>  super-intel.c |   82 ++++++++++++++++++---------------------------------------
>  1 files changed, 26 insertions(+), 56 deletions(-)
> 
> diff --git a/super-intel.c b/super-intel.c
> index a4a4497..7038433 100644
> --- a/super-intel.c
> +++ b/super-intel.c
> @@ -6523,6 +6523,27 @@ abort:
>  	return 0;
>  }
>  
> +static void imsm_update_metadata_locally(struct supertype *st,
> +				     struct metadata_update *mu)
> +{
> +	void **space_list;
> +
> +	if ((!mu) || (!st))
> +		return;
> +
> +	imsm_prepare_update(st, mu);
> +	imsm_process_update(st, mu);
> +
> +	if (mu->space_list) {
> +		space_list = (void **)*mu->space_list;
> +		while (space_list) {
> +			void *space = space_list;
> +			space_list = *space_list;
> +			free(space);
> +		}
> +		mu->space_list = NULL;
> +	}
> +}
>  
>  static int imsm_reshape_super(struct supertype *st, long long size, int level,
>  			      int layout, int chunksize, int raid_disks,
> @@ -6565,11 +6586,6 @@ static int imsm_reshape_super(struct supertype *st, long long size, int level,
>  			    st, &geo, &old_raid_disks)) {
>  			struct imsm_update_reshape *u = NULL;
>  			int len;
> -			struct intel_super *super = st->sb;
> -			void **space_list;
> -			struct intel_dev *dl;
> -			void **space_tail = (void **)&space_list;
> -
>  
>  			len = imsm_create_metadata_update_for_reshape(
>  				st, &geo, old_raid_disks, &u);
> @@ -6579,58 +6595,12 @@ static int imsm_reshape_super(struct supertype *st, long long size, int level,
>  				goto exit_imsm_reshape_super;
>  			}
>  
> -			/* As well as creating update, we apply update.
> -			 */
> +			ret_val = 0;
> +			append_metadata_update(st, u, len);
>  
> -			dprintf("imsm:prepare space list for update_reshape\n");
> -			for (dl = super->devlist; dl;
> -			     dl = dl->next) {
> -				int size = sizeof_imsm_dev(dl->dev, 1);
> -				void *s;
> -				if (u->new_raid_disks > u->old_raid_disks)
> -					size += sizeof(__u32)*2*
> -					(u->new_raid_disks - u->old_raid_disks);
> -				s = malloc(size);
> -				if (!s)
> -					break;
> -				*space_tail = s;
> -				space_tail = s;
> -				*space_tail = NULL;
> -			}
> -			ret_val = apply_reshape_container_disks_update(
> -				u, super, &space_list);
> -			if (ret_val) {
> -				/* reallocate anchor
> -				 */
> -				size_t buf_len = super->len;
> -				size_t len =
> -					disks_to_mpb_size(u->new_raid_disks);
> -				struct imsm_super *mpb = super->anchor;
> -				void *new_anchor;
> -
> -				if (__le32_to_cpu(mpb->mpb_size) + len >
> -				    buf_len) {
> -					buf_len = ROUND_UP(__le32_to_cpu(
> -						mpb->mpb_size) + len, 512);
> -					if (posix_memalign(&new_anchor,
> -							   512, buf_len) == 0) {
> -						memcpy(new_anchor, super->buf,
> -						       super->len);
> -						free(super->buf);
> -						super->buf = new_anchor;
> -						super->len = buf_len;
> -					}
> -					super->updates_pending++;
> -					ret_val = 0;
> -				}
> -			} else {
> -				while (space_list) {
> -					void *space = space_list;
> -					space_list = *space_list;
> -					free(space);
> -				}
> -				free(u);
> -			}
> +			/* update metadata locally
> +			 */
> +			imsm_update_metadata_locally(st, st->updates);
>  		} else
>  			fprintf(stderr, Name "imsm: Operation is not allowed "
>  				"on this container\n");
> 
> --
> 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

--
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


[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