nvme: fix miss command type check
commit31a5978243
upstream. In the function nvme_passthru_end(), only the value of the command opcode is checked, without checking the command type (IO command or Admin command). When we send a Dataset Management command (The opcode of the Dataset Management command is the same as the Set Feature command), kernel thinks it is a set feature command, then sets the controller's keep alive interval, and calls nvme_keep_alive_work(). Signed-off-by: min15.li <min15.li@samsung.com> Reviewed-by: Kanchan Joshi <joshi.k@samsung.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Keith Busch <kbusch@kernel.org> Fixes:b58da2d270
("nvme: update keep alive interval when kato is modified") Signed-off-by: Tokunori Ikegami <ikegami.t@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
d225b0ac96
commit
b9c5f7da76
|
@ -1185,7 +1185,7 @@ static u32 nvme_passthru_start(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
|
||||||
return effects;
|
return effects;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nvme_passthru_end(struct nvme_ctrl *ctrl, u32 effects,
|
static void nvme_passthru_end(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u32 effects,
|
||||||
struct nvme_command *cmd, int status)
|
struct nvme_command *cmd, int status)
|
||||||
{
|
{
|
||||||
if (effects & NVME_CMD_EFFECTS_CSE_MASK) {
|
if (effects & NVME_CMD_EFFECTS_CSE_MASK) {
|
||||||
|
@ -1201,6 +1201,8 @@ static void nvme_passthru_end(struct nvme_ctrl *ctrl, u32 effects,
|
||||||
nvme_queue_scan(ctrl);
|
nvme_queue_scan(ctrl);
|
||||||
flush_work(&ctrl->scan_work);
|
flush_work(&ctrl->scan_work);
|
||||||
}
|
}
|
||||||
|
if (ns)
|
||||||
|
return;
|
||||||
|
|
||||||
switch (cmd->common.opcode) {
|
switch (cmd->common.opcode) {
|
||||||
case nvme_admin_set_features:
|
case nvme_admin_set_features:
|
||||||
|
@ -1235,7 +1237,7 @@ int nvme_execute_passthru_rq(struct request *rq)
|
||||||
effects = nvme_passthru_start(ctrl, ns, cmd->common.opcode);
|
effects = nvme_passthru_start(ctrl, ns, cmd->common.opcode);
|
||||||
ret = nvme_execute_rq(disk, rq, false);
|
ret = nvme_execute_rq(disk, rq, false);
|
||||||
if (effects) /* nothing to be done for zero cmd effects */
|
if (effects) /* nothing to be done for zero cmd effects */
|
||||||
nvme_passthru_end(ctrl, effects, cmd, ret);
|
nvme_passthru_end(ctrl, ns, effects, cmd, ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue