Blame SOURCES/0075-Manage-Incremental-code-refactor-string-to-enum.patch

2b63fb
From f2e8393bd7223c419aaa33c45feeb5c75440b986 Mon Sep 17 00:00:00 2001
2b63fb
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
2b63fb
Date: Mon, 2 Jan 2023 09:35:23 +0100
2b63fb
Subject: [PATCH 75/83] Manage&Incremental: code refactor, string to enum
2b63fb
2b63fb
Prepare Manage and Incremental for later changing context->update to enum.
2b63fb
Change update from string to enum in multiple functions and pass enum
2b63fb
where already possible.
2b63fb
2b63fb
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
2b63fb
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
2b63fb
---
2b63fb
 Grow.c        |  8 ++++----
2b63fb
 Incremental.c |  8 ++++----
2b63fb
 Manage.c      | 35 +++++++++++++++++------------------
2b63fb
 mdadm.c       | 23 ++++++++++++++++++-----
2b63fb
 mdadm.h       |  4 ++--
2b63fb
 5 files changed, 45 insertions(+), 33 deletions(-)
2b63fb
2b63fb
diff --git a/Grow.c b/Grow.c
2b63fb
index 82d5d2ea..8f5cf07d 100644
2b63fb
--- a/Grow.c
2b63fb
+++ b/Grow.c
2b63fb
@@ -605,12 +605,12 @@ int Grow_consistency_policy(char *devname, int fd, struct context *c, struct sha
2b63fb
 	}
2b63fb
 
2b63fb
 	if (subarray) {
2b63fb
-		char *update;
2b63fb
+		enum update_opt update;
2b63fb
 
2b63fb
 		if (s->consistency_policy == CONSISTENCY_POLICY_PPL)
2b63fb
-			update = "ppl";
2b63fb
+			update = UOPT_PPL;
2b63fb
 		else
2b63fb
-			update = "no-ppl";
2b63fb
+			update = UOPT_NO_PPL;
2b63fb
 
2b63fb
 		sprintf(container_dev, "/dev/%s", st->container_devnm);
2b63fb
 
2b63fb
@@ -3243,7 +3243,7 @@ static int reshape_array(char *container, int fd, char *devname,
2b63fb
 	 * level and frozen, we can safely add them.
2b63fb
 	 */
2b63fb
 	if (devlist) {
2b63fb
-		if (Manage_subdevs(devname, fd, devlist, verbose, 0, NULL, 0))
2b63fb
+		if (Manage_subdevs(devname, fd, devlist, verbose, 0, UOPT_UNDEFINED, 0))
2b63fb
 			goto release;
2b63fb
 	}
2b63fb
 
2b63fb
diff --git a/Incremental.c b/Incremental.c
2b63fb
index 5a5f4c4c..ff3548c0 100644
2b63fb
--- a/Incremental.c
2b63fb
+++ b/Incremental.c
2b63fb
@@ -1025,7 +1025,7 @@ static int array_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
2b63fb
 			close(dfd);
2b63fb
 			*dfdp = -1;
2b63fb
 			rv =  Manage_subdevs(chosen->sys_name, mdfd, &devlist,
2b63fb
-					     -1, 0, NULL, 0);
2b63fb
+					     -1, 0, UOPT_UNDEFINED, 0);
2b63fb
 			close(mdfd);
2b63fb
 		}
2b63fb
 		if (verbose > 0) {
2b63fb
@@ -1666,7 +1666,7 @@ static void remove_from_member_array(struct mdstat_ent *memb,
2b63fb
 
2b63fb
 	if (subfd >= 0) {
2b63fb
 		rv = Manage_subdevs(memb->devnm, subfd, devlist, verbose,
2b63fb
-				    0, NULL, 0);
2b63fb
+				    0, UOPT_UNDEFINED, 0);
2b63fb
 		if (rv & 2) {
2b63fb
 			if (sysfs_init(&mmdi, -1, memb->devnm))
2b63fb
 				pr_err("unable to initialize sysfs for: %s\n",
2b63fb
@@ -1758,7 +1758,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
2b63fb
 		free_mdstat(mdstat);
2b63fb
 	} else {
2b63fb
 		rv |= Manage_subdevs(ent->devnm, mdfd, &devlist,
2b63fb
-				    verbose, 0, NULL, 0);
2b63fb
+				    verbose, 0, UOPT_UNDEFINED, 0);
2b63fb
 		if (rv & 2) {
2b63fb
 		/* Failed due to EBUSY, try to stop the array.
2b63fb
 		 * Give udisks a chance to unmount it first.
2b63fb
@@ -1770,7 +1770,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
2b63fb
 
2b63fb
 	devlist.disposition = 'r';
2b63fb
 	rv = Manage_subdevs(ent->devnm, mdfd, &devlist,
2b63fb
-			    verbose, 0, NULL, 0);
2b63fb
+			    verbose, 0, UOPT_UNDEFINED, 0);
2b63fb
 end:
2b63fb
 	close(mdfd);
2b63fb
 	free_mdstat(ent);
2b63fb
diff --git a/Manage.c b/Manage.c
2b63fb
index 87b8aa0c..594e3d2c 100644
2b63fb
--- a/Manage.c
2b63fb
+++ b/Manage.c
2b63fb
@@ -598,14 +598,12 @@ static void add_set(struct mddev_dev *dv, int fd, char set_char)
2b63fb
 
2b63fb
 int attempt_re_add(int fd, int tfd, struct mddev_dev *dv,
2b63fb
 		   struct supertype *dev_st, struct supertype *tst,
2b63fb
-		   unsigned long rdev,
2b63fb
-		   char *update, char *devname, int verbose,
2b63fb
-		   mdu_array_info_t *array)
2b63fb
+		   unsigned long rdev, enum update_opt update,
2b63fb
+		   char *devname, int verbose, mdu_array_info_t *array)
2b63fb
 {
2b63fb
 	struct mdinfo mdi;
2b63fb
 	int duuid[4];
2b63fb
 	int ouuid[4];
2b63fb
-	enum update_opt update_enum = map_name(update_options, update);
2b63fb
 
2b63fb
 	dev_st->ss->getinfo_super(dev_st, &mdi, NULL);
2b63fb
 	dev_st->ss->uuid_from_super(dev_st, ouuid);
2b63fb
@@ -683,7 +681,7 @@ int attempt_re_add(int fd, int tfd, struct mddev_dev *dv,
2b63fb
 					devname, verbose, 0, NULL);
2b63fb
 			if (update)
2b63fb
 				rv = dev_st->ss->update_super(
2b63fb
-					dev_st, NULL, update_enum,
2b63fb
+					dev_st, NULL, update,
2b63fb
 					devname, verbose, 0, NULL);
2b63fb
 			if (rv == 0)
2b63fb
 				rv = dev_st->ss->store_super(dev_st, tfd);
2b63fb
@@ -715,8 +713,8 @@ skip_re_add:
2b63fb
 int Manage_add(int fd, int tfd, struct mddev_dev *dv,
2b63fb
 	       struct supertype *tst, mdu_array_info_t *array,
2b63fb
 	       int force, int verbose, char *devname,
2b63fb
-	       char *update, unsigned long rdev, unsigned long long array_size,
2b63fb
-	       int raid_slot)
2b63fb
+	       enum update_opt update, unsigned long rdev,
2b63fb
+	       unsigned long long array_size, int raid_slot)
2b63fb
 {
2b63fb
 	unsigned long long ldsize;
2b63fb
 	struct supertype *dev_st;
2b63fb
@@ -1332,7 +1330,7 @@ bool is_remove_safe(mdu_array_info_t *array, const int fd, char *devname, const
2b63fb
 
2b63fb
 int Manage_subdevs(char *devname, int fd,
2b63fb
 		   struct mddev_dev *devlist, int verbose, int test,
2b63fb
-		   char *update, int force)
2b63fb
+		   enum update_opt update, int force)
2b63fb
 {
2b63fb
 	/* Do something to each dev.
2b63fb
 	 * devmode can be
2b63fb
@@ -1727,12 +1725,13 @@ int autodetect(void)
2b63fb
 	return rv;
2b63fb
 }
2b63fb
 
2b63fb
-int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident *ident, int verbose)
2b63fb
+int Update_subarray(char *dev, char *subarray, enum update_opt update,
2b63fb
+		    struct mddev_ident *ident, int verbose)
2b63fb
 {
2b63fb
 	struct supertype supertype, *st = &supertype;
2b63fb
 	int fd, rv = 2;
2b63fb
 	struct mdinfo *info = NULL;
2b63fb
-	enum update_opt update_enum = map_name(update_options, update);
2b63fb
+	char *update_verb = map_num(update_options, update);
2b63fb
 
2b63fb
 	memset(st, 0, sizeof(*st));
2b63fb
 
2b63fb
@@ -1750,7 +1749,7 @@ int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident
2b63fb
 	if (is_subarray_active(subarray, st->devnm)) {
2b63fb
 		if (verbose >= 0)
2b63fb
 			pr_err("Subarray %s in %s is active, cannot update %s\n",
2b63fb
-			       subarray, dev, update);
2b63fb
+				subarray, dev, update_verb);
2b63fb
 		goto free_super;
2b63fb
 	}
2b63fb
 
2b63fb
@@ -1759,23 +1758,23 @@ int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident
2b63fb
 
2b63fb
 	info = st->ss->container_content(st, subarray);
2b63fb
 
2b63fb
-	if (strncmp(update, "ppl", 3) == 0 && !is_level456(info->array.level)) {
2b63fb
+	if (update == UOPT_PPL && !is_level456(info->array.level)) {
2b63fb
 		pr_err("RWH policy ppl is supported only for raid4, raid5 and raid6.\n");
2b63fb
 		goto free_super;
2b63fb
 	}
2b63fb
 
2b63fb
-	rv = st->ss->update_subarray(st, subarray, update_enum, ident);
2b63fb
+	rv = st->ss->update_subarray(st, subarray, update, ident);
2b63fb
 
2b63fb
 	if (rv) {
2b63fb
 		if (verbose >= 0)
2b63fb
 			pr_err("Failed to update %s of subarray-%s in %s\n",
2b63fb
-				update, subarray, dev);
2b63fb
+				update_verb, subarray, dev);
2b63fb
 	} else if (st->update_tail)
2b63fb
 		flush_metadata_updates(st);
2b63fb
 	else
2b63fb
 		st->ss->sync_metadata(st);
2b63fb
 
2b63fb
-	if (rv == 0 && strcmp(update, "name") == 0 && verbose >= 0)
2b63fb
+	if (rv == 0 && update == UOPT_NAME && verbose >= 0)
2b63fb
 		pr_err("Updated subarray-%s name from %s, UUIDs may have changed\n",
2b63fb
 		       subarray, dev);
2b63fb
 
2b63fb
@@ -1816,10 +1815,10 @@ int move_spare(char *from_devname, char *to_devname, dev_t devid)
2b63fb
 	sprintf(devname, "%d:%d", major(devid), minor(devid));
2b63fb
 
2b63fb
 	devlist.disposition = 'r';
2b63fb
-	if (Manage_subdevs(from_devname, fd2, &devlist, -1, 0, NULL, 0) == 0) {
2b63fb
+	if (Manage_subdevs(from_devname, fd2, &devlist, -1, 0, UOPT_UNDEFINED, 0) == 0) {
2b63fb
 		devlist.disposition = 'a';
2b63fb
 		if (Manage_subdevs(to_devname, fd1, &devlist, -1, 0,
2b63fb
-				   NULL, 0) == 0) {
2b63fb
+				   UOPT_UNDEFINED, 0) == 0) {
2b63fb
 			/* make sure manager is aware of changes */
2b63fb
 			ping_manager(to_devname);
2b63fb
 			ping_manager(from_devname);
2b63fb
@@ -1829,7 +1828,7 @@ int move_spare(char *from_devname, char *to_devname, dev_t devid)
2b63fb
 		}
2b63fb
 		else
2b63fb
 			Manage_subdevs(from_devname, fd2, &devlist,
2b63fb
-				       -1, 0, NULL, 0);
2b63fb
+				       -1, 0, UOPT_UNDEFINED, 0);
2b63fb
 	}
2b63fb
 	close(fd1);
2b63fb
 	close(fd2);
2b63fb
diff --git a/mdadm.c b/mdadm.c
2b63fb
index f5f505fe..d06e2820 100644
2b63fb
--- a/mdadm.c
2b63fb
+++ b/mdadm.c
2b63fb
@@ -1402,10 +1402,22 @@ int main(int argc, char *argv[])
2b63fb
 		/* readonly, add/remove, readwrite, runstop */
2b63fb
 		if (c.readonly > 0)
2b63fb
 			rv = Manage_ro(devlist->devname, mdfd, c.readonly);
2b63fb
-		if (!rv && devs_found>1)
2b63fb
-			rv = Manage_subdevs(devlist->devname, mdfd,
2b63fb
-					    devlist->next, c.verbose, c.test,
2b63fb
-					    c.update, c.force);
2b63fb
+		if (!rv && devs_found > 1) {
2b63fb
+			/*
2b63fb
+			 * This is temporary and will be removed in next patches
2b63fb
+			 * Null c.update will cause segfault
2b63fb
+			 */
2b63fb
+			if (c.update)
2b63fb
+				rv = Manage_subdevs(devlist->devname, mdfd,
2b63fb
+						devlist->next, c.verbose, c.test,
2b63fb
+						map_name(update_options, c.update),
2b63fb
+						c.force);
2b63fb
+			else
2b63fb
+				rv = Manage_subdevs(devlist->devname, mdfd,
2b63fb
+						devlist->next, c.verbose, c.test,
2b63fb
+						UOPT_UNDEFINED,
2b63fb
+						c.force);
2b63fb
+		}
2b63fb
 		if (!rv && c.readonly < 0)
2b63fb
 			rv = Manage_ro(devlist->devname, mdfd, c.readonly);
2b63fb
 		if (!rv && c.runstop > 0)
2b63fb
@@ -1931,7 +1943,8 @@ static int misc_list(struct mddev_dev *devlist,
2b63fb
 				continue;
2b63fb
 			}
2b63fb
 			rv |= Update_subarray(dv->devname, c->subarray,
2b63fb
-					      c->update, ident, c->verbose);
2b63fb
+					      map_name(update_options, c->update),
2b63fb
+					      ident, c->verbose);
2b63fb
 			continue;
