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>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/nvme/nvme.c
          +++ new/usr/src/uts/common/io/nvme/nvme.c
↓ open down ↓ 4542 lines elided ↑ open up ↑
4543 4543  {
4544 4544          _NOTE(ARGUNUSED(nioc, mode));
4545 4545          int rv = 0;
4546 4546  
4547 4547          if ((mode & FWRITE) == 0 || secpolicy_sys_config(cred_p, B_FALSE) != 0)
4548 4548                  return (EPERM);
4549 4549  
4550 4550          if (nsid == 0)
4551 4551                  return (EINVAL);
4552 4552  
     4553 +        if (nvme->n_ns[nsid - 1].ns_ignore)
     4554 +                return (0);
     4555 +
4553 4556          rv = bd_detach_handle(nvme->n_ns[nsid - 1].ns_bd_hdl);
4554 4557          if (rv != DDI_SUCCESS)
4555 4558                  rv = EBUSY;
4556 4559  
4557 4560          return (rv);
4558 4561  }
4559 4562  
4560 4563  static int
4561 4564  nvme_ioctl_attach(nvme_t *nvme, int nsid, nvme_ioctl_t *nioc, int mode,
4562 4565      cred_t *cred_p)
↓ open down ↓ 10 lines elided ↑ open up ↑
4573 4576  
4574 4577          /*
4575 4578           * Identify namespace again, free old identify data.
4576 4579           */
4577 4580          idns = nvme->n_ns[nsid - 1].ns_idns;
4578 4581          if (nvme_init_ns(nvme, nsid) != DDI_SUCCESS)
4579 4582                  return (EIO);
4580 4583  
4581 4584          kmem_free(idns, sizeof (nvme_identify_nsid_t));
4582 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 +
4583 4594          rv = bd_attach_handle(nvme->n_dip, nvme->n_ns[nsid - 1].ns_bd_hdl);
4584 4595          if (rv != DDI_SUCCESS)
4585 4596                  rv = EBUSY;
4586 4597  
4587 4598          return (rv);
4588 4599  }
4589 4600  
4590 4601  static void
4591 4602  nvme_ufm_update(nvme_t *nvme)
4592 4603  {
↓ open down ↓ 321 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX