imsm: introduce SAS controller support in imsm metadata handler
OROM/EFI capabilities are retrieved based on disk's controller type. 1/ alloc_super no longer retrieves OROM capabilities 2/ find_imsm_capability replaces find_imsm_orom 3/ new function find_intel_hba_capability gets disk's HBA and relevant capability Signed-off-by: Marcin Labun <marcin.labun@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
f0f5a01660
commit
f2f5c343ff
|
@ -476,6 +476,8 @@ static struct sys_dev* find_disk_attached_hba(int fd, const char *devname)
|
|||
#endif /* MDASSEMBLE */
|
||||
|
||||
|
||||
static int find_intel_hba_capability(int fd, struct intel_super *super, int verbose);
|
||||
|
||||
static struct supertype *match_metadata_desc_imsm(char *arg)
|
||||
{
|
||||
struct supertype *st;
|
||||
|
@ -2626,7 +2628,7 @@ struct bbm_log *__get_imsm_bbm_log(struct imsm_super *mpb)
|
|||
static void __free_imsm(struct intel_super *super, int free_disks);
|
||||
|
||||
/* load_imsm_mpb - read matrix metadata
|
||||
* allocates super->mpb to be freed by free_super
|
||||
* allocates super->mpb to be freed by free_imsm
|
||||
*/
|
||||
static int load_imsm_mpb(int fd, struct intel_super *super, char *devname)
|
||||
{
|
||||
|
@ -2678,6 +2680,10 @@ static int load_imsm_mpb(int fd, struct intel_super *super, char *devname)
|
|||
}
|
||||
|
||||
__free_imsm(super, 0);
|
||||
/* reload capability and hba */
|
||||
|
||||
/* capability and hba must be updated with new super allocation */
|
||||
find_intel_hba_capability(fd, super, 0);
|
||||
super->len = ROUND_UP(anchor->mpb_size, 512);
|
||||
if (posix_memalign(&super->buf, 512, super->len) != 0) {
|
||||
if (devname)
|
||||
|
@ -2801,6 +2807,8 @@ static void __free_imsm(struct intel_super *super, int free_disks)
|
|||
free(super->buf);
|
||||
super->buf = NULL;
|
||||
}
|
||||
/* unlink capability description */
|
||||
super->orom = NULL;
|
||||
if (free_disks)
|
||||
free_imsm_disks(super);
|
||||
free_devlist(super);
|
||||
|
@ -2840,14 +2848,10 @@ static struct intel_super *alloc_super(void)
|
|||
memset(super, 0, sizeof(*super));
|
||||
super->current_vol = -1;
|
||||
super->create_offset = ~((__u32 ) 0);
|
||||
if (!check_env("IMSM_NO_PLATFORM"))
|
||||
super->orom = find_imsm_orom();
|
||||
}
|
||||
|
||||
return super;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* find and allocate hba and OROM/EFI based on valid fd of RAID component device
|
||||
*/
|
||||
|
@ -2857,6 +2861,7 @@ static int find_intel_hba_capability(int fd, struct intel_super *super, int verb
|
|||
int rv = 0;
|
||||
|
||||
if ((fd < 0) || check_env("IMSM_NO_PLATFORM")) {
|
||||
super->orom = NULL;
|
||||
super->hba = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
@ -2902,11 +2907,13 @@ static int find_intel_hba_capability(int fd, struct intel_super *super, int verb
|
|||
free_sys_dev(&hba_name);
|
||||
return 2;
|
||||
}
|
||||
super->orom = find_imsm_capability(hba_name->type);
|
||||
free_sys_dev(&hba_name);
|
||||
if (!super->orom)
|
||||
return 3;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifndef MDASSEMBLE
|
||||
/* find_missing - helper routine for load_super_imsm_all that identifies
|
||||
* disks that have disappeared from the system. This routine relies on
|
||||
|
@ -3287,6 +3294,7 @@ static int load_super_imsm_all(struct supertype *st, int fd, void **sbp,
|
|||
struct intel_super *s = alloc_super();
|
||||
char nm[32];
|
||||
int dfd;
|
||||
int rv;
|
||||
|
||||
err = 1;
|
||||
if (!s)
|
||||
|
@ -3300,6 +3308,11 @@ static int load_super_imsm_all(struct supertype *st, int fd, void **sbp,
|
|||
if (dfd < 0)
|
||||
goto error;
|
||||
|
||||
rv = find_intel_hba_capability(dfd, s, 1);
|
||||
/* no orom/efi or non-intel hba of the disk */
|
||||
if (rv != 0)
|
||||
goto error;
|
||||
|
||||
err = load_and_parse_mpb(dfd, s, NULL, 1);
|
||||
|
||||
/* retry the load if we might have raced against mdmon */
|
||||
|
@ -3374,6 +3387,15 @@ static int load_super_imsm(struct supertype *st, int fd, char *devname)
|
|||
sizeof(*super));
|
||||
return 1;
|
||||
}
|
||||
rv = find_intel_hba_capability(fd, super, 1);
|
||||
/* no orom/efi or non-intel hba of the disk */
|
||||
if (rv != 0) {
|
||||
if (devname)
|
||||
fprintf(stderr,
|
||||
Name ": No OROM/EFI properties for %s\n", devname);
|
||||
free_imsm(super);
|
||||
return 2;
|
||||
}
|
||||
|
||||
rv = load_and_parse_mpb(fd, super, devname, 0);
|
||||
|
||||
|
@ -3768,7 +3790,7 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
|
|||
* they shall be already tested when container was created/assembled.
|
||||
*/
|
||||
rv = find_intel_hba_capability(fd, super, 1);
|
||||
/* no intel hba of the disk */
|
||||
/* no orom/efi or non-intel hba of the disk */
|
||||
if (rv != 0) {
|
||||
dprintf("capability: %p fd: %d ret: %d\n",
|
||||
super->orom, fd, rv);
|
||||
|
@ -4104,25 +4126,14 @@ static int validate_geometry_imsm_container(struct supertype *st, int level,
|
|||
{
|
||||
int fd;
|
||||
unsigned long long ldsize;
|
||||
const struct imsm_orom *orom;
|
||||
struct intel_super *super=NULL;
|
||||
int rv = 0;
|
||||
|
||||
if (level != LEVEL_CONTAINER)
|
||||
return 0;
|
||||
if (!dev)
|
||||
return 1;
|
||||
|
||||
if (check_env("IMSM_NO_PLATFORM"))
|
||||
orom = NULL;
|
||||
else
|
||||
orom = find_imsm_orom();
|
||||
if (orom && raiddisks > orom->tds) {
|
||||
if (verbose)
|
||||
fprintf(stderr, Name ": %d exceeds maximum number of"
|
||||
" platform supported disks: %d\n",
|
||||
raiddisks, orom->tds);
|
||||
return 0;
|
||||
}
|
||||
|
||||
fd = open(dev, O_RDONLY|O_EXCL, 0);
|
||||
if (fd < 0) {
|
||||
if (verbose)
|
||||
|
@ -4134,9 +4145,45 @@ static int validate_geometry_imsm_container(struct supertype *st, int level,
|
|||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* capabilities retrieve could be possible
|
||||
* note that there is no fd for the disks in array.
|
||||
*/
|
||||
super = alloc_super();
|
||||
if (!super) {
|
||||
fprintf(stderr,
|
||||
Name ": malloc of %zu failed.\n",
|
||||
sizeof(*super));
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
rv = find_intel_hba_capability(fd, super, verbose);
|
||||
if (rv != 0) {
|
||||
#if DEBUG
|
||||
char str[256];
|
||||
fd2devname(fd, str);
|
||||
dprintf("validate_geometry_imsm_container: fd: %d %s orom: %p rv: %d raiddisk: %d\n",
|
||||
fd, str, super->orom, rv, raiddisks);
|
||||
#endif
|
||||
/* no orom/efi or non-intel hba of the disk */
|
||||
close(fd);
|
||||
free_imsm(super);
|
||||
return 0;
|
||||
}
|
||||
close(fd);
|
||||
if (super->orom && raiddisks > super->orom->tds) {
|
||||
if (verbose)
|
||||
fprintf(stderr, Name ": %d exceeds maximum number of"
|
||||
" platform supported disks: %d\n",
|
||||
raiddisks, super->orom->tds);
|
||||
|
||||
free_imsm(super);
|
||||
return 0;
|
||||
}
|
||||
|
||||
*freesize = avail_size_imsm(st, ldsize >> 9);
|
||||
free_imsm(super);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue