]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
ioctl: Move nvme_get_log_page() to ioctl.h
authorDaniel Wagner <dwagner@suse.de>
Mon, 7 Nov 2022 09:19:38 +0000 (10:19 +0100)
committerDaniel Wagner <dwagner@suse.de>
Mon, 7 Nov 2022 09:19:38 +0000 (10:19 +0100)
Currently we use directly nvme_get_log() calls for many of the defined
helpers (e.g. nvme_get_log_persistent_event()). Though when the size
of the data is really large, nvme_get_log() is not able to transfer
the data (size exceeds what the kernel driver fit in a request).

In order to be able to use nvme_get_log_page() we have to move to
ioctl.h to avoid circular include dependency.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
src/nvme/ioctl.c
src/nvme/ioctl.h
src/nvme/linux.c
src/nvme/linux.h

index 33339939b142b26a3a17e379bbd55f5c8b7e5309..e4f4c3fd5ed114da666e9afb79ea82f34b1a82b0 100644 (file)
@@ -430,6 +430,45 @@ int nvme_get_log(struct nvme_get_log_args *args)
        return nvme_submit_admin_passthru(args->fd, &cmd, args->result);
 }
 
+int nvme_get_log_page(int fd, __u32 xfer_len, struct nvme_get_log_args *args)
+{
+       __u64 offset = 0, xfer, data_len = args->len;
+       bool retain = true;
+       void *ptr = args->log;
+       int ret;
+
+       /*
+        * 4k is the smallest possible transfer unit, so restricting to 4k
+        * avoids having to check the MDTS value of the controller.
+        */
+       do {
+               xfer = data_len - offset;
+               if (xfer > xfer_len)
+                       xfer  = xfer_len;
+
+               /*
+                * Always retain regardless of the RAE parameter until the very
+                * 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 = offset;
+               args->len = xfer;
+               args->log = ptr;
+               args->rae = retain;
+               ret = nvme_get_log(args);
+               if (ret)
+                       return ret;
+
+               offset += xfer;
+               ptr += xfer;
+       } while (offset < data_len);
+
+       return 0;
+}
+
 int nvme_set_features(struct nvme_set_features_args *args)
 {
        __u32 cdw10 = NVME_SET(args->fid, FEATURES_CDW10_FID) |
index af95851f6c112fffb846317dc0e1b2cbcd11abb2..41cd9a05b5c272f44e2da501d7db278bb79e1773 100644 (file)
@@ -1226,6 +1226,17 @@ static inline int nvme_zns_identify_ctrl(int fd, struct nvme_zns_id_ctrl *id)
  */
 int nvme_get_log(struct nvme_get_log_args *args);
 
+/**
+ * nvme_get_log_page() - Get log page data
+ * @fd:                File descriptor of nvme device
+ * @xfer_len:  Max log transfer size per request to split the total.
+ * @args:      &struct nvme_get_log_args argument structure
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
+ */
+int nvme_get_log_page(int fd, __u32 xfer_len, struct nvme_get_log_args *args);
+
 static inline int nvme_get_nsid_log(int fd, bool rae,
                        enum nvme_cmd_get_log_lid lid,
                        __u32 nsid, __u32 len, void *log)
index c9b6bbf859c0091481357b996c99379389037f78..cae4036f71c690dc4c7a7105445edbe37a2c8281 100644 (file)
@@ -117,45 +117,6 @@ int nvme_fw_download_seq(int fd, __u32 size, __u32 xfer, __u32 offset,
        return err;
 }
 
-int nvme_get_log_page(int fd, __u32 xfer_len, struct nvme_get_log_args *args)
-{
-       __u64 offset = 0, xfer, data_len = args->len;
-       bool retain = true;
-       void *ptr = args->log;
-       int ret;
-
-       /*
-        * 4k is the smallest possible transfer unit, so restricting to 4k
-        * avoids having to check the MDTS value of the controller.
-        */
-       do {
-               xfer = data_len - offset;
-               if (xfer > xfer_len)
-                       xfer  = xfer_len;
-
-               /*
-                * Always retain regardless of the RAE parameter until the very
-                * 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 = offset;
-               args->len = xfer;
-               args->log = ptr;
-               args->rae = retain;
-               ret = nvme_get_log(args);
-               if (ret)
-                       return ret;
-
-               offset += xfer;
-               ptr += xfer;
-       } while (offset < data_len);
-
-       return 0;
-}
-
 static int nvme_get_telemetry_log(int fd, bool create, bool ctrl, bool rae,
                                  struct nvme_telemetry_log **buf, enum nvme_telemetry_da da,
                                  size_t *size)
index 8a6d426af3ea9069ed06c56deb0c523a8b25cfb0..aa4c91ae115b810728df8c44c47eb7f6df40d950 100644 (file)
@@ -97,17 +97,6 @@ int nvme_get_host_telemetry(int fd,  struct nvme_telemetry_log **log,
 int nvme_get_new_host_telemetry(int fd,  struct nvme_telemetry_log **log,
                enum nvme_telemetry_da da, size_t *size);
 
-/**
- * nvme_get_log_page() - Get log page data
- * @fd:                File descriptor of nvme device
- * @xfer_len:  Max log transfer size per request to split the total.
- * @args:      &struct nvme_get_log_args argument structure
- *
- * Return: The nvme command status if a response was received (see
- * &enum nvme_status_field) or -1 with errno set otherwise.
- */
-int nvme_get_log_page(int fd, __u32 xfer_len, struct nvme_get_log_args *args);
-
 /**
  * nvme_get_ana_log_len() - Retrieve size of the current ANA log
  * @fd:                File descriptor of nvme device