From nobody Sat Feb 7 05:01:34 2026 Received: from mail-pj1-f100.google.com (mail-pj1-f100.google.com [209.85.216.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E4CB42A58C for ; Thu, 8 Jan 2026 09:20:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864009; cv=none; b=TvnCHjAWF3sVu2Y9Rh+crhX0Iq6OQVZwG++2hUsGGL83ImWKoSspKB3d53mBJoKzwkTAY24Or8fhe9JaCex/FLldHG2wr0IG3gVeN5dF6VwxINYs670Y59zlwgInIEz8PRjfxs8gOYNpHtpBntzo41YqAx5rbU2Otv0RdOjweeY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864009; c=relaxed/simple; bh=MFrMgizmK5MaIPV+Gko7o6kSYnpBboKUcVmDmAwyHCk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MJb4+m5FjnYaInGytw6kg/bro1pUF8ingA0kpV84Td9/+Zvp73PPG0s67AiZgkzDNZxbEVbHzeRQGopzCWIO4O4CtQ4adKxjQuP8VUwUpbNCSuqejGKwCwheLoOiaSzMFL182Zx/0IhS035bd+LEukfP/FHUF2PwVWuL2OTeXHA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=PJhDWRyJ; arc=none smtp.client-ip=209.85.216.100 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="PJhDWRyJ" Received: by mail-pj1-f100.google.com with SMTP id 98e67ed59e1d1-34f63b154faso77932a91.2 for ; Thu, 08 Jan 2026 01:20:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863996; x=1768468796; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MNQyNIuF0YsgyAJSwbc/xgpZYuEtibH5Z0ga5IDU7gw=; b=PJhDWRyJZgdhzo2osYdH0DTJHjzirGkQ/nd2uZaVlWMcOZzJyKm8pyzfSIMOFwCjNU 9vDOfUl/uYejrQj2Ue23t/9ROQWOS0ap/5y2ruR5cYPVvAc2xLQkpuZzmYO5Ke0RSIW6 DIkCl5jTQk7hspV6w1qhZ54u84R2s261WEYAJ5ynh/u1CZuIiAOxVcfwV6yU7bmU4xzP KakK/FEaRJd8EVyg4PBMHRdg6XfDhVOEfAyAk+nJwS9+bolHHBFXnVOolaSN8Dz77EZz yWvJ7ZVK+cBbWIMRIV+nPhSCIJ6S5TdwWH/137SRTQoY3rSmN56LN/C82oPlufqRRuVz LbhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863996; x=1768468796; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=MNQyNIuF0YsgyAJSwbc/xgpZYuEtibH5Z0ga5IDU7gw=; b=HX5cSNh1XU2832Ayio4nU15RnDpr6/wjJjNSn2fyiFy9wZapZzVF9rx4w1gBpsLoQ2 w/DtqGOrUuWVov4ZPDqQgGnjUoz1We6XLQ9Z3EAtgBComIcq4J4+B5ElFxAhXIvpeZak WissSiVP9gadjVWo74ml47jOSw4G5Y+YDTgwkaqtUtV44gJEBf4neVhXzsEvGrEKH5eK iDo60cOvlY/k6GCW8Bvxw/3LvJSRVxXcjXvLA3ypPPLHKcificELNOxUVWfzKxdBJV9+ 7NzwIQFw2ONriYvHlr5PDkSHvqMgoI3VAIrQHbwBl+KxH3anvPObQn624kuwqNQXaL8P jcww== X-Forwarded-Encrypted: i=1; AJvYcCW5QfVdsjLkR10ds64zg1od0U34GU2ryGKB4uYndewrqeA98b78S/UGo9hbhuTUTunzW9ESiM/4RMNB/IE=@vger.kernel.org X-Gm-Message-State: AOJu0Yz+USriPJB2WH0abmtyRyf+8XvY3qeXK/E62/y8jQmknL4ykNK6 WF7bNf5yXcym9WHSjv3YsTkJ+zEXixyjPOyjHCjBTKSexj29WnlG1KUWNuhyTcdEY5Vpuy/cTuQ 9DFVmfH1aAa1nd82rW5t/aZrdmSkiEnIKXWaR X-Gm-Gg: AY/fxX5G44VvlXQVsxJ2ODHQ8xiFtjO5TWrLF6DXJWu/ZsgKLG4Cnj0yIgyKAoLXCNV J+CQJyAZ0GxFpKPQg6P+u6Y3SDbe/03tVxNyj2SQLNzwZH94IXgWaE8UG3AzZ54kTeKw/2xEFpQ 1W3y5Kuewiru4uIiWXhwZ8cryTadYlBR4MKELs1JkxjHoTQktbdTYQ80fS7jeWda8cHRCZ1FC6x Kf1wY07Nfn4t8bnT/qG+py4Aczfa7dq+hoki/8aTjvcvJKBSveJnieSmr7aTgS5qhncEUZsleEo vW5fWLJdV37MWvUQ7FWkBTpYT7fg623UQTdX1oNt2BHOzwXPC1zHmoINTd3xhtE+T0pH4dzubUm XamlM+vUfuIb52fcai0DYi+pvFN4Xxh+v4sm+hgs30A== X-Google-Smtp-Source: AGHT+IGgsECl/s5X0anN6YN0NbDvXYMzPEZuaAu3pVTMt09j26paUiPRz914MTdupMzpukRtZg1N3wOUfHwP X-Received: by 2002:a17:90b:2e0c:b0:343:e480:49f1 with SMTP id 98e67ed59e1d1-34f68c28ea4mr3826621a91.5.1767863995746; Thu, 08 Jan 2026 01:19:55 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id 98e67ed59e1d1-34f5f8d0c46sm1010471a91.0.2026.01.08.01.19.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:55 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 294EA342170; Thu, 8 Jan 2026 02:19:55 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 23952E42F2C; Thu, 8 Jan 2026 02:19:55 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 01/19] blk-integrity: take const pointer in blk_integrity_rq() Date: Thu, 8 Jan 2026 02:19:29 -0700 Message-ID: <20260108091948.1099139-2-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" blk_integrity_rq() doesn't modify the struct request passed in, so allow a const pointer to be passed. Use a matching signature for the !CONFIG_BLK_DEV_INTEGRITY version. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei Reviewed-by: Martin K. Petersen --- include/linux/blk-integrity.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/linux/blk-integrity.h b/include/linux/blk-integrity.h index a6b84206eb94..c15b1ac62765 100644 --- a/include/linux/blk-integrity.h +++ b/include/linux/blk-integrity.h @@ -89,11 +89,11 @@ static inline unsigned int bio_integrity_bytes(struct b= lk_integrity *bi, unsigned int sectors) { return bio_integrity_intervals(bi, sectors) * bi->metadata_size; } =20 -static inline bool blk_integrity_rq(struct request *rq) +static inline bool blk_integrity_rq(const struct request *rq) { return rq->cmd_flags & REQ_INTEGRITY; } =20 /* @@ -166,13 +166,13 @@ static inline unsigned int bio_integrity_intervals(st= ruct blk_integrity *bi, static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi, unsigned int sectors) { return 0; } -static inline int blk_integrity_rq(struct request *rq) +static inline bool blk_integrity_rq(const struct request *rq) { - return 0; + return false; } =20 static inline struct bio_vec rq_integrity_vec(struct request *rq) { /* the optimizer will remove all calls to this function */ --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-pl1-f225.google.com (mail-pl1-f225.google.com [209.85.214.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B01B342A594 for ; Thu, 8 Jan 2026 09:20:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864009; cv=none; b=Ond54veyB0/j/PffxL7MTltw8Eci/AMMHEI1FhcF9ViBPMJePPRV3xKOqEBUBpuvpf3/9cuy05GXNJS7IFq0mu6iTiKMryUjPMV10epQuaeJCQLFHjK0SxkMWentqXsoXUmAU4L2Qy145BysWyV5JQXeWd6VwOxItaA7gTsXzYs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864009; c=relaxed/simple; bh=RSIk539QU0YeMD2OF+ndA/QgOH1sYpMVe11eirRJlyI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YZG8Cf/vjvXzR8iXUnO+D9QWy3OmTcYz6Ls9itRCijRoQ3ZoqEJn9r9l1raSP4Mo+TeHFMe8yZIhdADcf1QmAx7zoijCT2JrC+13td7pfeGwLRkfz5IClOmybwF6boJdLatc85IyMO0+Cb6R37i5B2oIyRYDk/fKcr4QOfPUgq4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=HQg+Gkf3; arc=none smtp.client-ip=209.85.214.225 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="HQg+Gkf3" Received: by mail-pl1-f225.google.com with SMTP id d9443c01a7336-2a08ced9a36so2758455ad.2 for ; Thu, 08 Jan 2026 01:20:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863996; x=1768468796; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mNgOa//j6HpxCA/+vGAeV8sKsy7oyXQnnYVexO4WVVc=; b=HQg+Gkf3zoVBei8tB0SD80KjDtxmlZXuYW+E/ghRRQJiErgN7h2dENzSWI2CzOEEzV VlBDfTb5KF3Rac9Yybf6pPy5p6NOwGr30QyPOO4qd6C3FfEI2ih7ULCAHAe3UcogQ1Yf ZimDQhWLESIBICtZnBwBde8YVGtaHXMoFm/UbHHClbDvXzTM3uDrAJOJu+uC5J3mxF/b THR5HaVfZBZmYJgjFq9OYbSs4bx2PBPa5J+OxOzbM8wHpshN5kUMfEM5+RQw1rXjRkRx YxVVLrajpS8SH0VuYalqpF3yT9Gf3sELcToAFxDgPW2C55ncE/X7Vf6UmIpbXuFYlLkX DdlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863996; x=1768468796; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=mNgOa//j6HpxCA/+vGAeV8sKsy7oyXQnnYVexO4WVVc=; b=hR4bB/7KmWpuHBAd+WVsw1uPGxDqDunI5Fh7mLpH8DeQvBfa87leofSmeJ29xIKbLl MoSxhEmykDbxWTvOm0eDDErmY5+kp/TZX1+RunV2HtaeGFsXTjPEEcf6hboI1BRst/+n tQpxtnhhbD6fvO6eNCni3i5joElV3soCelTjHy+Jib2RRPq2XAcnRgGUtZgPXsNXs9P0 lZlxA6JaqTHZMoXh04E1nT8HDB2amIMJrvkh4U0m/PD1gB5pD46sZXsgFkshuP0rVteg 0Qm5oF1Q6aascjDIEC9JgaBtaE/d5PYlIXUFmiTLaoarRqXXi6Vb4cqzfTZN4L2lbVJJ NO3Q== X-Forwarded-Encrypted: i=1; AJvYcCUHWJu7JYbFALg89VPg0pTGcq9+Fxt18g9qXUamHto+brNTKE2i/R6m4TbpaOTBnPQFzxn2eUuR4JhOEn4=@vger.kernel.org X-Gm-Message-State: AOJu0YwKbqqb1khN1C1QujsHh035umnp5st4GBqn36MG8UNIbOl26lTb Cn1RZMFSIw+xUvxYlV82Rl57cHWTUPKEM0MZTS9DUZled6LnWL67w3QhyW4Lz2nnbl6v3Ms2FNH 9DoLlfyXakJ3vkoKNNnWVBEHVVPSlFKSKR5M8z1vmZGe45GJ/k7vm X-Gm-Gg: AY/fxX5oP2qa96xHW64r/XUog6S6rWNGahJsANXdyiMKlB713om7Ln7GMPZkCnsgweQ yRfVNgqGiqhcBfoVU69kKiOXKiBUjPFMI7RQ/zwm7wF9L8rjCb/09RZ/ByWztqY5Z2YuxGmg+BK grBLOsKMDMOGQAAvbmjqRrTuVvdukDPdUbaBP1wtLevspbLphIjohX8pan6byk8+rIZvfi58tQq eug/BZeYAkJqow6AaJaa8N3lVlxnXmlAjcnMBNpZVm/h5v74BPlXLnaSuSXGTwh0Uc4/ZGL7agR 06U2HpJwVUVEM4ZHPxl6XF3ta6li1BUVCJnZZl88nHAOvrPjhMG/DggCdrzIa48aJfZXQWjzjqy eqd1gMpQDz6QyAnTlqOmnzibQ/iQ= X-Google-Smtp-Source: AGHT+IGlX3edA9YWWH1XbQV4Vo1qb/AsMMH6cjbE0zkab2OXzJttdqFOVlxVLUgkkh4h4Ydm0zkfO4NLDSoM X-Received: by 2002:a17:903:1983:b0:29f:f14:18a0 with SMTP id d9443c01a7336-2a3ee48fedamr37868625ad.4.1767863995970; Thu, 08 Jan 2026 01:19:55 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([2620:125:9017:12:36:3:5:0]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2a3e3c4a15bsm8022805ad.25.2026.01.08.01.19.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:55 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 4B7B93421AE; Thu, 8 Jan 2026 02:19:55 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 4632AE42F2C; Thu, 8 Jan 2026 02:19:55 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 02/19] ublk: move ublk flag check functions earlier Date: Thu, 8 Jan 2026 02:19:30 -0700 Message-ID: <20260108091948.1099139-3-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" ublk_dev_support_user_copy() will be used in ublk_validate_params(). Move these functions next to ublk_{dev,queue}_is_zoned() to avoid needing to forward-declare them. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 60 ++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 837fedb02e0d..8e3da9b2b93a 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -273,10 +273,40 @@ static inline struct ublksrv_io_desc * ublk_get_iod(const struct ublk_queue *ubq, unsigned tag) { return &ubq->io_cmd_buf[tag]; } =20 +static inline bool ublk_support_zero_copy(const struct ublk_queue *ubq) +{ + return ubq->flags & UBLK_F_SUPPORT_ZERO_COPY; +} + +static inline bool ublk_dev_support_zero_copy(const struct ublk_device *ub) +{ + return ub->dev_info.flags & UBLK_F_SUPPORT_ZERO_COPY; +} + +static inline bool ublk_support_auto_buf_reg(const struct ublk_queue *ubq) +{ + return ubq->flags & UBLK_F_AUTO_BUF_REG; +} + +static inline bool ublk_dev_support_auto_buf_reg(const struct ublk_device = *ub) +{ + return ub->dev_info.flags & UBLK_F_AUTO_BUF_REG; +} + +static inline bool ublk_support_user_copy(const struct ublk_queue *ubq) +{ + return ubq->flags & UBLK_F_USER_COPY; +} + +static inline bool ublk_dev_support_user_copy(const struct ublk_device *ub) +{ + return ub->dev_info.flags & UBLK_F_USER_COPY; +} + static inline bool ublk_dev_is_zoned(const struct ublk_device *ub) { return ub->dev_info.flags & UBLK_F_ZONED; } =20 @@ -671,40 +701,10 @@ static void ublk_apply_params(struct ublk_device *ub) =20 if (ub->params.types & UBLK_PARAM_TYPE_ZONED) ublk_dev_param_zoned_apply(ub); } =20 -static inline bool ublk_support_zero_copy(const struct ublk_queue *ubq) -{ - return ubq->flags & UBLK_F_SUPPORT_ZERO_COPY; -} - -static inline bool ublk_dev_support_zero_copy(const struct ublk_device *ub) -{ - return ub->dev_info.flags & UBLK_F_SUPPORT_ZERO_COPY; -} - -static inline bool ublk_support_auto_buf_reg(const struct ublk_queue *ubq) -{ - return ubq->flags & UBLK_F_AUTO_BUF_REG; -} - -static inline bool ublk_dev_support_auto_buf_reg(const struct ublk_device = *ub) -{ - return ub->dev_info.flags & UBLK_F_AUTO_BUF_REG; -} - -static inline bool ublk_support_user_copy(const struct ublk_queue *ubq) -{ - return ubq->flags & UBLK_F_USER_COPY; -} - -static inline bool ublk_dev_support_user_copy(const struct ublk_device *ub) -{ - return ub->dev_info.flags & UBLK_F_USER_COPY; -} - static inline bool ublk_need_map_io(const struct ublk_queue *ubq) { return !ublk_support_user_copy(ubq) && !ublk_support_zero_copy(ubq) && !ublk_support_auto_buf_reg(ubq); } --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-dl1-f97.google.com (mail-dl1-f97.google.com [74.125.82.97]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E7AC242A10D for ; Thu, 8 Jan 2026 09:20:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.97 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864011; cv=none; b=r+QjlW0w8q0aw+mZCehYLiS0PCqufDF5avViJLcWhk50/yUxXzd7q6JbxLdZEQPm/uDr4G7bcipl24KayUZoBPJnU+qb9DNpoDrIBfH2owIqqIWbjy5emchGhnD4oykFNanh3QTMUshT7YpuUldnssrYjtatIitUGSHuKiQgz78= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864011; c=relaxed/simple; bh=1YUiZE9DU5V1hrRSlfFjaGipyAY5B04IHg4vpE+wq1I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bhIipp2O8z+H/kHwtzF1EElLkYkao/1nJACZ5IVbsxfTI3LCwHXQBkzlY2aXfngSnIUax/dh3vwXLd8U5PGeQdTaNsEEZp+vPNTi2JiTatjUeRFD/n5YTednhIkY6jLGTFwe5d1KrP5gA9TwTDqvelw1UiylfxNlEBp/8blHmvs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=ZVYgPZqL; arc=none smtp.client-ip=74.125.82.97 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="ZVYgPZqL" Received: by mail-dl1-f97.google.com with SMTP id a92af1059eb24-122008e73c7so28103c88.2 for ; Thu, 08 Jan 2026 01:20:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863996; x=1768468796; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xUdqZxPNG/dxsQ2jTx6CQeYv/8NBzY3PHz5WVrKVkRI=; b=ZVYgPZqLX3ehhBUmn/LZ3jTarX9k3lq7zU4J/YqPY79SyHq7gMu2778avEFCTHmkIF anbhwGqtYFAnDc8cPyWeFC+TXjFWIxn3pnEwFUlkGBeX0ReOvPle7lR84nqp780sceNm mkGLsGSKv7DkWagfq32grzbMYOq19L8r1JkVhRhAknDZ4exizWrwFftRx/b0SQ9tS91C 9t8CZ2CrVuwx/ACz8idCHEF28F9VBwv2t8nN+u3GKHdbG1KhO9NHlYGDG3IlfU6nAs12 fy/USdjtLImvt7JUts2iPIZ48R807GPxzsE/3d6VxJDcHFh0sq+Q8AW5xZ8RoXj36KzN KvEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863996; x=1768468796; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=xUdqZxPNG/dxsQ2jTx6CQeYv/8NBzY3PHz5WVrKVkRI=; b=CVKpIR81x7PgBzlqiL+rbMhHMo20a2nkqnIMD/a96FT/3HFLLctkFTtIXbqlllfYEg FqQVoW7Gi+4c2RntIcKU45r0HkN+A6vKyS/lGPFaIgggtJe5jgH9V+F9KUpKIlvfPr96 LGem2uTcbB/9wOYEo6nJ+dub6G+vCEFpykEhePXYJwiurHeDmduXiE7ESuqj+SDo8fZd Xy1ao2WnvlC+p4JA4CwnX0eIz/jhrhajJPEOmVuLNqXUfHR21ba5gKDwBv16ZUlrPk1+ HEuHoBJRiat2nCah9LfDzj1hmyB/sjFd4foh+lkxP2MjxW1eLOq4GHfGI9npASE4jvFW NQOg== X-Forwarded-Encrypted: i=1; AJvYcCV56uO5wUC2LbvOYvYqps03X1G7Ro95vyEVCb0vc2bh4YtAmtspUv89gsqJ3mYAHPCgFLwsv/KogWC1hV8=@vger.kernel.org X-Gm-Message-State: AOJu0YwyEn+ynTbZk1CNN55ynoQUbUFNBrIH7WhdKM8wx3+ga1ua3S7X TAn9ejpamo78hB4WSfRISrzd8qXgLYmeiqZcOLNsh89B94rxuFjJXbExEFzDbDnAshNUflJ+8sf RK0DzQjrPEvtNkgzXS73ExQu++mXw73y9dn2r X-Gm-Gg: AY/fxX5efvrrkQ+O1ZZA2uzIITucYQuUJqONmNcPUo7QH2pFptVRbCRiNToGJfA26D4 tTdNsXjD0jPt3Y2n+3ZwCp/1RE55RMtCuUAWc96D9Vi89tAvxJNTHC4aJnfwc/49x+p8it/pOoA S5ylNsdypyeUbq47+nhCxuoWZasNBDexsEcOUYlZfDGAMgieFL4SkFmdT//nMnt68Oj7wTFfxbJ K9PpS/a9Z1JcD6whzvQiGJmlg1xuYxvXenMbZoGgMIYF3Z2hiVV0SIgnIfz4v11J4mDC8rv8wRO hZcU/JmQC/lTk6Errv9y9RpfV4DNO5EO6KfwP+NHaXJwYG518SIfBtkUoFmvJOdwIOEFrSXov9w D9bZATLUr9s007DYAH4cdoauxgi8RGNoN83MgOt63cA== X-Google-Smtp-Source: AGHT+IHN8Chl16m6gs9Go7rWopGOSzZRPNx1u8wrS5rdJZP07Z15rR2vMP9r2rPgJ3o7t4QwcX/DtHhAq9BK X-Received: by 2002:a05:7022:238b:b0:119:e56b:c3f1 with SMTP id a92af1059eb24-121f8af2df3mr2828476c88.1.1767863995880; Thu, 08 Jan 2026 01:19:55 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id a92af1059eb24-121f243aca8sm1644426c88.2.2026.01.08.01.19.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:55 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 6F22B342224; Thu, 8 Jan 2026 02:19:55 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 69B1FE42F2C; Thu, 8 Jan 2026 02:19:55 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 03/19] ublk: support UBLK_PARAM_TYPE_INTEGRITY in device creation Date: Thu, 8 Jan 2026 02:19:31 -0700 Message-ID: <20260108091948.1099139-4-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Stanley Zhang Add a feature flag UBLK_F_INTEGRITY for a ublk server to request integrity/metadata support when creating a ublk device. The ublk server can also check for the feature flag on the created device or the result of UBLK_U_CMD_GET_FEATURES to tell if the ublk driver supports it. UBLK_F_INTEGRITY requires UBLK_F_USER_COPY, as user copy is the only data copy mode initially supported for integrity data. Add UBLK_PARAM_TYPE_INTEGRITY and struct ublk_param_integrity to struct ublk_params to specify the integrity params of a ublk device. UBLK_PARAM_TYPE_INTEGRITY requires UBLK_F_INTEGRITY and a nonzero metadata_size. The LBMD_PI_CAP_* and LBMD_PI_CSUM_* values from the linux/fs.h UAPI header are used for the flags and csum_type fields. If the UBLK_PARAM_TYPE_INTEGRITY flag is set, validate the integrity parameters and apply them to the blk_integrity limits. 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 [csander: drop redundant pi_tuple_size field, use block metadata UAPI constants, add param validation] Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 101 +++++++++++++++++++++++++++++++++- include/uapi/linux/ublk_cmd.h | 19 +++++++ 2 files changed, 119 insertions(+), 1 deletion(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 8e3da9b2b93a..b91b2111f280 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -42,10 +42,12 @@ #include #include #include #include #include +#include +#include #include =20 #define UBLK_MINORS (1U << MINORBITS) =20 #define UBLK_INVALID_BUF_IDX ((u16)-1) @@ -81,11 +83,12 @@ =20 /* 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) =20 struct ublk_uring_cmd_pdu { /* * Store requests in same batch temporarily for queuing them to * daemon context. @@ -313,10 +316,15 @@ static inline bool ublk_dev_is_zoned(const struct ubl= k_device *ub) static inline bool ublk_queue_is_zoned(const struct ublk_queue *ubq) { return ubq->flags & UBLK_F_ZONED; } =20 +static inline bool ublk_dev_support_integrity(const struct ublk_device *ub) +{ + return ub->dev_info.flags & UBLK_F_INTEGRITY; +} + #ifdef CONFIG_BLK_DEV_ZONED =20 struct ublk_zoned_report_desc { __u64 sector; __u32 operation; @@ -628,10 +636,57 @@ static void ublk_dev_param_basic_apply(struct ublk_de= vice *ub) set_disk_ro(ub->ub_disk, true); =20 set_capacity(ub->ub_disk, p->dev_sectors); } =20 +static int ublk_integrity_flags(u32 flags) +{ + int ret_flags =3D 0; + + if (flags & LBMD_PI_CAP_INTEGRITY) { + flags &=3D ~LBMD_PI_CAP_INTEGRITY; + ret_flags |=3D BLK_INTEGRITY_DEVICE_CAPABLE; + } + if (flags & LBMD_PI_CAP_REFTAG) { + flags &=3D ~LBMD_PI_CAP_REFTAG; + ret_flags |=3D 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 =3D &ub->params.basic; @@ -690,10 +745,33 @@ static int ublk_validate_params(const struct ublk_dev= ice *ub) return -EINVAL; if (p->max_segment_size < UBLK_MIN_SEGMENT_SIZE) return -EINVAL; } =20 + if (ub->params.types & UBLK_PARAM_TYPE_INTEGRITY) { + const struct ublk_param_integrity *p =3D &ub->params.integrity; + int pi_tuple_size =3D ublk_integrity_pi_tuple_size(p->csum_type); + int flags =3D ublk_integrity_flags(p->flags); + + if (!ublk_dev_support_integrity(ub)) + return -EINVAL; + if (flags < 0) + return flags; + if (pi_tuple_size < 0) + return pi_tuple_size; + if (!p->metadata_size) + return -EINVAL; + if (p->csum_type =3D=3D LBMD_PI_CSUM_NONE && + p->flags & LBMD_PI_CAP_REFTAG) + return -EINVAL; + if (p->pi_offset + pi_tuple_size > p->metadata_size) + return -EINVAL; + if (p->interval_exp < SECTOR_SHIFT || + p->interval_exp > ub->params.basic.logical_bs_shift) + return -EINVAL; + } + return 0; } =20 static void ublk_apply_params(struct ublk_device *ub) { @@ -2941,10 +3019,27 @@ static int ublk_ctrl_start_dev(struct ublk_device *= ub, lim.seg_boundary_mask =3D ub->params.seg.seg_boundary_mask; lim.max_segment_size =3D ub->params.seg.max_segment_size; lim.max_segments =3D ub->params.seg.max_segments; } =20 + if (ub->params.types & UBLK_PARAM_TYPE_INTEGRITY) { + const struct ublk_param_integrity *p =3D &ub->params.integrity; + int pi_tuple_size =3D ublk_integrity_pi_tuple_size(p->csum_type); + + lim.max_integrity_segments =3D + p->max_integrity_segments ?: USHRT_MAX; + lim.integrity =3D (struct blk_integrity) { + .flags =3D ublk_integrity_flags(p->flags), + .csum_type =3D ublk_integrity_csum_type(p->csum_type), + .metadata_size =3D p->metadata_size, + .pi_offset =3D p->pi_offset, + .interval_exp =3D p->interval_exp, + .tag_size =3D p->tag_size, + .pi_tuple_size =3D pi_tuple_size, + }; + } + if (wait_for_completion_interruptible(&ub->completion) !=3D 0) return -EINTR; =20 if (ub->ublksrv_tgid !=3D ublksrv_pid) return -EINVAL; @@ -3131,10 +3226,14 @@ static int ublk_ctrl_add_dev(const struct ublksrv_c= trl_cmd *header) if (info.flags & (UBLK_F_USER_COPY | UBLK_F_SUPPORT_ZERO_COPY | UBLK_F_AUTO_BUF_REG)) return -EINVAL; } =20 + /* User copy is required to access integrity buffer */ + if (info.flags & UBLK_F_INTEGRITY && !(info.flags & UBLK_F_USER_COPY)) + return -EINVAL; + /* the created device is always owned by current user */ ublk_store_owner_uid_gid(&info.owner_uid, &info.owner_gid); =20 if (header->dev_id !=3D info.dev_id) { pr_warn("%s: dev id not match %u %u\n", diff --git a/include/uapi/linux/ublk_cmd.h b/include/uapi/linux/ublk_cmd.h index ec77dabba45b..4c141d7e4710 100644 --- a/include/uapi/linux/ublk_cmd.h +++ b/include/uapi/linux/ublk_cmd.h @@ -309,10 +309,16 @@ * the I/O's daemon task. The q_id and tag of the registered buffer are re= quired * in UBLK_U_IO_UNREGISTER_IO_BUF's ublksrv_io_cmd. */ #define UBLK_F_BUF_REG_OFF_DAEMON (1ULL << 14) =20 +/* + * ublk device supports requests with integrity/metadata buffer. + * Requires UBLK_F_USER_COPY. + */ +#define UBLK_F_INTEGRITY (1ULL << 16) + /* device state */ #define UBLK_S_DEV_DEAD 0 #define UBLK_S_DEV_LIVE 1 #define UBLK_S_DEV_QUIESCED 2 #define UBLK_S_DEV_FAIL_IO 3 @@ -598,10 +604,21 @@ struct ublk_param_segment { __u32 max_segment_size; __u16 max_segments; __u8 pad[2]; }; =20 +struct ublk_param_integrity { + __u32 flags; /* LBMD_PI_CAP_* from linux/fs.h */ + __u16 max_integrity_segments; /* 0 means no limit */ + __u8 interval_exp; + __u8 metadata_size; /* UBLK_PARAM_TYPE_INTEGRITY requires nonzero */ + __u8 pi_offset; + __u8 csum_type; /* LBMD_PI_CSUM_* from linux/fs.h */ + __u8 tag_size; + __u8 pad[5]; +}; + struct ublk_params { /* * Total length of parameters, userspace has to set 'len' for both * SET_PARAMS and GET_PARAMS command, and driver may update len * if two sides use different version of 'ublk_params', same with @@ -612,16 +629,18 @@ struct ublk_params { #define UBLK_PARAM_TYPE_DISCARD (1 << 1) #define UBLK_PARAM_TYPE_DEVT (1 << 2) #define UBLK_PARAM_TYPE_ZONED (1 << 3) #define UBLK_PARAM_TYPE_DMA_ALIGN (1 << 4) #define UBLK_PARAM_TYPE_SEGMENT (1 << 5) +#define UBLK_PARAM_TYPE_INTEGRITY (1 << 6) /* requires UBLK_F_INTEGR= ITY */ __u32 types; /* types of parameter included */ =20 struct ublk_param_basic basic; struct ublk_param_discard discard; struct ublk_param_devt devt; struct ublk_param_zoned zoned; struct ublk_param_dma_align dma; struct ublk_param_segment seg; + struct ublk_param_integrity integrity; }; =20 #endif --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-dl1-f99.google.com (mail-dl1-f99.google.com [74.125.82.99]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E36B42A58A for ; Thu, 8 Jan 2026 09:20:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.99 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864023; cv=none; b=s9jyAccbgjaJj1urg7KJOeJGkFz+7+dLRVIudSBvZFY8FGfV/1uZmFDIVpynWlbxofHxMKdET/YWeadP8FF3ibZwr1XquKdUw3pmW4rQHnUutkGXBCBJO7JHZYevtk6I9hCgPT49VpMR0tA8+Ffi39eURMCYYYGOdFmLbSR8Dz0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864023; c=relaxed/simple; bh=j0qqe+b6Tp1wsdU1PGQcA4ShpgCikqFMILedh5CXjdY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=p9udVpZNY8kqxoRa5PLeLpOSuqe28mtAO+J9Wr+onCc80AL0mqPrq5yPFCrTZYi5FG/bEBvwaKvcC0pj4HdV2LWiEZQK1+smTImHqYCtd4Vo/LVuUMn5nKuXklsMhbL30kIqjANXNfxBjl7dSSb9lC4EdXU0Pgi1iKP96mCewkQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=TPAhHMSO; arc=none smtp.client-ip=74.125.82.99 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="TPAhHMSO" Received: by mail-dl1-f99.google.com with SMTP id a92af1059eb24-122008e73c7so28104c88.2 for ; Thu, 08 Jan 2026 01:20:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863996; x=1768468796; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1BsEwlEe6b4/GC4RnV/DMnhZhqrSG2xlnXLmv4xPAM8=; b=TPAhHMSOZUK78HkqiocWIzv0cK3Ooxc0KIPQJUESSYuaOzXw/CPxZBVs04DZK9vP4L YLm8RbQeCdNlUpiPoSF81cj2jUCrd+EZRAt1ED52TljSgJsFtWdtjaQYPSC0kqwgVUMZ WOFPzMRVacp1S3xdpCynEyjuRMi9VzvxwppttuNpFVvQ0MUM8o9n5VCf0c/CYFEB1xUS mbyAojNlL7hSIE8uKRBsrqM0go6ZOUKrRMLe6dAoQl/ZYWeH874KlTvBgagdfScFLPVP 20JP9QdjGZjKczhZ3NM7qL7t7rxMRzfIabLMk5+pLS35dzDSi/slJovSGsG9sFYgQox+ eDqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863996; x=1768468796; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=1BsEwlEe6b4/GC4RnV/DMnhZhqrSG2xlnXLmv4xPAM8=; b=UT/DlILhby6ZpahBqi+BPwI1YjihadVY7Y4KEwSda+1IRfI+HJUV2hdHraN5xpmoY4 etYhtujLcYrtPYgH4QMi9yluhtbd3V3OrWvNfPBktvkyB5XBs/jSpr0lIlBnDDmsRtjy xhMsWKL2aplIiRVrMe1rmmYO1kbv4DwS1zKARHYKhhhYbQifETQ47N9wC8ogLUBL584d Pi7jbgdmXS33N8KhAnVu7nMSqV9nh2IYnn7wjNnQ1azCRDhJReYBL4AiMo2d5gsu2xl3 n7GCNNPtrM+7bzboKPFo1HTJHZzuIb8VmSQuFnLVQxQ6vP6O6tiOeNi3Eiwh0XQkIRP1 p/DQ== X-Forwarded-Encrypted: i=1; AJvYcCWBwvpOr0KY8zFONkyFpF0uaeYmNOSdr30Um/fifaV2Sdoc20CODhldlLvW/dxM6nqtiNdOsIF3jVS7bUQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxqRyaVyRJDHG1hGmZFcq2bLFnPlZ/g7Y8SO0U1enJlSExYYA2R crcHnA2+vIY6iXohdvruVVN/cUZITFPRJ5OkEuBXAOeyFTzMXHeltbbekWrzHkyPhixMSzLEaAq Bd4nYWE9lRJeWOEogNcqwy7M2TJyLK1QnxzEC X-Gm-Gg: AY/fxX5Wj81UaUNNPnbV3DfGy0EEw7TQsj+307y85gVa452rBKutsPkIKBvl4KB4AbQ 1TL2to7ymC+UnD3PaVXOoIw7McDlCTlDbhfeLGNw2bPiFtSipMsba1n4aGoEWoYYn2ifYQ6Uoxs b3FVCvy2/WSCeVbDOLFGEmBrdfumUbYrpT5kWeULuYYXPm4Y+5Vww7u1gVH8BMAnFOPU92xiFU9 3qSVpz8JXyT92egp29c3UXERGylgxdcbjdtW0M0p18aBrQQsjUhR5Q0Z97EfWIZ5Y/ySZZP591D r4XQU581cAPCjP40slDjHFTDb2WFWvvvK2xwRqgj4VqEmK/jokblN67F+J0VVp29GgGV1xmdsd8 OM3uql8wFyMlhuzJecCgwPzn66Y18oedtEn65OjaLig== X-Google-Smtp-Source: AGHT+IFrkMoxXPbkCpAtEJlUUiQgbFuZWtwfN3P60Hvgrr4I9mhxnVUkWYur8ZvQ4vma87yDUMkDhoQj9aJ/ X-Received: by 2002:a05:7300:5505:b0:2ae:5d59:3ef6 with SMTP id 5a478bee46e88-2b17d350045mr1780070eec.9.1767863996418; Thu, 08 Jan 2026 01:19:56 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id 5a478bee46e88-2b170798edesm940360eec.11.2026.01.08.01.19.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:56 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 9166C34223B; Thu, 8 Jan 2026 02:19:55 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 8BEFCE42F2C; Thu, 8 Jan 2026 02:19:55 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 04/19] ublk: set UBLK_IO_F_INTEGRITY in ublksrv_io_desc Date: Thu, 8 Jan 2026 02:19:32 -0700 Message-ID: <20260108091948.1099139-5-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Indicate to the ublk server when an incoming request has integrity data by setting UBLK_IO_F_INTEGRITY in the ublksrv_io_desc's op_flags field. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 3 +++ include/uapi/linux/ublk_cmd.h | 2 ++ 2 files changed, 5 insertions(+) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index b91b2111f280..7310d8761d2b 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -1125,10 +1125,13 @@ static inline unsigned int ublk_req_build_flags(str= uct request *req) flags |=3D UBLK_IO_F_NOUNMAP; =20 if (req->cmd_flags & REQ_SWAP) flags |=3D UBLK_IO_F_SWAP; =20 + if (blk_integrity_rq(req)) + flags |=3D UBLK_IO_F_INTEGRITY; + return flags; } =20 static blk_status_t ublk_setup_iod(struct ublk_queue *ubq, struct request = *req) { diff --git a/include/uapi/linux/ublk_cmd.h b/include/uapi/linux/ublk_cmd.h index 4c141d7e4710..dfde4aee39eb 100644 --- a/include/uapi/linux/ublk_cmd.h +++ b/include/uapi/linux/ublk_cmd.h @@ -412,10 +412,12 @@ struct ublksrv_ctrl_dev_info { * * ublk server has to check this flag if UBLK_AUTO_BUF_REG_FALLBACK is * passed in. */ #define UBLK_IO_F_NEED_REG_BUF (1U << 17) +/* Request has an integrity data buffer */ +#define UBLK_IO_F_INTEGRITY (1UL << 18) =20 /* * io cmd is described by this structure, and stored in share memory, inde= xed * by request tag. * --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-qk1-f225.google.com (mail-qk1-f225.google.com [209.85.222.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0911342A828 for ; Thu, 8 Jan 2026 09:20:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864020; cv=none; b=MmdiC1CIFfFzAVIs4wYL6T2gR2qio5uzLD0++A9X9dZVtA9jg5kWaTbRc4jiACox/wz7R+q12RGRoyMpgQUnjXR+e2CF3ZMVWIXNvs+oXPTONv1fFdv+inmPc+7qga7GEXXUqwJWsByMfpNFYz/clTJebPyrpBVvDU50mPmPCIY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864020; c=relaxed/simple; bh=flmggBNU2hAB08i914C/deY3qRX3vSvGh6Sj4w2rzFg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rsy94ng/PlTepeRuykHFkjilDkVuQXLyjvXA1ihIZ1cfmqCXnuredAIQiTo/8GTsnj0ALx6450aUy8PrudL+L7DtXdTXHnyYRHlCVM8HGW3jnpjCiTQnzL3bUlQ9VboWVr6jQJiiszfZwEBysUpFB6qxzdXXGoi+08zuAQ22P+4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=Xz9NOVdi; arc=none smtp.client-ip=209.85.222.225 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="Xz9NOVdi" Received: by mail-qk1-f225.google.com with SMTP id af79cd13be357-8b6691baa33so46136485a.1 for ; Thu, 08 Jan 2026 01:20:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863997; x=1768468797; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MRGJRe3q+wC2wVKVj2Ep1iCX4dbPSkat0FX8kDkrXQw=; b=Xz9NOVdio8N5vlCIeelxt/+gpPfk4GskIpVNJI8ic8pEETiJyupVj9IT4vpWoe8Nim VrqcC01Yo9lc9Hn1lArx5LZ4Mt68i4aL4TqOD+mskl/fQ99Fc7YUINONG14NzHlwKaSM nxzI02XE6VDVgdg8wqU39NFNcCWzLkU+Xew7UAyvg2ftU3BElXuk0SAgJJ9djd7FPJsT Ac5o+mVU0pbpBvLbq173WZJQd9jR0VipcWnlntNLR3yTR8C3smt9oRbiJ2j6cEiMJ3DA rrnDHI50Y7K2opkrik0Tm/ttaanXU0Sk9UIqzu790N1aKC76pSBo74x+j5w3tzz/8WMC WHUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863997; x=1768468797; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=MRGJRe3q+wC2wVKVj2Ep1iCX4dbPSkat0FX8kDkrXQw=; b=YU0Ry5FrmVkrvhpv/4JyzfOnVhHhS20S9psr2dvWm4g6oxb3vI+cm4DXambGlqdC4Y 63QW+FjtqhCBZC7IJAVEJzxdQfpDyEqZi0h0KCsqV8R88PfAflk+Tprr+6PIPOThSFCV jS/wLD4IhVtF9TigdsURhxlAO0vMiSQ8P8yZDRnk+y57Nr36MfxYQ4gU07UPGTY+VcT6 ukxRLfU2l+7GCml2bThLTAGTohe2S+qE3S6/Bfq54DH36HdhjqLShnqoyiwG4oeWOsrA 9XEf/HvMRWl06mz9g3ukIY5BhSK7aCYqcuhsczJjvK0eYT2mBa6kCE8mzXQuqyyB60+t wKfw== X-Forwarded-Encrypted: i=1; AJvYcCUB0E+CdwyaaYI4y15ipL4/NkW8b4FCc44k9ScPv5vwYXdebe2HzGNg7aiB+gx46sdkSpjbyzvIb2fHw90=@vger.kernel.org X-Gm-Message-State: AOJu0YyQOAuKx2DgBi7IAfajVl+V+KTC5g3oTQfXUYWcQKPbnOzfRnq5 ylTJIyXeRTzgV1gNm+kvH8GPEWvoHyEHSTZCheAwbTZV6eW4mKKs9PZlAIfMrv/SyvJo+cuSAtg I3OOsHqR1KqqpXe/vElfFuPjJHWGPGqH4InIuB5MzbooEeKbzpHzS X-Gm-Gg: AY/fxX7ZM7fptcT3ggOhHa89dt/FGwZiHpD0zv9Jwh9/PoXQbaldNV/xEoPi+0EtH4k JWKwqYeNXLz0DX6WVu+kkhyq8NuuQiRX+Dw0F6ukfn5t8Lf8cG8v0FrZ1O0fZwg3T+WsR4np9sd 3FikaS3QGAmNDimcatFvtiVtsEka9CPPZ+5UZl3BIiJkXhgBoBFtGY/6/Do8BoHkI+fVtHBtPjE xpDdt/iiR6EbwXjSvwBxra98NX4QbKARtqA/zRKzfJYAFvip0/sMFihBcOQ9aIz2D+psnrp4qEj fKAOEYaePuSG/DXeDRz391BA8GLoUaHri9X73UdrjPb+hVOjc25dIIbBK3KN7buZyt6hQSDQYp0 /gEE6dmq8dncH0BUNSV7+i5bXEkc= X-Google-Smtp-Source: AGHT+IFZEqHTD1jRd6BPZWZ92EgtYzPKA4eYdLHsiPbwryg/dB7+Hp2FHML2KxtaKefC9IyFoEQAGq0IYNyQ X-Received: by 2002:a05:6214:19c6:b0:890:6330:97b9 with SMTP id 6a1803df08f44-89084184f5dmr61349676d6.2.1767863997313; Thu, 08 Jan 2026 01:19:57 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([2620:125:9017:12:36:3:5:0]) by smtp-relay.gmail.com with ESMTPS id 6a1803df08f44-890770a55bcsm9018466d6.10.2026.01.08.01.19.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:57 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id C6236342243; Thu, 8 Jan 2026 02:19:55 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id C0460E42F2C; Thu, 8 Jan 2026 02:19:55 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 05/19] ublk: split out ublk_copy_user_bvec() helper Date: Thu, 8 Jan 2026 02:19:33 -0700 Message-ID: <20260108091948.1099139-6-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Factor a helper function ublk_copy_user_bvec() out of ublk_copy_user_pages(). It will be used for copying integrity data too. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 52 +++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 7310d8761d2b..22e82bbf50ce 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -1005,10 +1005,39 @@ static const struct block_device_operations ub_fops= =3D { .open =3D ublk_open, .free_disk =3D ublk_free_disk, .report_zones =3D ublk_report_zones, }; =20 +static bool ublk_copy_user_bvec(const struct bio_vec *bv, unsigned *offset, + struct iov_iter *uiter, int dir, size_t *done) +{ + unsigned len; + void *bv_buf; + size_t copied; + + if (*offset >=3D bv->bv_len) { + *offset -=3D bv->bv_len; + return true; + } + + len =3D bv->bv_len - *offset; + bv_buf =3D kmap_local_page(bv->bv_page) + bv->bv_offset + *offset; + if (dir =3D=3D ITER_DEST) + copied =3D copy_to_iter(bv_buf, len, uiter); + else + copied =3D copy_from_iter(bv_buf, len, uiter); + + kunmap_local(bv_buf); + + *done +=3D copied; + if (copied < len) + return false; + + *offset =3D 0; + return true; +} + /* * Copy data between request pages and io_iter, and 'offset' * is the start point of linear offset of request. */ static size_t ublk_copy_user_pages(const struct request *req, @@ -1017,33 +1046,12 @@ static size_t ublk_copy_user_pages(const struct req= uest *req, struct req_iterator iter; struct bio_vec bv; size_t done =3D 0; =20 rq_for_each_segment(bv, req, iter) { - unsigned len; - void *bv_buf; - size_t copied; - - if (offset >=3D bv.bv_len) { - offset -=3D bv.bv_len; - continue; - } - - len =3D bv.bv_len - offset; - bv_buf =3D kmap_local_page(bv.bv_page) + bv.bv_offset + offset; - if (dir =3D=3D ITER_DEST) - copied =3D copy_to_iter(bv_buf, len, uiter); - else - copied =3D copy_from_iter(bv_buf, len, uiter); - - kunmap_local(bv_buf); - - done +=3D copied; - if (copied < len) + if (!ublk_copy_user_bvec(&bv, &offset, uiter, dir, &done)) break; - - offset =3D 0; } return done; } =20 static inline bool ublk_need_map_req(const struct request *req) --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-pl1-f228.google.com (mail-pl1-f228.google.com [209.85.214.228]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B4BDA42A59B for ; Thu, 8 Jan 2026 09:20:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.228 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864014; cv=none; b=jbud8sfgjer8iEhHOE7S1dv1ZCuhjbRH2+0QpmOIuY6J4xPIRkcx1m8OAQReIiE9RxRC7fsAN1Fz2s5r/7gWcWcsTQu4ayu4eH1uSbjC852WTSbnBTcWhHgK3bFgCSMZ/cBJ4i2iq8owXY/uWLP24/wOg0rng97RoF6In2QJUoI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864014; c=relaxed/simple; bh=MsJS7V6fpUg2zBKi42tVc5Ptl7uOMehQJ8c0G3rEClk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MPZnQ+M+gn7Kn1ZUiFIxCM4JYDELbU4QuBnXXbMLD7LrtwrGRmRNzGvNnb0+fARRZkw9KDHnW1PuQmRXeEiihk9EYBvUaN+2MNlhRudNWCgRSSeLaRESxAUYcEvSVF8hdsu2wqO2xUTO3jm8hFBq/MUhiABdX7/nsWeKZ7tXBYQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=EkrDFRFG; arc=none smtp.client-ip=209.85.214.228 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="EkrDFRFG" Received: by mail-pl1-f228.google.com with SMTP id d9443c01a7336-2a3e79fe2b8so3773205ad.1 for ; Thu, 08 Jan 2026 01:20:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863996; x=1768468796; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=jFGr8sSgizfUuX519DO/CGZxfXJRTiuzDWpoBuOhO+w=; b=EkrDFRFGn9vhCHGVI3o/5hs+jr8LHW4Lh/ZlqsU+vYvXaMHQM4/I2s1V491oX9chQz c7OT7DSmMA5FxEsON3BXFgp2/PED63gp2R9f1A8StaBRen3VXMPOMvWE2DQkRk/XllL/ LJaGgPo32q4/83kM8KWxyy6PlFRfvTsFtiFIDRyOJTiG/gtgvp01eNzdQXp2mn9hokpO ePocZKvn5l774pVIAeEW+q+TF9QI2ts9vibcAmyPxG2M7nKFOXalhHxNO63yV6zz6oKx ZmCgP6jYlnBfRs+RqQN0dMao1cfj3Ns4MlfVhHWdLThC77rC8TCbe+B3Jq7T33H7RsDn g9cQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863996; x=1768468796; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=jFGr8sSgizfUuX519DO/CGZxfXJRTiuzDWpoBuOhO+w=; b=WDda/eMU6/JAkkNnetQ/PvrKoLer7x5N9T9FZLI+7UqrRQ56VCC1rSMPszfrWTkITU D0ILxLqNBc8U3sYHd8hCXqDENtGuQK/QXnl9EpCeZkB8BEzcm4jhbC9B+kHP1T3OuwKI 5V0U2QzOYMXOMzSMQEVEWAV9lEb/Px/qopxl51d3a9AhTyXBTNopz7cIJc/rxkcr3K1M vj/jgScK5gK8sKWMheFqD/6zprMnYu6q7+WFwoS2LqU5S6R20DuUBmI2UVr9enDUvMHF JF1Lrf+p9EOCEyIzDDmbW/+ZQ2NI9g3r0iWiZx+RgtOdDtCf0h7s8Er4qddbynT2A1nC EHSQ== X-Forwarded-Encrypted: i=1; AJvYcCWQGjNUOcydoO0k9GxeRwfEdQ1e4dPsrb6BmXhfqVtWd49p/g8YQ7GdowmuTVakCnmxYSpuLowpDZb1hDk=@vger.kernel.org X-Gm-Message-State: AOJu0Yw2l1ycvuUFAo5Kf59gZVXkf/re7GrvD9kXMca6+qBc7nHbD+8f BjWXOmk4nWNkvthpfl7A3faoSgiwM/+CLktUjesu34ktDa8NrX1WU6pHJ9Gq8/9TgByGZm5Jots n8kvrJHrB3bD7tCL0/8uUw2ld0yO7v1Ljy7tQ X-Gm-Gg: AY/fxX4b5eTqkqbSp/jAYnEYxQPUkkn5tJBqE0/YIbEuyeEcPtWv/FuV3r7GZTYdjhj f/wZi41WDmdENKzp6XziY1jnt3rzavHAKCuBcWp12qccWAU4mpoUkxW/jHpiXcXBbNLd/S3crTJ Wa7zoGGYR7cVHtIz42cZmq0uMW9J5DegD92twjonNNBAkeq9S0xGBG6uwxRjZJwPbKozD6fcwMb f3cZqPN4TXxrd2FYsmCJz5CGqU3LI7ke6y5YzKApJNKky07LQp9qjWPYDwosCEf8qlQ5hqqf/nW 7Fvq3SmXiR2n+qZX61YK8WfNK+7XBbT9+rxtBMuLH139hPsgHi0iMuIuqYFkU9OKLRpI4ocDQ+V 2+Zi8vj3PqGH4ZCUsJwWdpQNM2rDwpWpOamqQjXxy9A== X-Google-Smtp-Source: AGHT+IGbE42kNiN9VAF9w3CyUfpY7emMMXpuu2bSY/RAho9b530kNluhzICcqsPKlkiWwq+LyOI3a5W7H8Xc X-Received: by 2002:a17:902:f78b:b0:298:9a1:88e8 with SMTP id d9443c01a7336-2a3ee4b33a5mr39639025ad.5.1767863996530; Thu, 08 Jan 2026 01:19:56 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2a3e3caea08sm8405455ad.32.2026.01.08.01.19.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:56 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id D97BE342258; Thu, 8 Jan 2026 02:19:55 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id D4409E42F2C; Thu, 8 Jan 2026 02:19:55 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 06/19] ublk: split out ublk_user_copy() helper Date: Thu, 8 Jan 2026 02:19:34 -0700 Message-ID: <20260108091948.1099139-7-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" ublk_ch_read_iter() and ublk_ch_write_iter() are nearly identical except for the iter direction. Split out a helper function ublk_user_copy() to reduce the code duplication as these functions are about to get larger. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 22e82bbf50ce..225372cca404 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -2700,42 +2700,36 @@ static struct request *ublk_check_and_get_req(struc= t kiocb *iocb, fail: ublk_put_req_ref(*io, req); return ERR_PTR(-EACCES); } =20 -static ssize_t ublk_ch_read_iter(struct kiocb *iocb, struct iov_iter *to) +static ssize_t +ublk_user_copy(struct kiocb *iocb, struct iov_iter *iter, int dir) { struct request *req; struct ublk_io *io; size_t buf_off; size_t ret; =20 - req =3D ublk_check_and_get_req(iocb, to, &buf_off, ITER_DEST, &io); + req =3D ublk_check_and_get_req(iocb, iter, &buf_off, dir, &io); if (IS_ERR(req)) return PTR_ERR(req); =20 - ret =3D ublk_copy_user_pages(req, buf_off, to, ITER_DEST); + ret =3D ublk_copy_user_pages(req, buf_off, iter, dir); ublk_put_req_ref(io, req); =20 return ret; } =20 -static ssize_t ublk_ch_write_iter(struct kiocb *iocb, struct iov_iter *fro= m) +static ssize_t ublk_ch_read_iter(struct kiocb *iocb, struct iov_iter *to) { - struct request *req; - struct ublk_io *io; - size_t buf_off; - size_t ret; - - req =3D ublk_check_and_get_req(iocb, from, &buf_off, ITER_SOURCE, &io); - if (IS_ERR(req)) - return PTR_ERR(req); - - ret =3D ublk_copy_user_pages(req, buf_off, from, ITER_SOURCE); - ublk_put_req_ref(io, req); + return ublk_user_copy(iocb, to, ITER_DEST); +} =20 - return ret; +static ssize_t ublk_ch_write_iter(struct kiocb *iocb, struct iov_iter *fro= m) +{ + return ublk_user_copy(iocb, from, ITER_SOURCE); } =20 static const struct file_operations ublk_ch_fops =3D { .owner =3D THIS_MODULE, .open =3D ublk_ch_open, --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-yw1-f226.google.com (mail-yw1-f226.google.com [209.85.128.226]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 04D6E42A120 for ; Thu, 8 Jan 2026 09:20:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.226 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864009; cv=none; b=pJROtx2AZbXn69ZIGiFAhbc/62D1BExZZFgjeRBFD9NbPWCjR7+m/2PsRfKfPfmPStiPYbBtgnKK9QPblTnUc8+LSHxLsOhh6ddBMJ8DS0qKDv1pjoMPaC9zzzqutw8+DJmLi8Zrhg9qbRvSomuJHaPV1ZHnRb/MwC27+NcxpoA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864009; c=relaxed/simple; bh=qzsJurzlV9hUfDVcU9i4OUZ+UejCEkO4N42HNf4MzXE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Z8MuCDh9Zdi5mjMHQpDKcKI/1vFjs8xs2IdbU7gmvwW+vqMwncqGY4BMqdIdfbjehHoVi77rxYSFgw8jfC+kCmGeECX/Qd4S2KSjUrIaINwofZ8ksM9NQFNkrHJT2OKxY6lWiazhQo/sKml+Nliy8Fi4zz58nnyItkG3lSzWmNU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=gdedlbDm; arc=none smtp.client-ip=209.85.128.226 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="gdedlbDm" Received: by mail-yw1-f226.google.com with SMTP id 00721157ae682-78fbdf850c5so2661617b3.1 for ; Thu, 08 Jan 2026 01:20:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863997; x=1768468797; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=w6L8O7VQPCwW+Dpp1xErYdb+ZqWEFO3CxWIIuwxx/go=; b=gdedlbDmLcnGcXRXTUXoeDKMeNhBU1TCRV+vaiEgEjD8Hrol+fzHIexiutYmEC3v+Z PrJSulAlOryNDCM/cKGdTcpfqGfG5GKrHklV1gaWN8WAe5Hd1LZp2vwpKccdJ2TX7N5k KEBe2MraMSZPxTozqBmcjrVNY7WAF8uqIDYOnOKHsFY4RVDoeuy0RjTzCgCy4MBwtw+q GDuy89KUYLhllfUo1fYjkS6oLPQjrW159iJaEl07C3KJrLsunty1X0Sii/kI9lR/pIdR bfN3ooeT5+DUMGn+zYXDZ6Q5LbSV9hYPwgx/lagNtJgoudECuITxjR7DYPDHYCSmu6Wt XSJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863997; x=1768468797; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=w6L8O7VQPCwW+Dpp1xErYdb+ZqWEFO3CxWIIuwxx/go=; b=MkTOPqVPoheGhpLUqd1DDFNcdkp9f8vkuCHxGkzTL9F5QHMhQKN6t+DeVqA9PtyLoR OwALn5FZqeyINKXCqtEVXNmYa2DsKJhE+g0PNFSlF9ioGengH3GhDKgdI/P2NIibWHVL Hs7VxzVjM6JlcTZsQwmfcXY0Vf6QDffkqR0ciL/HaKlBRKNGjhenAnt4WtCny3CLkwrz emaMx+1jpMDA0a7qIqLaHv6cF+BGnBEJqnPeATC76CeBCKyruhoCtgdaf6Qg6MNaG7oO TGL9L78W971K3z+pHGun6NkWHOhs43Or2W0+eEb9z8HIap8g4k34WJRTJqIyc6XV8mZ2 WSSg== X-Forwarded-Encrypted: i=1; AJvYcCXvaUAkhs2CnqE+n5JjaDJEUxFlBRPoDZYdRmuOdjr2Ir5SefaD+0FeNfVkc47xDpxQ8v4gNxa4rTI2fNo=@vger.kernel.org X-Gm-Message-State: AOJu0Ywt35jD9XmPn7WPx3qLw3avGEHSF6ZHWUP3PZVPSglGZUKCjAKi J4W3u/QyuBfnfbuBj/t4KGjg7zh/Sp+lCQjZwJC4Nfxr5hCXDPxJb5j1JcOBiQ6YsvndWnO9Jnj qOaYx06DR+ZBgzESSe+RDqYig1pFbTChH6JIy X-Gm-Gg: AY/fxX52Fqc0t+TuvQuVS5tVAMqM9ukg3Vl5OPSMd8rK/GLUtEqzivS7xb857Ei2UiM 2NLQw/uOMGIeoqk0Fv2882Ke9MceuCLAZzxQ+geyx3zrqgpNvcOKjdI80gNBV7Zz4/H0cW7LU/v langXws0KYRx7wtEqAMLqBRu1HEWjGxOq/BZGp5ymGHPCkcz1aaXWHz/286Y2uZxwIdoprRsn5E TO0NpfXq5T8+WFr9+tyAtuQs+isekRw8OD5oE6aNMZyKlKY7Le6GzKi/XdoBkcAiWk71FyJWtxL g2tvfDdbhe2PtCWtzXNDx3MPYP+xt+kVNbKrtIxkmlDpcIB3p1Fy0/mMseRU8eYRwtJQCC4hgML ekpL9jwe6NA9j30QxZbkTEYSSpdhpR7iK/63blNePtg== X-Google-Smtp-Source: AGHT+IGzstdvk99AUHsnHlUESoV5UXHeI/e7ommP+XsKGXPgaR0u1lkbQBwz8eafd13Iz7pLe/WMMqJtieFI X-Received: by 2002:a05:690c:fc8:b0:78f:c09e:9ad5 with SMTP id 00721157ae682-790b57caf50mr52170977b3.7.1767863996888; Thu, 08 Jan 2026 01:19:56 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id 00721157ae682-790aa563f37sm5687287b3.7.2026.01.08.01.19.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:56 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 0A113342170; Thu, 8 Jan 2026 02:19:56 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 04E81E42F2C; Thu, 8 Jan 2026 02:19:56 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 07/19] ublk: inline ublk_check_and_get_req() into ublk_user_copy() Date: Thu, 8 Jan 2026 02:19:35 -0700 Message-ID: <20260108091948.1099139-8-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" ublk_check_and_get_req() has a single callsite in ublk_user_copy(). It takes a ton of arguments in order to pass local variables from ublk_user_copy() to ublk_check_and_get_req() and vice versa. And more are about to be added. Combine the functions to reduce the argument passing noise. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 51 ++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 225372cca404..e7697dc4a812 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -2655,70 +2655,55 @@ static inline bool ublk_check_ubuf_dir(const struct= request *req, return true; =20 return false; } =20 -static struct request *ublk_check_and_get_req(struct kiocb *iocb, - struct iov_iter *iter, size_t *off, int dir, - struct ublk_io **io) +static ssize_t +ublk_user_copy(struct kiocb *iocb, struct iov_iter *iter, int dir) { struct ublk_device *ub =3D iocb->ki_filp->private_data; struct ublk_queue *ubq; struct request *req; + struct ublk_io *io; size_t buf_off; u16 tag, q_id; + ssize_t ret; =20 if (!user_backed_iter(iter)) - return ERR_PTR(-EACCES); + return -EACCES; =20 if (ub->dev_info.state =3D=3D UBLK_S_DEV_DEAD) - return ERR_PTR(-EACCES); + return -EACCES; =20 tag =3D ublk_pos_to_tag(iocb->ki_pos); q_id =3D ublk_pos_to_hwq(iocb->ki_pos); buf_off =3D ublk_pos_to_buf_off(iocb->ki_pos); =20 if (q_id >=3D ub->dev_info.nr_hw_queues) - return ERR_PTR(-EINVAL); + return -EINVAL; =20 ubq =3D ublk_get_queue(ub, q_id); if (!ublk_dev_support_user_copy(ub)) - return ERR_PTR(-EACCES); + return -EACCES; =20 if (tag >=3D ub->dev_info.queue_depth) - return ERR_PTR(-EINVAL); + return -EINVAL; =20 - *io =3D &ubq->ios[tag]; - req =3D __ublk_check_and_get_req(ub, q_id, tag, *io, buf_off); + io =3D &ubq->ios[tag]; + req =3D __ublk_check_and_get_req(ub, q_id, tag, io, buf_off); if (!req) - return ERR_PTR(-EINVAL); - - if (!ublk_check_ubuf_dir(req, dir)) - goto fail; - - *off =3D buf_off; - return req; -fail: - ublk_put_req_ref(*io, req); - return ERR_PTR(-EACCES); -} - -static ssize_t -ublk_user_copy(struct kiocb *iocb, struct iov_iter *iter, int dir) -{ - struct request *req; - struct ublk_io *io; - size_t buf_off; - size_t ret; + return -EINVAL; =20 - req =3D ublk_check_and_get_req(iocb, iter, &buf_off, dir, &io); - if (IS_ERR(req)) - return PTR_ERR(req); + if (!ublk_check_ubuf_dir(req, dir)) { + ret =3D -EACCES; + goto out; + } =20 ret =3D ublk_copy_user_pages(req, buf_off, iter, dir); - ublk_put_req_ref(io, req); =20 +out: + ublk_put_req_ref(io, req); return ret; } =20 static ssize_t ublk_ch_read_iter(struct kiocb *iocb, struct iov_iter *to) { --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-dl1-f97.google.com (mail-dl1-f97.google.com [74.125.82.97]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AD9A742A573 for ; Thu, 8 Jan 2026 09:20:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.97 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864008; cv=none; b=TiNfN2K8+scOmFuvqM8ujMerHSYV5zJIwDzveZWbX8vD9dIth8AFwPw4m6YJ2TqB8C2SggA9WFv48wrca9QiNyNE7qg4GOOl6YXgVnQd3HS1begXF4ESynlNFTQ1Gjc3/D6IrssaQvqAMHRLSMWnX0H3YRq1Pvh63bE+6Hb3nLw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864008; c=relaxed/simple; bh=z5UvEG7yIk3hIRSI6lWmN/+q3tRGUV7m3XtA/IVPt/s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hGrYUqw5Obctq9Y5WLOUuX9AQZ2Hvt8duD9TGN2/tAsOQ/044UsZQ8bPAFDLIfVQqYFrmMfoSUFllWdPiwWaypkYhJ73POL9P/FaOO1il4xSeDDP+dANa7uhkZQMqovVB4BVkmhNyLfT1/USxYJCJdsMSNeBU2zOF5by6cayzFU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=EWoHWW6h; arc=none smtp.client-ip=74.125.82.97 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="EWoHWW6h" Received: by mail-dl1-f97.google.com with SMTP id a92af1059eb24-11bba84006dso260265c88.2 for ; Thu, 08 Jan 2026 01:20:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863997; x=1768468797; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LRF9PTlw3a8gb0UkNXk8W27Ux0Z9UemKi8/DWwSUOqE=; b=EWoHWW6h9vLld1mamuXoTWA/yykQTXFUr95g8ZBBQlNZq8NIsqqIzJX5LlApm7h5AJ cNW8t34S3kMkqwFNeL5XG/TGbjYBXicaXCaUL4s2aODArbBBHkkgf9llh+lxOI8l6HGN dw/9XdRY5b/aIlXdQCGUdB8XB/Mws5i7NjOeAsHbQLN2ZRQ87CWvRgDGuDzViLLG0KCZ +ho0DmlCbw4ELLdJgovHSjXjZ0lRxXw2yr4Cp24lNcRpxb+KKIiVZJMsQNPr3ymkQ140 jLMOSqf8epTmGNyGkjXTdHhZC8cTW3w1gTkWh0UfKdjW288kvnpSHR2MGe0dUvDzTKlg Q+mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863997; x=1768468797; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=LRF9PTlw3a8gb0UkNXk8W27Ux0Z9UemKi8/DWwSUOqE=; b=NamuD7VNTB0YEs7p177Zq6/cfqwaABXoWiw92Kmg4FOBYH6XjGz6X+JpKhQ0vxsiNg 7TMr5RUxayTUXfoSdv7Sn0LUZ+qwDtNQQaY/zG7F7AZdMjD3t83DII11Q0OtMwewdm6m DJqqmq2Tbn1DYL2+vHi8J48DbJtWwIIEh9ataCh4LN5xRCC3aDyijn2QPF62JqpH1i8p /tJV5E0rRZQjmKWOmvus9Ab/agPYwQIUM6sA4C61CeXWVUH0mB+dQTkPpopGriGmk5Am gJOkPzUBPWSDjnwXdJVvDVsLeU/5jTfdtcyGE7s92fMO6L072MSojAjTp15hfR7tdObP nedg== X-Forwarded-Encrypted: i=1; AJvYcCWffgwMYvzVuGjmDQJucmaIkZFL0Ee7zGN4ZcXG4AySaYAIAusdsj5dEkfJs12kNf6zKuHK6FNZsi1mhYE=@vger.kernel.org X-Gm-Message-State: AOJu0YzdKYBHsZFRzw5ulssdrExp3hknL7zLtUZknhggukSQ/k4LOkGl KI7bTq9BHJLZosvOynp6Knx7CAMVVPYSSVV8id84KhU+OwDFmMmW5haqotq+w1pyz2CXOTQ1U0e EbBlgsFkPTUAjMaZht6+NWzkv3d0bozDYvzYue+dykSDDHAStzfLH X-Gm-Gg: AY/fxX4ZA8Eucqq7fuHrDaRCPmbAm6r9uV5tXPsI/z+1qQRYZsQgn8oW3Ay4FOK+pVH UBq/+Skc8InprEpKrviJsKcf924HlZUvoBidh2FOp6zNWtwclpAPGNMPXM+dzKhqEF3zx32ICkP TLd3QqFFUyG39gRgV4H6ibgiICAIEZLr03E+dUaRtnzdBTFARohuTtysJeTXEubySVHETIloHUN zes2vdxqTqxjNEq9IUuc512AwJU17r1j7n6uroAUssF4m5/XmKfRcT2rRY9FntiEYVWoDLlVdJ5 IXT5tMy0aUQPoJnQAIW7HialKbD0PLXXr0ednv0BCQC4/UdBMnSe4ydeLgeDxKx3exnDsVNOsOO Wws2ihxoRvbGsuTslf7hXUFTucxw= X-Google-Smtp-Source: AGHT+IF+tnZp1NPJYPMuToiP9g/0nFAnKouh8tNmhphYS8zUh1epFsXDHslCkoq5UuiMCq74MYJVWgq8pNzt X-Received: by 2002:a05:7022:f415:b0:119:e56b:46b6 with SMTP id a92af1059eb24-121f8a30d8emr2644521c88.0.1767863996644; Thu, 08 Jan 2026 01:19:56 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([2620:125:9017:12:36:3:5:0]) by smtp-relay.gmail.com with ESMTPS id a92af1059eb24-121f24966f5sm1633750c88.6.2026.01.08.01.19.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:56 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 31E5734225B; Thu, 8 Jan 2026 02:19:56 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 2C8F8E42F2C; Thu, 8 Jan 2026 02:19:56 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 08/19] ublk: move offset check out of __ublk_check_and_get_req() Date: Thu, 8 Jan 2026 02:19:36 -0700 Message-ID: <20260108091948.1099139-9-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" __ublk_check_and_get_req() checks that the passed in offset is within the data length of the specified ublk request. However, only user copy (ublk_check_and_get_req()) supports accessing ublk request data at a nonzero offset. Zero-copy buffer registration (ublk_register_io_buf()) always passes 0 for the offset, so the check is unnecessary. Move the check from __ublk_check_and_get_req() to ublk_check_and_get_req(). Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index e7697dc4a812..8eefb838b563 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -253,11 +253,11 @@ struct ublk_params_header { =20 static void ublk_io_release(void *priv); static void ublk_stop_dev_unlocked(struct ublk_device *ub); static void ublk_abort_queue(struct ublk_device *ub, struct ublk_queue *ub= q); static inline struct request *__ublk_check_and_get_req(struct ublk_device = *ub, - u16 q_id, u16 tag, struct ublk_io *io, size_t offset); + u16 q_id, u16 tag, struct ublk_io *io); static inline unsigned int ublk_req_build_flags(struct request *req); =20 static void ublk_partition_scan_work(struct work_struct *work) { struct ublk_device *ub =3D @@ -2288,11 +2288,11 @@ static int ublk_register_io_buf(struct io_uring_cmd= *cmd, int ret; =20 if (!ublk_dev_support_zero_copy(ub)) return -EINVAL; =20 - req =3D __ublk_check_and_get_req(ub, q_id, tag, io, 0); + req =3D __ublk_check_and_get_req(ub, q_id, tag, io); if (!req) return -EINVAL; =20 ret =3D io_buffer_register_bvec(cmd, req, ublk_io_release, index, issue_flags); @@ -2582,11 +2582,11 @@ static int ublk_ch_uring_cmd_local(struct io_uring_= cmd *cmd, __func__, cmd_op, tag, ret, io ? io->flags : 0); return ret; } =20 static inline struct request *__ublk_check_and_get_req(struct ublk_device = *ub, - u16 q_id, u16 tag, struct ublk_io *io, size_t offset) + u16 q_id, u16 tag, struct ublk_io *io) { struct request *req; =20 /* * can't use io->req in case of concurrent UBLK_IO_COMMIT_AND_FETCH_REQ, @@ -2603,13 +2603,10 @@ static inline struct request *__ublk_check_and_get_= req(struct ublk_device *ub, goto fail_put; =20 if (!ublk_rq_has_data(req)) goto fail_put; =20 - if (offset > blk_rq_bytes(req)) - goto fail_put; - return req; fail_put: ublk_put_req_ref(io, req); return NULL; } @@ -2687,14 +2684,19 @@ ublk_user_copy(struct kiocb *iocb, struct iov_iter = *iter, int dir) =20 if (tag >=3D ub->dev_info.queue_depth) return -EINVAL; =20 io =3D &ubq->ios[tag]; - req =3D __ublk_check_and_get_req(ub, q_id, tag, io, buf_off); + req =3D __ublk_check_and_get_req(ub, q_id, tag, io); if (!req) return -EINVAL; =20 + if (buf_off > blk_rq_bytes(req)) { + ret =3D -EINVAL; + goto out; + } + if (!ublk_check_ubuf_dir(req, dir)) { ret =3D -EACCES; goto out; } =20 --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-ot1-f98.google.com (mail-ot1-f98.google.com [209.85.210.98]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3091C42A801 for ; Thu, 8 Jan 2026 09:20:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.98 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864018; cv=none; b=gBGkvk7y0pgNbFmxNlZKaTSKWeLVAv9TtXHVNEqzXN/teeH1EkXfAudEAz5/NUeSerg2cBMebHntC7/FnyWc/ZcXxj10xRNkiI+ZFrURoHEsDa4yPh9/KBJZZh0q2D3xXhP0dzh6Qzrxvt4OHFRu4URhCN0PRS02+vtmRhSEBmo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864018; c=relaxed/simple; bh=PYR08W40/J30Uw4DWWLkIxEtDB9g/2yC7I4O3sJe70M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oQ8W6Ge0GGRyN1yYb+Pno37wSjyqNtJw9mGhM8pOxjZrNO1j1f6kie+yXFoZGbjE3d30WHGVkc+hRjbbxbrCPuWgLDFJUZCjLYyF9KHuRUXno0fVm7JFjp/jAGaf8Jcwpe4NnfS1EMRfu8tzRAU+dEF1hkmRf4E6VcbxzABikI4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=boc4zKjv; arc=none smtp.client-ip=209.85.210.98 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="boc4zKjv" Received: by mail-ot1-f98.google.com with SMTP id 46e09a7af769-7c7a85505c0so358043a34.1 for ; Thu, 08 Jan 2026 01:20:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863997; x=1768468797; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=K4dNygcFsf69pYwDfjtmZx9c023kPrtza431gN8HzKY=; b=boc4zKjvkMHuta2U4EDiWeexDCwJIurp42RW00t1OWQZQer/wDfZiJcfP/3hCzbWqq pYZLfFpqPQSrZxaMS4YlM4/dm2QdCUuU14Ya6/EBNL3rbSA6HGRrBP+JWCWzeUPAaCSk Y4e8xzPj1KlcAH68x+VSAO2SM1NC0Np6bwJdfaZm59hLsFwavEQnzG2xb2i+L1VWabYL rSJpJKwuLy+YVV/NoBX7DPw8T5c49x2lk1EVB/zdJiwq65pwRHhMFmsgUZ5U+6/WxkTy P/P4JX+ycz8ENLxFFCmlB3IhisVXn0RcdL74U9q9gKrTk5JhJgbF+DujMOY2bzmg2yTY PFVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863997; x=1768468797; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=K4dNygcFsf69pYwDfjtmZx9c023kPrtza431gN8HzKY=; b=awDI7bY90QxPT/ricWEbs9nYaa5HtBFN8bXagZ7zuwA4+8Z1Os1ZmQJAqBMFioEbN1 q6StBictIIdZz4KWHSh7tSiWBHtX441FMilgcvhIhc1u6bf/Tt4BYXW+YmpWqxSPE8+d nIF7/rWaEiuIPUMHkfCmzkBn8ZWj3n1yeAXjhJVDJdWp/uRsp40fCNqbimwUqXcyX452 JzLVUaSIji5GEU0GyUMevZVMvKQsXbCAI9hVQaAQ4Kt1zn4kRFkOq7L32/uBTADNYZ0s qF00vLEt6mBK6QaGVQt3PEQy2gVsVOS2j7rfx0UvjLMYkY78j9qfgsMVPvAKdYJlYojf FS1g== X-Forwarded-Encrypted: i=1; AJvYcCVO4iZNWBBycAXm8YlKycv2QKWambv+zhPSfGyKSpJGwopzMlSjVhXsz3Z31fpsMVKo42lQvSdBzcrFQ+A=@vger.kernel.org X-Gm-Message-State: AOJu0YwmcPHtsaIYNGhCwBm225OcU4TFBCFQi8aqJTCTROe/nxp8BL5f 8Cb3gcqKqjgsCEAVNMvOOIpcyGcLfZ0nmBgkevpgXY/FuhW8/SnN7cLTtcHROXnAD2CBPPRk0Ok lhEGG/rlXZe2lcjqrhjkio6ZvXahnF+IAfM2wUzkR1gPERcgMJIGD X-Gm-Gg: AY/fxX6VtuIebiZH35V5ypvlmYtpmiGtkl74OXSstBSrJhUHL3BfsOhgRyctwciJxyE uawTUWqwR2IMfL4aYney5aVbUaUA/c6p2RwCUSNtoDyQ5CUluv+w9CZB0ikW+eZ41ksMxTGvIgX cUnNEAOAI/98Tfo3I1vdPeVvkBD9AJLy/fEXXfIG+LgBIhnkwPscQ+Kf9rYMw3WXdl4nke4+lsv OjpQ6d2O7brpbiovL4QyiPfZgMVdUpXq4HLLOEdGGrhWCm9K2X0+R4ijl4MEG5xNfsFVM8TUQ4f Uw/joCWoowsWVaqEVEBT6/lbwoYvBkJwDnu9uBhwSCr/Cfi+WScyaalEjzoPJGymk1KsB7nKVaD oPGDUIVWXWR5hpMADWAJVjso+2eY= X-Google-Smtp-Source: AGHT+IE8vzIcJ7b2EVI6xioVR0YDv6im/CUXaHmBC9ImARUa6pNYVRq+Ibdc4NVSlMwz8Zi3/BhKwfIjNala X-Received: by 2002:a05:6830:4492:b0:7c7:6323:223d with SMTP id 46e09a7af769-7ce50bb15f2mr2379877a34.5.1767863997473; Thu, 08 Jan 2026 01:19:57 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([2620:125:9017:12:36:3:5:0]) by smtp-relay.gmail.com with ESMTPS id 46e09a7af769-7ce47632961sm984933a34.0.2026.01.08.01.19.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:57 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 563393400C1; Thu, 8 Jan 2026 02:19:56 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 50F93E42F2C; Thu, 8 Jan 2026 02:19:56 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 09/19] ublk: implement integrity user copy Date: Thu, 8 Jan 2026 02:19:37 -0700 Message-ID: <20260108091948.1099139-10-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Stanley Zhang Add a function ublk_copy_user_integrity() to copy integrity information between a request and a user iov_iter. This mirrors the existing ublk_copy_user_pages() but operates on request integrity data instead of regular data. Check UBLKSRV_IO_INTEGRITY_FLAG in iocb->ki_pos in ublk_user_copy() to choose between copying data or integrity data. Signed-off-by: Stanley Zhang [csander: change offset units from data bytes to integrity data bytes, fix CONFIG_BLK_DEV_INTEGRITY=3Dn build, rebase on user copy refactor] Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 53 +++++++++++++++++++++++++++++++++-- include/uapi/linux/ublk_cmd.h | 4 +++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 8eefb838b563..2a8a6a9c0281 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -1052,10 +1052,37 @@ static size_t ublk_copy_user_pages(const struct req= uest *req, break; } return done; } =20 +#ifdef CONFIG_BLK_DEV_INTEGRITY +static size_t ublk_copy_user_integrity(const struct request *req, + unsigned offset, struct iov_iter *uiter, int dir) +{ + size_t done =3D 0; + struct bio *bio =3D req->bio; + struct bvec_iter iter; + struct bio_vec iv; + + if (!blk_integrity_rq(req)) + return 0; + + bio_for_each_integrity_vec(iv, bio, iter) { + if (!ublk_copy_user_bvec(&iv, &offset, uiter, dir, &done)) + break; + } + + return done; +} +#else /* #ifdef CONFIG_BLK_DEV_INTEGRITY */ +static size_t ublk_copy_user_integrity(const struct request *req, + unsigned offset, struct iov_iter *uiter, int dir) +{ + return 0; +} +#endif /* #ifdef CONFIG_BLK_DEV_INTEGRITY */ + static inline bool ublk_need_map_req(const struct request *req) { return ublk_rq_has_data(req) && req_op(req) =3D=3D REQ_OP_WRITE; } =20 @@ -2659,10 +2686,12 @@ ublk_user_copy(struct kiocb *iocb, struct iov_iter = *iter, int dir) { struct ublk_device *ub =3D iocb->ki_filp->private_data; struct ublk_queue *ubq; struct request *req; struct ublk_io *io; + unsigned data_len; + bool is_integrity; size_t buf_off; u16 tag, q_id; ssize_t ret; =20 if (!user_backed_iter(iter)) @@ -2672,10 +2701,14 @@ ublk_user_copy(struct kiocb *iocb, struct iov_iter = *iter, int dir) return -EACCES; =20 tag =3D ublk_pos_to_tag(iocb->ki_pos); q_id =3D ublk_pos_to_hwq(iocb->ki_pos); buf_off =3D ublk_pos_to_buf_off(iocb->ki_pos); + is_integrity =3D !!(iocb->ki_pos & UBLKSRV_IO_INTEGRITY_FLAG); + + if (unlikely(!ublk_dev_support_integrity(ub) && is_integrity)) + return -EINVAL; =20 if (q_id >=3D ub->dev_info.nr_hw_queues) return -EINVAL; =20 ubq =3D ublk_get_queue(ub, q_id); @@ -2688,21 +2721,31 @@ ublk_user_copy(struct kiocb *iocb, struct iov_iter = *iter, int dir) io =3D &ubq->ios[tag]; req =3D __ublk_check_and_get_req(ub, q_id, tag, io); if (!req) return -EINVAL; =20 - if (buf_off > blk_rq_bytes(req)) { + if (is_integrity) { + struct blk_integrity *bi =3D &req->q->limits.integrity; + + data_len =3D bio_integrity_bytes(bi, blk_rq_sectors(req)); + } else { + data_len =3D blk_rq_bytes(req); + } + if (buf_off > data_len) { ret =3D -EINVAL; goto out; } =20 if (!ublk_check_ubuf_dir(req, dir)) { ret =3D -EACCES; goto out; } =20 - ret =3D ublk_copy_user_pages(req, buf_off, iter, dir); + if (is_integrity) + ret =3D ublk_copy_user_integrity(req, buf_off, iter, dir); + else + ret =3D ublk_copy_user_pages(req, buf_off, iter, dir); =20 out: ublk_put_req_ref(io, req); return ret; } @@ -3939,10 +3982,16 @@ static int __init ublk_init(void) { int ret; =20 BUILD_BUG_ON((u64)UBLKSRV_IO_BUF_OFFSET + UBLKSRV_IO_BUF_TOTAL_SIZE < UBLKSRV_IO_BUF_OFFSET); + /* + * Ensure UBLKSRV_IO_BUF_OFFSET + UBLKSRV_IO_BUF_TOTAL_SIZE + * doesn't overflow into UBLKSRV_IO_INTEGRITY_FLAG + */ + BUILD_BUG_ON(UBLKSRV_IO_BUF_OFFSET + UBLKSRV_IO_BUF_TOTAL_SIZE >=3D + UBLKSRV_IO_INTEGRITY_FLAG); BUILD_BUG_ON(sizeof(struct ublk_auto_buf_reg) !=3D 8); =20 init_waitqueue_head(&ublk_idr_wq); =20 ret =3D misc_register(&ublk_misc); diff --git a/include/uapi/linux/ublk_cmd.h b/include/uapi/linux/ublk_cmd.h index dfde4aee39eb..61ac5d8e1078 100644 --- a/include/uapi/linux/ublk_cmd.h +++ b/include/uapi/linux/ublk_cmd.h @@ -132,10 +132,14 @@ #define UBLK_MAX_NR_QUEUES (1U << UBLK_QID_BITS) =20 #define UBLKSRV_IO_BUF_TOTAL_BITS (UBLK_QID_OFF + UBLK_QID_BITS) #define UBLKSRV_IO_BUF_TOTAL_SIZE (1ULL << UBLKSRV_IO_BUF_TOTAL_BITS) =20 +/* Copy to/from request integrity buffer instead of data buffer */ +#define UBLK_INTEGRITY_FLAG_OFF 62 +#define UBLKSRV_IO_INTEGRITY_FLAG (1ULL << UBLK_INTEGRITY_FLAG_OFF) + /* * ublk server can register data buffers for incoming I/O requests with a = sparse * io_uring buffer table. The request buffer can then be used as the data = buffer * for io_uring operations via the fixed buffer index. * Note that the ublk server can never directly access the request data me= mory. --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-dl1-f100.google.com (mail-dl1-f100.google.com [74.125.82.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 264F842A13E for ; Thu, 8 Jan 2026 09:20:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864007; cv=none; b=Rk991WYl5mnbZ0xmvslXXwrMbB7zDtH4PqMvZzGTvmzRxa5AXpW5z+b6FLy+R79fDpnxOjF29r9fYJOyiVwFNC11SP93M6HS3UqXFwQocuSDGEsqeqjJ7uD1XMrPuPGNUzNEPoMb08XhrvCe4V/df8gjoV6f6kE+JJceEBoDFKU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864007; c=relaxed/simple; bh=DG8cT5egglUbcMbgq3vHZoCNJC5DKE2cmf1JYXKnNvI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NczHZlYYhajOhZyWvvB/14HOtw8xCA0XR3U9s4endK2IAs6Ant5p5Lg3rc/jhXI5wL0e5w/DzEjwGrnNlQZMrK5YPpWYcvHUh3gIQCBV2L2yrLPF8Cxylj8b1hNmFhy2TvH/i5O/AIu+wKyYi0FYJQ/qGQFo6+BNRPnpNX4AAe4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=N9ekjVxv; arc=none smtp.client-ip=74.125.82.100 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="N9ekjVxv" Received: by mail-dl1-f100.google.com with SMTP id a92af1059eb24-11f0d900dc4so102312c88.1 for ; Thu, 08 Jan 2026 01:20:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863997; x=1768468797; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gW9SsgZLsT56tsZ5FPzuxlQOX/d2/F2cU00tFSPwIi8=; b=N9ekjVxvI371zSTfO5zIZJIn21fYH8SVGNE2PKYBYMtPdIZIXBJqCBwIUm1OWWIYTu ykqjXURg0imrkLWLBEm3gXvLST+v9pvOYlIWbSJebYcEPM8BfqZSDnp1Ug/Yvm7eJdTI pB318qsLeH47gh5zKnT/SPMcL6TDIHFuG4K76+ECUSlHxMFBujJ6IwXCq33RwiyYuWuU HVuNlUW6BkHTpThlAGHR0gyhJhuKu/m0IE78RKGvjDUOuYAi7WyTsa6rqdC/2YNn2dfg ulVgbqyxbJ31xbEy98/TlbfzXQcIgsaIcwitywRJxp9dNbiachS+xSVVgNJ0B3rLDA+k WBmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863997; x=1768468797; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=gW9SsgZLsT56tsZ5FPzuxlQOX/d2/F2cU00tFSPwIi8=; b=hAgZVTIZRxDbW/hHupv0gDdOGVz9Vw5YQcmjVSeYKDtmtVGqhr8hx9emcSHlPcGSM9 eZWxl++P780eGIQ+skXh/Q3l2V3QD3Dt7UXJJMgTVUT8asBBjqAJQtcdvsvORLt5zr6P dJIC7/wKGVFHzo5iDOI7cHJ2wUoFdFW81LpMW7cw9fnb5oIMhhFI5YjLfhLYLlF3akhg /d/+sw8ln4S+6U3STK2nBy7RMEejEvgZDaODLLhrMWkcLdHU9TQXHLMKtPuYTzNOC9Kb 4bSH9wYPv8e/M3ZvwK6hIKfp6nOhZculdQRGdOEaAUiGBqp/Bwe8cxJeTzXqMNeDuNm6 ht7Q== X-Forwarded-Encrypted: i=1; AJvYcCUZ02GVIcYgZmCY3uSb7Y3PaT1L6JoDHkrrbRrrg2i7REgx0Zg0AHU/+p4i4zNS6kZ75CmnW662D8Gp5mg=@vger.kernel.org X-Gm-Message-State: AOJu0YzSOa9biO7qZF5irgSYcRGUdheJ966AUAag79iVTr9dUElg3Im3 NW2UwbaQ4WT+73tTrViFxfPFKwi9x3SBAdrq0nCGECdNXuIRsPhYUCnVUqeZ5V/m9Vdxs7o+RDH vlJrDX/v45PkSDU1jOZVR9PiLSBYg1k6zdg7U X-Gm-Gg: AY/fxX4uVEDNRdPybvaLxsHGaCo//MR2eB3FvkPjP+iIjjAKBBfyoaEoEMqA+puxXUx t9zFX3iud+0iCcOTRsecwHlnl0Q5x+1bvhWGC4f3oEm0RSAXuAiTaZ3UPYpI9lRVPfb9N0BKZeI HL54ORSqptAveXiYyZ5pzKFa6lJYCn8djpY0Ue1CkKCm4EzzAkMTGuHobKALBhzUnptZSpTPNqe 2TGlJ/GWnrFq7DcdsGLnQXjFZTZfAKw8j/FXCZw5QFZOFqcVCE1HREqHwfSnuGALcsUrBRTNHWp UjzYR1P0qQdM0hHb5Gwa/OwTxOhTvmtciBiZIuBq1anaPq29n7NtBE/2FKEe7Zki00TTmwojyqk MKkiL3OBVOf8/ld8qbrT/o54jkA5GFDfvKx8jeYYYkg== X-Google-Smtp-Source: AGHT+IE/kBJmAenA7OHV8bMZchiak2YgUNV0Jh2fIqSK7t7BrW+Oj0EwFqF849WShUKzill49TjNtmW2L7qy X-Received: by 2002:a05:7022:619c:b0:119:e55a:95a3 with SMTP id a92af1059eb24-121f8b92076mr2680115c88.5.1767863996918; Thu, 08 Jan 2026 01:19:56 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id a92af1059eb24-121f2489521sm1704761c88.3.2026.01.08.01.19.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:56 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 78FB63400F7; Thu, 8 Jan 2026 02:19:56 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 732EBE42F2C; Thu, 8 Jan 2026 02:19:56 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 10/19] ublk: support UBLK_F_INTEGRITY Date: Thu, 8 Jan 2026 02:19:38 -0700 Message-ID: <20260108091948.1099139-11-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Stanley Zhang Now that all the components of the ublk integrity feature have been implemented, add UBLK_F_INTEGRITY to UBLK_F_ALL, conditional on block layer integrity support (CONFIG_BLK_DEV_INTEGRITY). This allows ublk servers to create ublk devices with UBLK_F_INTEGRITY set and UBLK_U_CMD_GET_FEATURES to report the feature as supported. Signed-off-by: Stanley Zhang [csander: make feature conditional on CONFIG_BLK_DEV_INTEGRITY] Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 2a8a6a9c0281..08674c29cfdc 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -73,11 +73,12 @@ | UBLK_F_USER_RECOVERY_FAIL_IO \ | UBLK_F_UPDATE_SIZE \ | UBLK_F_AUTO_BUF_REG \ | UBLK_F_QUIESCE \ | UBLK_F_PER_IO_DAEMON \ - | UBLK_F_BUF_REG_OFF_DAEMON) + | UBLK_F_BUF_REG_OFF_DAEMON \ + | (IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY) ? UBLK_F_INTEGRITY : 0)) =20 #define UBLK_F_ALL_RECOVERY_FLAGS (UBLK_F_USER_RECOVERY \ | UBLK_F_USER_RECOVERY_REISSUE \ | UBLK_F_USER_RECOVERY_FAIL_IO) =20 --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-ua1-f98.google.com (mail-ua1-f98.google.com [209.85.222.98]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 289A142A569 for ; Thu, 8 Jan 2026 09:20:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.98 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864008; cv=none; b=Y2W8MGZqiZHe4NKeGAZ5q+W+hxp35T0l/+q96/8ikqiw/wLYpuWnKRM5KRCoDJXG7iEC1OIOaPVBjZd+U7PLwkrrzIaFb9hNJ0XFSSHprTsQboGuN0HgmcvReRKXPz8uwkWNqVJnj15gFChd+Eu5zWdus4/EDGLx6GvetfVQTDo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864008; c=relaxed/simple; bh=9D4GyOJD6io8F4P0S/cxnoZEefdej4J2wab8Tdm/MgA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=apaOFJr+rQL/pZNIxx8s7ExG70hktkIasfjAW4ItKHLr0XfVG4dquL6x9OEPTvFDsr27oTcgOk3CzbWO8u3IOwNTOjONBwAi37ux0aEa4e6mPWTsZPG5KLd0qBJj8D55bb2/1H6Nis8sl7qHGE30i8HJNrGNn/ILc1i/oEWurNU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=BcIVmSXN; arc=none smtp.client-ip=209.85.222.98 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="BcIVmSXN" Received: by mail-ua1-f98.google.com with SMTP id a1e0cc1a2514c-93f5d55ee5aso78786241.2 for ; Thu, 08 Jan 2026 01:19:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863998; x=1768468798; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kSXckNgZ5ICG+taX3/Ya5CBeOAwOb38yMX5qmoedbkY=; b=BcIVmSXNyUBaHeqL02EgOVuVHgT7hFyN4ONyCGynpvDOUNGAlqMOAuNgdEzSubchl2 iA3bWN8vPKJ93x/i7UxzgbDQpZ0+MyLxN/mu+bGpfX+ZrzJ0YGKbP7n5x1JuihVOZIlJ x9kiuiKw8nKvAdAOcHzOU1z4aIGpe9DV+m4rt9kjFi6GZMyPLlO9SlmnQjUijXBQ/Xyc yXAkb76JQeHsgsv9KBkyJfICtEuZQrU2YnZCIeTQOIgk6eoZqdkS1AZGFuvtY76M9tOd YTjd8E6K+HHR74L/fol9G1ga0L4b9BLwFkhBwG2Ma272rptcGqha452DJ2w7EDP2eMcJ BeCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863998; x=1768468798; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=kSXckNgZ5ICG+taX3/Ya5CBeOAwOb38yMX5qmoedbkY=; b=RU+OGT0ptJMg/jku5yMFzijTQ+A9u1x/AAe/suzlntp3ELJBNTJr5lTq9rMQTObPnC 2oVN/WE4dMe2q0N4nkDMR5gC6pttHmYWL4OrP1knoZK9ge92sAR6e3xr/96HWBUCk/lc Mux1fQZqC4H4YDPlYlbWZkwfEzsR3I/wY9TlIUwF82nPp2oYifWKcXX2VUpYGYPurJ3E JJeixF8pfdUbU301dieuh2YR1H+g6De+1DAw7B5iu3K8ViYsi2zec+Lh+kUA27xIkfev FZEzVBGnCT914uiyPF61PhtJC2CuxSq1orCTbIvQAVk1UhWzKUgCIMrMlQ5peIFOPJkh H/cg== X-Forwarded-Encrypted: i=1; AJvYcCVHICO1wNGItk/qkNg93cNGqwmA4PVl869+E3F/TsJj9WUZmSXqfBVfZpnx1SIw5NtBAr51PenBReecAeY=@vger.kernel.org X-Gm-Message-State: AOJu0YypJdY1LIyyO2OcpCSiltYB1kH7b06KZSb0e+oo6yivd5OfJROP 7FvnBcayh5bM26BPa50KTn0CxWfk7lQGmEpwNePP3CCHWEUvSC2acKdJTtdfJTurUrSlmVhXztW LkwszYL13jJRnLVAplr1ZEPTCnFRAZGwFyKg7 X-Gm-Gg: AY/fxX68s8x3zpurlyQQSlBB1XQ8j43ZqT1CweIye6odLcOBPtnTyiIjeSX6mVE+q+c 8qTIqZ2TOkiYgZNldOc9KDyXLVZXGeoCtz+sg8WOBWI8AN5nDIJaolFdxd3+RsblQ9mwiYQIRgP 2ZUzzpT69CFRNnB1MgZANJRsUdi93ad7hrnnyviQIvBjdNheHbemxdOPXVTfQ7eNIhnO2c8idy/ yZysyfHxdYb6h4MCv4eYqEVcIKDMBFgT/7Se6qSDlv2JsG3jg5Z7JgO3lsoFwa6RStHFa2i2oFn /VyMl+styO0UUkgf3nyNO/L/JHSgvY8Tn2lTnxHUyq97tWjeTk6PSsZX5IMQlQRAb8bTt5QDRic KPkiwmERoAEZasbvukgjbzAw3diAqsgJO1ekKJJGuZA== X-Google-Smtp-Source: AGHT+IE7Ge1AcENQX9O/MS5JVNja68MmFbDGu7d8jgtYr1HGUxQVFEkLjbdXGKK42kA/Gk87KY6YQpwurEsq X-Received: by 2002:a67:e701:0:b0:5db:e851:9386 with SMTP id ada2fe7eead31-5ecb1e75d6amr1271152137.2.1767863997587; Thu, 08 Jan 2026 01:19:57 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id ada2fe7eead31-5ec76e62f92sm1109185137.0.2026.01.08.01.19.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:57 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 9BCE6340794; Thu, 8 Jan 2026 02:19:56 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 95F68E42F2C; Thu, 8 Jan 2026 02:19:56 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 11/19] ublk: optimize ublk_user_copy() on daemon task Date: Thu, 8 Jan 2026 02:19:39 -0700 Message-ID: <20260108091948.1099139-12-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" ublk user copy syscalls may be issued from any task, so they take a reference count on the struct ublk_io to check whether it is owned by the ublk server and prevent a concurrent UBLK_IO_COMMIT_AND_FETCH_REQ from completing the request. However, if the user copy syscall is issued on the io's daemon task, a concurrent UBLK_IO_COMMIT_AND_FETCH_REQ isn't possible, so the atomic reference count dance is unnecessary. Check for UBLK_IO_FLAG_OWNED_BY_SRV to ensure the request is dispatched to the sever and obtain the request from ublk_io's req field instead of looking it up on the tagset. Skip the reference count increment and decrement. Commit 8a8fe42d765b ("ublk: optimize UBLK_IO_REGISTER_IO_BUF on daemon task") made an analogous optimization for ublk zero copy buffer registration. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- drivers/block/ublk_drv.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 08674c29cfdc..707a74ab083a 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -181,11 +181,11 @@ struct ublk_io { /* * The number of uses of this I/O by the ublk server * if user copy or zero copy are enabled: * - UBLK_REFCOUNT_INIT from dispatch to the server * until UBLK_IO_COMMIT_AND_FETCH_REQ - * - 1 for each inflight ublk_ch_{read,write}_iter() call + * - 1 for each inflight ublk_ch_{read,write}_iter() call not on task * - 1 for each io_uring registered buffer not registered on task * The I/O can only be completed once all references are dropped. * User copy and buffer registration operations are only permitted * if the reference count is nonzero. */ @@ -2689,10 +2689,11 @@ ublk_user_copy(struct kiocb *iocb, struct iov_iter = *iter, int dir) struct ublk_queue *ubq; struct request *req; struct ublk_io *io; unsigned data_len; bool is_integrity; + bool on_daemon; size_t buf_off; u16 tag, q_id; ssize_t ret; =20 if (!user_backed_iter(iter)) @@ -2718,13 +2719,24 @@ ublk_user_copy(struct kiocb *iocb, struct iov_iter = *iter, int dir) =20 if (tag >=3D ub->dev_info.queue_depth) return -EINVAL; =20 io =3D &ubq->ios[tag]; - req =3D __ublk_check_and_get_req(ub, q_id, tag, io); - if (!req) - return -EINVAL; + on_daemon =3D current =3D=3D READ_ONCE(io->task); + if (on_daemon) { + /* On daemon, io can't be completed concurrently, so skip ref */ + if (!(io->flags & UBLK_IO_FLAG_OWNED_BY_SRV)) + return -EINVAL; + + req =3D io->req; + if (!ublk_rq_has_data(req)) + return -EINVAL; + } else { + req =3D __ublk_check_and_get_req(ub, q_id, tag, io); + if (!req) + return -EINVAL; + } =20 if (is_integrity) { struct blk_integrity *bi =3D &req->q->limits.integrity; =20 data_len =3D bio_integrity_bytes(bi, blk_rq_sectors(req)); @@ -2745,11 +2757,12 @@ ublk_user_copy(struct kiocb *iocb, struct iov_iter = *iter, int dir) ret =3D ublk_copy_user_integrity(req, buf_off, iter, dir); else ret =3D ublk_copy_user_pages(req, buf_off, iter, dir); =20 out: - ublk_put_req_ref(io, req); + if (!on_daemon) + ublk_put_req_ref(io, req); return ret; } =20 static ssize_t ublk_ch_read_iter(struct kiocb *iocb, struct iov_iter *to) { --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-qk1-f227.google.com (mail-qk1-f227.google.com [209.85.222.227]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B03F742A576 for ; Thu, 8 Jan 2026 09:20:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.227 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864008; cv=none; b=MhPG61dx0FPdx3WgMDoqrv2baJ8EH0neIbQfWAXQC3L2cCA7OWG9O6nK3JlqMskGZWYEry5hKR1u19igspgqoD/F3riBZzhW/j9td0Er5uq+0tt9YU/2CeX1xj0VMD+YN6gOEJadyQ1b52IaOj2/rsirYbdjlRKAu5KpUOgnKkk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864008; c=relaxed/simple; bh=PiJrliNo49PVFk6YqUqyrLpt/1vol3cyy/KFRXn0phY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Rr2poftnBZtBg/5QGL8xmSldLVGvenBue2I35+blwtyaTuYX9FlBwsm33BuVQymr8Bfi+uEjgUj2kjrSQIGCqISif2IDuaGas36VKwHOrLmELZDjwbNJKbk7shBphMl2KqhRde/K5ob9BPnNuhUhvz59/55AoRtRzqvpjTE0qyA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=T37dA/CC; arc=none smtp.client-ip=209.85.222.227 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="T37dA/CC" Received: by mail-qk1-f227.google.com with SMTP id af79cd13be357-8b1bb9c3c04so57632785a.3 for ; Thu, 08 Jan 2026 01:20:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863997; x=1768468797; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0gYSUwYEgMWI4Ieo19W+aEnMIj5tPHnMNxItk+xKc5E=; b=T37dA/CC6v9AjB+Bp+nyMQuX++L/kggGszYxm4Mb7NPwE6ksnRQYU3DPcyspF+Q43G Ty3u+lp6U3eDge3CEGLFnio2Jvhc3LkEa23SscN21rT6r/rptsagV7sSUlafhizddOep EoKlyh8vLl0jTMZjp9n3p3Be2irJAdD2A3GAq3Udz7pn+oHKodNXIbe6PZgKffpMe4HI FcGHxJIJVVBE3ImAZ5ATID7lM2yZxulzJnbDr1u5mAMbcYOHpD2T7kReGUm05tBOYbiO gdrgwihMsZ+VemNbfUDx+EE84mHI/bd7I2QhXkFrrSuOqMFF15FMIJr5KqwGyerfgNG0 C4yA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863997; x=1768468797; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=0gYSUwYEgMWI4Ieo19W+aEnMIj5tPHnMNxItk+xKc5E=; b=Ibpf/OKXlfCiSI/mkWLVaIoZ8lzBVUtGpzjpiLeCtFN9poEdJ4fz/FjCvo237pbKJL WaPb/p3UbvOn1MbXEtBsAbR1O6wjUGLP5oyNlFj1NPvR9GwcD9oRRsfoDwP6jdRSGeuM NnVajBQ1+mfPprVeER9LzY2bD/AtBzEX3OG/05uCHHop+xb5vKw6Vj/935xRgFozdqK5 Z3Ez/SrxHM/ykAbywWukMJkr2cWWc5foBdO2dI7b4NFfrfaBCBMdVhF/sR3O8ZSLgvQh tpIEECF4Us/FJr3CLKYZ3j2wI31ArUbFurQLVgXA52jiX76cXJO+MNqHgvi4EySqeW/Y iJmg== X-Forwarded-Encrypted: i=1; AJvYcCXWB4TwJZUvPpMXLtzRxh6Dv5kfIbwAXkEUnAcGV/MRIF7Ll7vRuRMHjM+y5B1B2QWso0EYK3cUF8apxY0=@vger.kernel.org X-Gm-Message-State: AOJu0YwEZqYnU6u98/2SiNMuIX+JVZonq8OExG0PVqXKQkm6ieNpcgrm 3vdE7OyUbOUhhZGshBHi0wImKdm5m2q0YWjG7aWenCYzdC1NTUpAWw5CsSpNeSmieqTY3M8zoR1 csb265JxCiyL5m59WMMxAiXGigaRgUbSMzJfi X-Gm-Gg: AY/fxX78LqCmhx/JNmKR1gx6i4JdNgv8FfXHJbRWnQUde14ZZj9qom4TGE5IF7AU48s UiBEr0JMXbWFLW9ikh0+Z0Fpuvg4IB6P1vPG72VawW0h1JwMNZKJjmnaGGDzzbtX2JADTfp/7dB MMT0e2/MwSRbFdOIJ4z+NakVxJuNwLMczhhHfr5J5/eEnQaSet5yQs09sJqFQ3J3Cvpko0epQTH vZ2jTiYIFc7ur8ipGAWyMsgtbpo8QKntWKcYj5beAHliGmsULISC1l4Jv6OPQydkN7JV0LYXbfo nkfH8xyAKmV2rQL8VPZxOotPMU+uBdaHx1VJF6jh/2YubNDkzlhpbGALtlsj9LkQcI6qQ+T+sf8 q/oKFH7wW2xDiy0b8heLkgRSrORDvc9H+Ydm8fN4IBg== X-Google-Smtp-Source: AGHT+IEK4gUUkQ77Hl6lEgaX0rnIgLGftUw30eNtSq2wguSWSJrTS5mtAVCSkVWAW8KZbMvlfdT+D1gYFTz5 X-Received: by 2002:a05:620a:370a:b0:8b2:1f04:f8b with SMTP id af79cd13be357-8c3893e7e43mr538957685a.6.1767863997610; Thu, 08 Jan 2026 01:19:57 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id 6a1803df08f44-89077093b36sm9310326d6.2.2026.01.08.01.19.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:57 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id BE3D5341DAF; Thu, 8 Jan 2026 02:19:56 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id B844EE42F2C; Thu, 8 Jan 2026 02:19:56 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 12/19] selftests: ublk: display UBLK_F_INTEGRITY support Date: Thu, 8 Jan 2026 02:19:40 -0700 Message-ID: <20260108091948.1099139-13-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add support for printing the UBLK_F_INTEGRITY feature flag in the human-readable kublk features output. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- tools/testing/selftests/ublk/kublk.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/testing/selftests/ublk/kublk.c b/tools/testing/selftests= /ublk/kublk.c index 185ba553686a..261095f19c93 100644 --- a/tools/testing/selftests/ublk/kublk.c +++ b/tools/testing/selftests/ublk/kublk.c @@ -1452,10 +1452,11 @@ static int cmd_dev_get_features(void) FEAT_NAME(UBLK_F_UPDATE_SIZE), FEAT_NAME(UBLK_F_AUTO_BUF_REG), FEAT_NAME(UBLK_F_QUIESCE), FEAT_NAME(UBLK_F_PER_IO_DAEMON), FEAT_NAME(UBLK_F_BUF_REG_OFF_DAEMON), + FEAT_NAME(UBLK_F_INTEGRITY), }; struct ublk_dev *dev; __u64 features =3D 0; int ret; =20 --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-ot1-f97.google.com (mail-ot1-f97.google.com [209.85.210.97]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 17D6042A135 for ; Thu, 8 Jan 2026 09:20:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.97 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864018; cv=none; b=gqWnCsRRnYNx6E7QYBWT2XOBtAbDfX5Wfa1Oh5Q5LJKYOnGWaa8ocok6VlGRwaccLbVBZWluciFGWh7uZ6oFuj3M6p0bRhreTyZw0Os9fqZAZFWQYI5PltVATKciFt6nu+QuCameREju6PSoY1nys2sMMOF6sgrTJjeThHEjDxI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864018; c=relaxed/simple; bh=9OzlcL0OMkkabAm5Bt97yjXJPRZ7G2AIrVYrMNNwlrY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fVzrEyP6qmHKQPF6Xh72uVTTmW9sOF0ESE3uc8VhpTEXyWWb6nl43gD9RfUkpWYICOjdg2G2955on+6E+ISXOZgUhZ9UX84gfUyFXe2OC8eOw1PcnhhDx4zEBdJrG03pekiqA/1rQVJgFHcM6Nmllh0jep+DaptaWmX7Ls3RYjY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=SrZ1Hv1q; arc=none smtp.client-ip=209.85.210.97 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="SrZ1Hv1q" Received: by mail-ot1-f97.google.com with SMTP id 46e09a7af769-7c914482db2so493321a34.3 for ; Thu, 08 Jan 2026 01:20:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863998; x=1768468798; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VUiKvIP8HCqd3i2lEOpd43ZYOvZAdiFALGFMxkbZ3Lg=; b=SrZ1Hv1qHYthTgwMEqzYS4jICA7jn9BHX9xFIFQ8APtlvxobZbpvzDkdlhH6K8548A A90m+jwNC1vuqW8z/e0yxJhrmkfifeHZzcHKTxIOKBJeAQ2FtZepRJELUl5Q1G7kh3Rd eRePO0cb/zgNRQH4l06WiJ4nt9Vtsv84YfAGZPRcaFt7N+D+y/GOtphLCXsZWUwCra24 B1sxlysGhVNeP81LlDxLH6Idt7hyIOLghscpCuuHakiap9gkED5ayQibw0eppeEX8sOI m0BrqV4uhbRpgXhVVFM4cqs16OQU55mDWuk8UI8bc1U84bZAU5UGdcPujf3lK3MsmHf7 Ts6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863998; x=1768468798; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=VUiKvIP8HCqd3i2lEOpd43ZYOvZAdiFALGFMxkbZ3Lg=; b=deR6fawpu/LU9h+Tqk8P5bf8bxoMX8rA1xT1w9UMSs9GY+XrLqz1oJ/FeLZd69HzWW skgutqC7UcQYAullydsc/qPB0L0w8A/+I0Te60W6WSQqfsQv9jvvCioduHTdpM5UOYvx 3+unkNmHeRFwefG5GWiZOFiNjpBLKXrcA7yUy/dmOwZbhx2xgSbwkYkqHf64FVUcus25 6+2/uCs5M8dMcINH8fS39sQfG4Pj8EgHoGDVz6phPGrhodmV6UwmAJmYuEYJDNexA2Lq fkV+IWJAPqCrd/RcbeAjucONsy1P5SbJmYMg0J6HlWNnkgAG8gCecp5t1WYF0McmWvSL ybfg== X-Forwarded-Encrypted: i=1; AJvYcCV0eBdGtpslZEV4kpytSuBdA45RXxhtabfV0fgdVeVD/VsTV8uR19fglhdfXsSIKbK7zadGcaYHnWk+S2U=@vger.kernel.org X-Gm-Message-State: AOJu0Yy31zHRn7y1Jf+ivUU7tgI4z3w12o0eXtN6CtuOrzGkfUSjdDYj 02ucONQbT2Ejr7eMEpUO4HsdlGDuvlhF/qDF3oaWg3held0SPHNhEkk0uF8SKG0Pb0ZDj0btmVR OvAX3DurKDKy4pljI+++cGTiD9bu4d2rFLwLNV4HKPgrwVYPOaTyq X-Gm-Gg: AY/fxX5lMrymCc7384dF3O+fMvtq89pZlD2UJS1MEwcbErzjE0g/3f+jG3ZPcDF61XR XhDVTccodAE2Lu96F5uaWSs8/07034KVOPCoY/wfiqOYU56VM2UiWTxutVf9u7cUj33Sn79GESA xlnYID9rc1spz4alFze8Mt/HDmSpkGWOn3o06DM1k8vKik2tSL5Mo/5q2J05WopPsRuGpPv39HS zYkU0CJQYF7lwbV4/9jHmOJ6WTBlLNI6I+N+PNiTm/CZpQAvFPw9X355mU3cupn9Q9uhaaeogux a7+xKtdHWyN1CoHR3LxMZfjLllVGVoqBmq5fQAtws5vwFYrzVCpfH9Dc1fS5eIYPobjQmZ+CxOB sceSxIoOsQobD2QL5utWbNCr7iSQ= X-Google-Smtp-Source: AGHT+IEMYn8qGLSHkK75uAAuzyF1tc5/kRXEa/H/RxheREPQOHr9VMCDWdd15D1Qh/+p630u8i3hRg7auOGU X-Received: by 2002:a05:6870:b3d6:b0:3e8:2323:867f with SMTP id 586e51a60fabf-3ffc094ee9emr1931424fac.2.1767863997870; Thu, 08 Jan 2026 01:19:57 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([2620:125:9017:12:36:3:5:0]) by smtp-relay.gmail.com with ESMTPS id 586e51a60fabf-3ffa4e3e739sm837429fac.7.2026.01.08.01.19.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:57 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id E12183421AE; Thu, 8 Jan 2026 02:19:56 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id DC198E42F2C; Thu, 8 Jan 2026 02:19:56 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 13/19] selftests: ublk: add utility to get block device metadata size Date: Thu, 8 Jan 2026 02:19:41 -0700 Message-ID: <20260108091948.1099139-14-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Some block device integrity parameters are available in sysfs, but others are only accessible using the FS_IOC_GETLBMD_CAP ioctl. Add a metadata_size utility program to print out the logical block metadata size, PI offset, and PI size within the metadata. Example output: $ metadata_size /dev/ublkb0 metadata_size: 64 pi_offset: 56 pi_tuple_size: 8 Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- tools/testing/selftests/ublk/Makefile | 5 +-- tools/testing/selftests/ublk/metadata_size.c | 36 ++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 tools/testing/selftests/ublk/metadata_size.c diff --git a/tools/testing/selftests/ublk/Makefile b/tools/testing/selftest= s/ublk/Makefile index 06ba6fde098d..351ac6438561 100644 --- a/tools/testing/selftests/ublk/Makefile +++ b/tools/testing/selftests/ublk/Makefile @@ -47,14 +47,15 @@ TEST_PROGS +=3D test_stress_03.sh TEST_PROGS +=3D test_stress_04.sh TEST_PROGS +=3D test_stress_05.sh TEST_PROGS +=3D test_stress_06.sh TEST_PROGS +=3D test_stress_07.sh =20 -TEST_GEN_PROGS_EXTENDED =3D kublk +TEST_GEN_PROGS_EXTENDED =3D kublk metadata_size +STANDALONE_UTILS :=3D metadata_size.c =20 LOCAL_HDRS +=3D $(wildcard *.h) include ../lib.mk =20 -$(TEST_GEN_PROGS_EXTENDED): $(wildcard *.c) +$(OUTPUT)/kublk: $(filter-out $(STANDALONE_UTILS),$(wildcard *.c)) =20 check: shellcheck -x -f gcc *.sh diff --git a/tools/testing/selftests/ublk/metadata_size.c b/tools/testing/s= elftests/ublk/metadata_size.c new file mode 100644 index 000000000000..76ecddf04d25 --- /dev/null +++ b/tools/testing/selftests/ublk/metadata_size.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + struct logical_block_metadata_cap cap =3D {}; + const char *filename; + int fd; + int result; + + if (argc !=3D 2) { + fprintf(stderr, "Usage: %s BLOCK_DEVICE\n", argv[0]); + return 1; + } + + filename =3D argv[1]; + fd =3D open(filename, O_RDONLY); + if (fd < 0) { + perror(filename); + return 1; + } + + result =3D ioctl(fd, FS_IOC_GETLBMD_CAP, &cap); + if (result < 0) { + perror("ioctl"); + return 1; + } + + printf("metadata_size: %u\n", cap.lbmd_size); + printf("pi_offset: %u\n", cap.lbmd_pi_offset); + printf("pi_tuple_size: %u\n", cap.lbmd_pi_size); + return 0; +} --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-pl1-f226.google.com (mail-pl1-f226.google.com [209.85.214.226]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D5A8F3BC4EF for ; Thu, 8 Jan 2026 09:20:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.226 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864016; cv=none; b=I9qW31U0OV+7kb593ZtMiNyDCwMt5R80Zj163Z4KevwwDGmlVIQM9GLAHkHtekPHrVT6PfAwaI86QP08TimGvCmO3FoAQl1qGYL3+Bt5UMsqX29BpyXXgmZLT4dPq8o2T0qTINlM/WhKIyeaqDAK2xbFZ6zY0SBInROa2vQNgo8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864016; c=relaxed/simple; bh=xgtyTxMZAaL9bjES1PaZTg5hebA/tNgiXa+iVHKOXrs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fC4Nf0SYbjZmjVvNAw0nFLFT7kLqZbOxmi5tPCuGlFVs2h4PWZ3wkGXqMb5ICMfvMAbTwILATWvObHPhsJrCIrpPtS5onU6oPh+blwCpwU5NH1NAv7BCoNGR6ygxOQ7VCfy6Qf4q6VVgR2lsCkHB/Zxtb7AGiF20c/PjovFOzfY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=adsC1LLB; arc=none smtp.client-ip=209.85.214.226 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="adsC1LLB" Received: by mail-pl1-f226.google.com with SMTP id d9443c01a7336-2a08ced9a36so2758485ad.2 for ; Thu, 08 Jan 2026 01:19:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863998; x=1768468798; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kN/zF2F9cM5nMNj7XE1NnSYPJWB5JTkF02bVLuO6a9M=; b=adsC1LLB/Q/kpUEjHcw+W/aXNysLn52Pvt6sln60NT69V2sgAn2xGf9qikLcROa10r 3RNLKhhttWTQ4v/hAAw1MZIq9xdOqP4ez1g4Yw2DL+28FvBbWX3kgxE3LAIu043KMo9Z oJQM+Pei7ku2uRAlkB7uvj25tGSfsnsVl7XvNkGbytMeEvazkGIE+6wbSkuNEhc4i/d3 3Kk7Uz7+zzTInL3nV03WZ27fQMfUH2lv55ZhyceapU3tX2k9QrdHPRIlPkSWctE5NTEh zRA+4rilPTMnR6bdHI8W7hJ9R1DN82PBHgAT9C8EnFdlCE4zfy1bqacSC+n/d4qxmWiK ENzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863998; x=1768468798; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=kN/zF2F9cM5nMNj7XE1NnSYPJWB5JTkF02bVLuO6a9M=; b=CaLdGQEXXpeSOZb1HqyCTVES9lmEAlOBvTKpCYXaAw5AswGmIWuiP1WjGJMKb5UX6n k/70DYlvcZx6uAOGPKm/i1YOSU7KMdK4fxWwUke+Lq1OMLmCV8QXEko2jo7Cg2Nx8mnB MFXs0v4K1oK4TBdEJdT7aMeBmZRx5zYkV6qiblqXXV3MrhaazE2H/TaLghKNVmHhMkgW 1TqjjlSgAdzjQDwk8i8PrnMXqQ7n5fLR9fJmNTgOFWerShamZC0JAlwesYpAIk48xkRb qsdPwVuLbM76bPdejxTZsl56BLn6mx6Zfk3FC0ub37eL1/zQ9Q4w8uqwyydkGKWEgnd3 MhjQ== X-Forwarded-Encrypted: i=1; AJvYcCU9bZVZ96gSYphbWduAZm2Z0P/FdrRfN7lyA5uXbARw9cvd4mhgaCo8CWoOpOSBdlPIrKCMj77ix1dR+mM=@vger.kernel.org X-Gm-Message-State: AOJu0YzSmlzG/MkSopL2CBc0Re8l8qVx7T2Cd5a4rZN/uqsOOIQZgeK/ jav+M15esUOuwJVr1PR89ElcR5RCxru01hvL7q+4p8G3FjyzLcx9bKrpE1IzkGDAdYlBoS03qEh TgYCU8KU7r4W2RoH8F2Q6K5GrygwAor71MSeD X-Gm-Gg: AY/fxX6UzfKBs2I5h+1rvSWkdaMib6oQLEps0hnoNa+fZ5Kik2wlwjdW24/I2BkLIVd Sx80deGas0Dy3FK3obvghNEapADxo0dgZjoafoVm8Qtd+qH7JxX9FOs8Bqw53DOc4vrbc7JebNR 9iQ7j1+51pJp8I1FYlp4364etqcqcNRxsi9g9EZFjaJWOaHtOUiQ2/Hs/tvxpPG0rPA1QEGfi+c /by+RZesok9t+bAK8eHgI+Bvr/qn9kJNUKCBTca5wKTi+Zs0V/IN1sB5OHlKYK0ikPjHDbmnBNa pO3rnT2wpiqVVNY8S+4RnFjK2HA/qaGDjZuXfBmWutJPG5EySNlDLOqYZ7Yiv5T/a4RVjio7e4g lakCOt3oZv8PB7pHYBMxFfqHgBdkZPQ+1wtyav0uyRg== X-Google-Smtp-Source: AGHT+IHQQkRqvfAKHBQgsu1wvJxxV6F/ICuG/z10KRJvZVXEgx1lCKlR4l/oITOrYacaeYrtlKP5LOIiajI8 X-Received: by 2002:a17:902:ce92:b0:2a0:8963:c13e with SMTP id d9443c01a7336-2a3ee4a834amr38900105ad.7.1767863997617; Thu, 08 Jan 2026 01:19:57 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2a3e3cc4c12sm8483385ad.45.2026.01.08.01.19.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:57 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 0EB2B342224; Thu, 8 Jan 2026 02:19:57 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 09A46E42F2C; Thu, 8 Jan 2026 02:19:57 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 14/19] selftests: ublk: add kublk support for integrity params Date: Thu, 8 Jan 2026 02:19:42 -0700 Message-ID: <20260108091948.1099139-15-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add integrity param command line arguments to kublk. Plumb these to struct ublk_params for the null and fault_inject targets, as they don't need to actually read or write the integrity data. Forbid the integrity params for loop or stripe until the integrity data copy is implemented. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- tools/testing/selftests/ublk/fault_inject.c | 1 + tools/testing/selftests/ublk/file_backed.c | 4 ++ tools/testing/selftests/ublk/kublk.c | 47 +++++++++++++++++++++ tools/testing/selftests/ublk/kublk.h | 21 +++++++++ tools/testing/selftests/ublk/null.c | 1 + tools/testing/selftests/ublk/stripe.c | 4 ++ 6 files changed, 78 insertions(+) diff --git a/tools/testing/selftests/ublk/fault_inject.c b/tools/testing/se= lftests/ublk/fault_inject.c index b227bd78b252..3b897f69c014 100644 --- a/tools/testing/selftests/ublk/fault_inject.c +++ b/tools/testing/selftests/ublk/fault_inject.c @@ -31,10 +31,11 @@ static int ublk_fault_inject_tgt_init(const struct dev_= ctx *ctx, .io_min_shift =3D 9, .max_sectors =3D info->max_io_buf_bytes >> 9, .dev_sectors =3D dev_size >> 9, }, }; + ublk_set_integrity_params(ctx, &dev->tgt.params); =20 dev->private_data =3D (void *)(unsigned long)(ctx->fault_inject.delay_us = * 1000); return 0; } =20 diff --git a/tools/testing/selftests/ublk/file_backed.c b/tools/testing/sel= ftests/ublk/file_backed.c index 269d5f124e06..c14ce6608696 100644 --- a/tools/testing/selftests/ublk/file_backed.c +++ b/tools/testing/selftests/ublk/file_backed.c @@ -156,10 +156,14 @@ static int ublk_loop_tgt_init(const struct dev_ctx *c= tx, struct ublk_dev *dev) =20 if (ctx->auto_zc_fallback) { ublk_err("%s: not support auto_zc_fallback\n", __func__); return -EINVAL; } + if (ctx->metadata_size) { + ublk_err("%s: integrity not supported\n", __func__); + return -EINVAL; + } =20 ret =3D backing_file_tgt_init(dev); if (ret) return ret; =20 diff --git a/tools/testing/selftests/ublk/kublk.c b/tools/testing/selftests= /ublk/kublk.c index 261095f19c93..48e1865b4875 100644 --- a/tools/testing/selftests/ublk/kublk.c +++ b/tools/testing/selftests/ublk/kublk.c @@ -1,10 +1,11 @@ /* SPDX-License-Identifier: MIT */ /* * Description: uring_cmd based ublk */ =20 +#include #include "kublk.h" =20 #define MAX_NR_TGT_ARG 64 =20 unsigned int ublk_dbg_mask =3D UBLK_LOG; @@ -1548,10 +1549,12 @@ static void __cmd_create_help(char *exe, bool recov= ery) printf("%s %s -t [null|loop|stripe|fault_inject] [-q nr_queues] [-d depth= ] [-n dev_id]\n", exe, recovery ? "recover" : "add"); printf("\t[--foreground] [--quiet] [-z] [--auto_zc] [--auto_zc_fallback] = [--debug_mask mask] [-r 0|1] [-g] [-u]\n"); printf("\t[-e 0|1 ] [-i 0|1] [--no_ublk_fixed_fd]\n"); printf("\t[--nthreads threads] [--per_io_tasks]\n"); + printf("\t[--integrity_capable] [--integrity_reftag] [--metadata_size SIZ= E] " + "[--pi_offset OFFSET] [--csum_type ip|t10dif|nvme] [--tag_size SIZE]\n"= ); printf("\t[target options] [backfile1] [backfile2] ...\n"); printf("\tdefault: nr_queues=3D2(max 32), depth=3D128(max 1024), dev_id= =3D-1(auto allocation)\n"); printf("\tdefault: nthreads=3Dnr_queues"); =20 for (i =3D 0; i < ARRAY_SIZE(tgt_ops_list); i++) { @@ -1611,20 +1614,27 @@ int main(int argc, char *argv[]) { "user_copy", 0, NULL, 'u'}, { "size", 1, NULL, 's'}, { "nthreads", 1, NULL, 0 }, { "per_io_tasks", 0, NULL, 0 }, { "no_ublk_fixed_fd", 0, NULL, 0 }, + { "integrity_capable", 0, NULL, 0 }, + { "integrity_reftag", 0, NULL, 0 }, + { "metadata_size", 1, NULL, 0 }, + { "pi_offset", 1, NULL, 0 }, + { "csum_type", 1, NULL, 0 }, + { "tag_size", 1, NULL, 0 }, { 0, 0, 0, 0 } }; const struct ublk_tgt_ops *ops =3D NULL; int option_idx, opt; const char *cmd =3D argv[1]; struct dev_ctx ctx =3D { .queue_depth =3D 128, .nr_hw_queues =3D 2, .dev_id =3D -1, .tgt_type =3D "unknown", + .csum_type =3D LBMD_PI_CSUM_NONE, }; int ret =3D -EINVAL, i; int tgt_argc =3D 1; char *tgt_argv[MAX_NR_TGT_ARG] =3D { NULL }; int value; @@ -1695,10 +1705,32 @@ int main(int argc, char *argv[]) ctx.nthreads =3D strtol(optarg, NULL, 10); if (!strcmp(longopts[option_idx].name, "per_io_tasks")) ctx.per_io_tasks =3D 1; if (!strcmp(longopts[option_idx].name, "no_ublk_fixed_fd")) ctx.no_ublk_fixed_fd =3D 1; + if (!strcmp(longopts[option_idx].name, "integrity_capable")) + ctx.integrity_flags |=3D LBMD_PI_CAP_INTEGRITY; + if (!strcmp(longopts[option_idx].name, "integrity_reftag")) + ctx.integrity_flags |=3D LBMD_PI_CAP_REFTAG; + if (!strcmp(longopts[option_idx].name, "metadata_size")) + ctx.metadata_size =3D strtoul(optarg, NULL, 0); + if (!strcmp(longopts[option_idx].name, "pi_offset")) + ctx.pi_offset =3D strtoul(optarg, NULL, 0); + if (!strcmp(longopts[option_idx].name, "csum_type")) { + if (!strcmp(optarg, "ip")) { + ctx.csum_type =3D LBMD_PI_CSUM_IP; + } else if (!strcmp(optarg, "t10dif")) { + ctx.csum_type =3D LBMD_PI_CSUM_CRC16_T10DIF; + } else if (!strcmp(optarg, "nvme")) { + ctx.csum_type =3D LBMD_PI_CSUM_CRC64_NVME; + } else { + ublk_err("invalid csum_type: %s\n", optarg); + return -EINVAL; + } + } + if (!strcmp(longopts[option_idx].name, "tag_size")) + ctx.tag_size =3D strtoul(optarg, NULL, 0); break; case '?': /* * target requires every option must have argument */ @@ -1737,10 +1769,25 @@ int main(int argc, char *argv[]) ctx.auto_zc_fallback > 1) { fprintf(stderr, "too many data copy modes specified\n"); return -EINVAL; } =20 + if (ctx.metadata_size) { + if (!(ctx.flags & UBLK_F_USER_COPY)) { + ublk_err("integrity requires user_copy\n"); + return -EINVAL; + } + + ctx.flags |=3D UBLK_F_INTEGRITY; + } else if (ctx.integrity_flags || + ctx.pi_offset || + ctx.csum_type !=3D LBMD_PI_CSUM_NONE || + ctx.tag_size) { + ublk_err("integrity parameters require metadata_size\n"); + return -EINVAL; + } + i =3D optind; while (i < argc && ctx.nr_files < MAX_BACK_FILES) { ctx.files[ctx.nr_files++] =3D argv[i++]; } =20 diff --git a/tools/testing/selftests/ublk/kublk.h b/tools/testing/selftests= /ublk/kublk.h index 8a83b90ec603..d00f2b465cdf 100644 --- a/tools/testing/selftests/ublk/kublk.h +++ b/tools/testing/selftests/ublk/kublk.h @@ -76,10 +76,15 @@ struct dev_ctx { unsigned int fg:1; unsigned int recovery:1; unsigned int auto_zc_fallback:1; unsigned int per_io_tasks:1; unsigned int no_ublk_fixed_fd:1; + __u32 integrity_flags; + __u8 metadata_size; + __u8 pi_offset; + __u8 csum_type; + __u8 tag_size; =20 int _evtfd; int _shmid; =20 /* built from shmem, only for ublk_dump_dev() */ @@ -200,10 +205,26 @@ struct ublk_dev { void *private_data; }; =20 extern int ublk_queue_io_cmd(struct ublk_thread *t, struct ublk_io *io); =20 +static inline void ublk_set_integrity_params(const struct dev_ctx *ctx, + struct ublk_params *params) +{ + if (!ctx->metadata_size) + return; + + params->types |=3D UBLK_PARAM_TYPE_INTEGRITY; + params->integrity =3D (struct ublk_param_integrity) { + .flags =3D ctx->integrity_flags, + .interval_exp =3D params->basic.logical_bs_shift, + .metadata_size =3D ctx->metadata_size, + .pi_offset =3D ctx->pi_offset, + .csum_type =3D ctx->csum_type, + .tag_size =3D ctx->tag_size, + }; +} =20 static inline int ublk_io_auto_zc_fallback(const struct ublksrv_io_desc *i= od) { return !!(iod->op_flags & UBLK_IO_F_NEED_REG_BUF); } diff --git a/tools/testing/selftests/ublk/null.c b/tools/testing/selftests/= ublk/null.c index 280043f6b689..3aa162f08476 100644 --- a/tools/testing/selftests/ublk/null.c +++ b/tools/testing/selftests/ublk/null.c @@ -34,10 +34,11 @@ static int ublk_null_tgt_init(const struct dev_ctx *ctx= , struct ublk_dev *dev) .seg_boundary_mask =3D 4095, .max_segment_size =3D 32 << 10, .max_segments =3D 32, }, }; + ublk_set_integrity_params(ctx, &dev->tgt.params); =20 if (info->flags & UBLK_F_SUPPORT_ZERO_COPY) dev->tgt.sq_depth =3D dev->tgt.cq_depth =3D 2 * info->queue_depth; return 0; } diff --git a/tools/testing/selftests/ublk/stripe.c b/tools/testing/selftest= s/ublk/stripe.c index fd412e1f01c0..d4aaf3351d71 100644 --- a/tools/testing/selftests/ublk/stripe.c +++ b/tools/testing/selftests/ublk/stripe.c @@ -296,10 +296,14 @@ static int ublk_stripe_tgt_init(const struct dev_ctx = *ctx, struct ublk_dev *dev) =20 if (ctx->auto_zc_fallback) { ublk_err("%s: not support auto_zc_fallback\n", __func__); return -EINVAL; } + if (ctx->metadata_size) { + ublk_err("%s: integrity not supported\n", __func__); + return -EINVAL; + } =20 if ((chunk_size & (chunk_size - 1)) || !chunk_size) { ublk_err("invalid chunk size %u\n", chunk_size); return -EINVAL; } --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-pl1-f225.google.com (mail-pl1-f225.google.com [209.85.214.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AF39142A593 for ; Thu, 8 Jan 2026 09:20:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864008; cv=none; b=JdCKMh3a+itNrbSeRrA8y9E/ZxSX4t2tQgAFYwL3qjoa8oNZTcBRHPBBs5iBjuUgz0QgemrkqWrkwgFXQvmZToji39nWPK1zfeNsL5ouDNELKSd4BFCAY3b2n4xKZqlLajARQskLVkv7PoIF+aEnakRkf7sPcQN3+DSQrQeDeLQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864008; c=relaxed/simple; bh=0KvuwatLuW/I7zN8Xl5wgxhrOel9MsjL8LNRUsvNxNw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eGaurAdvZaRH28yZHsoN4bMRNWsM4cVDafqJHsSUGpZOO4QNkybU6CAYvji4zHCw6ExPKSGtX8ZkKbjdZfSFkpPUrkfuqvF8pT0cS6+pwRlYRZyED03lF4Qc0qQ6PkVPRBA5gm/TwA9MWGdiNsHBWd/lrjJrUJA62WDUzhMA/04= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=CzLrUx/r; arc=none smtp.client-ip=209.85.214.225 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="CzLrUx/r" Received: by mail-pl1-f225.google.com with SMTP id d9443c01a7336-29f3018dfc3so8220655ad.0 for ; Thu, 08 Jan 2026 01:20:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863998; x=1768468798; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0ybe7DAurEBgUEb5ATlnDDYhL1vOoH3YzFdXhAKpi7Y=; b=CzLrUx/r8BEW6esZCx9fTsNpeACo73w6sEPZ+PbWJXG9/fBpgdGToiZD20moV7TQnu GESfx36XqY8OVKrh5soCVgpp3JdsJRaO+E4hvMQTdGL3IlKp+MYBX7Znd7ytCZlUmTmK g8bSBzdy1hBk/AzKF3u33QBHdO56aDQFCSIWC1J6RrdCeOTECHrl8kSiyzlycdeZEqoS 6vZetMb7mpCbgiIcPy99Qdj6xjMlpr7PWD6/mRf/1yA1F/oLhn7JRJVVwUdTy30Wyn4i WDridH8QNOlyZL8z2QaJvZ1SuVO3vdqD1UbE7retnh810CmyI9DQHQpLG+4LqWP33qyK Lg+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863998; x=1768468798; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=0ybe7DAurEBgUEb5ATlnDDYhL1vOoH3YzFdXhAKpi7Y=; b=RifejMHV1JBeN3ikrnVaVRadOrurFQBWHAxDlPmnh73eySOPyEiUZHJP+edUrt84FK PhOkO2aa4nzeb2RwL0ol21JbNGXeD0P83ulJ+sdR2UXOOmc6qpQastf4WCZnkdTyIXxZ irEG5BXWriSKUieXqPFNHdhz9JP4jLI38g13pX8jaRYjt9Fmu4KYI0LmXhYHNiqrN27o uvt+Y/AewPAOWSH46fzU8gJtv3mH0hEWCgYdEihMw30WCTi4CrHd9Jp9q5eplR2/hjOh O+0YMFTW1t17PO54kHUzSKLm6JfkWppn52gfTaAKbiUwP3Mq9UrzhxcS3kwV8MaV3e8C B5uQ== X-Forwarded-Encrypted: i=1; AJvYcCWWY/9n40XBKWZACcL9WmCRc+Lw69u7xyrONRHUMP6ZSXyHyBlTaatXdP+2IJ8Je8LW0FRn/Nkj/w2El6Y=@vger.kernel.org X-Gm-Message-State: AOJu0YwEniP5oi9KOkUsTb9g+WR+/3Ecui+OdwHgBHeSUml/DHEeCmSh 0kpKkLQtr+cv3ZJhGy2MSGWWtKiYY5lnJFDaDDjM8K2qdq5nd73IAnGVe3h9TlUntKAn6C1vcQl wlIVyBizZGl1itl1hFRTWq6xjI2m47XqYH4SQi3ojqOdWjf+8g/p8 X-Gm-Gg: AY/fxX5rYutMf2KljPuS9g6OAoV6x4cXZSyWurEbpXJhsfkDUuTEFHFaATr4f9vg+QL xjpeez0SYD8AGj+uTIHd1QNeddAuPk3o2YnH8aSUSOGGeGT1yNQTGoT1mSylQHi9bM0IvXhQQk+ EGpvD96zUWUZCiM6mbpxlgtwchSPhdU2vuJOleHM0N9YZ58+NLaVaUxunfbO+ktRyvWPIZ8eDIW b6YISJpJNk7qe66AEdTKZIuhG1HJbBrAhXBpZ8c5P5aZVx3FSod8Wo2OrXpXogESHzrhjqBYDix V7/ytfohijaUBtQsfEP+9nOpdGxrrydRlZeI9QiyQrENXEEGJqt8yhP3iUirHZg1H8U5rrQah0r spiP0Bd9pEPxdQFFjTVeFC37HdaQ= X-Google-Smtp-Source: AGHT+IEVMqSo3kvEwcOIuWZvH9ae6g25u5K+SRDpADhvLa404gSZpymGCaEKl2Gvp0ZLhh5WcAXX/U3TdyL+ X-Received: by 2002:a17:903:1988:b0:2a0:a484:6b86 with SMTP id d9443c01a7336-2a3ee4c13c9mr32066585ad.8.1767863997760; Thu, 08 Jan 2026 01:19:57 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([2620:125:9017:12:36:3:5:0]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2a3e3cae7d7sm8337595ad.36.2026.01.08.01.19.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:57 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 2EDF9342170; Thu, 8 Jan 2026 02:19:57 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 29FD4E42F2C; Thu, 8 Jan 2026 02:19:57 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 15/19] selftests: ublk: implement integrity user copy in kublk Date: Thu, 8 Jan 2026 02:19:43 -0700 Message-ID: <20260108091948.1099139-16-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If integrity data is enabled for kublk, allocate an integrity buffer for each I/O. Extend ublk_user_copy() to copy the integrity data between the ublk request and the integrity buffer if the ublksrv_io_desc indicates that the request has integrity data. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- tools/testing/selftests/ublk/kublk.c | 41 ++++++++++++++++++++++++---- tools/testing/selftests/ublk/kublk.h | 14 ++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/ublk/kublk.c b/tools/testing/selftests= /ublk/kublk.c index 48e1865b4875..d95937dd6167 100644 --- a/tools/testing/selftests/ublk/kublk.c +++ b/tools/testing/selftests/ublk/kublk.c @@ -414,12 +414,14 @@ static void ublk_queue_deinit(struct ublk_queue *q) int nr_ios =3D q->q_depth; =20 if (q->io_cmd_buf) munmap(q->io_cmd_buf, ublk_queue_cmd_buf_sz(q)); =20 - for (i =3D 0; i < nr_ios; i++) + for (i =3D 0; i < nr_ios; i++) { free(q->ios[i].buf_addr); + free(q->ios[i].integrity_buf); + } } =20 static void ublk_thread_deinit(struct ublk_thread *t) { io_uring_unregister_buffers(&t->ring); @@ -431,23 +433,25 @@ static void ublk_thread_deinit(struct ublk_thread *t) close(t->ring.ring_fd); t->ring.ring_fd =3D -1; } } =20 -static int ublk_queue_init(struct ublk_queue *q, unsigned long long extra_= flags) +static int ublk_queue_init(struct ublk_queue *q, unsigned long long extra_= flags, + __u8 metadata_size) { struct ublk_dev *dev =3D q->dev; int depth =3D dev->dev_info.queue_depth; int i; - int cmd_buf_size, io_buf_size; + int cmd_buf_size, io_buf_size, integrity_size; unsigned long off; =20 q->tgt_ops =3D dev->tgt.ops; q->flags =3D 0; q->q_depth =3D depth; q->flags =3D dev->dev_info.flags; q->flags |=3D extra_flags; + q->metadata_size =3D metadata_size; =20 /* Cache fd in queue for fast path access */ q->ublk_fd =3D dev->fds[0]; =20 cmd_buf_size =3D ublk_queue_cmd_buf_sz(q); @@ -459,15 +463,27 @@ static int ublk_queue_init(struct ublk_queue *q, unsi= gned long long extra_flags) q->dev->dev_info.dev_id, q->q_id); goto fail; } =20 io_buf_size =3D dev->dev_info.max_io_buf_bytes; + integrity_size =3D ublk_integrity_len(q, io_buf_size); for (i =3D 0; i < q->q_depth; i++) { q->ios[i].buf_addr =3D NULL; q->ios[i].flags =3D UBLKS_IO_NEED_FETCH_RQ | UBLKS_IO_FREE; q->ios[i].tag =3D i; =20 + if (integrity_size) { + q->ios[i].integrity_buf =3D malloc(integrity_size); + if (!q->ios[i].integrity_buf) { + ublk_err("ublk dev %d queue %d io %d malloc(%d) failed: %m\n", + dev->dev_info.dev_id, q->q_id, i, + integrity_size); + goto fail; + } + } + + if (ublk_queue_no_buf(q)) continue; =20 if (posix_memalign((void **)&q->ios[i].buf_addr, getpagesize(), io_buf_size)) { @@ -606,17 +622,17 @@ static void ublk_user_copy(const struct ublk_io *io, = __u8 match_ublk_op) const struct ublksrv_io_desc *iod =3D ublk_get_iod(q, io->tag); __u64 off =3D ublk_user_copy_offset(q->q_id, io->tag); __u8 ublk_op =3D ublksrv_get_op(iod); __u32 len =3D iod->nr_sectors << 9; void *addr =3D io->buf_addr; + ssize_t copied; =20 if (ublk_op !=3D match_ublk_op) return; =20 while (len) { __u32 copy_len =3D min(len, UBLK_USER_COPY_LEN); - ssize_t copied; =20 if (ublk_op =3D=3D UBLK_IO_OP_WRITE) copied =3D pread(q->ublk_fd, addr, copy_len, off); else if (ublk_op =3D=3D UBLK_IO_OP_READ) copied =3D pwrite(q->ublk_fd, addr, copy_len, off); @@ -625,10 +641,24 @@ static void ublk_user_copy(const struct ublk_io *io, = __u8 match_ublk_op) assert(copied =3D=3D (ssize_t)copy_len); addr +=3D copy_len; off +=3D copy_len; len -=3D copy_len; } + + if (!(iod->op_flags & UBLK_IO_F_INTEGRITY)) + return; + + len =3D ublk_integrity_len(q, iod->nr_sectors << 9); + off =3D ublk_user_copy_offset(q->q_id, io->tag); + off |=3D UBLKSRV_IO_INTEGRITY_FLAG; + if (ublk_op =3D=3D UBLK_IO_OP_WRITE) + copied =3D pread(q->ublk_fd, io->integrity_buf, len, off); + else if (ublk_op =3D=3D UBLK_IO_OP_READ) + copied =3D pwrite(q->ublk_fd, io->integrity_buf, len, off); + else + assert(0); + assert(copied =3D=3D (ssize_t)len); } =20 int ublk_queue_io_cmd(struct ublk_thread *t, struct ublk_io *io) { struct ublk_queue *q =3D ublk_io_to_queue(io); @@ -1011,11 +1041,12 @@ static int ublk_start_daemon(const struct dev_ctx *= ctx, struct ublk_dev *dev) =20 for (i =3D 0; i < dinfo->nr_hw_queues; i++) { dev->q[i].dev =3D dev; dev->q[i].q_id =3D i; =20 - ret =3D ublk_queue_init(&dev->q[i], extra_flags); + ret =3D ublk_queue_init(&dev->q[i], extra_flags, + ctx->metadata_size); if (ret) { ublk_err("ublk dev %d queue %d init queue failed\n", dinfo->dev_id, i); goto fail; } diff --git a/tools/testing/selftests/ublk/kublk.h b/tools/testing/selftests= /ublk/kublk.h index d00f2b465cdf..830b49a7716a 100644 --- a/tools/testing/selftests/ublk/kublk.h +++ b/tools/testing/selftests/ublk/kublk.h @@ -110,10 +110,11 @@ struct ublk_ctrl_cmd_data { __u32 len; }; =20 struct ublk_io { char *buf_addr; + void *integrity_buf; =20 #define UBLKS_IO_NEED_FETCH_RQ (1UL << 0) #define UBLKS_IO_NEED_COMMIT_RQ_COMP (1UL << 1) #define UBLKS_IO_FREE (1UL << 2) #define UBLKS_IO_NEED_GET_DATA (1UL << 3) @@ -173,10 +174,11 @@ struct ublk_queue { /* borrow one bit of ublk uapi flags, which may never be used */ #define UBLKS_Q_AUTO_BUF_REG_FALLBACK (1ULL << 63) #define UBLKS_Q_NO_UBLK_FIXED_FD (1ULL << 62) __u64 flags; int ublk_fd; /* cached ublk char device fd */ + __u8 metadata_size; struct ublk_io ios[UBLK_QUEUE_DEPTH]; }; =20 struct ublk_thread { struct ublk_dev *dev; @@ -222,10 +224,22 @@ static inline void ublk_set_integrity_params(const st= ruct dev_ctx *ctx, .csum_type =3D ctx->csum_type, .tag_size =3D ctx->tag_size, }; } =20 +static inline size_t ublk_integrity_len(const struct ublk_queue *q, size_t= len) +{ + /* All targets currently use interval_exp =3D logical_bs_shift =3D 9 */ + return (len >> 9) * q->metadata_size; +} + +static inline size_t +ublk_integrity_data_len(const struct ublk_queue *q, size_t integrity_len) +{ + return (integrity_len / q->metadata_size) << 9; +} + static inline int ublk_io_auto_zc_fallback(const struct ublksrv_io_desc *i= od) { return !!(iod->op_flags & UBLK_IO_F_NEED_REG_BUF); } =20 --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-ot1-f100.google.com (mail-ot1-f100.google.com [209.85.210.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B08F642A578 for ; Thu, 8 Jan 2026 09:20:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864023; cv=none; b=C6A6iwNKjrdkHPVoJ/iVfzNIsiVOnYXu0CkkCu8JULmxRiQWXUPLsSN++MIyW4ig0D8vZmQKhK3+MNfK1Lkhq6ngjjzXlWDbOlNyRl0VB4AnKmExtih6125U14SSIHuJvIucU1MStBWYKqRNbhEulCaxQOH/VNOrBexzBoc2m1s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864023; c=relaxed/simple; bh=FpSk9SBO7a8fTola1zwsU8+516cI+0H9/8WbLKjGV0Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iY+QpL7zEnEjxVaF7pI7ISbeCejSjldjiyd0jpcVqSv92AGhSoYQXdU/UjJ+64HEjF7YtHdOH77CpHvu1v6v7zYxY+j4ZbXvBn9fSox64nuV4VwVf7WpKFe+sa2g8v2q3NI76iLZKmZ497XtPO35p950UX00ZQDxIyC4uw9ceg8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=fdnVn3xO; arc=none smtp.client-ip=209.85.210.100 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="fdnVn3xO" Received: by mail-ot1-f100.google.com with SMTP id 46e09a7af769-7c6c99ab031so373271a34.0 for ; Thu, 08 Jan 2026 01:20:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863998; x=1768468798; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zdwpGAzUowZ3h68lzOUG2hhVHWdUBrDTU/ZZOy1LyBQ=; b=fdnVn3xOzniOFrhulHPWBCbcV61TrJZr+RzhgBc8HuMpRWwcadBsxxCk6hmIbR0JF+ INKXdlqqbp6MTQKCKuQ3YTeBLBtrgH8wrkrNalFS76Zqq+bmZYvnr/rIYGviPfTijAix kbK6oELQp/Kn7w33QwWuyqAMAB0HvCGY/0yEElSoKdQqOqmDBRLt06IAg2shcPzLIyYB hzk8beGcLPwnURPiR2Ec6ADvnT20H4n10k+L6L/Lwa0e7r4XYXQ248w+VaLTtS1X1Dy6 w1f/rV5YyY354ft4wQz69spaGGJHKonLTv3FN3lsX5BVNKhtT8YqBHqmhqqpsBiuKual x3zA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863998; x=1768468798; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zdwpGAzUowZ3h68lzOUG2hhVHWdUBrDTU/ZZOy1LyBQ=; b=uK37G+q6PoDeZbJt9OtM7fL0x3cfmqxJZUf1ZWUqhBF5mvYFHRvGDUd7lmc2nK4J3m ZLqVtzxlAbCpATz1Q5AJtfSGtjYgPjhJMYHKU9gIPRpKyXfArJ/itBMZSvd0lTOzWacD MH2CHPBkJ3vTguA8q+tT2q2AKFLe4D05q0eVCr/5klbX+27beHYiFpAd1HBjZZ2PSRKc J3fTgG0y63zVRWP3vdRz5PLKkHcO4+MrR8gZbCbzRopaHWatFMFMLnWHI6lR/WZ8E2tH 6A3NO6NmN0tQj4dqWZu/Emqa6fAcmQwFL0wJa+0SsqUvNS5bj5AhbvE/5Jc1fBhtONc+ pYdQ== X-Forwarded-Encrypted: i=1; AJvYcCWtfu7SEw53+WHzrvAceoyA4qpYyVV/YWEEXFT1JWOLuCy8gQuaW8qR3eWgydShU8FJyX9AUHhZROzwGhY=@vger.kernel.org X-Gm-Message-State: AOJu0YzpLpmWl0K6vWDoysNCVOVSh88bWER64aVgoHt5nZtU2oKNvJzf 7J5h/nnIkKpeclqUuW5Zlgox0qOkcbgyaeyDF6dKZ7AUzCq/z8koRfGbrn9b7bE7x8TyChcbBaD DemELPjBkPCu9++BE8TJMrWyZG34PiMJqt3/+ X-Gm-Gg: AY/fxX7UPckZUQbnmep05GWqtGS45yOHEdNfq8LM1qTpQ/t2ZCZW6tdGvXeHNThWy4K TUI3rMSCjyflTEl85GzWKCXVU+ZSBd5jFteHcePhq6u+tzAvpm+aVk8LWn0yzrYCD25UMcrr6BP S1CJZKi8vfXK67ji7KjULG7Ql4ohEUVdtxEQRC1mh7QmNQmEIBw13XWtRt/QENsHe1bPtXkerxa pFptE4ooDqV0vjCvKI/nnBd2k9oeUc8dZ8NhwUw5TsTEk6TssFSmDTqo3EueipFGfQgZQQiAyLF /we0pkC2h67xkaTEkV+Xm6SvsBrkIQw/7W9hDb50ExhJWfxcI7riwjTBq78OQuqj8ETmYXP00R8 nPwKuyTNXADOBTy3a9f4xkVig5ChJ2WULTN0IJOCP+Q== X-Google-Smtp-Source: AGHT+IGUm/Iy1iheWFfw5eo3T3n1C7/QfcUR6biu7iVn+XpWzIDZiQTmzwOni9Bte3nRtpcuFZadeg9tZXhd X-Received: by 2002:a05:6870:32ce:b0:3ec:4e27:1f21 with SMTP id 586e51a60fabf-3ffc0c3c800mr2191144fac.8.1767863998371; Thu, 08 Jan 2026 01:19:58 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id 586e51a60fabf-3ffa508e961sm818826fac.14.2026.01.08.01.19.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:58 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 536BC3400F7; Thu, 8 Jan 2026 02:19:57 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 4E6DFE42F2C; Thu, 8 Jan 2026 02:19:57 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 16/19] selftests: ublk: support non-O_DIRECT backing files Date: Thu, 8 Jan 2026 02:19:44 -0700 Message-ID: <20260108091948.1099139-17-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" A subsequent commit will add support for using a backing file to store integrity data. Since integrity data is accessed in intervals of metadata_size, which may be much smaller than a logical block on the backing device, direct I/O cannot be used. Add an argument to backing_file_tgt_init() to specify the number of files to open for direct I/O. The remaining files will use buffered I/O. For now, continue to request direct I/O for all the files. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- tools/testing/selftests/ublk/common.c | 4 ++-- tools/testing/selftests/ublk/file_backed.c | 2 +- tools/testing/selftests/ublk/kublk.h | 2 +- tools/testing/selftests/ublk/stripe.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/ublk/common.c b/tools/testing/selftest= s/ublk/common.c index 01580a6f8519..d9873d4d50d0 100644 --- a/tools/testing/selftests/ublk/common.c +++ b/tools/testing/selftests/ublk/common.c @@ -10,11 +10,11 @@ void backing_file_tgt_deinit(struct ublk_dev *dev) fsync(dev->fds[i]); close(dev->fds[i]); } } =20 -int backing_file_tgt_init(struct ublk_dev *dev) +int backing_file_tgt_init(struct ublk_dev *dev, unsigned int nr_direct) { int fd, i; =20 assert(dev->nr_fds =3D=3D 1); =20 @@ -23,11 +23,11 @@ int backing_file_tgt_init(struct ublk_dev *dev) unsigned long bytes; struct stat st; =20 ublk_dbg(UBLK_DBG_DEV, "%s: file %d: %s\n", __func__, i, file); =20 - fd =3D open(file, O_RDWR | O_DIRECT); + fd =3D open(file, O_RDWR | (i < nr_direct ? O_DIRECT : 0)); if (fd < 0) { ublk_err("%s: backing file %s can't be opened: %s\n", __func__, file, strerror(errno)); return -EBADF; } diff --git a/tools/testing/selftests/ublk/file_backed.c b/tools/testing/sel= ftests/ublk/file_backed.c index c14ce6608696..db4c176a4f28 100644 --- a/tools/testing/selftests/ublk/file_backed.c +++ b/tools/testing/selftests/ublk/file_backed.c @@ -161,11 +161,11 @@ static int ublk_loop_tgt_init(const struct dev_ctx *c= tx, struct ublk_dev *dev) if (ctx->metadata_size) { ublk_err("%s: integrity not supported\n", __func__); return -EINVAL; } =20 - ret =3D backing_file_tgt_init(dev); + ret =3D backing_file_tgt_init(dev, 1); if (ret) return ret; =20 if (dev->tgt.nr_backing_files !=3D 1) return -EINVAL; diff --git a/tools/testing/selftests/ublk/kublk.h b/tools/testing/selftests= /ublk/kublk.h index 830b49a7716a..96c66b337bc0 100644 --- a/tools/testing/selftests/ublk/kublk.h +++ b/tools/testing/selftests/ublk/kublk.h @@ -460,8 +460,8 @@ extern const struct ublk_tgt_ops null_tgt_ops; extern const struct ublk_tgt_ops loop_tgt_ops; extern const struct ublk_tgt_ops stripe_tgt_ops; extern const struct ublk_tgt_ops fault_inject_tgt_ops; =20 void backing_file_tgt_deinit(struct ublk_dev *dev); -int backing_file_tgt_init(struct ublk_dev *dev); +int backing_file_tgt_init(struct ublk_dev *dev, unsigned int nr_direct); =20 #endif diff --git a/tools/testing/selftests/ublk/stripe.c b/tools/testing/selftest= s/ublk/stripe.c index d4aaf3351d71..2be1c36438e7 100644 --- a/tools/testing/selftests/ublk/stripe.c +++ b/tools/testing/selftests/ublk/stripe.c @@ -313,11 +313,11 @@ static int ublk_stripe_tgt_init(const struct dev_ctx = *ctx, struct ublk_dev *dev) return -EINVAL; } =20 chunk_shift =3D ilog2(chunk_size); =20 - ret =3D backing_file_tgt_init(dev); + ret =3D backing_file_tgt_init(dev, dev->tgt.nr_backing_files); if (ret) return ret; =20 if (!dev->tgt.nr_backing_files || dev->tgt.nr_backing_files > NR_STRIPE) return -EINVAL; --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-pl1-f225.google.com (mail-pl1-f225.google.com [209.85.214.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD06242A589 for ; Thu, 8 Jan 2026 09:20:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864024; cv=none; b=mNeossCJ8uM0ukZz/2CywpNGt1yZ+wAQAyHd3fETAWRQG7bREtHfzndMtvnjzJJGdI5GF+t5PV6OjfyL0IThAhF9EU25Q/NsUug5DuI/T/DrfGy0a/fv47wkHGKvRX3uxVhMxc2v+jswyU/6D+BsTYostSo7LIEbGjumn8zCZhc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864024; c=relaxed/simple; bh=1aDaPI2v4Zeo3O7crQSGBiyCnNWXJlIc6pmuFCCIr2A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MqZMYHdEO90TvGsjqPd4ZlFeXoYx4uQITce6pWOA6V3aW9JWjn/+1a6Fa/PSfWaIM6tXJOa0C5hGZbibD2bcNBdWFTQhJjNU5Koms9vFrYy0CZGjngTpJDyhfdwDgr6cAe6MSbZp2EMUujXRCJFjIVbFq+NF/rEo/2/o1Zb9Ha0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=MkaV3Y+5; arc=none smtp.client-ip=209.85.214.225 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="MkaV3Y+5" Received: by mail-pl1-f225.google.com with SMTP id d9443c01a7336-2a3051bc432so2656735ad.3 for ; Thu, 08 Jan 2026 01:20:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863998; x=1768468798; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UaTLRDW4Ok0YQzJQSdBnJS8VxZrTaE64GOqPLwd4Ilc=; b=MkaV3Y+53v5MSqIJ18b/X+HkU+ZUsCyvrP+tJLpAEDJaNnJ8dIv/Dwwr2E9pkl0HSp xx3OIIkflJbJYuNugqmNeylb8mfIAFHqsxGUxMypZ9hurizBOXOBCQVvcVHLuqYBqBNx eiMDXVeBTMFMX5kujBQBk7xBjyxx5+ghIi7TfbGC8+6PXL4SwYSHyW3YRI1J6OX+dxyy BdWBz0G/QZiB3j+ecgtX5TtUTa+z/FvgiW7nrrrK0vWmTCkQm94eXLdZVSwCXyic8Ozd wS1jLUkse8u7GFTeMq78QcJOkIji2JZbGlR5vD6z3KB0OqCNzNEW8qQE6s7EnCuywsXv keRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863998; x=1768468798; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=UaTLRDW4Ok0YQzJQSdBnJS8VxZrTaE64GOqPLwd4Ilc=; b=o/Et68ko0RMW21BKc7vNClvA/SY5lnDxSJHy9ZbTa+YkZA5xnkxEIR0D8osgcwOZ0N ShKaSXOpvtO9A6gr1lGiEZ68AFqrFKejs4g8B4nw9hvsBKh11jvSUihUXcmyeMLV9XJu Cio+eWFm5HAIdw47SU60+mCeR96Oxwqed4CYHORVE9nD7djus4YNTzPM+y0wzrHX9AXl b8O46cwwq5yiBNOmt3vkod7OqsrkqZY7K//gx44DmGATYyglUct/cUfYhpqCbEZApQoe OVqv2LE1IC+jDGs1Er6p5Pw14+hJXcNO42OIY9sy2EeVIVByEa4lQk1wfxIAJraFIIMS /70Q== X-Forwarded-Encrypted: i=1; AJvYcCXQHOtHr6cSgQbpc+C2ikQh5nbEZJ86NkG5P2k7C8Oo5htYlVIf1qhVLdOM4GvBuem6nS4HlIGMQTN+rkk=@vger.kernel.org X-Gm-Message-State: AOJu0Yz39qID3Jyp05fB+H0eRA0kg217SPAlJlBCMXYj6vWRni38rry9 wKVA6FmTgMAVDjX3XQIhjU0WtetP/78ZaxcMWIWDgSyjNxLa4fH60zbx9Trj4+rKba0STGl199j eRgN/nYQP9dfrk03t/kynDp8YoObY+juKtHV4RU8oPDVN7k9GUkjY X-Gm-Gg: AY/fxX47yyNFBxe+ycBnL2HCTOXw+3UgQWE0+kazpu/zfxYlmq2CJ2e5pv4rFWnD8D8 s/6g8xoGkSaxUdESw8DE1/bdXrnZWdqIN2cckgTAaNZ35I+CLoBQDhh7TAT1vSIvL/8skBB7nCg 4ur15HaoDpNwJg0ySl6XBEZLxodg18GQGb8d9tjDFBB9XBgH4nGRv7q22ez0T2MADE9+vPbNz9L DB6hfEx9l6bqbR0xtwIqtTMM0Qqp94wz+kwwacW3cXgosbb+dTs/uFSbeu/go4ohCsA9VZThmeb g8iOGjHB4431zhblmy0O65drWhMob2gkiEaSjo0omUW2dXduecll6DS5/jJC/lQqK/gYRH9fiUz gHDIP3HwHmYSAcku9yNtOUcX2pnw= X-Google-Smtp-Source: AGHT+IGYbi8ogzRt0rfT3w7cbk4NGI6oUYGnuR0yEq1AIRmedSlfeRJenAraivQu7TSxjwkdAacjLt1JQOC7 X-Received: by 2002:a17:902:ce03:b0:2a0:ccee:b356 with SMTP id d9443c01a7336-2a3ee4252f2mr39375565ad.1.1767863998032; Thu, 08 Jan 2026 01:19:58 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([2620:125:9017:12:36:3:5:0]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2a3e3cc4ab4sm8606025ad.44.2026.01.08.01.19.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:58 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 7767C34223B; Thu, 8 Jan 2026 02:19:57 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 72926E42F2C; Thu, 8 Jan 2026 02:19:57 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 17/19] selftests: ublk: add integrity data support to loop target Date: Thu, 8 Jan 2026 02:19:45 -0700 Message-ID: <20260108091948.1099139-18-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To perform and end-to-end test of integrity information through a ublk device, we need to actually store it somewhere and retrieve it. Add this support to kublk's loop target. It uses a second backing file for the integrity data corresponding to the data stored in the first file. The integrity file is initialized with byte 0xFF, which ensures the app and reference tags are set to the "escape" pattern to disable the bio-integrity-auto guard and reftag checks until the blocks are written. The integrity file is opened without O_DIRECT since it will be accessed at sub-block granularity. Each incoming read/write results in a pair of reads/writes, one to the data file, and one to the integrity file. If either backing I/O fails, the error is propagated to the ublk request. If both backing I/Os read/write some bytes, the ublk request is completed with the smaller of the number of blocks accessed by each I/O. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- tools/testing/selftests/ublk/file_backed.c | 92 +++++++++++++++++----- 1 file changed, 74 insertions(+), 18 deletions(-) diff --git a/tools/testing/selftests/ublk/file_backed.c b/tools/testing/sel= ftests/ublk/file_backed.c index db4c176a4f28..c3ce5ff72422 100644 --- a/tools/testing/selftests/ublk/file_backed.c +++ b/tools/testing/selftests/ublk/file_backed.c @@ -33,48 +33,62 @@ static int loop_queue_tgt_rw_io(struct ublk_thread *t, = struct ublk_queue *q, unsigned ublk_op =3D ublksrv_get_op(iod); unsigned zc =3D ublk_queue_use_zc(q); unsigned auto_zc =3D ublk_queue_use_auto_zc(q); enum io_uring_op op =3D ublk_to_uring_op(iod, zc | auto_zc); struct ublk_io *io =3D ublk_get_io(q, tag); + __u64 offset =3D iod->start_sector << 9; + __u32 len =3D iod->nr_sectors << 9; struct io_uring_sqe *sqe[3]; void *addr =3D io->buf_addr; =20 + if (iod->op_flags & UBLK_IO_F_INTEGRITY) { + ublk_io_alloc_sqes(t, sqe, 1); + /* Use second backing file for integrity data */ + io_uring_prep_rw(op, sqe[0], ublk_get_registered_fd(q, 2), + io->integrity_buf, + ublk_integrity_len(q, len), + ublk_integrity_len(q, offset)); + sqe[0]->flags =3D IOSQE_FIXED_FILE; + /* tgt_data =3D 1 indicates integrity I/O */ + sqe[0]->user_data =3D build_user_data(tag, ublk_op, 1, q->q_id, 1); + } + if (!zc || auto_zc) { ublk_io_alloc_sqes(t, sqe, 1); if (!sqe[0]) return -ENOMEM; =20 io_uring_prep_rw(op, sqe[0], ublk_get_registered_fd(q, 1) /*fds[1]*/, addr, - iod->nr_sectors << 9, - iod->start_sector << 9); + len, + offset); if (auto_zc) sqe[0]->buf_index =3D tag; io_uring_sqe_set_flags(sqe[0], IOSQE_FIXED_FILE); /* bit63 marks us as tgt io */ sqe[0]->user_data =3D build_user_data(tag, ublk_op, 0, q->q_id, 1); - return 1; + return !!(iod->op_flags & UBLK_IO_F_INTEGRITY) + 1; } =20 ublk_io_alloc_sqes(t, sqe, 3); =20 io_uring_prep_buf_register(sqe[0], q, tag, q->q_id, io->buf_index); sqe[0]->flags |=3D IOSQE_CQE_SKIP_SUCCESS | IOSQE_IO_HARDLINK; sqe[0]->user_data =3D build_user_data(tag, ublk_cmd_op_nr(sqe[0]->cmd_op), 0, q->q_id, 1); =20 io_uring_prep_rw(op, sqe[1], ublk_get_registered_fd(q, 1) /*fds[1]*/, 0, - iod->nr_sectors << 9, - iod->start_sector << 9); + len, + offset); sqe[1]->buf_index =3D tag; sqe[1]->flags |=3D IOSQE_FIXED_FILE | IOSQE_IO_HARDLINK; sqe[1]->user_data =3D build_user_data(tag, ublk_op, 0, q->q_id, 1); =20 io_uring_prep_buf_unregister(sqe[2], q, tag, q->q_id, io->buf_index); sqe[2]->user_data =3D build_user_data(tag, ublk_cmd_op_nr(sqe[2]->cmd_op)= , 0, q->q_id, 1); =20 - return 2; + return !!(iod->op_flags & UBLK_IO_F_INTEGRITY) + 2; } =20 static int loop_queue_tgt_io(struct ublk_thread *t, struct ublk_queue *q, = int tag) { const struct ublksrv_io_desc *iod =3D ublk_get_iod(q, tag); @@ -117,29 +131,55 @@ static void ublk_loop_io_done(struct ublk_thread *t, = struct ublk_queue *q, { unsigned tag =3D user_data_to_tag(cqe->user_data); unsigned op =3D user_data_to_op(cqe->user_data); struct ublk_io *io =3D ublk_get_io(q, tag); =20 - if (cqe->res < 0 || op !=3D ublk_cmd_op_nr(UBLK_U_IO_UNREGISTER_IO_BUF)) { - if (!io->result) - io->result =3D cqe->res; - if (cqe->res < 0) - ublk_err("%s: io failed op %x user_data %lx\n", - __func__, op, cqe->user_data); + if (cqe->res < 0) { + io->result =3D cqe->res; + ublk_err("%s: io failed op %x user_data %lx\n", + __func__, op, cqe->user_data); + } else if (op !=3D ublk_cmd_op_nr(UBLK_U_IO_UNREGISTER_IO_BUF)) { + __s32 data_len =3D user_data_to_tgt_data(cqe->user_data) + ? ublk_integrity_data_len(q, cqe->res) + : cqe->res; + + if (!io->result || data_len < io->result) + io->result =3D data_len; } =20 /* buffer register op is IOSQE_CQE_SKIP_SUCCESS */ if (op =3D=3D ublk_cmd_op_nr(UBLK_U_IO_REGISTER_IO_BUF)) io->tgt_ios +=3D 1; =20 if (ublk_completed_tgt_io(t, q, tag)) ublk_complete_io(t, q, tag, io->result); } =20 +static int ublk_loop_memset_file(int fd, __u8 byte, size_t len) +{ + off_t offset =3D 0; + __u8 buf[4096]; + + memset(buf, byte, sizeof(buf)); + while (len) { + int ret =3D pwrite(fd, buf, min(len, sizeof(buf)), offset); + + if (ret < 0) + return -errno; + if (!ret) + return -EIO; + + len -=3D ret; + offset +=3D ret; + } + return 0; +} + static int ublk_loop_tgt_init(const struct dev_ctx *ctx, struct ublk_dev *= dev) { unsigned long long bytes; + unsigned long blocks; int ret; struct ublk_params p =3D { .types =3D UBLK_PARAM_TYPE_BASIC | UBLK_PARAM_TYPE_DMA_ALIGN, .basic =3D { .attrs =3D UBLK_ATTR_VOLATILE_CACHE, @@ -152,27 +192,43 @@ static int ublk_loop_tgt_init(const struct dev_ctx *c= tx, struct ublk_dev *dev) .dma =3D { .alignment =3D 511, }, }; =20 + ublk_set_integrity_params(ctx, &p); if (ctx->auto_zc_fallback) { ublk_err("%s: not support auto_zc_fallback\n", __func__); return -EINVAL; } - if (ctx->metadata_size) { - ublk_err("%s: integrity not supported\n", __func__); - return -EINVAL; - } =20 + /* Use O_DIRECT only for data file */ ret =3D backing_file_tgt_init(dev, 1); if (ret) return ret; =20 - if (dev->tgt.nr_backing_files !=3D 1) + /* Expect a second file for integrity data */ + if (dev->tgt.nr_backing_files !=3D 1 + !!ctx->metadata_size) return -EINVAL; =20 - bytes =3D dev->tgt.backing_file_size[0]; + blocks =3D dev->tgt.backing_file_size[0] >> p.basic.logical_bs_shift; + if (ctx->metadata_size) { + unsigned long metadata_blocks =3D + dev->tgt.backing_file_size[1] / ctx->metadata_size; + unsigned long integrity_len; + + /* Ensure both data and integrity data fit in backing files */ + blocks =3D min(blocks, metadata_blocks); + integrity_len =3D blocks * ctx->metadata_size; + /* + * Initialize PI app tag and ref tag to 0xFF + * to disable bio-integrity-auto checks + */ + ret =3D ublk_loop_memset_file(dev->fds[2], 0xFF, integrity_len); + if (ret) + return ret; + } + bytes =3D blocks << p.basic.logical_bs_shift; dev->tgt.dev_size =3D bytes; p.basic.dev_sectors =3D bytes >> 9; dev->tgt.params =3D p; =20 return 0; --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-pl1-f225.google.com (mail-pl1-f225.google.com [209.85.214.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CE0E9387372 for ; Thu, 8 Jan 2026 09:20:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864018; cv=none; b=h66zfutD0FawycmDEnxSdwYbyuAtLP5+pTF8bRhqyxVhIMJlIGYMPxZGqq8oHmUBsWUUsu9ZdEQderjrE0juLIbpld5YoNZ3GCE61bvQyb4+SmieAwKgU6tO0uUSF+VPINY68pGpZ01Ez0OBBH4KBoaNxN3GQu0GF2Qw07EtXuE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864018; c=relaxed/simple; bh=vOb11bygwdDnihLmz2hie0djJNC8zDTOQroLKsSmtiw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UbXnRpVLywbDCSTVBtgQ4z7+BmNWqqLbiU/7ejTmWWL5fuJqFhwyynOy/dD/yOVFAvp92hDqedMi5q7mtlsRsrFM7pSoOAu/NbNE2Q0eGUEtAyh1XpxzQmtx5rZYtdOjcfC4lPb00s7FkZ5pMixW+7e/3O64xd81OQqG7z0QulE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=IBc6ctYd; arc=none smtp.client-ip=209.85.214.225 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="IBc6ctYd" Received: by mail-pl1-f225.google.com with SMTP id d9443c01a7336-2a0a8c2e822so6813005ad.1 for ; Thu, 08 Jan 2026 01:20:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863998; x=1768468798; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RuH+WT2G8DMpBK/C6txHhnJWirSb+AYnJG9ocyYmrqk=; b=IBc6ctYd8rGIX4CUjw6nO6JiTP4Ma4b781LErtFLo3UXVOleB4IFEgoeN8H4PrRM20 tSSAo0/eNUi1S3Q9cYTdZZJSDhSvD9zm7knsjwSkIwAGCQgQjB1/XLqC0raKGOPTBvMO 0Xdu01LtfgX1vXsC32zSIwrmLfvg9gCGj1pxqiAMuG39xRFxaavLuOXthjobiM7dD24e 0S+RVGxwd4LNDm5zZ91LDHqf8FCJUy8/n0jwgBz2wkU/uVivb9htvRut9GQ/Qxvky7LX skEapTup1u4a19NXVcprEjqbLd1IqZOvdg37UHnZ1YuJVOQ2uQVMJdhgZZ+HCKTXI4BZ mZfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863998; x=1768468798; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=RuH+WT2G8DMpBK/C6txHhnJWirSb+AYnJG9ocyYmrqk=; b=JUcBZPPDbBisZcjwtQelNKvjoU28kFZKfziLQOCGBFwY9ck83xjvm/eRHeI6yDhqcr MwgPpwSnB7amDn0br5giPtvLYIZUaVxBaR/Y0XByaObY2cPKmjhSDcFGnjDDJ1tl/Lrq sHIxRHX9Pn0a1w/Bvh7n2Z9FlBzWMlHNeLNnPlmm2jTBopkuUiXajqpdCeJ2joehGsCU SbPgP2C9v1V/IKTzmN7f9NOIdQKwT5KQgvHbHm7AMAAy0pdI9/PPWb7ZwDp2oSgosCXT LNYCWvQAuqjf12pwbJQLhqtbrocagGsqv7+SZBRAxh+sBod1wqeVam4nyKGYXc7i2x/+ uB6A== X-Forwarded-Encrypted: i=1; AJvYcCVNQVux9cCS64yb97jiG/Mn9L7IFbuFcvuf8wLs093AMgd2abvb95dg6DkgzDvhsGNDHB/6KmRkoE4BuWU=@vger.kernel.org X-Gm-Message-State: AOJu0YwKFRNnklbovzpxmR6nYaiNQefQt9ZMUJ+v0vnNq3Xmp33fSq1p +Hy9bO0tZBWF6SAnX/K9z0i3CyyQ15PPkvkyyOFv9fdQLaVI4MXJ81Y5zaxfSsG7gqpnX0af6NS ES8f2QUUws4AofFHD1X2f44cxXkEg+ErkQDrs X-Gm-Gg: AY/fxX7JGDl/ANrW5Cc7ZM7zHhb9/CQhxk/030f0QbIuQAFK2qHJvB9q6uEQDtcJgB5 whNps0FU/ZwtaKUT6tQGfbg8xipcxBOHb5GfoGLjk8lfysuB9pavoUBIaHwgkfqnwJ5R+iJwaDM 3eEmrGvemEwMHW7Qy6sevngH4xpFPeCJAi11qv0YUp9W+/W8xbXm9Fer7UBrU+QmVfvWN+RZ3nj swYqFitQwD+TOlictb7EtMsvnKF+EPz+vUKTqR+vHIb9a3P6Cgaxml9dg7cYS8uieY+c2C7Ao97 julMiXy51SnfGIDU15Dw8iaE9/EIE7NDOnCRDLw3Tz2SP0VeAP/66SLPaRxLaG2Hc4LmbnczXZy PYgbDFdnSI9U4x0lrgTEoLB8DDCLpt0k8T1zyG9Ep7w== X-Google-Smtp-Source: AGHT+IEOs/XOT44DOq1NFdbsydAaFizTaagYrcfoSn3FxRvh8uXLSCc6cYkvUq3oW7j65ZN/uciqSxH/t/me X-Received: by 2002:a17:902:f54e:b0:295:70b1:edd6 with SMTP id d9443c01a7336-2a3ee437ee2mr37881225ad.3.1767863998203; Thu, 08 Jan 2026 01:19:58 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2a3e3cae7f8sm8659355ad.38.2026.01.08.01.19.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:58 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id A172B3400C1; Thu, 8 Jan 2026 02:19:57 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 9BA4BE42F2C; Thu, 8 Jan 2026 02:19:57 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 18/19] selftests: ublk: add integrity params test Date: Thu, 8 Jan 2026 02:19:46 -0700 Message-ID: <20260108091948.1099139-19-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add test case null_04 to exercise all the different integrity params. It creates 4 different ublk devices with different combinations of integrity arguments and verifies their integrity limits via sysfs and the metadata_size utility. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- tools/testing/selftests/ublk/Makefile | 1 + tools/testing/selftests/ublk/test_common.sh | 10 ++ tools/testing/selftests/ublk/test_null_04.sh | 166 +++++++++++++++++++ 3 files changed, 177 insertions(+) create mode 100755 tools/testing/selftests/ublk/test_null_04.sh diff --git a/tools/testing/selftests/ublk/Makefile b/tools/testing/selftest= s/ublk/Makefile index 351ac6438561..239ad1c741ef 100644 --- a/tools/testing/selftests/ublk/Makefile +++ b/tools/testing/selftests/ublk/Makefile @@ -25,10 +25,11 @@ TEST_PROGS +=3D test_generic_14.sh TEST_PROGS +=3D test_generic_15.sh =20 TEST_PROGS +=3D test_null_01.sh TEST_PROGS +=3D test_null_02.sh TEST_PROGS +=3D test_null_03.sh +TEST_PROGS +=3D test_null_04.sh TEST_PROGS +=3D test_loop_01.sh TEST_PROGS +=3D test_loop_02.sh TEST_PROGS +=3D test_loop_03.sh TEST_PROGS +=3D test_loop_04.sh TEST_PROGS +=3D test_loop_05.sh diff --git a/tools/testing/selftests/ublk/test_common.sh b/tools/testing/se= lftests/ublk/test_common.sh index ea9a5f3eb70a..7ff6ce79d62c 100755 --- a/tools/testing/selftests/ublk/test_common.sh +++ b/tools/testing/selftests/ublk/test_common.sh @@ -382,10 +382,20 @@ run_io_and_recover() _ublk_test_top_dir() { cd "$(dirname "$0")" && pwd } =20 +METADATA_SIZE_PROG=3D"$(_ublk_test_top_dir)/metadata_size" + +_get_metadata_size() +{ + local dev_id=3D$1 + local field=3D$2 + + "$METADATA_SIZE_PROG" "/dev/ublkb$dev_id" | grep "$field" | grep -o "[0-9= ]*" +} + UBLK_PROG=3D$(_ublk_test_top_dir)/kublk UBLK_TEST_QUIET=3D1 UBLK_TEST_SHOW_RESULT=3D1 UBLK_BACKFILES=3D() export UBLK_PROG diff --git a/tools/testing/selftests/ublk/test_null_04.sh b/tools/testing/s= elftests/ublk/test_null_04.sh new file mode 100755 index 000000000000..0b0719ea33a3 --- /dev/null +++ b/tools/testing/selftests/ublk/test_null_04.sh @@ -0,0 +1,166 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh + +TID=3Dnull_04 + +_prep_test "null" "integrity params" + +dev_id=3D$(_add_ublk_dev -t null -u --metadata_size 8) +_check_add_dev $TID $? +metadata_size=3D$(_get_metadata_size "$dev_id" metadata_size) +if [ "$metadata_size" !=3D 8 ]; then + echo "metadata_size $metadata_size !=3D 8" + _show_result $TID 255 +fi +pi_offset=3D$(_get_metadata_size "$dev_id" pi_offset) +if [ "$pi_offset" !=3D 0 ]; then + echo "pi_offset $pi_offset !=3D 0" + _show_result $TID 255 +fi +pi_tuple_size=3D$(_get_metadata_size "$dev_id" pi_tuple_size) +if [ "$pi_tuple_size" !=3D 0 ]; then + echo "pi_tuple_size $pi_tuple_size !=3D 0" + _show_result $TID 255 +fi +capable=3D$(cat "/sys/block/ublkb$dev_id/integrity/device_is_integrity_cap= able") +if [ "$capable" !=3D 0 ]; then + echo "device_is_integrity_capable $capable !=3D 0" + _show_result $TID 255 +fi +format=3D$(cat "/sys/block/ublkb$dev_id/integrity/format") +if [ "$format" !=3D nop ]; then + echo "format $format !=3D nop" + _show_result $TID 255 +fi +protection_interval_bytes=3D$(cat "/sys/block/ublkb$dev_id/integrity/prote= ction_interval_bytes") +if [ "$protection_interval_bytes" !=3D 512 ]; then + echo "protection_interval_bytes $protection_interval_bytes !=3D 512" + _show_result $TID 255 +fi +tag_size=3D$(cat "/sys/block/ublkb$dev_id/integrity/tag_size") +if [ "$tag_size" !=3D 0 ]; then + echo "tag_size $tag_size !=3D 0" + _show_result $TID 255 +fi +_cleanup_test + +dev_id=3D$(_add_ublk_dev -t null -u --integrity_capable --metadata_size 64= --pi_offset 56 --csum_type ip) +_check_add_dev $TID $? +metadata_size=3D$(_get_metadata_size "$dev_id" metadata_size) +if [ "$metadata_size" !=3D 64 ]; then + echo "metadata_size $metadata_size !=3D 64" + _show_result $TID 255 +fi +pi_offset=3D$(_get_metadata_size "$dev_id" pi_offset) +if [ "$pi_offset" !=3D 56 ]; then + echo "pi_offset $pi_offset !=3D 56" + _show_result $TID 255 +fi +pi_tuple_size=3D$(_get_metadata_size "$dev_id" pi_tuple_size) +if [ "$pi_tuple_size" !=3D 8 ]; then + echo "pi_tuple_size $pi_tuple_size !=3D 8" + _show_result $TID 255 +fi +capable=3D$(cat "/sys/block/ublkb$dev_id/integrity/device_is_integrity_cap= able") +if [ "$capable" !=3D 1 ]; then + echo "device_is_integrity_capable $capable !=3D 1" + _show_result $TID 255 +fi +format=3D$(cat "/sys/block/ublkb$dev_id/integrity/format") +if [ "$format" !=3D T10-DIF-TYPE3-IP ]; then + echo "format $format !=3D T10-DIF-TYPE3-IP" + _show_result $TID 255 +fi +protection_interval_bytes=3D$(cat "/sys/block/ublkb$dev_id/integrity/prote= ction_interval_bytes") +if [ "$protection_interval_bytes" !=3D 512 ]; then + echo "protection_interval_bytes $protection_interval_bytes !=3D 512" + _show_result $TID 255 +fi +tag_size=3D$(cat "/sys/block/ublkb$dev_id/integrity/tag_size") +if [ "$tag_size" !=3D 0 ]; then + echo "tag_size $tag_size !=3D 0" + _show_result $TID 255 +fi +_cleanup_test + +dev_id=3D$(_add_ublk_dev -t null -u --integrity_reftag --metadata_size 8 -= -csum_type t10dif) +_check_add_dev $TID $? +metadata_size=3D$(_get_metadata_size "$dev_id" metadata_size) +if [ "$metadata_size" !=3D 8 ]; then + echo "metadata_size $metadata_size !=3D 8" + _show_result $TID 255 +fi +pi_offset=3D$(_get_metadata_size "$dev_id" pi_offset) +if [ "$pi_offset" !=3D 0 ]; then + echo "pi_offset $pi_offset !=3D 0" + _show_result $TID 255 +fi +pi_tuple_size=3D$(_get_metadata_size "$dev_id" pi_tuple_size) +if [ "$pi_tuple_size" !=3D 8 ]; then + echo "pi_tuple_size $pi_tuple_size !=3D 8" + _show_result $TID 255 +fi +capable=3D$(cat "/sys/block/ublkb$dev_id/integrity/device_is_integrity_cap= able") +if [ "$capable" !=3D 0 ]; then + echo "device_is_integrity_capable $capable !=3D 0" + _show_result $TID 255 +fi +format=3D$(cat "/sys/block/ublkb$dev_id/integrity/format") +if [ "$format" !=3D T10-DIF-TYPE1-CRC ]; then + echo "format $format !=3D T10-DIF-TYPE1-CRC" + _show_result $TID 255 +fi +protection_interval_bytes=3D$(cat "/sys/block/ublkb$dev_id/integrity/prote= ction_interval_bytes") +if [ "$protection_interval_bytes" !=3D 512 ]; then + echo "protection_interval_bytes $protection_interval_bytes !=3D 512" + _show_result $TID 255 +fi +tag_size=3D$(cat "/sys/block/ublkb$dev_id/integrity/tag_size") +if [ "$tag_size" !=3D 0 ]; then + echo "tag_size $tag_size !=3D 0" + _show_result $TID 255 +fi +_cleanup_test + +dev_id=3D$(_add_ublk_dev -t null -u --metadata_size 16 --csum_type nvme --= tag_size 8) +_check_add_dev $TID $? +metadata_size=3D$(_get_metadata_size "$dev_id" metadata_size) +if [ "$metadata_size" !=3D 16 ]; then + echo "metadata_size $metadata_size !=3D 16" + _show_result $TID 255 +fi +pi_offset=3D$(_get_metadata_size "$dev_id" pi_offset) +if [ "$pi_offset" !=3D 0 ]; then + echo "pi_offset $pi_offset !=3D 0" + _show_result $TID 255 +fi +pi_tuple_size=3D$(_get_metadata_size "$dev_id" pi_tuple_size) +if [ "$pi_tuple_size" !=3D 16 ]; then + echo "pi_tuple_size $pi_tuple_size !=3D 16" + _show_result $TID 255 +fi +capable=3D$(cat "/sys/block/ublkb$dev_id/integrity/device_is_integrity_cap= able") +if [ "$capable" !=3D 0 ]; then + echo "device_is_integrity_capable $capable !=3D 0" + _show_result $TID 255 +fi +format=3D$(cat "/sys/block/ublkb$dev_id/integrity/format") +if [ "$format" !=3D EXT-DIF-TYPE3-CRC64 ]; then + echo "format $format !=3D EXT-DIF-TYPE3-CRC64" + _show_result $TID 255 +fi +protection_interval_bytes=3D$(cat "/sys/block/ublkb$dev_id/integrity/prote= ction_interval_bytes") +if [ "$protection_interval_bytes" !=3D 512 ]; then + echo "protection_interval_bytes $protection_interval_bytes !=3D 512" + _show_result $TID 255 +fi +tag_size=3D$(cat "/sys/block/ublkb$dev_id/integrity/tag_size") +if [ "$tag_size" !=3D 8 ]; then + echo "tag_size $tag_size !=3D 8" + _show_result $TID 255 +fi +_cleanup_test + +_show_result $TID 0 --=20 2.45.2 From nobody Sat Feb 7 05:01:34 2026 Received: from mail-ot1-f97.google.com (mail-ot1-f97.google.com [209.85.210.97]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0CBE442A82A for ; Thu, 8 Jan 2026 09:20:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.97 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864020; cv=none; b=eLL8FUtDsKjpueVShnhdJQc2ZDFzvh1YDD5OMRwUT8EvA7R89oHwijACEePh15Cdoxk7k8KxHYvWeiucFH3oFjG+K43Rtr1I2tJXcLyHQjYbVidXA82z38FZrC8gUMoTlqgvQrksX1vhBGFyNNMRRPrqSGU7/InRGHYl5yhiHho= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767864020; c=relaxed/simple; bh=eWMcbdJYhFxvXFqjbBRedUH0jQ5siz6lFXcZN8bMrmc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=i04zxGGTLVzFbU8X0EK61hIHIcjPVYmiad7rQq+jZD4pZ0PA84gSpTQn5GUEIjnrxBfNi7wUv//1DkCskVHlndNK1LszAM4O001T2v2+ClrOX1wQhX0X85P1cQR1SY12EamwB5dQMqhWj5FJwEe/+4E17FpcyyotQU3SsVUiQWQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=cErvshYF; arc=none smtp.client-ip=209.85.210.97 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="cErvshYF" Received: by mail-ot1-f97.google.com with SMTP id 46e09a7af769-7c6cc5e5f42so362095a34.2 for ; Thu, 08 Jan 2026 01:20:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767863999; x=1768468799; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=eaU0XpTuR03wE6PGtvQP43RzD+KIxiTF9KOB8gOkl3o=; b=cErvshYFo0xrcjBV6YGmWCaja9qhrTTLAEIuF/f0RGtWxmnmG8SsynQ0kDHUqYWhwz yM4d/1RhdljDIOCu2y8CjgePkj18kenXtB6qEILqEfU7pYnWCqSTqQGF6+iik3PgPURs VUxdos4Zwm6p7M8QXngrrZtrYXdI6rpkf0K2Wr87n7/SjOj40iIR0gm7Vx1uBj8gKk4Z +FgUtIcqU2JxRNfwv+DXJJ9JFxk++u7yK/qB9o+DW6K1BFXqUTO0VC1m4pO4fUscfn7r lLK6nVzDMLhunQgbW/z2n6S6Nk/a9oLMjaiipMGuikQAaWTDwn1ubQ/FvZLFv151Mr8M Hx1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767863999; x=1768468799; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=eaU0XpTuR03wE6PGtvQP43RzD+KIxiTF9KOB8gOkl3o=; b=pr8Gn41J448Fs+hfDa3gpetMPlRtdzkMa3EHLMvxmDW6szQ47NJeLdsaYU0i3SQZ2V Eb2Im7ChIEDz2MlXQJtj39o43DM55fTGJKntzyMDlYObIJIccyN2d+ZP6v7XzzohpGaS kA4/kQc6C7X0SEVf46iB2iQTr8o739tMqoBfRubFTNq9kAOyNcsBoIloWP4TAg/8zD6A d11R0TpzsBRhQrSJ157yeJ3YQNlU7cWEWn3gd/t+UyPHp568aQj3IULukBAuLCh7uf12 XOUegsV7qpS7M2RLOR9MokAPJ5zP966EX7c/9xbFEsD8osCjtTtOv8CiQhVsWyNbPzE6 qPnQ== X-Forwarded-Encrypted: i=1; AJvYcCVJa1v3Q+R+qih/3TvYSHVTa+vMFy4aSwW8ltJ2mztBpcDMsa22Kh0VI+gFTmTMQbt1KRQd39G5gW4KhRM=@vger.kernel.org X-Gm-Message-State: AOJu0Yz0WDEX0CrKAVCNUu1Ia5vTZwntkcKNiww4reNvWlowf+Mvi+PI F87sNcIZuXILHnkRt1tsR4s0vIdkBvjXDAh0+CM3odMEB9LQwZE4LiGaCJeSSxwuz4tGaBpVXAj 7thGXayFZ+xUme0KkOvVIx6DsM4vPzyx+b2Ug X-Gm-Gg: AY/fxX6lTSKJIQIhRPTDpWFM6Cc4QYElUC0EAAhaIH9ogGN+pKc68QjEuufGyszTtwW /WS1fQexzERUF0GhKxhUQkbxGW7jyIF46VDjoqvmPv5E5t7AIfi+OceHf2VdUOfakS039zrZQ3d KOmKgK8vwbDnhX3jLne3dWWfB51Irpr/TKbzm3AwrpFAyThqZAI5vhjDWByWfs96dq0D18Y45zp ZNrAuT5QXABHbU+ls6N34vyXpBOKcfTApdP6YWwPJp5H/gn7c9iYNxt2GOwiuROexcvtLYZlqTE MR2Dy+rdv38/PPGWeyOaUT981EfGIPgzRD4jUGIYEsRktoG/S16P9u3fRqA/cCqapeE8LguHARn oScNcQnqGe0lhddj/HL2xV5DtChdVFrtYqJaKk+pH0g== X-Google-Smtp-Source: AGHT+IFYvl6fYndMLF80xvEQYCcAZV09cJSN26yC4MLZIkfZxRKtsAzFauxuHLBWb6KYs55Z1KkAiyisPKVS X-Received: by 2002:a05:6871:a003:b0:3d3:2fa6:e16e with SMTP id 586e51a60fabf-3ffc0c4ee00mr2082048fac.9.1767863998824; Thu, 08 Jan 2026 01:19:58 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id 586e51a60fabf-3ffa4e3e739sm837434fac.7.2026.01.08.01.19.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 01:19:58 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.112.6.120]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id C4CC4341DAF; Thu, 8 Jan 2026 02:19:57 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id BC4DFE42F2C; Thu, 8 Jan 2026 02:19:57 -0700 (MST) From: Caleb Sander Mateos To: Ming Lei , Jens Axboe , Shuah Khan Cc: linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Stanley Zhang , Uday Shankar , "Martin K . Petersen" , Caleb Sander Mateos Subject: [PATCH v4 19/19] selftests: ublk: add end-to-end integrity test Date: Thu, 8 Jan 2026 02:19:47 -0700 Message-ID: <20260108091948.1099139-20-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260108091948.1099139-1-csander@purestorage.com> References: <20260108091948.1099139-1-csander@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add test case loop_08 to verify the ublk integrity data flow. It uses the kublk loop target to create a ublk device with integrity on top of backing data and integrity files. It then writes to the whole device with fio configured to generate integrity data. Then it reads back the whole device with fio configured to verify the integrity data. It also verifies that injected guard, reftag, and apptag corruptions are correctly detected. Signed-off-by: Caleb Sander Mateos Reviewed-by: Ming Lei --- tools/testing/selftests/ublk/Makefile | 1 + tools/testing/selftests/ublk/test_loop_08.sh | 111 +++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100755 tools/testing/selftests/ublk/test_loop_08.sh diff --git a/tools/testing/selftests/ublk/Makefile b/tools/testing/selftest= s/ublk/Makefile index 239ad1c741ef..036a9f01b464 100644 --- a/tools/testing/selftests/ublk/Makefile +++ b/tools/testing/selftests/ublk/Makefile @@ -33,10 +33,11 @@ TEST_PROGS +=3D test_loop_02.sh TEST_PROGS +=3D test_loop_03.sh TEST_PROGS +=3D test_loop_04.sh TEST_PROGS +=3D test_loop_05.sh TEST_PROGS +=3D test_loop_06.sh TEST_PROGS +=3D test_loop_07.sh +TEST_PROGS +=3D test_loop_08.sh TEST_PROGS +=3D test_stripe_01.sh TEST_PROGS +=3D test_stripe_02.sh TEST_PROGS +=3D test_stripe_03.sh TEST_PROGS +=3D test_stripe_04.sh TEST_PROGS +=3D test_stripe_05.sh diff --git a/tools/testing/selftests/ublk/test_loop_08.sh b/tools/testing/s= elftests/ublk/test_loop_08.sh new file mode 100755 index 000000000000..ca289cfb2ad4 --- /dev/null +++ b/tools/testing/selftests/ublk/test_loop_08.sh @@ -0,0 +1,111 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh + +if ! _have_program fio; then + exit $UBLK_SKIP_CODE +fi + +fio_version=3D$(fio --version) +if [[ "$fio_version" =3D~ fio-[0-9]+\.[0-9]+$ ]]; then + echo "Requires development fio version with https://github.com/axboe/fio/= pull/1992" + exit $UBLK_SKIP_CODE +fi + +TID=3Dloop_08 + +_prep_test "loop" "end-to-end integrity" + +_create_backfile 0 256M +_create_backfile 1 32M # 256M * (64 integrity bytes / 512 data bytes) +integrity_params=3D"--integrity_capable --integrity_reftag + --metadata_size 64 --pi_offset 56 --csum_type t10dif" +dev_id=3D$(_add_ublk_dev -t loop -u $integrity_params "${UBLK_BACKFILES[@]= }") +_check_add_dev $TID $? + +# 1M * (64 integrity bytes / 512 data bytes) =3D 128K +fio_args=3D"--ioengine io_uring --direct 1 --bsrange 512-1M --iodepth 32 + --md_per_io_size 128K --pi_act 0 --pi_chk GUARD,REFTAG,APPTAG + --filename /dev/ublkb$dev_id" +fio --name fill --rw randwrite $fio_args > /dev/null +err=3D$? +if [ $err !=3D 0 ]; then + echo "fio fill failed" + _show_result $TID $err +fi + +fio --name verify --rw randread $fio_args > /dev/null +err=3D$? +if [ $err !=3D 0 ]; then + echo "fio verify failed" + _show_result $TID $err +fi + +fio_err=3D$(mktemp fio_err_XXXXX) + +# Overwrite 4-byte reftag at offset 56 + 4 =3D 60 +dd_reftag_args=3D"bs=3D1 seek=3D60 count=3D4 oflag=3Ddsync conv=3Dnotrunc = status=3Dnone" +dd if=3D/dev/urandom "of=3D${UBLK_BACKFILES[1]}" $dd_reftag_args +err=3D$? +if [ $err !=3D 0 ]; then + echo "dd corrupted_reftag failed" + rm -f "$fio_err" + _show_result $TID $err +fi +if fio --name corrupted_reftag --rw randread $fio_args > /dev/null 2> "$fi= o_err"; then + echo "fio corrupted_reftag unexpectedly succeeded" + rm -f "$fio_err" + _show_result $TID 255 +fi +expected_err=3D"REFTAG compare error: LBA: 0 Expected=3D0, Actual=3D" +if ! grep -q "$expected_err" "$fio_err"; then + echo "fio corrupted_reftag message not found: $expected_err" + rm -f "$fio_err" + _show_result $TID 255 +fi +# Reset to 0 +dd if=3D/dev/zero "of=3D${UBLK_BACKFILES[1]}" $dd_reftag_args +err=3D$? +if [ $err !=3D 0 ]; then + echo "dd restore corrupted_reftag failed" + rm -f "$fio_err" + _show_result $TID $err +fi + +dd_data_args=3D"bs=3D512 count=3D1 oflag=3Ddirect,dsync conv=3Dnotrunc sta= tus=3Dnone" +dd if=3D/dev/zero "of=3D${UBLK_BACKFILES[0]}" $dd_data_args +err=3D$? +if [ $err !=3D 0 ]; then + echo "dd corrupted_data failed" + rm -f "$fio_err" + _show_result $TID $err +fi +if fio --name corrupted_data --rw randread $fio_args > /dev/null 2> "$fio_= err"; then + echo "fio corrupted_data unexpectedly succeeded" + rm -f "$fio_err" + _show_result $TID 255 +fi +expected_err=3D"Guard compare error: LBA: 0 Expected=3D0, Actual=3D" +if ! grep -q "$expected_err" "$fio_err"; then + echo "fio corrupted_data message not found: $expected_err" + rm -f "$fio_err" + _show_result $TID 255 +fi + +if fio --name bad_apptag --rw randread $fio_args --apptag 0x4321 > /dev/nu= ll 2> "$fio_err"; then + echo "fio bad_apptag unexpectedly succeeded" + rm -f "$fio_err" + _show_result $TID 255 +fi +expected_err=3D"APPTAG compare error: LBA: [0-9]* Expected=3D4321, Actual= =3D1234" +if ! grep -q "$expected_err" "$fio_err"; then + echo "fio bad_apptag message not found: $expected_err" + rm -f "$fio_err" + _show_result $TID 255 +fi + +rm -f "$fio_err" + +_cleanup_test +_show_result $TID 0 --=20 2.45.2