303 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			303 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 7e8daba8b7937716dce8ea28298a4e2e72cb829e Mon Sep 17 00:00:00 2001
 | |
| From: Mateusz Kusiak <mateusz.kusiak@intel.com>
 | |
| Date: Mon, 2 Jan 2023 09:35:20 +0100
 | |
| Subject: [PATCH 72/83] super1: refactor the code for enum
 | |
| 
 | |
| It prepares update_super1 for change context->update to enum.
 | |
| Change if else statements into switch.
 | |
| 
 | |
| Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
 | |
| Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
 | |
| ---
 | |
|  super1.c | 152 +++++++++++++++++++++++++++++++++----------------------
 | |
|  1 file changed, 91 insertions(+), 61 deletions(-)
 | |
| 
 | |
| diff --git a/super1.c b/super1.c
 | |
| index 0b505a7e..b0a97016 100644
 | |
| --- a/super1.c
 | |
| +++ b/super1.c
 | |
| @@ -1218,30 +1218,55 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 | |
|  	int rv = 0;
 | |
|  	struct mdp_superblock_1 *sb = st->sb;
 | |
|  	bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MAX_SB_SIZE);
 | |
| +	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 "name" update.
 | |
|  		 */
 | |
|  		char *c;
 | |
| -		update = "name";
 | |
| +		update_enum = UOPT_NAME;
 | |
|  		c = strchr(sb->set_name, ':');
 | |
|  		if (c)
 | |
| -			strncpy(info->name, c+1, 31 - (c-sb->set_name));
 | |
| +			snprintf(info->name, sizeof(info->name), "%s", c+1);
 | |
|  		else
 | |
| -			strncpy(info->name, sb->set_name, 32);
 | |
| -		info->name[32] = 0;
 | |
| +			snprintf(info->name, sizeof(info->name), "%s", sb->set_name);
 | |
|  	}
 | |
|  
 | |
| -	if (strcmp(update, "force-one")==0) {
 | |
| +	switch (update_enum) {
 | |
| +	case UOPT_NAME: {
 | |
| +		int namelen;
 | |
| +
 | |
| +		if (!info->name[0])
 | |
| +			snprintf(info->name, sizeof(info->name), "%d", info->array.md_minor);
 | |
| +		memset(sb->set_name, 0, sizeof(sb->set_name));
 | |
| +
 | |
| +		namelen = strnlen(homehost, MD_NAME_MAX) + 1 + strnlen(info->name, MD_NAME_MAX);
 | |
| +		if (homehost &&
 | |
| +		    strchr(info->name, ':') == NULL &&
 | |
| +		    namelen < MD_NAME_MAX) {
 | |
| +			strcpy(sb->set_name, homehost);
 | |
| +			strcat(sb->set_name, ":");
 | |
| +			strcat(sb->set_name, info->name);
 | |
| +		} else {
 | |
| +			namelen = min((int)strnlen(info->name, MD_NAME_MAX),
 | |
| +				      (int)sizeof(sb->set_name) - 1);
 | |
| +			memcpy(sb->set_name, info->name, namelen);
 | |
| +			memset(&sb->set_name[namelen], '\0',
 | |
| +			       sizeof(sb->set_name) - namelen);
 | |
| +		}
 | |
| +		break;
 | |
| +	}
 | |
| +	case UOPT_SPEC_FORCE_ONE:
 | |
|  		/* Not enough devices for a working array,
 | |
|  		 * so bring this one up-to-date
 | |
|  		 */
 | |
|  		if (sb->events != __cpu_to_le64(info->events))
 | |
|  			rv = 1;
 | |
|  		sb->events = __cpu_to_le64(info->events);
 | |
| -	} else if (strcmp(update, "force-array")==0) {
 | |
| +		break;
 | |
| +	case UOPT_SPEC_FORCE_ARRAY:
 | |
|  		/* Degraded array and 'force' requests to
 | |
|  		 * maybe need to mark it 'clean'.
 | |
|  		 */
 | |
| @@ -1254,7 +1279,8 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 | |
|  				rv = 1;
 | |
|  			sb->resync_offset = MaxSector;
 | |
|  		}
 | |
| -	} else if (strcmp(update, "assemble")==0) {
 | |
| +		break;
 | |
| +	case UOPT_SPEC_ASSEMBLE: {
 | |
|  		int d = info->disk.number;
 | |
|  		int want;
 | |
|  		if (info->disk.state & (1<<MD_DISK_ACTIVE))
 | |
| @@ -1287,7 +1313,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 | |
|  				__cpu_to_le64(info->reshape_progress);
 | |
|  			rv = 1;
 | |
|  		}
 | |
| -	} else if (strcmp(update, "linear-grow-new") == 0) {
 | |
| +		break;
 | |
| +	}
 | |