2b63fb
 		case Dump:
2b63fb
 			rv |= Dump_metadata(dv->devname, dump_directory, c, ss);
2b63fb
diff --git a/mdadm.h b/mdadm.h
2b63fb
index 5dc94390..924f4b63 100644
2b63fb
--- a/mdadm.h
2b63fb
+++ b/mdadm.h
2b63fb
@@ -1478,7 +1478,7 @@ extern int Manage_stop(char *devname, int fd, int quiet,
2b63fb
 		       int will_retry);
2b63fb
 extern int Manage_subdevs(char *devname, int fd,
2b63fb
 			  struct mddev_dev *devlist, int verbose, int test,
2b63fb
-			  char *update, int force);
2b63fb
+			  enum update_opt update, int force);
2b63fb
 extern int autodetect(void);
2b63fb
 extern int Grow_Add_device(char *devname, int fd, char *newdev);
2b63fb
 extern int Grow_addbitmap(char *devname, int fd,
2b63fb
@@ -1532,7 +1532,7 @@ extern int Monitor(struct mddev_dev *devlist,
2b63fb
 
2b63fb
 extern int Kill(char *dev, struct supertype *st, int force, int verbose, int noexcl);
2b63fb
 extern int Kill_subarray(char *dev, char *subarray, int verbose);
2b63fb
-extern int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident *ident, int quiet);
2b63fb
+extern int Update_subarray(char *dev, char *subarray, enum update_opt update, struct mddev_ident *ident, int quiet);
2b63fb
 extern int Wait(char *dev);
2b63fb
 extern int WaitClean(char *dev, int verbose);
2b63fb
 extern int SetAction(char *dev, char *action);
2b63fb
-- 
2b63fb
2.38.1
2b63fb