197 lines
6.0 KiB
Diff
197 lines
6.0 KiB
Diff
|
From 734e7db4dfc502044d2a3dacfab67aeab0081cf9 Mon Sep 17 00:00:00 2001
|
||
|
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||
|
Date: Thu, 22 Aug 2024 11:55:15 +0200
|
||
|
Subject: [PATCH 165/201] imsm: Remove warning and refactor add_to_super_imsm
|
||
|
code
|
||
|
|
||
|
Intel x8 drives are not supported, remove unnecessary warning and
|
||
|
refactor add_to_super_imsm code.
|
||
|
|
||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||
|
---
|
||
|
super-intel.c | 102 +++++++++++++++++++-------------------------------
|
||
|
1 file changed, 39 insertions(+), 63 deletions(-)
|
||
|
|
||
|
diff --git a/super-intel.c b/super-intel.c
|
||
|
index 75d7c060..50fd56d0 100644
|
||
|
--- a/super-intel.c
|
||
|
+++ b/super-intel.c
|
||
|
@@ -5976,12 +5976,12 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
|
||
|
unsigned long long data_offset)
|
||
|
{
|
||
|
struct intel_super *super = st->sb;
|
||
|
- struct dl *dd;
|
||
|
- unsigned long long size;
|
||
|
unsigned int member_sector_size;
|
||
|
+ unsigned long long size;
|
||
|
+ struct stat stb;
|
||
|
+ struct dl *dd;
|
||
|
__u32 id;
|
||
|
int rv;
|
||
|
- struct stat stb;
|
||
|
|
||
|
/* If we are on an RAID enabled platform check that the disk is
|
||
|
* attached to the raid controller.
|
||
|
@@ -5991,114 +5991,86 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
|
||
|
rv = find_intel_hba_capability(fd, super, devname);
|
||
|
/* 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);
|
||
|
- return 1;
|
||
|
+ dprintf("capability: %p fd: %d ret: %d\n", super->orom, fd, rv);
|
||
|
+ return MDADM_STATUS_ERROR;
|
||
|
}
|
||
|
|
||
|
if (super->current_vol >= 0)
|
||
|
return add_to_super_imsm_volume(st, dk, fd, devname);
|
||
|
|
||
|
if (fstat(fd, &stb) != 0)
|
||
|
- return 1;
|
||
|
+ return MDADM_STATUS_ERROR;
|
||
|
+
|
||
|
dd = xcalloc(sizeof(*dd), 1);
|
||
|
+
|
||
|
+ if (devname)
|
||
|
+ dd->devname = xstrdup(devname);
|
||
|
+
|
||
|
+ if (sysfs_disk_to_scsi_id(fd, &id) == 0)
|
||
|
+ dd->disk.scsi_id = __cpu_to_le32(id);
|
||
|
+
|
||
|
dd->major = major(stb.st_rdev);
|
||
|
dd->minor = minor(stb.st_rdev);
|
||
|
- dd->devname = devname ? xstrdup(devname) : NULL;
|
||
|
- dd->fd = fd;
|
||
|
- dd->e = NULL;
|
||
|
dd->action = DISK_ADD;
|
||
|
+ dd->fd = fd;
|
||
|
+
|
||
|
rv = imsm_read_serial(fd, devname, dd->serial, MAX_RAID_SERIAL_LEN);
|
||
|
if (rv) {
|
||
|
pr_err("failed to retrieve scsi serial, aborting\n");
|
||
|
- __free_imsm_disk(dd, 0);
|
||
|
- abort();
|
||
|
+ goto error;
|
||
|
}
|
||
|
|
||
|
if (super->hba && ((super->hba->type == SYS_DEV_NVME) ||
|
||
|
(super->hba->type == SYS_DEV_VMD))) {
|
||
|
- int i;
|
||
|
- char cntrl_path[PATH_MAX];
|
||
|
- char *cntrl_name;
|
||
|
char pci_dev_path[PATH_MAX];
|
||
|
+ char cntrl_path[PATH_MAX];
|
||
|
|
||
|
if (!diskfd_to_devpath(fd, 2, pci_dev_path) ||
|
||
|
!diskfd_to_devpath(fd, 1, cntrl_path)) {
|
||
|
pr_err("failed to get dev paths, aborting\n");
|
||
|
- __free_imsm_disk(dd, 0);
|
||
|
- return 1;
|
||
|
+ goto error;
|
||
|
}
|
||
|
|
||
|
- cntrl_name = basename(cntrl_path);
|
||
|
if (is_multipath_nvme(fd))
|
||
|
pr_err("%s controller supports Multi-Path I/O, Intel (R) VROC does not support multipathing\n",
|
||
|
- cntrl_name);
|
||
|
+ basename(cntrl_path));
|
||
|
|
||
|
- if (devpath_to_vendor(pci_dev_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;
|
||
|
- }
|
||
|
- } else if (super->hba->type == SYS_DEV_VMD && super->orom &&
|
||
|
+ if (super->hba->type == SYS_DEV_VMD && super->orom &&
|
||
|
!imsm_orom_has_tpv_support(super->orom)) {
|
||
|
pr_err("\tPlatform configuration does not support non-Intel NVMe drives.\n"
|
||
|
"\tPlease refer to Intel(R) RSTe/VROC user guide.\n");
|
||
|
- __free_imsm_disk(dd, 0);
|
||
|
- return 1;
|
||
|
+ goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- get_dev_size(fd, NULL, &size);
|
||
|
- if (!get_dev_sector_size(fd, NULL, &member_sector_size)) {
|
||
|
- __free_imsm_disk(dd, 0);
|
||
|
- return 1;
|
||
|
- }
|
||
|
+ if (!get_dev_size(fd, NULL, &size) || !get_dev_sector_size(fd, NULL, &member_sector_size))
|
||
|
+ goto error;
|
||
|
|
||
|
- if (super->sector_size == 0) {
|
||
|
+ if (super->sector_size == 0)
|
||
|
/* this a first device, so sector_size is not set yet */
|
||
|
super->sector_size = member_sector_size;
|
||
|
- }
|
||
|
|
||
|
/* clear migr_rec when adding disk to container */
|
||
|
- memset(super->migr_rec_buf, 0, MIGR_REC_BUF_SECTORS*MAX_SECTOR_SIZE);
|
||
|
- if (lseek64(fd, size - MIGR_REC_SECTOR_POSITION*member_sector_size,
|
||
|
- SEEK_SET) >= 0) {
|
||
|
- if ((unsigned int)write(fd, super->migr_rec_buf,
|
||
|
- MIGR_REC_BUF_SECTORS*member_sector_size) !=
|
||
|
- MIGR_REC_BUF_SECTORS*member_sector_size)
|
||
|
+ memset(super->migr_rec_buf, 0, MIGR_REC_BUF_SECTORS * MAX_SECTOR_SIZE);
|
||
|
+
|
||
|
+ if (lseek64(fd, (size - MIGR_REC_SECTOR_POSITION * member_sector_size), SEEK_SET) >= 0) {
|
||
|
+ unsigned int nbytes = MIGR_REC_BUF_SECTORS * member_sector_size;
|
||
|
+
|
||
|
+ if ((unsigned int)write(fd, super->migr_rec_buf, nbytes) != nbytes)
|
||
|
perror("Write migr_rec failed");
|
||
|
}
|
||
|
|
||
|
size /= 512;
|
||
|
serialcpy(dd->disk.serial, dd->serial);
|
||
|
set_total_blocks(&dd->disk, size);
|
||
|
+
|
||
|
if (__le32_to_cpu(dd->disk.total_blocks_hi) > 0) {
|
||
|
struct imsm_super *mpb = super->anchor;
|
||
|
+
|
||
|
mpb->attributes |= MPB_ATTRIB_2TB_DISK;
|
||
|
}
|
||
|
+
|
||
|
mark_spare(dd);
|
||
|
- if (sysfs_disk_to_scsi_id(fd, &id) == 0)
|
||
|
- dd->disk.scsi_id = __cpu_to_le32(id);
|
||
|
- else
|
||
|
- dd->disk.scsi_id = __cpu_to_le32(0);
|
||
|
|
||
|
if (st->update_tail) {
|
||
|
dd->next = super->disk_mgmt_list;
|
||
|
@@ -6113,7 +6085,11 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
|
||
|
write_super_imsm_spare(super, dd);
|
||
|
}
|
||
|
|
||
|
- return 0;
|
||
|
+ return MDADM_STATUS_SUCCESS;
|
||
|
+
|
||
|
+error:
|
||
|
+ __free_imsm_disk(dd, 0);
|
||
|
+ return MDADM_STATUS_ERROR;
|
||
|
}
|
||
|
|
||
|
static int remove_from_super_imsm(struct supertype *st, mdu_disk_info_t *dk)
|
||
|
--
|
||
|
2.41.0
|
||
|
|