| +	case UOPT_SPEC_LINEAR_GROW_NEW: {
 | |
|  		int i;
 | |
|  		int fd;
 | |
|  		int max = __le32_to_cpu(sb->max_dev);
 | |
| @@ -1330,7 +1358,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 | |
|  					ds - __le64_to_cpu(sb->data_offset));
 | |
|  			}
 | |
|  		}
 | |
| -	} else if (strcmp(update, "linear-grow-update") == 0) {
 | |
| +		break;
 | |
| +	}
 | |
| +	case UOPT_SPEC_LINEAR_GROW_UPDATE: {
 | |
|  		int max = __le32_to_cpu(sb->max_dev);
 | |
|  		int i = info->disk.number;
 | |
|  		if (max > MAX_DEVS || i > MAX_DEVS)
 | |
| @@ -1342,19 +1372,20 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 | |
|  		sb->raid_disks = __cpu_to_le32(info->array.raid_disks);
 | |
|  		sb->dev_roles[info->disk.number] =
 | |
|  			__cpu_to_le16(info->disk.raid_disk);
 | |
| -	} else if (strcmp(update, "resync") == 0) {
 | |
| -		/* make sure resync happens */
 | |
| -		sb->resync_offset = 0ULL;
 | |
| -	} else if (strcmp(update, "uuid") == 0) {
 | |
| +		break;
 | |
| +	}
 | |
| +	case UOPT_UUID:
 | |
|  		copy_uuid(sb->set_uuid, info->uuid, super1.swapuuid);
 | |
|  
 | |
|  		if (__le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET)
 | |
|  			memcpy(bms->uuid, sb->set_uuid, 16);
 | |
| -	} else if (strcmp(update, "no-bitmap") == 0) {
 | |
| +		break;
 | |
| +	case UOPT_NO_BITMAP:
 | |
|  		sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_BITMAP_OFFSET);
 | |
|  		if (bms->version == BITMAP_MAJOR_CLUSTERED && !IsBitmapDirty(devname))
 | |
|  			sb->resync_offset = MaxSector;
 | |
| -	} else if (strcmp(update, "bbl") == 0) {
 | |
| +		break;
 | |
| +	case UOPT_BBL: {
 | |
|  		/* only possible if there is room after the bitmap, or if
 | |
|  		 * there is no bitmap
 | |
|  		 */
 | |
| @@ -1383,14 +1414,12 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 | |
|  				bb_offset = bitmap_offset + bm_sectors;
 | |
|  			while (bb_offset < (long)sb_offset + 8 + 32*2 &&
 | |
|  			       bb_offset + 8+8 <= (long)data_offset)
 | |
| -				/* too close to bitmap, and room to grow */
 | |
|  				bb_offset += 8;
 | |
|  			if (bb_offset + 8 <= (long)data_offset) {
 | |
|  				sb->bblog_size = __cpu_to_le16(8);
 | |
|  				sb->bblog_offset = __cpu_to_le32(bb_offset);
 | |
|  			}
 | |
|  		} else {
 | |
| -			/* 1.0 - Put bbl just before super block */
 | |
|  			if (bm_sectors && bitmap_offset < 0)
 | |
|  				space = -bitmap_offset - bm_sectors;
 | |
|  			else
 | |
| @@ -1401,7 +1430,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 | |
|  				sb->bblog_offset = __cpu_to_le32((unsigned)-8);
 | |
|  			}
 | |
|  		}
 | |
