summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPawel Baldysiak <pawel.baldysiak@intel.com>2016-10-24 10:19:52 +0200
committerJes Sorensen <Jes.Sorensen@redhat.com>2016-10-26 12:01:51 -0400
commit20bee0f8db86a1103821e5ad39cbbc08de782588 (patch)
tree099766f14b1c2d2b1bd90888b9ffaf40341f87f3
parent12fe93e9133aefce2f18a622e1910fac3f774923 (diff)
downloadmdadm-20bee0f8db86a1103821e5ad39cbbc08de782588.tar.gz
IMSM: Add warning message when x8-type device is used
This patch adds the warning message when x8-type device is used with IMSM metadata. x8 device is a special NVMe drive - two of them on a single PCIe card. This card could be a single point of failure for RAID levels different than RAID0. x8 devices have serial number ending with "-A/-B" or "-1/-2". Signed-off-by: Pawel Baldysiak <pawel.baldysiak@intel.com> Reviewed-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com> Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
-rw-r--r--super-intel.c44
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 */