Re: [PATCH v2] hw/nvme: fix copy cmd for pi enabled namespaces

2022-04-28 Thread Klaus Jensen
On Apr 21 13:51, Dmitry Tikhov wrote:
> Current implementation have problem in the read part of copy command.
> Because there is no metadata mangling before nvme_dif_check invocation,
> reftag error could be thrown for blocks of namespace that have not been
> previously written to.
> 
> Signed-off-by: Dmitry Tikhov 
> ---
> v2:
> * remove refactoring
> * remove write part fix
> ---
>  hw/nvme/ctrl.c | 4 
>  1 file changed, 4 insertions(+)
> 
> diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
> index 74540a03d5..08574c4dcb 100644
> --- a/hw/nvme/ctrl.c
> +++ b/hw/nvme/ctrl.c
> @@ -2787,6 +2787,10 @@ static void nvme_copy_in_completed_cb(void *opaque, 
> int ret)
>  size_t mlen = nvme_m2b(ns, nlb);
>  uint8_t *mbounce = iocb->bounce + nvme_l2b(ns, nlb);
>  
> +status = nvme_dif_mangle_mdata(ns, mbounce, mlen, slba);
> +if (status) {
> +goto invalid;
> +}
>  status = nvme_dif_check(ns, iocb->bounce, len, mbounce, mlen, 
> prinfor,
>  slba, apptag, appmask, &reftag);
>  if (status) {
> -- 
> 2.35.1
> 

Thanks Dmitry,

Applied to nvme-next.


signature.asc
Description: PGP signature


[PATCH v2] hw/nvme: fix copy cmd for pi enabled namespaces

2022-04-21 Thread Dmitry Tikhov
Current implementation have problem in the read part of copy command.
Because there is no metadata mangling before nvme_dif_check invocation,
reftag error could be thrown for blocks of namespace that have not been
previously written to.

Signed-off-by: Dmitry Tikhov 
---
v2:
* remove refactoring
* remove write part fix
---
 hw/nvme/ctrl.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
index 74540a03d5..08574c4dcb 100644
--- a/hw/nvme/ctrl.c
+++ b/hw/nvme/ctrl.c
@@ -2787,6 +2787,10 @@ static void nvme_copy_in_completed_cb(void *opaque, int 
ret)
 size_t mlen = nvme_m2b(ns, nlb);
 uint8_t *mbounce = iocb->bounce + nvme_l2b(ns, nlb);
 
+status = nvme_dif_mangle_mdata(ns, mbounce, mlen, slba);
+if (status) {
+goto invalid;
+}
 status = nvme_dif_check(ns, iocb->bounce, len, mbounce, mlen, prinfor,
 slba, apptag, appmask, &reftag);
 if (status) {
-- 
2.35.1