import mdadm-4.1-14.el8
This commit is contained in:
		
							parent
							
								
									a5476d5870
								
							
						
					
					
						commit
						5a71a64698
					
				| @ -0,0 +1,55 @@ | |||||||
|  | From 2551061c253b8fd45ee93d1aab3e91d2c7ac9c20 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Coly Li <colyli@suse.de> | ||||||
|  | Date: Mon, 24 Feb 2020 12:34:09 +0100 | ||||||
|  | Subject: [RHEL7.9 PATCH 62/77] mdadm.8: add note information for raid0 growing | ||||||
|  |  operation | ||||||
|  | 
 | ||||||
|  | When growing a raid0 device, if the new component disk size is not | ||||||
|  | big enough, the grow operation may fail due to lack of backup space. | ||||||
|  | 
 | ||||||
|  | The minimum backup space should be larger than: | ||||||
|  |  LCM(old, new) * chunk-size * 2 | ||||||
|  | 
 | ||||||
|  | where LCM() is the least common multiple of the old and new count of | ||||||
|  | component disks, and "* 2" comes from the fact that mdadm refuses to | ||||||
|  | use more than half of a spare device for backup space. | ||||||
|  | 
 | ||||||
|  | There are users reporting such failure when they grew a raid0 array | ||||||
|  | with small component disk. Neil Brown points out this is not a bug | ||||||
|  | and how the failure comes. This patch adds note information into | ||||||
|  | mdadm(8) man page in the Notes part of GROW MODE section to explain | ||||||
|  | the minimum size requirement of new component disk size or external | ||||||
|  | backup size. | ||||||
|  | 
 | ||||||
|  | Reviewed-by: Petr Vorel <pvorel@suse.cz> | ||||||
|  | Cc: NeilBrown <neilb@suse.de> | ||||||
|  | Cc: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | Cc: Paul Menzel <pmenzel@molgen.mpg.de> | ||||||
|  | Cc: Wols Lists <antlists@youngman.org.uk> | ||||||
|  | Cc: Nix <nix@esperi.org.uk> | ||||||
|  | Signed-off-by: Coly Li <colyli@suse.de> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  mdadm.8.in | 6 ++++++ | ||||||
|  |  1 file changed, 6 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/mdadm.8.in b/mdadm.8.in
 | ||||||
|  | index 5d00faf..a3494a1 100644
 | ||||||
|  | --- a/mdadm.8.in
 | ||||||
|  | +++ b/mdadm.8.in
 | ||||||
|  | @@ -2768,6 +2768,12 @@ option and it is transparent for assembly feature.
 | ||||||
|  |  .IP \(bu 4 | ||||||
|  |  Roaming between Windows(R) and Linux systems for IMSM metadata is not | ||||||
|  |  supported during grow process. | ||||||
|  | +.IP \(bu 4
 | ||||||
|  | +When growing a raid0 device, the new component disk size (or external
 | ||||||
|  | +backup size) should be larger than LCM(old, new) * chunk-size * 2,
 | ||||||
|  | +where LCM() is the least common multiple of the old and new count of
 | ||||||
|  | +component disks, and "* 2" comes from the fact that mdadm refuses to
 | ||||||
|  | +use more than half of a spare device for backup space.
 | ||||||
|  |   | ||||||
|  |  .SS SIZE CHANGES | ||||||
|  |  Normally when an array is built the "size" is taken from the smallest | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
| @ -1,15 +1,19 @@ | |||||||
| commit fd38b8ea80ff8e0317e12d1d70431148ceedd5fd | From fd38b8ea80ff8e0317e12d1d70431148ceedd5fd Mon Sep 17 00:00:00 2001 | ||||||
| Author: Xiao Ni <xni@redhat.com> | From: Xiao Ni <xni@redhat.com> | ||||||
| Date:   Tue Feb 11 21:44:15 2020 +0800 | Date: Tue, 11 Feb 2020 21:44:15 +0800 | ||||||
|  | Subject: [RHEL7.9 PATCH 63/77] Remove the legacy whitespace | ||||||
| 
 | 
 | ||||||
|     Remove the legacy whitespace | The whitespace between Environment= and the true value causes confusion. | ||||||
|      | To avoid confusing other people in future, remove the whitespace to keep | ||||||
|     The whitespace between Environment= and the true value causes confusion. | it a simple, unambiguous syntax | ||||||
|     To avoid confusing other people in future, remove the whitespace to keep | 
 | ||||||
|     it a simple, unambiguous syntax | Signed-off-by: Xiao Ni <xni@redhat.com> | ||||||
|      | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|     Signed-off-by: Xiao Ni <xni@redhat.com> | ---
 | ||||||
|     Signed-off-by: Jes Sorensen <jsorensen@fb.com> |  systemd/mdcheck_continue.service  | 2 +- | ||||||
|  |  systemd/mdcheck_start.service     | 2 +- | ||||||
|  |  systemd/mdmonitor-oneshot.service | 2 +- | ||||||
|  |  3 files changed, 3 insertions(+), 3 deletions(-) | ||||||
| 
 | 
 | ||||||
| diff --git a/systemd/mdcheck_continue.service b/systemd/mdcheck_continue.service
 | diff --git a/systemd/mdcheck_continue.service b/systemd/mdcheck_continue.service
 | ||||||
| index aa02dde..854317f 100644
 | index aa02dde..854317f 100644
 | ||||||
| @ -50,3 +54,6 @@ index fd469b1..373955a 100644 | |||||||
|  EnvironmentFile=-/run/sysconfig/mdadm |  EnvironmentFile=-/run/sysconfig/mdadm | ||||||
|  ExecStartPre=-/usr/lib/mdadm/mdadm_env.sh |  ExecStartPre=-/usr/lib/mdadm/mdadm_env.sh | ||||||
|  ExecStart=BINDIR/mdadm --monitor --oneshot $MDADM_MONITOR_ARGS |  ExecStart=BINDIR/mdadm --monitor --oneshot $MDADM_MONITOR_ARGS | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,91 @@ | |||||||
|  | From 3364781b929f571a3dc3a6afed09eb1b03ce607c Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Blazej Kucman <blazej.kucman@intel.com> | ||||||
|  | Date: Wed, 19 Feb 2020 10:54:49 +0100 | ||||||
|  | Subject: [RHEL7.9 PATCH 64/77] imsm: pass subarray id to kill_subarray | ||||||
|  |  function | ||||||
|  | 
 | ||||||
|  | After patch b6180160f ("imsm: save current_vol number") | ||||||
|  | current_vol for imsm is not set and kill_subarray() | ||||||
|  | cannot determine which volume has to be deleted. | ||||||
|  | Volume has to be passed as "subarray_id". | ||||||
|  | The parameter affects only IMSM metadata. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Blazej Kucman <blazej.kucman@intel.com> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  Kill.c        | 2 +- | ||||||
|  |  mdadm.h       | 3 ++- | ||||||
|  |  super-ddf.c   | 2 +- | ||||||
|  |  super-intel.c | 9 ++++----- | ||||||
|  |  4 files changed, 8 insertions(+), 8 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/Kill.c b/Kill.c
 | ||||||
|  | index d4767e2..bfd0efd 100644
 | ||||||
|  | --- a/Kill.c
 | ||||||
|  | +++ b/Kill.c
 | ||||||
|  | @@ -119,7 +119,7 @@ int Kill_subarray(char *dev, char *subarray, int verbose)
 | ||||||
|  |  		st->update_tail = &st->updates; | ||||||
|  |   | ||||||
|  |  	/* ok we've found our victim, drop the axe */ | ||||||
|  | -	rv = st->ss->kill_subarray(st);
 | ||||||
|  | +	rv = st->ss->kill_subarray(st, subarray);
 | ||||||
|  |  	if (rv) { | ||||||
|  |  		if (verbose >= 0) | ||||||
|  |  			pr_err("Failed to delete subarray-%s from %s\n", | ||||||
|  | diff --git a/mdadm.h b/mdadm.h
 | ||||||
|  | index 9e98778..d94569f 100644
 | ||||||
|  | --- a/mdadm.h
 | ||||||
|  | +++ b/mdadm.h
 | ||||||
|  | @@ -1038,7 +1038,8 @@ extern struct superswitch {
 | ||||||
|  |  	/* query the supertype for default geometry */ | ||||||
|  |  	void (*default_geometry)(struct supertype *st, int *level, int *layout, int *chunk); /* optional */ | ||||||
|  |  	/* Permit subarray's to be deleted from inactive containers */ | ||||||
|  | -	int (*kill_subarray)(struct supertype *st); /* optional */
 | ||||||
|  | +	int (*kill_subarray)(struct supertype *st,
 | ||||||
|  | +			     char *subarray_id); /* optional */
 | ||||||
|  |  	/* Permit subarray's to be modified */ | ||||||
|  |  	int (*update_subarray)(struct supertype *st, char *subarray, | ||||||
|  |  			       char *update, struct mddev_ident *ident); /* optional */ | ||||||
|  | diff --git a/super-ddf.c b/super-ddf.c
 | ||||||
|  | index 7802063..7cd5702 100644
 | ||||||
|  | --- a/super-ddf.c
 | ||||||
|  | +++ b/super-ddf.c
 | ||||||
|  | @@ -4446,7 +4446,7 @@ static int _kill_subarray_ddf(struct ddf_super *ddf, const char *guid)
 | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static int kill_subarray_ddf(struct supertype *st)
 | ||||||
|  | +static int kill_subarray_ddf(struct supertype *st, char *subarray_id)
 | ||||||
|  |  { | ||||||
|  |  	struct ddf_super *ddf = st->sb; | ||||||
|  |  	/* | ||||||
|  | diff --git a/super-intel.c b/super-intel.c
 | ||||||
|  | index 47809bc..e4d2122 100644
 | ||||||
|  | --- a/super-intel.c
 | ||||||
|  | +++ b/super-intel.c
 | ||||||
|  | @@ -7600,18 +7600,17 @@ static void default_geometry_imsm(struct supertype *st, int *level, int *layout,
 | ||||||
|  |   | ||||||
|  |  static void handle_missing(struct intel_super *super, struct imsm_dev *dev); | ||||||
|  |   | ||||||
|  | -static int kill_subarray_imsm(struct supertype *st)
 | ||||||
|  | +static int kill_subarray_imsm(struct supertype *st, char *subarray_id)
 | ||||||
|  |  { | ||||||
|  | -	/* remove the subarray currently referenced by ->current_vol */
 | ||||||
|  | +	/* remove the subarray currently referenced by subarray_id */
 | ||||||
|  |  	__u8 i; | ||||||
|  |  	struct intel_dev **dp; | ||||||
|  |  	struct intel_super *super = st->sb; | ||||||
|  | -	__u8 current_vol = super->current_vol;
 | ||||||
|  | +	__u8 current_vol = strtoul(subarray_id, NULL, 10);
 | ||||||
|  |  	struct imsm_super *mpb = super->anchor; | ||||||
|  |   | ||||||
|  | -	if (super->current_vol < 0)
 | ||||||
|  | +	if (mpb->num_raid_devs == 0)
 | ||||||
|  |  		return 2; | ||||||
|  | -	super->current_vol = -1; /* invalidate subarray cursor */
 | ||||||
|  |   | ||||||
|  |  	/* block deletions that would change the uuid of active subarrays | ||||||
|  |  	 * | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
							
								
								
									
										91
									
								
								SOURCES/0065-imsm-Remove-dump-restore-implementation.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								SOURCES/0065-imsm-Remove-dump-restore-implementation.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,91 @@ | |||||||
|  | From 45c43276d02a32876c7e1f9f0d04580595141b3d Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Blazej Kucman <blazej.kucman@intel.com> | ||||||
|  | Date: Wed, 19 Feb 2020 11:13:17 +0100 | ||||||
|  | Subject: [RHEL7.9 PATCH 65/77] imsm: Remove --dump/--restore implementation | ||||||
|  | 
 | ||||||
|  | Functionalities --dump and --restore are not supported. | ||||||
|  | Remove dead code from imsm. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Blazej Kucman <blazej.kucman@intel.com> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  super-intel.c | 56 -------------------------------------------------------- | ||||||
|  |  1 file changed, 56 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/super-intel.c b/super-intel.c
 | ||||||
|  | index e4d2122..c9a1af5 100644
 | ||||||
|  | --- a/super-intel.c
 | ||||||
|  | +++ b/super-intel.c
 | ||||||
|  | @@ -2128,61 +2128,6 @@ static void export_examine_super_imsm(struct supertype *st)
 | ||||||
|  |  	printf("MD_DEVICES=%u\n", mpb->num_disks); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static int copy_metadata_imsm(struct supertype *st, int from, int to)
 | ||||||
|  | -{
 | ||||||
|  | -	/* The second last sector of the device contains
 | ||||||
|  | -	 * the "struct imsm_super" metadata.
 | ||||||
|  | -	 * This contains mpb_size which is the size in bytes of the
 | ||||||
|  | -	 * extended metadata.  This is located immediately before
 | ||||||
|  | -	 * the imsm_super.
 | ||||||
|  | -	 * We want to read all that, plus the last sector which
 | ||||||
|  | -	 * may contain a migration record, and write it all
 | ||||||
|  | -	 * to the target.
 | ||||||
|  | -	 */
 | ||||||
|  | -	void *buf;
 | ||||||
|  | -	unsigned long long dsize, offset;
 | ||||||
|  | -	int sectors;
 | ||||||
|  | -	struct imsm_super *sb;
 | ||||||
|  | -	struct intel_super *super = st->sb;
 | ||||||
|  | -	unsigned int sector_size = super->sector_size;
 | ||||||
|  | -	unsigned int written = 0;
 | ||||||
|  | -
 | ||||||
|  | -	if (posix_memalign(&buf, MAX_SECTOR_SIZE, MAX_SECTOR_SIZE) != 0)
 | ||||||
|  | -		return 1;
 | ||||||
|  | -
 | ||||||
|  | -	if (!get_dev_size(from, NULL, &dsize))
 | ||||||
|  | -		goto err;
 | ||||||
|  | -
 | ||||||
|  | -	if (lseek64(from, dsize-(2*sector_size), 0) < 0)
 | ||||||
|  | -		goto err;
 | ||||||
|  | -	if ((unsigned int)read(from, buf, sector_size) != sector_size)
 | ||||||
|  | -		goto err;
 | ||||||
|  | -	sb = buf;
 | ||||||
|  | -	if (strncmp((char*)sb->sig, MPB_SIGNATURE, MPB_SIG_LEN) != 0)
 | ||||||
|  | -		goto err;
 | ||||||
|  | -
 | ||||||
|  | -	sectors = mpb_sectors(sb, sector_size) + 2;
 | ||||||
|  | -	offset = dsize - sectors * sector_size;
 | ||||||
|  | -	if (lseek64(from, offset, 0) < 0 ||
 | ||||||
|  | -	    lseek64(to, offset, 0) < 0)
 | ||||||
|  | -		goto err;
 | ||||||
|  | -	while (written < sectors * sector_size) {
 | ||||||
|  | -		int n = sectors*sector_size - written;
 | ||||||
|  | -		if (n > 4096)
 | ||||||
|  | -			n = 4096;
 | ||||||
|  | -		if (read(from, buf, n) != n)
 | ||||||
|  | -			goto err;
 | ||||||
|  | -		if (write(to, buf, n) != n)
 | ||||||
|  | -			goto err;
 | ||||||
|  | -		written += n;
 | ||||||
|  | -	}
 | ||||||
|  | -	free(buf);
 | ||||||
|  | -	return 0;
 | ||||||
|  | -err:
 | ||||||
|  | -	free(buf);
 | ||||||
|  | -	return 1;
 | ||||||
|  | -}
 | ||||||
|  | -
 | ||||||
|  |  static void detail_super_imsm(struct supertype *st, char *homehost, | ||||||
|  |  			      char *subarray) | ||||||
|  |  { | ||||||
|  | @@ -12270,7 +12215,6 @@ struct superswitch super_imsm = {
 | ||||||
|  |  	.reshape_super  = imsm_reshape_super, | ||||||
|  |  	.manage_reshape = imsm_manage_reshape, | ||||||
|  |  	.recover_backup = recover_backup_imsm, | ||||||
|  | -	.copy_metadata = copy_metadata_imsm,
 | ||||||
|  |  	.examine_badblocks = examine_badblocks_imsm, | ||||||
|  |  	.match_home	= match_home_imsm, | ||||||
|  |  	.uuid_from_super= uuid_from_super_imsm, | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
							
								
								
									
										32
									
								
								SOURCES/0066-imsm-Correct-minimal-device-size.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								SOURCES/0066-imsm-Correct-minimal-device-size.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | |||||||
|  | From 06a6101c0a4d2658798dc42f461ace8e6900f840 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Blazej Kucman <blazej.kucman@intel.com> | ||||||
|  | Date: Wed, 11 Mar 2020 15:40:13 +0100 | ||||||
|  | Subject: [RHEL7.9 PATCH 66/77] imsm: Correct minimal device size. | ||||||
|  | 
 | ||||||
|  | Check if given size of member drive is not less than 1 MibiByte. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Blazej Kucman <blazej.kucman@intel.com> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  super-intel.c | 5 ++++- | ||||||
|  |  1 file changed, 4 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/super-intel.c b/super-intel.c
 | ||||||
|  | index c9a1af5..6680df2 100644
 | ||||||
|  | --- a/super-intel.c
 | ||||||
|  | +++ b/super-intel.c
 | ||||||
|  | @@ -7425,7 +7425,10 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
 | ||||||
|  |  							verbose); | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	if (size && (size < 1024)) {
 | ||||||
|  | +	/*
 | ||||||
|  | +	 * Size is given in sectors.
 | ||||||
|  | +	 */
 | ||||||
|  | +	if (size && (size < 2048)) {
 | ||||||
|  |  		pr_err("Given size must be greater than 1M.\n"); | ||||||
|  |  		/* Depends on algorithm in Create.c : | ||||||
|  |  		 * if container was given (dev == NULL) return -1, | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,30 @@ | |||||||
|  | From 9e4494051de3f53228fabae56c116879bff5a0c8 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lidong Zhong <lidong.zhong@suse.com> | ||||||
|  | Date: Mon, 16 Mar 2020 10:16:49 +0800 | ||||||
|  | Subject: [RHEL7.9 PATCH 67/77] Detail: show correct bitmap info for cluster | ||||||
|  |  raid device | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Lidong Zhong <lidong.zhong@suse.com> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  Detail.c | 4 +++- | ||||||
|  |  1 file changed, 3 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/Detail.c b/Detail.c
 | ||||||
|  | index 832485f..daec4f1 100644
 | ||||||
|  | --- a/Detail.c
 | ||||||
|  | +++ b/Detail.c
 | ||||||
|  | @@ -468,7 +468,9 @@ int Detail(char *dev, struct context *c)
 | ||||||
|  |  		if (ioctl(fd, GET_BITMAP_FILE, &bmf) == 0 && bmf.pathname[0]) { | ||||||
|  |  			printf("     Intent Bitmap : %s\n", bmf.pathname); | ||||||
|  |  			printf("\n"); | ||||||
|  | -		} else if (array.state & (1<<MD_SB_BITMAP_PRESENT))
 | ||||||
|  | +		} else if (array.state & (1<<MD_SB_CLUSTERED))
 | ||||||
|  | +			printf("     Intent Bitmap : Internal(Clustered)\n\n");
 | ||||||
|  | +		else if (array.state & (1<<MD_SB_BITMAP_PRESENT))
 | ||||||
|  |  			printf("     Intent Bitmap : Internal\n\n"); | ||||||
|  |  		atime = array.utime; | ||||||
|  |  		if (atime) | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,67 @@ | |||||||
|  | From e48aed3c81a75fa3f761fb5b84e5d16f2baee709 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Artur Paszkiewicz <artur.paszkiewicz@intel.com> | ||||||
|  | Date: Tue, 17 Mar 2020 10:20:12 +0100 | ||||||
|  | Subject: [RHEL7.9 PATCH 68/77] imsm: support the Array Creation Time field in | ||||||
|  |  metadata | ||||||
|  | 
 | ||||||
|  | Also present its value in --examine and --examine --export. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  super-intel.c | 11 +++++++++-- | ||||||
|  |  1 file changed, 9 insertions(+), 2 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/super-intel.c b/super-intel.c
 | ||||||
|  | index 6680df2..8840fff 100644
 | ||||||
|  | --- a/super-intel.c
 | ||||||
|  | +++ b/super-intel.c
 | ||||||
|  | @@ -260,8 +260,9 @@ struct imsm_super {
 | ||||||
|  |  					 * (starts at 1) | ||||||
|  |  					 */ | ||||||
|  |  	__u16 filler1;			/* 0x4E - 0x4F */ | ||||||
|  | -#define IMSM_FILLERS 34
 | ||||||
|  | -	__u32 filler[IMSM_FILLERS];	/* 0x50 - 0xD7 RAID_MPB_FILLERS */
 | ||||||
|  | +	__u64 creation_time;		/* 0x50 - 0x57 Array creation time */
 | ||||||
|  | +#define IMSM_FILLERS 32
 | ||||||
|  | +	__u32 filler[IMSM_FILLERS];	/* 0x58 - 0xD7 RAID_MPB_FILLERS */
 | ||||||
|  |  	struct imsm_disk disk[1];	/* 0xD8 diskTbl[numDisks] */ | ||||||
|  |  	/* here comes imsm_dev[num_raid_devs] */ | ||||||
|  |  	/* here comes BBM logs */ | ||||||
|  | @@ -2014,6 +2015,7 @@ static void examine_super_imsm(struct supertype *st, char *homehost)
 | ||||||
|  |  	__u32 sum; | ||||||
|  |  	__u32 reserved = imsm_reserved_sectors(super, super->disks); | ||||||
|  |  	struct dl *dl; | ||||||
|  | +	time_t creation_time;
 | ||||||
|  |   | ||||||
|  |  	strncpy(str, (char *)mpb->sig, MPB_SIG_LEN); | ||||||
|  |  	str[MPB_SIG_LEN-1] = '\0'; | ||||||
|  | @@ -2022,6 +2024,9 @@ static void examine_super_imsm(struct supertype *st, char *homehost)
 | ||||||
|  |  	printf("    Orig Family : %08x\n", __le32_to_cpu(mpb->orig_family_num)); | ||||||
|  |  	printf("         Family : %08x\n", __le32_to_cpu(mpb->family_num)); | ||||||
|  |  	printf("     Generation : %08x\n", __le32_to_cpu(mpb->generation_num)); | ||||||
|  | +	creation_time = __le64_to_cpu(mpb->creation_time);
 | ||||||
|  | +	printf("  Creation Time : %.24s\n",
 | ||||||
|  | +		creation_time ? ctime(&creation_time) : "Unknown");
 | ||||||
|  |  	printf("     Attributes : "); | ||||||
|  |  	if (imsm_check_attributes(mpb->attributes)) | ||||||
|  |  		printf("All supported\n"); | ||||||
|  | @@ -2126,6 +2131,7 @@ static void export_examine_super_imsm(struct supertype *st)
 | ||||||
|  |  	printf("MD_LEVEL=container\n"); | ||||||
|  |  	printf("MD_UUID=%s\n", nbuf+5); | ||||||
|  |  	printf("MD_DEVICES=%u\n", mpb->num_disks); | ||||||
|  | +	printf("MD_CREATION_TIME=%llu\n", __le64_to_cpu(mpb->creation_time));
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static void detail_super_imsm(struct supertype *st, char *homehost, | ||||||
|  | @@ -5762,6 +5768,7 @@ static int add_to_super_imsm_volume(struct supertype *st, mdu_disk_info_t *dk,
 | ||||||
|  |  		sum += __gen_imsm_checksum(mpb); | ||||||
|  |  		mpb->family_num = __cpu_to_le32(sum); | ||||||
|  |  		mpb->orig_family_num = mpb->family_num; | ||||||
|  | +		mpb->creation_time = __cpu_to_le64((__u64)time(NULL));
 | ||||||
|  |  	} | ||||||
|  |  	super->current_disk = dl; | ||||||
|  |  	return 0; | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,39 @@ | |||||||
|  | From ba1b3bc80ea555c288f1119e69d9273249967081 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Artur Paszkiewicz <artur.paszkiewicz@intel.com> | ||||||
|  | Date: Tue, 17 Mar 2020 10:21:03 +0100 | ||||||
|  | Subject: [RHEL7.9 PATCH 69/77] imsm: show Subarray and Volume ID in --examine | ||||||
|  |  output | ||||||
|  | 
 | ||||||
|  | Show the index of the subarray as 'Subarray' and the value of the | ||||||
|  | my_vol_raid_dev_num field as 'Volume ID'. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  super-intel.c | 3 +++ | ||||||
|  |  1 file changed, 3 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/super-intel.c b/super-intel.c
 | ||||||
|  | index 8840fff..562a58c 100644
 | ||||||
|  | --- a/super-intel.c
 | ||||||
|  | +++ b/super-intel.c
 | ||||||
|  | @@ -1579,6 +1579,7 @@ static void print_imsm_dev(struct intel_super *super,
 | ||||||
|  |   | ||||||
|  |  	printf("\n"); | ||||||
|  |  	printf("[%.16s]:\n", dev->volume); | ||||||
|  | +	printf("       Subarray : %d\n", super->current_vol);
 | ||||||
|  |  	printf("           UUID : %s\n", uuid); | ||||||
|  |  	printf("     RAID Level : %d", get_imsm_raid_level(map)); | ||||||
|  |  	if (map2) | ||||||
|  | @@ -1683,6 +1684,8 @@ static void print_imsm_dev(struct intel_super *super,
 | ||||||
|  |  		printf("Multiple PPLs on journaling drive\n"); | ||||||
|  |  	else | ||||||
|  |  		printf("<unknown:%d>\n", dev->rwh_policy); | ||||||
|  | +
 | ||||||
|  | +	printf("      Volume ID : %u\n", dev->my_vol_raid_dev_num);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static void print_imsm_disk(struct imsm_disk *disk, | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
							
								
								
									
										35
									
								
								SOURCES/0070-udev-Ignore-change-event-for-imsm.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								SOURCES/0070-udev-Ignore-change-event-for-imsm.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | |||||||
|  | From e1b92ee0de26576a33b20c9dd6ef6bd8cab8e283 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com> | ||||||
|  | Date: Wed, 8 Apr 2020 16:44:52 +0200 | ||||||
|  | Subject: [RHEL7.9 PATCH 70/77] udev: Ignore change event for imsm | ||||||
|  | 
 | ||||||
|  | When adding a device to a container mdadm has to close its file | ||||||
|  | descriptor before sysfs_add_disk(). This generates change event. | ||||||
|  | There is race possibility because metadata is already written and other | ||||||
|  | -I process can place drive differently. As a result device can be added
 | ||||||
|  | to two containers simultaneously. | ||||||
|  | From IMSM perspective there is no need to react for change event. IMSM | ||||||
|  | doesn't support stacked devices. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  udev-md-raid-assembly.rules | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/udev-md-raid-assembly.rules b/udev-md-raid-assembly.rules
 | ||||||
|  | index 9f055ed..d668cdd 100644
 | ||||||
|  | --- a/udev-md-raid-assembly.rules
 | ||||||
|  | +++ b/udev-md-raid-assembly.rules
 | ||||||
|  | @@ -23,7 +23,7 @@ IMPORT{cmdline}="nodmraid"
 | ||||||
|  |  ENV{nodmraid}=="?*", GOTO="md_inc_end" | ||||||
|  |  ENV{ID_FS_TYPE}=="ddf_raid_member", GOTO="md_inc" | ||||||
|  |  ENV{noiswmd}=="?*", GOTO="md_inc_end" | ||||||
|  | -ENV{ID_FS_TYPE}=="isw_raid_member", GOTO="md_inc"
 | ||||||
|  | +ENV{ID_FS_TYPE}=="isw_raid_member", ACTION!="change", GOTO="md_inc"
 | ||||||
|  |  GOTO="md_inc_end" | ||||||
|  |   | ||||||
|  |  LABEL="md_inc" | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,109 @@ | |||||||
|  | From 185ec4397e61ad00dd68c841e15eaa8629eb9514 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Coly Li <colyli@suse.de> | ||||||
|  | Date: Sat, 11 Apr 2020 00:24:46 +0800 | ||||||
|  | Subject: [RHEL7.9 PATCH 71/77] Monitor: improve check_one_sharer() for | ||||||
|  |  checking duplicated process | ||||||
|  | 
 | ||||||
|  | When running mdadm monitor with scan mode, only one autorebuild process | ||||||
|  | is allowed. check_one_sharer() checks duplicated process by following | ||||||
|  | steps, | ||||||
|  | 1) Read autorebuild.pid file, | ||||||
|  |    - if file does not exist, no duplicated process, go to 3). | ||||||
|  |    - if file exists, continue to next step. | ||||||
|  | 2) Read pid number from autorebuild.pid file, then check procfs pid | ||||||
|  |    directory /proc/<PID>, | ||||||
|  |    - if the directory does not exist, no duplicated process, go to 3) | ||||||
|  |    - if the directory exists, print error message for duplicated process | ||||||
|  |      and exit this mdadm. | ||||||
|  | 3) Write current pid into autorebuild.pid file, continue to monitor in | ||||||
|  |    scan mode. | ||||||
|  | 
 | ||||||
|  | The problem for the above step 2) is, if after system reboots and | ||||||
|  | another different process happens to have exact same pid number which | ||||||
|  | autorebuild.pid file records, check_one_sharer() will treat it as a | ||||||
|  | duplicated mdadm process and returns error with message "Only one | ||||||
|  | autorebuild process allowed in scan mode, aborting". | ||||||
|  | 
 | ||||||
|  | This patch tries to fix the above same-pid-but-different-process issue | ||||||
|  | by one more step to check the process command name, | ||||||
|  | 1) Read autorebuild.pid file | ||||||
|  |    - if file does not exist, no duplicated process, go to 4). | ||||||
|  |    - if file exists, continue to next step. | ||||||
|  | 2) Read pid number from autorebuild.pid file, then check procfs file | ||||||
|  |    comm with the specific pid directory /proc/<PID>/comm | ||||||
|  |    - if the file does not exit, it means the directory /proc/<PID> does | ||||||
|  |      not exist, go to 4) | ||||||
|  |    - if the file exits, continue next step | ||||||
|  | 3) Read process command name from /proc/<PIC>/comm, compare the command | ||||||
|  |    name with "mdadm" process name, | ||||||
|  |    - if not equal, no duplicated process, goto 4) | ||||||
|  |    - if strings are equal, print error message for duplicated process | ||||||
|  |      and exit this mdadm. | ||||||
|  | 4) Write current pid into autorebuild.pid file, continue to monitor in | ||||||
|  |    scan mode. | ||||||
|  | 
 | ||||||
