nvmet_req_complete(req, status);
 }
 
+static void nvmet_execute_get_log_cmd_effects_ns(struct nvmet_req *req)
+{
+       u16 status = NVME_SC_INTERNAL;
+       struct nvme_effects_log *log;
+
+       log = kzalloc(sizeof(*log), GFP_KERNEL);
+       if (!log)
+               goto out;
+
+       log->acs[nvme_admin_get_log_page]       = cpu_to_le32(1 << 0);
+       log->acs[nvme_admin_identify]           = cpu_to_le32(1 << 0);
+       log->acs[nvme_admin_abort_cmd]          = cpu_to_le32(1 << 0);
+       log->acs[nvme_admin_set_features]       = cpu_to_le32(1 << 0);
+       log->acs[nvme_admin_get_features]       = cpu_to_le32(1 << 0);
+       log->acs[nvme_admin_async_event]        = cpu_to_le32(1 << 0);
+       log->acs[nvme_admin_keep_alive]         = cpu_to_le32(1 << 0);
+
+       log->iocs[nvme_cmd_read]                = cpu_to_le32(1 << 0);
+       log->iocs[nvme_cmd_write]               = cpu_to_le32(1 << 0);
+       log->iocs[nvme_cmd_flush]               = cpu_to_le32(1 << 0);
+       log->iocs[nvme_cmd_dsm]                 = cpu_to_le32(1 << 0);
+       log->iocs[nvme_cmd_write_zeroes]        = cpu_to_le32(1 << 0);
+
+       status = nvmet_copy_to_sgl(req, 0, log, sizeof(*log));
+
+       kfree(log);
+out:
+       nvmet_req_complete(req, status);
+}
+
 static void nvmet_execute_get_log_changed_ns(struct nvmet_req *req)
 {
        struct nvmet_ctrl *ctrl = req->sq->ctrl;
 
        /* first slot is read-only, only one slot supported */
        id->frmw = (1 << 0) | (1 << 1);
-       id->lpa = (1 << 0) | (1 << 2);
+       id->lpa = (1 << 0) | (1 << 1) | (1 << 2);
        id->elpe = NVMET_ERROR_LOG_SLOTS - 1;
        id->npss = 0;
 
                case NVME_LOG_CHANGED_NS:
                        req->execute = nvmet_execute_get_log_changed_ns;
                        return 0;
+               case NVME_LOG_CMD_EFFECTS:
+                       req->execute = nvmet_execute_get_log_cmd_effects_ns;
+                       return 0;
                }
                break;
        case nvme_admin_identify: