From: Ming Lei <ming.lei@redhat.com>
To: Caleb Sander Mateos <csander@purestorage.com>
Cc: Jens Axboe <axboe@kernel.dk>, Shuah Khan <shuah@kernel.org>,
linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org,
linux-kernel@vger.kernel.org,
Stanley Zhang <stazhang@purestorage.com>,
Uday Shankar <ushankar@purestorage.com>
Subject: Re: [PATCH 06/20] ublk: support UBLK_PARAM_TYPE_INTEGRITY in device creation
Date: Tue, 23 Dec 2025 09:58:19 +0800 [thread overview]
Message-ID: <aUn3O2RJtXOpNkyQ@fedora> (raw)
In-Reply-To: <CADUfDZoW8NBJzRtnVaVF0aXdhW4qhMRijj9bQJqi88uOuswdiw@mail.gmail.com>
On Mon, Dec 22, 2025 at 10:35:27AM -0500, Caleb Sander Mateos wrote:
> On Mon, Dec 22, 2025 at 9:47 AM Ming Lei <ming.lei@redhat.com> wrote:
> >
> > On Tue, Dec 16, 2025 at 10:34:40PM -0700, Caleb Sander Mateos wrote:
> > > From: Stanley Zhang <stazhang@purestorage.com>
> > >
> > > If the UBLK_PARAM_TYPE_INTEGRITY flag is set, validate the integrity
> > > parameters and apply them to the blk_integrity limits.
> > > UBLK_PARAM_TYPE_INTEGRITY requires CONFIG_BLK_DEV_INTEGRITY=y,
> > > UBLK_F_USER_COPY, and metadata_size > 0. Reuse the block metadata ioctl
> > > LBMD_PI_CAP_* and LBMD_PI_CSUM_* constants from the linux/fs.h UAPI
> > > header for the flags and csum_type field values.
> > > The struct ublk_param_integrity validations are based on the checks in
> > > blk_validate_integrity_limits(). Any invalid parameters should be
> > > rejected before being applied to struct blk_integrity.
> > >
> > > Signed-off-by: Stanley Zhang <stazhang@purestorage.com>
> > > [csander: add param validation]
> > > Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
> > > ---
> > > drivers/block/ublk_drv.c | 92 +++++++++++++++++++++++++++++++++++++++-
> > > 1 file changed, 91 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
> > > index 4da5d8ff1e1d..2893a9172220 100644
> > > --- a/drivers/block/ublk_drv.c
> > > +++ b/drivers/block/ublk_drv.c
> > > @@ -42,10 +42,12 @@
> > > #include <linux/mm.h>
> > > #include <asm/page.h>
> > > #include <linux/task_work.h>
> > > #include <linux/namei.h>
> > > #include <linux/kref.h>
> > > +#include <linux/blk-integrity.h>
> > > +#include <uapi/linux/fs.h>
> > > #include <uapi/linux/ublk_cmd.h>
> > >
> > > #define UBLK_MINORS (1U << MINORBITS)
> > >
> > > #define UBLK_INVALID_BUF_IDX ((u16)-1)
> > > @@ -81,11 +83,12 @@
> > >
> > > /* All UBLK_PARAM_TYPE_* should be included here */
> > > #define UBLK_PARAM_TYPE_ALL \
> > > (UBLK_PARAM_TYPE_BASIC | UBLK_PARAM_TYPE_DISCARD | \
> > > UBLK_PARAM_TYPE_DEVT | UBLK_PARAM_TYPE_ZONED | \
> > > - UBLK_PARAM_TYPE_DMA_ALIGN | UBLK_PARAM_TYPE_SEGMENT)
> > > + UBLK_PARAM_TYPE_DMA_ALIGN | UBLK_PARAM_TYPE_SEGMENT | \
> > > + UBLK_PARAM_TYPE_INTEGRITY)
> > >
> > > struct ublk_uring_cmd_pdu {
> > > /*
> > > * Store requests in same batch temporarily for queuing them to
> > > * daemon context.
> > > @@ -613,10 +616,57 @@ static void ublk_dev_param_basic_apply(struct ublk_device *ub)
> > > set_disk_ro(ub->ub_disk, true);
> > >
> > > set_capacity(ub->ub_disk, p->dev_sectors);
> > > }
> > >
> > > +static int ublk_integrity_flags(u32 flags)
> > > +{
> > > + int ret_flags = 0;
> > > +
> > > + if (flags & LBMD_PI_CAP_INTEGRITY) {
> > > + flags &= ~LBMD_PI_CAP_INTEGRITY;
> > > + ret_flags |= BLK_INTEGRITY_DEVICE_CAPABLE;
> > > + }
> > > + if (flags & LBMD_PI_CAP_REFTAG) {
> > > + flags &= ~LBMD_PI_CAP_REFTAG;
> > > + ret_flags |= BLK_INTEGRITY_REF_TAG;
> > > + }
> > > + return flags ? -EINVAL : ret_flags;
> > > +}
> > > +
> > > +static int ublk_integrity_pi_tuple_size(u8 csum_type)
> > > +{
> > > + switch (csum_type) {
> > > + case LBMD_PI_CSUM_NONE:
> > > + return 0;
> > > + case LBMD_PI_CSUM_IP:
> > > + case LBMD_PI_CSUM_CRC16_T10DIF:
> > > + return 8;
> > > + case LBMD_PI_CSUM_CRC64_NVME:
> > > + return 16;
> > > + default:
> > > + return -EINVAL;
> > > + }
> > > +}
> > > +
> > > +static enum blk_integrity_checksum ublk_integrity_csum_type(u8 csum_type)
> > > +{
> > > + switch (csum_type) {
> > > + case LBMD_PI_CSUM_NONE:
> > > + return BLK_INTEGRITY_CSUM_NONE;
> > > + case LBMD_PI_CSUM_IP:
> > > + return BLK_INTEGRITY_CSUM_IP;
> > > + case LBMD_PI_CSUM_CRC16_T10DIF:
> > > + return BLK_INTEGRITY_CSUM_CRC;
> > > + case LBMD_PI_CSUM_CRC64_NVME:
> > > + return BLK_INTEGRITY_CSUM_CRC64;
> > > + default:
> > > + WARN_ON_ONCE(1);
> > > + return BLK_INTEGRITY_CSUM_NONE;
> > > + }
> > > +}
> > > +
> > > static int ublk_validate_params(const struct ublk_device *ub)
> > > {
> > > /* basic param is the only one which must be set */
> > > if (ub->params.types & UBLK_PARAM_TYPE_BASIC) {
> > > const struct ublk_param_basic *p = &ub->params.basic;
> > > @@ -675,10 +725,35 @@ static int ublk_validate_params(const struct ublk_device *ub)
> > > return -EINVAL;
> > > if (p->max_segment_size < UBLK_MIN_SEGMENT_SIZE)
> > > return -EINVAL;
> > > }
> > >
> > > + if (ub->params.types & UBLK_PARAM_TYPE_INTEGRITY) {
> > > + const struct ublk_param_integrity *p = &ub->params.integrity;
> > > + int pi_tuple_size = ublk_integrity_pi_tuple_size(p->csum_type);
> > > + int flags = ublk_integrity_flags(p->flags);
> > > +
> > > + if (!IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY))
> > > + return -EINVAL;
> > > + if (!ublk_dev_support_user_copy(ub))
> > > + return -EINVAL;
> >
> > UBLK_IO_F_INTEGRITY should be checked here, and ublk_dev_support_user_copy() can be
> > validated with UBLK_IO_F_INTEGRITY together in ublk_ctrl_add_dev(), so
> > mis-matched features can be failed earlier.
>
> I'm not sure what you mean. UBLK_IO_F_INTEGRITY is a per-I/O flag set
I misread it as feature flag of `UBLK_F_INTEGRITY`...
> in struct ublksrv_io_desc's op_flags field. Are you suggesting adding
> a separate feature flag for integrity? I can do that, but I didn't
> originally because none of the other UBLK_PARAM_TYPE_* flags have
> associated features.
oops, you don't define feature flag of UBLK_F_INTEGRITY, then how can
userspace know UBLK INTEGRITY is supported by driver?
With UBLK_F_INTEGRITY you can run early check in ublk_ctrl_add_dev() for:
- dependency on user copy
- if kernel enables CONFIG_BLK_DEV_INTEGRITY
>
> >
> > Same for IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY).
> >
> > > + if (flags < 0)
> > > + return flags;
> > > + if (pi_tuple_size < 0)
> > > + return pi_tuple_size;
> > > + if (!p->metadata_size)
> > > + return -EINVAL;
> >
> > blk_validate_integrity_limits() allows zero p->metadata_size with
> > LBMD_PI_CSUM_NONE, maybe document ublk's support for zero metadata_size & LBMD_PI_CSUM_NONE?
>
> Sure, I can mention that UBLK_PARAM_TYPE_INTEGRITY requires a nonzero
> metadata size. Would you prefer that metadata_size == 0 be supported?
> It would be a bit more code, but certainly possible.
It can be started with less feature/functions, and can be extended in future.
Thanks,
Ming
next prev parent reply other threads:[~2025-12-23 1:58 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-17 5:34 [PATCH 00/20] ublk: add support for integrity data Caleb Sander Mateos
2025-12-17 5:34 ` [PATCH 01/20] block: validate pi_offset integrity limit Caleb Sander Mateos
2025-12-18 8:53 ` Christoph Hellwig
2025-12-17 5:34 ` [PATCH 02/20] block: validate interval_exp " Caleb Sander Mateos
2025-12-18 8:53 ` Christoph Hellwig
2025-12-17 5:34 ` [PATCH 03/20] blk-integrity: take const pointer in blk_integrity_rq() Caleb Sander Mateos
2025-12-19 14:16 ` Ming Lei
2025-12-17 5:34 ` [PATCH 04/20] ublk: add integrity UAPI Caleb Sander Mateos
2025-12-22 14:26 ` Ming Lei
2025-12-22 15:09 ` Caleb Sander Mateos
2025-12-23 1:51 ` Ming Lei
2025-12-17 5:34 ` [PATCH 05/20] ublk: move ublk flag check functions earlier Caleb Sander Mateos
2025-12-22 14:30 ` Ming Lei
2025-12-17 5:34 ` [PATCH 06/20] ublk: support UBLK_PARAM_TYPE_INTEGRITY in device creation Caleb Sander Mateos
2025-12-22 14:47 ` Ming Lei
2025-12-22 15:35 ` Caleb Sander Mateos
2025-12-23 1:58 ` Ming Lei [this message]
2025-12-17 5:34 ` [PATCH 07/20] ublk: set UBLK_IO_F_INTEGRITY in ublksrv_io_desc Caleb Sander Mateos
2025-12-22 14:48 ` Ming Lei
2025-12-17 5:34 ` [PATCH 08/20] ublk: add ublk_copy_user_bvec() helper Caleb Sander Mateos
2025-12-22 14:52 ` Ming Lei
2025-12-22 15:37 ` Caleb Sander Mateos
2025-12-17 5:34 ` [PATCH 09/20] ublk: split out ublk_user_copy() helper Caleb Sander Mateos
2025-12-22 14:58 ` Ming Lei
2025-12-17 5:34 ` [PATCH 10/20] ublk: inline ublk_check_and_get_req() into ublk_user_copy() Caleb Sander Mateos
2025-12-26 2:10 ` Ming Lei
2025-12-17 5:34 ` [PATCH 11/20] ublk: move offset check out of __ublk_check_and_get_req() Caleb Sander Mateos
2025-12-26 2:15 ` Ming Lei
2025-12-17 5:34 ` [PATCH 12/20] ublk: implement integrity user copy Caleb Sander Mateos
2025-12-26 2:38 ` Ming Lei
2025-12-17 5:34 ` [PATCH 13/20] ublk: optimize ublk_user_copy() on daemon task Caleb Sander Mateos
2025-12-26 2:51 ` Ming Lei
2025-12-17 5:34 ` [PATCH 14/20] selftests: ublk: add utility to get block device metadata size Caleb Sander Mateos
2025-12-17 5:34 ` [PATCH 15/20] selftests: ublk: add kublk support for integrity params Caleb Sander Mateos
2025-12-17 5:34 ` [PATCH 16/20] selftests: ublk: implement integrity user copy in kublk Caleb Sander Mateos
2025-12-17 5:34 ` [PATCH 17/20] selftests: ublk: support non-O_DIRECT backing files Caleb Sander Mateos
2025-12-17 5:34 ` [PATCH 18/20] selftests: ublk: add integrity data support to loop target Caleb Sander Mateos
2025-12-17 5:34 ` [PATCH 19/20] selftests: ublk: add integrity params test Caleb Sander Mateos
2025-12-17 5:34 ` [PATCH 20/20] selftests: ublk: add end-to-end integrity test Caleb Sander Mateos
2025-12-18 16:54 ` (subset) [PATCH 00/20] ublk: add support for integrity data Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aUn3O2RJtXOpNkyQ@fedora \
--to=ming.lei@redhat.com \
--cc=axboe@kernel.dk \
--cc=csander@purestorage.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=shuah@kernel.org \
--cc=stazhang@purestorage.com \
--cc=ushankar@purestorage.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.