nvmet_check_data_len() wrong behavior for nvme admin set features cmd
Engel, Amit
Amit.Engel at Dell.com
Wed Jan 4 02:19:51 PST 2023
By the way, why not always call nvmet_check_data_len_lte() ?
Don’t we agree that the host is allowed to send sgl describing a buffer that is larger than the payload for any nvme io/admin cmd ?
(and not only for dsm / set_features cmd)
Thanks,
Amit
-----Original Message-----
From: Engel, Amit
Sent: Tuesday, 3 January 2023 15:20
To: Sagi Grimberg <sagi at grimberg.me>
Cc: linux-nvme at lists.infradead.org; Grupi, Elad <Elad.Grupi at dell.com>; Zinger, Eldad <Eldad.Zinger at dell.com>
Subject: RE: nvmet_check_data_len() wrong behavior for nvme admin set features cmd
Ok I see, yes, this is exactly what we need.
I will add it also to set features
Thanks
Amit
-----Original Message-----
From: Sagi Grimberg <sagi at grimberg.me>
Sent: Tuesday, 3 January 2023 15:06
To: Engel, Amit <Amit.Engel at Dell.com>
Cc: linux-nvme at lists.infradead.org; Grupi, Elad <Elad.Grupi at dell.com>; Zinger, Eldad <Eldad.Zinger at dell.com>
Subject: Re: nvmet_check_data_len() wrong behavior for nvme admin set features cmd
[EXTERNAL EMAIL]
> Hi Sagi et al.
>
> We see a wrong behaviour in nvmet/core.c nvmet_check_data_len() function for nvme admin set_features command:
> Current nvmet_check_data_len() code is checking if data_len != req->transfer_len.
>
> There are some feature ids which the transfer_len that is being sent by the host is larger than the payload itself.
> For example:
> fid 0xE, the data_len that is sent by the host is 8.
> fid 0xC, the data_len that is sent by the host is 256.
>
> In this case, the error that is returned to the host is ‘NVME_SC_SGL_INVALID_DATA | NVME_SC_DNR’, which is not accurate.
> From our understanding, the host is allowed to send sgl describing a beffer that is larger than the payload.
>
> We thought to change the condition in nvmet_check_data_len() to check if ‘data_len > req->transfer_len’.
> Only in this case, the expected status code is Indeed
> NVME_SC_SGL_INVALID_DATA | NVME_SC_DNR
We already have a handle for that in nvmet_check_data_len_lte() that is used by dsm handlers, it should be added to the specific places where it is appropriate.
More information about the Linux-nvme
mailing list