Print this page
11969 Attempting to attach an invalid nvme namespace will cause a panic
Reviewed by: Robert Mustacchi <rm+illumos@fingolfin.org>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>


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