|  | Now check_one_sharer() returns error for duplicated process only when | ||||||
|  | the recorded pid from autorebuild.pid exists, and the process has exact | ||||||
|  | same command name as "mdadm". | ||||||
|  | 
 | ||||||
|  | Reported-by: Shinkichi Yamazaki <shinkichi.yamazaki@suse.com> | ||||||
|  | Signed-off-by: Coly Li <colyli@suse.de> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  Monitor.c | 32 ++++++++++++++++++++------------ | ||||||
|  |  1 file changed, 20 insertions(+), 12 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/Monitor.c b/Monitor.c
 | ||||||
|  | index b527165..2d6b3b9 100644
 | ||||||
|  | --- a/Monitor.c
 | ||||||
|  | +++ b/Monitor.c
 | ||||||
|  | @@ -301,26 +301,34 @@ static int make_daemon(char *pidfile)
 | ||||||
|  |   | ||||||
|  |  static int check_one_sharer(int scan) | ||||||
|  |  { | ||||||
|  | -	int pid, rv;
 | ||||||
|  | +	int pid;
 | ||||||
|  | +	FILE *comm_fp;
 | ||||||
|  |  	FILE *fp; | ||||||
|  | -	char dir[20];
 | ||||||
|  | +	char comm_path[100];
 | ||||||
|  |  	char path[100]; | ||||||
|  | -	struct stat buf;
 | ||||||
|  | +	char comm[20];
 | ||||||
|  | +
 | ||||||
|  |  	sprintf(path, "%s/autorebuild.pid", MDMON_DIR); | ||||||
|  |  	fp = fopen(path, "r"); | ||||||
|  |  	if (fp) { | ||||||
|  |  		if (fscanf(fp, "%d", &pid) != 1) | ||||||
|  |  			pid = -1; | ||||||
|  | -		sprintf(dir, "/proc/%d", pid);
 | ||||||
|  | -		rv = stat(dir, &buf);
 | ||||||
|  | -		if (rv != -1) {
 | ||||||
|  | -			if (scan) {
 | ||||||
|  | -				pr_err("Only one autorebuild process allowed in scan mode, aborting\n");
 | ||||||
|  | -				fclose(fp);
 | ||||||
|  | -				return 1;
 | ||||||
|  | -			} else {
 | ||||||
|  | -				pr_err("Warning: One autorebuild process already running.\n");
 | ||||||
|  | +		snprintf(comm_path, sizeof(comm_path),
 | ||||||
|  | +			 "/proc/%d/comm", pid);
 | ||||||
|  | +		comm_fp = fopen(comm_path, "r");
 | ||||||
|  | +		if (comm_fp) {
 | ||||||
|  | +			if (fscanf(comm_fp, "%s", comm) &&
 | ||||||
|  | +			    strncmp(basename(comm), Name, strlen(Name)) == 0) {
 | ||||||
|  | +				if (scan) {
 | ||||||
|  | +					pr_err("Only one autorebuild process allowed in scan mode, aborting\n");
 | ||||||
|  | +					fclose(comm_fp);
 | ||||||
|  | +					fclose(fp);
 | ||||||
|  | +					return 1;
 | ||||||
|  | +				} else {
 | ||||||
|  | +					pr_err("Warning: One autorebuild process already running.\n");
 | ||||||
|  | +				}
 | ||||||
|  |  			} | ||||||
|  | +			fclose(comm_fp);
 | ||||||
|  |  		} | ||||||
|  |  		fclose(fp); | ||||||
|  |  	} | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,85 @@ | |||||||
|  | From 1c294b5d960abeeb9e0f188af294d019bc82b20e Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lidong Zhong <lidong.zhong@suse.com> | ||||||
|  | Date: Tue, 14 Apr 2020 16:19:41 +0800 | ||||||
|  | Subject: [RHEL7.9 PATCH 72/77] Detail: adding sync status for cluster device | ||||||
|  | 
 | ||||||
|  | On the node with /proc/mdstat is | ||||||
|  | 
 | ||||||
|  | Personalities : [raid1] | ||||||
|  | md0 : active raid1 sdb[4] sdc[3] sdd[2] | ||||||
|  |       1046528 blocks super 1.2 [3/2] [UU_] | ||||||
|  |         recover=REMOTE | ||||||
|  |       bitmap: 1/1 pages [4KB], 65536KB chunk | ||||||
|  | 
 | ||||||
|  | Let's change the 'State' of 'mdadm -Q -D' accordingly | ||||||
|  | State : clean, degraded | ||||||
|  | With this patch, it will be | ||||||
|  | State : clean, degraded, recovering (REMOTE) | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Lidong Zhong <lidong.zhong@suse.com> | ||||||
|  | Acked-by: Guoqing Jiang <guoqing.jiang@cloud.ionos.com> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  Detail.c | 9 ++++++--- | ||||||
|  |  mdadm.h  | 3 ++- | ||||||
|  |  mdstat.c | 2 ++ | ||||||
|  |  3 files changed, 10 insertions(+), 4 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/Detail.c b/Detail.c
 | ||||||
|  | index daec4f1..24eeba0 100644
 | ||||||
|  | --- a/Detail.c
 | ||||||
|  | +++ b/Detail.c
 | ||||||
|  | @@ -498,17 +498,20 @@ int Detail(char *dev, struct context *c)
 | ||||||
|  |  			} else | ||||||
|  |  				arrayst = "active"; | ||||||
|  |   | ||||||
|  | -			printf("             State : %s%s%s%s%s%s \n",
 | ||||||
|  | +			printf("             State : %s%s%s%s%s%s%s \n",
 | ||||||
|  |  			       arrayst, st, | ||||||
|  |  			       (!e || (e->percent < 0 && | ||||||
|  |  				       e->percent != RESYNC_PENDING && | ||||||
|  | -				       e->percent != RESYNC_DELAYED)) ?
 | ||||||
|  | +				       e->percent != RESYNC_DELAYED &&
 | ||||||
|  | +				       e->percent != RESYNC_REMOTE)) ?
 | ||||||
|  |  			       "" : sync_action[e->resync], | ||||||
|  |  			       larray_size ? "": ", Not Started", | ||||||
|  |  			       (e && e->percent == RESYNC_DELAYED) ? | ||||||
|  |  			       " (DELAYED)": "", | ||||||
|  |  			       (e && e->percent == RESYNC_PENDING) ? | ||||||
|  | -			       " (PENDING)": "");
 | ||||||
|  | +			       " (PENDING)": "",
 | ||||||
|  | +			       (e && e->percent == RESYNC_REMOTE) ?
 | ||||||
|  | +			       " (REMOTE)": "");
 | ||||||
|  |  		} else if (inactive && !is_container) { | ||||||
|  |  			printf("             State : inactive\n"); | ||||||
|  |  		} | ||||||
|  | diff --git a/mdadm.h b/mdadm.h
 | ||||||
|  | index d94569f..399478b 100644
 | ||||||
|  | --- a/mdadm.h
 | ||||||
|  | +++ b/mdadm.h
 | ||||||
|  | @@ -1815,7 +1815,8 @@ enum r0layout {
 | ||||||
|  |  #define RESYNC_NONE -1 | ||||||
|  |  #define RESYNC_DELAYED -2 | ||||||
|  |  #define RESYNC_PENDING -3 | ||||||
|  | -#define RESYNC_UNKNOWN -4
 | ||||||
|  | +#define RESYNC_REMOTE  -4
 | ||||||
|  | +#define RESYNC_UNKNOWN -5
 | ||||||
|  |   | ||||||
|  |  /* When using "GET_DISK_INFO" it isn't certain how high | ||||||
|  |   * we need to check.  So we impose an absolute limit of | ||||||
|  | diff --git a/mdstat.c b/mdstat.c
 | ||||||
|  | index 7e600d0..20577a3 100644
 | ||||||
|  | --- a/mdstat.c
 | ||||||
|  | +++ b/mdstat.c
 | ||||||
|  | @@ -257,6 +257,8 @@ struct mdstat_ent *mdstat_read(int hold, int start)
 | ||||||
|  |  					ent->percent = RESYNC_DELAYED; | ||||||
|  |  				if (l > 8 && strcmp(w+l-8, "=PENDING") == 0) | ||||||
|  |  					ent->percent = RESYNC_PENDING; | ||||||
|  | +				if (l > 7 && strcmp(w+l-7, "=REMOTE") == 0)
 | ||||||
|  | +					ent->percent = RESYNC_REMOTE;
 | ||||||
|  |  			} else if (ent->percent == RESYNC_NONE && | ||||||
|  |  				   w[0] >= '0' && | ||||||
|  |  				   w[0] <= '9' && | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
							
								
								
									
										164
									
								
								SOURCES/0073-Manage-imsm-Write-metadata-before-add.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								SOURCES/0073-Manage-imsm-Write-metadata-before-add.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,164 @@ | |||||||
|  | From 12724c018c964596aa277489fd287d5c3506361a Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Tkaczyk Mariusz <mariusz.tkaczyk@intel.com> | ||||||
|  | Date: Fri, 17 Apr 2020 13:55:55 +0200 | ||||||
|  | Subject: [RHEL7.9 PATCH 73/77] Manage, imsm: Write metadata before add | ||||||
|  | 
 | ||||||
|  | New drive in container always appears as spare. Manager is able to | ||||||
|  | handle that, and queues appropriative update to monitor. | ||||||
|  | No update from mdadm side has to be processed, just insert the drive and | ||||||
|  | ping the mdmon. Metadata has to be written if no mdmon is running (case | ||||||
|  | for Raid0 or container without arrays). | ||||||
|  | 
 | ||||||
|  | If bare drive is added very early on startup (by custom bare rule), | ||||||
|  | there is possiblity that mdmon was not restarted after switch root. Old | ||||||
|  | one is not able to handle new drive. New one fails because there is | ||||||
|  | drive without metadata in container and metadata cannot be loaded. | ||||||
|  | 
 | ||||||
|  | To prevent this, write spare metadata before adding device | ||||||
|  | to container. Mdmon will overwrite it (same case as spare migration, | ||||||
|  | if drive appears it writes the most recent metadata). | ||||||
|  | Metadata has to be written only on new drive before sysfs_add_disk(), | ||||||
|  | don't race with mdmon if running. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Tkaczyk Mariusz <mariusz.tkaczyk@intel.com> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  Manage.c      |  6 +----- | ||||||
|  |  super-intel.c | 66 ++++++++++++++++++++++++++++++++++++++--------------------- | ||||||
|  |  2 files changed, 44 insertions(+), 28 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/Manage.c b/Manage.c
 | ||||||
|  | index b22c396..0a5f09b 100644
 | ||||||
|  | --- a/Manage.c
 | ||||||
|  | +++ b/Manage.c
 | ||||||
|  | @@ -994,17 +994,13 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
 | ||||||
|  |   | ||||||
|  |  		Kill(dv->devname, NULL, 0, -1, 0); | ||||||
|  |  		dfd = dev_open(dv->devname, O_RDWR | O_EXCL|O_DIRECT); | ||||||
|  | -		if (mdmon_running(tst->container_devnm))
 | ||||||
|  | -			tst->update_tail = &tst->updates;
 | ||||||
|  |  		if (tst->ss->add_to_super(tst, &disc, dfd, | ||||||
|  |  					  dv->devname, INVALID_SECTORS)) { | ||||||
|  |  			close(dfd); | ||||||
|  |  			close(container_fd); | ||||||
|  |  			return -1; | ||||||
|  |  		} | ||||||
|  | -		if (tst->update_tail)
 | ||||||
|  | -			flush_metadata_updates(tst);
 | ||||||
|  | -		else
 | ||||||
|  | +		if (!mdmon_running(tst->container_devnm))
 | ||||||
|  |  			tst->ss->sync_metadata(tst); | ||||||
|  |   | ||||||
|  |  		sra = sysfs_read(container_fd, NULL, 0); | ||||||
|  | diff --git a/super-intel.c b/super-intel.c
 | ||||||
|  | index 562a58c..3a73d2b 100644
 | ||||||
|  | --- a/super-intel.c
 | ||||||
|  | +++ b/super-intel.c
 | ||||||
|  | @@ -5809,6 +5809,9 @@ int mark_spare(struct dl *disk)
 | ||||||
|  |  	return ret_val; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +
 | ||||||
|  | +static int write_super_imsm_spare(struct intel_super *super, struct dl *d);
 | ||||||
|  | +
 | ||||||
|  |  static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk, | ||||||
|  |  			     int fd, char *devname, | ||||||
|  |  			     unsigned long long data_offset) | ||||||
|  | @@ -5938,9 +5941,13 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
 | ||||||
|  |  		dd->next = super->disk_mgmt_list; | ||||||
|  |  		super->disk_mgmt_list = dd; | ||||||
|  |  	} else { | ||||||
|  | +		/* this is called outside of mdmon
 | ||||||
|  | +		 * write initial spare metadata
 | ||||||
|  | +		 * mdmon will overwrite it.
 | ||||||
|  | +		 */
 | ||||||
|  |  		dd->next = super->disks; | ||||||
|  |  		super->disks = dd; | ||||||
|  | -		super->updates_pending++;
 | ||||||
|  | +		write_super_imsm_spare(super, dd);
 | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	return 0; | ||||||
|  | @@ -5979,15 +5986,15 @@ static union {
 | ||||||
|  |  	struct imsm_super anchor; | ||||||
|  |  } spare_record __attribute__ ((aligned(MAX_SECTOR_SIZE))); | ||||||
|  |   | ||||||
|  | -/* spare records have their own family number and do not have any defined raid
 | ||||||
|  | - * devices
 | ||||||
|  | - */
 | ||||||
|  | -static int write_super_imsm_spares(struct intel_super *super, int doclose)
 | ||||||
|  | +
 | ||||||
|  | +static int write_super_imsm_spare(struct intel_super *super, struct dl *d)
 | ||||||
|  |  { | ||||||
|  |  	struct imsm_super *mpb = super->anchor; | ||||||
|  |  	struct imsm_super *spare = &spare_record.anchor; | ||||||
|  |  	__u32 sum; | ||||||
|  | -	struct dl *d;
 | ||||||
|  | +
 | ||||||
|  | +	if (d->index != -1)
 | ||||||
|  | +		return 1;
 | ||||||
|  |   | ||||||
|  |  	spare->mpb_size = __cpu_to_le32(sizeof(struct imsm_super)); | ||||||
|  |  	spare->generation_num = __cpu_to_le32(1UL); | ||||||
|  | @@ -6000,28 +6007,41 @@ static int write_super_imsm_spares(struct intel_super *super, int doclose)
 | ||||||
|  |  	snprintf((char *) spare->sig, MAX_SIGNATURE_LENGTH, | ||||||
|  |  		 MPB_SIGNATURE MPB_VERSION_RAID0); | ||||||
|  |   | ||||||
|  | -	for (d = super->disks; d; d = d->next) {
 | ||||||
|  | -		if (d->index != -1)
 | ||||||
|  | -			continue;
 | ||||||
|  | +	spare->disk[0] = d->disk;
 | ||||||
|  | +	if (__le32_to_cpu(d->disk.total_blocks_hi) > 0)
 | ||||||
|  | +		spare->attributes |= MPB_ATTRIB_2TB_DISK;
 | ||||||
|  |   | ||||||
|  | -		spare->disk[0] = d->disk;
 | ||||||
|  | -		if (__le32_to_cpu(d->disk.total_blocks_hi) > 0)
 | ||||||
|  | -			spare->attributes |= MPB_ATTRIB_2TB_DISK;
 | ||||||
|  | +	if (super->sector_size == 4096)
 | ||||||
|  | +		convert_to_4k_imsm_disk(&spare->disk[0]);
 | ||||||
|  |   | ||||||
|  | -		if (super->sector_size == 4096)
 | ||||||
|  | -			convert_to_4k_imsm_disk(&spare->disk[0]);
 | ||||||
|  | +	sum = __gen_imsm_checksum(spare);
 | ||||||
|  | +	spare->family_num = __cpu_to_le32(sum);
 | ||||||
|  | +	spare->orig_family_num = 0;
 | ||||||
|  | +	sum = __gen_imsm_checksum(spare);
 | ||||||
|  | +	spare->check_sum = __cpu_to_le32(sum);
 | ||||||
|  |   | ||||||
|  | -		sum = __gen_imsm_checksum(spare);
 | ||||||
|  | -		spare->family_num = __cpu_to_le32(sum);
 | ||||||
|  | -		spare->orig_family_num = 0;
 | ||||||
|  | -		sum = __gen_imsm_checksum(spare);
 | ||||||
|  | -		spare->check_sum = __cpu_to_le32(sum);
 | ||||||
|  | +	if (store_imsm_mpb(d->fd, spare)) {
 | ||||||
|  | +		pr_err("failed for device %d:%d %s\n",
 | ||||||
|  | +			d->major, d->minor, strerror(errno));
 | ||||||
|  | +		return 1;
 | ||||||
|  | +	}
 | ||||||
|  | +
 | ||||||
|  | +	return 0;
 | ||||||
|  | +}
 | ||||||
|  | +/* spare records have their own family number and do not have any defined raid
 | ||||||
|  | + * devices
 | ||||||
|  | + */
 | ||||||
|  | +static int write_super_imsm_spares(struct intel_super *super, int doclose)
 | ||||||
|  | +{
 | ||||||
|  | +	struct dl *d;
 | ||||||
|  | +
 | ||||||
|  | +	for (d = super->disks; d; d = d->next) {
 | ||||||
|  | +		if (d->index != -1)
 | ||||||
|  | +			continue;
 | ||||||
|  |   | ||||||
|  | -		if (store_imsm_mpb(d->fd, spare)) {
 | ||||||
|  | -			pr_err("failed for device %d:%d %s\n",
 | ||||||
|  | -				d->major, d->minor, strerror(errno));
 | ||||||
|  | +		if (write_super_imsm_spare(super, d))
 | ||||||
|  |  			return 1; | ||||||
|  | -		}
 | ||||||
|  | +
 | ||||||
|  |  		if (doclose) { | ||||||
|  |  			close(d->fd); | ||||||
|  |  			d->fd = -1; | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,57 @@ | |||||||
|  | From 5cfb79dea26d9d7266f79c7c196a1a9f70c16a28 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Gioh Kim <gi-oh.kim@cloud.ionos.com> | ||||||
|  | Date: Tue, 16 Apr 2019 18:08:17 +0200 | ||||||
|  | Subject: [RHEL7.9 PATCH 74/77] Assemble: print error message if mdadm fails | ||||||
|  |  assembling with --uuid option | ||||||
|  | 
 | ||||||
|  | When mdadm tries to assemble one working device and one zeroed-out device, | ||||||
|  | it failed but print successful message because there is --uuid option. | ||||||
|  | 
 | ||||||
|  | Following script always reproduce it. | ||||||
|  | 
 | ||||||
|  | dd if=/dev/zero of=/dev/ram0 oflag=direct | ||||||
|  | dd if=/dev/zero of=/dev/ram1 oflag=direct | ||||||
|  | ./mdadm -C /dev/md111 -e 1.2 --uuid="12345678:12345678:12345678:12345678" \ | ||||||
|  |     -l1 -n2 /dev/ram0 /dev/ram1 | ||||||
|  | ./mdadm -S /dev/md111 | ||||||
|  | dd if=/dev/zero of=/dev/ram1 oflag=direct | ||||||
|  | ./mdadm -A /dev/md111 --uuid="12345678:12345678:12345678:12345678" \ | ||||||
|  |     /dev/ram0 /dev/ram1 | ||||||
|  | 
 | ||||||
|  | Following is message from mdadm. | ||||||
|  | 
 | ||||||
|  | mdadm: No super block found on /dev/ram1 (Expected magic a92b4efc, got 00000000) | ||||||
|  | mdadm: no RAID superblock on /dev/ram1 | ||||||
|  | mdadm: /dev/md111 assembled from 1 drive - need all 2 to start it (use --run to insist). | ||||||
|  | 
 | ||||||
|  | The mdadm say that it assembled but mdadm does not create /dev/md111. | ||||||
|  | The message is wrong. | ||||||
|  | 
 | ||||||
|  | After applying this patch, mdadm reports error correctly as following. | ||||||
|  | 
 | ||||||
|  | mdadm: No super block found on /dev/ram1 (Expected magic a92b4efc, got 00000000) | ||||||
|  | mdadm: no RAID superblock on /dev/ram1 | ||||||
|  | mdadm: /dev/ram1 has no superblock - assembly aborted | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Gioh Kim <gi-oh.kim@cloud.ionos.com> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  Assemble.c | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/Assemble.c b/Assemble.c
 | ||||||
|  | index 6b5a7c8..2ed5884 100644
 | ||||||
|  | --- a/Assemble.c
 | ||||||
|  | +++ b/Assemble.c
 | ||||||
|  | @@ -269,7 +269,7 @@ static int select_devices(struct mddev_dev *devlist,
 | ||||||
|  |  			if (auto_assem || !inargv) | ||||||
|  |  				/* Ignore unrecognised devices during auto-assembly */ | ||||||
|  |  				goto loop; | ||||||
|  | -			if (ident->uuid_set || ident->name[0] ||
 | ||||||
|  | +			if (ident->name[0] ||
 | ||||||
|  |  			    ident->super_minor != UnSet) | ||||||
|  |  				/* Ignore unrecognised device if looking for | ||||||
|  |  				 * specific array */ | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
							
								
								
									
										29
									
								
								SOURCES/0075-clean-up-meaning-of-small-typo.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								SOURCES/0075-clean-up-meaning-of-small-typo.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | From ec7d7ceefc1c2b9ba82cac1ba0f6a34d41a4a913 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Nigel Croxon <ncroxon@redhat.com> | ||||||
|  | Date: Mon, 4 May 2020 12:27:45 -0400 | ||||||
|  | Subject: [RHEL7.9 PATCH 75/77] clean up meaning of small typo | ||||||
|  | 
 | ||||||
|  | Clean up the typo which leads to wrong understanding. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Nigel Croxon <ncroxon@redhat.com> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  mdadm.8.in | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/mdadm.8.in b/mdadm.8.in
 | ||||||
|  | index a3494a1..9e7cb96 100644
 | ||||||
|  | --- a/mdadm.8.in
 | ||||||
|  | +++ b/mdadm.8.in
 | ||||||
|  | @@ -2878,7 +2878,7 @@ operation, as described below under LAYOUT CHANGES.
 | ||||||
|  |   | ||||||
|  |  .SS CHUNK-SIZE AND LAYOUT CHANGES | ||||||
|  |   | ||||||
|  | -Changing the chunk-size of layout without also changing the number of
 | ||||||
|  | +Changing the chunk-size or layout without also changing the number of
 | ||||||
|  |  devices as the same time will involve re-writing all blocks in-place. | ||||||
|  |  To ensure against data loss in the case of a crash, a | ||||||
|  |  .B --backup-file | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
							
								
								
									
										95
									
								
								SOURCES/0076-Assemble.c-respect-force-flag.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								SOURCES/0076-Assemble.c-respect-force-flag.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,95 @@ | |||||||
|  | From 7b99edab2834d5d08ef774b4cff784caaa1a186f Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com> | ||||||
|  | Date: Tue, 5 May 2020 12:17:17 +0200 | ||||||
|  | Subject: [RHEL7.9 PATCH 76/77] Assemble.c: respect force flag. | ||||||
|  | 
 | ||||||
|  | If the array is dirty handler will set resync_start to 0 to inform kernel | ||||||
|  | that resync is needed. RWH affects only raid456 module, for other | ||||||
|  | levels array will be started even array is degraded and resync cannot be | ||||||
|  | performed. | ||||||
|  | 
 | ||||||
|  | Force is really meaningful for raid456. If array is degraded and resync | ||||||
|  | is requested, kernel will reject an attempt to start the array. To | ||||||
|  | respect force, it has to be marked as clean (this will be done for each | ||||||
|  | array without PPL) and remove the resync request (only for raid 456). | ||||||
|  | Data corruption may occur so proper warning is added. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  Assemble.c | 51 ++++++++++++++++++++++++++++++++++++++------------- | ||||||
|  |  1 file changed, 38 insertions(+), 13 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/Assemble.c b/Assemble.c
 | ||||||
|  | index 2ed5884..3e5d4e6 100644
 | ||||||
|  | --- a/Assemble.c
 | ||||||
|  | +++ b/Assemble.c
 | ||||||
|  | @@ -2030,6 +2030,15 @@ int assemble_container_content(struct supertype *st, int mdfd,
 | ||||||
|  |  			free(avail); | ||||||
|  |  			return err; | ||||||
|  |  		} | ||||||
|  | +	} else if (c->force) {
 | ||||||
|  | +		/* Set the array as 'clean' so that we can proceed with starting
 | ||||||
|  | +		 * it even if we don't have all devices. Mdmon doesn't care
 | ||||||
|  | +		 * if the dirty flag is set in metadata, it will start managing
 | ||||||
|  | +		 * it anyway.
 | ||||||
|  | +		 * This is really important for raid456 (RWH case), other levels
 | ||||||
|  | +		 * are started anyway.
 | ||||||
|  | +		 */
 | ||||||
|  | +		content->array.state |= 1;
 | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	if (enough(content->array.level, content->array.raid_disks, | ||||||
|  | @@ -2049,20 +2058,36 @@ int assemble_container_content(struct supertype *st, int mdfd,
 | ||||||
|  |  	} | ||||||
|  |  	free(avail); | ||||||
|  |   | ||||||
|  | -	if (c->runstop <= 0 &&
 | ||||||
|  | -	    (working + preexist + expansion) <
 | ||||||
|  | -	    content->array.working_disks) {
 | ||||||
|  | -		if (c->export && result)
 | ||||||
|  | -			*result |= INCR_UNSAFE;
 | ||||||
|  | -		else if (c->verbose >= 0) {
 | ||||||
|  | -			pr_err("%s assembled with %d device%s",
 | ||||||
|  | -			       chosen_name, preexist + working,
 | ||||||
|  | -			       preexist + working == 1 ? "":"s");
 | ||||||
|  | -			if (preexist)
 | ||||||
|  | -				fprintf(stderr, " (%d new)", working);
 | ||||||
|  | -			fprintf(stderr, " but not safe to start\n");
 | ||||||
|  | +	if ((working + preexist + expansion) < content->array.working_disks) {
 | ||||||
|  | +		if (c->runstop <= 0) {
 | ||||||
|  | +			if (c->export && result)
 | ||||||
|  | +				*result |= INCR_UNSAFE;
 | ||||||
|  | +			else if (c->verbose >= 0) {
 | ||||||
|  | +				pr_err("%s assembled with %d device%s",
 | ||||||
|  | +					chosen_name, preexist + working,
 | ||||||
|  | +					preexist + working == 1 ? "":"s");
 | ||||||
|  | +				if (preexist)
 | ||||||
|  | +					fprintf(stderr, " (%d new)", working);
 | ||||||
|  | +				fprintf(stderr, " but not safe to start\n");
 | ||||||
|  | +				if (c->force)
 | ||||||
|  | +					pr_err("Consider --run to start array as degraded.\n");
 | ||||||
|  | +			}
 | ||||||
|  | +			return 1;
 | ||||||
|  | +		} else if (content->array.level >= 4 &&
 | ||||||
|  | +			   content->array.level <= 6 &&
 | ||||||
|  | +			   content->resync_start != MaxSector &&
 | ||||||
|  | +			   c->force) {
 | ||||||
|  | +			/* Don't inform the kernel that the array is not
 | ||||||
|  | +			 * clean and requires resync.
 | ||||||
|  | +			 */
 | ||||||
|  | +			content->resync_start = MaxSector;
 | ||||||
|  | +			err = sysfs_set_num(content, NULL, "resync_start",
 | ||||||
|  | +					    MaxSector);
 | ||||||
|  | +			if (err)
 | ||||||
|  | +				return 1;
 | ||||||
|  | +			pr_err("%s array state forced to clean. It may cause data corruption.\n",
 | ||||||
|  | +				chosen_name);
 | ||||||
|  |  		} | ||||||
|  | -		return 1;
 | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |   | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
							
								
								
									
										45
									
								
								SOURCES/0077-mdcheck-Log-when-done.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								SOURCES/0077-mdcheck-Log-when-done.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,45 @@ | |||||||
|  | From 3b7aae927bdb6e150d1aaf3aaf0d183a06abda0b Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Donald Buczek <buczek@molgen.mpg.de> | ||||||
|  | Date: Wed, 13 May 2020 15:16:46 +0200 | ||||||
|  | Subject: [RHEL7.9 PATCH 77/77] mdcheck: Log when done | ||||||
|  | 
 | ||||||
|  | Currently mdcheck (when called with `--duration`) logs only the | ||||||
|  | beginning of the check, the pausing and the continuation but not the | ||||||
|  | completion. | ||||||
|  | 
 | ||||||
|  | So, log the completion, too, so that it can be determined how long the | ||||||
|  | raid check took. | ||||||
|  | 
 | ||||||
|  |     2020-05-08T18:00:02+02:00 deadpool root: mdcheck start checking /dev/md0 | ||||||
|  |     2020-05-08T18:00:02+02:00 deadpool root: mdcheck start checking /dev/md1 | ||||||
|  |     2020-05-09T15:32:04+02:00 deadpool root: mdcheck finished checking /dev/md1 | ||||||
|  |     2020-05-09T17:38:04+02:00 deadpool root: mdcheck finished checking /dev/md0 | ||||||
|  | 
 | ||||||
|  | Cc: linux-raid@vger.kernel.org | ||||||
|  | Signed-off-by: Paul Menzel <pmenzel@molgen.mpg.de> | ||||||
|  | Signed-off-by: Jes Sorensen <jsorensen@fb.com> | ||||||
|  | ---
 | ||||||
|  |  misc/mdcheck | 2 ++ | ||||||
|  |  1 file changed, 2 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/misc/mdcheck b/misc/mdcheck
 | ||||||
|  | index 42d4094..700c3e2 100644
 | ||||||
|  | --- a/misc/mdcheck
 | ||||||
|  | +++ b/misc/mdcheck
 | ||||||
|  | @@ -125,11 +125,13 @@ do
 | ||||||
|  |  	do | ||||||
|  |  		eval fl=\$MD_${i}_fl | ||||||
|  |  		eval sys=\$MD_${i}_sys | ||||||
|  | +		eval dev=\$MD_${i}_dev
 | ||||||
|  |   | ||||||
|  |  		if [ -z "$fl" ]; then continue; fi | ||||||
|  |   | ||||||
|  |  		if [ "`cat $sys/md/sync_action`" != 'check' ] | ||||||
|  |  		then | ||||||
|  | +			logger -p daemon.info mdcheck finished checking $dev
 | ||||||
|  |  			eval MD_${i}_fl= | ||||||
|  |  			rm -f $fl | ||||||
|  |  			continue; | ||||||
|  | -- 
 | ||||||
|  | 2.7.5 | ||||||
|  | 
 | ||||||
| @ -1,7 +1,7 @@ | |||||||
| Summary:     The mdadm program controls Linux md devices (software RAID arrays) | Summary:     The mdadm program controls Linux md devices (software RAID arrays) | ||||||
| Name:        mdadm | Name:        mdadm | ||||||
| Version:     4.1 | Version:     4.1 | ||||||
| Release:     13%{?dist} | Release:     14%{?dist} | ||||||
| Source:      http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-%{version}.tar.xz | Source:      http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-%{version}.tar.xz | ||||||
| Source1:     mdmonitor.init | Source1:     mdmonitor.init | ||||||
| Source2:     raid-check | Source2:     raid-check | ||||||
| @ -75,7 +75,22 @@ Patch58:     0058-Manage-Remove-the-legacy-code-for-md-driver-prior-to.patch | |||||||
| Patch59:     0059-imsm-Update-grow-manual.patch | Patch59:     0059-imsm-Update-grow-manual.patch | ||||||
| Patch60:     0060-Add-support-for-Tebibytes.patch | Patch60:     0060-Add-support-for-Tebibytes.patch | ||||||
| Patch61:     0061-imsm-fill-working_disks-according-to-metadata.patch | Patch61:     0061-imsm-fill-working_disks-according-to-metadata.patch | ||||||
| Patch62:     0062-Remove-the-legacy-whitespace.patch | Patch62:     0062-mdadm.8-add-note-information-for-raid0-growing-opera.patch | ||||||
|  | Patch63:     0063-Remove-the-legacy-whitespace.patch | ||||||
|  | Patch64:     0064-imsm-pass-subarray-id-to-kill_subarray-function.patch | ||||||
|  | Patch65:     0065-imsm-Remove-dump-restore-implementation.patch | ||||||
|  | Patch66:     0066-imsm-Correct-minimal-device-size.patch | ||||||
|  | Patch67:     0067-Detail-show-correct-bitmap-info-for-cluster-raid-dev.patch | ||||||
|  | Patch68:     0068-imsm-support-the-Array-Creation-Time-field-in-metada.patch | ||||||
|  | Patch69:     0069-imsm-show-Subarray-and-Volume-ID-in-examine-output.patch | ||||||
|  | Patch70:     0070-udev-Ignore-change-event-for-imsm.patch | ||||||
|  | Patch71:     0071-Monitor-improve-check_one_sharer-for-checking-duplic.patch | ||||||
|  | Patch72:     0072-Detail-adding-sync-status-for-cluster-device.patch | ||||||
|  | Patch73:     0073-Manage-imsm-Write-metadata-before-add.patch | ||||||
|  | Patch74:     0074-Assemble-print-error-message-if-mdadm-fails-assembli.patch | ||||||
|  | Patch75:     0075-clean-up-meaning-of-small-typo.patch | ||||||
|  | Patch76:     0076-Assemble.c-respect-force-flag.patch | ||||||
|  | Patch77:     0077-mdcheck-Log-when-done.patch | ||||||
| 
 | 
 | ||||||
| # RHEL customization patches | # RHEL customization patches | ||||||
| Patch97:     mdadm-3.3-udev.patch | Patch97:     mdadm-3.3-udev.patch | ||||||
| @ -168,6 +183,21 @@ file can be used to help with some common tasks. | |||||||
| %patch60 -p1 -b .0060 | %patch60 -p1 -b .0060 | ||||||
| %patch61 -p1 -b .0061 | %patch61 -p1 -b .0061 | ||||||
| %patch62 -p1 -b .0062 | %patch62 -p1 -b .0062 | ||||||
|  | %patch63 -p1 -b .0063 | ||||||
|  | %patch64 -p1 -b .0064 | ||||||
|  | %patch65 -p1 -b .0065 | ||||||
|  | %patch66 -p1 -b .0066 | ||||||
|  | %patch67 -p1 -b .0067 | ||||||
|  | %patch68 -p1 -b .0068 | ||||||
|  | %patch69 -p1 -b .0069 | ||||||
|  | %patch70 -p1 -b .0070 | ||||||
|  | %patch71 -p1 -b .0071 | ||||||
|  | %patch72 -p1 -b .0072 | ||||||
|  | %patch73 -p1 -b .0073 | ||||||
|  | %patch74 -p1 -b .0074 | ||||||
|  | %patch75 -p1 -b .0075 | ||||||
|  | %patch76 -p1 -b .0076 | ||||||
|  | %patch77 -p1 -b .0077 | ||||||
| 
 | 
 | ||||||
| # RHEL customization patches | # RHEL customization patches | ||||||
| %patch97 -p1 -b .udev | %patch97 -p1 -b .udev | ||||||
| @ -239,6 +269,10 @@ rm -rf %{buildroot} | |||||||
| /usr/lib/mdadm/mdadm_env.sh | /usr/lib/mdadm/mdadm_env.sh | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Fri Jun 05 2020 Xiao Ni <xni@redhat.com> - 4.1.14 | ||||||
|  | - Update to latest upstream | ||||||
|  | - Resolves rhbz#1780501 | ||||||
|  | 
 | ||||||
| * Fri Feb 28 2020 Xiao Ni <xni@redhat.com> - 4.1.13 | * Fri Feb 28 2020 Xiao Ni <xni@redhat.com> - 4.1.13 | ||||||
| - Remove the unnecessary whitespace in .service file | - Remove the unnecessary whitespace in .service file | ||||||
| - Resolves rhbz#1803470 | - Resolves rhbz#1803470 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user