|
@@ -137,6 +137,11 @@ int nvme_delete_ctrl_sync(struct nvme_ctrl *ctrl)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(nvme_delete_ctrl_sync);
|
|
|
|
|
|
+static inline bool nvme_ns_has_pi(struct nvme_ns *ns)
|
|
|
+{
|
|
|
+ return ns->pi_type && ns->ms == sizeof(struct t10_pi_tuple);
|
|
|
+}
|
|
|
+
|
|
|
static blk_status_t nvme_error_status(struct request *req)
|
|
|
{
|
|
|
switch (nvme_req(req)->status & 0x7ff) {
|
|
@@ -472,16 +477,6 @@ static inline blk_status_t nvme_setup_rw(struct nvme_ns *ns,
|
|
|
u16 control = 0;
|
|
|
u32 dsmgmt = 0;
|
|
|
|
|
|
- /*
|
|
|
- * If formated with metadata, require the block layer provide a buffer
|
|
|
- * unless this namespace is formated such that the metadata can be
|
|
|
- * stripped/generated by the controller with PRACT=1.
|
|
|
- */
|
|
|
- if (ns && ns->ms &&
|
|
|
- (!ns->pi_type || ns->ms != sizeof(struct t10_pi_tuple)) &&
|
|
|
- !blk_integrity_rq(req) && !blk_rq_is_passthrough(req))
|
|
|
- return BLK_STS_NOTSUPP;
|
|
|
-
|
|
|
if (req->cmd_flags & REQ_FUA)
|
|
|
control |= NVME_RW_FUA;
|
|
|
if (req->cmd_flags & (REQ_FAILFAST_DEV | REQ_RAHEAD))
|
|
@@ -500,6 +495,18 @@ static inline blk_status_t nvme_setup_rw(struct nvme_ns *ns,
|
|
|
nvme_assign_write_stream(ctrl, req, &control, &dsmgmt);
|
|
|
|
|
|
if (ns->ms) {
|
|
|
+ /*
|
|
|
+ * If formated with metadata, the block layer always provides a
|
|
|
+ * metadata buffer if CONFIG_BLK_DEV_INTEGRITY is enabled. Else
|
|
|
+ * we enable the PRACT bit for protection information or set the
|
|
|
+ * namespace capacity to zero to prevent any I/O.
|
|
|
+ */
|
|
|
+ if (!blk_integrity_rq(req)) {
|
|
|
+ if (WARN_ON_ONCE(!nvme_ns_has_pi(ns)))
|
|
|
+ return BLK_STS_NOTSUPP;
|
|
|
+ control |= NVME_RW_PRINFO_PRACT;
|
|
|
+ }
|
|
|
+
|
|
|
switch (ns->pi_type) {
|
|
|
case NVME_NS_DPS_PI_TYPE3:
|
|
|
control |= NVME_RW_PRINFO_PRCHK_GUARD;
|
|
@@ -512,8 +519,6 @@ static inline blk_status_t nvme_setup_rw(struct nvme_ns *ns,
|
|
|
nvme_block_nr(ns, blk_rq_pos(req)));
|
|
|
break;
|
|
|
}
|
|
|
- if (!blk_integrity_rq(req))
|
|
|
- control |= NVME_RW_PRINFO_PRACT;
|
|
|
}
|
|
|
|
|
|
cmnd->rw.control = cpu_to_le16(control);
|
|
@@ -1173,7 +1178,7 @@ static void nvme_update_disk_info(struct gendisk *disk,
|
|
|
if (ns->ms && !ns->ext &&
|
|
|
(ns->ctrl->ops->flags & NVME_F_METADATA_SUPPORTED))
|
|
|
nvme_init_integrity(disk, ns->ms, ns->pi_type);
|
|
|
- if (ns->ms && !(ns->ms == 8 && ns->pi_type) && !blk_get_integrity(disk))
|
|
|
+ if (ns->ms && !nvme_ns_has_pi(ns) && !blk_get_integrity(disk))
|
|
|
capacity = 0;
|
|
|
set_capacity(disk, capacity);
|
|
|
|