diff options
-rw-r--r-- | super-intel.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/super-intel.c b/super-intel.c index e501b6f..81d8e8c 100644 --- a/super-intel.c +++ b/super-intel.c @@ -5137,9 +5137,53 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk, rv = imsm_read_serial(fd, devname, dd->serial); if (rv) { pr_err("failed to retrieve scsi serial, aborting\n"); + if (dd->devname) + free(dd->devname); free(dd); abort(); } + if (super->hba && ((super->hba->type == SYS_DEV_NVME) || + (super->hba->type == SYS_DEV_VMD))) { + int i; + char *devpath = diskfd_to_devpath(fd); + char controller_path[PATH_MAX]; + + if (!devpath) { + pr_err("failed to get devpath, aborting\n"); + if (dd->devname) + free(dd->devname); + free(dd); + return 1; + } + + snprintf(controller_path, PATH_MAX-1, "%s/device", devpath); + free(devpath); + + if (devpath_to_vendor(controller_path) == 0x8086) { + /* + * If Intel's NVMe drive has serial ended with + * "-A","-B","-1" or "-2" it means that this is "x8" + * device (double drive on single PCIe card). + * User should be warned about potential data loss. + */ + for (i = MAX_RAID_SERIAL_LEN-1; i > 0; i--) { + /* Skip empty character at the end */ + if (dd->serial[i] == 0) + continue; + + if (((dd->serial[i] == 'A') || + (dd->serial[i] == 'B') || + (dd->serial[i] == '1') || + (dd->serial[i] == '2')) && + (dd->serial[i-1] == '-')) + pr_err("\tThe action you are about to take may put your data at risk.\n" + "\tPlease note that x8 devices may consist of two separate x4 devices " + "located on a single PCIe port.\n" + "\tRAID 0 is the only supported configuration for this type of x8 device.\n"); + break; + } + } + } get_dev_size(fd, NULL, &size); /* clear migr_rec when adding disk to container */ |