4533 if (nsid == 0)
4534 nsid = (uint32_t)-1;
4535
4536 return (nvme_format_nvm(nvme, B_TRUE, nsid, frmt.b.fm_lbaf, B_FALSE, 0,
4537 B_FALSE, frmt.b.fm_ses));
4538 }
4539
4540 static int
4541 nvme_ioctl_detach(nvme_t *nvme, int nsid, nvme_ioctl_t *nioc, int mode,
4542 cred_t *cred_p)
4543 {
4544 _NOTE(ARGUNUSED(nioc, mode));
4545 int rv = 0;
4546
4547 if ((mode & FWRITE) == 0 || secpolicy_sys_config(cred_p, B_FALSE) != 0)
4548 return (EPERM);
4549
4550 if (nsid == 0)
4551 return (EINVAL);
4552
4553 rv = bd_detach_handle(nvme->n_ns[nsid - 1].ns_bd_hdl);
4554 if (rv != DDI_SUCCESS)
4555 rv = EBUSY;
4556
4557 return (rv);
4558 }
4559
4560 static int
4561 nvme_ioctl_attach(nvme_t *nvme, int nsid, nvme_ioctl_t *nioc, int mode,
4562 cred_t *cred_p)
4563 {
4564 _NOTE(ARGUNUSED(nioc, mode));
4565 nvme_identify_nsid_t *idns;
4566 int rv = 0;
4567
4568 if ((mode & FWRITE) == 0 || secpolicy_sys_config(cred_p, B_FALSE) != 0)
4569 return (EPERM);
4570
4571 if (nsid == 0)
4572 return (EINVAL);
4573
4574 /*
4575 * Identify namespace again, free old identify data.
4576 */
4577 idns = nvme->n_ns[nsid - 1].ns_idns;
4578 if (nvme_init_ns(nvme, nsid) != DDI_SUCCESS)
4579 return (EIO);
4580
4581 kmem_free(idns, sizeof (nvme_identify_nsid_t));
4582
4583 rv = bd_attach_handle(nvme->n_dip, nvme->n_ns[nsid - 1].ns_bd_hdl);
4584 if (rv != DDI_SUCCESS)
4585 rv = EBUSY;
4586
4587 return (rv);
4588 }
4589
4590 static void
4591 nvme_ufm_update(nvme_t *nvme)
4592 {
4593 mutex_enter(&nvme->n_fwslot_mutex);
4594 ddi_ufm_update(nvme->n_ufmh);
4595 if (nvme->n_fwslot != NULL) {
4596 kmem_free(nvme->n_fwslot, sizeof (nvme_fwslot_log_t));
4597 nvme->n_fwslot = NULL;
4598 }
4599 mutex_exit(&nvme->n_fwslot_mutex);
4600 }
4601
4602 static int
|
4533 if (nsid == 0)
4534 nsid = (uint32_t)-1;
4535
4536 return (nvme_format_nvm(nvme, B_TRUE, nsid, frmt.b.fm_lbaf, B_FALSE, 0,
4537 B_FALSE, frmt.b.fm_ses));
4538 }
4539
4540 static int
4541 nvme_ioctl_detach(nvme_t *nvme, int nsid, nvme_ioctl_t *nioc, int mode,
4542 cred_t *cred_p)
4543 {
4544 _NOTE(ARGUNUSED(nioc, mode));
4545 int rv = 0;
4546
4547 if ((mode & FWRITE) == 0 || secpolicy_sys_config(cred_p, B_FALSE) != 0)
4548 return (EPERM);
4549
4550 if (nsid == 0)
4551 return (EINVAL);
4552
4553 if (nvme->n_ns[nsid - 1].ns_ignore)
4554 return (0);
4555
4556 rv = bd_detach_handle(nvme->n_ns[nsid - 1].ns_bd_hdl);
4557 if (rv != DDI_SUCCESS)
4558 rv = EBUSY;
4559
4560 return (rv);
4561 }
4562
4563 static int
4564 nvme_ioctl_attach(nvme_t *nvme, int nsid, nvme_ioctl_t *nioc, int mode,
4565 cred_t *cred_p)
4566 {
4567 _NOTE(ARGUNUSED(nioc, mode));
4568 nvme_identify_nsid_t *idns;
4569 int rv = 0;
4570
4571 if ((mode & FWRITE) == 0 || secpolicy_sys_config(cred_p, B_FALSE) != 0)
4572 return (EPERM);
4573
4574 if (nsid == 0)
4575 return (EINVAL);
4576
4577 /*
4578 * Identify namespace again, free old identify data.
4579 */
4580 idns = nvme->n_ns[nsid - 1].ns_idns;
4581 if (nvme_init_ns(nvme, nsid) != DDI_SUCCESS)
4582 return (EIO);
4583
4584 kmem_free(idns, sizeof (nvme_identify_nsid_t));
4585
4586 if (nvme->n_ns[nsid - 1].ns_ignore)
4587 return (ENOTSUP);
4588
4589 if (nvme->n_ns[nsid - 1].ns_bd_hdl == NULL)
4590 nvme->n_ns[nsid - 1].ns_bd_hdl = bd_alloc_handle(
4591 &nvme->n_ns[nsid - 1], &nvme_bd_ops, &nvme->n_prp_dma_attr,
4592 KM_SLEEP);
4593
4594 rv = bd_attach_handle(nvme->n_dip, nvme->n_ns[nsid - 1].ns_bd_hdl);
4595 if (rv != DDI_SUCCESS)
4596 rv = EBUSY;
4597
4598 return (rv);
4599 }
4600
4601 static void
4602 nvme_ufm_update(nvme_t *nvme)
4603 {
4604 mutex_enter(&nvme->n_fwslot_mutex);
4605 ddi_ufm_update(nvme->n_ufmh);
4606 if (nvme->n_fwslot != NULL) {
4607 kmem_free(nvme->n_fwslot, sizeof (nvme_fwslot_log_t));
4608 nvme->n_fwslot = NULL;
4609 }
4610 mutex_exit(&nvme->n_fwslot_mutex);
4611 }
4612
4613 static int
|