NVME identify command data structure length

Matthew Wilcox willy at linux.intel.com
Tue Aug 27 10:17:57 EDT 2013


On Tue, Aug 27, 2013 at 03:50:34PM +0530, anup shendkar wrote:
> 3. As nvme specification for IDENTIFY command says that 4096 is the
> output buffer length, we can add following code as a potential fix.

No.  The driver does not interpret the opcodes.  If you've mis-used the
ioctl, then you get to keep both pieces.

However, what we should do is check the bottom two bits of the opcode
(ie Data Transfer in Figure 38 of NVMe 1.1).  It is clearly a broken
command if the bottom two bits are zero and data_len is non-zero, or
for the bottom two bits to be non-zero and data_len to be zero.

Do you want to send a patch along those lines?

> diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c
> index ce79a59..b1c5e72 100644
> --- a/drivers/block/nvme-core.c
> +++ b/drivers/block/nvme-core.c
> @@ -1416,6 +1416,11 @@ static int nvme_user_admin_cmd(struct nvme_dev *dev,
>         c.common.cdw10[4] = cpu_to_le32(cmd.cdw14);
>         c.common.cdw10[5] = cpu_to_le32(cmd.cdw15);
> 
> +       if (cmd.opcode == nvme_admin_identify) {
> +               /* NVME Identiy command always uses 4096 data buffer */
> +               cmd.data_len = 4096;
> +       }
> +
>         length = cmd.data_len;
>         if (cmd.data_len) {
>                 iod = nvme_map_user_pages(dev, cmd.opcode & 1, cmd.addr,



More information about the Linux-nvme mailing list