* [PATCH] nvme: check if the namespace supports metadata in nvme_map_user_request()
@ 2024-08-27 12:17 Puranjay Mohan
2024-08-27 12:19 ` Christoph Hellwig
2024-08-27 15:42 ` Keith Busch
0 siblings, 2 replies; 6+ messages in thread
From: Puranjay Mohan @ 2024-08-27 12:17 UTC (permalink / raw)
To: Keith Busch, Jens Axboe, Christoph Hellwig, Sagi Grimberg,
linux-nvme, linux-kernel, puranjay
On an NVMe namespace that does not support metadata, it is possible to
send an IO command with metadata through io-passthru.
nvme_map_user_request() doesn't check if the namespace supports metadata
before sending it forward.
Reject an IO command with metadata when the NVMe namespace doesn't
support it.
Suggested-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Puranjay Mohan <pjy@amazon.com>
---
drivers/nvme/host/ioctl.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/nvme/host/ioctl.c b/drivers/nvme/host/ioctl.c
index f1d58e70933f..4f49523b8a41 100644
--- a/drivers/nvme/host/ioctl.c
+++ b/drivers/nvme/host/ioctl.c
@@ -4,6 +4,7 @@
* Copyright (c) 2017-2021 Christoph Hellwig.
*/
#include <linux/bio-integrity.h>
+#include <linux/blk-integrity.h>
#include <linux/ptrace.h> /* for force_successful_syscall_return */
#include <linux/nvme_ioctl.h>
#include <linux/io_uring/cmd.h>
@@ -122,6 +123,9 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
struct bio *bio = NULL;
int ret;
+ if (meta_buffer && meta_len && bdev && !blk_get_integrity(bdev->bd_disk))
+ return -EINVAL;
+
if (ioucmd && (ioucmd->flags & IORING_URING_CMD_FIXED)) {
struct iov_iter iter;
--
2.40.1
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH] nvme: check if the namespace supports metadata in nvme_map_user_request()
2024-08-27 12:17 [PATCH] nvme: check if the namespace supports metadata in nvme_map_user_request() Puranjay Mohan
@ 2024-08-27 12:19 ` Christoph Hellwig
2024-08-27 12:28 ` Puranjay Mohan
2024-08-27 15:42 ` Keith Busch
1 sibling, 1 reply; 6+ messages in thread
From: Christoph Hellwig @ 2024-08-27 12:19 UTC (permalink / raw)
To: Puranjay Mohan
Cc: Keith Busch, Jens Axboe, Christoph Hellwig, Sagi Grimberg,
linux-nvme, linux-kernel, puranjay
On Tue, Aug 27, 2024 at 12:17:01PM +0000, Puranjay Mohan wrote:
> + if (meta_buffer && meta_len && bdev && !blk_get_integrity(bdev->bd_disk))
> + return -EINVAL;
Overly long line here. If we go past my initial RFC I'd probably
restructure the function a little bit, i.e. add a new
bool has_metadata = bdev && meta_buffer && meta_len;
and then use that both for the support check and the actualy mapping
below.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] nvme: check if the namespace supports metadata in nvme_map_user_request()
2024-08-27 12:19 ` Christoph Hellwig
@ 2024-08-27 12:28 ` Puranjay Mohan
2024-09-06 18:07 ` Keith Busch
0 siblings, 1 reply; 6+ messages in thread
From: Puranjay Mohan @ 2024-08-27 12:28 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Keith Busch, Jens Axboe, Christoph Hellwig, Sagi Grimberg,
linux-nvme, linux-kernel, puranjay
Christoph Hellwig <hch@lst.de> writes:
> On Tue, Aug 27, 2024 at 12:17:01PM +0000, Puranjay Mohan wrote:
>> + if (meta_buffer && meta_len && bdev && !blk_get_integrity(bdev->bd_disk))
>> + return -EINVAL;
>
> Overly long line here. If we go past my initial RFC I'd probably
> restructure the function a little bit, i.e. add a new
>
> bool has_metadata = bdev && meta_buffer && meta_len;
>
> and then use that both for the support check and the actualy mapping
> below.
Sure,
I will send v2 with these changes now.
P.S. - It looks like we will need manual backports for stable kernels as
this won't apply directly. I will send them after this is accepted.
Thanks,
Puranjay
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] nvme: check if the namespace supports metadata in nvme_map_user_request()
2024-08-27 12:28 ` Puranjay Mohan
@ 2024-09-06 18:07 ` Keith Busch
0 siblings, 0 replies; 6+ messages in thread
From: Keith Busch @ 2024-09-06 18:07 UTC (permalink / raw)
To: Puranjay Mohan
Cc: Christoph Hellwig, Jens Axboe, Sagi Grimberg, linux-nvme,
linux-kernel, puranjay
On Tue, Aug 27, 2024 at 12:28:45PM +0000, Puranjay Mohan wrote:
>
> P.S. - It looks like we will need manual backports for stable kernels as
> this won't apply directly. I will send them after this is accepted.
BTW, the reason for your bug observation on older stable but not on
newer ones looks like was originally "fixed" with:
d4aa57a1cac3c99 ("block: don't bother iter advancing a fully done bio")
So while your change is fine, the above commit possibly inadvertently
fixes the inappropriate "advance" because all successful nvme
completions are "fully done".
It still probably doesn't make sense to attempt metadata on request
queues that didn't register with the interface though, so your patch is
also fine.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] nvme: check if the namespace supports metadata in nvme_map_user_request()
2024-08-27 12:17 [PATCH] nvme: check if the namespace supports metadata in nvme_map_user_request() Puranjay Mohan
2024-08-27 12:19 ` Christoph Hellwig
@ 2024-08-27 15:42 ` Keith Busch
2024-08-28 4:29 ` Christoph Hellwig
1 sibling, 1 reply; 6+ messages in thread
From: Keith Busch @ 2024-08-27 15:42 UTC (permalink / raw)
To: Puranjay Mohan
Cc: Jens Axboe, Christoph Hellwig, Sagi Grimberg, linux-nvme,
linux-kernel, puranjay
On Tue, Aug 27, 2024 at 12:17:01PM +0000, Puranjay Mohan wrote:
> @@ -122,6 +123,9 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
> struct bio *bio = NULL;
> int ret;
>
> + if (meta_buffer && meta_len && bdev && !blk_get_integrity(bdev->bd_disk))
> + return -EINVAL;
> +
Should we also fail if there's no bdev? The driver won't use the
requested metadata for admin commands either, so that is also an invalid
user request.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] nvme: check if the namespace supports metadata in nvme_map_user_request()
2024-08-27 15:42 ` Keith Busch
@ 2024-08-28 4:29 ` Christoph Hellwig
0 siblings, 0 replies; 6+ messages in thread
From: Christoph Hellwig @ 2024-08-28 4:29 UTC (permalink / raw)
To: Keith Busch
Cc: Puranjay Mohan, Jens Axboe, Christoph Hellwig, Sagi Grimberg,
linux-nvme, linux-kernel, puranjay
On Tue, Aug 27, 2024 at 09:42:08AM -0600, Keith Busch wrote:
> On Tue, Aug 27, 2024 at 12:17:01PM +0000, Puranjay Mohan wrote:
> > @@ -122,6 +123,9 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
> > struct bio *bio = NULL;
> > int ret;
> >
> > + if (meta_buffer && meta_len && bdev && !blk_get_integrity(bdev->bd_disk))
> > + return -EINVAL;
> > +
>
> Should we also fail if there's no bdev? The driver won't use the
> requested metadata for admin commands either, so that is also an invalid
> user request.
Yes, the last version gets the right.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-09-06 18:11 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-27 12:17 [PATCH] nvme: check if the namespace supports metadata in nvme_map_user_request() Puranjay Mohan
2024-08-27 12:19 ` Christoph Hellwig
2024-08-27 12:28 ` Puranjay Mohan
2024-09-06 18:07 ` Keith Busch
2024-08-27 15:42 ` Keith Busch
2024-08-28 4:29 ` Christoph Hellwig
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox