linux-raid.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Maciej Naruszewicz <maciej.naruszewicz@intel.com>
To: NeilBrown <neilb@suse.de>
Cc: linux-raid@vger.kernel.org, maciej.patelczyk@intel.com
Subject: Re: [PATCH 2/6] imsm: Add --controller-path option for --detail-platform.
Date: Tue, 02 Oct 2012 12:54:19 +0200	[thread overview]
Message-ID: <506AC7DB.6070006@intel.com> (raw)
In-Reply-To: <20121002163630.1e2f7713@notabene.brown>

W dniu 10/2/2012 8:36 AM, NeilBrown pisze:
> On Wed, 26 Sep 2012 13:42:50 +0200 Maciej Naruszewicz
> <maciej.naruszewicz@intel.com> wrote:
>
>> Usually, 'mdadm --detail-platform -e imsm' scans all the controllers
>> looking for IMSM capabilities. This patch provides the possibility
>> to specify a controller to scan, enabling custom usage by other
>> processes - especially with the --export switch.
>>
>> $ mdadm --detail-platform
>>         Platform : Intel(R) Matrix Storage Manager
>>          Version : 9.5.0.1037
>>      RAID Levels : raid0 raid1 raid10 raid5
>>      Chunk Sizes : 4k 8k 16k 32k 64k 128k
>>      2TB volumes : supported
>>        2TB disks : not supported
>>        Max Disks : 7
>>      Max Volumes : 2 per array, 4 per controller
>>   I/O Controller : /sys/devices/pci0000:00/0000:00:1f.2 (SATA)
>>
>> $ mdadm --detail-platform --controller-path=/sys/devices/pci0000:00/0000:00:1f.2
>>         Platform : Intel(R) Matrix Storage Manager
>>          Version : 9.5.0.1037
>>      RAID Levels : raid0 raid1 raid10 raid5
>>      Chunk Sizes : 4k 8k 16k 32k 64k 128k
>>      2TB volumes : supported
>>        2TB disks : not supported
>>        Max Disks : 7
>>      Max Volumes : 2 per array, 4 per controller
>>   I/O Controller : /sys/devices/pci0000:00/0000:00:1f.2 (SATA)
>>
>> $ mdadm --detail-platform --controller-path=/sys/devices/pci0000:00/0000:00:1f.2 --export
>> MD_FIRMWARE_TYPE=imsm
>> IMSM_VERSION=9.5.0.1037
>> IMSM_SUPPORTED_RAID_LEVELS=raid0 raid1 raid10 raid5
>> IMSM_SUPPORTED_CHUNK_SIZES=4k 8k 16k 32k 64k 128k
>> IMSM_2TB_VOLUMES=yes
>> IMSM_2TB_DISKS=no
>> IMSM_MAX_DISKS=7
>> IMSM_MAX_VOLUMES_PER_ARRAY=2
>> IMSM_MAX_VOLUMES_PER_CONTROLLER=4
>>
>> $ mdadm --detail-platform --controller-path=/sys/devices/pci0000:00/0000:00:1f.0 # This isn't an IMSM-capable controller
>> mdadm: no active Intel(R) RAID controller found under /sys/devices/pci0000:00/0000:00:1f.0
>
> hi,
>   I think this functionality is good.  I think the implementation is not.
>
> 1/ Don't have a "--controller-path" option, just require any name
>     given as a bare argument to the controller path - and probably require
>     there is either 0 or 1.
>     So:
>        mdadm --detail-platform  /sys/devices/pci0000:00/0000:00:1f.0
>
>     is the correct usage.
>
> 2/ You really don't need to
>       if (asprintf(&c.controller_path, "%s", optarg) <= 0) {
>
>     just use 'optarg' directly.
>
> 3/ Don't use 'realpath' and 'strcmp'.  To compare two paths, use "stat" and
>      compare st_dev and st_ino.
>
> So: not applied.
>

Thanks for the input, I'll fix this and send a second version today.

MN

> Thanks,
> NeilBrown
>
>
>
>>
>> Signed-off-by: Maciej Naruszewicz <maciej.naruszewicz@intel.com>
>> ---
>>   Create.c      |    2 +-
>>   Detail.c      |   10 +++++-----
>>   ReadMe.c      |    2 ++
>>   mdadm.8.in    |    8 ++++++++
>>   mdadm.c       |   32 +++++++++++++++++++++++++++++++-
>>   mdadm.h       |    8 +++++---
>>   super-intel.c |   45 +++++++++++++++++++++++++--------------------
>>   7 files changed, 77 insertions(+), 30 deletions(-)
>>
>> diff --git a/Create.c b/Create.c
>> index 32683a8..2da07d0 100644
>> --- a/Create.c
>> +++ b/Create.c
>> @@ -492,7 +492,7 @@ int Create(struct supertype *st, char *mddev,
>>   		warn = 1;
>>   	}
>>
>> -	if (st->ss->detail_platform && st->ss->detail_platform(0, 1) != 0) {
>> +	if (st->ss->detail_platform && st->ss->detail_platform(0, 1, NULL) != 0) {
>>   		if (c->runstop != 1 || c->verbose >= 0)
>>   			pr_err("%s unable to enumerate platform support\n"
>>   				"    array may not be compatible with hardware/firmware\n",
>> diff --git a/Detail.c b/Detail.c
>> index b0c31e6..57faf3c 100644
>> --- a/Detail.c
>> +++ b/Detail.c
>> @@ -616,7 +616,7 @@ out:
>>   	return rv;
>>   }
>>
>> -int Detail_Platform(struct superswitch *ss, int scan, int verbose, int export)
>> +int Detail_Platform(struct superswitch *ss, int scan, int verbose, int export, char *controller_path)
>>   {
>>   	/* display platform capabilities for the given metadata format
>>   	 * 'scan' in this context means iterate over all metadata types
>> @@ -625,9 +625,9 @@ int Detail_Platform(struct superswitch *ss, int scan, int verbose, int export)
>>   	int err = 1;
>>
>>   	if (ss && export && ss->export_detail_platform)
>> -		err = ss->export_detail_platform(verbose);
>> +		err = ss->export_detail_platform(verbose, controller_path);
>>   	else if (ss && ss->detail_platform)
>> -		err = ss->detail_platform(verbose, 0);
>> +		err = ss->detail_platform(verbose, 0, controller_path);
>>   	else if (ss) {
>>   		if (verbose > 0)
>>   			pr_err("%s metadata is platform independent\n",
>> @@ -653,9 +653,9 @@ int Detail_Platform(struct superswitch *ss, int scan, int verbose, int export)
>>   				pr_err("%s metadata is platform independent\n",
>>   					meta->name ? : "[no name]");
>>   		} else if (export){
>> -			err |= meta->export_detail_platform(verbose);
>> +			err |= meta->export_detail_platform(verbose, controller_path);
>>   		} else
>> -			err |= meta->detail_platform(verbose, 0);
>> +			err |= meta->detail_platform(verbose, 0, controller_path);
>>   	}
>>
>>   	return err;
>> diff --git a/ReadMe.c b/ReadMe.c
>> index 346f08c..0c9c80b 100644
>> --- a/ReadMe.c
>> +++ b/ReadMe.c
>> @@ -159,6 +159,7 @@ struct option long_options[] = {
>>       {"sparc2.2",  0, 0, Sparc22},
>>       {"test",      0, 0, 't'},
>>       {"prefer",    1, 0, Prefer},
>> +    {"controller-path",1, 0, ControllerPath},
>>
>>       /* For Follow/monitor */
>>       {"mail",      1, 0, EMail},
>> @@ -240,6 +241,7 @@ char OptionHelp[] =
>>   "  --brief       -b   : Be less verbose, more brief\n"
>>   "  --export      -Y   : With --detail, --detail-platform or --examine use\n"
>>   "                       key=value format for easy import into environment\n"
>> +"  --controller-path  : Specify controller for --detail-platform\n"
>>   "  --force       -f   : Override normal checks and be more forceful\n"
>>   "\n"
>>   "  --assemble    -A   : Assemble an array\n"
>> diff --git a/mdadm.8.in b/mdadm.8.in
>> index 38c8bc8..8792e54 100644
>> --- a/mdadm.8.in
>> +++ b/mdadm.8.in
>> @@ -1329,6 +1329,14 @@ output will be formatted as
>>   pairs for easy import into the environment.
>>
>>   .TP
>> +.BR \-\-controller\-path
>> +When used with
>> +.BR \-\-detail\-platform ,
>> +mdadm will only print information about the specified controller. The
>> +controller should be given in form of an absolute filepath, e.g.
>> +.B \-\-controller\-path /sys/devices/pci0000:00/0000:00:1f.0 .
>> +
>> +.TP
>>   .BR \-E ", " \-\-examine
>>   Print contents of the metadata stored on the named device(s).
>>   Note the contrast between
>> diff --git a/mdadm.c b/mdadm.c
>> index 3ee7ddb..d313b76 100644
>> --- a/mdadm.c
>> +++ b/mdadm.c
>> @@ -93,6 +93,7 @@ int main(int argc, char *argv[])
>>   	int rebuild_map = 0;
>>   	char *remove_path = NULL;
>>   	char *udev_filename = NULL;
>> +	char *actual_controller_path;
>>
>>   	int print_help = 0;
>>   	FILE *outf;
>> @@ -151,6 +152,35 @@ int main(int argc, char *argv[])
>>   		case 'Y': c.export++;
>>   			continue;
>>
>> +		case ControllerPath:
>> +			if (c.controller_path)
>> +				free(c.controller_path);
>> +			if (asprintf(&c.controller_path, "%s", optarg) <= 0) {
>> +				pr_err("Empty or wrong controller path, \'%s\' ignored.\n",
>> +					c.controller_path);
>> +				c.controller_path = NULL;
>> +			}
>> +			else {
>> +				struct stat st;
>> +				if (stat(c.controller_path, &st) != 0) {
>> +					pr_err("Specified controller path %s doesn't exist.\n",
>> +						c.controller_path);
>> +					exit(2);
>> +				}
>> +				else {
>> +					actual_controller_path = realpath(c.controller_path,NULL);
>> +					if (actual_controller_path) {
>> +						if(asprintf(&c.controller_path, "%s", actual_controller_path) > 0)
>> +							free(actual_controller_path);
>> +						else
>> +							free(c.controller_path);
>> +					}
>> +					else
>> +						free(c.controller_path);
>> +				}
>> +			}
>> +			continue;
>> +
>>   		case HomeHost:
>>   			if (strcasecmp(optarg, "<ignore>") == 0)
>>   				c.require_homehost = 0;
>> @@ -1344,7 +1374,7 @@ int main(int argc, char *argv[])
>>   			}
>>   			rv = Examine(devlist, &c, ss);
>>   		} else if (devmode == DetailPlatform) {
>> -			rv = Detail_Platform(ss ? ss->ss : NULL, ss ? c.scan : 1, c.verbose, c.export);
>> +			rv = Detail_Platform(ss ? ss->ss : NULL, ss ? c.scan : 1, c.verbose, c.export, c.controller_path);
>>   		} else if (devlist == NULL) {
>>   			if (devmode == 'S' && c.scan)
>>   				rv = stop_scan(c.verbose);
>> diff --git a/mdadm.h b/mdadm.h
>> index 6d219f7..e27275b 100644
>> --- a/mdadm.h
>> +++ b/mdadm.h
>> @@ -326,6 +326,7 @@ enum special_options {
>>   	OffRootOpt,
>>   	Prefer,
>>   	KillOpt,
>> +	ControllerPath,
>>   };
>>
>>   /* structures read from config file */
>> @@ -394,6 +395,7 @@ struct context {
>>   	int	freeze_reshape;
>>   	char	*backup_file;
>>   	int	invalid_backup;
>> +	char	*controller_path;
>>   };
>>
>>   struct shape {
>> @@ -654,8 +656,8 @@ extern struct superswitch {
>>   	void (*export_detail_super)(struct supertype *st);
>>
>>   	/* Optional: platform hardware / firmware details */
>> -	int (*detail_platform)(int verbose, int enumerate_only);
>> -	int (*export_detail_platform)(int verbose);
>> +	int (*detail_platform)(int verbose, int enumerate_only, char *controller_path);
>> +	int (*export_detail_platform)(int verbose, char *controller_path);
>>
>>   	/* Used:
>>   	 *   to get uuid to storing in bitmap metadata
>> @@ -1122,7 +1124,7 @@ extern int Create(struct supertype *st, char *mddev,
>>   		  struct context *c);
>>
>>   extern int Detail(char *dev, struct context *c);
>> -extern int Detail_Platform(struct superswitch *ss, int scan, int verbose, int export);
>> +extern int Detail_Platform(struct superswitch *ss, int scan, int verbose, int export, char *controller_path);
>>   extern int Query(char *dev);
>>   extern int Examine(struct mddev_dev *devlist, struct context *c,
>>   		   struct supertype *forcest);
>> diff --git a/super-intel.c b/super-intel.c
>> index fdf441a..cedc976 100644
>> --- a/super-intel.c
>> +++ b/super-intel.c
>> @@ -1833,7 +1833,7 @@ static void print_imsm_capability_export(const struct imsm_orom *orom)
>>   	printf("IMSM_MAX_VOLUMES_PER_CONTROLLER=%d\n",orom->vphba);
>>   }
>>
>> -static int detail_platform_imsm(int verbose, int enumerate_only)
>> +static int detail_platform_imsm(int verbose, int enumerate_only, char *controller_path)
>>   {
>>   	/* There are two components to imsm platform support, the ahci SATA
>>   	 * controller and the option-rom.  To find the SATA controller we
>> @@ -1850,7 +1850,7 @@ static int detail_platform_imsm(int verbose, int enumerate_only)
>>   	struct sys_dev *list, *hba;
>>   	int host_base = 0;
>>   	int port_count = 0;
>> -	int result=0;
>> +	int result=1;
>>
>>   	if (enumerate_only) {
>>   		if (check_env("IMSM_NO_PLATFORM"))
>> @@ -1864,6 +1864,8 @@ static int detail_platform_imsm(int verbose, int enumerate_only)
>>   				result = 2;
>>   				break;
>>   			}
>> +			else
>> +				result = 0;
>>   		}
>>   		free_sys_dev(&list);
>>   		return result;
>> @@ -1880,34 +1882,38 @@ static int detail_platform_imsm(int verbose, int enumerate_only)
>>   		print_found_intel_controllers(list);
>>
>>   	for (hba = list; hba; hba = hba->next) {
>> +		if (controller_path != NULL && ( strcmp(hba->path,controller_path) != 0 ))
>> +			continue;
>>   		orom = find_imsm_capability(hba->type);
>>   		if (!orom)
>>   			pr_err("imsm capabilities not found for controller: %s (type %s)\n",
>>   				hba->path, get_sys_dev_type(hba->type));
>> -		else
>> +		else {
>> +			result = 0;
>>   			print_imsm_capability(orom);
>> -	}
>> -
>> -	for (hba = list; hba; hba = hba->next) {
>> -		printf(" I/O Controller : %s (%s)\n",
>> -			hba->path, get_sys_dev_type(hba->type));
>> -
>> -		if (hba->type == SYS_DEV_SATA) {
>> -			host_base = ahci_get_port_count(hba->path, &port_count);
>> -			if (ahci_enumerate_ports(hba->path, port_count, host_base, verbose)) {
>> -				if (verbose > 0)
>> -					pr_err("failed to enumerate "
>> -						"ports on SATA controller at %s.", hba->pci_id);
>> -				result |= 2;
>> +			printf(" I/O Controller : %s (%s)\n",
>> +				hba->path, get_sys_dev_type(hba->type));
>> +			if (hba->type == SYS_DEV_SATA) {
>> +				host_base = ahci_get_port_count(hba->path, &port_count);
>> +				if (ahci_enumerate_ports(hba->path, port_count, host_base, verbose)) {
>> +					if (verbose > 0)
>> +						pr_err("failed to enumerate "
>> +							"ports on SATA controller at %s.\n", hba->pci_id);
>> +					result |= 2;
>> +				}
>>   			}
>>   		}
>>   	}
>>
>> +	if (controller_path != NULL && result == 1)
>> +		pr_err("no active Intel(R) RAID "
>> +				"controller found under %s\n",controller_path);
>> +
>>   	free_sys_dev(&list);
>>   	return result;
>>   }
>>
>> -static int export_detail_platform_imsm(int verbose)
>> +static int export_detail_platform_imsm(int verbose, char *controller_path)
>>   {
>>   	const struct imsm_orom *orom;
>>   	struct sys_dev *list, *hba;
>> @@ -1923,6 +1929,8 @@ static int export_detail_platform_imsm(int verbose)
>>   	}
>>
>>   	for (hba = list; hba; hba = hba->next) {
>> +		if (controller_path != NULL && ( strcmp(hba->path,controller_path) != 0 ))
>> +			continue;
>>   		orom = find_imsm_capability(hba->type);
>>   		if (!orom) {
>>   			if (verbose > 0)
>> @@ -1934,9 +1942,6 @@ static int export_detail_platform_imsm(int verbose)
>>   		}
>>   	}
>>
>> -	if (result == 1 && verbose > 0)
>> -		pr_err("IMSM_DETAIL_PLATFORM_ERROR=NO_IMSM_CAPABLE_DEVICES\n");
>> -
>>   	return result;
>>   }
>>
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-raid" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html


  reply	other threads:[~2012-10-02 10:54 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-26 11:42 [mdadm,v1 PATCH 0/6] Extend mdadm [...] --export Maciej Naruszewicz
2012-09-26 11:42 ` [PATCH 1/6] imsm: Add --export option for --detail-platform Maciej Naruszewicz
2012-10-02  6:28   ` NeilBrown
2012-09-26 11:42 ` [PATCH 2/6] imsm: Add --controller-path " Maciej Naruszewicz
2012-10-02  6:36   ` NeilBrown
2012-10-02 10:54     ` Maciej Naruszewicz [this message]
2012-09-26 11:42 ` [PATCH 3/6] Fix return code " Maciej Naruszewicz
2012-10-02  6:38   ` NeilBrown
2012-09-26 11:44 ` [PATCH 4/6] Synchronize size calculation in human_size and human_size_brief Maciej Naruszewicz
2012-10-02  6:40   ` NeilBrown
2012-09-26 11:44 ` [PATCH 5/6] Display size with human_size_brief with a chosen prefix Maciej Naruszewicz
2012-10-02  6:41   ` NeilBrown
2012-09-26 11:44 ` [PATCH 6/6] Add MD_ARRAY_SIZE for --examine --export Maciej Naruszewicz
2012-10-02  6:42   ` NeilBrown
     [not found] <20121002143506.22678.259.stgit@gklab-128-174.igk.intel.com>
2012-10-02 14:37 ` [PATCH 2/6] imsm: Add --controller-path option for --detail-platform Maciej Naruszewicz
2012-10-03  3:37   ` NeilBrown

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=506AC7DB.6070006@intel.com \
    --to=maciej.naruszewicz@intel.com \
    --cc=linux-raid@vger.kernel.org \
    --cc=maciej.patelczyk@intel.com \
    --cc=neilb@suse.de \
    /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).