From: Caleb Sander Date: Fri, 12 May 2023 15:43:22 +0000 (-0600) Subject: ioctl: fix RAE bit on last Get Log Page command X-Git-Tag: v1.5~28 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=777b52152f8137048b72edc12ad2ae998df4c30a;p=users%2Fsagi%2Flibnvme.git ioctl: fix RAE bit on last Get Log Page command If nvme_get_log_page() requires multiple Get Log Page commands because the total log length exceeds the transfer length, args->rae is overwritten, causing the RAE bit to be set in all commands. Retrieve the value of args->rae before overwriting it so the RAE bit is set as requested in the last command. Fixes: c23dbd4 ("linux: Change nvme_get_log_page to use nvme_get_log_args parm") Signed-off-by: Caleb Sander --- diff --git a/src/nvme/ioctl.c b/src/nvme/ioctl.c index 6f9d724f..b9710b3d 100644 --- a/src/nvme/ioctl.c +++ b/src/nvme/ioctl.c @@ -434,7 +434,7 @@ int nvme_get_log_page(int fd, __u32 xfer_len, struct nvme_get_log_args *args) { __u64 offset = 0, xfer, data_len = args->len; __u64 start = args->lpo; - bool retain = true; + bool retain = args->rae; void *ptr = args->log; int ret; @@ -454,13 +454,10 @@ int nvme_get_log_page(int fd, __u32 xfer_len, struct nvme_get_log_args *args) * last portion of this log page so the data remains latched * during the fetch sequence. */ - if (offset + xfer == data_len) - retain = args->rae; - args->lpo = start + offset; args->len = xfer; args->log = ptr; - args->rae = retain; + args->rae = offset + xfer < data_len || retain; ret = nvme_get_log(args); if (ret) return ret;