On Tue, May 29, 2018 at 04:59:05PM +0000, Verkamp, Daniel wrote: > > + } else if (ctrl->nr_changed_ns == NVME_MAX_CHANGED_NAMESPACES) { > > + ctrl->changed_ns_list[0] = cpu_to_le32(0xffffffff); > > + } > > Unless I'm missing it happening somewhere else, the list-full case that sets element 0 to 0xffffffff should also explicitly zero out the rest of the list to satisfy the "remainder of the list shall be zero-filled" wording in the spec, since the other changed_ns_list entries will be filled with non-zero NSIDs when we get here. True. We actually zero out unused elements already, but that doesn't catch the ctrl->nr_changed_ns == NVME_MAX_CHANGED_NAMESPACES special case. This relative patch should fix it: diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c index d7b6293e830b..7b69c348d608 100644 --- a/drivers/nvme/target/admin-cmd.c +++ b/drivers/nvme/target/admin-cmd.c @@ -136,7 +136,10 @@ static void nvmet_execute_get_log_changed_ns(struct nvmet_req *req) goto out; mutex_lock(&ctrl->lock); - len = ctrl->nr_changed_ns * sizeof(__le32); + if (ctrl->nr_changed_ns == NVME_MAX_CHANGED_NAMESPACES) + len = sizeof(__le32); + else + len = ctrl->nr_changed_ns * sizeof(__le32); status = nvmet_copy_to_sgl(req, 0, ctrl->changed_ns_list, len); if (!status) status = nvmet_zero_sgl(req, len, req->data_len - len);