From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 064B2C5AE59 for ; Thu, 5 Jun 2025 17:30:53 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 562F06B007B; Thu, 5 Jun 2025 13:30:41 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 511866B00C3; Thu, 5 Jun 2025 13:30:41 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2EEF56B00B2; Thu, 5 Jun 2025 13:30:41 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 051716B00C3 for ; Thu, 5 Jun 2025 13:30:40 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 9D6361211AD for ; Thu, 5 Jun 2025 17:30:40 +0000 (UTC) X-FDA: 83522036640.30.BB706C5 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf03.hostedemail.com (Postfix) with ESMTP id B9AAF20003 for ; Thu, 5 Jun 2025 17:30:38 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=bBQynhxu; spf=pass (imf03.hostedemail.com: domain of bfoster@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=bfoster@redhat.com; dmarc=pass (policy=quarantine) header.from=redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1749144638; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=TdA4MqEs+iXthUcjZmFuz3drXHjXLr7u45s4ZOP6ueQ=; b=gxtybmO5PKnQOoFwM0IH2xxynKPlPqIqe1qOQ4YdGNaZdeI9u6UoMcztpBaHxUF1et5TfF c1ruaxHc4LwVsQkRgc4WVr6wWuAypPOKjHpYrpNOt5AIYvh9SgigkbnYcZFA6nRepDorHG zPChOZ5zHz4GE9JqHoDNffInWY5q/Sw= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=bBQynhxu; spf=pass (imf03.hostedemail.com: domain of bfoster@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=bfoster@redhat.com; dmarc=pass (policy=quarantine) header.from=redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1749144638; a=rsa-sha256; cv=none; b=yJ+ADp99Ckj+cl1f0f43v88e1jzBnhz8aRe5TO8vmHYUlVlbMhLTLZkFN+t753WacgmaAo R6Id2StT2jQTtcKNAKX+4YuJDUDcxdxehsgoxitg6kRK/1Jsfhqh6Ihydv+mj4eqrFlU2I q3J+tqdM8dejqx87Zq/3c/LuL6a93OA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1749144638; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=TdA4MqEs+iXthUcjZmFuz3drXHjXLr7u45s4ZOP6ueQ=; b=bBQynhxuAMj8i5Z15uZkviMd/5tfKiUbFxqE/XESPmuniK9z/Q1X9QCPLyZdItuAj7x27V YHqdADWpvw3LZSMro0ggLgpA1BE1V6OryRFISrLD3MXGaPl+1UVeMu698Q4/Bw6mtIpO5q 9H36DOLSygg5wAOQMRWCbTwIxwf00cY= Received: from mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-519-3tqSx6eMOhS7yDV-rnjWdg-1; Thu, 05 Jun 2025 13:30:36 -0400 X-MC-Unique: 3tqSx6eMOhS7yDV-rnjWdg-1 X-Mimecast-MFC-AGG-ID: 3tqSx6eMOhS7yDV-rnjWdg_1749144635 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 5316B1956089; Thu, 5 Jun 2025 17:30:35 +0000 (UTC) Received: from bfoster.redhat.com (unknown [10.22.88.123]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 96A7B30002C0; Thu, 5 Jun 2025 17:30:34 +0000 (UTC) From: Brian Foster To: linux-fsdevel@vger.kernel.org Cc: linux-xfs@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH RFC 7/7] xfs: error tag to force zeroing on debug kernels Date: Thu, 5 Jun 2025 13:33:57 -0400 Message-ID: <20250605173357.579720-8-bfoster@redhat.com> In-Reply-To: <20250605173357.579720-1-bfoster@redhat.com> References: <20250605173357.579720-1-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: B9AAF20003 X-Stat-Signature: stcnn1f4mwe71kxzckjqs7uxdc3x4tof X-Rspam-User: X-HE-Tag: 1749144638-933477 X-HE-Meta: U2FsdGVkX18xPSNHUxNk6JubSPh9EYXwAx8giwofniyu8tR6pVWjmGeb5mDc2bwomvay5bLteJrlFRAyTXNUezh8wy7+517vbII/pUE7Gc1Z3fXVIgyApnS5/plSc9V6EW4Wm/Qc8hmJw8cEuO1kZwyzdWNRcFkiU4H6G3A3rOkg6d+J7hSjb2ayYJxnJL1nXihliBYpQ3wVjZWhJ4t4V8U7V59W+jw3xdoCpox1roNhuvrVEc+xD0nodf8tmHp0h3ETZlTOobKPTXEO3Ut8mtja4jjTB54aFqpgofF+t2QAzrvG/NcjqPYsqir1t12oJgMA6pvVQgO5kMVZ8xvK26WQVl5WbloLj2IM8WnkGampz1SyUka5pSsY2P1YUcYzijsFstIctYDKSFBTivKHG4P2nsdi2vODoglyASn110HhSgu8I+4dnEz2A0Zo/mSFtlCl/gc9dzB4a5g7wmcksuTox7ZzgvCgvVI3MY6ZI4IgCrW4+XmQ8VLvWEnY5sR19rLMJ+sJPpjqnTiZdRnJbpeaFSnvyOca9UT5Qb7co4lfgSepf39xIDAusxXoelv2nS8joyPx3oVkxy3gaMapVsp5QPEBznu3baz3RuCSM0dyQ6EtYSt1aKKJnQR30bzc8EkFUuHWjbnX/ESMDXeLfVJxMhX6YODpS9exAOIxNKX12PYE6y4PaKT1VOeHZBprq6STC4L1zMLlNrs3K0pah8FaJm4TlyPWCp7gNga0XDR/y+wdsrHPcQ/Z+wQkbtgKL1Xf1TwnXjQy/Q3bbk7oxQN7Nb0zuEHd6VVyeYkKvEffhbZldabPOEFl/2VY3w4gv2AnUQOYhhUXIIqLoXEgk+PdCPKCsc7M4oJnElxpkFYHooJKBqGsPdDZnWmO4w2LTkGEI5oIBcx3HJDgwfh3mIx+vMSizWKwB8eqX76OCWratEPh4l82h7Yt+0BZUfWPRlviq95OZDToX3Stnx5 pW/rErsl 4OupWLlln1QBFUwCTbObRc3rnc75/L1XF0FCW69vdWKBZySPF2shkndQgBA43Yk3rPKST4R6+c7uT4Gg6hf8whHQYWFg02IOH/Ft1FbTJwIuFoPdmqsJv+zEKvFjA3gLc8tckR1TvthJt2Hbzmv84h2A+tWp5qMXAI1w3Tusp3p4BWBYyIk+iq6XK4wafhZlHou7k99s1nMLfpN4vieRPw2MiANPPIBZkcd7XtOBCr9Vb0e54EjjDSPHNKNDdkvTjccXW5VMLI8rRdOvvvsT9OnUDt0Uhgh/BK6HjQmNAyUf9k5biHiw9LUXRax2O8Sd5l2LqcHhN7ew5li8= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: iomap_zero_range() has to cover various corner cases that are difficult to test on production kernels because it is used in fairly limited use cases. For example, it is currently only used by XFS and mostly only in partial block zeroing cases. While it's possible to test most of these functional cases, we can provide more robust test coverage by co-opting fallocate zero range to invoke zeroing of the entire range instead of the more efficient block punch/allocate sequence. Add an errortag to occasionally invoke forced zeroing. Signed-off-by: Brian Foster --- Hi all, My original test approach involved a hack that redirected fallocate zero range to iomap. The easiest way to incorporate something like that in XFS would probably be via a randomized debug branch in the same path (i.e. similar to what is done in the block/inode allocation paths), but I find it a little annoying that there's currently no great way to run a full fstests run with certain error tags enabled. So for that I was playing around with some fstests hacks to hook into the device mount paths and enable certain errortags immediately on each mount. Obviously this implicitly depends on XFS_DEBUG plus the specific errortag support, but otherwise I'd probably propose something simple like to enable or disable the whole thing with an XFS_ERRORS_ON=1 type setting or some such. So that's the context for this patch. I'm curious if there are any thoughts..? Another simple option might be to enable certain errortags by default on XFS_DEBUG, or with XFS_DEBUG plus some new kernel config option (i.e. XFS_DEBUG_ERRORTAGS). That would be less code in fstests and perhaps facilitate external testing, but we'd still need to track which tags get enabled by default in that mode. OTOH, if you consider the couple or so open coded get_random_u32_below(2) branches we do have, these are in theory just errortags that happen to be on by default on XFS_DEBUG kernels (without the log noise). Thoughts? Brian fs/xfs/libxfs/xfs_errortag.h | 4 +++- fs/xfs/xfs_error.c | 3 +++ fs/xfs/xfs_file.c | 21 +++++++++++++++------ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/fs/xfs/libxfs/xfs_errortag.h b/fs/xfs/libxfs/xfs_errortag.h index a53c5d40e084..33ca3fc2ca88 100644 --- a/fs/xfs/libxfs/xfs_errortag.h +++ b/fs/xfs/libxfs/xfs_errortag.h @@ -65,7 +65,8 @@ #define XFS_ERRTAG_WRITE_DELAY_MS 43 #define XFS_ERRTAG_EXCHMAPS_FINISH_ONE 44 #define XFS_ERRTAG_METAFILE_RESV_CRITICAL 45 -#define XFS_ERRTAG_MAX 46 +#define XFS_ERRTAG_FORCE_ZERO_RANGE 46 +#define XFS_ERRTAG_MAX 47 /* * Random factors for above tags, 1 means always, 2 means 1/2 time, etc. @@ -115,5 +116,6 @@ #define XFS_RANDOM_WRITE_DELAY_MS 3000 #define XFS_RANDOM_EXCHMAPS_FINISH_ONE 1 #define XFS_RANDOM_METAFILE_RESV_CRITICAL 4 +#define XFS_RANDOM_FORCE_ZERO_RANGE 4 #endif /* __XFS_ERRORTAG_H_ */ diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index dbd87e137694..00c0c391c329 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -64,6 +64,7 @@ static unsigned int xfs_errortag_random_default[] = { XFS_RANDOM_WRITE_DELAY_MS, XFS_RANDOM_EXCHMAPS_FINISH_ONE, XFS_RANDOM_METAFILE_RESV_CRITICAL, + XFS_RANDOM_FORCE_ZERO_RANGE, }; struct xfs_errortag_attr { @@ -183,6 +184,7 @@ XFS_ERRORTAG_ATTR_RW(wb_delay_ms, XFS_ERRTAG_WB_DELAY_MS); XFS_ERRORTAG_ATTR_RW(write_delay_ms, XFS_ERRTAG_WRITE_DELAY_MS); XFS_ERRORTAG_ATTR_RW(exchmaps_finish_one, XFS_ERRTAG_EXCHMAPS_FINISH_ONE); XFS_ERRORTAG_ATTR_RW(metafile_resv_crit, XFS_ERRTAG_METAFILE_RESV_CRITICAL); +XFS_ERRORTAG_ATTR_RW(force_zero_range, XFS_ERRTAG_FORCE_ZERO_RANGE); static struct attribute *xfs_errortag_attrs[] = { XFS_ERRORTAG_ATTR_LIST(noerror), @@ -230,6 +232,7 @@ static struct attribute *xfs_errortag_attrs[] = { XFS_ERRORTAG_ATTR_LIST(write_delay_ms), XFS_ERRORTAG_ATTR_LIST(exchmaps_finish_one), XFS_ERRORTAG_ATTR_LIST(metafile_resv_crit), + XFS_ERRORTAG_ATTR_LIST(force_zero_range), NULL, }; ATTRIBUTE_GROUPS(xfs_errortag); diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 48254a72071b..88ce754ef226 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -27,6 +27,8 @@ #include "xfs_file.h" #include "xfs_aops.h" #include "xfs_zone_alloc.h" +#include "xfs_error.h" +#include "xfs_errortag.h" #include #include @@ -1269,13 +1271,20 @@ xfs_falloc_zero_range( if (error) return error; - error = xfs_free_file_space(XFS_I(inode), offset, len, ac); - if (error) - return error; + /* randomly force zeroing to exercise zero range */ + if (XFS_TEST_ERROR(false, XFS_I(inode)->i_mount, + XFS_ERRTAG_FORCE_ZERO_RANGE)) { + error = xfs_zero_range(XFS_I(inode), offset, len, ac, NULL); + } else { + error = xfs_free_file_space(XFS_I(inode), offset, len, ac); + if (error) + return error; - len = round_up(offset + len, blksize) - round_down(offset, blksize); - offset = round_down(offset, blksize); - error = xfs_alloc_file_space(XFS_I(inode), offset, len); + len = round_up(offset + len, blksize) - + round_down(offset, blksize); + offset = round_down(offset, blksize); + error = xfs_alloc_file_space(XFS_I(inode), offset, len); + } if (error) return error; return xfs_falloc_setsize(file, new_size); -- 2.49.0