]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
ioctl: fix RAE bit on last Get Log Page command
authorCaleb Sander <csander@purestorage.com>
Fri, 12 May 2023 15:43:22 +0000 (09:43 -0600)
committerDaniel Wagner <wagi@monom.org>
Mon, 15 May 2023 15:06:29 +0000 (17:06 +0200)
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 <csander@purestorage.com>
src/nvme/ioctl.c

index 6f9d724f0ea1f3c629b627c12a550b3b605d50c6..b9710b3d25139335876b27659ece0cfb95d086fc 100644 (file)
@@ -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;