| -	} else if (strcmp(update, "no-bbl") == 0) {
 | |
| +		break;
 | |
| +	}
 | |
| +	case UOPT_NO_BBL:
 | |
|  		if (sb->feature_map & __cpu_to_le32(MD_FEATURE_BAD_BLOCKS))
 | |
|  			pr_err("Cannot remove active bbl from %s\n",devname);
 | |
|  		else {
 | |
| @@ -1409,12 +1440,14 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 | |
|  			sb->bblog_shift = 0;
 | |
|  			sb->bblog_offset = 0;
 | |
|  		}
 | |
| -	} else if (strcmp(update, "force-no-bbl") == 0) {
 | |
| +		break;
 | |
| +	case UOPT_FORCE_NO_BBL:
 | |
|  		sb->feature_map &= ~ __cpu_to_le32(MD_FEATURE_BAD_BLOCKS);
 | |
|  		sb->bblog_size = 0;
 | |
|  		sb->bblog_shift = 0;
 | |
|  		sb->bblog_offset = 0;
 | |
| -	} else if (strcmp(update, "ppl") == 0) {
 | |
| +		break;
 | |
| +	case UOPT_PPL: {
 | |
|  		unsigned long long sb_offset = __le64_to_cpu(sb->super_offset);
 | |
|  		unsigned long long data_offset = __le64_to_cpu(sb->data_offset);
 | |
|  		unsigned long long data_size = __le64_to_cpu(sb->data_size);
 | |
| @@ -1464,37 +1497,26 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 | |
|  		sb->ppl.offset = __cpu_to_le16(offset);
 | |
|  		sb->ppl.size = __cpu_to_le16(space);
 | |
|  		sb->feature_map |= __cpu_to_le32(MD_FEATURE_PPL);
 | |
| -	} else if (strcmp(update, "no-ppl") == 0) {
 | |
| +		break;
 | |
| +	}
 | |
| +	case UOPT_NO_PPL:
 | |
|  		sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_PPL |
 | |
|  						   MD_FEATURE_MUTLIPLE_PPLS);
 | |
