All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Assemble.c: respect force flag.
@ 2020-05-05 10:17 Tkaczyk Mariusz
  2020-05-05 18:02 ` Jes Sorensen
  0 siblings, 1 reply; 2+ messages in thread
From: Tkaczyk Mariusz @ 2020-05-05 10:17 UTC (permalink / raw)
  To: jes; +Cc: linux-raid

From: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com>

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>
---
 Assemble.c | 51 ++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 38 insertions(+), 13 deletions(-)

diff --git a/Assemble.c b/Assemble.c
index 6b5a7c8e..1206fb06 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.25.0

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] Assemble.c: respect force flag.
  2020-05-05 10:17 [PATCH] Assemble.c: respect force flag Tkaczyk Mariusz
@ 2020-05-05 18:02 ` Jes Sorensen
  0 siblings, 0 replies; 2+ messages in thread
From: Jes Sorensen @ 2020-05-05 18:02 UTC (permalink / raw)
  To: Tkaczyk Mariusz; +Cc: linux-raid

On 5/5/20 6:17 AM, Tkaczyk Mariusz wrote:
> From: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com>
> 
> 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>
> ---
>  Assemble.c | 51 ++++++++++++++++++++++++++++++++++++++-------------
>  1 file changed, 38 insertions(+), 13 deletions(-)

Applied!

Thanks,
Jes

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-05-05 18:02 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-05 10:17 [PATCH] Assemble.c: respect force flag Tkaczyk Mariusz
2020-05-05 18:02 ` Jes Sorensen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.