From 0a9e39383d3bf63e1f5cf10f64200083a1af8091 Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Mon, 2 Jan 2023 09:35:19 +0100 Subject: [PATCH 71/83] super0: refactor the code for enum It prepares update_super0 for change context->update to enum. Change if else statements to switch. Signed-off-by: Mateusz Kusiak Signed-off-by: Jes Sorensen --- super0.c | 102 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 39 deletions(-) diff --git a/super0.c b/super0.c index 93876e2e..d9f5bff4 100644 --- a/super0.c +++ b/super0.c @@ -502,19 +502,39 @@ static int update_super0(struct supertype *st, struct mdinfo *info, int rv = 0; int uuid[4]; mdp_super_t *sb = st->sb; + enum update_opt update_enum = map_name(update_options, update); - if (strcmp(update, "homehost") == 0 && - homehost) { - /* note that 'homehost' is special as it is really + if (update_enum == UOPT_HOMEHOST && homehost) { + /* + * note that 'homehost' is special as it is really * a "uuid" update. */ uuid_set = 0; - update = "uuid"; + update_enum = UOPT_UUID; info->uuid[0] = sb->set_uuid0; info->uuid[1] = sb->set_uuid1; } - if (strcmp(update, "sparc2.2")==0 ) { + switch (update_enum) { + case UOPT_UUID: + if (!uuid_set && homehost) { + char buf[20]; + memcpy(info->uuid+2, + sha1_buffer(homehost, strlen(homehost), buf), + 8); + } + sb->set_uuid0 = info->uuid[0]; + sb->set_uuid1 = info->uuid[1]; + sb->set_uuid2 = info->uuid[2]; + sb->set_uuid3 = info->uuid[3]; + if (sb->state & (1<uuid, uuid, 16); + } + break; + case UOPT_SPARC22: { /* 2.2 sparc put the events in the wrong place * So we copy the tail of the superblock * up 4 bytes before continuing @@ -527,12 +547,15 @@ static int update_super0(struct supertype *st, struct mdinfo *info, if (verbose >= 0) pr_err("adjusting superblock of %s for 2.2/sparc compatibility.\n", devname); - } else if (strcmp(update, "super-minor") ==0) { + break; + } + case UOPT_SUPER_MINOR: sb->md_minor = info->array.md_minor; if (verbose > 0) pr_err("updating superblock of %s with minor number %d\n", devname, info->array.md_minor); - } else if (strcmp(update, "summaries") == 0) { + break; + case UOPT_SUMMARIES: { unsigned int i; /* set nr_disks, active_disks, working_disks, * failed_disks, spare_disks based on disks[] @@ -559,7 +582,9 @@ static int update_super0(struct supertype *st, struct mdinfo *info, sb->spare_disks++; } else if (i >= sb->raid_disks && sb->disks[i].number == 0) sb->disks[i].state = 0; - } else if (strcmp(update, "force-one")==0) { + break; + } + case UOPT_SPEC_FORCE_ONE: { /* Not enough devices for a working array, so * bring this one up-to-date. */ @@ -569,7 +594,9 @@ static int update_super0(struct supertype *st, struct mdinfo *info, if (sb->events_hi != ehi || sb->events_lo != elo) rv = 1; - } else if (strcmp(update, "force-array")==0) { + break; + } + case UOPT_SPEC_FORCE_ARRAY: /* degraded array and 'force' requested, so * maybe need to mark it 'clean' */ @@ -579,7 +606,8 @@ static int update_super0(struct supertype *st, struct mdinfo *info, sb->state |= (1 << MD_SB_CLEAN); rv = 1; } - } else if (strcmp(update, "assemble")==0) { + break; + case UOPT_SPEC_ASSEMBLE: { int d = info->disk.number; int wonly = sb->disks[d].state & (1<disks[d].state & (1<reshape_position = info->reshape_progress; rv = 1; } - } else if (strcmp(update, "linear-grow-new") == 0) { + break; + } + case UOPT_SPEC_LINEAR_GROW_NEW: memset(&sb->disks[info->disk.number], 0, sizeof(sb->disks[0])); sb->disks[info->disk.number].number = info->disk.number; sb->disks[info->disk.number].major = info->disk.major; @@ -617,7 +647,8 @@ static int update_super0(struct supertype *st, struct mdinfo *info, sb->disks[info->disk.number].raid_disk = info->disk.raid_disk; sb->disks[info->disk.number].state = info->disk.state; sb->this_disk = sb->disks[info->disk.number]; - } else if (strcmp(update, "linear-grow-update") == 0) { + break; + case UOPT_SPEC_LINEAR_GROW_UPDATE: sb->raid_disks = info->array.raid_disks; sb->nr_disks = info->array.nr_disks; sb->active_disks = info->array.active_disks; @@ -628,29 +659,15 @@ static int update_super0(struct supertype *st, struct mdinfo *info, sb->disks[info->disk.number].minor = info->disk.minor; sb->disks[info->disk.number].raid_disk = info->disk.raid_disk; sb->disks[info->disk.number].state = info->disk.state; - } else if (strcmp(update, "resync") == 0) { - /* make sure resync happens */ + break; + case UOPT_RESYNC: + /* + * make sure resync happens + */ sb->state &= ~(1<recovery_cp = 0; - } else if (strcmp(update, "uuid") == 0) { - if (!uuid_set && homehost) { - char buf[20]; - char *hash = sha1_buffer(homehost, - strlen(homehost), - buf); - memcpy(info->uuid+2, hash, 8); - } - sb->set_uuid0 = info->uuid[0]; - sb->set_uuid1 = info->uuid[1]; - sb->set_uuid2 = info->uuid[2]; - sb->set_uuid3 = info->uuid[3]; - if (sb->state & (1<uuid, uuid, 16); - } - } else if (strcmp(update, "metadata") == 0) { + break; + case UOPT_METADATA: /* Create some v1.0 metadata to match ours but make the * ctime bigger. Also update info->array.*_version. * We need to arrange that store_super writes out @@ -670,7 +687,8 @@ static int update_super0(struct supertype *st, struct mdinfo *info, uuid_from_super0(st, info->uuid); st->other = super1_make_v0(st, info, st->sb); } - } else if (strcmp(update, "revert-reshape") == 0) { + break; + case UOPT_REVERT_RESHAPE: rv = -2; if (sb->minor_version <= 90) pr_err("No active reshape to revert on %s\n", @@ -702,16 +720,22 @@ static int update_super0(struct supertype *st, struct mdinfo *info, sb->new_chunk = sb->chunk_size; sb->chunk_size = tmp; } - } else if (strcmp(update, "no-bitmap") == 0) { + break; + case UOPT_NO_BITMAP: sb->state &= ~(1<reshape_position = info->reshape_progress; - else if (strcmp(update, "writemostly")==0) + break; + case UOPT_SPEC_WRITEMOSTLY: sb->state |= (1<state &= ~(1<sb_csum = calc_sb0_csum(sb); return rv; -- 2.38.1