| -	} else if (strcmp(update, "name") == 0) {
 | |
| -		if (info->name[0] == 0)
 | |
| -			sprintf(info->name, "%d", info->array.md_minor);
 | |
| -		memset(sb->set_name, 0, sizeof(sb->set_name));
 | |
| -		if (homehost &&
 | |
| -		    strchr(info->name, ':') == NULL &&
 | |
| -		    strlen(homehost)+1+strlen(info->name) < 32) {
 | |
| -			strcpy(sb->set_name, homehost);
 | |
| -			strcat(sb->set_name, ":");
 | |
| -			strcat(sb->set_name, info->name);
 | |
| -		} else {
 | |
| -			int namelen;
 | |
| -
 | |
| -			namelen = min((int)strlen(info->name),
 | |
| -				      (int)sizeof(sb->set_name) - 1);
 | |
| -			memcpy(sb->set_name, info->name, namelen);
 | |
| -			memset(&sb->set_name[namelen], '\0',
 | |
| -			       sizeof(sb->set_name) - namelen);
 | |
| -		}
 | |
| -	} else if (strcmp(update, "devicesize") == 0 &&
 | |
| -		   __le64_to_cpu(sb->super_offset) <
 | |
| -		   __le64_to_cpu(sb->data_offset)) {
 | |
| -		/* set data_size to device size less data_offset */
 | |
| +		break;
 | |
| +	case UOPT_DEVICESIZE:
 | |
| +		if (__le64_to_cpu(sb->super_offset) >=
 | |
| +		    __le64_to_cpu(sb->data_offset))
 | |
| +			break;
 | |
| +		/*
 | |
| +		 * set data_size to device size less data_offset
 | |
| +		 */
 | |
|  		struct misc_dev_info *misc = (struct misc_dev_info*)
 | |
|  			(st->sb + MAX_SB_SIZE + BM_SUPER_SIZE);
 | |
|  		sb->data_size = __cpu_to_le64(
 | |
|  			misc->device_size - __le64_to_cpu(sb->data_offset));
 | |
| -	} else if (strncmp(update, "revert-reshape", 14) == 0) {
 | |
| +		break;
 | |
| +	case UOPT_SPEC_REVERT_RESHAPE_NOBACKUP:
 | |
| +	case UOPT_REVERT_RESHAPE:
 | |
|  		rv = -2;
 | |
|  		if (!(sb->feature_map &
 | |
|  		      __cpu_to_le32(MD_FEATURE_RESHAPE_ACTIVE)))
 | |
| @@ -1512,7 +1534,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 | |
|  			 * If that couldn't happen, the "-nobackup" version
 | |
|  			 * will be used.
 | |
|  			 */
 | |
| -			if (strcmp(update, "revert-reshape-nobackup") == 0 &&
 | |
| +			if (update_enum == UOPT_SPEC_REVERT_RESHAPE_NOBACKUP &&
 | |
|  			    sb->reshape_position == 0 &&
 | |
|  			    (__le32_to_cpu(sb->delta_disks) > 0 ||
 | |
|  			     (__le32_to_cpu(sb->delta_disks) == 0 &&
 | |
| @@ -1575,32 +1597,40 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 | |
|  			}
 | |
|  		done:;
 | |
|  		}
 | |
| -	} else if (strcmp(update, "_reshape_progress") == 0)
 | |
| +		break;
 | |
| +	case UOPT_SPEC__RESHAPE_PROGRESS:
 | |
|  		sb->reshape_position = __cpu_to_le64(info->reshape_progress);
 | |
| -	else if (strcmp(update, "writemostly") == 0)
 | |
| +		break;
 | |
| +	case UOPT_SPEC_WRITEMOSTLY:
 | |
|  		sb->devflags |= WriteMostly1;
 | |
| -	else if (strcmp(update, "readwrite") == 0)
 | |
| +		break;
 | |
| +	case UOPT_SPEC_READWRITE:
 | |
|  		sb->devflags &= ~WriteMostly1;
 | |
| -	else if (strcmp(update, "failfast") == 0)
 | |
| +		break;
 | |
| +	case UOPT_SPEC_FAILFAST:
 | |
|  		sb->devflags |= FailFast1;
 | |
| -	else if (strcmp(update, "nofailfast") == 0)
 | |
| +		break;
 | |
| +	case UOPT_SPEC_NOFAILFAST:
 | |
|  		sb->devflags &= ~FailFast1;
 | |
| -	else if (strcmp(update, "layout-original") == 0 ||
 | |
| -		 strcmp(update, "layout-alternate") == 0 ||
 | |
| -		 strcmp(update, "layout-unspecified") == 0) {
 | |
| +		break;
 | |
| +	case UOPT_LAYOUT_ORIGINAL:
 | |
| +	case UOPT_LAYOUT_ALTERNATE:
 | |
| +	case UOPT_LAYOUT_UNSPECIFIED:
 | |
|  		if (__le32_to_cpu(sb->level) != 0) {
 | |
|  			pr_err("%s: %s only supported for RAID0\n",
 | |
| -			       devname?:"", update);
 | |
| +			       devname ?: "", map_num(update_options, update_enum));
 | |
|  			rv = -1;
 | |
| -		} else if (strcmp(update, "layout-unspecified") == 0) {
 | |
| +		} else if (update_enum == UOPT_LAYOUT_UNSPECIFIED) {
 | |
|  			sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_RAID0_LAYOUT);
 | |
|  			sb->layout = 0;
 | |
|  		} else {
 | |
|  			sb->feature_map |= __cpu_to_le32(MD_FEATURE_RAID0_LAYOUT);
 | |
| -			sb->layout = __cpu_to_le32(update[7] == 'o' ? 1 : 2);
 | |
| +			sb->layout = __cpu_to_le32(update_enum == UOPT_LAYOUT_ORIGINAL ? 1 : 2);
 | |
|  		}
 | |
| -	} else
 | |
| +		break;
 | |
| +	default:
 | |
|  		rv = -1;
 | |
| +	}
 | |
|  
 | |
|  	sb->sb_csum = calc_sb_1_csum(sb);
 | |
|  
 | |
| -- 
 | |
| 2.38.1
 | |
| 
 |