{
  "slug": "nvme-copy",
  "term": "NVMe Copy",
  "aliases": [
    "NVMe Simple Copy"
  ],
  "definition": "NVMe Copy is an optional command that asks a controller to copy specified source data into a contiguous destination logical-block range.",
  "note": "The host submits range descriptors instead of moving the copied payload through a host buffer. [nvm12-copy] nvme-cli exposes source ranges, destination address and descriptor format. [nvme-cli-copy]\n\nIn NVM Command Set 1.2, block-addressed formats 0h/1h stay within one namespace; 2h/3h can name other source namespaces, subject to advertised support, host enablement and format compatibility. MSRC, MSSRL and MCL bound range count, individual length and total length. [nvm12-copy]\n\nA failed command can leave destination data changed. Its completion identifies the lowest-numbered unsuccessful range, not total copied bytes; later ranges can also have been copied. A zero result does not prove that the destination remained unchanged. [nvm12-copy]\n\nThis is not the filesystem-level FICLONE interface. Fast-copy implementations may nevertheless use copy-on-write, so command completion does not prove physically independent allocation. [ficlone] [nvm12-copy]\n\nWith formats 2h/3h, Fast Copy Only (FCO) can require the fast method for a source range. If it is unavailable, the command fails with Fast Copy Not Possible. For that status, DNR=0 permits retry; DNR=1 advises against retrying that Copy command, while host Read/Write copying remains an alternative. [nvm12-copy]",
  "status": "shipping",
  "advantages": [
    {
      "text": "Avoids a host read-then-write payload round trip.",
      "citationIds": [
        "nvm12-copy"
      ]
    }
  ],
  "limitations": [
    {
      "text": "Copy atomicity still depends on write-unit and boundary rules; support does not promise an unlimited transaction.",
      "citationIds": [
        "nvm12-copy"
      ]
    },
    {
      "text": "Fast-copy support does not guarantee that every operation is faster than host copying.",
      "citationIds": [
        "nvm12-copy"
      ]
    }
  ],
  "related": [
    "namespace-nvme",
    "reflink",
    "copy-file-range",
    "copy-on-write"
  ],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "citations": [
    {
      "id": "nvm12-copy",
      "title": "NVM Command Set 1.2: sections 3.3.2 and 4.1.5.1. Copyright 2008-2025 NVM Express, Inc. All rights reserved.",
      "url": "https://nvmexpress.org/wp-content/uploads/NVM-Express-NVM-Command-Set-Specification-Revision-1.2-2025.08.01-Ratified.pdf",
      "accessed": "2026-11-08"
    },
    {
      "id": "nvme-cli-copy",
      "title": "nvme-cli v2.15: Copy command, source ranges and descriptor format",
      "url": "https://raw.githubusercontent.com/linux-nvme/nvme-cli/v2.15/Documentation/nvme-copy.txt",
      "accessed": "2026-11-08"
    },
    {
      "id": "ficlone",
      "title": "Linux man-pages: FICLONE and filesystem extent-sharing semantics",
      "url": "https://man7.org/linux/man-pages/man2/FICLONE.2const.html",
      "accessed": "2026-11-08"
    },
    {
      "id": "hesela-clones",
      "title": "Hesela: Fast file clones and deferred copying costs",
      "url": "https://hesela.com/analyses/file-clones-deferred-copy-cost/",
      "accessed": "2026-11-08"
    }
  ],
  "updated": "2026-11-08",
  "provenance": [
    "The NVM 1.2 review covers block-addressed formats 0h-3h, not the byte-addressed format 4h. The edition is pinned, not a latest-version claim.",
    "Source review only; no raw-device command, physical-allocation measurement or performance benchmark was run."
  ]
}
