static int mfi_ld_set_props(int fd, struct mfi_ld_props *props) { uint8_t mbox[4]; mbox_store_ldref(mbox, &props->ld); return (mfi_dcmd_command(fd, MFI_DCMD_LD_SET_PROP, props, sizeof(struct mfi_ld_props), mbox, 4, NULL)); }
static int delete_volume(int ac, char **av) { struct mfi_ld_info info; int error, fd; uint8_t target_id, mbox[4]; /* * Backwards compat. Map 'delete volume' to 'delete' and * 'delete spare' to 'remove'. */ if (ac > 1) { if (strcmp(av[1], "volume") == 0) { av++; ac--; } else if (strcmp(av[1], "spare") == 0) { av++; ac--; return (remove_spare(ac, av)); } } if (ac != 2) { warnx("delete volume: volume required"); return (EINVAL); } fd = mfi_open(mfi_unit); if (fd < 0) { error = errno; warn("mfi_open"); return (error); } if (!mfi_reconfig_supported()) { warnx("The current mfi(4) driver does not support " "configuration changes."); close(fd); return (EOPNOTSUPP); } if (mfi_lookup_volume(fd, av[1], &target_id) < 0) { error = errno; warn("Invalid volume %s", av[1]); close(fd); return (error); } if (mfi_ld_get_info(fd, target_id, &info, NULL) < 0) { error = errno; warn("Failed to get info for volume %d", target_id); close(fd); return (error); } if (mfi_volume_busy(fd, target_id)) { warnx("Volume %s is busy and cannot be deleted", mfi_volume_name(fd, target_id)); close(fd); return (EBUSY); } mbox_store_ldref(mbox, &info.ld_config.properties.ld); if (mfi_dcmd_command(fd, MFI_DCMD_LD_DELETE, NULL, 0, mbox, sizeof(mbox), NULL) < 0) { error = errno; warn("Failed to delete volume"); close(fd); return (error); } close(fd); return (0); }