From nobody Sat Feb 7 17:41:17 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 4BFD022256B for ; Sat, 3 Jan 2026 00:45:34 +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=1767401137; cv=none; b=LRRsv5hpLd/egdqzsm4fQjds7Rds7Yo+QB1kjkpi0frpk770KL1B1Mr+fl6avp46Zc99Yhg85PDjXL9c0b3+n3F/njQBJVkbhAkzFHqeN/fl8UsO+nme6k/5EGeKZUCnie4XfERmbAbiDT3lb/LPBqbJikSm0LZZM+d1E5tM7SU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401137; c=relaxed/simple; bh=OHCvRTYKVhIoqJ0IbwNbmP3S0pPDKsYwK9/NPEhFebY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VwGFag65GytxQQlcQRcuU2bB7+LWUuzVCg06bRUVT2dKyTAWS+2W2Q1mh+MRa61OBpY8jke0hdnAUvrg2PbwNwXf8Jw16LyXoZ22EwmuBM6LNYJfpdI1WVI9GTMWswn2PiSOvo2+NVKcpF9boSiVhtomQmtJnSuMExApiGgb/zY= 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=ffhtsnKb; 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="ffhtsnKb" Received: by mail-qk1-f227.google.com with SMTP id af79cd13be357-8b2df1e0c10so178923785a.0 for ; Fri, 02 Jan 2026 16:45:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401133; x=1768005933; 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=59cCDgPfeatMIS2T54XZ5qKYRlkQDNaFxzaUv99tjXw=; b=ffhtsnKbL0bACNDUCOPMTDm1xPo7TQsU9JOGSFTV4HstCVXXMejFVw0Hxz9PDrCEO8 Z5rsmYl1vtSJyk7lWOeJx2fZ66qj7PgAmm0aQ7Q1/zmI/MhKbxlQvmotWr+usUPMx7Xd RaC/Q1YDSWvXFk7tstcoI8+ApoIDbjHFe0LzB/sGX8GTcVUdvboY1lrOa0cgx9pAoPZP jBjMP20P0HQG2JWnf4kdIyB/3X4ci2s2Y450GI3HfSi21Oleu4xj19udCBrc8q5Edc67 K4C1jyrHp23RVTglh8J6q5VPicVrWnGNyHqK7d4to8UxoD99ov3LshW9CTsX3Uco0Utp zBag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401133; x=1768005933; 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=59cCDgPfeatMIS2T54XZ5qKYRlkQDNaFxzaUv99tjXw=; b=EHmDzafS9Z360DEGSqp7aT5Ovn2/eWwqEQMQW15tA0Qd61jQ75JRQnV23hruYfSNz0 /sQq/cAkT63Rxjy4xEJBUSsxSkgx05MuXLIvFBNRwuoFvJzNd6Do6S+3TuVpirjsw28K Tm3dpiYDVjEsYJqqSGGmm1p0eN0NjSo+V9nE/ByHdbV2UHk49Ng4zk4vfVekknm7iQUe WeUWKgi2hnYVxCcSWS6xiLAaB8EmirpyM5twh98T3Ulg1iEQu/EFirdfCaYqHn5n6K5C 2ZC5ras0Ad135xrtqJiCQUGJk+/kCDT/sitmCpcMONAn71zqtm6XHRUlnhSCT5u3+N7S Uv1g== X-Forwarded-Encrypted: i=1; AJvYcCWq3fTHyJv7mVHLZhyC2rVO3zSg4EpnVHTP6w01zl1HgjpZYrHxsEeeZ50XrPE4ABOFb5DRSp6C9mW0lMA=@vger.kernel.org X-Gm-Message-State: AOJu0YxgtkZGM0O4DkYYuczFypttm5J1CuTX5OsfbaRoxsljvBRVJPId x3dtVXSF1UBEUscVsvQ/+o3t+ZLKx4Z3CRWmNbule41oJgE1E4p8VuZ8bM5h8F0ZRI1hgclbkeJ 5SSv6jNvOz/gAUVJU10qvT/OGO0HOua6mXwLb X-Gm-Gg: AY/fxX41tBy4IHmtcHz6Qi26sFhR56HMs7Dv+L2GUj+S8KLLZgipnUPXVRYZb1l00yL pmSJlYC715Xoz5cPL//qzieU91Pxx6N1lc0NN+5jIvDonX240xdY2E9Id4XbcZW6ePY3Hrv1yuD KZGdLneRHLAoX7JpVYP8Z07hNNr4AZqAVh+Bw8j3XQ0K+bpCOznsTMt9LZPhFioPKRLlAnk40Gj M9gjcVGqodXtGgPDE1dNPMdZWrcGaLLzsTzthbkygq0rEgZzY4bLM2tru1h6W0mCaZZi9vPG2YZ tPl1ujfr+pXxJ4gnJWjDcHgABIw1kKRzyyNm1PNwGciA2se1FFvNIt7rS/MYd/5/0xB1ZKiyKfy zaRKqY1sqXnc7SWq84KYkhIAPlBFAtxv+sv9MEmttYA== X-Google-Smtp-Source: AGHT+IFqMJoRCOhorEZ1m5a1GSBNb1Nq8U5gwFI3EoZHHVIsX+lo7hsl8u2Cg5Ps5OOYvTTwO9tanO6Feto2 X-Received: by 2002:a05:6214:415:b0:801:2595:d05d with SMTP id 6a1803df08f44-88d83797f60mr536526336d6.3.1767401133182; Fri, 02 Jan 2026 16:45:33 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id 6a1803df08f44-88d98050c97sm55962466d6.25.2026.01.02.16.45.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:33 -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 E36283402EE; Fri, 2 Jan 2026 17:45:31 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id DFE06E43D1D; Fri, 2 Jan 2026 17:45:31 -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 , Caleb Sander Mateos Subject: [PATCH v2 01/19] blk-integrity: take const pointer in blk_integrity_rq() Date: Fri, 2 Jan 2026 17:45:11 -0700 Message-ID: <20260103004529.1582405-2-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 17:41:17 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 8558A282EB for ; Sat, 3 Jan 2026 00:45:33 +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=1767401136; cv=none; b=jS+AOtfk6n6efvcuh076uKQNo0EAytIPrfuWxu81evjZzVVMpMcccrGtTcF22ZEbtVX5LCZ2fwxjGRrFZMPlBg37gxDeeVkbdu/P4fMxw2wuTmZfCQPFmmZ1XCwHlR+PIiVu1V0fdYOhF1hKioYQ++u0Hvj+Y0hzlqc8gpRtvqI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401136; c=relaxed/simple; bh=RSIk539QU0YeMD2OF+ndA/QgOH1sYpMVe11eirRJlyI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dXwrGulDssQmrl+G8ktx19YzW3sHmbFF1wtlMwa/MUChUJGY/18SA4g3DxJjqgh2sAe1LUb5ger9hdjVUqLRnOsIzn5W4mGZZMjyxV09LKq/sQesFzYKE4/jWd2UaFCEkTH4lCMnsWMMQM402SwMvI8o6QBLd0QufD/V9hQIVqo= 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=gGOtChO4; 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="gGOtChO4" Received: by mail-pl1-f227.google.com with SMTP id d9443c01a7336-2a07fb1527cso31989655ad.3 for ; Fri, 02 Jan 2026 16:45:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401133; x=1768005933; 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=gGOtChO4a1MJF1UZmPgVd18bvoSQuAdOL4OxxWWLuG4EvV9yrkCUcHeLtb4NbRgA1T 1aWDxJtN7+0TdTOlN52ZlQj2NWOib9mPgjWfza5mvLwfk5BA8KbLGnEOf8VrQcXNu2Fu ++AYx3DNnfuGefCZTGLVDPFzXTU4XTW6iNRBM3cdU4krGxdxNOm3w1iVPv8xiTEQPtI8 qWWVDCizCw1BGG2V+yw64/A+PTAPNz9YBcWLkYvZ9cY9LdYXAvKph8A9PsfzGlKZfzZK S0J6IFmaL4XThJMHU3RxQuXwY2hF90mF0rJ4pVOUBZzNKjY2nTBuoqGKneT6WwUPHlsG jIxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401133; x=1768005933; 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=mjAsXrAfu9+5cnnA6SkoLTHMAfRINfW7Y7zhdNCHsitnHmoWjrFVjoG7HqUb+awHH3 cIMq1yArIUmAhorZz1tyJJmHnBWZLyDdAowKNf6FKeX1x7/B263hvQ4CSPn4Ay7H2ad+ l7EIDZs3wD+mEBmuc5eI/tEdo8VX2WFl53T5cN2UIqT6ViZ1/BIgC4fh0/qD2lsTJZPm hioUBTpXerfntwLwOU55t864opPoVM7VimxwWwu6Q9CYUOUAAcyCO5sxkjF3qIj0Kczt K5pNmSowF8DXTm3S5TLsJ2VD7OS5y5+RCEMn8TnPzR6QOdttdL5CFssGo8JVuH5fXGqG 0L3Q== X-Forwarded-Encrypted: i=1; AJvYcCV85tK6Fg7K7MODS78YHUKiJsNNgEiKjfL4mGCD1KhbGu6dbwakpRH80mQqEQYnaORBgVNv81mT+bEQBqg=@vger.kernel.org X-Gm-Message-State: AOJu0Yzrk3AnyQwozMWWINpeKTwZwN4G58fru0pDZnp3ooJBiPx8Jxwy DFFsFdGKjhcx+FQ3w82D3d0UoHWBke+e9nSKi9SrIV3VuEurXkGYCA+Ohl97BSsWCSNCliIVvwa xcEp6fgMik2HmkMLS/6EKj3JsK1qsW8iuIC8v X-Gm-Gg: AY/fxX5f79dmstJZMqY6XAtvziykQzm3BbaNy16+u0mDhQJ1IHiX0AJ8Zm8ZsVJ1LJ1 +ML8+KkzrNMoVBI3I6G1BBQKCS3ELh2w4DhB47Y44qRP4Mu5VWGZeFLlfw3TbF8OGlDfQV5uY5C 18tw+lXpwN/Ve8i6i2z0zGrp2S9O9gj9CmUifl95dxOAjFJkgCYl16YbqkjrpJSqMsP6EoG+64I gjxHfQ2tfT2PEOjIL492Zi8OGcgW2jLtToA6nDIFBv9/3SnuYw2gvGPWS5uIqa+RvKW4Ty9WowQ b0zGagXMl/+kicURjLprIDBEEcGjwxJmePKXkH3sB8K++q716VjBM8DXMcE/VMTYTtIPr7Sd7Fn QUosDzuDPoLl/d/pgQxcid79Zvoqz14E9FGhSnG7hjQ== X-Google-Smtp-Source: AGHT+IE2FRIx0xy1b+Cq6CVpRkD5xG7QBPVIGJ6d1KMLEQWQxFtHKAcbl/g7RX9k7xKGZ2eSCM0/VCVKps+g X-Received: by 2002:a05:7022:6294:b0:11b:98e8:624e with SMTP id a92af1059eb24-121722e11famr22921497c88.4.1767401132583; Fri, 02 Jan 2026 16:45:32 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id a92af1059eb24-121724cbe73sm8963998c88.1.2026.01.02.16.45.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:32 -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 2B45A341C73; Fri, 2 Jan 2026 17:45:32 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 273CAE43D1D; Fri, 2 Jan 2026 17:45:32 -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 , Caleb Sander Mateos Subject: [PATCH v2 02/19] ublk: move ublk flag check functions earlier Date: Fri, 2 Jan 2026 17:45:12 -0700 Message-ID: <20260103004529.1582405-3-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 17:41:17 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 34C161F12F8 for ; Sat, 3 Jan 2026 00:45:34 +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=1767401138; cv=none; b=S1sJP3V4blNoaav+DV6yNZdiqmXnBoIG7Z9YDJ3QckwP9OLKP/tIzyqzKZvj6Ii6k5nGS0KS/FoU64AC+BQ9uowvMMvaeTEo7/McMwci0WFv0JX7Bq4kvAoOlkTnCofSaDE+tCpZYi6x4uP2CJxwoS5x1ugSsjOYlKyADFFcdck= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401138; c=relaxed/simple; bh=fTJhuC6H0dNBq3FX1co7NhfO2FVWInl52pOu9PDumX4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rU4v89/R1V3MHg7pEEsWxqe4PIe1rv+6WsCxplHUgcHt4F9y7ZS1z4OXJ9rAwKCpB71uEp1ftV3G2A8QmxY28uDxK26Ls6mIDWE4cIC/xF9+1pXhbMQyeURSS0sZSvcbIlBUSIKeEIFEHU8q5q49i8zbvpHuhFKBQLWq0I+nwFc= 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=S+oOYJQU; 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="S+oOYJQU" Received: by mail-yx1-f100.google.com with SMTP id 956f58d0204a3-644752b3105so1463624d50.3 for ; Fri, 02 Jan 2026 16:45:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401133; x=1768005933; 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=vUye211JIBiRnZQOddGEfx1ZXqYyficSfLxDXccUr6A=; b=S+oOYJQUFq3bFq/1ToZhr7LYqluM3fRh4Y+iN0tcWEUMrSd9sDy9JTijWna8YR6Lnq DSPsJYhyKDvQokttgibDqVJLwj31zrpfcr33pk7ljaGWGoQuqKGa9feAxgVrKpATMtZr aGGDI/SFng/HTIuHBjdTIWKBpKFGJLamDTgSfVcs1HG1SaXPbwdgeJoCeJZfCtdZeKot 489+zwh3vYASa6PpgpC+7a02pzOnveXW5MAl1bZ5lnjL3CVFhp6w/Up9K7xLrAG9K+Tk ahNJ9zOoxmQ4PjzeI6dTSswrsTxFBxJKbhdjRB73hTzjWDd/avQ8JDaTHxlqD1j5aNcL 58yQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401133; x=1768005933; 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=vUye211JIBiRnZQOddGEfx1ZXqYyficSfLxDXccUr6A=; b=dyZYiTAqoDn3ge3WuUEFwcDsd3tkayAhiftupUW1JlJpyC4p07/tsADzwvq3mmgxVS VHAS3wxS+2yLk824TT4B6aKx2A4At8Bra+byxZLYq6oIpsSRKwgh2n2WgqNCvpac9XgQ uaeKwSOSd/ZhY8YOMO7bUbT+NAU6YdUmnt8kjaz6xkbjal4fv8K6WgiWoiiTNnjDqrJi irBWG74yXG2h9AAApKtFhAjHMSFuyCqFHo4f6PmZBPDrDquU9bykp8y/HP5GGKJNUc4v TJfERW4s31L04o/0bY/h2lpLXjQM/WYHMu2zAK0ARbBU83/dSQLAyzgJI6aRRrx436Pc j8TA== X-Forwarded-Encrypted: i=1; AJvYcCVAZp4Yj9+W6WK3Tetn+CYpyjJCA8uE15uzOiG9ZTL+GpteInspDq2mQp29UeVTC84tHWe8XFuG+uJ0g5Y=@vger.kernel.org X-Gm-Message-State: AOJu0YyPItTrHU3WZpXjp5t2DtpyKF3BM3iDQQtFKODozs1+dscHjDTM B5JD3EbQnI1/QdIWPul2aD9VBuIO6iMYbyfYn6LXN+rJwqnuCSVwr786Cj4VbDEUwcdfAq6MG1g F1H/UHddQUsCMLEhNdE1aiXdpFjDkAuo5eIGFOdDlcM42ggNnKDxg X-Gm-Gg: AY/fxX6pSY4gLbNs1jOFwtEAFun5SCvpc+bQdE0lCxwCMpguBvL/y3vtsfipnNDRHnV QgUc7e71wdctNgxchvG5HxWat45pQ3aJYsSVm8/CGk0xbLB9HMPgY8QgzxSBzKtBPmr8KAswgUX 9hv4UMm4wfPvzEHaseDX1zTSMcrFEm7fKmv4K/JrrfQRMRw76GV6GwFDH/inRR7Iw+zTpV6kHl3 18Yq5Zo8h8uXjR2XmhoQqP5wsw4iSg9NpX+OXLceMyUMwvPO4YjctLYYtey0MxsyTXG6Dmc+INn LTTNFp+bYi4fwit9j6MoBNCcobVLeYpy+EM9HYEGV6dKu4LO8cmbXPiK7gIVmNOpHBxDGhAjt6/ Bkf7EcmVxdjCzrtO3MSWfFWziZcU= X-Google-Smtp-Source: AGHT+IF6PH7wb7P58P06jGSyp4LJxTipfWWCGV1r7JBSKpNx8MXPlVVNEe1WWVX2jKZazQFR2kjMF+hFmvhM X-Received: by 2002:a05:690e:dcf:b0:646:5127:9cfc with SMTP id 956f58d0204a3-6466a872017mr28609377d50.2.1767401133249; Fri, 02 Jan 2026 16:45:33 -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 00721157ae682-78fb451ba6csm20083417b3.25.2026.01.02.16.45.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:33 -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 5F408341D2E; Fri, 2 Jan 2026 17:45:32 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 5CCAAE43D1D; Fri, 2 Jan 2026 17:45:32 -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 , Caleb Sander Mateos Subject: [PATCH v2 03/19] ublk: support UBLK_PARAM_TYPE_INTEGRITY in device creation Date: Fri, 2 Jan 2026 17:45:13 -0700 Message-ID: <20260103004529.1582405-4-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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..2f9316febf83 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 17:41:17 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 1106B24503B for ; Sat, 3 Jan 2026 00:45:37 +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=1767401143; cv=none; b=TPA0po3ArFdS+MzNIKymeMDg6BU1MO9ZdrES6dDQ3AtVp8C5tAnwOic6sHD8k9dFVM3ASbD0Vcs5WxMhDbTTmPRPMnL4qxx+D8ZjUgH6NbiDxqbgdyUjhiwsU2SNP3LdvygT6EpVmxqIRd2JJ8FgmIYnQMFnNB5PY+ZyE0jhnk4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401143; c=relaxed/simple; bh=u8VnCRtsCK+roPqEMb0mv2OQs8zLb0C00qKIxa4dpzo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XvBAkSFC3RtJZ/DzfRnYNPXo1PHtkDF0/sJyjv/e+fMpcjNXgmzR5893APuMs3W8cOYN3/Dhn+OtTsfXnddg9j0roENFY1+qfQ3C8356bL3ZfwNQWtqBYu/1HwVJ48Mc5BcfVQwKLvqIFn0MOjBYaRXljut2XkIFkRDs5owwZn0= 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=WmAZQOxI; 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="WmAZQOxI" Received: by mail-vk1-f225.google.com with SMTP id 71dfb90a1353d-559671d0bb6so365443e0c.0 for ; Fri, 02 Jan 2026 16:45:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401135; x=1768005935; 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=ZU/lwXcYKwC3oKPxKrMeHEJqc1EBKCdeJfQj5Te361k=; b=WmAZQOxIWPZrYxk8iqNfkSq/fqDy+EL+l1gUHntnw/52d1evbVv8QXczixm4+FMcos our0kqwWu3x+u9Kx3/1MXCJ1zG7uVHNhA1uUjMrhokUbFO2BlLFfU7XemPUPPZX6g0vt IbmKubCEzBVn5PUfMoiEG+A8wcLUZ8k0Ru9Pu3nPsaR93Wzna/5ZAYIcqoCb5Ttid4bN hju7J2xb/oXSwbeGu1dAvwSv1NTcYt7WJ3Pc3LsoqrIPuPWVsf7hFDE4xs5MsXp5Lhch goJGahhfZktyiYAOXSlISv6NhNiBWoQ5Vd7RVexEYNu4+fKGlIk+GTwFlotQ3RI54XY0 skbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401135; x=1768005935; 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=ZU/lwXcYKwC3oKPxKrMeHEJqc1EBKCdeJfQj5Te361k=; b=sYEJYRrgq1UsztHOCwq5d98z1R/foD7BfMomYtLWGr1vO0lbD+UwMawJwa501U5Iyp g67RkAwXmHr1JPCHKxD1jF8rk8DN2ra8pJKQKP99FhERLFjkztPoDC6IBW+iXjvysvjB AeRYD9ot53dGD7lWEZXBf4caVPdJCUVst+ILH2Rsnw4B8Qgyap3NJtVLSzgoKdJi7iE4 qbO2pJrxplGv5IdKicP7UJkosET5jdsfXy2X5D7WWSYeqP0C7ERCZRR4he2jOHViRlPa zAtgUFy4pwiU+b2xSljePTvO/u9XoXAuGv+jKJzZhq48EzLwxoT84Mx14rTHlufr51B3 W+ng== X-Forwarded-Encrypted: i=1; AJvYcCX7paK3ft8ZQVSi5S++RNnQFnf+qr7BSpTNV3hZbJau0zOOBzayjHDK2WqBgbgZAOly4lCcuwGWsDoNt7E=@vger.kernel.org X-Gm-Message-State: AOJu0YzYaHjBTxDDiaV9V1GnXnJHg4vjDn6tekWmRdBE2f4P9ZsaornE +ut9Ln5bkaDBoee+Jovl3J2SfKQAguYk0NeWgxhMEvaXtCZb6MGBcG6HEgFQzrj8zFPebKPeEBa k15+BElGSP+v+m1QwxdxHgMASWnmTFgqZaPGW1pkjpq4keCnfnXkP X-Gm-Gg: AY/fxX5pG6xh4mn7TLSSeAH9b2lJ1P0jqrHBq+c0EL2yjof+gRzIshLBw5m37J+b/pL Qvqbv0gkXilk3nfMVOUHoXT6qNXWAPiH+yaIARksrRfyarPO2UOdY3uRbA6Urysu5J1WQmFUYOS aEu8bIitRiUfBUIwH3bWLO26SrZIpJiF/cpvssfsc47WbSmhkycf8J7hns+uJtUOaUv8kC4GN6A s2CeB9PFlKFL8fEtbdCDqSHPufUTaJWZ1NgpmYFfGY5w09mVR3gVvhYtI9RyAJ9vttSkeQDI3u+ sXLie9QZKZ1RxqmmEcl/uipLN41v5DC7N1Lq+mO7ir/IZOTYVSYsylEJt9fRF+FF1GguCXs64lR AkI+CjZqJRtYc/OX/uYUN+uo7ctY= X-Google-Smtp-Source: AGHT+IHonTKzAOlzeoLskF6gmHl/PMN2D8E3cioL5vTyJF/M/be03SS0Q608h+LkpxY8jhR/zDlA7yzKs5rd X-Received: by 2002:a05:6122:e4a:b0:559:a30f:1648 with SMTP id 71dfb90a1353d-5615bb9b244mr6259848e0c.0.1767401134900; Fri, 02 Jan 2026 16:45:34 -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-5615cf48388sm6448141e0c.0.2026.01.02.16.45.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:34 -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 916F1341D2E; Fri, 2 Jan 2026 17:45:33 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 8CCD5E43D1D; Fri, 2 Jan 2026 17:45:32 -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 , Caleb Sander Mateos Subject: [PATCH v2 04/19] ublk: set request integrity params in ublksrv_io_desc Date: Fri, 2 Jan 2026 17:45:14 -0700 Message-ID: <20260103004529.1582405-5-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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. If the ublk device doesn't support integrity, the request will never provide integrity data. If the ublk device supports integrity, the request may omit the integrity buffer only if metadata_size matches the PI tuple size determined by csum_type. In this case, the ublk server should internally generate/verify the protection information from the data and sector offset. Set the UBLK_IO_F_CHECK_{GUARD,REFTAG,APPTAG} flags based on the request's BIP_CHECK_{GUARD,REFTAG,APPTAG} flags, indicating whether to verify the guard, reference, and app tags in the protection information. The expected reference tag (32 or 48 bits) and app tag (16 bits) are indicated in ublksrv_io_desc's new struct ublksrv_io_integrity integrity field. This field is unioned with the addr field to avoid changing the size of struct ublksrv_io_desc. UBLK_F_INTEGRITY requires UBLK_F_USER_COPY and the addr field isn't used for UBLK_F_USER_COPY, so the two fields aren't needed simultaneously. Signed-off-by: Caleb Sander Mateos --- drivers/block/ublk_drv.c | 43 +++++++++++++++++++++++++++++++---- include/uapi/linux/ublk_cmd.h | 27 ++++++++++++++++++++-- 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index 2f9316febf83..51469e0627ff 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -316,10 +316,36 @@ static inline bool ublk_dev_is_zoned(const struct ubl= k_device *ub) static inline bool ublk_queue_is_zoned(const struct ublk_queue *ubq) { return ubq->flags & UBLK_F_ZONED; } =20 +static void ublk_setup_iod_buf(const struct ublk_queue *ubq, + const struct request *req, + struct ublksrv_io_desc *iod) +{ +#ifdef CONFIG_BLK_DEV_INTEGRITY + if (ubq->flags & UBLK_F_INTEGRITY) { + struct bio_integrity_payload *bip; + sector_t ref_tag_seed; + + if (!blk_integrity_rq(req)) + return; + + bip =3D bio_integrity(req->bio); + ref_tag_seed =3D bip_get_seed(bip); + iod->integrity.ref_tag_lo =3D ref_tag_seed; + iod->integrity.ref_tag_hi =3D ref_tag_seed >> 32; + iod->integrity.app_tag =3D bip->app_tag; + } else +#endif /* #ifdef CONFIG_BLK_DEV_INTEGRITY */ + { + const struct ublk_io *io =3D &ubq->ios[req->tag]; + + iod->addr =3D io->buf.addr; + } +} + #ifdef CONFIG_BLK_DEV_ZONED =20 struct ublk_zoned_report_desc { __u64 sector; __u32 operation; @@ -498,11 +524,10 @@ static int ublk_report_zones(struct gendisk *disk, se= ctor_t sector, =20 static blk_status_t ublk_setup_iod_zoned(struct ublk_queue *ubq, struct request *req) { struct ublksrv_io_desc *iod =3D ublk_get_iod(ubq, req->tag); - struct ublk_io *io =3D &ubq->ios[req->tag]; struct ublk_zoned_report_desc *desc; u32 ublk_op; =20 switch (req_op(req)) { case REQ_OP_ZONE_OPEN: @@ -545,11 +570,11 @@ static blk_status_t ublk_setup_iod_zoned(struct ublk_= queue *ubq, } =20 iod->op_flags =3D ublk_op | ublk_req_build_flags(req); iod->nr_sectors =3D blk_rq_sectors(req); iod->start_sector =3D blk_rq_pos(req); - iod->addr =3D io->buf.addr; + ublk_setup_iod_buf(ubq, req, iod); =20 return BLK_STS_OK; } =20 #else @@ -1120,17 +1145,27 @@ 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; + + if (bio_integrity_flagged(req->bio, BIP_CHECK_GUARD)) + flags |=3D UBLK_IO_F_CHECK_GUARD; + if (bio_integrity_flagged(req->bio, BIP_CHECK_REFTAG)) + flags |=3D UBLK_IO_F_CHECK_REFTAG; + if (bio_integrity_flagged(req->bio, BIP_CHECK_APPTAG)) + flags |=3D UBLK_IO_F_CHECK_APPTAG; + } + return flags; } =20 static blk_status_t ublk_setup_iod(struct ublk_queue *ubq, struct request = *req) { struct ublksrv_io_desc *iod =3D ublk_get_iod(ubq, req->tag); - struct ublk_io *io =3D &ubq->ios[req->tag]; u32 ublk_op; =20 switch (req_op(req)) { case REQ_OP_READ: ublk_op =3D UBLK_IO_OP_READ; @@ -1155,11 +1190,11 @@ static blk_status_t ublk_setup_iod(struct ublk_queu= e *ubq, struct request *req) =20 /* need to translate since kernel may change */ iod->op_flags =3D ublk_op | ublk_req_build_flags(req); iod->nr_sectors =3D blk_rq_sectors(req); iod->start_sector =3D blk_rq_pos(req); - iod->addr =3D io->buf.addr; + ublk_setup_iod_buf(ubq, req, iod); =20 return BLK_STS_OK; } =20 static inline struct ublk_uring_cmd_pdu *ublk_get_uring_cmd_pdu( diff --git a/include/uapi/linux/ublk_cmd.h b/include/uapi/linux/ublk_cmd.h index a54c47832fa2..a22de3fc5447 100644 --- a/include/uapi/linux/ublk_cmd.h +++ b/include/uapi/linux/ublk_cmd.h @@ -412,10 +412,25 @@ 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) +/* Guard tag verification requested */ +#define UBLK_IO_F_CHECK_GUARD (1UL << 19) +/* Reference tag verification requested */ +#define UBLK_IO_F_CHECK_REFTAG (1UL << 20) +/* Application tag verification requested */ +#define UBLK_IO_F_CHECK_APPTAG (1UL << 21) + +struct ublksrv_io_integrity +{ + __u32 ref_tag_lo; /* low 32 bits of reference tag seed */ + __u16 ref_tag_hi; /* high 16 bits of reference tag seed */ + __u16 app_tag; +}; =20 /* * io cmd is described by this structure, and stored in share memory, inde= xed * by request tag. * @@ -432,12 +447,20 @@ struct ublksrv_io_desc { }; =20 /* start sector for this io */ __u64 start_sector; =20 - /* buffer address in ublksrv daemon vm space, from ublk driver */ - __u64 addr; + union { + /* + * buffer address in ublksrv daemon vm space, from ublk driver. + * Unused for UBLK_F_SUPPORT_ZERO_COPY, UBLK_F_USER_COPY, or + * UBLK_F_AUTO_BUF_REG. + */ + __u64 addr; + /* Integrity options, for UBLK_F_INTEGRITY */ + struct ublksrv_io_integrity integrity; + }; }; =20 static inline __u8 ublksrv_get_op(const struct ublksrv_io_desc *iod) { return iod->op_flags & 0xff; --=20 2.45.2 From nobody Sat Feb 7 17:41:17 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 4C23722B8AB for ; Sat, 3 Jan 2026 00:45:34 +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=1767401136; cv=none; b=IvNVCTDgELLXcu0PGCmz+9Y4lxq8xkFqNvsj0QsdW6KanTwJitpNb0X+FIW4dmMvO1jAQ/79NvGwHiqvCNBS2ZRDI/2yg3P/idKdg061v8tOlds71KVpyunV+R8p3AIfJpzpOfrKGjFX2T0GqT3d4R3ZsoS07Ui2Wh01ySjxKX8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401136; c=relaxed/simple; bh=RgRQXPGgkBOFh+I3IU1dh10q8VHov+arOD4uOXzU9rg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=p2xuzhueNUYhtTrUkJkmTEOeoOrjo1BhGWq/NBQvS6QoJzCKW2TITSBAbbBBZ9l4aYH/h0x03globAf3SYfeDlTh1PsdWRFCrUdCiKQTWKpi6Z5F/LUnu5uTEX/QIa8qcqqfR6sD+7Xu8hwe5rPoeismr2L4uEK6iGtqKa4hJGA= 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=WpOtjxt4; 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="WpOtjxt4" Received: by mail-pl1-f227.google.com with SMTP id d9443c01a7336-2a097cc08d5so32621495ad.0 for ; Fri, 02 Jan 2026 16:45:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401133; x=1768005933; 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=czj0Xu0INr5Vy2ifFNe60pRb7rtoAzjqp2XCOa9c0II=; b=WpOtjxt4tfrrotLRrvuCFONjo1IQG5bmSH8zbWvvOji5XxHUmTzYDDPE854qVYAb22 hHhE0zcxYOrn1IcuW2TPhUn+p3PMFEN9yqc3J40u4ojecoIj1iwVn2khIVPBxD4s3Aq4 pEHem79pQ+ENPGH5mSwt30RvcFcutwFI52wwxePrIU472inoknlMZKycSW7ZixykkkTv mxlFx0QFmDyMf7wXr2qvp5Vtv0dhwXFVIdTLC9psUTS5qsHNa1ji7YsCF+SQRnmG/GPn nCaNJA3E7+wzrcVBM9pYEGv/Q6pJKQxcfH2BSCQt1fJchb+6ma8aYzCvuH3IyHGxSzT7 tRPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401133; x=1768005933; 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=czj0Xu0INr5Vy2ifFNe60pRb7rtoAzjqp2XCOa9c0II=; b=kzej2RD24bv5BtrfsUaIJAWgNVx2peSp/hxL8L/I0Glf87gqV9PC6BSlJEoCW89aKv eSwwY/nHZFEvV9WtWXvmHXom0loT2JZOqGitaEL1klWGwTGjZfkYrpkjmzndZvnGiXsq uqyvbrqL67PCFXVCmBXL7yNkmz3+q7nxTwrrSi+2edDcaPoEnPnq/CkbprLg9Fs8eJjm y1soR5LPEH/cN0ES8T3HV8VJIDPy1ueK6/rpDPgUG57cB3nXk9TGQT7jc9tl05oYGlYx qz4igXyIrwY7EEjn3WwECqhvDNzfibWu7eBsbNg6RigbyP8K/M2/7od7Th9IsNq+ASge 8zSA== X-Forwarded-Encrypted: i=1; AJvYcCVBek9K6rzLPrgZT7jwfFRBn30zIRSEegMmf3l8iS6H9zDX79TM1u613Va5LQz53zDHKuox+bF+dJQ1iGg=@vger.kernel.org X-Gm-Message-State: AOJu0Ywzfyh6fN91W/IGoMD9lFUKzzQOKoyffPwe3YF9LXAJsHFoASQ/ uODS3/F1LV4SLy64IZtw8zLufUCM84CiDTOY+XRo7Cp3hTPcvNborYcjN0PRWwSJDX3B/cgC2M+ xl9VRTi62RSJCl1sD7aFRV8eXOwY0YVL8ImMF X-Gm-Gg: AY/fxX681rxNFm8iQMTwCo4jrkLCAZg66K0i1VZkmL0kbs+TFihlBiy031Iq933V8As aTfPoi2OYuBSEHwdPZ47l7CVJ10R75h1Y/ItfZZJhxhpQKZfxNNSZkP+mtvYKD2a8WYqaQ+y90C RYku5jiaNx420ovGT5nJhGFvb4sbbUBl/NO/wBlsaP62DwfnmAb1iksk1Cdm2emIkFxkqmhxZWJ /ymkGlTJjgkid3diyCISpgvcrghXaE198Xs3KtKJMgKajT37PUOlv18xQj+6TbkwByD36WHz9PK Lzv0cRQmIm5b7pvw9ayiKdl+jScW3QaYq1RMO/cEJH5ZXeHgWvbRZFdZmkCYU3lX0+qSADZT00I XGTSuG/Vol69Busx7Rvn73rX7csfPbrkllluiaCXhTQ== X-Google-Smtp-Source: AGHT+IEzI2YDnQAtUpCUAyA6e8pluyG9Ja7Ny0SdrKIl/+tDZsFmLNITLlBY3bzENXifGoIeFNQS6g468aAz X-Received: by 2002:a05:7022:264a:b0:11b:862d:8031 with SMTP id a92af1059eb24-121721380fcmr16129506c88.0.1767401133187; Fri, 02 Jan 2026 16:45:33 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id a92af1059eb24-1217253e933sm9026569c88.8.2026.01.02.16.45.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:33 -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 B920C3402DF; Fri, 2 Jan 2026 17:45:32 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id B47DAE4426F; Fri, 2 Jan 2026 17:45:32 -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 , Caleb Sander Mateos Subject: [PATCH v2 05/19] ublk: add ublk_copy_user_bvec() helper Date: Fri, 2 Jan 2026 17:45:15 -0700 Message-ID: <20260103004529.1582405-6-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 --- 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 51469e0627ff..811a125a5b04 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -1025,10 +1025,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, @@ -1037,33 +1066,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 17:41:17 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 C2840233D88 for ; Sat, 3 Jan 2026 00:45:34 +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=1767401137; cv=none; b=Q5lchq9OKUJzscJTOsxBwoKek2Lbh8vtP0Tk+jtNCLQKQpsUyU1YhamwzKuXmArKAGDgHTwa4uekfn7RT85Juh7RVf6fcdWKPJ9clTvF0kmL7sO4SnonxFnwI5RIPlKZNO38DKlBrh97Al6NEq6p5O+lHro/J+8RmBI3ZCRNuMM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401137; c=relaxed/simple; bh=5ZbhlwdJGs2ocx8rdiMdEFmrOh3BfoureZRS1/aRzms=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nWf2TcBQ8mAGLcUF/YVyJst8vOdopvfeIAxIm7gyAJwEQu168jQhg6KaPvhyyquU9jqEdBjf5ezPk+Dt/z7xMW/SvMHi6EaKFFEQe+zRowTaBaDAhoXkfanL9FAEGSZ0aSxZZnH0WSofraNmLzfIvVesVLJvL/k2TTXDUnRKo20= 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=INLMepEP; 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="INLMepEP" Received: by mail-pl1-f228.google.com with SMTP id d9443c01a7336-2a097cc08d5so32621505ad.0 for ; Fri, 02 Jan 2026 16:45:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401134; x=1768005934; 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=EVsMc3vMt4H+YWE9AtvMgTt+thJkmCxQ0FHNoV75l2U=; b=INLMepEP6YjbBQz3CsZscUBrc3UgwsGiZP+qpjN9GG1/9LLyxWzJml57Lwlo8GKzPu qPun7x3/CRyfU9qyHSLCmODpXD6pi1aQSbyJ3gCk1LILQu7/ESXOsp1BNFNNyCQvCfz9 XTjcWEw4zGzxEIYWBsgio0kNGv42JWOMEOaMpgfLR1AvmBa75Hws9LkwAQlxZ0TCdJRU 2/Dyg3aDUwvlUe9dL1zM1/Pmaxum1juAT9JDuwe9b4FQebqdCJs1Qqr6QdKr6NDXr2fz 8rJ1wRy+hc4/at7IJGSAIPKw2TofzSHE0Mf2ADoNjac/u5fG2ViWOepG5IuoTypZ7I9S o+lw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401134; x=1768005934; 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=EVsMc3vMt4H+YWE9AtvMgTt+thJkmCxQ0FHNoV75l2U=; b=W2e+xQnWT3mFM39QBBymtCNwI2na6Is8pn+mAm8lSraWVUDbXQGBvTT0ayYajRcZ6M p+6Whsj+5ITSccFb4ZmGvhtdS5tEGrNCmQ73I/nGDbG7BHs9jMO16AJmzA5ljALy4gK0 WSzFgzdnXClsUK+nbQTtSbgxgL72P5BbHw3iWjSglTJIkCth4YqN44zG+h5WHLGO//l5 3S/TfaEQIhBFKTCV5/A8Xmkv58pzstUh/Z8EM8FzKOL6cdpGNLWuQ1ap3KxrRV/4WIgn VfwkK1BrrWTv7X0WPUHJt4xo/Ti0zEWSecu3GWSfMGgnzH6bMC7yjQWPyaFN2RIb/+VN UbpA== X-Forwarded-Encrypted: i=1; AJvYcCXJXaOLXZt83Glev7yKo9WvG8mtzaM+fk/xvst8gtOMw5a5lQoUAOpQeN0iYNF+zBnZD2zB4/vsLwNVipg=@vger.kernel.org X-Gm-Message-State: AOJu0YwdZGEMLJ4m2ZG3/hmDNOEHrnkvBYGE2mTeDCX0cfsdhQiKfpgU 4G5ysaXSQjfYIX8bqg7oEAqbM5et62P3a1AXKppmpuRS79a9kLJx+SZH8hRgN0MPvET/ESV+Us5 3mHjjWtWrnG78lkBi5dbnd5k1QsdZvTxnoVWL X-Gm-Gg: AY/fxX7adSN0/J98kUNS+HSqVQTiowtUJ/tLCZAgvj35J/nIVzZRb48uCEhLnLUAD1G wwfhfVxET8JnR44nzHtcXh4NJAVwSGRcSUVh9cfh3EbcNMp2IOgeUH5/zk3MLHBd0jbgkwaehy4 8Z4li7uWRYzZjyd4338c+XS9E1KkmsLje1kpNLPVVe0bepiGsnM1QUheVnRuk1ueHhxPsnA84yz 0n4cqJf4Td7GNVB3Zx/Ec4i6n7yU4xgU/ni1VRtANvreJsBCr9xWXE0SFp9c6WET2aYLVV3ToXi ERE2h9/xAFeXEK1IsawlwpJx1WeLa1A7cDnvV/ulChsDwq6W2qxw+cl4qFpYX8hJqhH/T+szf4W cU4nPBIl1CJ9Ttjd+bZF8yTjdPosLJ0ADNgbniNvtnA== X-Google-Smtp-Source: AGHT+IEsDo8UYO1hwGaARm6NPNqEWHL/GaiHYG082SNQvgge6Pe4hDg9H7li1KCyXrHUdfe7Aqai4q4oPqI5 X-Received: by 2002:a05:6a20:c916:b0:35d:3b70:7635 with SMTP id adf61e73a8af0-376a583266cmr29062142637.0.1767401133655; Fri, 02 Jan 2026 16:45:33 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id 41be03b00d2f7-c1e7b68fbe0sm3104866a12.10.2026.01.02.16.45.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:33 -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 E5A30341C73; Fri, 2 Jan 2026 17:45:32 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id E10B3E4426F; Fri, 2 Jan 2026 17:45:32 -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 , Caleb Sander Mateos Subject: [PATCH v2 06/19] ublk: split out ublk_user_copy() helper Date: Fri, 2 Jan 2026 17:45:16 -0700 Message-ID: <20260103004529.1582405-7-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 811a125a5b04..73547ecf14cd 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -2727,42 +2727,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 17:41:17 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 C48B72343C0 for ; Sat, 3 Jan 2026 00:45:34 +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=1767401137; cv=none; b=qHpuTl2obRAfqKH1/NgaGfgHnaS9zFbGE19Jtd6ipYtgGd25eriOSYVCiND6POSZEKKJpk2OS+PtpQieKuzyXhCHtLcbxI9Sn2vsYK/KMjvJsyLyPEnwZUPId8PM2ZMMwRKk2XglezRaec6UxHePhfgn45QMvvzvfv6zcZpVBhE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401137; c=relaxed/simple; bh=5miXCM+/LRoHoro59T+z+kk+Lnrwb+6jT45GlYIcY/g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=e2tD0oWKrzam3A2QtHEdew/nUJxhrF9+ToKUnvx9XFVhGC6nnnKR6flxoV4x9Q7kGuHOKQRDGpYashtmRJYtq9uToYLxd4wAGQAG/EmtTVK3VNeHg9Ua4M+0vGIZN1l/TOlfbG95FSziI6jBiWqW9+1bMXOW5buaUyq78n+Cw7o= 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=cOgDs9t5; 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="cOgDs9t5" Received: by mail-pl1-f228.google.com with SMTP id d9443c01a7336-2a31d7107faso16995615ad.0 for ; Fri, 02 Jan 2026 16:45:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401134; x=1768005934; 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=1p1lVHFdfrJVwcqNN1Ki9cbLGf4AMYaFBS/YOLtQ7ow=; b=cOgDs9t515MUNFKkFh3u1OsUX6W22RI2o6cDtXm71uJnVDtd/dcwQKzCiE/qwwhd1q tal4757Yg9EJn3hqVZMSJeXvWp084F06CYyw+lePbATcb6LkgP++CZjuN3dfvg0NLjte V2o6tOeX6PCumaDBL/gb5CIi3JdpbhC1iGloTezxKmLlVseBmWoHQ2ROcYCVANEnvlqn SVvi+dewPEjZ26j7c0t4dIBZbHY327GOWFIh+MXgSpfCyOOJA4iJ04JOOassLkahWMaU OhboYg2yroTpWrlk8t1do0vo4EsNYjoeocPlArhG7tS3hl35OI7REKpqCoF0kTdBk+HQ 4FTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401134; x=1768005934; 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=1p1lVHFdfrJVwcqNN1Ki9cbLGf4AMYaFBS/YOLtQ7ow=; b=wZuxsL9KnQJ7PrsR8eTEvDo8LJTav8lbLOdp7mV8V9/fayDCGXdB8t0th5R1so99fD ALXGUirjjQA6VJDZzwE3xwMUbTrnNbXrtVK7jjuJzS6qGYnC7dC66tbRCMNnjIaWm1M2 /BW8WpddrU08Nhl6wd5sj676Lfs1ZGkVFZIzU0omKBEaKS0eh/DyEijJDsqPXZcrhnnG 2hRg/OHnvRi1SP53JKXPu7qBZCBuQlClh+rqXPvdPwjJzV3fiwXiUpSzlc7U0lxvsfjo VdJfQHXR9f1rFffbe+GEqFCKeNgw9rBJpWyFDQQ2DhsobgqvVSU1fA9ApSMn1oKtyTok nxPw== X-Forwarded-Encrypted: i=1; AJvYcCUerbjCl5cTwnjmzjaaNJJa2t2T/W4ibvQ6EmZuP36VDxEYD3YZw8ttIQIwrG7lhh7ouTgbWMsJ/JgOnEU=@vger.kernel.org X-Gm-Message-State: AOJu0Yw2141QOg/n4+IuLFCLRq2z1urGM6Mup4DJiPTJm08lJ0+bZxZb X/GjhWNjxUyiF/IVeqpGwKNCOSQSREHzvQ5Br/pwG4fllfzE3WwMC8rj4lYRRxH+6gavYPNgT1D 6dy3jQZW8PQ3bOvvTh+2p7Td41oq2UxEtaDNkFyPYRa2KB0po4O/m X-Gm-Gg: AY/fxX7Y+hy4rqOEu2/WiQF3zJrvDgUisnE7/+I9r87QqmWEyKshHHlFz8ZU/9OWyre xDONqpQf8m0owepEHqlGiDJI90QDYDG4t6qpEQK2YB9rqIBgP5Z4CbFeHFWdqB9HHPIwvRy5HTA ErRD10+OLUh9f7V2Wa/OAKNznDQaRpbFSrrNa7pK8i6uiSSPv+0/8cdUwb+c7jipRbJDuRtVrM6 i9AJDOKSiXOm+oZV9Ux7dX8gM83w6fEcPxuEOUaj6ZFtOIAdqPl+fo1LZfUx7vHF8WGsqpIm+kG ThIZph2b8IA46Mmnpve8qA9QxPV2KBSnoxjji1M4giPvioKnuUkJttlC1XEInIwwxwZv/AbYoq2 ZX+qX+cypoHw4g2JgoOXOuQYKVNo= X-Google-Smtp-Source: AGHT+IEwudaVuvqRly7l0IRDlqEmKMwk/cSbKTNqZ6zXG9WgrlcQ8cTYpnhco7okGJPfRp9k59cr+7f7Cz0/ X-Received: by 2002:a17:902:da4b:b0:2a0:d662:7283 with SMTP id d9443c01a7336-2a2f2216199mr286221655ad.3.1767401133671; Fri, 02 Jan 2026 16:45:33 -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-2a2f3c64bd9sm8170985ad.7.2026.01.02.16.45.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:33 -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 1AA0F341FB6; Fri, 2 Jan 2026 17:45:33 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 183DFE4426F; Fri, 2 Jan 2026 17:45:33 -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 , Caleb Sander Mateos Subject: [PATCH v2 07/19] ublk: inline ublk_check_and_get_req() into ublk_user_copy() Date: Fri, 2 Jan 2026 17:45:17 -0700 Message-ID: <20260103004529.1582405-8-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 73547ecf14cd..a4f95a0f1223 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -2682,70 +2682,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 17:41:17 2026 Received: from mail-yx1-f97.google.com (mail-yx1-f97.google.com [74.125.224.97]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CAA3D23E32B for ; Sat, 3 Jan 2026 00:45:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.97 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401144; cv=none; b=EAnFwzXFIbyEJWscXVebHjrkZjSCsmBmVcojRFGjiWE/ZR5DGvL5MXLDgKIfwhmcJgwHmQotLlVjDUlXUf9xIkFRpIwnAfup8YO1WHpV67Jo+8gEzLplzvGyXcV5H1ZKUOYStnKxTQkpeD6dYNTQ1DYoECmUEJGySmhNIkwXDik= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401144; c=relaxed/simple; bh=0HIM3LZ+eBDph53NxGfd2/H3yZfJ10Jd7Xn1nlpLW+A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HInl3AFNXPZRMdnJlIXMkWvYo+O9QuTycx1pNNgUYQ8TIFX5BUFXVJlMIiPG1TW9DFhZ+BU/0ZqPL2x/3d1wcWtzp8gghJITOsjVnBPSkncZ37tPvwG/f4twz9ALu8DiDAhwFc+MZmocaao0LOeJfOrmYjG1kDVseYE4BtsHUaw= 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=IabHP/Tz; arc=none smtp.client-ip=74.125.224.97 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="IabHP/Tz" Received: by mail-yx1-f97.google.com with SMTP id 956f58d0204a3-64471ddc219so1878685d50.0 for ; Fri, 02 Jan 2026 16:45:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401134; x=1768005934; 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=knbpXSf7kdrhZPbbGQ6+cIy0OZGxNBIyH+kDDZckExk=; b=IabHP/Tz46C1sY2A57CQJ08tC7X7Wzj+1r8uQq7Xhpc4gQnXiqmZuVH/7NzgrjITS0 zWQybvNP+i8Rcd6vjPrkJu5FKDx9F4VXq2T//1d9t2DCiLtoGqHimGxmKAMF20jPpeTd xz3gz5MqAqt4gvNB/h+VZBGAQMMwTfxB5jpNRhQUFEKrryHm4LgE6RHz9XFDKyWI4sMd MGAt5CYX/weg2xROJM78iFJmXBknEokNZFIJS6wvlcmfHDKeLI6ce52o5neJdLnfGBnJ bU+LihtgSt0dqFYWKQcP30rOHCE3M/r7lioN245+dAlPHQFcOFj5rdYA38R8WoN7iaSN v5NQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401134; x=1768005934; 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=knbpXSf7kdrhZPbbGQ6+cIy0OZGxNBIyH+kDDZckExk=; b=skhudjIXZ3ckBmV8N5aTXlfwbzyp1WkA4yPfUZup+Lfn+n2toH+9oBQJHQlqZnUXUA AhNthg4gKIw4GlLpUIZXQyVH9o9Yz9P4QUNv0PoTKhG2vaVHRyBLnrQxrGHOWnNTEv1s 9D/5FxkBAPtSsZLwSWmVhg6HlQEn7RmXc0TTsERYiT0ZsNXOxTHzwmqJcRFJFmNfAHzK d2VzpUUOIDzf8omQWBbyTwuJWtJyhE+J+CgvxzjeAomQSp6EwAw28mm78eWJRSsiEePZ jU2x71A/aL7Ln+63CwDuGbjo/QNfYITFZfwlbsH0xkdUfynGovA4GgOQ8BQ2LSbxJuWS OPBA== X-Forwarded-Encrypted: i=1; AJvYcCX3+TbhGztrtc1GOivgrhnqjc7aC+oFhmtI21Fbn7cfa0POeKVnhL+sr5aiqp/IU7OMfPq+ovzTNazawBw=@vger.kernel.org X-Gm-Message-State: AOJu0YwFdiZoS/S54b3UL4/8fNWuNIvylgCrHKv9zdP0EAe/rgb9jnm9 lyQFtODBiUw+ipg18xbK2CK3roZM+FMsN3+l/ujtjmWRpAgAuXsbeLaDsVCcpTM7UR8qb5eZaNR x3Wbn/cImDHXSVjknqnGdHEQLBSADTJC0k6P0r3YeSP1/gyJVMw7s X-Gm-Gg: AY/fxX4q3KFSxdOb4m6nxQJL/BRgauD3pstdHfV7M5kjTrbzjURbdThygLn7aHBeRKL 4QzGZ6ex8QBnkBZKHjw4VO5TQqEkgfvLaV3S95hK378DEAKIV2oLYgSe5PmQ1HcHE77fgFlFIc2 yWqs/c0dEP1kTnmvBwnWqcWoOrDLpIDfaxSjspjWzavKswCtSo/OYWukd8TEJwAmcyNySJqzVaV kBGtTij+MYm4zeMuXV39fQYlK236kZkgHt8UiBDl1ArdJWpPyBhbqgVhbnZJ8JeHawfIo1d+SHF LEaZvViRttPf3sWAMyxPN2XYZQ+pZS0p6Khif4pEI2p7Jg39eusW9B/Qhg+78WxlkDhTWsISHmn YCPQb2MEua/gJZUicGS4cXmtWFDo= X-Google-Smtp-Source: AGHT+IFcHgQg2WiRh4ueJncqPz5X+iE4QwTyWzS9B4z5GXHsWhkWB3IHZcttSGLuqIt6AtP9FCgncVYgpwBp X-Received: by 2002:a05:690e:158c:10b0:646:5127:ad64 with SMTP id 956f58d0204a3-6466a8e0f63mr23527968d50.8.1767401134561; Fri, 02 Jan 2026 16:45:34 -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-6466a8b1b1dsm2609242d50.2.2026.01.02.16.45.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:34 -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 46CB3341FDC; Fri, 2 Jan 2026 17:45:33 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 442AEE4426F; Fri, 2 Jan 2026 17:45:33 -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 , Caleb Sander Mateos Subject: [PATCH v2 08/19] ublk: move offset check out of __ublk_check_and_get_req() Date: Fri, 2 Jan 2026 17:45:18 -0700 Message-ID: <20260103004529.1582405-9-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 a4f95a0f1223..3149d705cb9a 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 @@ -2315,11 +2315,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); @@ -2609,11 +2609,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, @@ -2630,13 +2630,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; } @@ -2714,14 +2711,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 17:41:17 2026 Received: from mail-pl1-f226.google.com (mail-pl1-f226.google.com [209.85.214.226]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A7136238C0F for ; Sat, 3 Jan 2026 00:45:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.226 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401138; cv=none; b=pLvkh+ktxCgaYB5OubX8auG1YMkb9YjHPl/8cQ4OWa4yrzUhfqHtWfdSFbpxZHotaXRn6Drnvbfs6+RkW2nAIh8qTRyBbbMNa8Httg7QM8I18NDQ1EmCYeJYF2pFHpNnSRvXePLyNIKXGtgM00V7c7qM2IESpspTN0/A0l4a45w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401138; c=relaxed/simple; bh=gZdfTxZk5VaNifciQtGbLhQujcMObhkbytoMuzp9Q8A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=a3DUyQFAB63TXXp+MgJFbRw/Y+Q9VoCbY6ewf4sEfXHffKWbqgegTNTkc9ilOrdscIMgmriJeuyp1iGSA1c1LfTPyuH1AG/+Qet+db1FcGZXy+wx2fgZixl70FJ7DJnxI6oFEgj3H5mmX24hGqgUG4xZHvOysLH/t3Tvxx6vlco= 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=fM4h2r1Y; arc=none smtp.client-ip=209.85.214.226 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="fM4h2r1Y" Received: by mail-pl1-f226.google.com with SMTP id d9443c01a7336-2a07fb1527cso31989685ad.3 for ; Fri, 02 Jan 2026 16:45:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401134; x=1768005934; 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=K93ipimKyaXS6w3F3nTrbjfIYkiy6EMTwAT5DBS8tQg=; b=fM4h2r1Y+nBo6GJi7lOfp0/thNX96ILy3aoeYclWJ4RWeK7jMHvtjgi0e/f1CbRwO5 c+JvBvZjBRmoKQa5V5Dh6QXpddEy3MjpIg78+YJ9lhXefREBn4DElmMeWGpX3Rl1SoxP EA8e2VuIxVUcj3outUkPAPDtZ4S9Th6SghAAF7FC6IuFjEpZ0eAh+91jWS3OwDNalgE/ 5A4yYwLmp3/eQ5jiflCY5VV8N+f4++ctS07Ux5HL4sWKXXtS3XEps8+q/EAztMBrjAMm Y4cck98u19GFSq3WYAujaKxjjpQ73WylPG1KgwXh2cMhP4CZxql8vb3Tgfh6iXcX+QPf FiSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401134; x=1768005934; 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=K93ipimKyaXS6w3F3nTrbjfIYkiy6EMTwAT5DBS8tQg=; b=hIgwAGbWWXWEhRTBQO0dIhKpEPaEoesjFJ2+rgLPZ3izYOR2Pthg/eJYOMSNHVpjQY kKLH7DB3E1hlSK4+23fEKFtm68Q+wfwpR4u71E6w8RExpGw9jiTqziRdbXB5Z+4ZdSw2 2Mo4w1iJcyOnauYO1Rc7EUNg31LxOc/Qqsf1SdqHPojedsn0LQa3K9OAxj8k4xEdSzxY OGQq7IuyCYikEbQ5rZfodcckYPHC9mXOJXlXT0nK/erAiG+2XI5eYFtjE0Q6b9zPIfY1 vKjxZ7ZLSHSHgtn0Xmp2MG0dZnIYAhcXhYqSd7vDCGZhhjtySLHZ/Wll5UDW+GuKt1Zq G1JA== X-Forwarded-Encrypted: i=1; AJvYcCUzNzRtDOOp0B2p3/NPqVDKtRII0c18HyRme+uFCg3gFcf9+TwVBqrMtgotuBo8H+MLQTJLWoJ9uzQUCfY=@vger.kernel.org X-Gm-Message-State: AOJu0YxXO7CD2dEr91MkTr7nbkj1d9Ekj5Q+1oOLpm5vbJORR4j5dtDr t0FJKsV663shFQj4Et+yjud1G6DWPaFj7u7NbTyLNQXIrMkF5sagr2CddlnEH/A2JcdqhN+Syki seyoO/PAsOEQtUmInNCYDzCavsenr5XYdxznw X-Gm-Gg: AY/fxX7tJf7a0Rov0N7kw1/hlAGvKCaXE6nTzzj93OpMSvHy/OBQTQeXaaMdyIMId+U j6Ib9YEVTp25bbgeocTlrLp1qzrgPYo/ihq5/b7H+VmHjNM8tgYCj7sQGCHvZ0zsWfn5iGhoWN4 MFd81gxdrVY0ogW1NxQCpKWyy6rf6h7vBM1Ia7vNLA+9bkeOl78WqePUF7Fq12Ji1Dn9RThZfJE 6tC2tUTh3YcPdT2THTvZhH1vme1KY/T1oCp8u9FTEp19y+C9m56UaNEDcEhYwPaarhIA6qvPY0b Ij6PWv0SDr8UKdpDdpAqfLfLIwgOeyWtJZNK71OFkIVgXk5sy+sdGniGYcxH99b2mrb917E7CSd PQz220I++9vaFKs8XQzEJ/HaxsgQ1ZL+XfpCqa73xfw== X-Google-Smtp-Source: AGHT+IHBmS6K1J76/7U1o+5EfKCLNr5VBY8ZE1oDAMOqu9UGnI/oFXwHEJioMfZeokHhXfBgobMdAGQ3DvRf X-Received: by 2002:a05:7022:264a:b0:11b:862d:8031 with SMTP id a92af1059eb24-121721380fcmr16129514c88.0.1767401133910; Fri, 02 Jan 2026 16:45:33 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.128]) by smtp-relay.gmail.com with ESMTPS id a92af1059eb24-12172439a90sm8664373c88.0.2026.01.02.16.45.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:33 -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 736E93402EE; Fri, 2 Jan 2026 17:45:33 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 70398E4426F; Fri, 2 Jan 2026 17:45:33 -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 , Caleb Sander Mateos Subject: [PATCH v2 09/19] ublk: implement integrity user copy Date: Fri, 2 Jan 2026 17:45:19 -0700 Message-ID: <20260103004529.1582405-10-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 3149d705cb9a..82b193d63583 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -646,10 +646,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) @@ -1072,10 +1077,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 @@ -2686,10 +2718,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)) @@ -2699,10 +2733,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); @@ -2715,21 +2750,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; } @@ -3963,11 +4008,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 a22de3fc5447..87262f5c054b 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 17:41:17 2026 Received: from mail-yx1-f97.google.com (mail-yx1-f97.google.com [74.125.224.97]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BAC5123D7D0 for ; Sat, 3 Jan 2026 00:45:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.97 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401141; cv=none; b=o9qeL7GEoi/sPVot/Sn5ZFG7nky4fOajPbamcYXJkubMVHVxpKQEMXoQxHhYIfUWxIukYsv2WF1n3xbbpijg8s0tkZBxDPrZuSuRgh3jF03oOIqizOICdlMA2h1BRbV1QB/7SVoI+Bkuuknj6Ovg/wh6L/2blODm0eYL9PbPIeg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401141; c=relaxed/simple; bh=ZSzLYKUPhGsUobh2wC8NY8isXzUtJcpaIt8dWErFwBk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UrS2eN3HPsxU4PxCby36DEv8OFVjdIzQRQqQYdPh/6A9mwlGQtsuRtwz3YtE2khnZE1QbdJFhEAVPHrBNad9nBrVmSHJp/X/DXhOJM21MUPOvpr5ZIBQtEUaP1qCOKeDJcVF4gCShFdkJb/irP5pQAYkV83lGiosyxHytK++2QQ= 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=UqSxpcmd; arc=none smtp.client-ip=74.125.224.97 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="UqSxpcmd" Received: by mail-yx1-f97.google.com with SMTP id 956f58d0204a3-646a1384584so905052d50.1 for ; Fri, 02 Jan 2026 16:45:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401134; x=1768005934; 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=7R8A5xPkV3IeduJQ3FDhSVHeRqV+YNzn9A5NxRqrJgc=; b=UqSxpcmdRQBEUd/3QmIiMK39Nl5o3R+gLKeyRYF9geXZQtGtFBrFxFNVOIQo8RGveE bSkTRdYX0m8WWQChZCmFyGXjH29L2AwWciTzXFLUhUp+J5fgWqKxKmNHPY26e30ENRCF JxEscjOTG6UkuSxTCahdD0XJwK8iqtBGJPPoPxo7RnrNAoN5J0xIjDRfcWNA3m9qZ8p9 gNm9lAS8jk7CMVvyJUEKCkJrtZ/G048ns/IHAl3z4nguy2LUnZ8UCEwuorgPy+/3Eqts 2dEWb40WvoI0WElZDHOdVqHcMVUQlwTQ9p6bYLSEAaOtik2C+TYdlNP548jtJEuwPJam IqyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401134; x=1768005934; 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=7R8A5xPkV3IeduJQ3FDhSVHeRqV+YNzn9A5NxRqrJgc=; b=u2MZ4DIDD/tOTtMuonlhZTeOVuQR/Q/XCM6sGqLt7zHaSJDSNtFW72yo+9nwUhXpCU S5a0aOmZLCkbjdWv+t8lCIQWHxRAiQQkYtV/R7KIxw5yt9+Q0T2FTQaCNkSdCOn+lzmI VKuOdEqE6oipDEkcbCl6xqL9DPbfR6te/RoW3veFY47Q6by29VExvJ2UhMLWXmM80EW2 Kf9TwAzEKCw50BvNuFB6+yRLuULMtMaaWljvt0Y2Qx8NDsBypfOCoVy0GpEXYS025NIW z44B0RocZWivANLlk682LzCcC8ITGyMGUgFMtKa7NZrpdvIW/zbknP6acB6ANDezLIqZ 1Mmg== X-Forwarded-Encrypted: i=1; AJvYcCVri5R0zyAZ149m5k1KgsNTk8owVjsAuLS5XxBbm26Jr0VUDCiWrYmp6RVyepBzWwlVqX7TZfc5QiqKJTQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yy/HSNbOloMTdGxnesVJNG6DhfnARbD2s/KNwFEoASN3BdAhaNS 3Ti0hSva0Xe3yUZtjmCMjjazSC545hYHOBleijc2bjSIIYgmxDRvRHWDxmqLLdCeIMdz/zu0iWD xE860CUGu21cVBT8Zgjyk19M9Czv4WoTtwtPAksMP6CZawR7K6JAZ X-Gm-Gg: AY/fxX6lyXMgf3fcRHHmARGFj79yCSKIePafrOsEx5I0RdFDH+DUs9h87kDva4w1ohA BT9XMzY3reeEf49gJeN/i2IucQJ4l0WDjdqf53hcKdD7XY0zO+qTVyjknhR6A2QjMt4fbCx/SXm 8CyfnrYX/9fgOdZ5r8UfvIIjVM3jzOOFe4NgxOH174BN/SDJ3jSAyzLbXOAqZ5q5YnviSr2EbBq iPf0hm6TvxT84HT3tDI9k5wDaNdPlvJZhxa3+x9RJJF3iQ/jCFMDZIq/Q1zrvujP2hGCwkYnzCP rz42tzPkmqKp6lHhPy8c9QVWdE6D9Wd0yaxTb9RcbX7HAtiMmR/CsSXeJr+hlOOH4CbOCNp2oe7 CYjOoMjo9evfYF+U6PQ/f2N3O6Sw= X-Google-Smtp-Source: AGHT+IG8e0ZZfW+lu/gruxYzr7Rl1uVpSHQgdK3pJYfY+125TFW3ptE8y9OXsGfdXlr5Zj3xy7LLASN5fq78 X-Received: by 2002:a05:690e:2445:b0:646:e25d:cc21 with SMTP id 956f58d0204a3-646e25dcd2cmr963833d50.8.1767401134512; Fri, 02 Jan 2026 16:45:34 -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 00721157ae682-78fb4539795sm20084837b3.27.2026.01.02.16.45.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:34 -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 9D77F3420A9; Fri, 2 Jan 2026 17:45:33 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 9A63FE43D1D; Fri, 2 Jan 2026 17:45:33 -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 , Caleb Sander Mateos Subject: [PATCH v2 10/19] ublk: support UBLK_F_INTEGRITY Date: Fri, 2 Jan 2026 17:45:20 -0700 Message-ID: <20260103004529.1582405-11-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 --- 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 82b193d63583..8b2466b5de07 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 17:41:17 2026 Received: from mail-pl1-f226.google.com (mail-pl1-f226.google.com [209.85.214.226]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 335C6239E8B for ; Sat, 3 Jan 2026 00:45:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.226 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401138; cv=none; b=J1lcOP0Rm23qoeh5975FYLvXPkX5lFzFOAHugW5Dft9KXUEPvE45RE64L8QHXjpjpZ0KXAWFWfCnbwlyQWhL1zMnG7jiUNfstnenFcZF8NAmaIq7Rxagn8OSAwg/y85LMa5OlnoV63ZgBKfk3CcuOeCvnvlDugT0MhhcvibAqxE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401138; c=relaxed/simple; bh=pCk7tNgIwSX/BqQVkiiF45BFNbrK8R2HQ9AWSJrKW7Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rmkakbt68ND2PiFboLQKL1iwRS6d8EEPQTBoZ5CLlOZhvHp59OWgHiyHdVi1r9ES5h2mTyP1vgvjQV0Fq6N6wAbakkHl78begVKkHxUNcwJG38ZL0hPIQAn9kxPQLh2TikcOpnYBKkdjCur4Jiz3Ht731EA5xPBqKwfugXQ4foA= 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=b28ZHZ2g; arc=none smtp.client-ip=209.85.214.226 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="b28ZHZ2g" Received: by mail-pl1-f226.google.com with SMTP id d9443c01a7336-2a2bff5f774so30221155ad.2 for ; Fri, 02 Jan 2026 16:45:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401134; x=1768005934; 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=ESaTf+FkqQQjJpUF1UJK92O+2WrA8U4keQEbEqsXOmU=; b=b28ZHZ2gpFW8Zk1VytPKQrrTgYUYGHC2lnv/2D8ajJbK/HsDlcIbtVF0VN3cNaeOCt ocE3X9v5+dd6gZXwOmRsu6b4KLh2kg04xFcY5i/PryGGj307AThaukxW+iaC7LsPpmFR RJmuv6bs/OhzcWlEJpA5XAobvtqTmebxlGYLZiHOS8fbMxVYy0JmOzqNvJJCIz/tRviY MMKpqE/ikwhBGdLKCIfFZWbpDlm7iz+krmrxc7kQj85oO9Ffc2+LRX5Gz3nbrIr5W0fU ilGpjCJgQLKJ/byIT9T9hv3NGAy83DNRmev5C7ARgNHEtRkAcXTVainIkw6TQQEBK2Ey Mlhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401134; x=1768005934; 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=ESaTf+FkqQQjJpUF1UJK92O+2WrA8U4keQEbEqsXOmU=; b=Q9cU6lDGTNtuArVbW1CQWihXBhh/88g+xKTobOzYytfPRlaTVN4DJdjQdqK4vWRzUl G0jG6mgObU3Kjf1Ov8IWObv8TREmMYkg/ADhCJ9FyGcRJ9FWI8P9JV4yZxm80Z4eG+fp gIZcnD6CW5Uje/L4r3lYWwLeuZPVaeozMTxRg18AAueNnYn2HTxoI1oMWxROICGsvDms mtuzHylwtcsqnuwM7jXtAOE64gdtxYHSr3bJyA+Vf2PTLw+pPuciO8jsX74gCMFtaD7X LtMhxYUTCHt3qOGYruLFbj9enD72166bXdc0Fj46EBy4cchjkBj6BF/ybimqopG0hO5g IcWw== X-Forwarded-Encrypted: i=1; AJvYcCWryjwkYAKZsILZtA4keNLPH28h+KFJQQPAwKEXdUdXe7Rh6dH9fF24QYriN9iGQOOM9K/o7OOI/LM8m7U=@vger.kernel.org X-Gm-Message-State: AOJu0Yxnr2MfsAxOLn4prId/Vg+MaMDH46k5F0uieLrI9H+aHjILLRdS 8pXyT8N5nBk6766npd69lFLstBf3NSq5ZObS2DeDkgncqN9144kEMgW7AyPUUe+48vaO2Yf/bu5 XQpz5GZ9LBoDkVnNix1WOf6oW5E7EqS1G+X+o X-Gm-Gg: AY/fxX7NNftkc51lTQ3/SL2euPSpDVDJP4kvGXmvG0m/IvX1hMb3XkEoJ7xmE/1eZnb 19q4IMDm6348i2PptuM1SYq/F8jSIirmYO4CrCd73bC8oESnJAhNMtgG1++fQRT3F7b6WF0HCzn VwYvMaSan0vvs4bXTXAd6uR3zzovNgsZx2uMe3g8OQgjj/ZN0HJJmHizlPhovpsQlt5J9redQAK X4AhVocih8m22dyOPfGg2BNWpzJ4f6vpSMwm7VJWHkvWoV8mqN8q35SrL6wnzxVhA2MNQKyv4Jh dgA6Qo3BjLfjgLVVPtS1yBEUUpKBUl6TF/I+NhlBTC9QqGIaV0ekFqwpqryWqF2h8LDS5rDcS5L 5xxuW4inad+Vat1ZiYTir5s6syyA3GoIqirz0tsgL9g== X-Google-Smtp-Source: AGHT+IFyJYp4u7U4WwMHxxOkMI331gI+Wu/mlmy8krgk5adiu1FvdRx1nSYXyq9v1fovCnToKv/G22ERPl9q X-Received: by 2002:a17:902:f611:b0:298:535e:ef34 with SMTP id d9443c01a7336-2a2f2937c7dmr333704335ad.5.1767401134376; Fri, 02 Jan 2026 16:45:34 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2a2f3d2e16bsm47126995ad.61.2026.01.02.16.45.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:34 -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 CA76B3420C0; Fri, 2 Jan 2026 17:45:33 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id C7F3AE43D1D; Fri, 2 Jan 2026 17:45:33 -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 , Caleb Sander Mateos Subject: [PATCH v2 11/19] ublk: optimize ublk_user_copy() on daemon task Date: Fri, 2 Jan 2026 17:45:21 -0700 Message-ID: <20260103004529.1582405-12-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 8b2466b5de07..2d4f8ffda01f 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. */ @@ -2721,10 +2721,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)) @@ -2747,13 +2748,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)); @@ -2774,11 +2786,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 17:41:17 2026 Received: from mail-pj1-f99.google.com (mail-pj1-f99.google.com [209.85.216.99]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F97A238166 for ; Sat, 3 Jan 2026 00:45:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.99 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401139; cv=none; b=ksEqz4zTgb3dljH1HjWtCRtJh0qOdoFDdgHNPFRLqwE0M5z+rUEm1nzDsJGq6Eui2Vml/ZPQxxRvkDdNc4EmEW5UqDrDgwTaSWjY1U/bLuGY85Rolxx/l0EkZNI9fjJh7kAU8DSXkjmnm3BZ/nDmfwhjD3YkK2FKP3z1MdYySWc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401139; c=relaxed/simple; bh=C7WOnO6ID4LqxTasOYmRz/f/EOUiS1sTWpJj01SHmZ0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bpM5f81Q8PkNbf2oTWHo0soEar4RKPM5ccG0bGFA2Wh14ryb1LzFePM+t5a3TYOhqBbKeK2H2ofuD379BwIrjXWoq9/271e6OenMlNTdjN7O9vn5kKKrKJSM3YKVLTnUIaXohYsRJdUWpLy66D82QGkUs3AztorrgngIaD6z8pU= 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=GoNh2+Fj; arc=none smtp.client-ip=209.85.216.99 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="GoNh2+Fj" Received: by mail-pj1-f99.google.com with SMTP id 98e67ed59e1d1-34ce100aec4so1048883a91.0 for ; Fri, 02 Jan 2026 16:45:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401134; x=1768005934; 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=GoNh2+FjIG7Xs9Kvj2DdllebHKjqa3crOSDaGnq6cJONOReQf/mQqKCjZOddaeTQNp 11Uc0myJDme2oUWEwjuF9RHNwM9UqYX2WvGfvNQXpIwSpkZlUu3w//7f/ZDjlV/nPR2w 9HD6v9U5JDfqASq24pBOOCqv1XIz+5kojRbp1NZZTxTNFOfDBdhOeJafmIixnT1Z3RLj Kju/HYVtiflJIVDz//TuBMfhch87O8mjMoRkS4z+k18pBX0QrZtuJ3W6G5qZVaiFVyLx IAp0hswNc9GpUyYrvh6qfZ5VZhFFXxxEXQVRsfif3Os0RVX19pJBgRfAmUMT+ZgK7jMP dVjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401134; x=1768005934; 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=uouXXCG4D7DNrp32ZIS9aeIinQJqgsPufZjKv86amu1AmDDiRtQOeNHte1I/JuZa+m H8ugI/aj4uG9P5T6N9kme5FXz4pvwXm4MqqCE1XUMP8voDyNRwHFSUX8d5+1g+Et6hjd jvilfieGEYoglWkNXHbcLDmuXHcWwimb6Aijd9QdGCmJsTnHfDjXA1+bhWXsOHEUQlN7 43yEVc9mKW+f/e962xQohrTrXZ6+tPmxTTGHjGLz20Gg/RzCKi41cmbnyKaMSCgR3xtf 2lBwKC19g5kF44+RebzKMs1u4Cv7FgATKbereEZM+4QAcpR7ITIQo+fEtkSCCv+Dee44 Gm/w== X-Forwarded-Encrypted: i=1; AJvYcCVjFy37kF+xH2aiMId8lBJQH+Bl8HHQRjTlPMdZb/Y5cNt206aFEG4XAQ6phtQQvHmFhO9TSd/ztTKujiQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwWDEgLbOK8mxj/zYw0ZK941InQ0SMPXCM+FhamLdW+PUxoWFvT shpemhtWntveX61itvAcpqPQhac2LJOFRiAtFnt1asnNJqNJoPjavmyEPMFwPwVCXQz1af+j3AA A9Si34uh9sFBMVPji9UBssnXca7TzOuGKO8lwFCFaLPdRyy2g2rIv X-Gm-Gg: AY/fxX7TCNRYdXArzAOi258JBWR7QHvvNxdSMkENGY12g4CvKmu1ywcyKFMCcJb+037 zsyXQ/9QntZNE0mXIC1NKcSvNU5+4fkyPuZ3i7uv8t9c83PGbJPDdIW2EcFjfKMIQw9cXqK0h/O 6qc7vYYOC+vdVK121mfHxdKakjc9E+QnFTbVamfntOkVk0yVuKnRHplkp6UME3PvBZmUNF1glWB fPvJtpVx/w4ndsLi3IhOkbtSY6en9k6xI7cm3r7/aNYYv+393DluT6sZmp5VZLAiTQhGRsBjqc2 qlVToy7UyeChrbCqrL3hXywKBnxutuByEGedxC4QFBUpF8E6dLMC08ywux18+zjkkhB8lKg5cA9 iCB27iYAzHtgAQffhAvOgPeSpqV4= X-Google-Smtp-Source: AGHT+IHawm48E7pqRyjmJ9hUw0NxRRl9Ovxh9zYIlhy1Y4hqCxOwahXdq8vrTBovmg4pUO9Vts97L2O1plEF X-Received: by 2002:a17:90b:1a86:b0:34a:b4a2:f0b5 with SMTP id 98e67ed59e1d1-34e922090femr27162417a91.5.1767401134519; Fri, 02 Jan 2026 16:45:34 -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 98e67ed59e1d1-34f477483cfsm71018a91.4.2026.01.02.16.45.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:34 -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 F107F3402DF; Fri, 2 Jan 2026 17:45:33 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id EE9F7E43D1D; Fri, 2 Jan 2026 17:45:33 -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 , Caleb Sander Mateos Subject: [PATCH v2 12/19] selftests: ublk: display UBLK_F_INTEGRITY support Date: Fri, 2 Jan 2026 17:45:22 -0700 Message-ID: <20260103004529.1582405-13-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 --- 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 17:41:17 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 C45A323D7EA for ; Sat, 3 Jan 2026 00:45:36 +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=1767401139; cv=none; b=ltt4QzCcXJddk88L/C4cJf/hkJ51FAeAytLRx/LTSjSiCG4gthmA5PLndrHXZcS7ccPd1TkAc0pg5mK6z2WmVhUSNRwsRUHwx3Q1C7w9Ik6V7mn2/9p3EZQQkolqjslqhqk81rPafO4LTFS42QWNeQAzc43Vj/TlSiqD/GpKaPk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401139; c=relaxed/simple; bh=W1ZlcN21O1nUErIL2QddLDLpe6HN6kZRnr32eNyAemQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cMOme3MbTXCYrFJDwGkjXSlDhpMtR3yEBIyBZpKGA6XVdXlvk0GmI2C3T3VN8bb8YufhuiOMx20dmJahscbnMJ7XMhkHAbUSn1rSUQP8mqvwPFJ4r7EsZeuy2hsOQwJtaazx92ujobFh4SB4opjpChCc/OTozKLvmpMwbAEWLDc= 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=cYT1LIRV; 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="cYT1LIRV" Received: by mail-pl1-f228.google.com with SMTP id d9443c01a7336-2a08ced9a36so28581295ad.2 for ; Fri, 02 Jan 2026 16:45:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401135; x=1768005935; 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=cYT1LIRVvZUZNIWxSZOmeVHC3acOrupFekPaCQrvcqdKHNZsDq3XVW0bGgZETBWz1E SUWe7JSF0O8xfOGlZ9ixQ8wMvXXpYjPVc3jsp3YqIhVuxQXyxWgub0G6nVmf7hDqo0Io /GSCOyT1rzKT60JY6u6wPvmXuqSCYYYft5xbKeowIQqlJVv4HY3dOW3psxBVG6GotGZe InGNsDXACSfUwSUN2OB/ynXVmJF3PsoeR5XKgeDeZRTlJz7+900TdtA19Sat+vF54Gw7 b0r8sLmIHICIG3dtl8liqQzvtzwnFvuQfETT3KOUtfwkt5vdi7zd+F+Md6j8djIIQfVO t2tA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401135; x=1768005935; 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=NCoPFA7MdFx67EtYMbqeoRoH5GhJy23lSqcPlcgXUqSuRGwCVwhkssf0hpDU1PRpxv aMs/bwp/efnEJzJ8NAEPQC00DHp5gY1soLy9sAZPsU9C5qroLAMogdzeOQR/nGMnerFJ RVpo33Wh9iPwzcf+nDjmG7zuLwYxGE1Pj0Ql034n0YHbftI5AQfzYBuOjoodP1VXCH2A 70M0Csy1HoGrT6EBmf0SCXqb1oT6AmX8AqhynxTqS8poI2hn8CdD4dbOoOjfiU8oHEGE jfQbjfNTOL9Jl5EiypmSuLzRJK51lnkZzenF8axTcWMuZ17d3617QrZ/aqg66yzqrmh1 0ECw== X-Forwarded-Encrypted: i=1; AJvYcCWkw9h4yLGS/CkWnsUnntmyvM48PtZ43xvK+Y5/9DJ8eGByJ9IAiSR7QAPuFQaNqDD0hLXB5Ja81WhzqiE=@vger.kernel.org X-Gm-Message-State: AOJu0Yw7VbAk1tzdhMFIznt2/rrRID1IM95dELrgKetEZ+0KZcVygVDH GwI9BMCLvyEEV6+CjwCtU0xrTpMtPLKG4z+Qp29Al2h2j8DVJArX4GPFMNOZn7PxSg+PlUYnJZY 6KNDbTWWGZd0j940K2EgJ6TTUbC6sjNB+BBMy7TyuVxZTpl9w4Mg+ X-Gm-Gg: AY/fxX7LEwFSNux6YCIM9iHOUTpvDFiN6jXLmfmYoGGWCKROHgAdktShEamm33i4QK8 yrdiZ97UeaZBETtsKlZ8d7Wmi0tP/pRV8UyqJvJiWw8MjkaJ+a19Ix531HFA7rqF6kumlWzjzkr yC2fa8zaINZC0SD+fR6bEaorZFhKqiBGobfBYtEzlPL2CCh5YtMs4NV5vDfJWhqXAKpEwOjWmZS OPyLR5Oe6+VsEQI0XhGA0FMiY/4h5cfwcFq2ug58DE+vyhU3ywpw3F5dqkElGCtLqBSPKj1+G9W JlFumh8YCra9+nOoP273RZoI0hG8E7cWYQd8Njk/FtQ2v8T4h4BvLx+7jJwnNri/BROhrtcoL79 GJ7mi6YlR3D+QMf4DYiz81yna4y8= X-Google-Smtp-Source: AGHT+IFVCSwIg44UNU7r0AMnF+xe20OgYVh3bcBfLnFf339bcxoBxZ5KSQRqFVbWIPZUso95dTnP5yojbSft X-Received: by 2002:a17:902:e5d2:b0:266:914a:2e7a with SMTP id d9443c01a7336-2a2f29406ecmr330612725ad.6.1767401134795; Fri, 02 Jan 2026 16:45:34 -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-2a2f330c704sm46168885ad.0.2026.01.02.16.45.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:34 -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 26171341C73; Fri, 2 Jan 2026 17:45:34 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 22707E43D1D; Fri, 2 Jan 2026 17:45:34 -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 , Caleb Sander Mateos Subject: [PATCH v2 13/19] selftests: ublk: add utility to get block device metadata size Date: Fri, 2 Jan 2026 17:45:23 -0700 Message-ID: <20260103004529.1582405-14-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 17:41:17 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 D288D2472A8 for ; Sat, 3 Jan 2026 00:45:37 +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=1767401143; cv=none; b=OckaoWj6e+GBSHnhmbLrfPzcJIAfhp2EoTuVrABoN2/vwiCqOP2fMRYnvzKJr/jaR+VYQvqUAHctFtKM+YvHBHle21zPy7An16BuBQRS7X28SjOcnQt0J9OuoDKAUQa6GYeu1lvkDw2miaXCMBK3jACoFdPNPusXIFgES1d+IWw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401143; c=relaxed/simple; bh=IPYY2wbBuXA+AcMOcnbpgxkjyrfpEhzCMqJgIVN4z+k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ctMYH2FpItE3P6QOg7ZQ76rVsISm8QeRK39yJReoDC6kXhL640rS7IRF/ik02wAuNW1ZNyCYKxhbx++zPJe9w82FSCAiETG17hi2CT3BHMCvlbsmLZiPYKBehBaw8ghWXK34uqVNvmXfUaW3qKc5Tl89on66OZCtjFhSvKIJc6M= 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=VMa2pHWY; 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="VMa2pHWY" Received: by mail-pl1-f228.google.com with SMTP id d9443c01a7336-29f3018dfc3so39968795ad.0 for ; Fri, 02 Jan 2026 16:45:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401136; x=1768005936; 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=VMa2pHWYJ/53JYvsbEUFjJFCmyVeDe/IaCD5kfgi6oOJgUywj0WOXUuve+Jhpca7HE hXbBhs6URsmCNjZSW/fVB2uW3jwQEc2v7fgm4O/tRrD2fby/WKmN1+anWotpg4YdSPtB EMRIs0opsPswtgEFVSUy1l49OUs2tFGxPgmAtKphJjFDHwChGSfP70o6U3L+Ak1ADPt3 YMK9cU8/pIpsUHxvjpsqHlprQJoSLkG5x71m0S/mFX4MWTqW4fZYdQQYdZ6mmaQXoaX5 OhcAbFR7uUMjySMsw6RmaTZ/+bDen9ZD/K113JsGPSdFLtom+dwMoAB9yIHWi+s/UieN SL/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401136; x=1768005936; 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=XaKAdDcJx6cpqYckDos4+wYVvI72BH3DY4BYhqy7sI1eGb2o+FOdcDvyeIBF2ot8P9 kI9tkV80pqhFrjO7fGIOph11fIHWEEzwhpg8DW6njN+oSusAPzFCHU6HKvQWvS62dJkC bueNbHYhk947q7FXHjJBO0ZPE4bqel6dgVqvl4aPm2WWXzM+BO8VCxW3rqpG/K64ck8w BtGI//2KuIxL/ZMwnEprvOVMZ5O6gpeaGDipCGQJLp6u2GzioUE+IkmK48MEHVZARFaj YsqZHOgZ/Zm/z7I5c3nq0Clp0ZLRg3T2+kRYrwVBFe24o71VRlI9wHentDFtfcpjfjzs xVeg== X-Forwarded-Encrypted: i=1; AJvYcCXrQIg4sGaADXnxOGwfPJhLmzi022NzNqkkQQ4CYXY0MAVgO6/mC5Q+cvjeQ4Ml5rhHRWj9hHwIoFueI7E=@vger.kernel.org X-Gm-Message-State: AOJu0Yw+TD8gREcbiwI0O0d7Z61/tSLRu6RcCCp0up4XRv41UcpMVmRN i6Dt1/6OoACcDurSaE+WKRhA9BqUm9ZFXtoCyHPTe3uMjVMe0tzWlM/Jzvv+apZJZq7/HzluPnk DBeKmArWWZGC9+yvOEdb8gZoWOUjwxULLtVs0 X-Gm-Gg: AY/fxX6q02j4oSe4yv6zqqGHnEs+tb39kyuA4D9eGBXwTtvqE2d7NKwz3F1FyzR6BzB fRdsz2rvq1HgYWkN9NlBPv3CPgf/Kh2+XpR+O2Ny+CsJjVZ0y9ncQs/1t2EVxvP746h4cpUruuO E3NUp/Cc2xWwsuygCDI7WkuMhU/9yc7g0atZl/h2dmWVOJuhRlsBe+bh2ncAzjBh90Xa9dJMww7 Tl9czR6157XY6qTuhjGQgveyTLtBMZI4+k7o63rwRO3hqXkdx48wK56F6UKRuup49vwQdsg/L67 HIuI2pc8KGl4h+GhUtMi7AhwxQNptXQGiFc2fDBpkPTiWNSkV5kSJW8BlEFRb+QgepM9YeuQSoi mIbgYavooWQjgsEYFMdlsoC8xhXDPG6WJe01aed9wcw== X-Google-Smtp-Source: AGHT+IGFp1rfzMZd54gQEwvR6JR/KMIfQSjHvp//5kWVIwoBUSWm6YqEABbH/jnQwcJteCU0TCgSQiFmBw9r X-Received: by 2002:a05:6a20:486:b0:366:5c4a:c482 with SMTP id adf61e73a8af0-376aca60577mr30292837637.8.1767401135928; Fri, 02 Jan 2026 16:45:35 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id 41be03b00d2f7-c1e7bf52e1csm2459238a12.13.2026.01.02.16.45.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:35 -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 5E94E341D2E; Fri, 2 Jan 2026 17:45:35 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 55ADDE43D1D; Fri, 2 Jan 2026 17:45:34 -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 , Caleb Sander Mateos Subject: [PATCH v2 14/19] selftests: ublk: add kublk support for integrity params Date: Fri, 2 Jan 2026 17:45:24 -0700 Message-ID: <20260103004529.1582405-15-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 17:41:17 2026 Received: from mail-ot1-f100.google.com (mail-ot1-f100.google.com [209.85.210.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BCD6D245014 for ; Sat, 3 Jan 2026 00:45:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401143; cv=none; b=m16/SaiQjpcpflsZaby7WTsVz0B35PJOtq74iBLEVyR4RqbqPC2NtqJWtA97EE8s88DHZ43mZVh3sHNhxPmQjx3hdcd43Pe1PSN/Xr/cW7pfUK8tkgZU/v4wbot0CiFefJ+95vZiqwwS2AYzyIAwzkTLlQObOXARYfaLon6ui3A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401143; c=relaxed/simple; bh=QxssRt2K7/arHhwAENIHPr/xs0l3C9sgNhJ+s1tkF+w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hH34kwQpdWWMumCvjVu28oe/VsJxXVZjsgKE80yoH26pQm5Oceo4CiC0GHyiWFI8D2jYATC+CVVibsNhmxjMI6W8NVEje5ULJTAW+bF0aYKQjjdoV7m96Dvw9jdVrDl0IkcSZH/VYX0xPg9RqzZMAori8cdP/89306nQkzhM6Yo= 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=Zj1owq0b; arc=none smtp.client-ip=209.85.210.100 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="Zj1owq0b" Received: by mail-ot1-f100.google.com with SMTP id 46e09a7af769-7c7589281e9so2331516a34.1 for ; Fri, 02 Jan 2026 16:45:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401135; x=1768005935; 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=Zj1owq0bGskrbnSH51RVWb32S+ABTrOb9crYmb1Me//37C0M6PN06YUWz02qQl8UcE zom0vpXsQvj2ID+mloWR8xBIrH0ETzxePwKgrZkrbPSyX+9I2nFM/F7QDiK26gJOwUw5 kuAM7en9rlJGa3HeA2uHKDS2BUru48ugUiuAf8bx8qmFaN81M3duW1i5h4TianGAPpT+ +D2IZGM0YbwwwIe3zpSwG6ag9gktVIaGbB5RscICD3l4vU+yrp2Tmst9iYaK94RcKmoT owe1MC7Kn/MKGkjhCKR+iXsjoQSk1UbKkui25KGr5WUzHUO8S5g2Rs/LEUhMRlwxjEWM iCWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401135; x=1768005935; 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=XoQL90MRi+ZKx4vGfQX8pnFZs7+Q+FbCfohNpCRywY+b/KkryTUxetPXrOjc4udYpR w6Y4vs4XkAnCvsqD8VlzkCwMSiCX83e5HfJpbCC1TaBV8Z3FCIfjFNDN//0cIzrGVQrM LidK23T4p73XVWZ+WxA0hWmTqUxbVq8wb76lbTOuMNOvORbjt1jdrxGO/N3atZ6HieI3 sdfzLW+ecbgxFWIYCb3rWtFG0JJY99aWeD++KcJXhHPn6aBHSFkhTEmj83Cm23IOaefS w4QguK0D/bYsHVxcp3S2T9WzyYPHQd7LhNWNh6i7sBTOqDn13ZHvldD6vR4mh7YjDyYQ 09ow== X-Forwarded-Encrypted: i=1; AJvYcCWTkQDwP1x5MdNQkNth43VfYhhWYXeyXAeCEa4TYO9cV3Pgc3eXrSRNGOOEvpwPUTqFyKg4lPvaJEvlAJ8=@vger.kernel.org X-Gm-Message-State: AOJu0YxpZKkr+TTguXTcSqQjZcHD7qIjyyn6VaWDRSjao28Kwychoyhe EMeg7LnKIwNZgh5ev+1kTzNhsSIGyJZ1dFOS0jLG70uKkmt+/Lwa882m1wkucnTGeFauWCoKl5M tgmh1sfyIsi5JjPyc+Hx4yf90iBXV218Z+8FXt/i6J9mdDjvTgbJh X-Gm-Gg: AY/fxX46Pdde4tDt06iTYuy3WpciLNRIzAEsiI2GexBOhRJILARB6QH1Uh2JDNkFeBI CpWQxKcb6nKc9wvn3Q1DDlTUsW5qd2mXgN/mI2A1CkpRiVqO+zdZezunz1h+kNR7XmNVL8IPsb1 bTegAEi8fkVUrOtpYWS0139iYjqGzcsrphud5Xl4k+i1tGBhkC41Fb531b+j1CorRHZCpbLe4Jq qqM2uBCmWLYONoYX0HdLPkjhZB9+lGmMwPwYmnV7r/Z5YDQs9tivAFfSg/99/4i2oSJ2VLD74Eo ROoSyp7e/3O7j2sTCuTqvOdwoG0sXeXbE/QDQcA4cNn5Ho4Ki2XooSFjpCZaCkdFcv93ASAk7RV IHlBmLR3oVpa4UhBR4BO0PODFqYQ= X-Google-Smtp-Source: AGHT+IFLwalgPrUnK/JshmelFKcHKKaza9UIJzmapQ5N39F9GOnFHGs1qG2AEw88mtSWG1HLbWTZUbhSO7Jr X-Received: by 2002:a05:6830:314f:b0:7c7:66df:54df with SMTP id 46e09a7af769-7cc66a0b3b8mr17419979a34.5.1767401135279; Fri, 02 Jan 2026 16:45:35 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([2620:125:9017:12:36:3:5:0]) by smtp-relay.gmail.com with ESMTPS id 46e09a7af769-7cc667ba104sm5572651a34.3.2026.01.02.16.45.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:35 -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 756C2341FB6; Fri, 2 Jan 2026 17:45:34 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 734E8E4426F; Fri, 2 Jan 2026 17:45:34 -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 , Caleb Sander Mateos Subject: [PATCH v2 15/19] selftests: ublk: implement integrity user copy in kublk Date: Fri, 2 Jan 2026 17:45:25 -0700 Message-ID: <20260103004529.1582405-16-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 17:41:17 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 CAC0323EABA for ; Sat, 3 Jan 2026 00:45:37 +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=1767401141; cv=none; b=d5Y72A0PfmZjbcWkwNWHec9JPNvODlP3xZeat9KdH2f3fI7ZEJ9CAY/91ERhaNA4q8VG0kJeSzjnDO+advhNaNAJ9f9JBHFnenO6lWAaa7vvPrVuetWsjEZfiXch/eXDJWWDINbHQWXOx05erDDNVoNPWzyl/nkjaVKk/GDBVIk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401141; c=relaxed/simple; bh=FpSk9SBO7a8fTola1zwsU8+516cI+0H9/8WbLKjGV0Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UXOYKsMYwhY7hgBzv4gzvUeK7fSG4mRvUhQj+zi9c31zzofDteV0FyIu9d1ju/GLHjTndRciyztLKuWU+uUgkYtQ3ibqUk2GAPA1+PF/7krBpIA4BRkU/lhdk0hmIP/MLzqv7IL/LRl1flBPHdVV1ZPFVWKx2knMZNOXHzqSGw8= 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=DRjgjhpF; 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="DRjgjhpF" Received: by mail-qv1-f100.google.com with SMTP id 6a1803df08f44-8887e471148so11112506d6.2 for ; Fri, 02 Jan 2026 16:45:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401135; x=1768005935; 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=DRjgjhpFNm4N4N6hG4XO3vKRWqUAic75HF8GEWYB8P0Yf+MpZQJ1ftPddE+B4iYAQj xcbNX8UoTZ1tkhxJwNZt+JYe8kTVsz0ZBtohgdbvaEsLNyrnxLKZdVq3NqWyN2f6ughX IfJ8GPI1n9hTSsCulm0LKdmaR1+vkb71vwZCOVBJQiCNsO7IaV4RB/CUxCgXMzf/7TFm t2Yl5E6CTSIVAfGELtfGvd6TAL2jWMH+Vk6ybBMC2rWtw1L120Say7N/knIgdJAOQRcK DqhZzDxSBLKFHGlfEVYZMriLD/iB8q9Tl+0kJgZHRVI9sCjAbNj3Sq6/kEujlapOx43f xTHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401135; x=1768005935; 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=pkk9mFlqrWIWEIZ36sFrhg/3xNxWxCce1fk45LwLHSho2/IGju1r6DgKlhNe2Hg2wZ AACtf9G3xGj4MzKfUp1Qr00PLFvoLogWkyQbMQbAXSx7uRPP7z1tSu98A7JCI0USdzgt fRS5NcbxwkQAxPdS2Kui9pdHMIk/LY5oOMOgMVrGr9M3aSdPZPjhwrWtW173jTiKWscD mNfSxi791Kz5psEXHfUp1Fg5WfnhghEz9W5LbI0x1Fp3Qdkec0v1J3kaLV4pZ3MysHGG 7y7rL48TaxsCueVmkR+iRw2WWhjnv5mw3eWmMJfXNseI6DNR+NVqM4VX/Utu0wJ7aY/0 lpiA== X-Forwarded-Encrypted: i=1; AJvYcCUqRL2LqaWJRFOxUtR/spyAYDhQkNfHFNW82b9kujUCCOdZ/0vy/1DbQzHGV3tP/SX40OsjdK5GQsY2fzQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yz9zd0vi/Fd27zLN/ajfz1kFX4RhY4ofcM9OaZ6aLdsl/3mMt38 OizBQsw9Mc0kzGB5/KLA7X1xNHKFxj/4xKW4By6fKWBduPn3EvJfOCwEqOodFZC1+merbrrz/SG 4asZhT2bNPnsS92Bya9pP1AQa01cfZd6KGpq+ X-Gm-Gg: AY/fxX76RbVE3JXkQ91a2bI9S3j6kjxXy6CZmCuuZ1eMwJ3C/k5DU7BYrv0csUaj8+c ji9RpL5n5D//0J/1cXSdkqic4/QKNWHD48wWx5yJzU/rDC6EHMyrTjMCeZtxehZ1S0rLr9j3T8u GIlMITbqNnwTunSTLYJVj+UdJL2IHwjiMNcOCi1o5iiKO5V484X6zVgIihb+E3BYUl27zxgEkWb uXbfU73V99eqFucMDGBASsPoqT06KG9ia0+5PR+vSJQJ8otW4Nqjon3dpQW6FVGZO34ToJjeGmK WoJ9/bTRuwmZjjLkPhQKTQtkwvbGVVAe6v9uCDzat+GNvVuBvWGWOEfv22zshsHMh5iqy/iIL4j SNuV4aTsLfhiLGfAH+g8to5Sc8cA2c5hl9e0u31FUHg== X-Google-Smtp-Source: AGHT+IHI3WlUSEHmZ+1u1hXYR6d4oNAiQx5UnNNYk+rdbw2FQFi+pnQTNFmtPF88OIAF0HT6Q1NiahQ34/YP X-Received: by 2002:a05:622a:1819:b0:4ee:87e:dedf with SMTP id d75a77b69052e-4f4abdc433cmr505476921cf.8.1767401135307; Fri, 02 Jan 2026 16:45:35 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id 6a1803df08f44-88d980505aesm54692196d6.23.2026.01.02.16.45.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:35 -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 99E273402EE; Fri, 2 Jan 2026 17:45:34 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 97E34E4426F; Fri, 2 Jan 2026 17:45:34 -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 , Caleb Sander Mateos Subject: [PATCH v2 16/19] selftests: ublk: support non-O_DIRECT backing files Date: Fri, 2 Jan 2026 17:45:26 -0700 Message-ID: <20260103004529.1582405-17-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 17:41:17 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 E4AC923EA8B for ; Sat, 3 Jan 2026 00:45:36 +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=1767401142; cv=none; b=dnguPgc2B0hEs5UNVzHla7HXaY2Xph90+jZOKatE7+mdCewDfyeFkHILC1hpCAsM5yIdu3UX3v2YIbDXj5gx6jenH7wMOPgaZj5iXdRCPMMj6g9+0qPdNdOCH4f5eVCGci/0WDRVhFMeKGlsE98dV/q/LDYcI2eesiTUqdgSwII= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401142; c=relaxed/simple; bh=f8EP+bPK1MvqaUPNHimhlYSpt7ZjD3QQvEFMsrXub80=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nSbmpUd6PIEP0nmRlytA1wVrDN9fkhZh3oIxnWxKZUBGm365IoYj1qV+h5SRasrCvq8TvR3a8+Dshx6Sls+rPO5i3nJxtc2BtUXI3W2sKo8bulmFeoEtmn0MDnVp+03gyEch087a31M3XO342G1GIQdJ4/JLeFgJfNyvmRrGHyA= 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=CfvfZnk7; 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="CfvfZnk7" Received: by mail-pl1-f228.google.com with SMTP id d9443c01a7336-2a355c8b808so11821245ad.3 for ; Fri, 02 Jan 2026 16:45:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401135; x=1768005935; 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=CfvfZnk7bDH+nJOM3yZl+8AArxpZJjt4FBqpkgGh4t+bMwCc4prAWHorbgZTTW66qD ZvGDoCc+E7RPs4KT0KzRJKjtc4y5I8tah4Dre1RmM8GA8vNTiWNOHkVHTtLPOt6rMiNG 14TFufkdcscqvyWkbW3RdKx/mKfPUiTzSl9DHFNwuEkNAa3v33SGTNUl8/gzDJ6q3az5 IgOF3ZwQmfhrHOtoIFHjGlWyLVQDaY+mvvIdmBd/LOmgHsdf0RXsOtvokcF1z5ZjxQrl YsGpyhpjpNk0uLI+silil1op+2UxFBKmFzq+QaJ9DMGGoF+TgkNTGLPigG2M2Byn45xc u9AA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401135; x=1768005935; 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=LSQuGQ8FTmzbT17EUWaOvmjXfrtCeMhPrX3xJ1sH6JC/5yOqQHy4lZftrY9i8ZU0yr iDQEVq93sKHh7nc2daw4HwSStWgjAXTfCkS2plCLhLLAlV0jG0Fgg43HbZXGzla+V5yY 9rqGhcsRD4BFrLRCa9sZThBdfSlveKROaphoC69qMn2e+Ihm0MNUUfDX5bRk9/U3oGmk g3Z/D5hzdOgw4/HZFaKULueBmp2ePhg9/101MagzW29+HL0bEamNSRcJJyH63dtMsUmE 8NomNPiWaANHeRoOWKFlSp0Bd572JKsFdisX3Wog++tjOTjz9heP8eAzGo07kn7vj27y cksw== X-Forwarded-Encrypted: i=1; AJvYcCUW5HH6oJa8eYK+Y72glOv7RvoknkVENMXx5GwHi1tg9fn4G1XnXQzk6caDC6YNpbaxE5ncY418XwR8II4=@vger.kernel.org X-Gm-Message-State: AOJu0YxeIL9du1mYxdwR9+R4SvtV3WBD53vPrvBXUsXzN7uFm2R0qs9R zwtYt6ZxpGJc3hmhqvmjz82/hIM8KtxM2G+dPE6ZNS2myPJ03VrUpp0aLBnsIjxaZP90BMTFuaU +t5GFbFcqvCY0/e0S1oVz2uz2RSo0VY9YUtz7aXDIvrKXUpJo7l5h X-Gm-Gg: AY/fxX4UwpdabdeEwxGJUjArWYh5wQ5wyANotvk5A+Lvbd1WWJXolnkgMXJEoinqg+I mKgMrwYDeGbbAPJAyeH2Q/POeVMccj9wmHEfPwfumdDknYRpT7LOgrbmB1fQMakH1aOYci40V8N k0940Kc/4eYdkcvXqUqxrTJZXr0fut+3bQGNl+L1EqZaz3tcxZryXak0emWsr1+GAM5lgnDSBLE qgxnnDmBcSMFW9+AtoGCxvH3hj2P97ljfHmvOfmyVq/tiOar8Pch0u7u0Q2hM/QT18xqI3NIy02 X4IQXg3pPMYVhUS3F0KdI3KfY1GM1Wzt9SMADY//wyTWbmT1ubYzpeMDpnXhCSctnYeM5dZvLY2 s6LzbzlllDS74kTI1NjHrKMSxX0I= X-Google-Smtp-Source: AGHT+IHcX+CRfh1yJ1dtOuSX3HDSSImX9jo+Oulvfyxwk7ticvfgzH1fRPZhYJFZLxwgd2hA8WknWNn4BYl9 X-Received: by 2002:a17:902:c405:b0:297:df7c:ed32 with SMTP id d9443c01a7336-2a2f1f7c269mr304827635ad.0.1767401135319; Fri, 02 Jan 2026 16:45:35 -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-2a2f3d1c1f5sm48601045ad.49.2026.01.02.16.45.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:35 -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 C0943341FDC; Fri, 2 Jan 2026 17:45:34 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id BE7F3E4426F; Fri, 2 Jan 2026 17:45:34 -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 , Caleb Sander Mateos Subject: [PATCH v2 17/19] selftests: ublk: add integrity data support to loop target Date: Fri, 2 Jan 2026 17:45:27 -0700 Message-ID: <20260103004529.1582405-18-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 17:41:17 2026 Received: from mail-yx1-f99.google.com (mail-yx1-f99.google.com [74.125.224.99]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 90C24247291 for ; Sat, 3 Jan 2026 00:45:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.99 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401144; cv=none; b=qUG86mjPhVHBCUeGZVC/AbdvWgvSy7C94iT6SMoVRUKQb7lkbAq8D45sntw+wb6DnKFkXbLJqHxrHpt41h3CfL1pGT1l+3Xxf4GdLyJ9JrQl5U2v4q2/r6aY0UKcpXEwA9CWlyPnaDIHVSTvb3xDAx7e6T+0ZDS4XLcKiFGHBUA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401144; c=relaxed/simple; bh=T6I6wJ3K0zbZovsFhPHvXVOw2B2xHcL5y1GMqwzvtJo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=V3z8jioyNrOFMR2LGYxQbI8LV/vWy/R89pXgv+erqRP8M/kajkL9VrL3o6Nc77c9QPr7updKB0zrZv9JrNsEcJ0xkqbmY/NzK5mAlvb0u3d5CzeiKirQ51bRf4yDdYj8U+8xEj4uyX/wNDphWopeDLnVDJZKPHFh56XWUUVwL68= 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=ErFNr+tz; arc=none smtp.client-ip=74.125.224.99 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="ErFNr+tz" Received: by mail-yx1-f99.google.com with SMTP id 956f58d0204a3-6446c7c5178so1907331d50.1 for ; Fri, 02 Jan 2026 16:45:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401136; x=1768005936; 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=ErFNr+tz3yWB1PdPogqri8YNOEoE37BsA1htINfi32HxtYv1jmy5E46XHWmZLpSIMk +WeGKSKWi+3791jTTRf6ekUn6ThwPAS57ZVck8qPoTU4zHO3brrApQmvuNrPj8OXFdEC hj1fY9KSUYM3EVV9uZ53XZVcbLi++7JWl6CE5WLJhjy8ka51bxx33lM+e3b+9YXcQvkD gZhGXx/LRO2DbmPyQqw0IK1QH0bAz8GADVPp90CLfe1h3Qr6TCeJxTEQZnMIP8puR/bj MRukWtuOG8aSdCS3YkwxmbnZAV5+b9gvlqGbmklaGIla6ZpDkCGKaKr+XVV1YNqks2BN W7cQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401136; x=1768005936; 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=MgYwajQ9/8GaUwcRceFybzMi5UtJHTQtr2kNHVcl+Iaw/gss1Eogi01RPuHAC7zxRl JsbhD4qsvb2MZ0z7Fxg7aiFMu0LvKOOdz4RBAUcgI0gCB+8R6jADxL6lYuFi9AWyrFpB 6mXr1WgNtQYdfICsvpMMqRcqe6/gWuA0aJgpd1lekLK2W7mad/mqZ6Ajjleb+d7O56j1 4WsjPZtp/Q/Gtp1ZE4Vh1Lgnsa6hTL8tOTMTfnd39jpr2nqWzOoSCysiQXe2T8j+p5Oc KpKZu1mi71MvuWN8v6dBfGfRHh/b7IM5JCmzxFzKc1EskZ6LY1cZeCfpVWQdZi+ezGRW Hazw== X-Forwarded-Encrypted: i=1; AJvYcCUVWrv1JQVOYCpTVIW335pQHtAgnqap91A+h0uqGTc3NFeH3E9voZDcMDDU8zv85z4EUp3plw3D2VJeV2A=@vger.kernel.org X-Gm-Message-State: AOJu0Yysa55u6mRXlsZ1NUS5a48dnclgRz3hgGAu5FI86OWJAbleszmy aaRUYD0MkRe9F3iTNkiALiJrDHIizlvH+U6IICBgnJhn7RzABNQtr57EB1YUzRsVwBMMXSItpU+ QbhGStLvmWMgZXOoJAEQOw/I++pvdMUPkhvd7ddKJlL4Nh0PQgTPO X-Gm-Gg: AY/fxX7dODXxoORCSfVbHUUXweKy5a9zwRgV6ec0DkzWCyhdLrbTRAnbFkCXuCBQSUG iPQSxJIMpa79FRRq1S5lynvLWy7+q8vbT6ujRgxZXRdV4o7cUpVB3QQ/CshJgZZlX9rH9zsHKEc /rNC9UaJYL3Jbb9cNuxk7RWRgG0RKDrxlJ/MsuNdLMwkBLE0HDeQ9jPq1Ndzer0T1RUdyVieo0R r91+wAqYOcQqrJHGj6xDNprNqM8TQYwz4iDpcO5DdqP0M08T/l6x0P6cB/GsfOW+ow1iXLKXpe/ dCoiKRnyikMPobN4HVGjDoJlEHAYJQ9ObeOBYaaXDg0W/XT/LIOJeQUnXfsut3z5/caJV0XYJZO A39eCkZTaukdcX4IBVgddXN95Q2Y= X-Google-Smtp-Source: AGHT+IGZCBwrWBAXCJXU3hc6rJVsmVB1yfkFx752MekQsf0o8FuzhVWl6oSZF47VlzZwoNripcFsCHwHInYw X-Received: by 2002:a53:c043:0:20b0:63f:a103:5d26 with SMTP id 956f58d0204a3-6466a933687mr22504120d50.6.1767401135899; Fri, 02 Jan 2026 16:45:35 -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 00721157ae682-78fb4550d72sm20957187b3.32.2026.01.02.16.45.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:35 -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 E473B3402DF; Fri, 2 Jan 2026 17:45:34 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id E24FBE4426F; Fri, 2 Jan 2026 17:45:34 -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 , Caleb Sander Mateos Subject: [PATCH v2 18/19] selftests: ublk: add integrity params test Date: Fri, 2 Jan 2026 17:45:28 -0700 Message-ID: <20260103004529.1582405-19-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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 17:41:17 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 E8C32248F47 for ; Sat, 3 Jan 2026 00:45:37 +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=1767401143; cv=none; b=GSQgSTii1VD/E97r9kqYjZS2gySvjSE7rnJRVi3U6P3tlNUtZzLLC28mTyQdd58K7Ypi0qpeNfk3CVwz0j+88GVuzegD+OJrvb4CDlI1jlRAkgF8PAXycwfVoioD9BY/WxHxwz45wLazbvrLYrlFLW7StTFUWHUNAejEvFw/fUo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767401143; c=relaxed/simple; bh=Z1UdenNqomW1Gdmx86hqjdPqAqBfGOKQ/CBxjOYJH6g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hkR8pwbor+O+jx413CxeJTk27N7UagGw/WJ4G1c8KzswyhZW/PExRWsgF5yATt6RDFJcRCWPuDQXyBbPY295795VDZjET/tv7w5Ipcz6wzzoXN48glJaLZXNw86EVYdhA65Dksrc8l4FyupYF88RkL//NM8EAmFk64S5yK0Sfjc= 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=Qn6JJXtt; 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="Qn6JJXtt" Received: by mail-qt1-f227.google.com with SMTP id d75a77b69052e-4ee1b13a0a5so8138201cf.2 for ; Fri, 02 Jan 2026 16:45:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1767401136; x=1768005936; 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=Qn6JJXttt4FJUNy446H4bvpPPLsg8ZOD8PE/kfjZZNzws6AUd0AMN5XUyaSau6FGam CW31MudoRMD3Fuls1h//9ekl3/4/iW2M2mIsMHAg0r5Zfm7pLCiQYpu//plOxroM+zLy kKN9dMkWAVz50pRgSH+oFctkZ4+tiwylEaVH45XWC6U3Wn3NC5W6UTYsCFDUYgoHb3Pi PkBeLe/v1yj7SGfbOU7Fdnd/7Sw9pamtVq1MrnKKdwfB5mh/FQSQv1yS1oWwWbYyH0n5 fbls95vzKGLi+0ql1bi4QoQrtpIHgAUK9YiX84X7in7sfWOQIULFD5iHaw0EYLnI+eRI CaTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767401136; x=1768005936; 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=JRolq+RGP9SX7ASCx4DYY/qjuZpzzWay5/wl9FZSQW13xe7kdLZSJubI3VDevGMlOV k4MBQOMssDezMCaFFZmFgl3TWbBXgknVdWpUpwtoejJtLF0azizaOs+rLhirwbCPvmD2 P8qKhSNssbqkNTTQHEK/I1jGbGvomR8m9W5VrpdH47ZQbpc4P0wiuOt1A/KFcJ4eraZP PSRgjeudkGfF/67GcKkG2ADuGRqyKW4LbrKRxYMEmJLxKHr46TTlcAFeW+vsZ2XEd1MN BOo2QicZpisKT7TYGy1+SFE/2nqOr1gYSUBgiS8SMonHJvLDV3Z9RTTXBOO5PZpGIv4E JCtQ== X-Forwarded-Encrypted: i=1; AJvYcCUTkT5Qi3H8VUzioj8NyhK8pVDdNqVnJyKCbHCd2y4TlzhxHf3gdNzKe7f9y7j9dXjuwevV9zI4MhuNQgI=@vger.kernel.org X-Gm-Message-State: AOJu0YxU+7Ram9JQ5L5L8zqNAFDPvvHNu6wpiyDt0rvBm+x+qMILVqDw xdpa/m+Wm7yrZGfpkcRy8Pamy4LHueTjgpf7XcjGmxPVnr5tjLd6du0OWIrZ/xJK3f8iNtSioc3 EQzciJuQmgElkE9VdsioWL+kITObNSb1e6sjC X-Gm-Gg: AY/fxX6IC/kYtiLwvDuxQb3CIYH8QnvvnVJgak1j/rSQzk2o/WaAbYI6JDtUeyUs8hI mGNulRSIqQbbZUA8fDcxOwMir15bZO8vkt55RUxlFZi5uOtm8Spnsu+bA9kWvr6IPBkilchNTDW /vWQ7i2FjmD4j8mvYW9s4OVVDF0l5L1Bl8cnE/LZgz7hMsNWgvjgYb8gFya1vf7V/3PVaSE1D8I 7hWCVPCEZ2BX+XQ0A/g0jTkDoR08IkuXPeHA75ezT2+jbIICY495G6NKP7VkeTygnvb0+hNxCUs r2QD6awLp/dCrZkv2EL5GZeD63uSVLXSrkf0FUAIUnUrzev6jvAfnGTnJX12fFdJCaBkMDmFuT+ sgSKS0OIL36vSIu4ZUlqq2AJa5HGQL9csAvp5AcFbzQ== X-Google-Smtp-Source: AGHT+IHZAEUm+/KeaPlAJWYHKmwK/cOEr0PXHOPV39yt/7DICLsrzO1LLXoP+OqMGQtK5PSI2eAnQ5E7NUpW X-Received: by 2002:a05:6214:2685:b0:88a:51ff:6054 with SMTP id 6a1803df08f44-88d82718069mr532303876d6.0.1767401135942; Fri, 02 Jan 2026 16:45:35 -0800 (PST) Received: from c7-smtp-2023.dev.purestorage.com ([208.88.159.129]) by smtp-relay.gmail.com with ESMTPS id 6a1803df08f44-88d94fcba36sm56013476d6.4.2026.01.02.16.45.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Jan 2026 16:45:35 -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 1AF84341C73; Fri, 2 Jan 2026 17:45:35 -0700 (MST) Received: by dev-csander.dev.purestorage.com (Postfix, from userid 1557716354) id 198D3E4426F; Fri, 2 Jan 2026 17:45:35 -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 , Caleb Sander Mateos Subject: [PATCH v2 19/19] selftests: ublk: add end-to-end integrity test Date: Fri, 2 Jan 2026 17:45:29 -0700 Message-ID: <20260103004529.1582405-20-csander@purestorage.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260103004529.1582405-1-csander@purestorage.com> References: <20260103004529.1582405-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