return err;
}
-static void __free_imsm_disk(struct dl *d)
+static void __free_imsm_disk(struct dl *d, int close_fd)
{
- if (d->fd >= 0)
+ if (close_fd && d->fd > -1)
close(d->fd);
if (d->devname)
free(d->devname);
while (super->disks) {
d = super->disks;
super->disks = d->next;
- __free_imsm_disk(d);
+ __free_imsm_disk(d, 1);
}
while (super->disk_mgmt_list) {
d = super->disk_mgmt_list;
super->disk_mgmt_list = d->next;
- __free_imsm_disk(d);
+ __free_imsm_disk(d, 1);
}
while (super->missing) {
d = super->missing;
super->missing = d->next;
- __free_imsm_disk(d);
+ __free_imsm_disk(d, 1);
}
}
free_super_imsm(st);
super = alloc_super();
- if (!get_dev_sector_size(fd, NULL, &super->sector_size))
- return 1;
if (!super)
return 1;
+
+ if (!get_dev_sector_size(fd, NULL, &super->sector_size)) {
+ free_imsm(super);
+ return 1;
+ }
/* Load hba and capabilities if they exist.
* But do not preclude loading metadata in case capabilities or hba are
* non-compliant and ignore_hw_compat is set.
rv = imsm_read_serial(fd, devname, dd->serial, MAX_RAID_SERIAL_LEN);
if (rv) {
pr_err("failed to retrieve scsi serial, aborting\n");
- if (dd->devname)
- free(dd->devname);
- free(dd);
+ __free_imsm_disk(dd, 0);
abort();
}
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");
-
- if (dd->devname)
- free(dd->devname);
- free(dd);
+ __free_imsm_disk(dd, 0);
return 1;
}
!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(dd->devname);
- free(dd);
+ __free_imsm_disk(dd, 0);
return 1;
}
}
get_dev_size(fd, NULL, &size);
- if (!get_dev_sector_size(fd, NULL, &member_sector_size))
+ if (!get_dev_sector_size(fd, NULL, &member_sector_size)) {
+ __free_imsm_disk(dd, 0);
return 1;
+ }
if (super->sector_size == 0) {
/* this a first device, so sector_size is not set yet */
else
super->disks = dl->next;
dl->next = NULL;
- __free_imsm_disk(dl);
+ __free_imsm_disk(dl, 1);
dprintf("removed %x:%x\n", major, minor);
break;
}
}
}
/* release allocate disk structure */
- __free_imsm_disk(disk_cfg);
+ __free_imsm_disk(disk_cfg, 1);
}
}
return check_degraded;
struct dl *dl = *dlp;
*dlp = (*dlp)->next;
- __free_imsm_disk(dl);
+ __free_imsm_disk(dl, 1);
}
}