diff options
author | Scott Bauer <scott.bauer@intel.com> | 2017-02-17 07:59:40 -0500 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2017-02-17 14:41:49 -0500 |
commit | 8a9ae523282f324989850fcf41312b42a2fb9296 (patch) | |
tree | 6cb1aa6430c7668b4ffeb4835329f76becdf016a | |
parent | 4f1244c8298606b8fae64b4d78b820ae6b896e3c (diff) |
nvme: Check for Security send/recv support before issuing commands.
We need to verify that the controller supports the security
commands before actually trying to issue them.
Signed-off-by: Scott Bauer <scott.bauer@intel.com>
[hch: moved the check so that we don't call into the OPAL code if not
supported]
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r-- | drivers/nvme/host/core.c | 1 | ||||
-rw-r--r-- | drivers/nvme/host/nvme.h | 1 | ||||
-rw-r--r-- | drivers/nvme/host/pci.c | 2 | ||||
-rw-r--r-- | include/linux/nvme.h | 1 |
4 files changed, 4 insertions, 1 deletions
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index f6b56a12457a..b4e743d1c0b4 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c | |||
@@ -1264,6 +1264,7 @@ int nvme_init_identify(struct nvme_ctrl *ctrl) | |||
1264 | return -EIO; | 1264 | return -EIO; |
1265 | } | 1265 | } |
1266 | 1266 | ||
1267 | ctrl->oacs = le16_to_cpu(id->oacs); | ||
1267 | ctrl->vid = le16_to_cpu(id->vid); | 1268 | ctrl->vid = le16_to_cpu(id->vid); |
1268 | ctrl->oncs = le16_to_cpup(&id->oncs); | 1269 | ctrl->oncs = le16_to_cpup(&id->oncs); |
1269 | atomic_set(&ctrl->abort_limit, id->acl + 1); | 1270 | atomic_set(&ctrl->abort_limit, id->acl + 1); |
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index fd94c94ccbcb..b0977229e219 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h | |||
@@ -140,6 +140,7 @@ struct nvme_ctrl { | |||
140 | u32 max_hw_sectors; | 140 | u32 max_hw_sectors; |
141 | u16 oncs; | 141 | u16 oncs; |
142 | u16 vid; | 142 | u16 vid; |
143 | u16 oacs; | ||
143 | atomic_t abort_limit; | 144 | atomic_t abort_limit; |
144 | u8 event_limit; | 145 | u8 event_limit; |
145 | u8 vwc; | 146 | u8 vwc; |
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 50b070528c50..85896d46aebc 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c | |||
@@ -1792,7 +1792,7 @@ static void nvme_reset_work(struct work_struct *work) | |||
1792 | if (result) | 1792 | if (result) |
1793 | goto out; | 1793 | goto out; |
1794 | 1794 | ||
1795 | if (!dev->ctrl.opal_dev) { | 1795 | if ((dev->ctrl.oacs & NVME_CTRL_OACS_SEC_SUPP) && !dev->ctrl.opal_dev) { |
1796 | dev->ctrl.opal_dev = | 1796 | dev->ctrl.opal_dev = |
1797 | init_opal_dev(&dev->ctrl, &nvme_sec_submit); | 1797 | init_opal_dev(&dev->ctrl, &nvme_sec_submit); |
1798 | } | 1798 | } |
diff --git a/include/linux/nvme.h b/include/linux/nvme.h index 3d1c6f1b15c9..00eac863a9c7 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h | |||
@@ -244,6 +244,7 @@ enum { | |||
244 | NVME_CTRL_ONCS_DSM = 1 << 2, | 244 | NVME_CTRL_ONCS_DSM = 1 << 2, |
245 | NVME_CTRL_ONCS_WRITE_ZEROES = 1 << 3, | 245 | NVME_CTRL_ONCS_WRITE_ZEROES = 1 << 3, |
246 | NVME_CTRL_VWC_PRESENT = 1 << 0, | 246 | NVME_CTRL_VWC_PRESENT = 1 << 0, |
247 | NVME_CTRL_OACS_SEC_SUPP = 1 << 0, | ||
247 | }; | 248 | }; |
248 | 249 | ||
249 | struct nvme_lbaf { | 250 | struct nvme_lbaf { |