linux/drivers/nvme/target/admin-cmd.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * NVMe admin command implementation.
   4 * Copyright (c) 2015-2016 HGST, a Western Digital Company.
   5 */
   6#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   7#include <linux/module.h>
   8#include <linux/rculist.h>
   9#include <linux/part_stat.h>
  10
  11#include <generated/utsrelease.h>
  12#include <asm/unaligned.h>
  13#include "nvmet.h"
  14
  15u32 nvmet_get_log_page_len(struct nvme_command *cmd)
  16{
  17        u32 len = le16_to_cpu(cmd->get_log_page.numdu);
  18
  19        len <<= 16;
  20        len += le16_to_cpu(cmd->get_log_page.numdl);
  21        /* NUMD is a 0's based value */
  22        len += 1;
  23        len *= sizeof(u32);
  24
  25        return len;
  26}
  27
  28static u32 nvmet_feat_data_len(struct nvmet_req *req, u32 cdw10)
  29{
  30        switch (cdw10 & 0xff) {
  31        case NVME_FEAT_HOST_ID:
  32                return sizeof(req->sq->ctrl->hostid);
  33        default:
  34                return 0;
  35        }
  36}
  37
  38u64 nvmet_get_log_page_offset(struct nvme_command *cmd)
  39{
  40        return le64_to_cpu(cmd->get_log_page.lpo);
  41}
  42
  43static void nvmet_execute_get_log_page_noop(struct nvmet_req *req)
  44{
  45        nvmet_req_complete(req, nvmet_zero_sgl(req, 0, req->transfer_len));
  46}
  47
  48static void nvmet_execute_get_log_page_error(struct nvmet_req *req)
  49{
  50        struct nvmet_ctrl *ctrl = req->sq->ctrl;
  51        unsigned long flags;
  52        off_t offset = 0;
  53        u64 slot;
  54        u64 i;
  55
  56        spin_lock_irqsave(&ctrl->error_lock, flags);
  57        slot = ctrl->err_counter % NVMET_ERROR_LOG_SLOTS;
  58
  59        for (i = 0; i < NVMET_ERROR_LOG_SLOTS; i++) {
  60                if (nvmet_copy_to_sgl(req, offset, &ctrl->slots[slot],
  61                                sizeof(struct nvme_error_slot)))
  62                        break;
  63
  64                if (slot == 0)
  65                        slot = NVMET_ERROR_LOG_SLOTS - 1;
  66                else
  67                        slot--;
  68                offset += sizeof(struct nvme_error_slot);
  69        }
  70        spin_unlock_irqrestore(&ctrl->error_lock, flags);
  71        nvmet_req_complete(req, 0);
  72}
  73
  74static u16 nvmet_get_smart_log_nsid(struct nvmet_req *req,
  75                struct nvme_smart_log *slog)
  76{
  77        u64 host_reads, host_writes, data_units_read, data_units_written;
  78        u16 status;
  79
  80        status = nvmet_req_find_ns(req);
  81        if (status)
  82                return status;
  83
  84        /* we don't have the right data for file backed ns */
  85        if (!req->ns->bdev)
  86                return NVME_SC_SUCCESS;
  87
  88        host_reads = part_stat_read(req->ns->bdev, ios[READ]);
  89        data_units_read =
  90                DIV_ROUND_UP(part_stat_read(req->ns->bdev, sectors[READ]), 1000);
  91        host_writes = part_stat_read(req->ns->bdev, ios[WRITE]);
  92        data_units_written =
  93                DIV_ROUND_UP(part_stat_read(req->ns->bdev, sectors[WRITE]), 1000);
  94
  95        put_unaligned_le64(host_reads, &slog->host_reads[0]);
  96        put_unaligned_le64(data_units_read, &slog->data_units_read[0]);
  97        put_unaligned_le64(host_writes, &slog->host_writes[0]);
  98        put_unaligned_le64(data_units_written, &slog->data_units_written[0]);
  99
 100        return NVME_SC_SUCCESS;
 101}
 102
 103static u16 nvmet_get_smart_log_all(struct nvmet_req *req,
 104                struct nvme_smart_log *slog)
 105{
 106        u64 host_reads = 0, host_writes = 0;
 107        u64 data_units_read = 0, data_units_written = 0;
 108        struct nvmet_ns *ns;
 109        struct nvmet_ctrl *ctrl;
 110        unsigned long idx;
 111
 112        ctrl = req->sq->ctrl;
 113        xa_for_each(&ctrl->subsys->namespaces, idx, ns) {
 114                /* we don't have the right data for file backed ns */
 115                if (!ns->bdev)
 116                        continue;
 117                host_reads += part_stat_read(ns->bdev, ios[READ]);
 118                data_units_read += DIV_ROUND_UP(
 119                        part_stat_read(ns->bdev, sectors[READ]), 1000);
 120                host_writes += part_stat_read(ns->bdev, ios[WRITE]);
 121                data_units_written += DIV_ROUND_UP(
 122                        part_stat_read(ns->bdev, sectors[WRITE]), 1000);
 123        }
 124
 125        put_unaligned_le64(host_reads, &slog->host_reads[0]);
 126        put_unaligned_le64(data_units_read, &slog->data_units_read[0]);
 127        put_unaligned_le64(host_writes, &slog->host_writes[0]);
 128        put_unaligned_le64(data_units_written, &slog->data_units_written[0]);
 129
 130        return NVME_SC_SUCCESS;
 131}
 132
 133static void nvmet_execute_get_log_page_smart(struct nvmet_req *req)
 134{
 135        struct nvme_smart_log *log;
 136        u16 status = NVME_SC_INTERNAL;
 137        unsigned long flags;
 138
 139        if (req->transfer_len != sizeof(*log))
 140                goto out;
 141
 142        log = kzalloc(sizeof(*log), GFP_KERNEL);
 143        if (!log)
 144                goto out;
 145
 146        if (req->cmd->get_log_page.nsid == cpu_to_le32(NVME_NSID_ALL))
 147                status = nvmet_get_smart_log_all(req, log);
 148        else
 149                status = nvmet_get_smart_log_nsid(req, log);
 150        if (status)
 151                goto out_free_log;
 152
 153        spin_lock_irqsave(&req->sq->ctrl->error_lock, flags);
 154        put_unaligned_le64(req->sq->ctrl->err_counter,
 155                        &log->num_err_log_entries);
 156        spin_unlock_irqrestore(&req->sq->ctrl->error_lock, flags);
 157
 158        status = nvmet_copy_to_sgl(req, 0, log, sizeof(*log));
 159out_free_log:
 160        kfree(log);
 161out:
 162        nvmet_req_complete(req, status);
 163}
 164
 165static void nvmet_execute_get_log_cmd_effects_ns(struct nvmet_req *req)
 166{
 167        u16 status = NVME_SC_INTERNAL;
 168        struct nvme_effects_log *log;
 169
 170        log = kzalloc(sizeof(*log), GFP_KERNEL);
 171        if (!log)
 172                goto out;
 173
 174        log->acs[nvme_admin_get_log_page]       = cpu_to_le32(1 << 0);
 175        log->acs[nvme_admin_identify]           = cpu_to_le32(1 << 0);
 176        log->acs[nvme_admin_abort_cmd]          = cpu_to_le32(1 << 0);
 177        log->acs[nvme_admin_set_features]       = cpu_to_le32(1 << 0);
 178        log->acs[nvme_admin_get_features]       = cpu_to_le32(1 << 0);
 179        log->acs[nvme_admin_async_event]        = cpu_to_le32(1 << 0);
 180        log->acs[nvme_admin_keep_alive]         = cpu_to_le32(1 << 0);
 181
 182        log->iocs[nvme_cmd_read]                = cpu_to_le32(1 << 0);
 183        log->iocs[nvme_cmd_write]               = cpu_to_le32(1 << 0);
 184        log->iocs[nvme_cmd_flush]               = cpu_to_le32(1 << 0);
 185        log->iocs[nvme_cmd_dsm]                 = cpu_to_le32(1 << 0);
 186        log->iocs[nvme_cmd_write_zeroes]        = cpu_to_le32(1 << 0);
 187
 188        status = nvmet_copy_to_sgl(req, 0, log, sizeof(*log));
 189
 190        kfree(log);
 191out:
 192        nvmet_req_complete(req, status);
 193}
 194
 195static void nvmet_execute_get_log_changed_ns(struct nvmet_req *req)
 196{
 197        struct nvmet_ctrl *ctrl = req->sq->ctrl;
 198        u16 status = NVME_SC_INTERNAL;
 199        size_t len;
 200
 201        if (req->transfer_len != NVME_MAX_CHANGED_NAMESPACES * sizeof(__le32))
 202                goto out;
 203
 204        mutex_lock(&ctrl->lock);
 205        if (ctrl->nr_changed_ns == U32_MAX)
 206                len = sizeof(__le32);
 207        else
 208                len = ctrl->nr_changed_ns * sizeof(__le32);
 209        status = nvmet_copy_to_sgl(req, 0, ctrl->changed_ns_list, len);
 210        if (!status)
 211                status = nvmet_zero_sgl(req, len, req->transfer_len - len);
 212        ctrl->nr_changed_ns = 0;
 213        nvmet_clear_aen_bit(req, NVME_AEN_BIT_NS_ATTR);
 214        mutex_unlock(&ctrl->lock);
 215out:
 216        nvmet_req_complete(req, status);
 217}
 218
 219static u32 nvmet_format_ana_group(struct nvmet_req *req, u32 grpid,
 220                struct nvme_ana_group_desc *desc)
 221{
 222        struct nvmet_ctrl *ctrl = req->sq->ctrl;
 223        struct nvmet_ns *ns;
 224        unsigned long idx;
 225        u32 count = 0;
 226
 227        if (!(req->cmd->get_log_page.lsp & NVME_ANA_LOG_RGO)) {
 228                xa_for_each(&ctrl->subsys->namespaces, idx, ns)
 229                        if (ns->anagrpid == grpid)
 230                                desc->nsids[count++] = cpu_to_le32(ns->nsid);
 231        }
 232
 233        desc->grpid = cpu_to_le32(grpid);
 234        desc->nnsids = cpu_to_le32(count);
 235        desc->chgcnt = cpu_to_le64(nvmet_ana_chgcnt);
 236        desc->state = req->port->ana_state[grpid];
 237        memset(desc->rsvd17, 0, sizeof(desc->rsvd17));
 238        return sizeof(struct nvme_ana_group_desc) + count * sizeof(__le32);
 239}
 240
 241static void nvmet_execute_get_log_page_ana(struct nvmet_req *req)
 242{
 243        struct nvme_ana_rsp_hdr hdr = { 0, };
 244        struct nvme_ana_group_desc *desc;
 245        size_t offset = sizeof(struct nvme_ana_rsp_hdr); /* start beyond hdr */
 246        size_t len;
 247        u32 grpid;
 248        u16 ngrps = 0;
 249        u16 status;
 250
 251        status = NVME_SC_INTERNAL;
 252        desc = kmalloc(sizeof(struct nvme_ana_group_desc) +
 253                        NVMET_MAX_NAMESPACES * sizeof(__le32), GFP_KERNEL);
 254        if (!desc)
 255                goto out;
 256
 257        down_read(&nvmet_ana_sem);
 258        for (grpid = 1; grpid <= NVMET_MAX_ANAGRPS; grpid++) {
 259                if (!nvmet_ana_group_enabled[grpid])
 260                        continue;
 261                len = nvmet_format_ana_group(req, grpid, desc);
 262                status = nvmet_copy_to_sgl(req, offset, desc, len);
 263                if (status)
 264                        break;
 265                offset += len;
 266                ngrps++;
 267        }
 268        for ( ; grpid <= NVMET_MAX_ANAGRPS; grpid++) {
 269                if (nvmet_ana_group_enabled[grpid])
 270                        ngrps++;
 271        }
 272
 273        hdr.chgcnt = cpu_to_le64(nvmet_ana_chgcnt);
 274        hdr.ngrps = cpu_to_le16(ngrps);
 275        nvmet_clear_aen_bit(req, NVME_AEN_BIT_ANA_CHANGE);
 276        up_read(&nvmet_ana_sem);
 277
 278        kfree(desc);
 279
 280        /* copy the header last once we know the number of groups */
 281        status = nvmet_copy_to_sgl(req, 0, &hdr, sizeof(hdr));
 282out:
 283        nvmet_req_complete(req, status);
 284}
 285
 286static void nvmet_execute_get_log_page(struct nvmet_req *req)
 287{
 288        if (!nvmet_check_transfer_len(req, nvmet_get_log_page_len(req->cmd)))
 289                return;
 290
 291        switch (req->cmd->get_log_page.lid) {
 292        case NVME_LOG_ERROR:
 293                return nvmet_execute_get_log_page_error(req);
 294        case NVME_LOG_SMART:
 295                return nvmet_execute_get_log_page_smart(req);
 296        case NVME_LOG_FW_SLOT:
 297                /*
 298                 * We only support a single firmware slot which always is
 299                 * active, so we can zero out the whole firmware slot log and
 300                 * still claim to fully implement this mandatory log page.
 301                 */
 302                return nvmet_execute_get_log_page_noop(req);
 303        case NVME_LOG_CHANGED_NS:
 304                return nvmet_execute_get_log_changed_ns(req);
 305        case NVME_LOG_CMD_EFFECTS:
 306                return nvmet_execute_get_log_cmd_effects_ns(req);
 307        case NVME_LOG_ANA:
 308                return nvmet_execute_get_log_page_ana(req);
 309        }
 310        pr_debug("unhandled lid %d on qid %d\n",
 311               req->cmd->get_log_page.lid, req->sq->qid);
 312        req->error_loc = offsetof(struct nvme_get_log_page_command, lid);
 313        nvmet_req_complete(req, NVME_SC_INVALID_FIELD | NVME_SC_DNR);
 314}
 315
 316static u16 nvmet_set_model_number(struct nvmet_subsys *subsys)
 317{
 318        u16 status = 0;
 319
 320        mutex_lock(&subsys->lock);
 321        if (!subsys->model_number) {
 322                subsys->model_number =
 323                        kstrdup(NVMET_DEFAULT_CTRL_MODEL, GFP_KERNEL);
 324                if (!subsys->model_number)
 325                        status = NVME_SC_INTERNAL;
 326        }
 327        mutex_unlock(&subsys->lock);
 328
 329        return status;
 330}
 331
 332static void nvmet_execute_identify_ctrl(struct nvmet_req *req)
 333{
 334        struct nvmet_ctrl *ctrl = req->sq->ctrl;
 335        struct nvmet_subsys *subsys = ctrl->subsys;
 336        struct nvme_id_ctrl *id;
 337        u32 cmd_capsule_size;
 338        u16 status = 0;
 339
 340        /*
 341         * If there is no model number yet, set it now.  It will then remain
 342         * stable for the life time of the subsystem.
 343         */
 344        if (!subsys->model_number) {
 345                status = nvmet_set_model_number(subsys);
 346                if (status)
 347                        goto out;
 348        }
 349
 350        id = kzalloc(sizeof(*id), GFP_KERNEL);
 351        if (!id) {
 352                status = NVME_SC_INTERNAL;
 353                goto out;
 354        }
 355
 356        /* XXX: figure out how to assign real vendors IDs. */
 357        id->vid = 0;
 358        id->ssvid = 0;
 359
 360        memset(id->sn, ' ', sizeof(id->sn));
 361        bin2hex(id->sn, &ctrl->subsys->serial,
 362                min(sizeof(ctrl->subsys->serial), sizeof(id->sn) / 2));
 363        memcpy_and_pad(id->mn, sizeof(id->mn), subsys->model_number,
 364                       strlen(subsys->model_number), ' ');
 365        memcpy_and_pad(id->fr, sizeof(id->fr),
 366                       UTS_RELEASE, strlen(UTS_RELEASE), ' ');
 367
 368        id->rab = 6;
 369
 370        /*
 371         * XXX: figure out how we can assign a IEEE OUI, but until then
 372         * the safest is to leave it as zeroes.
 373         */
 374
 375        /* we support multiple ports, multiples hosts and ANA: */
 376        id->cmic = (1 << 0) | (1 << 1) | (1 << 3);
 377
 378        /* Limit MDTS according to transport capability */
 379        if (ctrl->ops->get_mdts)
 380                id->mdts = ctrl->ops->get_mdts(ctrl);
 381        else
 382                id->mdts = 0;
 383
 384        id->cntlid = cpu_to_le16(ctrl->cntlid);
 385        id->ver = cpu_to_le32(ctrl->subsys->ver);
 386
 387        /* XXX: figure out what to do about RTD3R/RTD3 */
 388        id->oaes = cpu_to_le32(NVMET_AEN_CFG_OPTIONAL);
 389        id->ctratt = cpu_to_le32(NVME_CTRL_ATTR_HID_128_BIT |
 390                NVME_CTRL_ATTR_TBKAS);
 391
 392        id->oacs = 0;
 393
 394        /*
 395         * We don't really have a practical limit on the number of abort
 396         * comands.  But we don't do anything useful for abort either, so
 397         * no point in allowing more abort commands than the spec requires.
 398         */
 399        id->acl = 3;
 400
 401        id->aerl = NVMET_ASYNC_EVENTS - 1;
 402
 403        /* first slot is read-only, only one slot supported */
 404        id->frmw = (1 << 0) | (1 << 1);
 405        id->lpa = (1 << 0) | (1 << 1) | (1 << 2);
 406        id->elpe = NVMET_ERROR_LOG_SLOTS - 1;
 407        id->npss = 0;
 408
 409        /* We support keep-alive timeout in granularity of seconds */
 410        id->kas = cpu_to_le16(NVMET_KAS);
 411
 412        id->sqes = (0x6 << 4) | 0x6;
 413        id->cqes = (0x4 << 4) | 0x4;
 414
 415        /* no enforcement soft-limit for maxcmd - pick arbitrary high value */
 416        id->maxcmd = cpu_to_le16(NVMET_MAX_CMD);
 417
 418        id->nn = cpu_to_le32(ctrl->subsys->max_nsid);
 419        id->mnan = cpu_to_le32(NVMET_MAX_NAMESPACES);
 420        id->oncs = cpu_to_le16(NVME_CTRL_ONCS_DSM |
 421                        NVME_CTRL_ONCS_WRITE_ZEROES);
 422
 423        /* XXX: don't report vwc if the underlying device is write through */
 424        id->vwc = NVME_CTRL_VWC_PRESENT;
 425
 426        /*
 427         * We can't support atomic writes bigger than a LBA without support
 428         * from the backend device.
 429         */
 430        id->awun = 0;
 431        id->awupf = 0;
 432
 433        id->sgls = cpu_to_le32(1 << 0); /* we always support SGLs */
 434        if (ctrl->ops->flags & NVMF_KEYED_SGLS)
 435                id->sgls |= cpu_to_le32(1 << 2);
 436        if (req->port->inline_data_size)
 437                id->sgls |= cpu_to_le32(1 << 20);
 438
 439        strlcpy(id->subnqn, ctrl->subsys->subsysnqn, sizeof(id->subnqn));
 440
 441        /*
 442         * Max command capsule size is sqe + in-capsule data size.
 443         * Disable in-capsule data for Metadata capable controllers.
 444         */
 445        cmd_capsule_size = sizeof(struct nvme_command);
 446        if (!ctrl->pi_support)
 447                cmd_capsule_size += req->port->inline_data_size;
 448        id->ioccsz = cpu_to_le32(cmd_capsule_size / 16);
 449
 450        /* Max response capsule size is cqe */
 451        id->iorcsz = cpu_to_le32(sizeof(struct nvme_completion) / 16);
 452
 453        id->msdbd = ctrl->ops->msdbd;
 454
 455        id->anacap = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4);
 456        id->anatt = 10; /* random value */
 457        id->anagrpmax = cpu_to_le32(NVMET_MAX_ANAGRPS);
 458        id->nanagrpid = cpu_to_le32(NVMET_MAX_ANAGRPS);
 459
 460        /*
 461         * Meh, we don't really support any power state.  Fake up the same
 462         * values that qemu does.
 463         */
 464        id->psd[0].max_power = cpu_to_le16(0x9c4);
 465        id->psd[0].entry_lat = cpu_to_le32(0x10);
 466        id->psd[0].exit_lat = cpu_to_le32(0x4);
 467
 468        id->nwpc = 1 << 0; /* write protect and no write protect */
 469
 470        status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id));
 471
 472        kfree(id);
 473out:
 474        nvmet_req_complete(req, status);
 475}
 476
 477static void nvmet_execute_identify_ns(struct nvmet_req *req)
 478{
 479        struct nvme_id_ns *id;
 480        u16 status;
 481
 482        if (le32_to_cpu(req->cmd->identify.nsid) == NVME_NSID_ALL) {
 483                req->error_loc = offsetof(struct nvme_identify, nsid);
 484                status = NVME_SC_INVALID_NS | NVME_SC_DNR;
 485                goto out;
 486        }
 487
 488        id = kzalloc(sizeof(*id), GFP_KERNEL);
 489        if (!id) {
 490                status = NVME_SC_INTERNAL;
 491                goto out;
 492        }
 493
 494        /* return an all zeroed buffer if we can't find an active namespace */
 495        status = nvmet_req_find_ns(req);
 496        if (status) {
 497                status = 0;
 498                goto done;
 499        }
 500
 501        nvmet_ns_revalidate(req->ns);
 502
 503        /*
 504         * nuse = ncap = nsze isn't always true, but we have no way to find
 505         * that out from the underlying device.
 506         */
 507        id->ncap = id->nsze =
 508                cpu_to_le64(req->ns->size >> req->ns->blksize_shift);
 509        switch (req->port->ana_state[req->ns->anagrpid]) {
 510        case NVME_ANA_INACCESSIBLE:
 511        case NVME_ANA_PERSISTENT_LOSS:
 512                break;
 513        default:
 514                id->nuse = id->nsze;
 515                break;
 516        }
 517
 518        if (req->ns->bdev)
 519                nvmet_bdev_set_limits(req->ns->bdev, id);
 520
 521        /*
 522         * We just provide a single LBA format that matches what the
 523         * underlying device reports.
 524         */
 525        id->nlbaf = 0;
 526        id->flbas = 0;
 527
 528        /*
 529         * Our namespace might always be shared.  Not just with other
 530         * controllers, but also with any other user of the block device.
 531         */
 532        id->nmic = (1 << 0);
 533        id->anagrpid = cpu_to_le32(req->ns->anagrpid);
 534
 535        memcpy(&id->nguid, &req->ns->nguid, sizeof(id->nguid));
 536
 537        id->lbaf[0].ds = req->ns->blksize_shift;
 538
 539        if (req->sq->ctrl->pi_support && nvmet_ns_has_pi(req->ns)) {
 540                id->dpc = NVME_NS_DPC_PI_FIRST | NVME_NS_DPC_PI_LAST |
 541                          NVME_NS_DPC_PI_TYPE1 | NVME_NS_DPC_PI_TYPE2 |
 542                          NVME_NS_DPC_PI_TYPE3;
 543                id->mc = NVME_MC_EXTENDED_LBA;
 544                id->dps = req->ns->pi_type;
 545                id->flbas = NVME_NS_FLBAS_META_EXT;
 546                id->lbaf[0].ms = cpu_to_le16(req->ns->metadata_size);
 547        }
 548
 549        if (req->ns->readonly)
 550                id->nsattr |= (1 << 0);
 551done:
 552        if (!status)
 553                status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id));
 554
 555        kfree(id);
 556out:
 557        nvmet_req_complete(req, status);
 558}
 559
 560static void nvmet_execute_identify_nslist(struct nvmet_req *req)
 561{
 562        static const int buf_size = NVME_IDENTIFY_DATA_SIZE;
 563        struct nvmet_ctrl *ctrl = req->sq->ctrl;
 564        struct nvmet_ns *ns;
 565        unsigned long idx;
 566        u32 min_nsid = le32_to_cpu(req->cmd->identify.nsid);
 567        __le32 *list;
 568        u16 status = 0;
 569        int i = 0;
 570
 571        list = kzalloc(buf_size, GFP_KERNEL);
 572        if (!list) {
 573                status = NVME_SC_INTERNAL;
 574                goto out;
 575        }
 576
 577        xa_for_each(&ctrl->subsys->namespaces, idx, ns) {
 578                if (ns->nsid <= min_nsid)
 579                        continue;
 580                list[i++] = cpu_to_le32(ns->nsid);
 581                if (i == buf_size / sizeof(__le32))
 582                        break;
 583        }
 584
 585        status = nvmet_copy_to_sgl(req, 0, list, buf_size);
 586
 587        kfree(list);
 588out:
 589        nvmet_req_complete(req, status);
 590}
 591
 592static u16 nvmet_copy_ns_identifier(struct nvmet_req *req, u8 type, u8 len,
 593                                    void *id, off_t *off)
 594{
 595        struct nvme_ns_id_desc desc = {
 596                .nidt = type,
 597                .nidl = len,
 598        };
 599        u16 status;
 600
 601        status = nvmet_copy_to_sgl(req, *off, &desc, sizeof(desc));
 602        if (status)
 603                return status;
 604        *off += sizeof(desc);
 605
 606        status = nvmet_copy_to_sgl(req, *off, id, len);
 607        if (status)
 608                return status;
 609        *off += len;
 610
 611        return 0;
 612}
 613
 614static void nvmet_execute_identify_desclist(struct nvmet_req *req)
 615{
 616        off_t off = 0;
 617        u16 status;
 618
 619        status = nvmet_req_find_ns(req);
 620        if (status)
 621                goto out;
 622
 623        if (memchr_inv(&req->ns->uuid, 0, sizeof(req->ns->uuid))) {
 624                status = nvmet_copy_ns_identifier(req, NVME_NIDT_UUID,
 625                                                  NVME_NIDT_UUID_LEN,
 626                                                  &req->ns->uuid, &off);
 627                if (status)
 628                        goto out;
 629        }
 630        if (memchr_inv(req->ns->nguid, 0, sizeof(req->ns->nguid))) {
 631                status = nvmet_copy_ns_identifier(req, NVME_NIDT_NGUID,
 632                                                  NVME_NIDT_NGUID_LEN,
 633                                                  &req->ns->nguid, &off);
 634                if (status)
 635                        goto out;
 636        }
 637
 638        if (sg_zero_buffer(req->sg, req->sg_cnt, NVME_IDENTIFY_DATA_SIZE - off,
 639                        off) != NVME_IDENTIFY_DATA_SIZE - off)
 640                status = NVME_SC_INTERNAL | NVME_SC_DNR;
 641
 642out:
 643        nvmet_req_complete(req, status);
 644}
 645
 646static void nvmet_execute_identify(struct nvmet_req *req)
 647{
 648        if (!nvmet_check_transfer_len(req, NVME_IDENTIFY_DATA_SIZE))
 649                return;
 650
 651        switch (req->cmd->identify.cns) {
 652        case NVME_ID_CNS_NS:
 653                return nvmet_execute_identify_ns(req);
 654        case NVME_ID_CNS_CTRL:
 655                return nvmet_execute_identify_ctrl(req);
 656        case NVME_ID_CNS_NS_ACTIVE_LIST:
 657                return nvmet_execute_identify_nslist(req);
 658        case NVME_ID_CNS_NS_DESC_LIST:
 659                return nvmet_execute_identify_desclist(req);
 660        }
 661
 662        pr_debug("unhandled identify cns %d on qid %d\n",
 663               req->cmd->identify.cns, req->sq->qid);
 664        req->error_loc = offsetof(struct nvme_identify, cns);
 665        nvmet_req_complete(req, NVME_SC_INVALID_FIELD | NVME_SC_DNR);
 666}
 667
 668/*
 669 * A "minimum viable" abort implementation: the command is mandatory in the
 670 * spec, but we are not required to do any useful work.  We couldn't really
 671 * do a useful abort, so don't bother even with waiting for the command
 672 * to be exectuted and return immediately telling the command to abort
 673 * wasn't found.
 674 */
 675static void nvmet_execute_abort(struct nvmet_req *req)
 676{
 677        if (!nvmet_check_transfer_len(req, 0))
 678                return;
 679        nvmet_set_result(req, 1);
 680        nvmet_req_complete(req, 0);
 681}
 682
 683static u16 nvmet_write_protect_flush_sync(struct nvmet_req *req)
 684{
 685        u16 status;
 686
 687        if (req->ns->file)
 688                status = nvmet_file_flush(req);
 689        else
 690                status = nvmet_bdev_flush(req);
 691
 692        if (status)
 693                pr_err("write protect flush failed nsid: %u\n", req->ns->nsid);
 694        return status;
 695}
 696
 697static u16 nvmet_set_feat_write_protect(struct nvmet_req *req)
 698{
 699        u32 write_protect = le32_to_cpu(req->cmd->common.cdw11);
 700        struct nvmet_subsys *subsys = nvmet_req_subsys(req);
 701        u16 status;
 702
 703        status = nvmet_req_find_ns(req);
 704        if (status)
 705                return status;
 706
 707        mutex_lock(&subsys->lock);
 708        switch (write_protect) {
 709        case NVME_NS_WRITE_PROTECT:
 710                req->ns->readonly = true;
 711                status = nvmet_write_protect_flush_sync(req);
 712                if (status)
 713                        req->ns->readonly = false;
 714                break;
 715        case NVME_NS_NO_WRITE_PROTECT:
 716                req->ns->readonly = false;
 717                status = 0;
 718                break;
 719        default:
 720                break;
 721        }
 722
 723        if (!status)
 724                nvmet_ns_changed(subsys, req->ns->nsid);
 725        mutex_unlock(&subsys->lock);
 726        return status;
 727}
 728
 729u16 nvmet_set_feat_kato(struct nvmet_req *req)
 730{
 731        u32 val32 = le32_to_cpu(req->cmd->common.cdw11);
 732
 733        nvmet_stop_keep_alive_timer(req->sq->ctrl);
 734        req->sq->ctrl->kato = DIV_ROUND_UP(val32, 1000);
 735        nvmet_start_keep_alive_timer(req->sq->ctrl);
 736
 737        nvmet_set_result(req, req->sq->ctrl->kato);
 738
 739        return 0;
 740}
 741
 742u16 nvmet_set_feat_async_event(struct nvmet_req *req, u32 mask)
 743{
 744        u32 val32 = le32_to_cpu(req->cmd->common.cdw11);
 745
 746        if (val32 & ~mask) {
 747                req->error_loc = offsetof(struct nvme_common_command, cdw11);
 748                return NVME_SC_INVALID_FIELD | NVME_SC_DNR;
 749        }
 750
 751        WRITE_ONCE(req->sq->ctrl->aen_enabled, val32);
 752        nvmet_set_result(req, val32);
 753
 754        return 0;
 755}
 756
 757void nvmet_execute_set_features(struct nvmet_req *req)
 758{
 759        struct nvmet_subsys *subsys = nvmet_req_subsys(req);
 760        u32 cdw10 = le32_to_cpu(req->cmd->common.cdw10);
 761        u32 cdw11 = le32_to_cpu(req->cmd->common.cdw11);
 762        u16 status = 0;
 763        u16 nsqr;
 764        u16 ncqr;
 765
 766        if (!nvmet_check_transfer_len(req, 0))
 767                return;
 768
 769        switch (cdw10 & 0xff) {
 770        case NVME_FEAT_NUM_QUEUES:
 771                ncqr = (cdw11 >> 16) & 0xffff;
 772                nsqr = cdw11 & 0xffff;
 773                if (ncqr == 0xffff || nsqr == 0xffff) {
 774                        status = NVME_SC_INVALID_FIELD | NVME_SC_DNR;
 775                        break;
 776                }
 777                nvmet_set_result(req,
 778                        (subsys->max_qid - 1) | ((subsys->max_qid - 1) << 16));
 779                break;
 780        case NVME_FEAT_KATO:
 781                status = nvmet_set_feat_kato(req);
 782                break;
 783        case NVME_FEAT_ASYNC_EVENT:
 784                status = nvmet_set_feat_async_event(req, NVMET_AEN_CFG_ALL);
 785                break;
 786        case NVME_FEAT_HOST_ID:
 787                status = NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR;
 788                break;
 789        case NVME_FEAT_WRITE_PROTECT:
 790                status = nvmet_set_feat_write_protect(req);
 791                break;
 792        default:
 793                req->error_loc = offsetof(struct nvme_common_command, cdw10);
 794                status = NVME_SC_INVALID_FIELD | NVME_SC_DNR;
 795                break;
 796        }
 797
 798        nvmet_req_complete(req, status);
 799}
 800
 801static u16 nvmet_get_feat_write_protect(struct nvmet_req *req)
 802{
 803        struct nvmet_subsys *subsys = nvmet_req_subsys(req);
 804        u32 result;
 805
 806        result = nvmet_req_find_ns(req);
 807        if (result)
 808                return result;
 809
 810        mutex_lock(&subsys->lock);
 811        if (req->ns->readonly == true)
 812                result = NVME_NS_WRITE_PROTECT;
 813        else
 814                result = NVME_NS_NO_WRITE_PROTECT;
 815        nvmet_set_result(req, result);
 816        mutex_unlock(&subsys->lock);
 817
 818        return 0;
 819}
 820
 821void nvmet_get_feat_kato(struct nvmet_req *req)
 822{
 823        nvmet_set_result(req, req->sq->ctrl->kato * 1000);
 824}
 825
 826void nvmet_get_feat_async_event(struct nvmet_req *req)
 827{
 828        nvmet_set_result(req, READ_ONCE(req->sq->ctrl->aen_enabled));
 829}
 830
 831void nvmet_execute_get_features(struct nvmet_req *req)
 832{
 833        struct nvmet_subsys *subsys = nvmet_req_subsys(req);
 834        u32 cdw10 = le32_to_cpu(req->cmd->common.cdw10);
 835        u16 status = 0;
 836
 837        if (!nvmet_check_transfer_len(req, nvmet_feat_data_len(req, cdw10)))
 838                return;
 839
 840        switch (cdw10 & 0xff) {
 841        /*
 842         * These features are mandatory in the spec, but we don't
 843         * have a useful way to implement them.  We'll eventually
 844         * need to come up with some fake values for these.
 845         */
 846#if 0
 847        case NVME_FEAT_ARBITRATION:
 848                break;
 849        case NVME_FEAT_POWER_MGMT:
 850                break;
 851        case NVME_FEAT_TEMP_THRESH:
 852                break;
 853        case NVME_FEAT_ERR_RECOVERY:
 854                break;
 855        case NVME_FEAT_IRQ_COALESCE:
 856                break;
 857        case NVME_FEAT_IRQ_CONFIG:
 858                break;
 859        case NVME_FEAT_WRITE_ATOMIC:
 860                break;
 861#endif
 862        case NVME_FEAT_ASYNC_EVENT:
 863                nvmet_get_feat_async_event(req);
 864                break;
 865        case NVME_FEAT_VOLATILE_WC:
 866                nvmet_set_result(req, 1);
 867                break;
 868        case NVME_FEAT_NUM_QUEUES:
 869                nvmet_set_result(req,
 870                        (subsys->max_qid-1) | ((subsys->max_qid-1) << 16));
 871                break;
 872        case NVME_FEAT_KATO:
 873                nvmet_get_feat_kato(req);
 874                break;
 875        case NVME_FEAT_HOST_ID:
 876                /* need 128-bit host identifier flag */
 877                if (!(req->cmd->common.cdw11 & cpu_to_le32(1 << 0))) {
 878                        req->error_loc =
 879                                offsetof(struct nvme_common_command, cdw11);
 880                        status = NVME_SC_INVALID_FIELD | NVME_SC_DNR;
 881                        break;
 882                }
 883
 884                status = nvmet_copy_to_sgl(req, 0, &req->sq->ctrl->hostid,
 885                                sizeof(req->sq->ctrl->hostid));
 886                break;
 887        case NVME_FEAT_WRITE_PROTECT:
 888                status = nvmet_get_feat_write_protect(req);
 889                break;
 890        default:
 891                req->error_loc =
 892                        offsetof(struct nvme_common_command, cdw10);
 893                status = NVME_SC_INVALID_FIELD | NVME_SC_DNR;
 894                break;
 895        }
 896
 897        nvmet_req_complete(req, status);
 898}
 899
 900void nvmet_execute_async_event(struct nvmet_req *req)
 901{
 902        struct nvmet_ctrl *ctrl = req->sq->ctrl;
 903
 904        if (!nvmet_check_transfer_len(req, 0))
 905                return;
 906
 907        mutex_lock(&ctrl->lock);
 908        if (ctrl->nr_async_event_cmds >= NVMET_ASYNC_EVENTS) {
 909                mutex_unlock(&ctrl->lock);
 910                nvmet_req_complete(req, NVME_SC_ASYNC_LIMIT | NVME_SC_DNR);
 911                return;
 912        }
 913        ctrl->async_event_cmds[ctrl->nr_async_event_cmds++] = req;
 914        mutex_unlock(&ctrl->lock);
 915
 916        schedule_work(&ctrl->async_event_work);
 917}
 918
 919void nvmet_execute_keep_alive(struct nvmet_req *req)
 920{
 921        struct nvmet_ctrl *ctrl = req->sq->ctrl;
 922        u16 status = 0;
 923
 924        if (!nvmet_check_transfer_len(req, 0))
 925                return;
 926
 927        if (!ctrl->kato) {
 928                status = NVME_SC_KA_TIMEOUT_INVALID;
 929                goto out;
 930        }
 931
 932        pr_debug("ctrl %d update keep-alive timer for %d secs\n",
 933                ctrl->cntlid, ctrl->kato);
 934        mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ);
 935out:
 936        nvmet_req_complete(req, status);
 937}
 938
 939u16 nvmet_parse_admin_cmd(struct nvmet_req *req)
 940{
 941        struct nvme_command *cmd = req->cmd;
 942        u16 ret;
 943
 944        if (nvme_is_fabrics(cmd))
 945                return nvmet_parse_fabrics_cmd(req);
 946        if (nvmet_req_subsys(req)->type == NVME_NQN_DISC)
 947                return nvmet_parse_discovery_cmd(req);
 948
 949        ret = nvmet_check_ctrl_status(req);
 950        if (unlikely(ret))
 951                return ret;
 952
 953        if (nvmet_req_passthru_ctrl(req))
 954                return nvmet_parse_passthru_admin_cmd(req);
 955
 956        switch (cmd->common.opcode) {
 957        case nvme_admin_get_log_page:
 958                req->execute = nvmet_execute_get_log_page;
 959                return 0;
 960        case nvme_admin_identify:
 961                req->execute = nvmet_execute_identify;
 962                return 0;
 963        case nvme_admin_abort_cmd:
 964                req->execute = nvmet_execute_abort;
 965                return 0;
 966        case nvme_admin_set_features:
 967                req->execute = nvmet_execute_set_features;
 968                return 0;
 969        case nvme_admin_get_features:
 970                req->execute = nvmet_execute_get_features;
 971                return 0;
 972        case nvme_admin_async_event:
 973                req->execute = nvmet_execute_async_event;
 974                return 0;
 975        case nvme_admin_keep_alive:
 976                req->execute = nvmet_execute_keep_alive;
 977                return 0;
 978        default:
 979                return nvmet_report_invalid_opcode(req);
 980        }
 981}
 982