* [PATCH v3 0/4] block: add IOC_PR_READ_KEYS and IOC_PR_READ_RESERVATION ioctls
@ 2025-12-01 21:43 Stefan Hajnoczi
2025-12-01 21:43 ` [PATCH v3 1/4] scsi: sd: reject invalid pr_read_keys() num_keys values Stefan Hajnoczi
` (5 more replies)
0 siblings, 6 replies; 12+ messages in thread
From: Stefan Hajnoczi @ 2025-12-01 21:43 UTC (permalink / raw)
To: linux-block
Cc: Christoph Hellwig, linux-kernel, linux-scsi, James E.J. Bottomley,
Martin K. Petersen, Keith Busch, Jens Axboe, Sagi Grimberg,
Mike Christie, Krzysztof Kozlowski, linux-nvme, Stefan Hajnoczi
v3:
- Use checked_mul_overflow(), struct_size(), etc to avoid duplicating size calculations [Christoph]
- Don't use __free() from cleanup.h [Christoph, Krzysztof]
- Drop one-time use num_copy_keys local variable [Christoph]
- Rename inout local variable to read_keys [Christoph]
v2:
- Fix num_keys validation in patches 1-3 [Hannes]
- Declare local variables at beginning of scope [Hannes]
This series exposes struct pr_ops pr_read_keys() and pr_read_reservations() to
userspace as ioctls, making it possible to list registered reservation keys and
report the current reservation on a block device.
The new ioctls are needed by applications or cluster managers that rely on
inspecting the PR state. This is something that has been possible with SCSI-
and NVME-specific commands but not with the PR ioctls. I hope to move QEMU from
SG_IO to PR ioctls so that NVMe host block devices can be supported alongside
SCSI devices without protocol-specific commands.
These ioctls will also make troubleshooting possible with the blkpr(8)
util-linux tool, for which I have prepared a separate patch series.
Stefan Hajnoczi (4):
scsi: sd: reject invalid pr_read_keys() num_keys values
nvme: reject invalid pr_read_keys() num_keys values
block: add IOC_PR_READ_KEYS ioctl
block: add IOC_PR_READ_RESERVATION ioctl
include/uapi/linux/pr.h | 14 +++++++
block/ioctl.c | 84 +++++++++++++++++++++++++++++++++++++++++
drivers/nvme/host/pr.c | 6 ++-
drivers/scsi/sd.c | 12 +++++-
4 files changed, 114 insertions(+), 2 deletions(-)
--
2.52.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 1/4] scsi: sd: reject invalid pr_read_keys() num_keys values
2025-12-01 21:43 [PATCH v3 0/4] block: add IOC_PR_READ_KEYS and IOC_PR_READ_RESERVATION ioctls Stefan Hajnoczi
@ 2025-12-01 21:43 ` Stefan Hajnoczi
2025-12-02 5:58 ` Christoph Hellwig
2025-12-02 15:40 ` Hannes Reinecke
2025-12-01 21:43 ` [PATCH v3 2/4] nvme: " Stefan Hajnoczi
` (4 subsequent siblings)
5 siblings, 2 replies; 12+ messages in thread
From: Stefan Hajnoczi @ 2025-12-01 21:43 UTC (permalink / raw)
To: linux-block
Cc: Christoph Hellwig, linux-kernel, linux-scsi, James E.J. Bottomley,
Martin K. Petersen, Keith Busch, Jens Axboe, Sagi Grimberg,
Mike Christie, Krzysztof Kozlowski, linux-nvme, Stefan Hajnoczi
The pr_read_keys() interface has a u32 num_keys parameter. The SCSI
PERSISTENT RESERVE IN command has a maximum READ KEYS service action
size of 65536 bytes. Reject num_keys values that are too large to fit
into the SCSI command.
This will become important when pr_read_keys() is exposed to untrusted
userspace via an <linux/pr.h> ioctl.
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
drivers/scsi/sd.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 0252d3f6bed17..32ae4898cea7c 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -1974,9 +1974,19 @@ static int sd_pr_read_keys(struct block_device *bdev, struct pr_keys *keys_info)
{
int result, i, data_offset, num_copy_keys;
u32 num_keys = keys_info->num_keys;
- int data_len = num_keys * 8 + 8;
+ int data_len;
u8 *data;
+ /*
+ * Each reservation key takes 8 bytes and there is an 8-byte header
+ * before the reservation key list. The total size must fit into the
+ * 16-bit ALLOCATION LENGTH field.
+ */
+ if (check_mul_overflow(num_keys, 8, &data_len) ||
+ check_add_overflow(data_len, 8, &data_len) ||
+ data_len > USHRT_MAX)
+ return -EINVAL;
+
data = kzalloc(data_len, GFP_KERNEL);
if (!data)
return -ENOMEM;
--
2.52.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 2/4] nvme: reject invalid pr_read_keys() num_keys values
2025-12-01 21:43 [PATCH v3 0/4] block: add IOC_PR_READ_KEYS and IOC_PR_READ_RESERVATION ioctls Stefan Hajnoczi
2025-12-01 21:43 ` [PATCH v3 1/4] scsi: sd: reject invalid pr_read_keys() num_keys values Stefan Hajnoczi
@ 2025-12-01 21:43 ` Stefan Hajnoczi
2025-12-02 5:58 ` Christoph Hellwig
2025-12-02 15:41 ` Hannes Reinecke
2025-12-01 21:43 ` [PATCH v3 3/4] block: add IOC_PR_READ_KEYS ioctl Stefan Hajnoczi
` (3 subsequent siblings)
5 siblings, 2 replies; 12+ messages in thread
From: Stefan Hajnoczi @ 2025-12-01 21:43 UTC (permalink / raw)
To: linux-block
Cc: Christoph Hellwig, linux-kernel, linux-scsi, James E.J. Bottomley,
Martin K. Petersen, Keith Busch, Jens Axboe, Sagi Grimberg,
Mike Christie, Krzysztof Kozlowski, linux-nvme, Stefan Hajnoczi
The pr_read_keys() interface has a u32 num_keys parameter. The NVMe
Reservation Report command has a u32 maximum length. Reject num_keys
values that are too large to fit.
This will become important when pr_read_keys() is exposed to untrusted
userspace via an <linux/pr.h> ioctl.
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
drivers/nvme/host/pr.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/nvme/host/pr.c b/drivers/nvme/host/pr.c
index ca6a74607b139..ad2ecc2f49a97 100644
--- a/drivers/nvme/host/pr.c
+++ b/drivers/nvme/host/pr.c
@@ -228,7 +228,8 @@ static int nvme_pr_resv_report(struct block_device *bdev, void *data,
static int nvme_pr_read_keys(struct block_device *bdev,
struct pr_keys *keys_info)
{
- u32 rse_len, num_keys = keys_info->num_keys;
+ size_t rse_len;
+ u32 num_keys = keys_info->num_keys;
struct nvme_reservation_status_ext *rse;
int ret, i;
bool eds;
@@ -238,6 +239,9 @@ static int nvme_pr_read_keys(struct block_device *bdev,
* enough to get enough keys to fill the return keys buffer.
*/
rse_len = struct_size(rse, regctl_eds, num_keys);
+ if (rse_len > U32_MAX)
+ return -EINVAL;
+
rse = kzalloc(rse_len, GFP_KERNEL);
if (!rse)
return -ENOMEM;
--
2.52.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 3/4] block: add IOC_PR_READ_KEYS ioctl
2025-12-01 21:43 [PATCH v3 0/4] block: add IOC_PR_READ_KEYS and IOC_PR_READ_RESERVATION ioctls Stefan Hajnoczi
2025-12-01 21:43 ` [PATCH v3 1/4] scsi: sd: reject invalid pr_read_keys() num_keys values Stefan Hajnoczi
2025-12-01 21:43 ` [PATCH v3 2/4] nvme: " Stefan Hajnoczi
@ 2025-12-01 21:43 ` Stefan Hajnoczi
2025-12-02 5:59 ` Christoph Hellwig
2025-12-01 21:43 ` [PATCH v3 4/4] block: add IOC_PR_READ_RESERVATION ioctl Stefan Hajnoczi
` (2 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Stefan Hajnoczi @ 2025-12-01 21:43 UTC (permalink / raw)
To: linux-block
Cc: Christoph Hellwig, linux-kernel, linux-scsi, James E.J. Bottomley,
Martin K. Petersen, Keith Busch, Jens Axboe, Sagi Grimberg,
Mike Christie, Krzysztof Kozlowski, linux-nvme, Stefan Hajnoczi
Add a Persistent Reservations ioctl to read the list of currently
registered reservation keys. This calls the pr_ops->read_keys() function
that was previously added in commit c787f1baa503 ("block: Add PR
callouts for read keys and reservation") but was only used by the
in-kernel SCSI target so far.
The IOC_PR_READ_KEYS ioctl is necessary so that userspace applications
that rely on Persistent Reservations ioctls have a way of inspecting the
current state. Cluster managers and validation tests need this
functionality.
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
include/uapi/linux/pr.h | 7 ++++++
block/ioctl.c | 56 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+)
diff --git a/include/uapi/linux/pr.h b/include/uapi/linux/pr.h
index d8126415966f3..fcb74eab92c80 100644
--- a/include/uapi/linux/pr.h
+++ b/include/uapi/linux/pr.h
@@ -56,6 +56,12 @@ struct pr_clear {
__u32 __pad;
};
+struct pr_read_keys {
+ __u32 generation;
+ __u32 num_keys;
+ __u64 keys_ptr;
+};
+
#define PR_FL_IGNORE_KEY (1 << 0) /* ignore existing key */
#define IOC_PR_REGISTER _IOW('p', 200, struct pr_registration)
@@ -64,5 +70,6 @@ struct pr_clear {
#define IOC_PR_PREEMPT _IOW('p', 203, struct pr_preempt)
#define IOC_PR_PREEMPT_ABORT _IOW('p', 204, struct pr_preempt)
#define IOC_PR_CLEAR _IOW('p', 205, struct pr_clear)
+#define IOC_PR_READ_KEYS _IOWR('p', 206, struct pr_read_keys)
#endif /* _UAPI_PR_H */
diff --git a/block/ioctl.c b/block/ioctl.c
index d7489a56b33c3..95ce9aa90bba2 100644
--- a/block/ioctl.c
+++ b/block/ioctl.c
@@ -423,6 +423,60 @@ static int blkdev_pr_clear(struct block_device *bdev, blk_mode_t mode,
return ops->pr_clear(bdev, c.key);
}
+static int blkdev_pr_read_keys(struct block_device *bdev, blk_mode_t mode,
+ struct pr_read_keys __user *arg)
+{
+ const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops;
+ struct pr_keys *keys_info;
+ struct pr_read_keys read_keys;
+ u64 __user *keys_ptr;
+ size_t keys_info_len;
+ size_t keys_copy_len;
+ int ret;
+
+ if (!blkdev_pr_allowed(bdev, mode))
+ return -EPERM;
+ if (!ops || !ops->pr_read_keys)
+ return -EOPNOTSUPP;
+
+ if (copy_from_user(&read_keys, arg, sizeof(read_keys)))
+ return -EFAULT;
+
+ keys_info_len = struct_size(keys_info, keys, read_keys.num_keys);
+ if (keys_info_len == SIZE_MAX)
+ return -EINVAL;
+
+ keys_info = kzalloc(keys_info_len, GFP_KERNEL);
+ if (!keys_info)
+ return -ENOMEM;
+
+ keys_info->num_keys = read_keys.num_keys;
+
+ ret = ops->pr_read_keys(bdev, keys_info);
+ if (ret)
+ goto out;
+
+ /* Copy out individual keys */
+ keys_ptr = u64_to_user_ptr(read_keys.keys_ptr);
+ keys_copy_len = min(read_keys.num_keys, keys_info->num_keys) *
+ sizeof(keys_info->keys[0]);
+
+ if (copy_to_user(keys_ptr, keys_info->keys, keys_copy_len)) {
+ ret = -EFAULT;
+ goto out;
+ }
+
+ /* Copy out the arg struct */
+ read_keys.generation = keys_info->generation;
+ read_keys.num_keys = keys_info->num_keys;
+
+ if (copy_to_user(arg, &read_keys, sizeof(read_keys)))
+ ret = -EFAULT;
+out:
+ kfree(keys_info);
+ return ret;
+}
+
static int blkdev_flushbuf(struct block_device *bdev, unsigned cmd,
unsigned long arg)
{
@@ -644,6 +698,8 @@ static int blkdev_common_ioctl(struct block_device *bdev, blk_mode_t mode,
return blkdev_pr_preempt(bdev, mode, argp, true);
case IOC_PR_CLEAR:
return blkdev_pr_clear(bdev, mode, argp);
+ case IOC_PR_READ_KEYS:
+ return blkdev_pr_read_keys(bdev, mode, argp);
default:
return blk_get_meta_cap(bdev, cmd, argp);
}
--
2.52.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 4/4] block: add IOC_PR_READ_RESERVATION ioctl
2025-12-01 21:43 [PATCH v3 0/4] block: add IOC_PR_READ_KEYS and IOC_PR_READ_RESERVATION ioctls Stefan Hajnoczi
` (2 preceding siblings ...)
2025-12-01 21:43 ` [PATCH v3 3/4] block: add IOC_PR_READ_KEYS ioctl Stefan Hajnoczi
@ 2025-12-01 21:43 ` Stefan Hajnoczi
2025-12-03 6:42 ` [PATCH v3 0/4] block: add IOC_PR_READ_KEYS and IOC_PR_READ_RESERVATION ioctls Martin K. Petersen
2025-12-03 14:53 ` Jens Axboe
5 siblings, 0 replies; 12+ messages in thread
From: Stefan Hajnoczi @ 2025-12-01 21:43 UTC (permalink / raw)
To: linux-block
Cc: Christoph Hellwig, linux-kernel, linux-scsi, James E.J. Bottomley,
Martin K. Petersen, Keith Busch, Jens Axboe, Sagi Grimberg,
Mike Christie, Krzysztof Kozlowski, linux-nvme, Stefan Hajnoczi,
Hannes Reinecke
Add a Persistent Reservations ioctl to read the current reservation.
This calls the pr_ops->read_reservation() function that was previously
added in commit c787f1baa503 ("block: Add PR callouts for read keys and
reservation") but was only used by the in-kernel SCSI target so far.
The IOC_PR_READ_RESERVATION ioctl is necessary so that userspace
applications that rely on Persistent Reservations ioctls have a way of
inspecting the current state. Cluster managers and validation tests need
this functionality.
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
---
include/uapi/linux/pr.h | 7 +++++++
block/ioctl.c | 28 ++++++++++++++++++++++++++++
2 files changed, 35 insertions(+)
diff --git a/include/uapi/linux/pr.h b/include/uapi/linux/pr.h
index fcb74eab92c80..847f3051057af 100644
--- a/include/uapi/linux/pr.h
+++ b/include/uapi/linux/pr.h
@@ -62,6 +62,12 @@ struct pr_read_keys {
__u64 keys_ptr;
};
+struct pr_read_reservation {
+ __u64 key;
+ __u32 generation;
+ __u32 type;
+};
+
#define PR_FL_IGNORE_KEY (1 << 0) /* ignore existing key */
#define IOC_PR_REGISTER _IOW('p', 200, struct pr_registration)
@@ -71,5 +77,6 @@ struct pr_read_keys {
#define IOC_PR_PREEMPT_ABORT _IOW('p', 204, struct pr_preempt)
#define IOC_PR_CLEAR _IOW('p', 205, struct pr_clear)
#define IOC_PR_READ_KEYS _IOWR('p', 206, struct pr_read_keys)
+#define IOC_PR_READ_RESERVATION _IOR('p', 207, struct pr_read_reservation)
#endif /* _UAPI_PR_H */
diff --git a/block/ioctl.c b/block/ioctl.c
index 95ce9aa90bba2..4a55d2e7602e5 100644
--- a/block/ioctl.c
+++ b/block/ioctl.c
@@ -477,6 +477,32 @@ static int blkdev_pr_read_keys(struct block_device *bdev, blk_mode_t mode,
return ret;
}
+static int blkdev_pr_read_reservation(struct block_device *bdev,
+ blk_mode_t mode, struct pr_read_reservation __user *arg)
+{
+ const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops;
+ struct pr_held_reservation rsv = {};
+ struct pr_read_reservation out = {};
+ int ret;
+
+ if (!blkdev_pr_allowed(bdev, mode))
+ return -EPERM;
+ if (!ops || !ops->pr_read_reservation)
+ return -EOPNOTSUPP;
+
+ ret = ops->pr_read_reservation(bdev, &rsv);
+ if (ret)
+ return ret;
+
+ out.key = rsv.key;
+ out.generation = rsv.generation;
+ out.type = rsv.type;
+
+ if (copy_to_user(arg, &out, sizeof(out)))
+ return -EFAULT;
+ return 0;
+}
+
static int blkdev_flushbuf(struct block_device *bdev, unsigned cmd,
unsigned long arg)
{
@@ -700,6 +726,8 @@ static int blkdev_common_ioctl(struct block_device *bdev, blk_mode_t mode,
return blkdev_pr_clear(bdev, mode, argp);
case IOC_PR_READ_KEYS:
return blkdev_pr_read_keys(bdev, mode, argp);
+ case IOC_PR_READ_RESERVATION:
+ return blkdev_pr_read_reservation(bdev, mode, argp);
default:
return blk_get_meta_cap(bdev, cmd, argp);
}
--
2.52.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v3 1/4] scsi: sd: reject invalid pr_read_keys() num_keys values
2025-12-01 21:43 ` [PATCH v3 1/4] scsi: sd: reject invalid pr_read_keys() num_keys values Stefan Hajnoczi
@ 2025-12-02 5:58 ` Christoph Hellwig
2025-12-02 15:40 ` Hannes Reinecke
1 sibling, 0 replies; 12+ messages in thread
From: Christoph Hellwig @ 2025-12-02 5:58 UTC (permalink / raw)
To: Stefan Hajnoczi
Cc: linux-block, Christoph Hellwig, linux-kernel, linux-scsi,
James E.J. Bottomley, Martin K. Petersen, Keith Busch, Jens Axboe,
Sagi Grimberg, Mike Christie, Krzysztof Kozlowski, linux-nvme
On Mon, Dec 01, 2025 at 04:43:26PM -0500, Stefan Hajnoczi wrote:
> + /*
> + * Each reservation key takes 8 bytes and there is an 8-byte header
> + * before the reservation key list. The total size must fit into the
> + * 16-bit ALLOCATION LENGTH field.
> + */
> + if (check_mul_overflow(num_keys, 8, &data_len) ||
> + check_add_overflow(data_len, 8, &data_len) ||
Using data_len for the throw away key size is a little confusing,
but then again I guess compared to all the surrounding code that's
harmless :)
So:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 2/4] nvme: reject invalid pr_read_keys() num_keys values
2025-12-01 21:43 ` [PATCH v3 2/4] nvme: " Stefan Hajnoczi
@ 2025-12-02 5:58 ` Christoph Hellwig
2025-12-02 15:41 ` Hannes Reinecke
1 sibling, 0 replies; 12+ messages in thread
From: Christoph Hellwig @ 2025-12-02 5:58 UTC (permalink / raw)
To: Stefan Hajnoczi
Cc: linux-block, Christoph Hellwig, linux-kernel, linux-scsi,
James E.J. Bottomley, Martin K. Petersen, Keith Busch, Jens Axboe,
Sagi Grimberg, Mike Christie, Krzysztof Kozlowski, linux-nvme
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 3/4] block: add IOC_PR_READ_KEYS ioctl
2025-12-01 21:43 ` [PATCH v3 3/4] block: add IOC_PR_READ_KEYS ioctl Stefan Hajnoczi
@ 2025-12-02 5:59 ` Christoph Hellwig
0 siblings, 0 replies; 12+ messages in thread
From: Christoph Hellwig @ 2025-12-02 5:59 UTC (permalink / raw)
To: Stefan Hajnoczi
Cc: linux-block, Christoph Hellwig, linux-kernel, linux-scsi,
James E.J. Bottomley, Martin K. Petersen, Keith Busch, Jens Axboe,
Sagi Grimberg, Mike Christie, Krzysztof Kozlowski, linux-nvme
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 1/4] scsi: sd: reject invalid pr_read_keys() num_keys values
2025-12-01 21:43 ` [PATCH v3 1/4] scsi: sd: reject invalid pr_read_keys() num_keys values Stefan Hajnoczi
2025-12-02 5:58 ` Christoph Hellwig
@ 2025-12-02 15:40 ` Hannes Reinecke
1 sibling, 0 replies; 12+ messages in thread
From: Hannes Reinecke @ 2025-12-02 15:40 UTC (permalink / raw)
To: Stefan Hajnoczi, linux-block
Cc: Christoph Hellwig, linux-kernel, linux-scsi, James E.J. Bottomley,
Martin K. Petersen, Keith Busch, Jens Axboe, Sagi Grimberg,
Mike Christie, Krzysztof Kozlowski, linux-nvme
On 12/1/25 22:43, Stefan Hajnoczi wrote:
> The pr_read_keys() interface has a u32 num_keys parameter. The SCSI
> PERSISTENT RESERVE IN command has a maximum READ KEYS service action
> size of 65536 bytes. Reject num_keys values that are too large to fit
> into the SCSI command.
>
> This will become important when pr_read_keys() is exposed to untrusted
> userspace via an <linux/pr.h> ioctl.
>
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
> drivers/scsi/sd.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke Kernel Storage Architect
hare@suse.de +49 911 74053 688
SUSE Software Solutions GmbH, Frankenstr. 146, 90461 Nürnberg
HRB 36809 (AG Nürnberg), GF: I. Totev, A. McDonald, W. Knoblich
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 2/4] nvme: reject invalid pr_read_keys() num_keys values
2025-12-01 21:43 ` [PATCH v3 2/4] nvme: " Stefan Hajnoczi
2025-12-02 5:58 ` Christoph Hellwig
@ 2025-12-02 15:41 ` Hannes Reinecke
1 sibling, 0 replies; 12+ messages in thread
From: Hannes Reinecke @ 2025-12-02 15:41 UTC (permalink / raw)
To: Stefan Hajnoczi, linux-block
Cc: Christoph Hellwig, linux-kernel, linux-scsi, James E.J. Bottomley,
Martin K. Petersen, Keith Busch, Jens Axboe, Sagi Grimberg,
Mike Christie, Krzysztof Kozlowski, linux-nvme
On 12/1/25 22:43, Stefan Hajnoczi wrote:
> The pr_read_keys() interface has a u32 num_keys parameter. The NVMe
> Reservation Report command has a u32 maximum length. Reject num_keys
> values that are too large to fit.
>
> This will become important when pr_read_keys() is exposed to untrusted
> userspace via an <linux/pr.h> ioctl.
>
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
> drivers/nvme/host/pr.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke Kernel Storage Architect
hare@suse.de +49 911 74053 688
SUSE Software Solutions GmbH, Frankenstr. 146, 90461 Nürnberg
HRB 36809 (AG Nürnberg), GF: I. Totev, A. McDonald, W. Knoblich
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 0/4] block: add IOC_PR_READ_KEYS and IOC_PR_READ_RESERVATION ioctls
2025-12-01 21:43 [PATCH v3 0/4] block: add IOC_PR_READ_KEYS and IOC_PR_READ_RESERVATION ioctls Stefan Hajnoczi
` (3 preceding siblings ...)
2025-12-01 21:43 ` [PATCH v3 4/4] block: add IOC_PR_READ_RESERVATION ioctl Stefan Hajnoczi
@ 2025-12-03 6:42 ` Martin K. Petersen
2025-12-03 14:53 ` Jens Axboe
5 siblings, 0 replies; 12+ messages in thread
From: Martin K. Petersen @ 2025-12-03 6:42 UTC (permalink / raw)
To: Stefan Hajnoczi
Cc: linux-block, Christoph Hellwig, linux-kernel, linux-scsi,
James E.J. Bottomley, Martin K. Petersen, Keith Busch, Jens Axboe,
Sagi Grimberg, Mike Christie, Krzysztof Kozlowski, linux-nvme
Stefan,
> This series exposes struct pr_ops pr_read_keys() and
> pr_read_reservations() to userspace as ioctls, making it possible to
> list registered reservation keys and report the current reservation on
> a block device.
Looks OK to me.
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
--
Martin K. Petersen
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 0/4] block: add IOC_PR_READ_KEYS and IOC_PR_READ_RESERVATION ioctls
2025-12-01 21:43 [PATCH v3 0/4] block: add IOC_PR_READ_KEYS and IOC_PR_READ_RESERVATION ioctls Stefan Hajnoczi
` (4 preceding siblings ...)
2025-12-03 6:42 ` [PATCH v3 0/4] block: add IOC_PR_READ_KEYS and IOC_PR_READ_RESERVATION ioctls Martin K. Petersen
@ 2025-12-03 14:53 ` Jens Axboe
5 siblings, 0 replies; 12+ messages in thread
From: Jens Axboe @ 2025-12-03 14:53 UTC (permalink / raw)
To: linux-block, Stefan Hajnoczi
Cc: Christoph Hellwig, linux-kernel, linux-scsi, James E.J. Bottomley,
Martin K. Petersen, Keith Busch, Sagi Grimberg, Mike Christie,
Krzysztof Kozlowski, linux-nvme
On Mon, 01 Dec 2025 16:43:25 -0500, Stefan Hajnoczi wrote:
> v3:
> - Use checked_mul_overflow(), struct_size(), etc to avoid duplicating size calculations [Christoph]
> - Don't use __free() from cleanup.h [Christoph, Krzysztof]
> - Drop one-time use num_copy_keys local variable [Christoph]
> - Rename inout local variable to read_keys [Christoph]
>
> v2:
> - Fix num_keys validation in patches 1-3 [Hannes]
> - Declare local variables at beginning of scope [Hannes]
>
> [...]
Applied, thanks!
[1/4] scsi: sd: reject invalid pr_read_keys() num_keys values
commit: d832d9366b072e76b94344c0532b7067536b3ef9
[2/4] nvme: reject invalid pr_read_keys() num_keys values
commit: d7d07c1995913f23fe6140fd8d7323c8b923680a
[3/4] block: add IOC_PR_READ_KEYS ioctl
commit: 51f31451b34d1c5d8f16d1dc6ef481d0b49441ee
[4/4] block: add IOC_PR_READ_RESERVATION ioctl
commit: e78d75d1fa447ce2b66799f1ccdcee61a4951a79
Best regards,
--
Jens Axboe
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2025-12-03 14:53 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-01 21:43 [PATCH v3 0/4] block: add IOC_PR_READ_KEYS and IOC_PR_READ_RESERVATION ioctls Stefan Hajnoczi
2025-12-01 21:43 ` [PATCH v3 1/4] scsi: sd: reject invalid pr_read_keys() num_keys values Stefan Hajnoczi
2025-12-02 5:58 ` Christoph Hellwig
2025-12-02 15:40 ` Hannes Reinecke
2025-12-01 21:43 ` [PATCH v3 2/4] nvme: " Stefan Hajnoczi
2025-12-02 5:58 ` Christoph Hellwig
2025-12-02 15:41 ` Hannes Reinecke
2025-12-01 21:43 ` [PATCH v3 3/4] block: add IOC_PR_READ_KEYS ioctl Stefan Hajnoczi
2025-12-02 5:59 ` Christoph Hellwig
2025-12-01 21:43 ` [PATCH v3 4/4] block: add IOC_PR_READ_RESERVATION ioctl Stefan Hajnoczi
2025-12-03 6:42 ` [PATCH v3 0/4] block: add IOC_PR_READ_KEYS and IOC_PR_READ_RESERVATION ioctls Martin K. Petersen
2025-12-03 14:53 ` Jens Axboe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox