]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
ioctl: pass NSID in Get/Set Features commands that use it
authorCaleb Sander <csander@purestorage.com>
Fri, 15 Sep 2023 19:20:19 +0000 (13:20 -0600)
committerDaniel Wagner <wagi@monom.org>
Wed, 20 Sep 2023 08:33:57 +0000 (10:33 +0200)
Several features are configured on a per-namespace basis
by setting the NSID in the Set Features and Get Features commands.
But the corresponding nvme_{g,s}et_features_*() functions
aren't passing the NSID in the commands.
For the functions missing a NSID parameter, define new variants
with the NSID argument added and mark the old functions as deprecated.

Signed-off-by: Caleb Sander <csander@purestorage.com>
src/libnvme.map
src/nvme/ioctl.c
src/nvme/ioctl.h

index 5215c284ba05cd5c4512488aa3c5174682ef0cf1..ea18c36efb44bbce9f180efddb375881b78167a5 100644 (file)
@@ -5,12 +5,19 @@ LIBNVME_1_6 {
                nvme_ctrl_find;
                nvme_ctrl_get_src_addr;
                nvme_ctrl_release_fd;
+               nvme_get_features_err_recovery2;
                nvme_get_features_host_mem_buf2;
                nvme_get_features_iocs_profile;
+               nvme_get_features_lba_range2;
+               nvme_get_features_resv_mask2;
+               nvme_get_features_resv_persist2;
                nvme_host_release_fds;
                nvme_ns_release_fd;
                nvme_root_release_fds;
                nvme_set_features_iocs_profile;
+               nvme_set_features_resv_mask2;
+               nvme_set_features_resv_persist2;
+               nvme_set_features_write_protect2;
                nvme_subsystem_get_iopolicy;
                nvme_subsystem_release_fds;
                nvme_set_debug;
index c01364901bc9b45bff1d301b8f224855420b8dd1..e75fd318d5dae5d1ecb0fa483d02bdb2bd7719f8 100644 (file)
@@ -615,8 +615,8 @@ int nvme_set_features_err_recovery(int fd, __u32 nsid, __u16 tler, bool dulbe,
        __u32 value = NVME_SET(tler, FEAT_ERROR_RECOVERY_TLER) |
                        NVME_SET(!!dulbe, FEAT_ERROR_RECOVERY_DULBE);
 
-       return __nvme_set_features(fd, NVME_FEAT_FID_ERR_RECOVERY, value, save,
-                                  result);
+       return nvme_set_features_simple(
+               fd, NVME_FEAT_FID_ERR_RECOVERY, nsid, value, save, result);
 }
 
 int nvme_set_features_volatile_wc(int fd, bool wce, bool save, __u32 *result)
@@ -874,12 +874,26 @@ int nvme_set_features_resv_mask(int fd, __u32 mask, bool save, __u32 *result)
                                   result);
 }
 
+int nvme_set_features_resv_mask2(int fd, __u32 nsid, __u32 mask, bool save,
+                                __u32 *result)
+{
+       return nvme_set_features_simple(
+               fd, NVME_FEAT_FID_RESV_MASK, nsid, mask, save, result);
+}
+
 int nvme_set_features_resv_persist(int fd, bool ptpl, bool save, __u32 *result)
 {
        return __nvme_set_features(fd, NVME_FEAT_FID_RESV_PERSIST, !!ptpl, save,
                                   result);
 }
 
+int nvme_set_features_resv_persist2(int fd, __u32 nsid, bool ptpl, bool save,
+                                   __u32 *result)
+{
+       return nvme_set_features_simple(
+               fd, NVME_FEAT_FID_RESV_PERSIST, nsid, !!ptpl, save, result);
+}
+
 int nvme_set_features_write_protect(int fd, enum nvme_feat_nswpcfg_state state,
                                    bool save, __u32 *result)
 {
@@ -887,6 +901,14 @@ int nvme_set_features_write_protect(int fd, enum nvme_feat_nswpcfg_state state,
                                   false, result);
 }
 
