From nobody Sat Feb 7 05:01:39 2026 Received: from mail-vk1-f227.google.com (mail-vk1-f227.google.com [209.85.221.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 96A20214A9B for ; Tue, 6 Jan 2026 00:58:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.227 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661092; cv=none; b=MHc7oV19JaGhSXVDCNfMUk3Rw8cGYhMzHG2MWWM+UQGrIT8XX+0iN9DcygFQhC99m3tJTKh9ujwPs5zlPqI0ICOg4Bp/YU3aeMTyE1F3i77n1xUGRD5JdwTSC1oOICZjGEB7Wpy494OmikYc1Sz5geX9ai8llk3azib7wy0C0+E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661092; c=relaxed/simple; bh=MFrMgizmK5MaIPV+Gko7o6kSYnpBboKUcVmDmAwyHCk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=W08AI0nSe+WIhP1pcTlL9Ghv2KU783VLzCNl1YoL0fJW74fu4CdFOZ0qT+HCSYVq8UaRhPQG57Np5RT9CoMiDVTsQnBYsDLkfm9karK2f3ZiBTQSlSIVGfttx8SuCzX64Ogvm/q2a+quL1c+9T9f/algvBXUkAnv+Rv/sFES35k= 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=PMp2pu3A; arc=none smtp.client-ip=209.85.221.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="PMp2pu3A" Received: by mail-vk1-f227.google.com with SMTP id 71dfb90a1353d-55fc4cad35fso17390e0c.3 for ; Mon, 05 Jan 2026 16:58:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661089; x=1768265889; 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=PMp2pu3ACjn1sCwdWRqazeoN7KrK1cWNvEYCk9mzn0Tk3UeXs/U72J7hmmcA4aYTTK iMJL8SMCA8YWRT2PWb5eb6vk/bHU1pbF4tIaZ6oCkBtSUMuwGM/75s4/UPWy8MWpTUi8 ay+lqlQ8HpLX1ztZt/lKlRpBvvnSbs1vQBml6paaGrBWR9Q1L7SkZXtfR7AOKTOcAWka HgH1SCSbBHyyxshYB+4jqCZLb3Pf7Ha789aPHzyGD+Y2w8KcxxDgf4CelhWT57SwqRjl HM8DH2n047Z1JfVKzi4Ihbp78fJokt9oJ79+DbhC/p2iHOO7tIu+7Y/mBi14CN3kIZ0o Gjgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661089; x=1768265889; 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=Pv416zq0bOE3pfGv70TlElfk1A9tzivxn4CMzCD58QSzR4osyI1iLZbiQoNAvkxsrk 8KDE0E/jXhCcKJ9TDQghGLgHEFjANNqDm6dfoB1tzXvnjIk/MplK7v4h9gHX5SGXuDGO JfbRUycRHJ/Q+PtulYabrP1pWcWHTglwR0VedtNdplLPDlj3mxAm+LB/arLQHik52X4B qgLIX+jfy5FyVR5ujkvKrG4N9bdwl7x2StUKPi29rYpyaK5G5zWUgfwby+hk/P1NwWzs 1rF22HmLFbA2m7exEsZXvAXa+kCIjVSATdvkaYSRsKfD++iEWkJlyLgOgZncDWWilTiH Da6Q== X-Forwarded-Encrypted: i=1; AJvYcCXy+f9WPXq8WZ6Q1Xh479lhAnG5NnLCSXXdtmG18VX9QkgUgF9b6irSkW6ce/zlx5Y874BRrzTyHID/UL8=@vger.kernel.org X-Gm-Message-State: AOJu0YxKlyeZiFNezZIUXkArenCMGWHkeTRIBdyRS2JtsNWK6ulfZiWA ET+wV/V63fzhCccqYUvLdta09RyE4Rwl4fAGsl8kgh+UExU8aE/7WxVPs7aFH97afmjAu5znHVq SnMVHWEcvE//XbXSweEZPRLcr5NfQy9pQQVS8WmNKL20q2d0iUqeM X-Gm-Gg: AY/fxX4l85TK4bkJq8N36mezC12hYV1zcW4HaHuiZcfTvwjK0eHGwykIkw8w+2k2A7d 7xydQysfX6EeCvbFUVbNtaxNbZGNFL0jyyuuZBMkTvd5JBStdFKrOtJ37SuiVojgU4T3pz8565c piZNA8igHp6bPQgrDYMbbK0assgA4mAcMCIO3aRTa6tTCAiM0q+kgFsKCgf6qzyg2gqdkBtkRfY ZJ5HqS96YiQRKFNSLRf3zaJcTSABgsKjEyBdQZWVPBP8PQIU1UeW0ORMLz43uBiePcKn6DsQYaC 584nKuuedn5ZTO7Yz7G6XF2ZOcZWGQN4B6VLfrSfAiGKm1AuIvyFtZ0NKivgD3kZd2EcDW2mrz7 i4zrQMLMRGtLjgPGSePBlovBYrYw= X-Google-Smtp-Source: AGHT+IE61WlaoTEdEojd+c8ZwUjfNjslPkPW4kBvumfbC08CESGGGz0wA+YeAH99IQPcIB5gAPU5IWfKHKOH X-Received: by 2002:a05:6122:ca1:b0:55b:1668:8a76 with SMTP id 71dfb90a1353d-56339524d92mr266941e0c.2.1767661089325; Mon, 05 Jan 2026 16:58:09 -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 71dfb90a1353d-5633a40656fsm84914e0c.7.2026.01.05.16.58.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:09 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id B942334084D; Mon, 5 Jan 2026 17:58:07 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id A8E81E44554; Mon, 5 Jan 2026 17:58:07 -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 v3 01/19] blk-integrity: take const pointer in blk_integrity_rq() Date: Mon, 5 Jan 2026 17:57:33 -0700 Message-ID: <20260106005752.3784925-2-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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:39 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 641CC1F8BD6 for ; Tue, 6 Jan 2026 00:58:09 +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=1767661091; cv=none; b=LL14f+B9hO9mTVemJ6QlRNXQRf02RsbWG8TKbmioE4s03c2I9qmMgTvPj8Yl68/GQDLFE8hX05zeTOqKt+fgOMPM4tx5JyWEnQVRfJ/WWIKoFutpjzlCOidNTMfBttFpeYm1DphWJRrJ79ObDWOhWxKUQv7vwnIrx+q+1ZY8Bes= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661091; c=relaxed/simple; bh=RSIk539QU0YeMD2OF+ndA/QgOH1sYpMVe11eirRJlyI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=t8BRMe3RYrVHUe7dnjdhBxD9BcJSL+sTWiCZ6MnVenEEPaa1O5GSjEFW50ji55kK9AFI48nzRSiM0v+OaOzayRbubhdoprQ7G+jDsFShv1w3kdHSPa7BDnuvXd/Tvr6A+mYmhGgdbvntfS6brewzAhV3dh7pcadzaXl4fNzy7Ek= 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=BrX4KviQ; 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="BrX4KviQ" Received: by mail-pl1-f225.google.com with SMTP id d9443c01a7336-2a08ced9a36so734915ad.2 for ; Mon, 05 Jan 2026 16:58:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661088; x=1768265888; 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=BrX4KviQsz+XG4J9E3zXQAD/ol+fsN7fTiwHMP6mCOP9vuaEqPtosgAag4llHOaFX7 1sVuzEJWzUNDccetaHTxYGSNFVlObsJmt8cgsgE8O63vQkV7bntKD0jJ6nJUsoRtJa16 7lbfkeObnE/HTvBQu9TWTGOyvbNjM/fmlZ3/NS6HtzwttbUCYg30oC/lJWidpUlYxNx6 39DqqCx9mQhSpno9JS6KvARCSIR+eneyk4oza7bO7UWIayX/dwYQ48PuZkFFl7BbnMlz 5rcB3GMq0oNskhKn2Gq/g+XRelzZypqSbFEjNVd1xpEmlGGUiJCtmjicXteifZqfmHX2 p8QA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661088; x=1768265888; 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=hQ8cetUOIA1NDuDtwFo1fQRdKc3PidGnfy9QiAWYVRhguFv3UGPaUaMzhqiruc95Ud rKSfJmLWH+ZfB8MAiehtEbKrA9kdQMO4J1GX3PizMrPKuzVE6+wHEYW0auYEWqttxxAd /m6ide0WpzwGp42SJgx2AnQCRVL0eUulpyFygzSnFMWQeKUZmMAvvPGErLlIAzgCU9YI 2SkecjTHu0b5qZX76cyf/920mNHp/YEaH4nKxRC90nk28g6djC7K5dEF3J7Tg1KSu0N8 iAInA+PwJkNIDIu75P0XNphdsJAKHnY8/pU+qMU4VvDedMA1NkDIhfkyoOE1EsSlZJmg 3YLw== X-Forwarded-Encrypted: i=1; AJvYcCX8zgUYsAyF4zR8Bzi0v423LP102b4VWQmV3zJDqMuFosbwf0SF394FRYCqN/NyRUGt/+mi+hPhMP8WiTg=@vger.kernel.org X-Gm-Message-State: AOJu0YyA+zAgQ8AR0M6d1Pvvudtaomn5XisKgno77pooRdL4AHDEjWtD R7I5lWPQXY35o3KNXdoDsZjMJ3vi+u+9fegnq+ErXKyQdij5Hw36UzDxd1Ps2niBqbADHC9FWy2 0H5lk66Mv/4ohRZjGRb7PMUJjAXCUR7aarRpn X-Gm-Gg: AY/fxX7xsmEa49eJ6Pni4v+8/5YlFo7Y7XOSdiSlW6aIkDcUFS30CHoviRHlmFMXVpT TOV4lIDbnV7rLbJPA7bH5qF3BVx6JrgrYCn5tXxYAP0wGWWm1p73NGbi2rFb3qaf4sdnhYb6frP zB5HSPyNJ4YA89CK0LJqm5h1Paym/F14qubrurfOKsWzo9IGNm2U9XFFnp7SHWNq9XaxhuIT7Ja AssjRCK994I5CJyMpF2OQ8690rBqzHC26cdyCizEeaxX9q5SriATeJEEAKAI2gJwGB06+V4uRJ8 oe6yRC3sroH7Jhu5bJIKgC/UDFuRhLRokgDcUVqLFGAOq+IorafMHobKosdmFwP3rVRFhBhx3Yw MS6VBFojk6XG1DlSVUYXjE/3bLH5ASw8Coe0XSz7j6A== X-Google-Smtp-Source: AGHT+IHKb22UjylnDKoA0W9fny7bybwLOIO7bAf/WzC4axVyVJ8PaetqijQugZHk6m8KpWwx3aSCOjDDD8PD X-Received: by 2002:a17:902:e741:b0:29e:3822:5763 with SMTP id d9443c01a7336-2a3e2e5c956mr9922685ad.9.1767661088568; Mon, 05 Jan 2026 16:58:08 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2a3e3cc4ab4sm821145ad.44.2026.01.05.16.58.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:08 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 07BFB340960; Mon, 5 Jan 2026 17:58:08 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id EC714E44554; Mon, 5 Jan 2026 17:58:07 -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 v3 02/19] ublk: move ublk flag check functions earlier Date: Mon, 5 Jan 2026 17:57:34 -0700 Message-ID: <20260106005752.3784925-3-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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:39 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 1163620C029 for ; Tue, 6 Jan 2026 00:58:09 +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=1767661092; cv=none; b=kO1kkQiYGRkSmDao+LGr2rDB/PsyzW0AZ4xgI4E9nRcwtX4lkB3ezccVFS7g0j3JIhJACcTOjMMDn5s8+VYF5HZiD9heAZ64qDiUcO8HmFpsizi9x7V2TfvU1XptOSl+8O+YgT/zI7c9WFGIILAYPvYWSaZb7HqhuXJPGuW2U74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661092; c=relaxed/simple; bh=vAgs0Pbg91ZwroVZstdRfr4cppAGoD8cknKqmAiRQJI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IaLeVMGrfYAH0nPpHt2L+jTUcn/Cqf84DvNxD+2uGCGeHaGOVjt2M2ksFFSSFosJUVFW78q+S8r0wm5EIal0FLNp6p+fowhu8JpuJwRxUTXKQb5GkOZZFgW73e0rpLbr9fSLMhAdE6/eVtw47yxRRtjvo6FxWoHazaHMs2i5bTg= 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=Ipb2AIWr; 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="Ipb2AIWr" Received: by mail-pl1-f228.google.com with SMTP id d9443c01a7336-29f2d829667so1018415ad.0 for ; Mon, 05 Jan 2026 16:58:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661089; x=1768265889; 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=oZFFOl+5oUis+ItVo8RVLDPXcu6iIOTPXjnS3koQ71I=; b=Ipb2AIWrC7ZPqccxfKWhnmmK/7mzMrDAXHD8KP9u9zO+1wIaUMhZHQ1P23UxPqjwEm AsxcBRI4J6+gpY7C0vsfKJxnqjY9lytb8MoD/hd23XbTDPwijpT4GbE8qLnsBvaqHokL IofI8HSAOqNXP65mnlSgOstNmT9Zp+a9txuWKmDw3x7/4os0e1YZ9D0SFeVtzcBvfVZs HnfEDVecY//pA3NzwcseYn3x/s8LGEttZ1pyhXLjZv+4DPiVBpqjA6tn0PLY4vSvQd62 qZrLbrHYm2T+QBKYAnvBAxkgfbahCfnnpGrOUfFWyw4SNZVfxn8ekal5djHe+KbHcbrF CPCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661089; x=1768265889; 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=oZFFOl+5oUis+ItVo8RVLDPXcu6iIOTPXjnS3koQ71I=; b=Z3JTnviZzpnCERfAxCbYLEHXuUnai4tvR6J4Fw25jKhsCmMwKChEwehoJX4hA+9DWy mtv2ZOq9U2HLCk1pCggp3N8owNyo3psRHP3e/5wyIZWgh1O3S6D72Y4NYHG2PkBX6KjP pM8aNt170wjNVMVtEA1qTKUBVUX8m68vdEbraiNlFkoO4VoYYQPauNsOaKzLm+z+x6zF MbzI0TEOTUg2FZJyxUiqvQUdW8Im3Hia5nawMQAxgOve4mSZ/O57GPGv2Vs6taf51E0V o37Tw6LGla9nHu7c7pOdSOUyNoxMN7X6BTPWiF51y1tZ5EfsO6q54tRG1Pu12JJVd5n5 V7FA== X-Forwarded-Encrypted: i=1; AJvYcCWHVP8BAOnG5XW/Kdt42OWhpMahjaaVtGNIKjgKV35GfZ9Tw4sXDT0ZUpwHHLSgp9nCdGiPYO3e1scU5j8=@vger.kernel.org X-Gm-Message-State: AOJu0YzXohzFi1r1hjjSPB3vT/ZYDt3lpoYNUbfNAvAWURvId4Ac+gBJ SE8tPqoQmsMBgtNRdIlKrakiBq1gqLfWanfU2PPnnaRJVZlY1MHBx9z3L021F3wHCnVPl3YMueV x6DwVsGDVQS4nRgsDiMdj7TheIf6PsimDssGOFmD0pwwRJ4GBZqCF X-Gm-Gg: AY/fxX7GtzpNHkLoaczS+8cLk/O5cb0oCRTNUaqkbWRcJuK5x/hYtUHOjps0CAt0iT2 mxMETq91rCh6VL8XRRygbZYNiv9Yss/FGCm1G5FhbB4axAHJSlea3IIoiyoXZNKdyV9UBliw3jp OzEdqcRKZSoHNJJ72hl2FBQtDq3YrurHD6Nbrsp6YOCteHdZYkQAL8VmuMfJttzqxQ4nH5LDeMX TqX5a+r0QMSzTI7bZEvc17hY1kVLOusWy42iG72yLvFlnz5/7cWeHrdpQUGsujonSBD5rlr8mHx P5/4AiFGOVcWqUgx8nnypYjumh8XM9oeFwM26TOMYGhXd8O6y/7yopu++lRH174TZQFcGORJx5N NsgUQV1uOqDKJnkxe8w7N6UuQAao= X-Google-Smtp-Source: AGHT+IFrUOJtYfer73wwyB0WD+vhNOG/VCMgpU/0tt2EWkifRCz9w/wLALaEJb+5css8C4Uh0huvjZsoODA+ X-Received: by 2002:a17:902:e743:b0:29f:2df2:cf49 with SMTP id d9443c01a7336-2a3e2df4b5cmr8812195ad.5.1767661088943; Mon, 05 Jan 2026 16:58:08 -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-2a3e3c49d15sm873085ad.14.2026.01.05.16.58.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:08 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 49E4D340DAB; Mon, 5 Jan 2026 17:58:08 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 384A1E44554; Mon, 5 Jan 2026 17:58:08 -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 v3 03/19] ublk: support UBLK_PARAM_TYPE_INTEGRITY in device creation Date: Mon, 5 Jan 2026 17:57:35 -0700 Message-ID: <20260106005752.3784925-4-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 --- drivers/block/ublk_drv.c | 94 ++++++++++++++++++++++++++++++++++- include/uapi/linux/ublk_cmd.h | 18 +++++++ 2 files changed, 111 insertions(+), 1 deletion(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 8e3da9b2b93a..066c6ae062a0 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. @@ -628,10 +631,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 +740,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 (!(ub->dev_info.flags & UBLK_F_INTEGRITY)) + 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 +3014,25 @@ 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.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 +3219,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..a54c47832fa2 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,20 @@ 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 */ + __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[7]; +}; + 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 +628,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:39 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 C4CB1203710 for ; Tue, 6 Jan 2026 00:58:09 +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=1767661091; cv=none; b=hwBgKIEEQApxuNkza7w1kCyZd7Dh4ZpEuJGIz5kxZheIXho0TEO+855M53vDGAB/QZ1TWQZ3DNQAVoowjWnEtk1YSqKv4hPf5wWb03HTxwIofXZBR5M/EKhqyx4i5MsRDoeINOY1mli6tdUyOVxXyhXl1SmLSViRSroHKGc/ES8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661091; c=relaxed/simple; bh=O5LwPvfpq0YjRitfoT/GodeSOREFQSeNsNbJMNj4XeY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=spPnmwrPuD5/CQWHLJm2t7+UjnSE6iLEdp90anukxht+w8VFYL7o7BG3ru7OzicFfZ4gko9OWGMTryhNZCzVPz9RIKm5rHHw/OB5yJ4OjCYiaaL1/lUI504DbaU7kBq15/Tf9CusU02HCO+G2+fopPwKlvlJl4TGVhVL7Jx50DM= 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=Lm6+4W4T; 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="Lm6+4W4T" Received: by mail-pl1-f225.google.com with SMTP id d9443c01a7336-2a31d7107faso564745ad.0 for ; Mon, 05 Jan 2026 16:58:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661089; x=1768265889; 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=bChEZ5QV1bk69mFc450SD6apMVEjUAARVBTDyWj0adc=; b=Lm6+4W4TK61xv2pilsDlpzNY3E1QC7x7PJUyuSLv+vQwUmV+54CPtxK2EhV1od7poi 76KgRPtcktif04Fg66whjB7VtBXfgtwY6eIJnJe19HWroMXfyeiwIMJFMRjNsDE/2GPh +7pRyYdHV4/d1hkQ3k4anRdOLtITaKsj4h2ezV01+B2k28bis84Rre+82rMpP6IMScrd 90AoZnGeCCh7NvnFq4oesboH0cfantCQcQNYX8X0uBJLYoSo1g4E+1OofoXMaep6YmgK Sj4YlYRFbjqDnuxMnZMNp4fN9Nq9+XwFusYFFHEipVhu/6m+cYie330Z5id4oKA7bF10 kFNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661089; x=1768265889; 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=bChEZ5QV1bk69mFc450SD6apMVEjUAARVBTDyWj0adc=; b=HXd1NluMo/Yg4D3S524d5p8yXI0r6gJtbIT775Bt9LBI07pPehXDAu2RRBkI8ftMIm yvuBpYxLfbFmS23KYrq3i4jV+lGWPkmE1Esk3KQ0tfshpp7cCKiN8+iUCU9QrQOhsOwk 2nspDLntgSsLiblt0Ux/PdfsLjA0ZU/2WYomGwHINRfHBw7EgzFFQJW6dA5lgDyypzN/ dAQgxpFnKD5rzzeYEMoyCI/nMRbGjeRyp7nuaiAGqNG4m9JqglP3u/+NjvflkLqY8KQT g8Cgt7x9nDWwx9emlIrs8mc2EzHmjCBIR9nqQ7THHxfmzsIUtTSiX8xawsE/BuCcl//V MfsQ== X-Forwarded-Encrypted: i=1; AJvYcCU6AsM+7SGr/DzqcgZvgJUfUr0GDTCxoICA+HFLzcjYyV25nvP1lz2b2FTxH/JwtLIh3H9XhzPchWHcStM=@vger.kernel.org X-Gm-Message-State: AOJu0YzxCKWtz0AdTfYWnV5Dj0OBnXeKOb/sG1cOApD/ZPv3duUCZ02M dkVv+Gc1xUbyoDWBZ+miC661dg+bIYo8c3V1NRaLYetme+P/yIF3wh5FAIjNTnYTlhx6poWpOmB poOs1BiaumAZtmj2VkbSn39fKoFCZiThQuzMP X-Gm-Gg: AY/fxX75PkI5lu0aqwM8DqukMG7jRXkpHOUQwHKAr+R8moszLSMwY8LU/9VBGx64yWH SW5ljcU0Sd9MmiLjSq0aXoUjF5hvhd2Xo54Q4gAMEBtbHYvxN2TAzqq0ML/5uolHd0RmkOBF/H4 Y8ucVjxhdZGMfQz2EevCYW1wWo/0ZBKcx9LZVTARy+iFj2rjxnpdJ3XMeTmQnNoiYW3DyCNl+FH Ab6/4XESb52hlAbjt40JjRun0hqYRUftzqJwiPsh+ogAd7ObxclczXPQ5UgovU2Qi54GyGAX8DK DQ+kFl778JYblqhmfENvAGOIphs5Dyinauo6EQbNA/7dwDH8mfpme5qLQ1oD8opEZdn440VuTUr SKnaSeHXcg2hE92lmTDc+VcufqwAp4EO6I2eGGUvo8w== X-Google-Smtp-Source: AGHT+IEt7v5piZcP5t5FBeU95eBGQgO16vibqCKp8Tght51rRbRk0ygbQXPn5D5FjMvVvssdzo/+nh0s9KFs X-Received: by 2002:a17:903:3204:b0:2a0:8963:c13e with SMTP id d9443c01a7336-2a3e2e402e1mr8732335ad.7.1767661089054; Mon, 05 Jan 2026 16:58:09 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2a3e3cae5cbsm842285ad.39.2026.01.05.16.58.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:09 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 7FBDE3401CC; Mon, 5 Jan 2026 17:58:08 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 6FAC9E44554; Mon, 5 Jan 2026 17:58:08 -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 v3 04/19] ublk: set UBLK_IO_F_INTEGRITY in ublksrv_io_desc Date: Mon, 5 Jan 2026 17:57:36 -0700 Message-ID: <20260106005752.3784925-5-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 066c6ae062a0..2b0a9720921d 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -1120,10 +1120,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 a54c47832fa2..c1103ad5925b 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:39 2026 Received: from mail-vk1-f226.google.com (mail-vk1-f226.google.com [209.85.221.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 9371A1F7916 for ; Tue, 6 Jan 2026 00:58:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.226 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661094; cv=none; b=lb7ZupcMzj6GOnrxZd+5nNbALnzE9CajciWfopzTO4poSUGRtGfK98/qD09+asZbKQpCRFsi2oPVlQAs+EQyq6to9rPvOJcqaiNDe6BuNco3n0nnvyBZGECpAoEehgygn9jV61yHe2bLi+SuKAXx9FsBcgSl2wvvrkuueu3fo2E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661094; c=relaxed/simple; bh=xHvrkEgz2WvZ9OoqaXDDaPWd2yWpis+tMY2RH20oDb4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GlgJeHW6/CzKuHGG40XUxadpM3PeEh6V29/lCwwhGE45m1O5OINPx6VFJgfRWbz4p/irTACJL+GjTbqgwOG+a5RJUIZxgLQxbIqQ+dIvu2KH9a/8OeOSuJn0yt7EbP2PmrrQJngFnPHxr1kHm9EqN4iTTdlSxGG5kpaHWqsYbPk= 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=TWAeK7ef; arc=none smtp.client-ip=209.85.221.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="TWAeK7ef" Received: by mail-vk1-f226.google.com with SMTP id 71dfb90a1353d-5599b119bddso17812e0c.2 for ; Mon, 05 Jan 2026 16:58:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661090; x=1768265890; 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=IHwNeWpxsuVNiAeaG97ODUX9kjPf4RtR7cZvVnbRGp0=; b=TWAeK7efFGCIVvCYJhoMcyQ/VNqn9FkJmvWuiac6uaPAYZo3ttMJnIdUv7b1SUGJV4 Z8Su88R/Jp+AQOkrSziqiRRYSzOIqPwnZa7lVttm1RvPaXFzbgIn7qv9Z0k/i1Gpn+Y3 7P7rbrdLdQ6JNV/UQMVslVouX2OEJs/fHx0VC5H8Lf+2JrSON5svS8D8Cz5LP5r7J5SV EXoqlQznae2TYevJ7ScWtlJukz1LPtn85ZAj7x1Tf/I7q5QJeMiYwGZkDOTcvj7I/QX/ js0J4gfInp5NxzdtYyVVfYhTZra0NUHgSSAAYn6AdetfqGookqDboml1G/sGe0QIDZMn bQgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661090; x=1768265890; 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=IHwNeWpxsuVNiAeaG97ODUX9kjPf4RtR7cZvVnbRGp0=; b=JfIhUnc1nCZ5skvRaim1hBqpNBAwgTLkPjihcKvENHG1+ZPK9WxVRrrsQD5Gcordw7 AwDwd7N7+QiQDfa42ndfvZ5H0xaLtYxxDA9o3r0+WQ5M4oESfqsTMQWk6afOj4idBERi UUm0h0EEHurUyAwkVILEVBUMty8PI2143/ZIAwSqrynyqOaZxPkuxoAdQ7/8g+aOvy3Y r26DNL/zvaExJjAx7dgJt0Raj53tpGr9Hnf5UlRSD/oRtN6+nlmogW0SA9Ws4IqamUc0 IRxtJEvr9BO6t5tZdLdOtXKgdcC2qx9Fw3hGT/RXZkYwBOrEh5NSAgxDbtrb3Nicn1+h GfQA== X-Forwarded-Encrypted: i=1; AJvYcCU+xEeOO7Obb3WP3nkWcL1AncTJMHvYSmzX4QXHla+YJSzkRZ3idV2U/lwNN6qOB1CvN3cc8aL8N1ggwpM=@vger.kernel.org X-Gm-Message-State: AOJu0Yx4N1vbubMLq0MJYYrMz9z0Rd/sCJmcNPVFe5pByNhjmOWzRAXc gl/p1yH1B7LFxqkBwCxdlFj0+7Q+xJCP+anP6p5XyKfur1rhNy88/JnFtVE3/8AXPOUYfqot00i jWr6qcaQW9xjFDUblogSI4ca6RX8gRSGrOGtz X-Gm-Gg: AY/fxX6gL4PhQMA3VJxrukOjlPCpVk0LhfkEqORRdlOwaHrZeC5T7IHiMOKXzCa79kv G7axOOW7AeNqc6QlOwHqLlBbkjBT9Q026orowhh6xmWR0oN1qv2VVQTFNap9qD2NPNHtvFHtYqf Y/vciG/PLND/lKqEWMGHt8BmQpwFAeU7VKeFnxo3IUtSRKIJbR8jnxdy8SSDAYm0bYOHvGejCGq sK0/iytTHvwnSw6JKAh3gT4nETsBoyJX3WvTSad+S+Rq5rkLPXHiULvfTnHVUm6ApiYfzBGDeB8 QKvtayPGzbt9/XGPiSA2rhPP//QYaTUTGarTMIKSOso/GtWjXhsz9HWPjbrCYWwAUSBuL/L1XiG BLnS/fp6L+2pqRWV1WFoGLP3Yz6tpmyWdl1Dbysz41w== X-Google-Smtp-Source: AGHT+IEn0bj5sNsdnfs4VN4bK7+CDV8894QghoiK47tRbebopAfq6bRnonYUqOeBux8J2mhmysQjCL2w555n X-Received: by 2002:a05:6122:a0f:b0:559:5755:f461 with SMTP id 71dfb90a1353d-56339557d77mr266464e0c.3.1767661089999; Mon, 05 Jan 2026 16:58:09 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id 71dfb90a1353d-5633a3ed8a0sm84762e0c.6.2026.01.05.16.58.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:09 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id B020634173B; Mon, 5 Jan 2026 17:58:08 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id A28FBE44554; Mon, 5 Jan 2026 17:58:08 -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 v3 05/19] ublk: add ublk_copy_user_bvec() helper Date: Mon, 5 Jan 2026 17:57:37 -0700 Message-ID: <20260106005752.3784925-6-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 2b0a9720921d..2ce9afdecc15 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -1000,10 +1000,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, @@ -1012,33 +1041,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:39 2026 Received: from mail-yx1-f98.google.com (mail-yx1-f98.google.com [74.125.224.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 5601E2192F9 for ; Tue, 6 Jan 2026 00:58:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.98 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661094; cv=none; b=TA2Cc4C1itVrtcfqbKqsI9uIjfMZuoS9i6hfZoXvM83TECNBgnB+X5KeBDFsSu4GGQaI7tiPVmDqPkMf6SE5bFTpu3gohfcaBg7hHpsO0FnA1g7UZ3+amEQsqJQmrOQHZGJ6Q94AccSoV/xjh+ppXZQQxsBuEiUlGTJ0mnxsmCk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661094; c=relaxed/simple; bh=h2X1ZWO1y4UUJFzrWl61pBJcNiTBynvwTGaZHdcC50o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uY3XzGBLbBgmxlmodsNGiuuYDbNZWL8nZS+/1+tEupO7in5bmUzHbRYDYULdXnHHkQOjUJUgLgomF8mg0NsnHxO9AfLUHj07SK4aWyMcBCI6mSXahR6iHDyYqtI5I3RmmWciUJ7qO0ONDpLefJB0C6yjpHqOMaKUa4rEO0Gk+9s= 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=Grk2hLNa; arc=none smtp.client-ip=74.125.224.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="Grk2hLNa" Received: by mail-yx1-f98.google.com with SMTP id 956f58d0204a3-6470d549e10so48894d50.3 for ; Mon, 05 Jan 2026 16:58:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661090; x=1768265890; 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=slGh8Pjkarq3D8VYCdEWTgiawZdNotszyBup3yDWJ94=; b=Grk2hLNaEV7yrCWug6KF3ZVe1mLxzbOur7BpKSC6b0aXtbvgr+tzRfwcTSfrfTwy0Q WFMgvxCoLCrXUjxHPKM/vJY1zmUlBEfrjapNFmbNG889MGofaOYfaejCj+mZh/zTfsFy Px4AU2MF+SVVEwCwEBOePogYXY5XcDaJIEEZnT0UAxS+pDn6aFuhCrQq8FixEl67IiZd 36/GHHKrG7SdAwUJ+oWpDZ3c0xSwlgOqBMlNi4e0X0XN1XW+mAVzxjjQ6Qj9uMf2s4Mr M3j/CEIsZAqJZO3oOVa2rtDQpN2iSNbUwQCCQFu4gYax0qSB5A/ydRd2mCyijcJE4eAT DXbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661090; x=1768265890; 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=slGh8Pjkarq3D8VYCdEWTgiawZdNotszyBup3yDWJ94=; b=S6rO4vQYlQPd8UNv6YLXRLTuQj8EshMiWTLHknmLVOqw7PUWAS3FA7Uda9RtEQ4Cgm MCo9qQ1mi1WG2diV7gq7mDOPyI5gYTVGIqA5NTrgxsO8MsNurGXp3JrewMhgv3/1R5Gr XE6Ij6YW0b4hC5XEJvi/icpEZmMVfOivHK8YC8WvflQmI9rm+nreb2AYI3qqsQbAFSuh 9ps4htfZN2MX7TgZElD58KqrXnImD6jGT7C0uOdIiW+EnrBUYaNaMibIScQC/I29DHC6 1luNRNi3mnKO801havLDnYz/ifpZt7FL3G//I4Nj4wn8G8cFQBC4isOafupCxMpceOGN 1YhQ== X-Forwarded-Encrypted: i=1; AJvYcCX/05MUPx6KTpBiI2Tn92UZMOBlulXuWjn7DBPkg7k5o+ozlMp38CxlEjzTnUFb/1b0Jg4YFV8T5h7ff3k=@vger.kernel.org X-Gm-Message-State: AOJu0Yxx/CU+r6mvNgtJZDrLG/CENYFCKdmM7BwpSKPjTBAfr1aq2gFH 5wRFDywZuUxj8jX410ybBvXKloBFEuANFVNki9xTglt30N3FR3lgYqoUd5clwN7X/eBzVJsQ6Ze 6qL7ybVF+iljt8753Wq7c13hYiPlWiWizYGgHcVRq9+ywRWJ6l5tx X-Gm-Gg: AY/fxX75Hx3YlW3TLlj1ERR0o2mT3Tfer/4BGkkSBlGtl2b+o5C5jV15kBv6ZjtFIxr 2/1HQqla39rCwWOzO47jMRhA9TrXrtxsJTyye9D8Ur7dq7clBqEbiIXQ2GsM6HVujg7qneFzHM7 TFazPXG91S4u8ZfP8qpi2aiP0Q8oAHVDVXVoFgvuwGc1YRS/4eAhty7GiunCU84wUe0W7B+RTdC 3X215CXK2eWDWgT8AIl2vIgU21UeWBHjp1vUWE56gGJltDjx89cRR6TnzqgS6If99pCXz6YCAqm vuEmYfozvMAU3VmOwcExGsE2BU1vcv2PVBbsE2NGrVA4P8V2PoQWRXHPspI0QXQ9xpxumV2WhuL AklRUTagemB0qnSId8qIQrlI3OOE= X-Google-Smtp-Source: AGHT+IGGt5rJUjZMWpNtDxleRmkLfQrCcatBCgXXwQ9lzfw8U+88G65krAcdFvyhL5DbzEgyenmVPsTejlPO X-Received: by 2002:a05:690e:b4a:b0:644:7182:dab3 with SMTP id 956f58d0204a3-6470c8413dbmr1146154d50.2.1767661089760; Mon, 05 Jan 2026 16:58:09 -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 956f58d0204a3-6470d8c4d07sm70913d50.13.2026.01.05.16.58.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:09 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id E6802340960; Mon, 5 Jan 2026 17:58:08 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id D8B53E44554; Mon, 5 Jan 2026 17:58:08 -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 v3 06/19] ublk: split out ublk_user_copy() helper Date: Mon, 5 Jan 2026 17:57:38 -0700 Message-ID: <20260106005752.3784925-7-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 2ce9afdecc15..c3832ed8cec1 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -2695,42 +2695,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:39 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 9496E21420B for ; Tue, 6 Jan 2026 00:58:10 +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=1767661092; cv=none; b=pc16LQCn0Nl8ZbpRsgngr6j9F5qvZ+ptGSoWCihB8nyNGp4K6nZBDzImZHWIDTE7p1+PMAEO8uGxjmdyrflgxtesKEp1DJ1PkXV2fzy3SKEWkB1Q3galJ8izr7tl315l0Gbf8b3QYJ5yYRWAcOtK1FxodUneC0F8IQPo8lL6B/Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661092; c=relaxed/simple; bh=jzyih9dafZ4XR2piw4ZWjyPqJoo0c71+VM6fgrf47l8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r4ntQKcdMaAy7jEz/SoQhPeFEI+mm/P3JGuSZyFw1a0mxjoSRhNrbzeMfc9OJBlv+GLYDV5SqL82mSL69o7xSkekdUUH7xvnbaHZXd+GROZo6CYVEe0RCsycbc/bMjYVbf6/kBr6W8GFSq8iAsZfdD6/hMBZFKvKn1O3qo26NCg= 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=gI1Z29pP; 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="gI1Z29pP" Received: by mail-pl1-f228.google.com with SMTP id d9443c01a7336-29f08b909aeso1204235ad.2 for ; Mon, 05 Jan 2026 16:58:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661089; x=1768265889; 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=ieqTxRr9zPk5de54duzCoKw16y8ifpstASg31G9cIt4=; b=gI1Z29pP4yAXZVJRn4QamN2Jy0wSyUYwFPSB1tS1W+rn5Puz5rbJGKEkx42meRq3bN JUqSUxqEocyePhUbXWGi+2L8GMF3SLTsoqxzdYmdZrVQPc6ZRFtqgd/GXu+VUcYrVvKM P5ntAUeiumiqZrznCOJ37C6TLaVPzcOYKf0HGflGWzQ3GnfZHiSFJK5zYpDDluuCTlqH jwGQBWd50yv3WzstUaYUthE/E2+UrVek+eh2zzNooo4hd3u32o+G0gBs8yqxV8PRJPnu SHDnm33/H5m7hwFZaytbYDHLyBg93tpIrUivECX+1C88MOXe/2fPa2me0MX4UNsCyjXy Hmsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661089; x=1768265889; 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=ieqTxRr9zPk5de54duzCoKw16y8ifpstASg31G9cIt4=; b=QoadQnBJE7wT7AlscuxIzhGYRZ2O3/iF0/T0TGU6RETzGzm9v7QCKtM3JswcQotY2I 0oXedR3j+JZmBvfPOV+c1BACtm7px/i+IW/al4FZY8x7f/DZFr08WRiOBnB5/JhX3k06 oGakBeBirYPFB+I9BMFX2vmqBGlZ21fQNL0asMNXagAdMMgh7GSmc9BAhtDNPSN5mMvh 5FEFrabmWY6+BnogZfWzdcOLv0SRoqXZXOhoc7CPbuw6YIyz0IJQUuLHfL6z+V5c2e5Z CE/9xgoksyNx5JEplwZiOKO6rXCzeZVfEPA6eG3i7zlzYBEhXoWo+rSjfkoBeSiXuije nMlQ== X-Forwarded-Encrypted: i=1; AJvYcCUpvKSEA81vjaWkRcG/mT4rIAyQFiEi4sMQl2ag4S8JMSoxJpX7JBoOmPWEXK8Fn1aoeaqinDHdPNmQVVw=@vger.kernel.org X-Gm-Message-State: AOJu0Yyed2DhbQ0MHE0zOsdf5sR3274V309h9wS8UPJPAjLWGN8XkNjx 3eYI+GKwNe63O7kChSeSiOyihfzsxHRVZwG1+G8Lrad9PpcSOUEzThaZwclLqSzA8gAAJ3QjRxF KGt70hOmvbaPNJwu87XiwA8UlAnuG8aohNj8+ X-Gm-Gg: AY/fxX4gUtsy2fIqocRatUCNFANvVYVEeQ/pgK1CNABaU5S3Ivl62xTzjt6RZid+Npk whJoDhI0Ic43vDMDpsFt81etm3ePBCEroMpW+WT/hw2UVS+mRuaRrsRuKipydoMHnwDWJArxx3D 4Mcwmqd2nsCMF7QxAc8IBwSmaTwoY7vtwwN77I1WaKYN1m5VNrjn0z9ocWJuP8gW20/tTlHps3D 9cpBIWfmhRmmajlxU8j/kvWRNSB7/tgoGQ396dLy/iS1cVp5Tt6LsPW+IZUwYAqNBcYlyOVnd6D Gd7p+tY2ThbSsaD1U9n4aV4l39TzahOAHOZwuPVU9XtH/JxFudX0F16b74f6HcfclyySLQS91xU G+mINlRdBs5h+yFT76rNw2LYYFihBDTAH7IOAvSfKVg== X-Google-Smtp-Source: AGHT+IGUUIlq0t3uefFMiXwBaG09hS89DAoxd/gq2atTHMJ0YrjcZZdAsObR5myPEQGUUl2SKt5hQt3PWz7w X-Received: by 2002:a17:903:2f8a:b0:2a0:992c:1ddd with SMTP id d9443c01a7336-2a3e2e22affmr8386995ad.8.1767661089556; Mon, 05 Jan 2026 16:58:09 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2a3e3cc48e4sm850425ad.41.2026.01.05.16.58.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:09 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 202AC341D2E; Mon, 5 Jan 2026 17:58:09 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 11EC9E44554; Mon, 5 Jan 2026 17:58:09 -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 v3 07/19] ublk: inline ublk_check_and_get_req() into ublk_user_copy() Date: Mon, 5 Jan 2026 17:57:39 -0700 Message-ID: <20260106005752.3784925-8-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 c3832ed8cec1..abb668b460a8 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -2650,70 +2650,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:39 2026 Received: from mail-vk1-f225.google.com (mail-vk1-f225.google.com [209.85.221.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 5628821C9FD for ; Tue, 6 Jan 2026 00:58:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661096; cv=none; b=AGFXismqTh+z+PQEr5fAIDgMvxv2N8x6K1klQ/2VmVldvdYAYUNCoSVYYk4TKvmQsQhJshI1zHlyA1LeU7jvZrv/pvMTRrj7dhxa3rE8NvC99isdxOYqemO2cbcE9N3FdvmAGUlPn9D5KJSDwFVjOOLwo2nCaFP8xVEcxRkuyis= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661096; c=relaxed/simple; bh=O2B3nDNTOvA1fCnP/c4U5ok+FRqPgHkTWB1k6b6wlJU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=amTKSH18rEYgSrUDqQdkHStMgX0HwQdfJqtI53vfxprEzLqPdhMhkvB54i39otdzgpSOZfh5echXChXtD3IL5n+jY8pyp6YjOPkUM+B0tOik/89JUaArKDh/vKyEzJrkX2Or0pCSQ3yqWINZY/gH0n72Np7iyuVLF0QwY3vsAEI= 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=bwkToi3f; arc=none smtp.client-ip=209.85.221.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="bwkToi3f" Received: by mail-vk1-f225.google.com with SMTP id 71dfb90a1353d-55b2cfc3d9cso15246e0c.1 for ; Mon, 05 Jan 2026 16:58:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661090; x=1768265890; 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=2CNvd1Mx9gekfNSEieO/2PmHTz2A3J9iRZA5969nWLY=; b=bwkToi3ffW+XgrVvqlWjfWxLeL9npKDt1fU3v1x7w502dIRkT9XPfWHSc1662qTSGX 1+eLhvYv0Bx+TBIuo16oT1Mzid9CT/u7eWIANZ5Yk2EaReHQyzUzJNtMo57wa8iBKryK LO/rymVyJXv7sb2BIizNDT3RYARCYzM1f6HOTSNzKMJa7tPyjRUZAaz6Etw+8pvrVnK/ FyoYfEesE0jiPY9QY2yAMlqOi6ub3LrFH0/5vAd1cyra6/TfeTGzTgdN/L3c0kBim0sW y8KkeL+npFWW1cy4bc6Nf6Ii0+Xv7Zbd06GoB39Pdev2IvjKBhiGpjkrzm2uoqKUvAUa GwVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661090; x=1768265890; 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=2CNvd1Mx9gekfNSEieO/2PmHTz2A3J9iRZA5969nWLY=; b=kCUdLd1Pogh89Kdo3+YUxSzMRV5igUakXR09oemQxUQiobV9Bc34KGHLjsAbrjktR6 tKJ/OZ3STro103eP22pVg2KPkzKmSrWLTJpviTNhpMjDQwY3wQN2o09w7mLobzBGRQpB GldrwJ7/7hFxS6p6eh9tZ8lrr4V16yVks4G4l7a64rPXbGDbypCJ/5Af9BsHNOZrgrWf nA8g14rPocrdm9rXw87bGQjWkpxviZN0Gvh7pJFV9LQHmoY+CYV5G/ix+KUC1CusXNt+ vEnLzP+bLi4ztjdIoYDaXbecoZyasotrZZDKfxsV6uKJWp6u+7Va0xGBL3v5OsGvrQ0s 7mnA== X-Forwarded-Encrypted: i=1; AJvYcCXdKWpHeBW2MMGaU4JCJYAAAPnCsWp8SXGLvEbe73ljezEmtVa5jBAxhVFTpSPTT5bhnqW682Jp0B7tQbY=@vger.kernel.org X-Gm-Message-State: AOJu0Yz5tyUrFJu+IynWih8CJzILrZqnB0PHg+86D+lL6NCsZ7MzcRVt 48ZgFZeN+hH46BIJoziT5UNOTV6Mq29Ja8HmCWy02C3aeuetsOIRbAAxuYVX2rNbMRP8pUTo4qc 2kRYxlanDserRNoCNgFrdP1fdqJ8LYCJtqrqlx1BVIUEIXAQdNB6I X-Gm-Gg: AY/fxX68/EQeicqbSOGDT01RqqqPtPDOTos9PrbFT5uNihAz9vGdcOx7Ws9coJ2dFjI a+gN0qSDOjdFQ51RqQOnqDYELzcOd8KBhVpsrzlwGxuQXWag7oOspody7TrI3yLRiM/pWF7B01Q pv/n1xDiRDSC/fZbMKZ+Voh8W1q7SaaTw1hd3cWafXNOxbhdFo/tnK4rNSQd2SnDQqXXGaDWbHy b2qKcKIJjxxKQZAr/jmiWDaNZE+ltUN+9KRNGkEETNoHsclvYpKE9RZIense28XKpIUqK1NMbnP orqqtcTSC9/vLNk4ML+bf9JF0lAIf7K3RdjsHGH2eldMiMJnwQfeKD44pungvx0On76gYxrsSju Bd/hsHzq1fSzgvgRgyFZQRrexnK4= X-Google-Smtp-Source: AGHT+IH8mCx6YKDu+wL7IQQyl+rfNWEG6hhp/rXOGPYtOLg3VYxrjm0M6YCvDU+p9XB1FYaFESnhadRuF0M+ X-Received: by 2002:a05:6122:20a7:b0:559:5ac3:4451 with SMTP id 71dfb90a1353d-5633955dc2bmr276579e0c.3.1767661090697; Mon, 05 Jan 2026 16:58:10 -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 71dfb90a1353d-5633a3b1388sm87798e0c.3.2026.01.05.16.58.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:10 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 514953401CC; Mon, 5 Jan 2026 17:58:09 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 42DBCE44554; Mon, 5 Jan 2026 17:58:09 -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 v3 08/19] ublk: move offset check out of __ublk_check_and_get_req() Date: Mon, 5 Jan 2026 17:57:40 -0700 Message-ID: <20260106005752.3784925-9-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 abb668b460a8..e44ab9981ef4 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 @@ -2283,11 +2283,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); @@ -2577,11 +2577,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, @@ -2598,13 +2598,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; } @@ -2682,14 +2679,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:39 2026 Received: from mail-pj1-f98.google.com (mail-pj1-f98.google.com [209.85.216.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 3F1CA218AAB for ; Tue, 6 Jan 2026 00:58:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.98 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661094; cv=none; b=KreCAD9ZGTmPBrHaFPCDiR0z6vj3f8DDeL3VxIxj0fHI0UAtijTk8xmyhLCvGaYk3PZw7R669qIxrWegydJjPW1o3yGLeymen57JN6Y/sV0mw4ERQXsYg0kOJqD6Y4t88X8tQ0Du0F0SZ2yZD1qq074n3OiotF2NWmJRo6jpFK0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661094; c=relaxed/simple; bh=xI89Y0UESRzV7tCSwJWx+i0xjvdVKZSHY47DVEXvuc4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NGIBARwDyMD4N61AMzrirBT1sV95C03yY8e2Ip7WCGsjGA5y/KWYU/n87Wy4wkciSQH9bHpc3Mp/tPsNab8Qf7YcvbVPchbK+IkhqhQJ1KD+UEW0JGWrRcs5inSeB2SYjq4arIwXsu9lO/TBxCdIBG8ISdviEpPe6p9OCfLcs8Q= 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=RA3s9FP4; arc=none smtp.client-ip=209.85.216.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="RA3s9FP4" Received: by mail-pj1-f98.google.com with SMTP id 98e67ed59e1d1-34c37a107b3so38151a91.3 for ; Mon, 05 Jan 2026 16:58:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661090; x=1768265890; 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=Q5WtyN5MsAWspncV9EuzMpRvjHYlriGJC1AoztcB8GY=; b=RA3s9FP4qbQIUH78/O+VcKqm4a5bVrJ+5ItTGBeWMRnj32vtwzyC6XrmDcmutINaZK hcL5XZeFq7PVHbbt7rmXz7wQONlrdgR3DHkR8fn69yBYyEdxr0j5wsKSSCcSCatZSVZ8 kFpdlB0nkj5oRWU8tLHR1lWcGMYr3Y/Z+VYXA+LKjDR3mk/ayDOu0IAhlGXMWNpZY8gB RZ8OdYYixjzaM7LGq/tetC8r9HwTByET/tDdQCp5JSMVQvy7OK413wDG7sTj4i4UcpWh XP2GyXWL8dxdTV+wMHlWcyMquzNtmUmsdU7k67337iceI8jUtqhUYp9laHelaaKAHCTf 6/Jw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661090; x=1768265890; 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=Q5WtyN5MsAWspncV9EuzMpRvjHYlriGJC1AoztcB8GY=; b=GSBBziaFLl/yhzyXMoRS2WxXdPYtKJDGeRAKAxdAfYf2DdiRCJ1+k+ghZ0V0TRUeeY 81oOcaIGeJ0pJvoaRruyjyg/94NxLKoQLAXWriD9dGfLBo51xkZGQOoeJmiCftfG+Lib l4TQMynMJK2EzkLYrP0tCbZv4+jvhL+0oyg5Uq8B2QXbCvjH6xiBGr8K/e9/HHtVt8El rE7LB1y74u464pHaYCdUulnrauVDBrXaBHXGz/u0l2bpaxO31bkJkPtm1/48FTozEQu8 8WaKsvdYyllNxOeU7XfEK8rbTVTB1xt/n30sW+6cFV9YEJLCuI8XdSKghVzbCvf3f70z z7Vw== X-Forwarded-Encrypted: i=1; AJvYcCWiwPPaoCGzbDj1CqOLFVvRb5fKyQmBgtVPiRycB1N8HV5UIupAUso/+xVxUZN5oqKxcexhnmVIavg46UE=@vger.kernel.org X-Gm-Message-State: AOJu0YxnShXCAtns9m6Arc/91JVpuQL3TO+Oh1cm0EQIZKStOTtCMiJb t7Z6fqz4VQA3g8SIA8y4rAku9j+u4B32/J9j+2QYS3qZxFFnqTpg7zniUA6OlsnXTQNjFHA6JB/ NwbHhD1hVQP2UTpY/RuAh1fY+XwBCtNhl7ELR X-Gm-Gg: AY/fxX43KDwgKgEYgzISx8OeiM/T/d+xbzWGzETZfAqfa0FmhS1fuVG8OeIFxjR5Zmv U+jQYlnO2JQCYxTwtuF4XvEqNYCgVehK5XcoWtlLfbeiTMO2Fr6BHMYPWDa1gUBksu0hbIB1g0e ezJ0UfUzK2SL0dlQUcYTycVClYxTmm+ChELIkrTqbB0RvRcjBTeJUWmodAtABlSBebhJtZ2vULV YLOU2HYNYsg/FoAn9Sycoys1fsOVJMXdRRvPf67ip5CL3mWJaDWFDINvquPiF96dIb/EJtSLiGF /f/xAJPGeQVnv64taPJDcw/g1PF+2J+4D7HMR2Iv8w54XI6LqMPdUh3H1tf4uONuE9G/hcKXnqA 2kMbWCZLzF6nFtlkt6xC1ookOcaGoZmgkDnKP9A+ocA== X-Google-Smtp-Source: AGHT+IG66CjSrePDUFm1N50wGyBn1nWaPV8X4h+eDeNSeDwLvhsLOR7VdKSvTury/IVn31U02aQEdn3dggnf X-Received: by 2002:a17:90a:d00b:b0:340:29cd:dce with SMTP id 98e67ed59e1d1-34f5f367e4emr600795a91.8.1767661090076; Mon, 05 Jan 2026 16:58:10 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id 98e67ed59e1d1-34f5f836d18sm106529a91.2.2026.01.05.16.58.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:10 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 85E9A3421AE; Mon, 5 Jan 2026 17:58:09 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 77764E44554; Mon, 5 Jan 2026 17:58:09 -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 v3 09/19] ublk: implement integrity user copy Date: Mon, 5 Jan 2026 17:57:41 -0700 Message-ID: <20260106005752.3784925-10-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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, test UBLKSRV_IO_INTEGRITY_FLAG after subtracting UBLKSRV_IO_BUF_OFFSET, fix CONFIG_BLK_DEV_INTEGRITY=3Dn build, rebase on ublk user copy refactor] Signed-off-by: Caleb Sander Mateos --- drivers/block/ublk_drv.c | 52 +++++++++++++++++++++++++++++++++-- include/uapi/linux/ublk_cmd.h | 4 +++ 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index e44ab9981ef4..9694a4c1caa7 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -621,10 +621,15 @@ static inline unsigned ublk_pos_to_tag(loff_t pos) { return ((pos - UBLKSRV_IO_BUF_OFFSET) >> UBLK_TAG_OFF) & UBLK_TAG_BITS_MASK; } =20 +static inline bool ublk_pos_is_integrity(loff_t pos) +{ + return !!((pos - UBLKSRV_IO_BUF_OFFSET) & UBLKSRV_IO_INTEGRITY_FLAG); +} + static void ublk_dev_param_basic_apply(struct ublk_device *ub) { const struct ublk_param_basic *p =3D &ub->params.basic; =20 if (p->attrs & UBLK_ATTR_READ_ONLY) @@ -1047,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 @@ -2654,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)) @@ -2667,10 +2701,11 @@ 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 ublk_pos_is_integrity(iocb->ki_pos); =20 if (q_id >=3D ub->dev_info.nr_hw_queues) return -EINVAL; =20 ubq =3D ublk_get_queue(ub, q_id); @@ -2683,21 +2718,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; } @@ -3931,11 +3976,12 @@ static struct miscdevice ublk_misc =3D { 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); + UBLKSRV_IO_BUF_TOTAL_SIZE + + UBLKSRV_IO_INTEGRITY_FLAG < UBLKSRV_IO_BUF_OFFSET); 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 c1103ad5925b..3af7e3684834 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 UBLKSRV_IO_BUF_TOTAL_BITS +#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:39 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 58CD821FF55 for ; Tue, 6 Jan 2026 00:58:12 +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=1767661094; cv=none; b=txEKW1837vAZzb2zANhbpSZRYKhoRP+lV3pwz2VX/zjZKVaUidkxhjGX2WDHeJC0ScMIpYSvp9DVrXveLt/IC9wzDCMCr7IK3jY44fMAmbWVjsOefpvgg89/RyIQAlaCaxHLxrdc3QHwYUvwBEea0n51scM8cNdURq+AyjOAxkY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661094; c=relaxed/simple; bh=QglB6BGs25acZBZ2X1ev1Y2R47EaBUb4fHz318ccOjk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TUYzu0BP3BsWBWtxgenw2TupxAcWgWCmR/cP+IL3UuvtRcZCWWoPCqvvNzUtATXosI23fdQCdeyJSfJWoedjlEQZBKAQDigLaJflzNT6dqMWHQ904vC5Tr3YgQ4UsVRJ8ou5xrI99A04O/Bh2GEzPe9oZ0Tqr3f9ksL3Id2v3Hw= 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=c2+3K+Hs; 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="c2+3K+Hs" Received: by mail-qk1-f227.google.com with SMTP id af79cd13be357-8b2889a4451so7042185a.0 for ; Mon, 05 Jan 2026 16:58:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661091; x=1768265891; 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=+BbKFwj6h+lok/a61k6jPQXyKKIaN26l620iO0DTX5Y=; b=c2+3K+Hsg9J9HIqPIFY6xzuVNidUVXFtg0YEgdmJoPEZAPU07aOKoG3CjFjUEgr6wT 5SlqcFEEqpatwPBsNLRD7+NM+6fFezWZAHdoqe5WEmQ6fKvmOLoYneNXIjKBNN+2EhOB jA53DjXUfCAhBGXeO3cxvLsPm3AXVZScshGaD9hUZa3IxFwc7LUR3shyGdJbiFYgsuOd alPTdT2uXwlhgNTvF9YgrhFgKKLZM1o6L7UVTcIHYA1AQg5BNBJHzKzYQ3h6OyXcHzFr iPSqPLvBLHN/u+b8Hv56T9vJ6FcVA0Zkjuk890STRFEmmbz9zLRHR1aBM4T+0eL3w4wj ZrmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661091; x=1768265891; 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=+BbKFwj6h+lok/a61k6jPQXyKKIaN26l620iO0DTX5Y=; b=MPDuU+okXFbUsTnAtezc4WddgQVJOvlp+QF5apiFHeNypQYwGvTf5VPbHhiX63v83r EQpFzmhnJq1G3e/vGXXWso19Vqvj2Q5eD2yJjTTrP5jd3SL21VfwyfwVA/rN3V7XoR8d lQ24r36sZtn+ISVD9SIwG6dPwJAnBazqrhzLn8mWXuTNxzzE4LyNzKNLoVooQ9MEOGrj Qq/B7RADSMJXWEpwUytP3SEW0PFfu9FDA0uJsKQd1IiEUbPjmiHPXkq/IsIaLLkdYfo+ yVCyvFvMXfAQXihXz2ouI3okiDIo6C+zzuUOvscRuAEpAMS3E7GpszsXNOOAj+OJEtK9 zKxg== X-Forwarded-Encrypted: i=1; AJvYcCUKdlFPPkWpfkxUTghlsJmepPckGNVHc1YKU+mndOt02tFY1PPAvur57UTb1wgFkvcpy+zNRVpcUFf4cGk=@vger.kernel.org X-Gm-Message-State: AOJu0Yyfw5lRYxj+DNZKILYeE3uAXQAKAMtthuQRJB7JpTxsrGoQq9sS /ujxn+IaeFnNnJuS5QPFMipjHvEB07KyGEPEaxNJ65K1jqIML+1s8xciejf2jh6QSDvteCjbzik NiddjofO7wvyq/HUX17MOrRRQgqAovt0hm5As X-Gm-Gg: AY/fxX4ZsHcWzDGnTd+QBdu1MBKAUMpuG5iN1xN7S3eJs9Q07m2qtO4E56vMGqQYbrS wI/2/gNfRrv5gG+LBzjd3nkyA+02rW5tAfXh4yLbaRfOj4t5cHJrpZQcp2N/NT4PyQBIYreNkWC ISOK519QDvvJWrxxNQAUUnqllcIjpTOht0Lx0J6VDxJvUzRLlGuKM/13LkD3sw6hD8wTJdzB9hm NJyACwugF4b9r2QUBby5k8hLkjRgU/+9alrTXJUj7Z6YZ4aeklBJF9L/IW3ERRDliMmNcqEkmrN cda+KAE0jrZvoKUi+DcR1IMZoyHCUND4EYmjwFftfX/A3/4ioZDReLr4fpkAvkuoQx/CCEQ48On WrYf38eSUUPLbDYRUl3Mk/SM2KpgVhy9W14QYu470EQ== X-Google-Smtp-Source: AGHT+IEDNXV4VdNZ1DJwkLlmPxJbs0JiakgrmjqHOO6P+b26CkjANhu8BNuBM6Q6P5Surr2WvM7vVk5hYPgL X-Received: by 2002:a05:620a:3724:b0:8b9:fa81:5282 with SMTP id af79cd13be357-8c37eb6d00amr164322585a.3.1767661090570; Mon, 05 Jan 2026 16:58:10 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id 6a1803df08f44-8907715cec3sm786396d6.30.2026.01.05.16.58.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:10 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id BAA7734084D; Mon, 5 Jan 2026 17:58:09 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id AC289E44554; Mon, 5 Jan 2026 17:58:09 -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 v3 10/19] ublk: support UBLK_F_INTEGRITY Date: Mon, 5 Jan 2026 17:57:42 -0700 Message-ID: <20260106005752.3784925-11-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 9694a4c1caa7..4ffafbfcde3c 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:39 2026 Received: from mail-yx1-f100.google.com (mail-yx1-f100.google.com [74.125.224.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 7D9B821B9DA for ; Tue, 6 Jan 2026 00:58:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661098; cv=none; b=VSeKlei+aGFUMmHqidz5sBwUiXW5T7X/Dmy+YQfumsAN05d7MsumLhgS53Yi5UpYBNv5aipWiSX+iyeSF3WS0UO02iZG80PrDS5cQBM/Lvil1z32uFaly6O5BEl3peUdZQq4sDHpfS14Ot12nRhL9cv2zNyS2MrVD5mcMKU8GfQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661098; c=relaxed/simple; bh=K+Ly1Ox8dRBx9GbJxCSicuUIIRFKVZFbpf4vc/s24uA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VXDD+FOPQqIHHg/kqziu0OTjKs2D03EILYtf+1jMtZLOPM88WnMuDkBCoejqph98AtjBp5bRGnb9rqu2AmrGRSDc744woTb28g7NcgK4it+5seKiU6k4lGHJLbsMWmxAkCHW0FJ/f7p3EdHjpeokAQ0p9nq0nYxmDvyDezUTL1U= 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=SGberfAT; arc=none smtp.client-ip=74.125.224.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="SGberfAT" Received: by mail-yx1-f100.google.com with SMTP id 956f58d0204a3-64471ddc219so67693d50.0 for ; Mon, 05 Jan 2026 16:58:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661091; x=1768265891; 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=qOZvbvdmmZEZqcMiM5wY1+jFl0qTfwGtww3RZ6M2ty0=; b=SGberfAT3rzrXB8lX0bPSnp44daPXJ9/yQ5KFH5jswcWXxl+E4MCAPmNLBQdXLAzNx j7aBLAMOHpppDSbb0FbLQv5M2n5i1tUk8fRq3aGXHjktPFPsx4CWbZo8RI4+7elCJJFT 15Ybxp7v46c/J+Z7cgmei5DFnnvCURJOuGdNeOHkRHACGFekNsW1f4dsVtDO7aXOGHbP Up3Z4KRIS85pqfVcGSj0uc4mEjddBqXQ1Akn6hq9aoSPa1q2YaL10KV71YiIObmgNJDC pmv9K1+JtO4cgaV8hgJ7YEvUmurA5hdWY2g0mKrykbudLqXtREkA1JqS+sH7JqhvY+QE P4fA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661091; x=1768265891; 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=qOZvbvdmmZEZqcMiM5wY1+jFl0qTfwGtww3RZ6M2ty0=; b=gxJ9PYHtLUHxQCHZ8ypfCIbhXs8aYyd01DrjtZ+JvM2u6khU1g7S7l1YCC6eS6oEsu 7WfiyOB9nMEH6m9KdiJ3aJYa79PoWnokYNWduJJkx90goCQHXs8kdZQbGfBRzjEIZ0dM sEJZD0X1F3G9lbDUKM7pSSvxuUZ9nCHr4nkEcZcMy93/9hOtSI6K4u1+M8V1MLIdBhV6 w75ACcAx/xqSJcNQ/TIXcMe3TRkwdRZSyb9Ry6zkRxNf37Y/rQGo97RKp1FPlHCzzzq7 jrkGN33pfz4uTmzlnhq/Xg+ztDJxTlwcaycf+RpncFvFdsUlkr81Han405WEpsZ+G9MQ nwWQ== X-Forwarded-Encrypted: i=1; AJvYcCWmq/BPOe8AHafghn+RfSjOxEkBEAOOEOarFGrB/iPE80kqRJQVJbmakdOhoe24nSXI+UzXxOHYaQ2a57I=@vger.kernel.org X-Gm-Message-State: AOJu0YxU1ifsGaqOpa931JLjhxQj61bUME+zJJ4Y/yDbaQ/fSe8qSn9M FvI3yKU4kDhR+QzoqnlTPBS3ocB61TpEl3kLr5xPuzf8h/t3a2nvG7vk9Hb5rvV7lSE5T5VcnvT 2JQro+bFXV7vuKrfhYI6Tgb+3dk29mO7VVknF X-Gm-Gg: AY/fxX4Kq7+HNu8VtkINPnsOy6sc1R85O9Bj4kHLptyormRXEBgnLfCpE2e7AiXtsSw TTw79hHqtYlRVFRKCG1gqmEIV5rWehrN2NQ/ihgCIOzbpSKpUEFANj612nZ0PtznWtQo+2B6ETL M5QdYWfE0t7dfsxPBExGOfndpa9JmjI5gXZy92ejgFaCF18lpGcZijQsCYDkLc5JqwhthSpIyrb KGwLRlvFmPlVYZv2voVl1UeRXBAJTSEp7bM2wMM6kfg9dC2UQdR7gzg0DCaqjmHIW0/TzcuwlBu ZA/4fk0mOTf+fQWjJaDIVa72+2sJuHNnHxkslJRVMaaWrWsPmtzZJmWY9tH7yJAKgQmwdFbG1Tj QhG8bhgS16NoS6LQXifEAzayH+P3nkp5KaECCGemFzA== X-Google-Smtp-Source: AGHT+IHIDl5pym1kHj6cRi0lIcnBXZXkIIhlpSoHFIti7CRxDMD29jNYI8pmlcFO7ukQoVyyP1PQMyAHrinJ X-Received: by 2002:a05:690e:12c9:b0:644:6ae9:f60b with SMTP id 956f58d0204a3-6470c8289d7mr1103926d50.1.1767661091197; Mon, 05 Jan 2026 16:58:11 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id 956f58d0204a3-6470d8b531csm64665d50.11.2026.01.05.16.58.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:11 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id EF41D340DAB; Mon, 5 Jan 2026 17:58:09 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id E0CDDE44554; Mon, 5 Jan 2026 17:58:09 -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 v3 11/19] ublk: optimize ublk_user_copy() on daemon task Date: Mon, 5 Jan 2026 17:57:43 -0700 Message-ID: <20260106005752.3784925-12-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 4ffafbfcde3c..af9ae828fd82 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)) @@ -2715,13 +2716,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)); @@ -2742,11 +2754,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:39 2026 Received: from mail-oo1-f98.google.com (mail-oo1-f98.google.com [209.85.161.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 D947E21CC58 for ; Tue, 6 Jan 2026 00:58:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.98 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661098; cv=none; b=MeEg7Oy6bAqilY/sh3wG7Yul63np/1CH+Sg7MXNcZSJBD7R8dXtfaw6IYeDm7sIdCz3fyJRS2UjQ7qmf2f4cQrWHfvzq8UCyzYdWaeljuU397PJMOzK4yJftze7VGuD2PdfFY61ID4kgXfS7wWJrZeUP/T1++Tkhu4fK6vA6rDs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661098; c=relaxed/simple; bh=C7WOnO6ID4LqxTasOYmRz/f/EOUiS1sTWpJj01SHmZ0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NPmPtiDEOWUm2zCnn+XQuBJkji+9jgq29NDe3qbWiNUMihYxj+2zp5/VPRWr0jnQbQbAyZ5jYlZhHE9BSxYQwo0Sn8TUiO5ha7rX5E1GK8NsjPWWVFnImy3wsKpQgjVw1e53CTRqajf+p44vss9O+XNUJRc9zw5UKnwH++xKrxI= 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=Pw9gKtRb; arc=none smtp.client-ip=209.85.161.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="Pw9gKtRb" Received: by mail-oo1-f98.google.com with SMTP id 006d021491bc7-65f247ed98fso7987eaf.3 for ; Mon, 05 Jan 2026 16:58:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661091; x=1768265891; 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=5bEkLGAxkvhhHV6OBGkQMN8FAiPS5rx2ziWg20da5Ww=; b=Pw9gKtRbEcNvLZ9M2gdnR/rFsJICU9bctaHwYi/qb4qAUecD8D5diL2qS9EUq8DWZd nNyp5LLUGBlur0+eszz8Fp6NOYvvAWK3yHlre497PXKF4oT5nCInNOmuGPG0Qb1hYy8j GNGq3CaIehBPJ943kOnTPrR0rK9ZdZ5Afrv4DMtYzK8MM/fAFXCI83XjS6RoVKZWvWjL CiVapZayTw14ySQ6hZFM7XW+Quq1oXVIqGP6zNAAz2L+9sJ3l3y8DZqwmnv+dLn5oV7E +DJb5BZDc8181/rdSnplkCmnK5zAjsJGrvXIYFjcdDPfXn3smC3wvzcg1NbdjT1Eto0s AjxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661091; x=1768265891; 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=5bEkLGAxkvhhHV6OBGkQMN8FAiPS5rx2ziWg20da5Ww=; b=MRzO+ybJaso+nlPNzEDGV/g5KRd08LiNNxfoMMwQxo5mjdGqTcMDPjxvTZ9hTQLSai Prj9vt6SXj5mU8JvLgYBalVu5a835b9Ak4ki7ESKFTbSLwv8f1E8qvfPH5tAWeFmpvMQ nnbGbbx/8T2+bBCuvRri3uJGZbWPkrIlNlqiALZ0Yzy1WX1QoSNUHCl4NV1ZH+/yBgKt uCGUQKnggWz6pztgOVqxDKKqHx8r5deupAJSAEPE8Gz9UlRTJs+b+6IPGj6mU/dgFNSh AQO3pxbRDlKZRpLbEYxp5vUP7v7N/AcbPX/480/cJi0gI5PF9B1jOMx40wDkNs3bd5n7 Mdwg== X-Forwarded-Encrypted: i=1; AJvYcCURfo7NYKtHl119H+CANCdVOf7mTG0hUmu2D0fl0ykDMC9/il5eg1ftDUUD7Tv7FNcstHMt+ZiZSrvLkHQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yy52zWPlBxiw62OgIUBFWm+Pp2X3TWyKNFeaj6RbUMrl2y1y5YX 0IGGHw0gdsdgXwUN5JvC+xntwMizr3hu0J+jJR8cz44hbuCdUxNY2nX/wTY/e+I89QEESTkYvt2 ljC1lu8bMAH5uZENKJz9zpYr+WdvCRh+E1PiBtvgqNb1T0E0i+MZH X-Gm-Gg: AY/fxX7ZuMsNShg0tUR/2/jKQYnRaS8hzeAhKELLV+4WTIE+KeMAVldKNdGf42lfgPw 6pvkXHu7SQdTworowxMk9HFa7Z4RFliIp/KBk+L9TMXoV1vO4uLK+JIyf8S1bvkVbj9Ho5kBRb3 OzLi/wQFxH+fKtkHRDm/epj7hO3CKD/Y7jETCpC3AT7TzWqt/zyD/AVxEAiEhNRrErUlyHkTSS1 dfxAR7WuvaL+KbsKLMO3SBNFF4eb9ZWK+FjIBHhq5Yr6bx5TLiIy2byL/vu1/qQsffuYJCl6XEe 3UHLBBQx0z1Ea94jScSxpH6G26BbjpTlMDtgrGgGy2w1fNo74cBsBX4hp7WPAhx1N1DAZpOzEya 82EsDKindrybrlNvsbPNECZ72/fE= X-Google-Smtp-Source: AGHT+IFG8Io995j2dSJYPSJmiBupcP810PQCJoAnia5A/MggoC25scMJzZR56R+YMLt056CG0G4W8kcI28h3 X-Received: by 2002:a05:6820:6601:b0:654:f5aa:7434 with SMTP id 006d021491bc7-65f479fd91dmr439065eaf.1.1767661090901; Mon, 05 Jan 2026 16:58:10 -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 006d021491bc7-65f48d05533sm12250eaf.7.2026.01.05.16.58.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:10 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 2F7C3340960; Mon, 5 Jan 2026 17:58:10 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 2103AE44554; Mon, 5 Jan 2026 17:58:10 -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 v3 12/19] selftests: ublk: display UBLK_F_INTEGRITY support Date: Mon, 5 Jan 2026 17:57:44 -0700 Message-ID: <20260106005752.3784925-13-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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:39 2026 Received: from mail-pl1-f227.google.com (mail-pl1-f227.google.com [209.85.214.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 8FAB4223708 for ; Tue, 6 Jan 2026 00:58:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.227 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661096; cv=none; b=L3PYjUHb2IqRo+mRuTgTLAbDC7sjUn/O9dPm/3a1bA32AScgCqYSe/KhEMuEpVF75EwcIan3sF196tkzdFKASkxT4py3b/TB/FV4Wh/gClrXSRw2lUfTH1DdcDP1XESKz8kJumkD+S0hcXDiNuLHKy5hOX+QFXXQZBgClqvRFnc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661096; c=relaxed/simple; bh=W1ZlcN21O1nUErIL2QddLDLpe6HN6kZRnr32eNyAemQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=izr1IL/bPLAgN3PH2syvZmK47JHy2vz6l7d4xiqDmA2qTUFAfVl73TvnZvtSDY48mIRdQPhMYfxhM3xx4AlDq1ERyeOo6dLmkH69hqvv/FVq7G4rylNc6hnNtBnWbRWrqoWDwOYDxsMxw7LDXDhHui7bwJ/QFJTnUTM4MxrxIfk= 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=AxZuJH8w; arc=none smtp.client-ip=209.85.214.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="AxZuJH8w" Received: by mail-pl1-f227.google.com with SMTP id d9443c01a7336-2a0abca9769so713915ad.1 for ; Mon, 05 Jan 2026 16:58:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661091; x=1768265891; 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=Jcv9O2RJUqAVhSh3+8hkyCUs42mqp2c/jNxHfDkP5b8=; b=AxZuJH8wbIWQSNz5LcKsA2GGBvgRfyBJ7Dn9hAwLesIOcKQ3VWosKqTwS8kZh9LbZD OxlO4igUZkWA6OFWW7sVl/f8igL+ej9Ddz9gG4AQahlVVzOFg1DuXUsKegs0oUAl1q5a KCLSaxf78MpvZV/5lb/ZJW7LutOWGxY6COLiVWibjjiu3uuOF42X8fSo/lJfLRaxW/3W 0EGiwEogd1prEzl8M8TB0lAfy2NSWhGQ8kwBHHylb9f+T8i/5zNnXzzefFBTuiOkZJqe Dc5Er+0NLH+WJmGD4M15mK43U0iPKne//IrWWx/PzqWr25ga3eXWvdOLDyXDdVn0WIao 5D+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661091; x=1768265891; 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=Jcv9O2RJUqAVhSh3+8hkyCUs42mqp2c/jNxHfDkP5b8=; b=v2YO8JlWUvH2jJqe4w9qf/TnRs+VI73WavwCrU48dU6PMBOQMA1Z+gxm2aSUftO24x tQ1WkJcIbjl2dqe1QTe7f7XHAIceDYW7GExtGUvnPROFY71xjxtayPyMzrPfgnXnk7Ux KP6OiViigE4ZWi7HvaWhhptfNrE5S6rc2o7coYXpVbimhLoLxsTLMmTIVgdg+ama2etS 1d6VNglfrpG6zEA4t44hpSM+qUD4CXM7jflQrxb31naDZ5ev0NAalU8waCIQODDyoDgU VjZQ4ehbGWFCzNVBUFEceLsHszpRrt7a5L9OBn05vgsQ5okQqiY/llzzqoNbxseBE402 Q53w== X-Forwarded-Encrypted: i=1; AJvYcCWIx18ruC6MOL0uIExS3Lv2Jzz/7J5UxPsXT4KijOh66sNXy5LsNCp2tFATT7hk3m9uO4M3XEIGRvv2wvA=@vger.kernel.org X-Gm-Message-State: AOJu0YwvB0zcSnDXwYa2MmLbHWr4GXl1SVVCHRneFWIIm5eLtpS1KH8a hCe1nMnpXJ35O7945F2SW7dB1NwFRlapqM2GgoLQXcWno9o7HB6nrZMkosyVUWOpokkMfnG/kbX yV1Vo6CXpQ/LFwXHG2dMufO7l1H+9HosJCVPh X-Gm-Gg: AY/fxX4N48z93h3IVd1aKTVwMjyg6HuUJ1AHaQj7qHvNvzrST6qsV7LVwKLwJIqh15A HBR4ZbvXD4VKYiQUzxzyXiocOQr9bxjmX0zuBVcjO2ZKQnBsFqub0CvCbmLCVWoCN4OjDLDRqAD Zx40x2NGoJ9AYIFCGr0o+kfEujljIZbhU/CqGussyoUPdVNXUz+tUhM85Pp5ubQJ1+kQspnHoJG cH8NT6WS7oXR/xBAbZ/SVWCMPq3/krQ7W8YTFA81iOZumG/f3In7G0NswcyQpl11WmFa2ZAQm4n M/DkZAV+W8/hQrENSC4fJEFPqpePVLBACI7xvySyMFLT7ovwM7Ao7kkrROwO6P6My898zFIyEhQ Xf+rS+mhc3MnAJuAPKLDx45zKx7hVQElAGQGdaeF96w== X-Google-Smtp-Source: AGHT+IHLQX9+6t9gQS5XXoTmsg+XV0v3ZeAzjuEnNtQMHHDKs8HvmssZR5sNGfICmbVWpPQD/SfXOwS3XIFV X-Received: by 2002:a17:902:c94c:b0:266:914a:2e7a with SMTP id d9443c01a7336-2a3e2e2a904mr9242545ad.6.1767661090901; Mon, 05 Jan 2026 16:58:10 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2a3e3c6017asm874605ad.27.2026.01.05.16.58.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:10 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 62C8834173B; Mon, 5 Jan 2026 17:58:10 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 5472CE44554; Mon, 5 Jan 2026 17:58:10 -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 v3 13/19] selftests: ublk: add utility to get block device metadata size Date: Mon, 5 Jan 2026 17:57:45 -0700 Message-ID: <20260106005752.3784925-14-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 --- tools/testing/selftests/ublk/Makefile | 4 +-- tools/testing/selftests/ublk/metadata_size.c | 36 ++++++++++++++++++++ 2 files changed, 38 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..41f776bb86a6 100644 --- a/tools/testing/selftests/ublk/Makefile +++ b/tools/testing/selftests/ublk/Makefile @@ -47,14 +47,14 @@ 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 =20 LOCAL_HDRS +=3D $(wildcard *.h) include ../lib.mk =20 -$(TEST_GEN_PROGS_EXTENDED): $(wildcard *.c) +$(OUTPUT)/kublk: common.c fault_inject.c file_backed.c kublk.c null.c stri= pe.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:39 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 8A880218ACC for ; Tue, 6 Jan 2026 00:58:12 +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=1767661097; cv=none; b=R+z55MO5nMu52eZLiCj0H7cKgm6cTzGN63FY22XYg9Du7mUhJBDcBeOGVx3zEkIDds8ELqJI4G/ubRdGYgy/UB5WnG1U+5yTyU3R/PK+9edk6bwgpS2pJ/e2nnsnBenafth678l83UPkm33VlNsbSatdnA0qjo43HlkBEjfI5FM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661097; c=relaxed/simple; bh=IPYY2wbBuXA+AcMOcnbpgxkjyrfpEhzCMqJgIVN4z+k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hOgj9wWDprk1AXo+i0zO8hxNIL+O54rBOVd0InY0F89yUqQMhgpXRqzRN6eeYgcAICM33HOUofneuWy5eTysYVrcO8xLaGlYKGBpq4mAahc/CnbHZ+nt9xKSZkSJDQqed5k9IoggIR4nDYtgt1vPzMs0/xDOUY3HixrI5w1tiNw= 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=EviorJaS; 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="EviorJaS" Received: by mail-pl1-f225.google.com with SMTP id d9443c01a7336-29f08b909aeso1204265ad.2 for ; Mon, 05 Jan 2026 16:58:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661091; x=1768265891; 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=NX8hqML+byNHp2sVVzUNGB3O5iFG2jebjBWHWIKuGfk=; b=EviorJaSbL4AWfTneOLYMoSIrOz0z7EMnJPw6SJcjJC5EpAd+4bRaB9Y1q4cBCCykj osM0fGrJYN1ASX2jZDUmfNg1hPy9xYi02IPpYTVreVUtgp1YdLlSE2fjKccROqNOg5uS KDcBfR8nvd868+yyJ0qtHiMTbYqaaBNAi6ZhszYOcraKqxKyipiBJIIy9bR8MazRntZa k1wMpDMkz3Z/8wG0uaxK4Hs+1QyGAHVyK+bWL3oUwAEMPdJ1GYuFjLm+nR914Z77nutV tvijYXmkdAcfy6Ko2XnncHzTYwTV6HbbFSyEx8vayiwcBapiFIYndp02jS8MQvdmxViD heRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661091; x=1768265891; 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=NX8hqML+byNHp2sVVzUNGB3O5iFG2jebjBWHWIKuGfk=; b=rc5qjyxL6+wv0iaL8eXIEx3JZBdrquUbfQUAZwKHYkYfFMmuqSnmZ6HZQDi2EgNa65 Rgkm1JgSBO4nGlZ/eDtucKB93yrgq1CSl0a0uvxHL7Fr9UoOUvxmGBWIMCBrbzChx468 rCraNJg+T0bdpvv3W3HMVvuLi6e7KvQqmarrGeLROt6DY5/hulnsmCMa5FeQMojM1eoN EAM6r9//rTRM8d3sUYHTwGfl7+Tq3BizIPIbu2yWGYg9HNctprdiYzgUrM2VtxnK6At8 uYrpiMnA3kV3r4PuwO6ol5ONn7Bj0yWNmJP05GGDra010VutM4Ao+nHxKfBhKnCWu0/V hGSg== X-Forwarded-Encrypted: i=1; AJvYcCWrRDhhNn52bSnctID6h4pk4pcN8jMacR9LVN3a3LEhRk4Gk23RVJeRtH2lutnOlrn9mTOo8plVHvcMoYQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwuadrAj3jzUURZVjjuv4sq7xzPh7enb03/MNEUwXqTeBuQ7XMz VXEMonsycZZUxFeowMFJkCfA3/97/HBS/jiz98I5UTUQ2h9Rz8ORqT39728TR/P+TF7AUUjX/uv 9rQd/KYwsc32SbDv9UhFMv6FBcHJA+g4XvgLbLav2LhANpq/u1scZ X-Gm-Gg: AY/fxX4Ew42xMke/DMPmuFPk2o6JRsu00BVn9ifEiM1DGqAb+2ltu+Sz8ZD4X1sBxzL JQlYGGNJyBZXm68O7fszM1Pny8oVtPY1ccC22lHrGvJxoy09lwBbDqnMuS2bDYoJn8VHsNvuFlj BsNZAZJxGIdWPq+cKyc7AO/o8GGpmiX43P+IygN5UgVMwB59idao8qhGHZIGlJb3xupUeRZK8d8 scOlflDAVgcGeGBjG8N73lTC8Fxufhjs9LioV+zGGTgc6rCuJZ5TG0lQbLeWCQLpxqA5L4/tLYh H/Wbj4ie37aEnKT2jr8ne+dahYYWBCEJIBOHE3vBowDBB5ecWsOHW/r1Y3uB55CWd5v0n7itpdc GYVmOuLnVcCfAKQQ037Xv4rhJaHE= X-Google-Smtp-Source: AGHT+IGlHpEYfGJHu8asvierliF9q40rmYqcq5c54pYGpogElQsRG/6gDNPISUZ0Zx29y2klQIH9vI5bX7Hv X-Received: by 2002:a17:902:e743:b0:29f:2df2:cf49 with SMTP id d9443c01a7336-2a3e2df4b5cmr8812695ad.5.1767661091023; Mon, 05 Jan 2026 16:58:11 -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-2a3e3c3bd5bsm841955ad.13.2026.01.05.16.58.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:11 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 9852F341D2E; Mon, 5 Jan 2026 17:58:10 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 89D8BE44554; Mon, 5 Jan 2026 17:58:10 -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 v3 14/19] selftests: ublk: add kublk support for integrity params Date: Mon, 5 Jan 2026 17:57:46 -0700 Message-ID: <20260106005752.3784925-15-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 --- tools/testing/selftests/ublk/fault_inject.c | 1 + tools/testing/selftests/ublk/file_backed.c | 4 ++ tools/testing/selftests/ublk/kublk.c | 48 +++++++++++++++++++++ tools/testing/selftests/ublk/kublk.h | 21 +++++++++ tools/testing/selftests/ublk/null.c | 1 + tools/testing/selftests/ublk/stripe.c | 4 ++ 6 files changed, 79 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..6ff110d0dcae 100644 --- a/tools/testing/selftests/ublk/kublk.c +++ b/tools/testing/selftests/ublk/kublk.c @@ -1,10 +1,12 @@ /* SPDX-License-Identifier: MIT */ /* * Description: uring_cmd based ublk */ =20 +#include "linux/ublk_cmd.h" +#include #include "kublk.h" =20 #define MAX_NR_TGT_ARG 64 =20 unsigned int ublk_dbg_mask =3D UBLK_LOG; @@ -1548,10 +1550,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 +1615,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 +1706,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 +1770,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:39 2026 Received: from mail-qt1-f227.google.com (mail-qt1-f227.google.com [209.85.160.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 0A8C1202C5C for ; Tue, 6 Jan 2026 00:58:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.227 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661101; cv=none; b=e5Y74elpo8xYSZbYMK7E/Sd+hdtyE5B4iH5buvjg/OasXWBX/WLCWterz4TeTAL5BoHO8jzidOUXA+6T4OrxiC/yYt/i1pH38hI3zWgvvG3nQa/4hyaAQqC3A1wH2JDWbXOcdFt5DnfjxQJ3lie1BRyUZoKbKozFZnBYZ6BBEQY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661101; c=relaxed/simple; bh=QxssRt2K7/arHhwAENIHPr/xs0l3C9sgNhJ+s1tkF+w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=isAhfZM094ei/OLFGYaMTo8g7qC9qr6OZbLmUl2uENIvN/+MPmcyKjUQ7nkrUWqhcouhy8w7svSSMgbvyK/cmrpy2vp5AUZnYbCDUFZg1wmx/2S/aa59pF13ZQh++ofQ4HEXZXDLlq9NSDFvNePRYsh8fspPlX7yiLqJ7Nw3CNc= 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=MjI/Ujfr; arc=none smtp.client-ip=209.85.160.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="MjI/Ujfr" Received: by mail-qt1-f227.google.com with SMTP id d75a77b69052e-4ee0633c9afso151551cf.0 for ; Mon, 05 Jan 2026 16:58:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661092; x=1768265892; 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=tY6pKUQ5Qn3DxRwxGDGPj6r/MLXemuiieYvUhI1zlzM=; b=MjI/UjfrUlbaELqYEmKXoImGQYp8AmKATB26fT2jP+kRJK1SvgNdsMvfIMDrp6IOA3 IA5OjW4mGiVIK+/IBXzx+rrAIvoeAlHeVGhvi8xcD2oEqdRLgx90/m+UlkH4aYQ080sp SjeWArG0OUgk3VK+lbp1a9QE2A+QFsPqoqa+jgdYpbDyaImlso5wigNHtpUMyzqPwPrF cn09AoGfhE4g4mcJ21Ad+J2e6XpbP6X2x2UsVdZN7cnkQHSuYgQLmWWS7q5tEG/OFYSw ulJCasY7c9wqP07zuqhZ0c9l7X9godFYCQsQqa7RC/DK98mwYoWX1AColgThv35jtakf BdVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661092; x=1768265892; 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=tY6pKUQ5Qn3DxRwxGDGPj6r/MLXemuiieYvUhI1zlzM=; b=DhfFJJBj0GsD04STw8G02ksAClFidVfWK8+ueSyEFOmXTCcdxGIOmjqnuIJxAczwRe cMcnwmdm8IjhZEuQnqmeLiuyKwBSvzDKCD+0vrD7gGVGZBg/2vRGWwJBgwavHAp3M5r/ jDFtZyMODjOgvCv/t+ZtYaH6NDY+LBWgwghgIeACmNrK6waeqKzGb2FrOSazMupIhBPX tycbFfqMEQsaeJl3B2gDMjpYmcjg+TQWGaBqtJelj503okAOZAhawMr5MV9fTmkSycwf fKmfmkPrPrJwYxUrWN2CsVtEkmB2407wJhQsU+l7tWZBp+xPUArqgO+/3G7rI7i1s+rG 23pA== X-Forwarded-Encrypted: i=1; AJvYcCVhGXx+lSUkCeBsKWm0WLb0kUJW91/pyWuFEGnhVIcVDPfj5j4QDgIXiKLEIiUfmbY/KUeX3D2TwzfPKmc=@vger.kernel.org X-Gm-Message-State: AOJu0YwxdZDC5xoLNRetEsuSJuvrKvp8GvodQGXWUKgtvi5dlxna00Jl DO/FeIZyUzMVzHeNSOQj35vSrPE6+WQ8aPra3CFvT8TailtMd8RTTibFQh83AZkhupOabdYkoeP /guj/Nvf/XoLD/wxwSh68WihuTLP1VDnpTujgzipGPyYf1H0vPOdM X-Gm-Gg: AY/fxX4KI6OGHsMXiNHtPzD1JBqoRUSJ548rbSMZDa0wT/6yp9XzDM0Beq1kMxSJzJH pzbtB3PFucuM/UK9fbtKQlReEthYQSC77tzSHjw7JRpq957//j3nUj/Mkb4s7fMXdXFQEt2PHzL qkKOl9dkr1g2/e9evcJAA9/y9uHN0B6aZ9da7ztcitk59QABOO+eKFLgrVfS27cAVbFhgwqAHxG 8V9UaRcwjZlFbAuDaiFxDojmyFlYB5fAA1+Kj/17HnEklCwg3g+SHhPv0pSC7o/DlRBOr5DYq+V SnLo6V5sbcBV/TuKW99aJ7TTKa6ivEQ+7KRXRkRWriprojiZZlvVs2+9f2OLbxug7LYBCGmMnnl eaz3eCTRR2KIzl4/kxDS1OY7oh4I= X-Google-Smtp-Source: AGHT+IE3+qV6lMsdT+LdWxtRiwsIoi9qcTbvHyfusqkNl2ZgxSujSJyFfgl/w7QZTFvWDx8SUOCfZjNlVnWi X-Received: by 2002:a05:622a:1344:b0:4f3:616f:150 with SMTP id d75a77b69052e-4ffa759af60mr16305621cf.0.1767661091737; Mon, 05 Jan 2026 16:58:11 -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 d75a77b69052e-4ffa8d7f1adsm268321cf.2.2026.01.05.16.58.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:11 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id CA1CF34084D; Mon, 5 Jan 2026 17:58:10 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id BC8ADE44554; Mon, 5 Jan 2026 17:58:10 -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 v3 15/19] selftests: ublk: implement integrity user copy in kublk Date: Mon, 5 Jan 2026 17:57:47 -0700 Message-ID: <20260106005752.3784925-16-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 --- 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 6ff110d0dcae..dfba808657b1 100644 --- a/tools/testing/selftests/ublk/kublk.c +++ b/tools/testing/selftests/ublk/kublk.c @@ -415,12 +415,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); @@ -432,23 +434,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); @@ -460,15 +464,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)) { @@ -607,17 +623,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); @@ -626,10 +642,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); @@ -1012,11 +1042,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:39 2026 Received: from mail-qv1-f100.google.com (mail-qv1-f100.google.com [209.85.219.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 D9E6E21C16A for ; Tue, 6 Jan 2026 00:58:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661099; cv=none; b=INKlto5fVt+bws962ILWHgvaaEETBG+ltxiqR6AQ+xt5YtfsJPu+9D1yoql2pUMy1Zwsu/XVwtmxQb3jIG7A82BR/S53fTCn1dVXtb926ndFDP3VcEwzjYSUK411IT7Jvm9EvvmUBzZv5TydhcJ+hssY1WU/unAY69/SriieiDw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661099; c=relaxed/simple; bh=FpSk9SBO7a8fTola1zwsU8+516cI+0H9/8WbLKjGV0Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BHVQyL5LCFNSVTvV2Xc1HNY0iEii98NUmt9K5KKS/toE1BpZvUsY3qQHd/LMU0/xfKpsq1j0slzBVFpJ2tzIsLpwN4SjZMQoD7WHe3qzRkM8HheRZlzX/3y037A4iphan36jrx2oM0duFV3yupJSl0QWKcWw7r3bNfJz4+RcPY4= 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=LGcaG0XY; arc=none smtp.client-ip=209.85.219.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="LGcaG0XY" Received: by mail-qv1-f100.google.com with SMTP id 6a1803df08f44-88a43bfacb2so561746d6.0 for ; Mon, 05 Jan 2026 16:58:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661092; x=1768265892; 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=LGcaG0XYIdxQstnTwYEDXzPqNmcfkhEnx32a1N9Az6x/y/Muv2t7Kx8x9Ft79tsKum PzEXKqt9yLndcefuHKJt1gJ/XT3dAkPbPcz8P+ryWa1Y011R+8A25m8CkZst+WZWpmPw YtEAX4zfoO9LZE7DNO1+JbaD0QqiHbFYVSKj2+oXVId9+zsFDyQrdMsLRwrRDzr+XeA4 ZBbmKcIfP+Y3kutivmL4OqI1REp6vxdYbZFH+DX5wrzs09jwpCnrnacjjy7PljZjDHGn +3WgV5D8mvrx/isuyhLoApQrsc0gqLf4Z7OTGSgSiYuRtfIs97Oequed8xNAUxeyZ9FE c6rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661092; x=1768265892; 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=ExXbH6TS9Kz4kEOZpYVC2Wjx5sp9UH8r0NZWB7LANuM4sScKXr7c3EiOABfKeeSWiH wtdW6+Tn+hzhzT4Sinnymdd1tugvV56yTDCQ6ueu+DSczpq+NL+6zYwUW5sTWxxkFVgx zA0UwCsyNMqNr/+DGk+okKNk4IVNjeesEInsZ8vnecJ2e8FeaeD1nfsB4se6EfVihV3k FxJOh5B+SriTzZgCQn7nq4gu0Ga+K3gJCz+heigoSv8IYx37KO88nQmAm9zuEbCnqwsh djhNTtO6ZV35UlWy7+Qqv6yrzEitRInNdNqQXdLQBlojYt2RrI3cNNbFbWyPZvzjrvOC vykw== X-Forwarded-Encrypted: i=1; AJvYcCW4YfIVWHCHKl4c4XmaF9nQ/1zZG+f8TDVjhRG+lRbQ0aXEwXiZMofVvr8oAAwWen5+/fgMQlnUQaEzjN4=@vger.kernel.org X-Gm-Message-State: AOJu0Yx/jkJMQYgCZwlKO1dl8/KSaSb9pYbFmMCM+iz8+wm6DUMAIxf6 bXs7w2/f7RnjVvKwkQjQBgtfHuAykvj2Ti+pvxQzNjlgORL3btSGJGBEkNNWCyFRHOdjRmdJDG8 pMp5bhPC6XhB6oDsqQ7OCaFnsAWbSNsbc0XWeyxFyYDQY2+KMcnst X-Gm-Gg: AY/fxX6ozLJbCIKBJLNKZBB+OWB9T2izl/d9X6SVah2zgX7RVkHxV+PAgA3gDTSLr4G gtZ+Bx4FMqv9Zfj7agl6TUlrr0zHqAIDVWxPmyHzsvsyRZXSAkcZMF6iWeKmGgjlybo8cffAfE5 5lGqank9JH6uO7NZHZejGA0Vt4HjvgxPZDGzUjW/VcWYlcgdNfr+QfYhXo5aTCNM81PtaTJEY/7 pS+u3absqjcUZBTtG1KCKgdV8kcdZjny9NQuHdbmj8cp2NCtpRT/DeTWLROQ4NfToEMw8cP45qx phEF5BU6Pya9RgSypc1c/qjlGJ7/TPSy2CtH+JbFBvQNe1MnfZdGReYkpUo1aWmTBV+TCf0LzI2 YzeDi79HzOrokcIdscKHZbvEgcAM= X-Google-Smtp-Source: AGHT+IFwU/pBJWR2dwidv8JAygHGSrQWnV5pCYktkIbCd+APT962DRxhuMqf8abnSh/I/kA4ymWysHLBGQ+5 X-Received: by 2002:a05:622a:198d:b0:4e8:a54d:cce8 with SMTP id d75a77b69052e-4ffa76dc314mr16457471cf.4.1767661092015; Mon, 05 Jan 2026 16:58:12 -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-89077179352sm796626d6.32.2026.01.05.16.58.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:12 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 0A5523401CC; Mon, 5 Jan 2026 17:58:11 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id EFEB7E44554; Mon, 5 Jan 2026 17:58:10 -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 v3 16/19] selftests: ublk: support non-O_DIRECT backing files Date: Mon, 5 Jan 2026 17:57:48 -0700 Message-ID: <20260106005752.3784925-17-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 --- 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:39 2026 Received: from mail-pl1-f227.google.com (mail-pl1-f227.google.com [209.85.214.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 B9992227B8E for ; Tue, 6 Jan 2026 00:58:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.227 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661099; cv=none; b=o5a4sW2KMguNrOSNi0qH2q0FgMchKuykXSZuSdwoWsFPwraOITf9PB7HI341RtM5XYDxIrvxmdic8r8GKuOqJ1UVlMd6l9km++sIJ0vI5yRxpjTnWMEti+sLMORFEH7FJ3hrkStGMSB6NNq0yAwWoDxARMvUsOy8XSMY1lyvkkM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661099; c=relaxed/simple; bh=f8EP+bPK1MvqaUPNHimhlYSpt7ZjD3QQvEFMsrXub80=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IITefIw5UHuZJM4FcZdmckYN8Hdv0j9IWRhtP8lNp8LwJP8G4uUY2QLnXFbTLZWcapHoO4gs+9bHKgU7bVdN4H2V98anxK31rTRFq+g8Rn9hjYPuk1vmOk++t4uBvWQHoE7SVz0b0vudrLTXYHBBXubc9VA9LwAM2G0ni4kdXOA= 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=aCEEN3Jf; arc=none smtp.client-ip=209.85.214.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="aCEEN3Jf" Received: by mail-pl1-f227.google.com with SMTP id d9443c01a7336-2a08cb5e30eso1067925ad.1 for ; Mon, 05 Jan 2026 16:58:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661092; x=1768265892; 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=0K5vEftPdYiPKum60OYL4RUxMxughkX0Uvdp3aFS+SM=; b=aCEEN3Jfpnfaoz/bhk1xZ3Jps+gYQ7SYddOwmTaD+03+EUd6PtbbjuCPBumAiErIku a8W+gIxjl2xabja9TU+9KRYQjD4YIHRJft68ApBq218GlaOVYdbTAftul6oAxMDQ7JHj VNmdh/6JpKoEwfQBrUB9rlZk3VUWs7iV2lpchSOx8d31EcUejdoILUkDrFe9yF8vthSI q24kptbhAzjVe7bJoSO7rmhNYf+3oS49hX0kIRgpeV3OG/pWW3Mu+RjTXzG+bg5KsOFr 1OsifoQqZ/O+VAJehehxmrJMoj4qDS4Pxui1WsR16egu7Ykxvbp7H2ZI28JCgO54gKMA TL7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661092; x=1768265892; 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=0K5vEftPdYiPKum60OYL4RUxMxughkX0Uvdp3aFS+SM=; b=uFNuT0tghSXWLRk92Idgjb2d1mrkodKdhGLSUvbkm/FKi5IvOXvmvFuCvlJZk3zDA4 Q7KHgK+AnhNRjOPIuQ35yGxbc+doWB5xBAJUIrvGqO+foJpiFB3BEUNaY7VbAS61YrOW MF1sS9D4+9hoSwz+I0CsRSbxwnq7Vp+oVGGLDDj0HZBBeKNpv7kNgNyyduXrFywuIUwK isrGgmvA3tT7MiXrd7M/tH7PCzdXUhDnlE2GD2Dx7o9EYma68i+tyuG5e85+189JaCAa +0jXmWLRPTTXQq3g2J/OpQ2fYpLxNGRHZudlg1H4WBjfOd++jFAhQj96zfvIHd+yRsnL jtdA== X-Forwarded-Encrypted: i=1; AJvYcCXD3I8Y+eFKvYZpgbziZDM6pKfkwMm0b6gDiGLfoEB3wF10CmbjrpWwUbj9OjEQRdJTcRnXxLSo7Slx3FQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxSOhY4ukccsF9HpptYxr399CQhezuJTkMmDqqvhDptnQNbuAZh QfHBpLo5fTvjlFx/dww+jT7eTwTmgYtpnQoLz26m61YnELUioGpor3xIg9Nxv66y+SDQkRItF2y m6lXeLxdX9wl++wvHlU/YRbVYnm6gEnHv5XGPjgnhNtCUS8/0CZX/ X-Gm-Gg: AY/fxX6PhgaQXGqV6WkpmhQC/qNOaZnpE5R1oFD/8BYNJrs8ZxTWUUzY1mHRj5GB9GF uTDyRrKxW01CiKNEgtmrUcJ6WqhKHRUx/+6Ac9jCVSUPnwAAw4mXw0PKQlX9FOwkQa/Yldgtds8 Z6JUh1nb7C7fqnq5+WR0Vyjw5LQr+au7hacKnhYGXIgGlM7fLg8SFWAAUIpTzP8S1HdCrTgGS1R saMoGqHRGamp1YPSop6MRKLfq62SdwUy9mwjNNyo9asz78oCwxp8xdqbltA6GL0VoSbH8aTYuZw 0Wg3HUOey7kKVqqwKpyKWoOjwuagbtydJzzHQ1iHH6ElmtZ6GN/GSA9EBapUvXHPe2Mqw635XV0 4C3EhoXEGfrbm5U5TZyS7KhHCDnk= X-Google-Smtp-Source: AGHT+IEwy3xNj8bx514efu2NZrTdyRXI4rGnHiIIY0NgXLyLfCfNZnpOeahDtpiWh9+nlqkwyb1pWtp8Ofe8 X-Received: by 2002:a17:903:1b6c:b0:2a0:d07a:bb2f with SMTP id d9443c01a7336-2a3e2d944aemr9298545ad.3.1767661091749; Mon, 05 Jan 2026 16:58:11 -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-2a3e3cae722sm892915ad.29.2026.01.05.16.58.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:11 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 3E993340960; Mon, 5 Jan 2026 17:58:11 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 306D5E44554; Mon, 5 Jan 2026 17:58:11 -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 v3 17/19] selftests: ublk: add integrity data support to loop target Date: Mon, 5 Jan 2026 17:57:49 -0700 Message-ID: <20260106005752.3784925-18-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 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 --- tools/testing/selftests/ublk/file_backed.c | 63 +++++++++++++++------- 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/tools/testing/selftests/ublk/file_backed.c b/tools/testing/sel= ftests/ublk/file_backed.c index db4c176a4f28..b8aacaa928a4 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,16 +131,21 @@ 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; @@ -136,10 +155,11 @@ static void ublk_loop_io_done(struct ublk_thread *t, = struct ublk_queue *q, } =20 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 +172,34 @@ 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; + + /* Ensure both data and integrity data fit in backing files */ + blocks =3D min(blocks, metadata_blocks); + } + 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:39 2026 Received: from mail-pf1-f228.google.com (mail-pf1-f228.google.com [209.85.210.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 2049921771B for ; Tue, 6 Jan 2026 00:58:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.228 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661098; cv=none; b=VGk2KFu03+0thk9Th/VGzFG9sIRpateWnZODdW9SkwufpPFLWgsVVUI3AKuHQE6W4shRCisM7FWnCQe9ZOFPFpvmPGjwd3g/GY2+fnFbdiYvJfwN8V9mCllWx7rs+YCKb/CZNitwG0oiSVGK+GVh8eC/WoLJQrEb2XvDaEps/K0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661098; c=relaxed/simple; bh=T6I6wJ3K0zbZovsFhPHvXVOw2B2xHcL5y1GMqwzvtJo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=madegPfV6thca3UEZxA2y4aRBbAFGuHUOV6AC/NTgMjrhjUA+ZZQfYmHCA8A5dxSdokyNEWChrZ39M1yvhca8SntBxXlB8Xh5KqiGUi5KL0YCEZfM3FXmN+V2qeYes2+5+wMf10xTJiA1fWxP+WFbWYvMcI7smm2iJ59cxll/3U= 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=Erk8dslH; arc=none smtp.client-ip=209.85.210.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="Erk8dslH" Received: by mail-pf1-f228.google.com with SMTP id d2e1a72fcca58-805bb2d0cf9so44031b3a.3 for ; Mon, 05 Jan 2026 16:58:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661092; x=1768265892; 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=iMHoFk6qxgkVzaDa4BWjqhlQdF6TcBBx1Xc90nS+iKc=; b=Erk8dslHtEk+VVmVQZ1JOOh9a60x9QvHCP/seV3ipf76gMCL7+YWMQPq7mPOKIBrl1 LGl1XZgNOdGhj81VxCqDB6IaoquF+xCNveqs35ZPo2gUCa07dG95TfyddZFiDYybbaT0 k5Y5ZNZBSJ4hDJC3SN9A/ZS8KlC33G2Q+4ZyM3f6VZaHXXD2m5GPwhII7fvzwlmSWlMB tKnoIJjEE+cxR45q5jSS74qPOiEGtbl7ciP9L9DuyJHAAl+569tKmu+3vh21fvaP7/mc 2HBuInQmX1WUxOBmMA/qSnIbKXY4bgeVP30bIHqHbe4keSXDO5J7848r+0sqJYry5sJg z95Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661092; x=1768265892; 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=iMHoFk6qxgkVzaDa4BWjqhlQdF6TcBBx1Xc90nS+iKc=; b=hZTVo/0pcsHdmj+ZePLtP920qZB2P0Pq7kMHxmlIbgPZ2jTrZaY902U8zikhm04KWZ ul3XcyxHowHRz95urs26w0u2d8BON3Z8E7joWdwFt4lk01hYunS5AWYoe7Ug9IddwPPM iPvcTj/8JHoCObHN6YkGMt17OOi3eKpN6lasg+rggjNBMSAJ3MioEx4ii7A7lJj02qfO iK0It3sgiIW4q0MtQy+oN/gk+Y/zCSAdJaA/I0PmlCSyG2jfmqICl1FNa1N6OQBJcSrI VSlVnSnkqfqXHYfJaJuN3iRo/losTlyGDLYrt4DVeO5XLV7IaRaG2E7w1fzTnywkN2/F Nm7w== X-Forwarded-Encrypted: i=1; AJvYcCVaHJiN0TTEJ762amf04QdHZhqF7Pd1Lfbz5f0BlPEnOAs9CDxnrpEy+kjK7Lukep+P7B8iSYSwEE7jWIM=@vger.kernel.org X-Gm-Message-State: AOJu0Yx5pxj1fuSqrnLySvt3RaokohmkQZ6RWETUZPu8ovedY+6LOP2S vt95p1Z1FgaltfYyEtYDbm0FTxaHby9MQavsZ9U3l15+FqgXyJqRQgsLxohLOH8QNe1WZ8ViZBH rA1ELvRoVJ3uBTppSTPwKVhWepK5icpisZnbM X-Gm-Gg: AY/fxX6e6o04rKNJy6J5B4upJnX2Qy9xX3SIvCKeR9Jmcg8YnyzH6TDFVMwhm/Sm4Uk +JvfWqED5Uk+d2JQ9EI+cF7lrzNPezPzCAGmuWJQI11Bgbc/jUEepMYKsP2Eps1YC8vkH6xZxGH yOLyjOoX2Sig3dhxfEdO1QaRIAX590sz6rWKpk5OdKfJYTu58k0p9PmPRwVSk1A/RmoG8/o7C8f QLz70oF/eQTm/lN+VjV3seNAodvvPJIesXeK6LgZ3tTmaoZgQ0c8F9jAB/3pqFJKzcaP+/yFDIG 4Q3C50jRxQvH1QXsWNnetY2dw8NY0BZffDGmlpzYgjgdH1ws+QTHxdpn/5hnolq8gTJjrVmHSU7 g3rY9pccoLyLIR8lbTEc7/kVNLwr9mCDdYTK+AhOduQ== X-Google-Smtp-Source: AGHT+IGbX14HlpT+oEMhN3SMTerXZI/+I63Gxe2TLTXkzaU4YX0ZcucMBqs6stDwHIRKLTgGgb15nM6tG3At X-Received: by 2002:a05:7022:e0b:b0:119:e55a:95a0 with SMTP id a92af1059eb24-121f188a665mr592876c88.2.1767661091850; Mon, 05 Jan 2026 16:58:11 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id a92af1059eb24-121f243aca8sm115872c88.2.2026.01.05.16.58.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:11 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id 73B3F340DAB; Mon, 5 Jan 2026 17:58:11 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 659E6E44554; Mon, 5 Jan 2026 17:58:11 -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 v3 18/19] selftests: ublk: add integrity params test Date: Mon, 5 Jan 2026 17:57:50 -0700 Message-ID: <20260106005752.3784925-19-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 --- 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 41f776bb86a6..bfd68ae64142 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:39 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 2D5D7221FBA for ; Tue, 6 Jan 2026 00:58:15 +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=1767661099; cv=none; b=T/Zi+MHYhMFs7NTwPnGcMeQY4yE0hZL3/ZDB0iCNa2NExrGyXD4m5ZXgtKdrr8JmBMhYSL3GT8LnUORc2zsOZcwDyqYcCels1ftj08elv1jWsBPKgoRqHxX8wJ6qJ5EvWIxqE5yvdKDogiL54d2RHeZYbsC5hIymz9cr7CAwliI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767661099; c=relaxed/simple; bh=Z1UdenNqomW1Gdmx86hqjdPqAqBfGOKQ/CBxjOYJH6g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=c1YKSWBJy0QuIEuiWdPcBhNPwaqWM5vwmY7C8ELJ8r2X63mY8mxQ9GXd5Na4o3TD5m9R1jCZ5VklREOvKleKv91VaPSfwAeVyPZ3kkBHqdvL63/FrjUZP23Nen5W8xp2SNEmADPr8xCNdoAxR5KnHJ9plp9z+he62TPcSVGRJCg= 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=Nvu4zP1A; 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="Nvu4zP1A" Received: by mail-pl1-f225.google.com with SMTP id d9443c01a7336-2a355c8b808so632845ad.3 for ; Mon, 05 Jan 2026 16:58:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767661092; x=1768265892; 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=iWgbGYobkvaFSQnhmymI3uWpc8/0KXyANTacEmbRQf4=; b=Nvu4zP1AUR1u2OTOlSMg1Gt/rqgn6E7TwHYkzScRZgn95dYdn5uIBZiZJYMROpju/0 sHiWsiLHEE21xxGhXelaOufc79a1wWGWL/E/P4kl6sF/2zdQtRlwMQADZbcSsaxTBCiw 5K4NvPnajm7HIcoSDGrHqR81S3F5LixvAFPa2xWAxIE61Khvw05UIHQp5sT3ohv97AB1 qyefiE4TTxxsd4PMiZP4QOPUvfbMY+i556dIrsY9VvX45oETOWYjDYOu/JMlxCoezKbB DS8ZfqdYHZ0CpcUP3U4ACIDgKT/2DRMMooQqibn2xzDyxMBnyqYPn56JSv0b33vDz4Cv RBKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767661092; x=1768265892; 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=iWgbGYobkvaFSQnhmymI3uWpc8/0KXyANTacEmbRQf4=; b=iCu7YJmmj9SEHEqEgamb8xqe+WbJayPC1HmDxNWYlUXpBXu9f6WRFevHDbWpxqQA7Z D0rb5jp2QuedZoSEwPPMaMgefQSnLbVeJNdFCW9fSQnF1/6+R7H4EXvrEJURTTuP9OBJ NFtT1tDStY1orp/UWvfAtgpmBkofnYg5vWJbysykwRGDZ71LNG9f+hlXBhAwUCurCvSm 2sEPSU+cDN0egQQUdt+K6MA2yFgVqjs9GdNi+ySRIloX3b/7ZkX0d3up1VVQs1TjYGjo 2rRywfya3c+dDM5IJ95LsrJk167IlC3Grjbq1sH0bwd39I4VDqT3Q6plKH1hkN+LgY+T a49w== X-Forwarded-Encrypted: i=1; AJvYcCXXZ9ztH8O9Svy35ME/Sy7yADz9OCnTvXXFoNqiQqcOpulX1Qqb5sR012lPLrybtydqz+J2v9dE7TsRmHc=@vger.kernel.org X-Gm-Message-State: AOJu0YyFkk32ECp0Im9MHPsVFeDaRsmBZ1/Q00xNPX+aYdu+ijebIEqX /PW2qmEaob3PpHs63qV7oDicNm+/INnqdCEMNvh9VWqy2cLpx/JTuAzUQXioQ3Cl3aP17nsuGFv yq8zITfdlFX+kfeufY/tsVHZEa6QmeMc/wPId X-Gm-Gg: AY/fxX53esVsIHTDkIa5LoVYBwxLZkq02AXaOCbf0jQfKma9JbXtcHdtAvpNgSwrQj/ ev/03oFGy3i+tL6P+SeFnfir2cN2nSIwlwKRHbueaZ654XWGhA6oTXo+Olf7b/sqw+lYDHVGSdt AAs8hmWwiLq/eP/bQ1aGAy4qRiPKPJD+cGlBDnOCf3kOcJz3DVabNZQUjIiwU/XmlFSeiEsk8QG nd5scG1tfz2PUC6kl6NiZN/+kYYaCBFtZQ6ayr+rRH8bngyMCNVET25/5/zfuDS1iRHBpx0FZIc ekxYzkZ5Qv5EIXCUJ2l1j9UsT8VGSD/bgW1KV9o+dgnK9hjJ++OzM99Ax7ZBJZkkXIG6W5q7hzg dz91CjDIn9wwJZt61SH1U1rUIjb9uyWldTRzqFYC0mg== X-Google-Smtp-Source: AGHT+IGOfp+6bH84vad2EBQ2+Dwb3Z0fUV6/3dMYfGye5S2Vf4an6Zy5q/XCGn88/corDJ9YMoIic3ed4Enw X-Received: by 2002:a17:90b:2884:b0:340:be2e:9884 with SMTP id 98e67ed59e1d1-34f5f284472mr709682a91.1.1767661092230; Mon, 05 Jan 2026 16:58:12 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id 98e67ed59e1d1-34f5faf11e2sm107244a91.4.2026.01.05.16.58.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Jan 2026 16:58:12 -0800 (PST) X-Relaying-Domain: purestorage.com Received: from dev-csander.dev.purestorage.com (dev-csander.dev.purestorage.com [10.49.34.222]) by c7-smtp-2023.dev.purestorage.com (Postfix) with ESMTP id AB19434173B; Mon, 5 Jan 2026 17:58:11 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 9D880E44554; Mon, 5 Jan 2026 17:58:11 -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 v3 19/19] selftests: ublk: add end-to-end integrity test Date: Mon, 5 Jan 2026 17:57:51 -0700 Message-ID: <20260106005752.3784925-20-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260106005752.3784925-1-csander@purestorage.com> References: <20260106005752.3784925-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 --- 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 bfd68ae64142..ab745443fd58 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