imsm: limit support to first NVMe namespace
Due to metadata limitations NVMe multinamespace support has to be removed. Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com>
This commit is contained in:
parent
ca4b156b20
commit
a8f3cfd54e
|
@ -766,3 +766,34 @@ char *vmd_domain_to_controller(struct sys_dev *hba, char *buf)
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
/* Verify that NVMe drive is supported by IMSM
|
||||||
|
* Returns:
|
||||||
|
* 0 - not supported
|
||||||
|
* 1 - supported
|
||||||
|
*/
|
||||||
|
int imsm_is_nvme_supported(int disk_fd, int verbose)
|
||||||
|
{
|
||||||
|
char nsid_path[PATH_MAX];
|
||||||
|
char buf[PATH_MAX];
|
||||||
|
struct stat stb;
|
||||||
|
|
||||||
|
if (disk_fd < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (fstat(disk_fd, &stb))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
snprintf(nsid_path, PATH_MAX-1, "/sys/dev/block/%d:%d/nsid",
|
||||||
|
major(stb.st_rdev), minor(stb.st_rdev));
|
||||||
|
|
||||||
|
if (load_sys(nsid_path, buf, sizeof(buf))) {
|
||||||
|
pr_err("Cannot read %s, rejecting drive\n", nsid_path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (strtoll(buf, NULL, 10) != 1) {
|
||||||
|
if (verbose)
|
||||||
|
pr_err("Only first namespace is supported by IMSM, aborting\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
|
@ -251,4 +251,5 @@ const struct orom_entry *get_orom_entry_by_device_id(__u16 dev_id);
|
||||||
const struct imsm_orom *get_orom_by_device_id(__u16 device_id);
|
const struct imsm_orom *get_orom_by_device_id(__u16 device_id);
|
||||||
struct sys_dev *device_by_id(__u16 device_id);
|
struct sys_dev *device_by_id(__u16 device_id);
|
||||||
struct sys_dev *device_by_id_and_path(__u16 device_id, const char *path);
|
struct sys_dev *device_by_id_and_path(__u16 device_id, const char *path);
|
||||||
|
int imsm_is_nvme_supported(int disk_fd, int verbose);
|
||||||
char *vmd_domain_to_controller(struct sys_dev *hba, char *buf);
|
char *vmd_domain_to_controller(struct sys_dev *hba, char *buf);
|
||||||
|
|
|
@ -2364,7 +2364,9 @@ static int print_nvme_info(struct sys_dev *hba)
|
||||||
continue;
|
continue;
|
||||||
if (path_attached_to_hba(rp, hba->path)) {
|
if (path_attached_to_hba(rp, hba->path)) {
|
||||||
fd = open_dev(ent->d_name);
|
fd = open_dev(ent->d_name);
|
||||||
if (fd < 0) {
|
if (!imsm_is_nvme_supported(fd, 0)) {
|
||||||
|
if (fd >= 0)
|
||||||
|
close(fd);
|
||||||
free(rp);
|
free(rp);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -5868,6 +5870,13 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
|
||||||
snprintf(controller_path, PATH_MAX-1, "%s/device", devpath);
|
snprintf(controller_path, PATH_MAX-1, "%s/device", devpath);
|
||||||
free(devpath);
|
free(devpath);
|
||||||
|
|
||||||
|
if (!imsm_is_nvme_supported(dd->fd, 1)) {
|
||||||
|
if (dd->devname)
|
||||||
|
free(dd->devname);
|
||||||
|
free(dd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (devpath_to_vendor(controller_path) == 0x8086) {
|
if (devpath_to_vendor(controller_path) == 0x8086) {
|
||||||
/*
|
/*
|
||||||
* If Intel's NVMe drive has serial ended with
|
* If Intel's NVMe drive has serial ended with
|
||||||
|
|
Loading…
Reference in New Issue