+int nvme_set_features_write_protect2(int fd, __u32 nsid,
+                                    enum nvme_feat_nswpcfg_state state,
+                                    bool save, __u32 *result)
+{
+       return nvme_set_features_simple(
+               fd, NVME_FEAT_FID_WRITE_PROTECT, nsid, state, false, result);
+}
+
 int nvme_set_features_iocs_profile(int fd, __u16 iocsi, bool save)
 {
        __u32 value = NVME_SET(iocsi, FEAT_IOCSP_IOCSCI);
@@ -972,6 +994,26 @@ int nvme_get_features_lba_range(int fd, enum nvme_get_features_sel sel,
        return nvme_get_features(&args);
 }
 
+int nvme_get_features_lba_range2(int fd, enum nvme_get_features_sel sel,
+                                __u32 nsid, struct nvme_lba_range_type *data,
+                                __u32 *result)
+{
+       struct nvme_get_features_args args = {
+               .args_size = sizeof(args),
+               .fd = fd,
+               .fid = NVME_FEAT_FID_LBA_RANGE,
+               .nsid = nsid,
+               .sel = sel,
+               .uuidx = NVME_UUID_NONE,
+               .data = data,
+               .data_len = sizeof(*data),
+               .timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+               .result = result,
+       };
+
+       return nvme_get_features(&args);
+}
+
 int nvme_get_features_temp_thresh(int fd, enum nvme_get_features_sel sel,
                                  __u32 *result)
 {
@@ -985,6 +1027,24 @@ int nvme_get_features_err_recovery(int fd, enum nvme_get_features_sel sel,
                                   result);
 }
 
+int nvme_get_features_err_recovery2(int fd, enum nvme_get_features_sel sel,
+                                   __u32 nsid, __u32 *result)
+{
+
+       struct nvme_get_features_args args = {
+               .args_size = sizeof(args),
+               .fd = fd,
+               .fid = NVME_FEAT_FID_ERR_RECOVERY,
+               .nsid = nsid,
+               .sel = sel,
+               .uuidx = NVME_UUID_NONE,
+               .timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+               .result = result,
+       };
+
+       return nvme_get_features(&args);
+}
+
 int nvme_get_features_volatile_wc(int fd, enum nvme_get_features_sel sel,
                                  __u32 *result)
 {
@@ -1250,12 +1310,46 @@ int nvme_get_features_resv_mask(int fd, enum nvme_get_features_sel sel,
        return __nvme_get_features(fd, NVME_FEAT_FID_RESV_MASK, sel, result);
 }
 
+int nvme_get_features_resv_mask2(int fd, enum nvme_get_features_sel sel,
+                                __u32 nsid, __u32 *result)
+{
+       struct nvme_get_features_args args = {
+               .args_size = sizeof(args),
+               .fd = fd,
+               .fid = NVME_FEAT_FID_RESV_MASK,
+               .nsid = nsid,
+               .sel = sel,
+               .uuidx = NVME_UUID_NONE,
+               .timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+               .result = result,
+       };
+
+       return nvme_get_features(&args);
+}
+
 int nvme_get_features_resv_persist(int fd, enum nvme_get_features_sel sel,
                                   __u32 *result)
 {
        return __nvme_get_features(fd, NVME_FEAT_FID_RESV_PERSIST, sel, result);
 }
 
+int nvme_get_features_resv_persist2(int fd, enum nvme_get_features_sel sel,
+                                   __u32 nsid, __u32 *result)
+{
+       struct nvme_get_features_args args = {
+               .args_size = sizeof(args),
+               .fd = fd,
+               .fid = NVME_FEAT_FID_RESV_PERSIST,
+               .nsid = nsid,
+               .sel = sel,
+               .uuidx = NVME_UUID_NONE,
+               .timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+               .result = result,
+       };
+
+       return nvme_get_features(&args);
+}
+
 int nvme_get_features_write_protect(int fd, __u32 nsid,
                                    enum nvme_get_features_sel sel,
                                    __u32 *result)
index ff58ad35b19f6b601ca4b644bf2f34c3345b3044..2570668e92ccf5dc3c2d7a63ff5ff2e8e5b50169 100644 (file)
@@ -2516,7 +2516,25 @@ int nvme_set_features_host_id(int fd, bool exhid, bool save, __u8 *hostid);
 
 /**
  * nvme_set_features_resv_mask() - Set reservation notification mask feature
+ *
+ * Deprecated: doesn't support specifying a NSID.
+ * Use nvme_set_features_resv_mask2() instead.
+ *
+ * @fd:                File descriptor of nvme device
+ * @mask:      Reservation Notification Mask Field
+ * @save:      Save value across power states
+ * @result:    The command completion result from CQE dword0
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
+ */
+int nvme_set_features_resv_mask(int fd, __u32 mask, bool save, __u32 *result)
+       __attribute__((deprecated));
+
+/**
+ * nvme_set_features_resv_mask2() - Set reservation notification mask feature
  * @fd:                File descriptor of nvme device
+ * @nsid:      Namespace ID
  * @mask:      Reservation Notification Mask Field
  * @save:      Save value across power states
  * @result:    The command completion result from CQE dword0
@@ -2524,11 +2542,30 @@ int nvme_set_features_host_id(int fd, bool exhid, bool save, __u8 *hostid);
  * Return: The nvme command status if a response was received (see
  * &enum nvme_status_field) or -1 with errno set otherwise.
  */
-int nvme_set_features_resv_mask(int fd, __u32 mask, bool save, __u32 *result);
+int nvme_set_features_resv_mask2(int fd, __u32 nsid, __u32 mask, bool save,
+                                __u32 *result);
 
 /**
  * nvme_set_features_resv_persist() - Set persist through power loss feature
+ *
+ * Deprecated: doesn't support specifying a NSID.
+ * Use nvme_set_features_resv_persist2() instead.
+ *
+ * @fd:                File descriptor of nvme device
+ * @ptpl:      Persist Through Power Loss
+ * @save:      Save value across power states
+ * @result:    The command completion result from CQE dword0
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
+ */
+int nvme_set_features_resv_persist(int fd, bool ptpl, bool save, __u32 *result)
+        __attribute__((deprecated));
+
+/**
+ * nvme_set_features_resv_persist2() - Set persist through power loss feature
  * @fd:                File descriptor of nvme device
+ * @nsid:      Namespace ID
  * @ptpl:      Persist Through Power Loss
  * @save:      Save value across power states
  * @result:    The command completion result from CQE dword0
@@ -2536,10 +2573,15 @@ int nvme_set_features_resv_mask(int fd, __u32 mask, bool save, __u32 *result);
  * Return: The nvme command status if a response was received (see
  * &enum nvme_status_field) or -1 with errno set otherwise.
  */
-int nvme_set_features_resv_persist(int fd, bool ptpl, bool save, __u32 *result);
+int nvme_set_features_resv_persist2(int fd, __u32 nsid, bool ptpl, bool save,
+                                   __u32 *result);
 
 /**
  * nvme_set_features_write_protect() - Set write protect feature
+ *
+ * Deprecated: doesn't support specifying a NSID.
+ * Use nvme_set_features_write_protect2() instead.
+ *
  * @fd:                File descriptor of nvme device
  * @state:     Write Protection State
  * @save:      Save value across power states
@@ -2549,7 +2591,23 @@ int nvme_set_features_resv_persist(int fd, bool ptpl, bool save, __u32 *result);
  * &enum nvme_status_field) or -1 with errno set otherwise.
  */
 int nvme_set_features_write_protect(int fd, enum nvme_feat_nswpcfg_state state,
-                                   bool save, __u32 *result);
+                                   bool save, __u32 *result)
+       __attribute__((deprecated));
+
+/**
+ * nvme_set_features_write_protect2() - Set write protect feature
+ * @fd:                File descriptor of nvme device
+ * @nsid:      Namespace ID
+ * @state:     Write Protection State
+ * @save:      Save value across power states
+ * @result:    The command completion result from CQE dword0
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
+ */
+int nvme_set_features_write_protect2(int fd, __u32 nsid,
+                                    enum nvme_feat_nswpcfg_state state,
+                                    bool save, __u32 *result);
 
 /**
  * nvme_set_features_iocs_profile() - Set I/O command set profile feature
@@ -2645,6 +2703,10 @@ int nvme_get_features_power_mgmt(int fd, enum nvme_get_features_sel sel,
 
 /**
  * nvme_get_features_lba_range() - Get LBA range feature
+ *
+ * Deprecated: doesn't support specifying a NSID.
+ * Use nvme_get_features_lba_range2() instead.
+ *
  * @fd:                File descriptor of nvme device
  * @sel:       Select which type of attribute to return, see &enum nvme_get_features_sel
  * @data:      User address of feature data, if applicable
@@ -2655,7 +2717,22 @@ int nvme_get_features_power_mgmt(int fd, enum nvme_get_features_sel sel,
  */
 int nvme_get_features_lba_range(int fd, enum nvme_get_features_sel sel,
                                struct nvme_lba_range_type *data,
-                               __u32 *result);
+                               __u32 *result) __attribute__((deprecated));
+
+/**
+ * nvme_get_features_lba_range2() - Get LBA range feature
+ * @fd:                File descriptor of nvme device
+ * @sel:       Select which type of attribute to return, see &enum nvme_get_features_sel
+ * @nsid:      Namespace ID
+ * @data:      Buffer to receive LBA Range Type data structure
+ * @result:    The command completion result from CQE dword0
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
+ */
+int nvme_get_features_lba_range2(int fd, enum nvme_get_features_sel sel,
+                                __u32 nsid, struct nvme_lba_range_type *data,
+                                __u32 *result);
 
 /**
  * nvme_get_features_temp_thresh() - Get temperature threshold feature
@@ -2671,6 +2748,10 @@ int nvme_get_features_temp_thresh(int fd, enum nvme_get_features_sel sel,
 
 /**
  * nvme_get_features_err_recovery() - Get error recovery feature
+ *
+ * Deprecated: doesn't support specifying a NSID.
+ * Use nvme_get_features_err_recovery2() instead.
+ *
  * @fd:                File descriptor of nvme device
  * @sel:       Select which type of attribute to return, see &enum nvme_get_features_sel
  * @result:    The command completion result from CQE dword0
@@ -2679,7 +2760,20 @@ int nvme_get_features_temp_thresh(int fd, enum nvme_get_features_sel sel,
  * &enum nvme_status_field) or -1 with errno set otherwise.
  */
 int nvme_get_features_err_recovery(int fd, enum nvme_get_features_sel sel,
-                                  __u32 *result);
+                                  __u32 *result) __attribute__((deprecated));
+
+/**
+ * nvme_get_features_err_recovery2() - Get error recovery feature
+ * @fd:                File descriptor of nvme device
+ * @sel:       Select which type of attribute to return, see &enum nvme_get_features_sel
+ * @nsid:      Namespace ID
+ * @result:    The command completion result from CQE dword0
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
+ */
+int nvme_get_features_err_recovery2(int fd, enum nvme_get_features_sel sel,
+                                   __u32 nsid, __u32 *result);
 
 /**
  * nvme_get_features_volatile_wc() - Get volatile write cache feature
@@ -2960,6 +3054,10 @@ int nvme_get_features_host_id(int fd, enum nvme_get_features_sel sel,
 
 /**
  * nvme_get_features_resv_mask() - Get reservation mask feature
+ *
+ * Deprecated: doesn't support specifying a NSID.
+ * Use nvme_get_features_resv_mask2() instead.
+ *
  * @fd:                File descriptor of nvme device
  * @sel:       Select which type of attribute to return, see &enum nvme_get_features_sel
  * @result:    The command completion result from CQE dword0
@@ -2968,10 +3066,27 @@ int nvme_get_features_host_id(int fd, enum nvme_get_features_sel sel,
  * &enum nvme_status_field) or -1 with errno set otherwise.
  */
 int nvme_get_features_resv_mask(int fd, enum nvme_get_features_sel sel,
-                               __u32 *result);
+                               __u32 *result) __attribute__((deprecated));
+
+/**
+ * nvme_get_features_resv_mask2() - Get reservation mask feature
+ * @fd:                File descriptor of nvme device
+ * @sel:       Select which type of attribute to return, see &enum nvme_get_features_sel
+ * @nsid:      Namespace ID
+ * @result:    The command completion result from CQE dword0
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
+ */
+int nvme_get_features_resv_mask2(int fd, enum nvme_get_features_sel sel,
+                                __u32 nsid, __u32 *result);
 
 /**
  * nvme_get_features_resv_persist() - Get reservation persist feature
+ *
+ * Deprecated: doesn't support specifying a NSID.
+ * Use nvme_get_features_resv_persist2() instead.
+ *
  * @fd:                File descriptor of nvme device
  * @sel:       Select which type of attribute to return, see &enum nvme_get_features_sel
  * @result:    The command completion result from CQE dword0
@@ -2980,7 +3095,20 @@ int nvme_get_features_resv_mask(int fd, enum nvme_get_features_sel sel,
  * &enum nvme_status_field) or -1 with errno set otherwise.
  */
 int nvme_get_features_resv_persist(int fd, enum nvme_get_features_sel sel,
-                                  __u32 *result);
+                                  __u32 *result) __attribute__((deprecated));
+
+/**
+ * nvme_get_features_resv_persist2() - Get reservation persist feature
+ * @fd:                File descriptor of nvme device
+ * @sel:       Select which type of attribute to return, see &enum nvme_get_features_sel
+ * @nsid:      Namespace ID
+ * @result:    The command completion result from CQE dword0
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
+ */
+int nvme_get_features_resv_persist2(int fd, enum nvme_get_features_sel sel,
+                                   __u32 nsid, __u32 *result);
 
 /**
  * nvme_get_features_write_protect() - Get write protect feature