From: "Kusiak, Mateusz" <mateusz.kusiak@linux.intel.com>
To: Coly Li <colyli@suse.de>, Mateusz Kusiak <mateusz.kusiak@intel.com>
Cc: linux-raid <linux-raid@vger.kernel.org>, jes@trained-monkey.org
Subject: Re: [PATCH 01/10] mdadm: Add option validation for --update-subarray
Date: Thu, 22 Sep 2022 13:21:25 +0200 [thread overview]
Message-ID: <c5ed7b25-97ae-21cd-c84a-a2595db869a2@linux.intel.com> (raw)
In-Reply-To: <D32199F4-907F-4B73-9D87-0DB0997A6739@suse.de>
On 13/09/2022 17:12, Coly Li wrote:
>
>
>> 2022年8月18日 22:56,Mateusz Kusiak <mateusz.kusiak@intel.com> 写道:
>>
>> Subset of options available for "--update" is not same as for "--update-subarray".
>> Define maps and enum for update options and use them instead of direct comparisons.
>> Add proper error message.
>>
>> Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
>
>
> Hi Mateusz,
>
> I place my questions in line with code,
>
>
>> ---
>> ReadMe.c | 31 ++++++++++++++++++
>> maps.c | 31 ++++++++++++++++++
>> mdadm.c | 99 ++++++++++++++++----------------------------------------
>> mdadm.h | 32 +++++++++++++++++-
>> 4 files changed, 121 insertions(+), 72 deletions(-)
>>
>> diff --git a/ReadMe.c b/ReadMe.c
>> index 7518a32a..50e6f987 100644
>> --- a/ReadMe.c
>> +++ b/ReadMe.c
>> @@ -656,3 +656,34 @@ char *mode_help[mode_count] = {
>> [GROW] = Help_grow,
>> [INCREMENTAL] = Help_incr,
>> };
>> +
>> +/**
>> + * fprint_update_options() - Print valid update options depending on the mode.
>> + * @outf: File (output stream)
>> + * @update_mode: Used to distinguish update and update_subarray
>> + */
>> +void fprint_update_options(FILE *outf, enum update_opt update_mode)
>> +{
>> + int counter = UOPT_NAME, breakpoint = UOPT_HELP;
>> + mapping_t *map = update_options;
>> +
>> + if (!outf)
>> + return;
>> + if (update_mode == UOPT_SUBARRAY_ONLY) {
>> + breakpoint = UOPT_SUBARRAY_ONLY;
>> + fprintf(outf, "Valid --update options for update-subarray are:\n\t");
>> + } else
>> + fprintf(outf, "Valid --update options are:\n\t");
>> + while (map->num) {
>> + if (map->num >= breakpoint)
>> + break;
>> + fprintf(outf, "'%s', ", map->name);
>> + if (counter % 5 == 0)
>> + fprintf(outf, "\n\t");
>> + counter++;
>> + map++;
>> + }
>> + if ((counter - 1) % 5)
>> + fprintf(outf, "\n");
>> + fprintf(outf, "\r");
>
>
> Why ‘\r’ is used here? I feel ‘\n’ should work fine as well.
>
Hi Coly,
The reason is that '\n' leaves empty line after print.
>
>> +}
>> diff --git a/maps.c b/maps.c
>> index 20fcf719..b586679a 100644
>> --- a/maps.c
>> +++ b/maps.c
>> @@ -165,6 +165,37 @@ mapping_t sysfs_array_states[] = {
>> { "broken", ARRAY_BROKEN },
>> { NULL, ARRAY_UNKNOWN_STATE }
>> };
>> +/**
>> + * mapping_t update_options - stores supported update options.
>> + */
>> +mapping_t update_options[] = {
>> + { "name", UOPT_NAME },
>> + { "ppl", UOPT_PPL },
>> + { "no-ppl", UOPT_NO_PPL },
>> + { "bitmap", UOPT_BITMAP },
>> + { "no-bitmap", UOPT_NO_BITMAP },
>> + { "sparc2.2", UOPT_SPARC22 },
>> + { "super-minor", UOPT_SUPER_MINOR },
>> + { "summaries", UOPT_SUMMARIES },
>> + { "resync", UOPT_RESYNC },
>> + { "uuid", UOPT_UUID },
>> + { "homehost", UOPT_HOMEHOST },
>> + { "home-cluster", UOPT_HOME_CLUSTER },
>> + { "nodes", UOPT_NODES },
>> + { "devicesize", UOPT_DEVICESIZE },
>> + { "bbl", UOPT_BBL },
>> + { "no-bbl", UOPT_NO_BBL },
>> + { "force-no-bbl", UOPT_FORCE_NO_BBL },
>> + { "metadata", UOPT_METADATA },
>> + { "revert-reshape", UOPT_REVERT_RESHAPE },
>> + { "layout-original", UOPT_LAYOUT_ORIGINAL },
>> + { "layout-alternate", UOPT_LAYOUT_ALTERNATE },
>> + { "layout-unspecified", UOPT_LAYOUT_UNSPECIFIED },
>> + { "byteorder", UOPT_BYTEORDER },
>> + { "help", UOPT_HELP },
>> + { "?", UOPT_HELP },
>> + { NULL, UOPT_UNDEFINED}
>> +};
>>
>> /**
>> * map_num_s() - Safer alternative of map_num() function.
>> diff --git a/mdadm.c b/mdadm.c
>> index 56722ed9..3705d114 100644
>> --- a/mdadm.c
>> +++ b/mdadm.c
>> @@ -101,7 +101,7 @@ int main(int argc, char *argv[])
>> char *dump_directory = NULL;
>>
>> int print_help = 0;
>> - FILE *outf;
>> + FILE *outf = NULL;
>>
>> int mdfd = -1;
>> int locked = 0;
>> @@ -753,82 +753,39 @@ int main(int argc, char *argv[])
>> pr_err("Only subarrays can be updated in misc mode\n");
>> exit(2);
>> }
>> +
>> c.update = optarg;
>> - if (strcmp(c.update, "sparc2.2") == 0)
>> - continue;
>> - if (strcmp(c.update, "super-minor") == 0)
>> - continue;
>> - if (strcmp(c.update, "summaries") == 0)
>> - continue;
>> - if (strcmp(c.update, "resync") == 0)
>> - continue;
>> - if (strcmp(c.update, "uuid") == 0)
>> - continue;
>> - if (strcmp(c.update, "name") == 0)
>> - continue;
>> - if (strcmp(c.update, "homehost") == 0)
>> - continue;
>> - if (strcmp(c.update, "home-cluster") == 0)
>> - continue;
>> - if (strcmp(c.update, "nodes") == 0)
>> - continue;
>> - if (strcmp(c.update, "devicesize") == 0)
>> - continue;
>> - if (strcmp(c.update, "bitmap") == 0)
>> - continue;
>> - if (strcmp(c.update, "no-bitmap") == 0)
>> - continue;
>> - if (strcmp(c.update, "bbl") == 0)
>> - continue;
>> - if (strcmp(c.update, "no-bbl") == 0)
>> - continue;
>> - if (strcmp(c.update, "force-no-bbl") == 0)
>> - continue;
>> - if (strcmp(c.update, "ppl") == 0)
>> - continue;
>> - if (strcmp(c.update, "no-ppl") == 0)
>> - continue;
>> - if (strcmp(c.update, "metadata") == 0)
>> - continue;
>> - if (strcmp(c.update, "revert-reshape") == 0)
>> - continue;
>> - if (strcmp(c.update, "layout-original") == 0 ||
>> - strcmp(c.update, "layout-alternate") == 0 ||
>> - strcmp(c.update, "layout-unspecified") == 0)
>> - continue;
>> - if (strcmp(c.update, "byteorder") == 0) {
>> + enum update_opt updateopt = map_name(update_options, c.update);
>> + enum update_opt print_mode = UOPT_HELP;
>> + const char *error_addon = "update option";
>> +
>
> Could you please move the local variables declaration to the beginning of the case O(MISC,'U’) code block?
>
Sure, I'll post it in v2.
>
>> + if (devmode == UpdateSubarray) {
>> + print_mode = UOPT_SUBARRAY_ONLY;
>> + error_addon = "update-subarray option";
>> +
>> + if (updateopt > UOPT_SUBARRAY_ONLY && updateopt < UOPT_HELP)
>> + updateopt = UOPT_UNDEFINED;
>> + }
>> +
>> + switch (updateopt) {
>> + case UOPT_UNDEFINED:
>> + pr_err("'--update=%s' is invalid %s. ",
>> + c.update, error_addon);
>> + outf = stderr;
>> + case UOPT_HELP:
>> + if (!outf)
>> + outf = stdout;
>> + fprint_update_options(outf, print_mode);
>> + exit(outf == stdout ? 0 : 2);
>
>
> I tried to run update-subarray parameter but failed, obviously wrong command line format. Could you please give me a hint, on how to test the —update-subarray parameter? Then I can provide more feed back after experience the command.
>Sure, the exaple command is as follows:
# mdadm --update-subarray=0 --update=name --name=example
/dev/md/container
The command must be performed on a container, to succeed the volume must
be stopped.
All update options for update-subarray can be listed with:
# mdadm --update-subarray=0 --update=help
..and "global" update options with:
# mdadm -A --update=help
> The comments for rested patches will be posted after can I run and verify the change with my eyes.
>
> Thanks.
>
> Coly Li
>
[Snipped]
next prev parent reply other threads:[~2022-09-22 11:21 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-18 14:56 [PATCH 00/10] Block update-subarray and refactor context update Mateusz Kusiak
2022-08-18 14:56 ` [PATCH 01/10] mdadm: Add option validation for --update-subarray Mateusz Kusiak
2022-09-13 15:12 ` Coly Li
2022-09-22 11:21 ` Kusiak, Mateusz [this message]
2022-08-18 14:56 ` [PATCH 02/10] Fix --update-subarray on active volume Mateusz Kusiak
2022-09-14 15:02 ` Coly Li
2022-08-18 14:56 ` [PATCH 03/10] Add code specific update options to enum Mateusz Kusiak
2022-09-14 15:02 ` Coly Li
2022-08-18 14:56 ` [PATCH 04/10] super-ddf: Remove update_super_ddf Mateusz Kusiak
2022-09-14 15:03 ` Coly Li
2022-08-18 14:56 ` [PATCH 05/10] super0: refactor the code for enum Mateusz Kusiak
2022-09-14 15:03 ` Coly Li
2022-09-22 11:21 ` Kusiak, Mateusz
2022-09-22 18:20 ` Jes Sorensen
2022-08-18 14:56 ` [PATCH 06/10] super1: " Mateusz Kusiak
2022-09-14 15:03 ` Coly Li
2022-09-22 11:21 ` Kusiak, Mateusz
2022-12-28 14:29 ` Jes Sorensen
2022-08-18 14:56 ` [PATCH 07/10] super-intel: " Mateusz Kusiak
2022-09-14 15:03 ` Coly Li
2022-09-22 11:22 ` Kusiak, Mateusz
2022-08-18 14:56 ` [PATCH 08/10] Change update to enum in update_super and update_subarray Mateusz Kusiak
2022-09-03 5:57 ` Coly Li
2022-09-14 15:03 ` Coly Li
2022-09-22 11:22 ` Kusiak, Mateusz
2022-08-18 14:56 ` [PATCH 09/10] Manage&Incremental: code refactor, string to enum Mateusz Kusiak
2022-09-14 15:03 ` Coly Li
2022-08-18 14:56 ` [PATCH 10/10] Change char* to enum in context->update & refactor code Mateusz Kusiak
2022-09-14 15:03 ` Coly Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c5ed7b25-97ae-21cd-c84a-a2595db869a2@linux.intel.com \
--to=mateusz.kusiak@linux.intel.com \
--cc=colyli@suse.de \
--cc=jes@trained-monkey.org \
--cc=linux-raid@vger.kernel.org \
--cc=mateusz.kusiak@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).