From patchwork Fri Jun 28 01:31:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sheng Yong X-Patchwork-Id: 13715371 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 lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0162AC2BD09 for ; Fri, 28 Jun 2024 01:32:43 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-3.v29.lw.sourceforge.com) by sfs-ml-3.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1sN0Tj-000335-UT; Fri, 28 Jun 2024 01:32:43 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-3.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sN0Tc-00032e-Bg for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:35 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=MIME-Version:Content-Type:Content-Transfer-Encoding :References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=1XkzWrJunNjwg07SZ0xtl89vq9kjD5f3AOik3evu6LI=; b=F0lxDCUu2oIf1et39Ne8eHePpW wGoax4HE/gc6NrzLmTiBu6FqzkxboxSrF7F1xCDNDvjLMgQucUY/ULb9cvjfuFn4UtCq1ZSuK90mJ xjzBR+AudmKRl0cbHvYOfBCK16Kjf2fD0mflosaO7XOK2skkI3/HW7AaabzMq7BDS7tY=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=MIME-Version:Content-Type:Content-Transfer-Encoding:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=1XkzWrJunNjwg07SZ0xtl89vq9kjD5f3AOik3evu6LI=; b=S6nkbYfP6qSvmwV2WOQ+RoZFV7 dGDSZmC400HrhT/tnymP6E1ZFHwEgR8UfD8sN8YTD4IqZefgHSzUceXWPY1Y1vjapOzg2JsK9YbHV kfvlpmssER84mQoA4Ooe3iq7Alm9TrbRnDSOoY/KXyAlFjJCJj0V9ROthcFQGnyd4wxI=; Received: from mail-tyzapc01on2065.outbound.protection.outlook.com ([40.107.117.65] helo=APC01-TYZ-obe.outbound.protection.outlook.com) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sN0Tb-0006Jd-T7 for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:35 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=gX8fCLdyGqq5kADgACRCcI8rKgLW3oM+UcGZeUp65BrK8iuB/AGG3VH2NQsJIvJFHdcDwPY3PhNC8H22NNdy82lBGbQl5ASpSw/u0fpzNWBzuTua/aFOdAMxUHTK85or85CUSf6EdQMXUIxp5xjhhBYd5TkS2Pi0fOWMyUGjdcIfHkL9IHM3M8aymBxugNgt+n6pcsf09MosHohzAZAoofWcCPfECCfQpFfuf2NrjJVfqXMg9EUJnXU4OxsYcS+R7bOPlVuel3TGF689LWIeZJmKQDtKHxq7Tr4fygB0sxrtNq7e7yjzNzsskgwh2FD9ZGkoHT4f1wFenmuRzwdoog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1XkzWrJunNjwg07SZ0xtl89vq9kjD5f3AOik3evu6LI=; b=ktRPTeka2lyEiUNGD9ewSrkz8mXuGvCDfAbQVch3kTZ73D27rVYlf6CuS8Xsu9s//1bDLe4uaN1Awvjq9p2X7KRh2/cSXgEyauXJTZ3tdv8yOZTWFs6zx2yIS/z2No/WofmpUfLC2bJvWFyjcdcwZkjrVAnKUeBVTCzwLWafiFHJYX2auhRe4P4wi3uD8QrwaE7Vf6KSBHz2cNUNB04a4DOJGp9NKV83DdlS6nH2S3h8wobsjzPNA3pxfNdfz62MUx2cV6eJNWyIFvoxwtPqGxqSBs3Bt4Vpxg2yXSX2XPdatYG1UttQtohFcY1xGRHImb1F6ypkJkWv7kcUB4sWvQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oppo.com; dmarc=pass action=none header.from=oppo.com; dkim=pass header.d=oppo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oppo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1XkzWrJunNjwg07SZ0xtl89vq9kjD5f3AOik3evu6LI=; b=WjalKUl7ZesZnpOhIZPZSHVLsVfDXjHSVGiUOFhjYMWsL9pnULTZHLk68Mx2SR4a/vY8vIHSrUb8m1NxdtRpZh6DeEDfFMiUlU6KJNipprAYue90lNJFHuYCsGrnmmhEntj/ESnMVEzf/19C/UEZpFFM35zph7U5qlkg58GTK2s= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oppo.com; Received: from SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) by TYZPR02MB6576.apcprd02.prod.outlook.com (2603:1096:400:41a::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.35; Fri, 28 Jun 2024 01:32:17 +0000 Received: from SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796]) by SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796%7]) with mapi id 15.20.7698.025; Fri, 28 Jun 2024 01:32:17 +0000 To: chao@kernel.org, jaegeuk@kernel.org Date: Fri, 28 Jun 2024 09:31:31 +0800 Message-Id: <20240628013140.2444209-2-shengyong@oppo.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240628013140.2444209-1-shengyong@oppo.com> References: <20240628013140.2444209-1-shengyong@oppo.com> X-ClientProxiedBy: SI2PR01CA0047.apcprd01.prod.exchangelabs.com (2603:1096:4:193::10) To SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SEYPR02MB6014:EE_|TYZPR02MB6576:EE_ X-MS-Office365-Filtering-Correlation-Id: b28d6cca-d370-4b83-9323-08dc9712258d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: AWGDaFJxIjkMmUi5Yw2RZc5a23C9R4paAb4CiwUvg2eovitLqSP5qcnWRzovyT0hL6rwY1Xtv+ouObYyyPDybIqdxQFwgB4aaoBRydGz5+wjFqo+1rWyx1kGCBpSiCAZt4ke2QwXN5S8eRNmefstbp3KFZ9DKkv192aQR6ZtcX9DJbVlv9IyX9G3O5zoFJeLfhAXh276BxRCZw+Yq/GlbLYNhTM2IN11KTNP/HVISLZl4YcvB5If1GK1SqY8smJupsScGOJ6blPs2xqDrBx74b5KVAa+Wje+4DrWzRmUpaDaF60I6ZxZUgSYkd8i2FeNCfRyJal1DHGELNo4vmkedqHHpK8rIv8/dRBhUWm4hQpC0SZoRwv4KWAcFRxTYzz2eT1geRHAkIz6LSh37lGDawTGHIWA93+/wNJ734Z03SASc0NcFzOKsecCs9LPs+VVwE4ul/MNGjAujZnhe5yFfjXaHAZKLq046VcQ2g3zEsODFvkBKj8nBYhXuhiKbButYV0C4RopHqm33zdGORKNOzeYhbEUTsMp5Xx3DscpEipkX+st7sE9Q9hMWrHCWORKkekdQzePHafUkymbIuvb6g1mUJOrmyI4egVyLgyAfwiAiJubuloNqNCA9U3v4jrg5dz2904ObQNKG3e7qsp3/sOAVKu8gyJIMznL14mhw6go23mKIVlslookHf4FbxtYpc/GPAHY+0MxmUUcabLpWikaXh7xj9ZMj85o2n4ySOWewXrWKt6TP92B/Rv7xN03Y/5giWLjuOtqtoieoA2iwlVM3WgIi7jgg1CxNim+GipTP18r4lFN9TuU6+k0Dwu2+DrGXt7XMdR46pe7ocZ1eTnI5qgaXe+vsQa7D4i9f9/qpkmB0Ms4jd5ajaSxR/mFBvu3VxEeUaB+ytGXYA+7YY0ByK1Ak3EzRfpchMcdFcnmGcaeUCtBGH9ga+AHERtR7OkslGxwVq6JoRKzVQF1nuyJ2az7spXcyAzATJolFPRPfak9Zspt0rzhEPOCD8QEW5eWPBlclURbTs9EphF0DqdjdaZ8uSGYoP5Ih5imBzKT9NBDgiCHApdBb+kCWtLz4yRueLEwHPPh7L3BhXkIFfy8aNE7eGMfH57FhFWcmqSwTirZs4y9suj9K1Q6EMQzwP+xnP2QGX4qpGcVc6k/XMBY4462w33+jV02dziUjPvnL+K9vDY6LQSQ/TO0/VVD3+F+cwxLAfY0Un3ZiDvr+EXKNbx7ehQ91gwQvV+U+cEYWs0ayYps3iuigYxRk+bXM4g+IJyvzDzY4mHeQJ4t9Qkc5qGfv6dSGgCJTj5Tg/z+PeHIKkBalTQrfV5bKOxZj6ButHHRvQMMHQqxkkwRZAZW/+a73LFE/aTFMfjVIzjEusiL8mwpR1C+nigJoWPf29FknHNj2UbAvGhcMxPkMA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEYPR02MB6014.apcprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(52116014)(376014)(1800799024)(38350700014); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: w4jwBY+7uujDznmpPVr71uFEaxtPkuciVODPnbUlLcidqmuIRDVBYR75mMuTsm3FNuU7b3yfdxsapPth8OAs8zPR7csUadaOVJUOcnxVb/Q/wdvAjTC0Mb1z4hxo9wfvgvHXYD2rft5y9Rj2x2rtFkZQbFOeSH8fQ0b2fyuWtXs5F20WpJ+f18q+rl8KSL+VPqcJeZ6ec/o1WBOZck7dRQ6QdzivMCpqPftT4XtE21VtlRIjHSLzGXis3D83miSOCa1Gn9gKmU/PwR1t6f34OmM4eUgSNNtqKl8m8uyKbjHdRePSU0EDif0tuCCLiA8iJRT/VX2CZ2Ow8vOtJtqOhgYA7HE8Xa3fMVONTGPX4z3VpEg9DLUgkhnumB87/XrZodaQ76G0i8kytDPfUZ/8gTHrVTHAjD7Gal0KTv26Zoqi9eyIdfVpLoI0I5MwGTSX02mDtNZSNihCOLPMXTW63lCMP0gY83pEjK18ZC+jGhTZNnu0z+Q2ZygpynfR9MOmF9lyx2qb1H/8nrRirU/cSH+emEasr080lW5gW03/rzMsCp90UJ7geDVcYb6+k1rqI23Cwx6jxa5qzwJNOnPKid7LcVsW1SZw/9TiYjtF/g1MH9YQUPGP67nSisbfap++13unICCbzcw7xIQslg/a0xKBhLNh34we6RbrfMEZmjgYgWXJIpjKzW1hLpLcLyLHJJ1p0NXa2OYtgE8LJcmVtbGsPgfaiObMRKUYwH/cXeOh0SG8vyxy1eaIg2+qwSZBgvQzruxl8kGJHQQPxViKku4aCZYQcCQyBovLUvXAvfKQfON8LhWONdlbukhPsu+NZ6CEHxeZ32bmv2/8G0k6MA4chAaGQJb0UltoXqyKVQLejVnSD0+B+LBeUbzcIRTIsxi/9MUZLrS7/vuCuzaVlOhkPY0SgfD1txWnhUOEB5Y+GgbnV7kJJOYZK4BLxqzics0TtAgMbI0+pgwSyPXKDCaGCfx6byCkzmhRKPFk+rzAznHum+RTqOCXx2oLvDqFGNJBJqIuwf5Gh3OZrEak/BZBynvRv2mwP9vY12tdirQg1Sg4hiDekdC9hbEntplOmA1pLymeulXzoRoLkDPuSGeY5X3pC1d2S95O5xvzhvAWwn7/V6ivWvNUcfUZPvTjIdAsYQjceENgzQdlDqDvo7u9Nh2pHV9w0oND1OG8Lr+NII6H8gf+FmtqXgJwITrLRHaNP0sdGAPoUBJTDeut3cH6UwVpI919CobWwcjP5ASJI/Hyl12bHAXGekjlOatBh9YHRkw8uYqPbNdmePq4QUIkzVnALkDAC5CQYfICN2X7qVU1lTzVf6azLmW5uAFwnTFWnZUjtbpxjzMFwjblFGyudcZ6QmiawtYjiDb9hlqDRA9tw0gdSwZA1/QAEr64iYcJ20Pp3HUKdHL7NZTXjr0242Qdjk0Z+eWrF7srNHofZY3BNXws0Hzu/hpDfy7yuFc/H7L+thyniM+MngorT2kHKT1JxsfSs091KhCnk+B7GbyKDWGPyk3f+KeCOzDSvpjRalGRYAbS/neWnD6ruWEF+FsmBP+7jiT+muNlDJfjdumCSXpGGiWVapYxNSRO X-OriginatorOrg: oppo.com X-MS-Exchange-CrossTenant-Network-Message-Id: b28d6cca-d370-4b83-9323-08dc9712258d X-MS-Exchange-CrossTenant-AuthSource: SEYPR02MB6014.apcprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2024 01:32:17.7176 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f1905eb1-c353-41c5-9516-62b4a54b5ee6 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: j226oHrQLpjbwrEHRnj6nlR//lfx+okiTLbTxbl8gKO+wZciq23GwELO5nfRaHdaIL96orL/AxPbfOUVjUBwBg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR02MB6576 X-Headers-End: 1sN0Tb-0006Jd-T7 Subject: [f2fs-dev] [RFC PATCH v2 01/10] f2fs-tools: export is_digits X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Sheng Yong via Linux-f2fs-devel From: Sheng Yong Reply-To: Sheng Yong Cc: linux-f2fs-devel@lists.sourceforge.net Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net Signed-off-by: Sheng Yong Reviewed-by: Chao Yu --- fsck/fsck.h | 3 +++ fsck/main.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fsck/fsck.h b/fsck/fsck.h index 6cac926..4ca75b3 100644 --- a/fsck/fsck.h +++ b/fsck/fsck.h @@ -353,4 +353,7 @@ int update_inode(struct f2fs_sb_info *sbi, struct f2fs_node *inode, int flush_nat_journal_entries(struct f2fs_sb_info *sbi); int flush_sit_journal_entries(struct f2fs_sb_info *sbi); +/* main.c */ +int is_digits(char *optarg); + #endif /* _FSCK_H_ */ diff --git a/fsck/main.c b/fsck/main.c index 6edc902..9bda412 100644 --- a/fsck/main.c +++ b/fsck/main.c @@ -166,7 +166,7 @@ void label_usage() exit(1); } -static int is_digits(char *optarg) +int is_digits(char *optarg) { unsigned int i; From patchwork Fri Jun 28 01:31:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sheng Yong X-Patchwork-Id: 13715363 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 lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 64F92C30658 for ; Fri, 28 Jun 2024 01:32:35 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-3.v29.lw.sourceforge.com) by sfs-ml-3.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1sN0Tb-00032R-Ij; Fri, 28 Jun 2024 01:32:35 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-3.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sN0TY-00032K-Qi for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:32 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=MIME-Version:Content-Type:Content-Transfer-Encoding :References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=Qn7nbywE3y7Hclvot0YEg6FFhfxcalDvo/L3BxCEGeo=; b=HcgnNn1KfnFKwcDbRiWyDUG/V2 XFcjGMvVH1A/KeMIDaNJ3LwOQ/8OVLXhsCc5bcNHMHYCDMC9vzPPYn8PdgHSICEOK6ywuumO84tgZ LRLMtsOj7KQSdFgQ2KYV1cHkCiwjpj3KLNjANnC6tvWSjD00xh1wgDWb9hIrNsUt2rng=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=MIME-Version:Content-Type:Content-Transfer-Encoding:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=Qn7nbywE3y7Hclvot0YEg6FFhfxcalDvo/L3BxCEGeo=; b=cnYd7YCzCkLUvYo8EH+DLOYqYO +ta/1oCPbGCq5a4c4VFCWISKk8yvqsJ+//XtUVW0FVtJUDHa18v2GybSEi/xCOfZcL5DOK54lXVEC crZ1is6X9b76GKy6NK0EdHWePBvfUZw5WKmGwRSRtp4J1bD8RMIfP0507dcQ1ACU0ZG4=; Received: from mail-tyzapc01on2044.outbound.protection.outlook.com ([40.107.117.44] helo=APC01-TYZ-obe.outbound.protection.outlook.com) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sN0TX-0006JV-Un for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:32 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WtldmCyjkgeGvekDc7kh/cYLc6X5bp9fvOfvdgFYf8j90+CpZhZ/zU9fJJLPt1IkfUhprWwSAO/h9Fk63IEfjpg0sivnqRJgNk4ceiWazHkXMbYU4JHiFNF3tjzWMwJrnNuzqTHoZJdOTHgwoyuBIIa394laNDVO4nC35wo38fbVwF9Vl9FreDmFbUqampGVBA51ODO1RfP1p7K8U+G3RhfLhguS5AEoP7QEYqAacV4FnvmQ4/5j6y+1CzU/bKlRss2qPfmYduWF65m+0HplLPbar38dHLHQbmQU83XY6c0DFso3uKz4cUBV7wd2XC755CXv8RzuLRdrkMu92fIyAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Qn7nbywE3y7Hclvot0YEg6FFhfxcalDvo/L3BxCEGeo=; b=iV6VV9TN9a+idPmHwCrIGEtfc2g0PdW337j7ZoZsvSD9fTA4+je11QOj0vJUWKLCPnqc3L3V3UKFEHCdG67G0f7+GsaHqLEruvF+8XSdMCEd3w3yiDol66vz6B0pN6ZqiNxJNLizbQV2fxf41/GYAFD844OAeWbrzpmshA7FS+wJvMrHejlhA9i+w/Nn2yGV1czpCliJIzoDEqk+fXAbALKRFBX/HlGburfeCnQiHVwOiyBhMk2bdoi9NuB3sdH4NzIPWOHZC8ET0Ty5OnXpMvHnKHxcTFdU78UK8jjAaeA9B7y2x9R7m+H7z93/6+lOspa2Gnj2Cpl42MyXI56rDQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oppo.com; dmarc=pass action=none header.from=oppo.com; dkim=pass header.d=oppo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oppo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Qn7nbywE3y7Hclvot0YEg6FFhfxcalDvo/L3BxCEGeo=; b=ielxWHPaC69dxudx2DL8imY3cevATTWwPFEyeYL3U88jaDGgvW49z5jstQjEmlZNDUeYzh7M9Qb+m/hrTvEzVTb5mFymZhEwVI75Fbz6k1vhdkVvcESelzHLCu/G3ePlnnAhCCgpPD3eBQua+OX+F2dwJxv39MnkNAE/WXutyUk= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oppo.com; Received: from SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) by TYZPR02MB6576.apcprd02.prod.outlook.com (2603:1096:400:41a::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.35; Fri, 28 Jun 2024 01:32:19 +0000 Received: from SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796]) by SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796%7]) with mapi id 15.20.7698.025; Fri, 28 Jun 2024 01:32:19 +0000 To: chao@kernel.org, jaegeuk@kernel.org Date: Fri, 28 Jun 2024 09:31:32 +0800 Message-Id: <20240628013140.2444209-3-shengyong@oppo.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240628013140.2444209-1-shengyong@oppo.com> References: <20240628013140.2444209-1-shengyong@oppo.com> X-ClientProxiedBy: SI2PR01CA0047.apcprd01.prod.exchangelabs.com (2603:1096:4:193::10) To SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SEYPR02MB6014:EE_|TYZPR02MB6576:EE_ X-MS-Office365-Filtering-Correlation-Id: 213374cc-d25e-4713-9ba1-08dc9712265c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: TqGannPiZtT92pbRWgl0aOQsDDpL3KOb94o6NWR63Tt9e3do75ZmtT4/anvyxl920CCwYmdFxc7VSOJhMNmeyXUVQVJcPlrrap4IJEao2d5NiVOggIIFDXlmp8GB9Ih/SuE/19zk9Mg9rJD/M2Kb6Dm4qvbPcWl9SL4OPyv9HvIb04ea/9wg9xkkNJJvZ3P2QA89oG5aS0SmdiWldh1bQGAjYg+l5NbN+nANH4VuFW89esnEKQbNiHszA+JC5f+BOf6FU7BiE8+XZvYAgVtKW6vwIzKstI/tozSejxNDP6e+LPXJG3Vn46MmZcR2D2y5YSSMSqahMiP9Obyk1I+wDF0gwjNkM6W/tLPUwK9zr3PH9f9M93Z7iGG+NTADV5fwomdyqczBl2poU7MaId6hBFYItG864AMyGvT4FPjQsS4PirxLQy7A6mvtx0pksTWwz8Mpg7dHKRm9bLo943bQmCk0Dl0egn21Z648jeSvoD6Kpc3A14aEEiWmKYc0mVjAj6Y7Pb3SceIqt6FLk/W3zhdeM3s9Zr7PuHfZzddBHJCLj1blTI+RY/Mx0BmcRRsArtDasPNmGu+nSJJno5ZsqpCeDFhnx8TOZIdmM7Hx2Jzeh2kT8avs0Sw1hIAKbmVYMbw3jsx8YXGM3VFh4ms1LH9zeK2eXyvWAVpuc7wJclCt40ccz6NV3ijxfUBh+Zv42MPQpgr20iY3MEq3EVu5ZDkagmcGliAjQ7In+WkAHfOdjCRlU6nK5Ui/HmTswgHgDPi5nnYnyGC5BqcRoPgBFCIYFR019gWLv0WmrO6wDy9yMLYTTmiihvyDaZ8UnKZUl/fbGzdaBYxAXGF2sPIZUf0eUThhUop0aP750Qa4AOgxDhhDY48xoM9NO6BMg/WtY1wn/WzS1y1gJzxGB/VdLnoCMH3xB45H5bRw9aXilUn9KjXjmA1jHtluw/jcFAbzXMzPy27hxlcUHIzfTiVPSHC2Kb+Z2nr7L2PWpE/gFMp6lwWb6zntD+lHVEeMJVk3/v1gaylvNhOf1N5wYfH1nqYlTveKnUOfVFyqVu+mTDQEwcyaKKQa/dJFz2f8AyeGg/INP5MglW/DakjfowIpqOl8Wenn/SvKMK9GZ92miMl8MwhTPHJSlBlxT+gme4qG2NKVZQCzrlKctQqboDithA1zeh6L62i3COfeOEl0uvsf9ppa23xKQVdf5PA5M746GaRSZyS+duG0DHihcn1/ZkWZCL3Zn6gMtqGCvfkyhOm3k45wdcnhdgd+TciSX6FGDPe9opMzR8O46TDalIWWQZ98d4HPchjpNy5P9ajqoV4Mm3BrvLCuIwYTNbMR6vy6/tuQSW2ho8x93vJgHdM6Zg== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEYPR02MB6014.apcprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(52116014)(376014)(1800799024)(38350700014); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: FD/8QrG9pKU4neSv6plXVvN12SSaii9ojb0r923g+kPn7fZkXQq9UI1PozYHCPJ+DIO4tOw8Zqug/BVY63OVRPY7ZuvyZp3V9q3r6h0pjdWbZntwDIVof9JDmHMcRZ4xmMBFKMaUZIKD2CeWAIgtQ4976184b79zVgGnduzWhDuoVQ8GWBfN8rm5gEB2My9fWba/jpw7tCCXd3kNVF0FlrIbgXnSnehS3QnzyD1xUeQ3HVAIko6oANU4NlIV1hwHk5zXviDvdLsZcPla2occU0Ah5ufX1qmg6ajy0MM2g8CDL6Enix2B3WqDuqicFmZNQUMOQvO1LxpCwbOPpPCOicncA7CHEwSN76R+VLPN64bzZ1aI+5vgqdNQcLbOQ4LXgMh2J/20uIErcL+vkmHPe5SRTNWDBtQIYUvVwZW48tqqQFsF9ACg2gi8J/7W67vLFFH2n0q/b1n/SguQRZ8AhFGy1vmwB6RUKhcI7B8pKV/+0HYGlKLLju6/JZGGmzfVtsOZS5Cq4WPW7kAvuCeNqR5zDJsprppG+PDoGOL2MZI+Nl/yf6c67wjdV6ix9sQNh1AdFq7tbuT6BcOXaWzWWWHcqMivra/YXDHcrEv7QSMzVc6vIr/yMRKcGL+4VH/kdLbQNt4Sd7HuERTFD77pWgeOBE4M3lDf7cmK3m247UrOVNCUrd6Aiwyl7eqRROhMNUK4MPvQUm645eHGL03SHQgsh8UPwzLM57hW/wY0Wv7sB71gMdXRdWkjXBiRzNsaayoiCcumZR0R4ZQCOUnZ+juTHteuxpsqoNi4zA3HgrF8JA7FIiANAGGJUhOHIW2mcw34idm+4F8L2iFkBAGb1WJrDiJtQzOaLnYXi05lXzDbcIEdChDl6bIupKfQTGM19gsecDmsgRKtppG1Ae1NmuCobcSK6YgiuDyv8bf5nBHxEN5cbf3cTkVYaJ8i0MPq5o/EFkJi2z9Nr2DXziyW66rhOFx94ND4BIK08hFKE80c3GhsokRxDXBbLvhwxLn/XBMnDUqpKhDJ2QVa7XLbquDuHNWQbS42sWbCiBUSDSCOfcIOqlh3Ak4G6yDEcJg1ylIGO4TFhGKHKQE7ZuVtwcew06/8SRhjthZrIQE0mivdI2UsqfNATYCRBkAZ3zj+0nqf36Q5CwGqJyvDw+jsLI6mSss4PODtJZl6rGehQ5qxVup89EYgGI+YAU9VoYNRDWyAn7DfJ4VOADi+U5Fxis1nLVHYK5KYALOtMG0m45zmneIaxKZZJVWjB3fieYjji45XqR/7UAFGD5pg6gInbUW49V81v+D7032H7w0iCRtpboezD87MNG6p/T9XuTpI17rQh41dyD1C6HB9INbpNdp1LubrlcMDyay/e/i3RoMiXY9Kckm5gy45GiiOoUl4X3/aJimooeJjKiRUNpGSd2Qnj0oOb0cQcEVfhtjKyxhS52v1Fk7oWFcqWyDRYhY08vqcQTMtgdv1/A9NvI/rG5kqM5B2tGiRn5qeUeI8VmPy26ZQKmrOQHrUjBWLhFF4OB66LL/UNk5V5YeZFAbaNTFKKLa7ytyPNi3tqEaU27FDs3EBcwaA9UqNbqKmBV1a X-OriginatorOrg: oppo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 213374cc-d25e-4713-9ba1-08dc9712265c X-MS-Exchange-CrossTenant-AuthSource: SEYPR02MB6014.apcprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2024 01:32:19.0401 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f1905eb1-c353-41c5-9516-62b4a54b5ee6 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: LwmfKldvG1M0X+9YrolVE4kvvU/EV9BT5fru/Ztz13RSLJvlW+95ZSG5g+XTxQUd/QLob0A6sgsH8FZVpF8wHg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR02MB6576 X-Headers-End: 1sN0TX-0006JV-Un Subject: [f2fs-dev] [RFC PATCH v2 02/10] inject.f2fs: introduce inject.f2fs X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Sheng Yong via Linux-f2fs-devel From: Sheng Yong Reply-To: Sheng Yong Cc: linux-f2fs-devel@lists.sourceforge.net Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net This patch introduces a new tool inject.f2fs to modify metadata or data (directory entry) of f2fs image offline flexibly. With inject.f2fs, it is easier to generate a corrupted f2fs image, which can help verify fsck or reproduce userspace behaviors of some a fault. If option `--dry-run' is used, nothing really gets changed, and that could be used to get the value of a specified field. The following patches enable injecting each part of f2fs. Signed-off-by: Sheng Yong Reviewed-by: Chao Yu --- fsck/Makefile.am | 5 ++-- fsck/inject.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++ fsck/inject.h | 28 +++++++++++++++++++++ fsck/main.c | 29 +++++++++++++++++++++ include/f2fs_fs.h | 2 ++ 5 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 fsck/inject.c create mode 100644 fsck/inject.h diff --git a/fsck/Makefile.am b/fsck/Makefile.am index 40d31b8..48402ab 100644 --- a/fsck/Makefile.am +++ b/fsck/Makefile.am @@ -4,11 +4,12 @@ AM_CPPFLAGS = ${libuuid_CFLAGS} -I$(top_srcdir)/include AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 sbin_PROGRAMS = fsck.f2fs noinst_HEADERS = common.h dict.h dqblk_v2.h f2fs.h fsck.h node.h quotaio.h \ - quotaio_tree.h quotaio_v2.h xattr.h compress.h + quotaio_tree.h quotaio_v2.h xattr.h compress.h inject.h include_HEADERS = $(top_srcdir)/include/quota.h fsck_f2fs_SOURCES = main.c fsck.c dump.c mount.c defrag.c resize.c \ node.c segment.c dir.c sload.c xattr.c compress.c \ - dict.c mkquota.c quotaio.c quotaio_tree.c quotaio_v2.c + dict.c mkquota.c quotaio.c quotaio_tree.c quotaio_v2.c \ + inject.c fsck_f2fs_LDADD = ${libselinux_LIBS} ${libuuid_LIBS} \ ${liblzo2_LIBS} ${liblz4_LIBS} ${libwinpthread_LIBS} \ $(top_builddir)/lib/libf2fs.la diff --git a/fsck/inject.c b/fsck/inject.c new file mode 100644 index 0000000..f6fd346 --- /dev/null +++ b/fsck/inject.c @@ -0,0 +1,64 @@ +/** + * inject.c + * + * Copyright (c) 2024 OPPO Mobile Comm Corp., Ltd. + * http://www.oppo.com/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include "inject.h" + +void inject_usage(void) +{ + MSG(0, "\nUsage: inject.f2fs [options] device\n"); + MSG(0, "[options]:\n"); + MSG(0, " -d debug level [default:0]\n"); + MSG(0, " -V print the version number and exit\n"); + MSG(0, " --dry-run do not really inject\n"); + + exit(1); +} + +int inject_parse_options(int argc, char *argv[], struct inject_option *opt) +{ + int o = 0; + const char *option_string = "d:V"; + struct option long_opt[] = { + {"dry-run", no_argument, 0, 1}, + {0, 0, 0, 0} + }; + + while ((o = getopt_long(argc, argv, option_string, + long_opt, NULL)) != EOF) { + switch (o) { + case 1: + c.dry_run = 1; + MSG(0, "Info: Dry run\n"); + break; + case 'd': + if (optarg[0] == '-' || !is_digits(optarg)) + return EWRONG_OPT; + c.dbg_lv = atoi(optarg); + MSG(0, "Info: Debug level = %d\n", c.dbg_lv); + break; + case 'V': + show_version("inject.f2fs"); + exit(0); + default: + return EUNKNOWN_OPT; + } + } + + return 0; +} + +int do_inject(struct f2fs_sb_info *sbi) +{ + int ret = -EINVAL; + + return ret; +} diff --git a/fsck/inject.h b/fsck/inject.h new file mode 100644 index 0000000..62543c1 --- /dev/null +++ b/fsck/inject.h @@ -0,0 +1,28 @@ +/** + * inject.h + * + * Copyright (c) 2024 OPPO Mobile Comm Corp., Ltd. + * http://www.oppo.com/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef _INJECT_H_ +#define _INJECT_H_ + +#include +#include +#include + +#include "f2fs_fs.h" +#include "fsck.h" + +struct inject_option { +}; + +void inject_usage(void); +int inject_parse_options(int argc, char *argv[], struct inject_option *inject_opt); +int do_inject(struct f2fs_sb_info *sbi); +#endif diff --git a/fsck/main.c b/fsck/main.c index 9bda412..f093ca7 100644 --- a/fsck/main.c +++ b/fsck/main.c @@ -29,6 +29,15 @@ #include #include "quotaio.h" #include "compress.h" +#ifdef WITH_INJECT +#include "inject.h" +#else +static void inject_usage(void) +{ + MSG(0, "\ninject.f2fs not supported\n"); + exit(1); +} +#endif struct f2fs_fsck gfsck; @@ -190,6 +199,8 @@ static void error_out(char *prog) sload_usage(); else if (!strcmp("f2fslabel", prog)) label_usage(); + else if (!strcmp("inject.f2fs", prog)) + inject_usage(); else MSG(0, "\nWrong program.\n"); } @@ -804,6 +815,18 @@ void f2fs_parse_options(int argc, char *argv[]) c.vol_label = NULL; } #endif /* WITH_LABEL */ + } else if (!strcmp("inject.f2fs", prog)) { +#ifdef WITH_INJECT + static struct inject_option inject_opt; + + err = inject_parse_options(argc, argv, &inject_opt); + if (err < 0) { + err = EWRONG_OPT; + } + + c.func = INJECT; + c.private = &inject_opt; +#endif /* WITH_INJECT */ } if (err == NOERROR) { @@ -1224,6 +1247,12 @@ fsck_again: if (do_label(sbi)) goto out_err; break; +#endif +#ifdef WITH_INJECT + case INJECT: + if (do_inject(sbi)) + goto out_err; + break; #endif default: ERR_MSG("Wrong program name\n"); diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h index 870a6e4..3a5d146 100644 --- a/include/f2fs_fs.h +++ b/include/f2fs_fs.h @@ -45,6 +45,7 @@ #define WITH_RESIZE #define WITH_SLOAD #define WITH_LABEL +#define WITH_INJECT #endif #include @@ -427,6 +428,7 @@ enum f2fs_config_func { RESIZE, SLOAD, LABEL, + INJECT, }; enum default_set { From patchwork Fri Jun 28 01:31:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sheng Yong X-Patchwork-Id: 13715367 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 lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 99DE4C3065A for ; Fri, 28 Jun 2024 01:32:37 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-4.v29.lw.sourceforge.com) by sfs-ml-4.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1sN0Tc-0004Ne-SD; Fri, 28 Jun 2024 01:32:37 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-4.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sN0TZ-0004NO-2h for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:33 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=MIME-Version:Content-Type:Content-Transfer-Encoding :References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=SFn6PIa8P/df4G28mhr6CD8TJO3PTD1fEoU74xReBDQ=; b=PVtiubI+PjF16NoZNi8X6Um3KB IYxbs9nRDAUsrs5FdY+WhNEjFMYWzckEq2PJ9toiEW/GjwvLhxeK0kiXm12QWNrKiResLqX0DKNvw qXr0/DD46dZ9gnW5vqqUZ/2xfKsVUn/28BaKqep4R6cjAD3VUUKzndrbfmi2Cx7x/AeU=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=MIME-Version:Content-Type:Content-Transfer-Encoding:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=SFn6PIa8P/df4G28mhr6CD8TJO3PTD1fEoU74xReBDQ=; b=MmMcvGOYDk3TeI9sJdhUC1wewj Nu9cdtuh7fga7qHEuR986UXoSCkN29FoWuCSyEiLEjiPNxdifBVaUkxQOSN8jTs7Ik4b+TMW/wpN6 o9jcFAYawOwKKPVc4h4aZyELFlRzNRStgFDJtIf0wOznR6RFIMn0hPE3IwenzVsjTYdA=; Received: from mail-tyzapc01on2044.outbound.protection.outlook.com ([40.107.117.44] helo=APC01-TYZ-obe.outbound.protection.outlook.com) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sN0TZ-0006JV-6u for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:33 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MXJGrRpbLrcI8nAxA+RjPJy8H8KvIS3agujK0hzQFq2tU6xcJPiOwQ69mXZFWGNzCtsCHPKbrtZTeHfNBLbCS07CZ2mBv/jEsb2rGHP/rP7fwElCfZM/vhMPkebZUBZMtjregDCmgeNVpuUVaErYe5le7L6PbIsQel6tLoCFrMyy+GTAO5BdB/kRfCOv8WZ4P6l5cLtf1HRRLL46Ou/wT2xbSXi+UPp7MIt0LNvOS+eRPvZS8178RWUFO3jwKdBXNfr3yOEBCwa/loE4/iuQiWS9ACrib9EQqpGptyFviuE2XhJSiDt8qbThwDzVRhQmu1xDX9lHAdLinEINv8A9kw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=SFn6PIa8P/df4G28mhr6CD8TJO3PTD1fEoU74xReBDQ=; b=jfxixdqd3xOZrsA8c3RQKkuL00ynu3gg4DeFI+p68zJXtY3TlgRHCxhp2COcsyxJxAb+rpoWCh9bh6Y1VPysZ53NrdQEo2b//X2+KcgEBcfj3g7Vl4dqae6wFA6YiqPC0laDjNB/sILlfgW6U0xdevZQ3wO+fkn7I/AGj3MhsRQ/ONYNIrAwgCP0Mu4N9rqfKxc7zRQmC9drColq3EStxUO/900qRhgTlBXbGVoGMNjIkJ08MwbQoxas4gMxryS1UMoufoeu/DqsdXqDRTQMaYwk4K5OSldyCKGUVz4kTpACq8AIC8PaUu+SUItHc8uXLP1R5BzvrhgKDZ1+UFD45g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oppo.com; dmarc=pass action=none header.from=oppo.com; dkim=pass header.d=oppo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oppo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=SFn6PIa8P/df4G28mhr6CD8TJO3PTD1fEoU74xReBDQ=; b=WnDhAqFQ7qtc/Qf/hFmhNaRfTYvrCMfp1K/0OO/Fy+KXtDLQ2cFRfhXeLbNG/w3GG72EYszsvHD17P2MUT7uYsGHGY/s1VKv6s73Il452iwQk97TYF99jUw9WpGSULJYTqjKTZ5vPXczcd0zi+vCvmXTqPSmGccdwQ8uNjmDpk4= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oppo.com; Received: from SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) by TYZPR02MB6576.apcprd02.prod.outlook.com (2603:1096:400:41a::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.35; Fri, 28 Jun 2024 01:32:20 +0000 Received: from SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796]) by SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796%7]) with mapi id 15.20.7698.025; Fri, 28 Jun 2024 01:32:20 +0000 To: chao@kernel.org, jaegeuk@kernel.org Date: Fri, 28 Jun 2024 09:31:33 +0800 Message-Id: <20240628013140.2444209-4-shengyong@oppo.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240628013140.2444209-1-shengyong@oppo.com> References: <20240628013140.2444209-1-shengyong@oppo.com> X-ClientProxiedBy: SI2PR01CA0047.apcprd01.prod.exchangelabs.com (2603:1096:4:193::10) To SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SEYPR02MB6014:EE_|TYZPR02MB6576:EE_ X-MS-Office365-Filtering-Correlation-Id: 169f732c-d6e1-4e76-9d34-08dc97122726 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: lw5hbd9mZmBv2V4vSmUtb1v/7pa+qqeU+PbIcNHnEFxSIagSiC6HMWio2JDjVRjUGVXCFyEHYRGI1WBTY+eeG3AzywWpr3cTol/HFjyptnZA4QUlaI9KyUS/svjOx7RIRYHFo8CasguNR7zAQrEdXojZ/aVkWadUpSftaoc+MDLHP4FLHHo9CRWNMB7e4OreJbadZ7fhegrTaRohWcvQxQTSQhVhwA3scNhVD4c+waivoDKXacPQwkOUaTf8pUlxZj32ztalpnJd7hDGBFNQpQ0mfpYa4eU0YNBrrYEmQsz6sP2RrI+IyDo/Pd6xsZ+xlfPo/FHKESMW3xQlqkwDab9QH6FhOR4DkNxUGlWgwxl1ZGGCH6fkNaFRTkU8A5BA4Oxt4paaVyhaY0ITqxSbxnLYaRUg8U1zSlGtn6BMbJKCF21gSiDNzNTsabK80mjGOBaoMCp/S9T7QJyY8kcsU1WGcsVme7yCC0Jm2RxDRg0PfvK7qrmMgg5z4Hx1cKchAZlzdSHhu+4LUT+VhhLnXHtNhgORZ/EtvcjV1KdTV9GVhm8CSz9mTIk1bDmOd4cO+YyPMxbxjAjwdOOrfjC8/F8d3boU1aAY81n6tJnpiOrqfbFKhITUV4lR/TIo2XO0kZzc8gvfNGDz8Qg1+geSR27Trokwon0mwMrrVzvFPi11AbutYH1yrp6Gw02eA5Qz2AE3hokWVIZm8ic7hc2p7hHT8/Nt6J4ryfA47OCuN/GhW07OuYfIHMIuQRTcYGorI4N/PR+KRsArRiQ6qkFu7fKhJOCJwu83DpkA/Vp+cRRMci1iP4c4/4/7Gv+xdNrh73tkl65+eKLYUaYIjudsfuWkzdZ4gEqNsJd5ma/24gbfoutjbNjzQ+ZSiAp2998aPHeud7p1Uimtt7Z1nDdcY4addqmvgjx/sPw6xZlcZ6GKa+M3EKD+aE49XVzt05fNAAwCHIrrqxiMzrZN+nPsS3V9q+ngUow5fclN9u8MxJ+iThaXE+7z1Cv+wBK/0WgZZ+wSQI92WKsuoSufyyM1lz7HrM4Dgk+fRoaJ0+nfdAbPmfYhggc6Wamn5LSBXpHRYFVdbf2l73uzlt7ezZr4oAlA3cJ8/olSZFx58ZQJB5RQQz8UYfUYbgOeAF9q+B+hnaq4osZzkrJxPODyzTRBQZiHNVs8Oy9tmEFHAoRb00qOldJ3jd841xOEtrsLUvMAKYUisGZczVkZ1x3aZ9sr/Lge9L4/M0CZnv5newO7Yj+DHqRgdiG8hiEPll6gXtzE274dJVCVF2h4daBFPFKfMI0Rps3z++OCl/Zh2Ss68DDyLMhJXxDt7Tiwxrk7RylezDM+kU0wBoX9vDpntqP45xckXLw/Q6AY0ejQsOvH3UxpdJD0zi9CA9G03GJTNTvgMr9gciVxJRwMmHspXqUNgA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEYPR02MB6014.apcprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(52116014)(376014)(1800799024)(38350700014); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: w8ydHIv4B/QT6tF1/vmjw5vuHfXvaz0CLn32nPA229MklQED5gPem4NEICPaPTzL3YJ2ZCiti2OdlD5XQMEz3R+IUTwU2d7r2EP/zyMn21wX0eOwT08OJIWQ3mRwgyYxxxxrjPeBd+24S0ex+Y1oa2nAo6qw+UfUW6FHFb7I2jhaAiaYkf0Ru7S4ZKkh0hP9kDPCj0S1Cwr7Xg4RJbReICLqogjEuPumc4kYDwf+BoCcrsYJ3rThYSGs5s4jyzYrEUDzFJCX/SzQfSTxzJyZmVcOHBJ7V7nyQFPFV97j6LvfsgqdVge8jYc9dsJe/IZmCPI2+LABL7IFP1+lqmTbkm6XFG5WhIsc+DECpqHwKtpxGlp7+jpztV2ZtB1WeZCnxKetTYlWhS+hQFUHk9ScPJ0PY0yNj9blhYQyEynvvjijfhlcOnzfH01W7fBSgLGv1leVMUCLkr60q/AloX2rRQEdJuEiPBiP1WrpIYVOo8lRSB/8jOSifvM/W9yPD9RwtTbKtR9kwryiZz/0xyqei/9qxZu/P6+oIi+ssYEzuLj2Jj20/o09VAb/uueihdNLzyW+SsWFiXtdVNtB9e4TUsHURpO8o9ReZ9A6IfQbhyWGXLfoc7lMuOoJrPVmqA5njBMYv+P/252FOgOo08O19Lsqaflo5xIgb1DYbQ2dREHBrJPPJuUQlNcVYrEgnsPMZVSHUyGSjJ/1AX2vBuRcISFVh6DMM+15eQV0mJk9awR8lzA2wGHwHY+8AMmV+scaGqX2iQcfk0uTrhfBfmEqv9AWD8873VkQku/r24HErZQbjHpNsGbp2SSYSNCboHKl8Ms5KWdjtbDMo2yGjZ9MzUKhUUhsr58gSRp907b02HZ4CY++lTLvpA5y2SGwM0GNDrOzxyQ7v9V54PwyF+auMqEOcWdmpO4JJRIOEgxwPzTh7W3yPNRn3qukK+Y20oQ7modJRgwCf1fekm5JqnDqXEwG0TlqDn2imafQBtyV088HXOa1n4vdMA4V2rLh64K3lK77NOZhMLzBKSgAVq2JUJP0VAuS98tnTzccc468KIXPFJtVF3YlcjHnGIXfcsYvXFRU8/a3A4KkGk+rc/C3SVIWyKmErTdVlfAUzJHeabK6sVj3oZupWCtVm/TEhuw2O1/KkkijM66atxQ2p8QieyV9oGrk6qyipNO5PnnwoFkqNh2hr/yjCy+sT1su6rocByt6j4uXMhZ7OP100oYFgMT1L8tZK2HRNSEnKrmqGI/Z6glx1hcML1OZXtaJkiKyL9NMbYn7Mo/J7TEgXNxYE5vr4D1g42Z07kHL13yISFDepihJHl3EhpTJ2DC8zhcZLN45+/5J+fRNmLFthTS/PRxQXHF8CNlSskzkXu946GSIs5ftXRt+ZKECzIy2JabfSr5fmocraSvYPKZ45VEG8VjelRWbOIcN9pmm5iSs6RKCTg0237aTPa1o+cXg+PWnTy5EaIZ/uRJ1vhY9OZGQ+wUvu35FlPJSm4e9D8WQ6WIKvEczh4UY9vovfgBe1qPUMF03xSdii477J1bb4tR/Nri9OXLL8YDJGLHiYIIq3b6UrnLZDu7Z0KVaIEhKodas X-OriginatorOrg: oppo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 169f732c-d6e1-4e76-9d34-08dc97122726 X-MS-Exchange-CrossTenant-AuthSource: SEYPR02MB6014.apcprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2024 01:32:20.3761 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f1905eb1-c353-41c5-9516-62b4a54b5ee6 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: xhxTwxukots7XJggCTi3s70yeFHUxQJ3JdXoCjSNfTD+hHrSHo/LvAlFosZxS2urrrwkOlx8bLQk6/cILX+B7g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR02MB6576 X-Headers-End: 1sN0TZ-0006JV-6u Subject: [f2fs-dev] [RFC PATCH v2 03/10] inject.f2fs: add sb injection X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Sheng Yong via Linux-f2fs-devel From: Sheng Yong Reply-To: Sheng Yong Cc: linux-f2fs-devel@lists.sourceforge.net Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net This patch enables injecting super block. The meanings of options are: * sb: means sb is injected, its argument chooses which sb pack to be injected, where 0 means the current valid sb is choosen automatically. * mb: indicates which member in sb is injected, its argument is the member name. * idx: is used when the mb is an array, its argument is the index of the array. * val: is the new value to be set when the type of mb is a number. * str: is the new value to be set when the type of mb is a string. The members could be injected in sb contains: * magic: magic number * s_stop_reason: s_stop_reason array * s_errors: s_errors array * devs.path: path in devs array Signed-off-by: Sheng Yong --- fsck/inject.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++++- fsck/inject.h | 5 ++ fsck/main.c | 5 +- 3 files changed, 142 insertions(+), 2 deletions(-) diff --git a/fsck/inject.c b/fsck/inject.c index f6fd346..21dae42 100644 --- a/fsck/inject.c +++ b/fsck/inject.c @@ -18,17 +18,42 @@ void inject_usage(void) MSG(0, "[options]:\n"); MSG(0, " -d debug level [default:0]\n"); MSG(0, " -V print the version number and exit\n"); + MSG(0, " --mb which member is injected in a struct\n"); + MSG(0, " --val new value to set\n"); + MSG(0, " --str new string to set\n"); + MSG(0, " --idx which slot is injected in an array\n"); + MSG(0, " --sb <0|1|2> --mb [--idx ] --val/str inject superblock\n"); MSG(0, " --dry-run do not really inject\n"); exit(1); } +static void inject_sb_usage(void) +{ + MSG(0, "inject.f2fs --sb <0|1|2> --mb [--idx ] --val/str \n"); + MSG(0, "[sb]:\n"); + MSG(0, " 0: auto select the first super block\n"); + MSG(0, " 1: select the first super block\n"); + MSG(0, " 2: select the second super block\n"); + MSG(0, "[mb]:\n"); + MSG(0, " magic: inject magic number\n"); + MSG(0, " s_stop_reason: inject s_stop_reason array selected by --idx \n"); + MSG(0, " s_errors: inject s_errors array selected by --idx \n"); + MSG(0, " devs.path: inject path in devs array selected by --idx specified by --str \n"); +} + int inject_parse_options(int argc, char *argv[], struct inject_option *opt) { int o = 0; - const char *option_string = "d:V"; + const char *pack[] = {"auto", "1", "2"}; + const char *option_string = "d:Vh"; struct option long_opt[] = { {"dry-run", no_argument, 0, 1}, + {"mb", required_argument, 0, 2}, + {"idx", required_argument, 0, 3}, + {"val", required_argument, 0, 4}, + {"str", required_argument, 0, 5}, + {"sb", required_argument, 0, 6}, {0, 0, 0, 0} }; @@ -39,6 +64,33 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) c.dry_run = 1; MSG(0, "Info: Dry run\n"); break; + case 2: + opt->mb = optarg; + MSG(0, "Info: inject member %s\n", optarg); + break; + case 3: + opt->idx = atoi(optarg); + MSG(0, "Info: inject slot index %d\n", opt->idx); + break; + case 4: + opt->val = strtoll(optarg, NULL, 0); + if (opt->val == ULLONG_MAX || opt->val == LLONG_MIN) + return -ERANGE; + MSG(0, "Info: inject value %lld : 0x%llx\n", opt->val, + (unsigned long long)opt->val); + break; + case 5: + opt->str = strdup(optarg); + if (!opt->str) + return -ENOMEM; + MSG(0, "Info: inject string %s\n", opt->str); + break; + case 6: + opt->sb = atoi(optarg); + if (opt->sb < 0 || opt->sb > 2) + return -ERANGE; + MSG(0, "Info: inject sb %s\n", pack[opt->sb]); + break; case 'd': if (optarg[0] == '-' || !is_digits(optarg)) return EWRONG_OPT; @@ -48,7 +100,12 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) case 'V': show_version("inject.f2fs"); exit(0); + case 'h': default: + if (opt->sb >= 0) { + inject_sb_usage(); + exit(0); + } return EUNKNOWN_OPT; } } @@ -56,9 +113,84 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) return 0; } +static int inject_sb(struct f2fs_sb_info *sbi, struct inject_option *opt) +{ + struct f2fs_super_block *sb; + char *buf; + int ret; + + buf = calloc(1, F2FS_BLKSIZE); + ASSERT(buf != NULL); + + if (opt->sb == 0) + opt->sb = 1; + + ret = dev_read_block(buf, opt->sb == 1 ? SB0_ADDR : SB1_ADDR); + ASSERT(ret >= 0); + + sb = (struct f2fs_super_block *)(buf + F2FS_SUPER_OFFSET); + + if (!strcmp(opt->mb, "magic")) { + MSG(0, "Info: inject magic of sb %d: 0x%x -> 0x%x\n", + opt->sb, get_sb(magic), (u32)opt->val); + set_sb(magic, (u32)opt->val); + } else if (!strcmp(opt->mb, "s_stop_reason")) { + if (opt->idx >= MAX_STOP_REASON) { + ERR_MSG("invalid index %u of sb->s_stop_reason[]\n", + opt->idx); + ret = -EINVAL; + goto out; + } + MSG(0, "Info: inject s_stop_reason[%d] of sb %d: %d -> %d\n", + opt->idx, opt->sb, sb->s_stop_reason[opt->idx], + (u8)opt->val); + sb->s_stop_reason[opt->idx] = (u8)opt->val; + } else if (!strcmp(opt->mb, "s_errors")) { + if (opt->idx >= MAX_F2FS_ERRORS) { + ERR_MSG("invalid index %u of sb->s_errors[]\n", + opt->idx); + ret = -EINVAL; + goto out; + } + MSG(0, "Info: inject s_errors[%d] of sb %d: %x -> %x\n", + opt->idx, opt->sb, sb->s_errors[opt->idx], (u8)opt->val); + sb->s_errors[opt->idx] = (u8)opt->val; + } else if (!strcmp(opt->mb, "devs.path")) { + if (opt->idx >= MAX_DEVICES) { + ERR_MSG("invalid index %u of sb->devs[]\n", opt->idx); + ret = -EINVAL; + goto out; + } + if (strlen(opt->str) >= MAX_PATH_LEN) { + ERR_MSG("invalid length of option str\n"); + ret = -EINVAL; + goto out; + } + MSG(0, "Info: inject devs[%d].path of sb %d: %s -> %s\n", + opt->idx, opt->sb, (char *)sb->devs[opt->idx].path, opt->str); + strcpy((char *)sb->devs[opt->idx].path, opt->str); + } else { + ERR_MSG("unknown or unsupported member \"%s\"\n", opt->mb); + return -EINVAL; + goto out; + } + + print_raw_sb_info(sb); + update_superblock(sb, SB_MASK((u32)opt->sb - 1)); + +out: + free(buf); + free(opt->str); + return ret; +} + int do_inject(struct f2fs_sb_info *sbi) { + struct inject_option *opt = (struct inject_option *)c.private; int ret = -EINVAL; + if (opt->sb >= 0) + ret = inject_sb(sbi, opt); + return ret; } diff --git a/fsck/inject.h b/fsck/inject.h index 62543c1..c7d0e33 100644 --- a/fsck/inject.h +++ b/fsck/inject.h @@ -20,6 +20,11 @@ #include "fsck.h" struct inject_option { + const char *mb; /* member name */ + unsigned int idx; /* slot index */ + long long val; /* new value */ + char *str; /* new string */ + int sb; /* which sb */ }; void inject_usage(void); diff --git a/fsck/main.c b/fsck/main.c index f093ca7..d6a7a47 100644 --- a/fsck/main.c +++ b/fsck/main.c @@ -817,7 +817,10 @@ void f2fs_parse_options(int argc, char *argv[]) #endif /* WITH_LABEL */ } else if (!strcmp("inject.f2fs", prog)) { #ifdef WITH_INJECT - static struct inject_option inject_opt; + static struct inject_option inject_opt = { + .sb = -1, + .idx = -1, + }; err = inject_parse_options(argc, argv, &inject_opt); if (err < 0) { From patchwork Fri Jun 28 01:31:34 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sheng Yong X-Patchwork-Id: 13715364 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 lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 73AB7C30653 for ; Fri, 28 Jun 2024 01:32:36 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-1.v29.lw.sourceforge.com) by sfs-ml-1.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1sN0Ta-0005Tw-Rk; Fri, 28 Jun 2024 01:32:36 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-1.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sN0TZ-0005To-7s for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:34 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=MIME-Version:Content-Type:Content-Transfer-Encoding :References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=oqJX3NrNKFWpw1fBmrcsQ5XW4msSjsLo8XILqVQ2G94=; b=PJLwIZb7vUf6xgqFCCo+p44k2d PIyfDC+DWIZMYe3i4OFYNntYT4cTIfBhNzhY1+NYIczF/pqX9RuTGg2aNawSW7yoXqYgfur3XO56v uF5Oe2FBtwEFHfnfGIez68HLXIQuhjn+zKklAfwUqoOsMu2OiSV0JbFCLUKwQRw3qAkU=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=MIME-Version:Content-Type:Content-Transfer-Encoding:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=oqJX3NrNKFWpw1fBmrcsQ5XW4msSjsLo8XILqVQ2G94=; b=D4TUFoYi5pCTigTjfCuH+dG5g3 Bcj+x6AUokp7Ph9N2SUXsRTPoeDoHMr4HM+PnCv12e6PU5AtsC1qdmzW5/UwPWocfmrjlzR6UM44+ I6OPH9L2DD9ylISz9zeVqTcKwToJrih9dHIigcb1zXhpf04yDoXrjtNwBLinN0nTYB/o=; Received: from mail-tyzapc01on2044.outbound.protection.outlook.com ([40.107.117.44] helo=APC01-TYZ-obe.outbound.protection.outlook.com) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sN0Ta-0006JV-81 for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:34 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cfbUI2AJQjJBG8KXFxhyeVpYIWA4LZ9v64CgzmNLidXgbkHCIi3KEyjlXqNMF1tnVojlkq/QNPmejNRlDTOaeh60yNG9BzMuG9+s9HQdrujwuYLaFiC9dK0s6CkAFhC7qKGoU498XndpWInFPd2mxuEMEL9A4Dsh8l4UhGdwYlZNuklSrWoog358/ny1uctxEpC9p8X4oNQiC4+Ff31CzpTaEm9CZMDTrla6N7YI5J41NJGPMjmEZTD4ze/AIYDB0Fs4Xx0aDrDGKA8tKAMVUOMeK4/SsEwoIONygDkJQVGQXZwK8y/VZKjxby8dgL8ZRV2TD4ZMUOl4JG5lkMrORg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=oqJX3NrNKFWpw1fBmrcsQ5XW4msSjsLo8XILqVQ2G94=; b=KGi3XSYUrq1zhHjvv8FXDMr+QF5PcIYRKnP8Kmwv0g9jKKiwO+N4KxLdhCg9cpl74eUKthN3+otF1qg+VrxsfHPdg5qBqRQ6ObmrVh1DuNg9z/cZzuxbmCMBCg0MKmWF1YLJKoZWmElAvwTl4EFwI/q469Gkh2NylFdAzGxWLGcBI5pjvVXzLmOurY1Z+pKmzJLIfQ2BeDyRRZ522dO4G0f3l5f+bcG9y7c3vBqDFc9KOPCGuwGP41O+ic7EcQ4XUjxZnyhHBNnRR71g3+Wg28TLaxjFtMzc3Q05SzC2WsnDqxDYG5evqqmSGiAqDsPNzYAYZLmv36/wJNRJmxH7hw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oppo.com; dmarc=pass action=none header.from=oppo.com; dkim=pass header.d=oppo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oppo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=oqJX3NrNKFWpw1fBmrcsQ5XW4msSjsLo8XILqVQ2G94=; b=PjXJUbgWTItKJP6HIFfW0t2Uu9oAAmquMRFQzI5m56MIZhKLq/xliCQHyvnele0gknVuDQDE2AFH3qO5csRP5QdzzqnDRDq1ex30PKge8pKBsF9rd/4NjtVx2ONEyzBwfHe5x6IQTw1gDBqkrH/xleHXUKI9Jh38h8jj9MwAo84= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oppo.com; Received: from SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) by TYZPR02MB6576.apcprd02.prod.outlook.com (2603:1096:400:41a::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.35; Fri, 28 Jun 2024 01:32:21 +0000 Received: from SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796]) by SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796%7]) with mapi id 15.20.7698.025; Fri, 28 Jun 2024 01:32:21 +0000 To: chao@kernel.org, jaegeuk@kernel.org Date: Fri, 28 Jun 2024 09:31:34 +0800 Message-Id: <20240628013140.2444209-5-shengyong@oppo.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240628013140.2444209-1-shengyong@oppo.com> References: <20240628013140.2444209-1-shengyong@oppo.com> X-ClientProxiedBy: SI2PR01CA0047.apcprd01.prod.exchangelabs.com (2603:1096:4:193::10) To SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SEYPR02MB6014:EE_|TYZPR02MB6576:EE_ X-MS-Office365-Filtering-Correlation-Id: 1651d81c-773f-4a83-2d7e-08dc971227fa X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: udGs/gQwCheLuuMwqvnB5XYH9BddgGdzdzIAH5Z+hTZW5RRVBJOHgv6Tr84uvQw3etaYS+3Jwvj36XrQd0QA+FUFjvEO0kWy9nEcXuFIGXQfbTf/VikeAdb03ab32l4k6TpHCpmrEfd6HafBIAFaes4uj1coYAtZOO9C7YbLSlujeZQooEeR10rrF1lAoOamukikvDEZ2shn+ODILs0GOTP3vbdeFbaqyxU5MSs7jN015NpHFzo3G+8m+v21ol81NrsKBEx6gFFGSHgE7YPGvvnjmVy2P3yBcTc6Qnc67y+mxQcG1U6tILFSYud2nb9IjfJq4exp5kEotJMu3EuOWKMiEmi2ZuJk97tRv9b/MeshHlh+Isbo9LT2gye3aRNpLmKfPtJKsoWBD3cGBK73hV4rh1XpTOrHp0nLj94bi5Bl5WrvmgMrxnXHHOiDelJS6DJ72rxMhjbleYSrO/V3IM7brXHd1Gc45prItf8lLKTpGojGntFTzyadGcoO0nNUsMN4HyKBcU21TbVQqG9/FovioZefE97qPckgV2AI4iagJN/v3sXAuhGn1gzT8eKPCz/c0yCUs8RZDqaPClgFwQ/ZlY4uGGjy1EmfH7YEEyeXkFfrRcs/753mMx+4F7oZ36QeVY8enMxBOyBVsTsG7mi35+56csZoiYz/BN36C/5XhEbJP3fUt44+hapQNwQ3o/wyD3oCG9m0UhMAxwI795xSOKoEgC5cWTMlc0HBE8NBjiafl8pSBXxqd6/YL8q0oa3GRwz7Z4TgrWA+Nn/dS7FprgRZlq/t6kBrN8Jrdu3a632VmgixMIsrqudNiwh71WKx34oQx2e/B9Hx4QrcmvMRRb6i0Kd8ImECP+D+p7xRnMT7UIOTMrtkXA3eb7U/lvfpz67803d08F5HhU535J8zBlb6z/DIyYTSFrrAK0Hi7iuVKmUn0pms2SM2Lb6HpgoHDdCelYya0NOSLc2FqfVmipNv07B2aez4EOWlYYyMLHU6vDlKaeB53LhHX2KjAtWGQbSeLG9oUYKzLDdteCkTstgf+TwU8ES4O0oidDxJbvKRy/pxvFa5m6KklfTJk5xuvODiy335iZ6RkEuojSUFVzO5yw8qQ9XCLM5LoKHkYFCgtVOXENS9+1kiGwJnkBuXnGWUslmdQW8HQCHDif8PgrA0SYgHRoa3CaeEqE0MoMzsbv/hr55dHZwfM+HFUS+z9El5y52TFimSN1CFwC0C3IXjR66Nh7A37jkt43373PEt8B0q0EXv8aQCb1ClO7tDXke6eqcyWHJY/XlJpfO2v+YngJ2FsoDH/Oq9CJIwhzay85qmVt5cSajRiZrpxmHAYtIjP/CZGSOL+1/KH+z8AsGSI9Uz0+W2YIfTDugEIOGAlJnVdIcMVTcALGczfekGGjtTEHch2A6ro7zM+w== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEYPR02MB6014.apcprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(52116014)(376014)(1800799024)(38350700014); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: EnL6iAoFTy4C6T0KfIoRbGRsp7eiFjBDRV7gMSLdW3vDTLJvgNQb/dJKSJXZt5JmHzQfKgwKIM4Ro9TOiiyjU3IWpbJs3ux1Y4asIktIiKO6KKFIFeQKIDMUl5kdC4rPi2p+p2a+rRqK4Pp8/F84Sn1g2QN8Gjr6b9/IXSFoa78nYZ7ae2cJZXTdMGKpNwhPbTkQ/IiHAEVla1N/41ukvsnJdCQXNf2Ux6WpFtl8ZbIxvNFQ8htjeQ11kW0wJQHwL3Q7E7Qt3qk9tLOoZz1D+Xjux7qbIMFQ+/ibE4BmUqLs/nMgA8aLUCAt29i/ZwLauMW3SF/m2VdV6YbrQAX/4TGxB6Sc6F6m7wrsPpVAnnyRalle96K7H5DOTNnQsqVk8FV/0iqR2lUvdYd8l+ELJ0vcIupTSU6TqkqMu1VHptsYNFQaJODIqNQMY/PFJKoCVLIgyeEhghxKPwkX3aJ0MkSyWpJx+jg1UHMyzmodYNXTpnDOsDdvNcTKxgdiMo3Iat4TByB1k/Tf/BtzZUOIq1n95Rhg0oJ5MjEnyj79AO4H2euZ2VBjun6eGaHbQQ0jsiZRxPSeXfWgGNiLr5ZYapMbkQt9lSkBC9UBf38pVr1/pNPs3hchchxg3DMVl9w1W1zs4YUSdgU7kd9eA1IZLfViGnDENEj4rbTwkj+x9q9BxJCgc5Y1xvEZTPg8MH9goA6u5j44GCcZelcMGr6VrgU/Mzm+NwPUNuZmPZKsy/6BNwVqWYG5GQX5EyP6r0B96MnGMYwbyWziO/LYvVVOfllfV7a6Kr5Gc3y58JgODfm4lsMVc2ZJY4r0W+Bae6+EmBBNk8WxfjuqLBHhLpAaOKZ4GosU7Ze1jx1ucgy8hfvd1Tj/nHa+k8jgnu7qTsr0eKI2ElSV/0UV4uXjMHuqmoxvVgVFNtzWrfcciFs9pZGIHEUv6TtrvKp2cj2FX0zhH/wcXeQNTsgm1s+aXhpl0f3Bp2x6t0YBp5Y2YtuzWWHhz4gUcyYgU08qLRpCK5BfaecIA5HzjkrsUXtrmcYPgm6HnWsku4xmDAsVgLqauqlgGaF73VVSxnNNeBAneY9gS4YfTGVw0cUrEpLqt5ygPXY/M4hD8/ZIazdjuw7ts7/wQ5WaznOUGv3ZxVqW3Kthz9EAZj2Bb7uN/YccebBvPpFAfpRWoRZJp+Y3JT9GpKOFFTeh8pm4jak373Zx+5E/S9F6/Q8ZmAMGRU+hBVZhi8q6gJrwhB8RZoHsSd9P084VwYVsakaeJ9nH45nprLpEH+uZcfzsyrlIUbe30cwy5MHY+eBLY6FFnstGskZUfZUGslXYOoLWEz7SYCpa/vZzFE3G2aQWO4yh67XaYZdwW7POU77Un5T8hmKQxOkGTFpqG4HPfsYKzeJcTE16VwUtppl1ovmJ4YFCVEQdQiXPDHZ/r3eXpl0qRg6Q/u+mtluh1k4I+7m4RtM+fR9siP0f5djUumoHNV9aRqKBx+it6J4XEPMWMLzxWR7BBHD0l1ujOLICZRU9ic7+SBybiguus4XZEMCGQ6tP0NqJAzYxnieJGUzE8es04MA0TMyxk6L54wiwmeGKJpawwpzbj2iS X-OriginatorOrg: oppo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1651d81c-773f-4a83-2d7e-08dc971227fa X-MS-Exchange-CrossTenant-AuthSource: SEYPR02MB6014.apcprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2024 01:32:21.8478 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f1905eb1-c353-41c5-9516-62b4a54b5ee6 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: EIXh4Q78cl1bOibyfiVH1/ja5+qFSggEGeJ+++0ZF1dbq90pVORb5FubFyN/KxY9f++BF31hKw4Dr8x8rtLIXw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR02MB6576 X-Headers-End: 1sN0Ta-0006JV-81 Subject: [f2fs-dev] [RFC PATCH v2 04/10] inject.f2fs: add cp injection X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Sheng Yong via Linux-f2fs-devel From: Sheng Yong Reply-To: Sheng Yong Cc: linux-f2fs-devel@lists.sourceforge.net Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net This patch enables injecting checkpoint. To archive this, a helper write_raw_cp_blocks() is added to write the first and last blocks of a specific cp. And print_ckpt_info() is exported to show new checkpoint info. The meanings of options are: * cp: means cp is injected, its argument chooses which cp pack to be injected, where 0 means the current valid cp is choosen automatically. The members could be injected in cp contains: * checkpoint_ver: checkpoint version * ckpt_flags: checkpoint flags * cur_node_segno: cur_node_segno array * cur_node_blkoff: cur_node_blkoff array * cur_data_segno: cur_data_segno array * cur_data_blkoff: cur_data_blkoff array Signed-off-by: Sheng Yong Reviewed-by: Chao Yu --- fsck/fsck.h | 3 ++ fsck/inject.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++ fsck/inject.h | 1 + fsck/main.c | 1 + fsck/mount.c | 26 +++++++++++ 5 files changed, 156 insertions(+) diff --git a/fsck/fsck.h b/fsck/fsck.h index 4ca75b3..02986ef 100644 --- a/fsck/fsck.h +++ b/fsck/fsck.h @@ -236,12 +236,15 @@ extern int find_next_free_block(struct f2fs_sb_info *, u64 *, int, int, bool); extern void duplicate_checkpoint(struct f2fs_sb_info *); extern void write_checkpoint(struct f2fs_sb_info *); extern void write_checkpoints(struct f2fs_sb_info *); +extern void write_raw_cp_blocks(struct f2fs_sb_info *sbi, + struct f2fs_checkpoint *cp, int which); extern void update_superblock(struct f2fs_super_block *, int); extern void update_data_blkaddr(struct f2fs_sb_info *, nid_t, u16, block_t, struct f2fs_node *); extern void update_nat_blkaddr(struct f2fs_sb_info *, nid_t, nid_t, block_t); extern void print_raw_sb_info(struct f2fs_super_block *); +extern void print_ckpt_info(struct f2fs_sb_info *); extern bool is_checkpoint_stop(struct f2fs_super_block *, bool); extern bool is_inconsistent_error(struct f2fs_super_block *); extern pgoff_t current_nat_addr(struct f2fs_sb_info *, nid_t, int *); diff --git a/fsck/inject.c b/fsck/inject.c index 21dae42..6899dbe 100644 --- a/fsck/inject.c +++ b/fsck/inject.c @@ -23,6 +23,7 @@ void inject_usage(void) MSG(0, " --str new string to set\n"); MSG(0, " --idx which slot is injected in an array\n"); MSG(0, " --sb <0|1|2> --mb [--idx ] --val/str inject superblock\n"); + MSG(0, " --cp <0|1|2> --mb [--idx ] --val inject checkpoint\n"); MSG(0, " --dry-run do not really inject\n"); exit(1); @@ -42,6 +43,22 @@ static void inject_sb_usage(void) MSG(0, " devs.path: inject path in devs array selected by --idx specified by --str \n"); } +static void inject_cp_usage(void) +{ + MSG(0, "inject.f2fs --cp <0|1|2> --mb [--idx ] --val inject checkpoint\n"); + MSG(0, "[cp]:\n"); + MSG(0, " 0: auto select the current cp pack\n"); + MSG(0, " 1: select the first cp pack\n"); + MSG(0, " 2: select the second cp pack\n"); + MSG(0, "[mb]:\n"); + MSG(0, " checkpoint_ver: inject checkpoint_ver\n"); + MSG(0, " ckpt_flags: inject ckpt_flags\n"); + MSG(0, " cur_node_segno: inject cur_node_segno array selected by --idx \n"); + MSG(0, " cur_node_blkoff: inject cur_node_blkoff array selected by --idx \n"); + MSG(0, " cur_data_segno: inject cur_data_segno array selected by --idx \n"); + MSG(0, " cur_data_blkoff: inject cur_data_blkoff array selected by --idx \n"); +} + int inject_parse_options(int argc, char *argv[], struct inject_option *opt) { int o = 0; @@ -54,6 +71,7 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) {"val", required_argument, 0, 4}, {"str", required_argument, 0, 5}, {"sb", required_argument, 0, 6}, + {"cp", required_argument, 0, 7}, {0, 0, 0, 0} }; @@ -91,6 +109,12 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) return -ERANGE; MSG(0, "Info: inject sb %s\n", pack[opt->sb]); break; + case 7: + opt->cp = atoi(optarg); + if (opt->cp < 0 || opt->cp > 2) + return -ERANGE; + MSG(0, "Info: inject cp pack %s\n", pack[opt->cp]); + break; case 'd': if (optarg[0] == '-' || !is_digits(optarg)) return EWRONG_OPT; @@ -105,6 +129,9 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) if (opt->sb >= 0) { inject_sb_usage(); exit(0); + } else if (opt->cp >= 0) { + inject_cp_usage(); + exit(0); } return EUNKNOWN_OPT; } @@ -184,6 +211,102 @@ out: return ret; } +static int inject_cp(struct f2fs_sb_info *sbi, struct inject_option *opt) +{ + struct f2fs_checkpoint *cp, *cur_cp = F2FS_CKPT(sbi); + char *buf = NULL; + int ret = 0; + + if (opt->cp == 0) + opt->cp = sbi->cur_cp; + + if (opt->cp != sbi->cur_cp) { + struct f2fs_super_block *sb = sbi->raw_super; + block_t cp_addr; + + buf = calloc(1, F2FS_BLKSIZE); + ASSERT(buf != NULL); + + cp_addr = get_sb(cp_blkaddr); + if (opt->cp == 2) + cp_addr += 1 << get_sb(log_blocks_per_seg); + ret = dev_read_block(buf, cp_addr); + ASSERT(ret >= 0); + + cp = (struct f2fs_checkpoint *)buf; + sbi->ckpt = cp; + sbi->cur_cp = opt->cp; + } else { + cp = cur_cp; + } + + if (!strcmp(opt->mb, "checkpoint_ver")) { + MSG(0, "Info: inject checkpoint_ver of cp %d: 0x%llx -> 0x%lx\n", + opt->cp, get_cp(checkpoint_ver), (u64)opt->val); + set_cp(checkpoint_ver, (u64)opt->val); + } else if (!strcmp(opt->mb, "ckpt_flags")) { + MSG(0, "Info: inject ckpt_flags of cp %d: 0x%x -> 0x%x\n", + opt->cp, get_cp(ckpt_flags), (u32)opt->val); + set_cp(ckpt_flags, (u32)opt->val); + } else if (!strcmp(opt->mb, "cur_node_segno")) { + if (opt->idx >= MAX_ACTIVE_NODE_LOGS) { + ERR_MSG("invalid index %u of sb->cur_node_segno[]\n", + opt->idx); + ret = -EINVAL; + goto out; + } + MSG(0, "Info: inject cur_node_segno[%d] of cp %d: 0x%x -> 0x%x\n", + opt->idx, opt->cp, get_cp(cur_node_segno[opt->idx]), + (u32)opt->val); + set_cp(cur_node_segno[opt->idx], (u32)opt->val); + } else if (!strcmp(opt->mb, "cur_node_blkoff")) { + if (opt->idx >= MAX_ACTIVE_NODE_LOGS) { + ERR_MSG("invalid index %u of sb->cur_node_blkoff[]\n", + opt->idx); + ret = -EINVAL; + goto out; + } + MSG(0, "Info: inject cur_node_blkoff[%d] of cp %d: 0x%x -> 0x%x\n", + opt->idx, opt->cp, get_cp(cur_node_blkoff[opt->idx]), + (u16)opt->val); + set_cp(cur_node_blkoff[opt->idx], (u16)opt->val); + } else if (!strcmp(opt->mb, "cur_data_segno")) { + if (opt->idx >= MAX_ACTIVE_DATA_LOGS) { + ERR_MSG("invalid index %u of sb->cur_data_segno[]\n", + opt->idx); + ret = -EINVAL; + goto out; + } + MSG(0, "Info: inject cur_data_segno[%d] of cp %d: 0x%x -> 0x%x\n", + opt->idx, opt->cp, get_cp(cur_data_segno[opt->idx]), + (u32)opt->val); + set_cp(cur_data_segno[opt->idx], (u32)opt->val); + } else if (!strcmp(opt->mb, "cur_data_blkoff")) { + if (opt->idx >= MAX_ACTIVE_DATA_LOGS) { + ERR_MSG("invalid index %u of sb->cur_data_blkoff[]\n", + opt->idx); + ret = -EINVAL; + goto out; + } + MSG(0, "Info: inject cur_data_blkoff[%d] of cp %d: 0x%x -> 0x%x\n", + opt->idx, opt->cp, get_cp(cur_data_blkoff[opt->idx]), + (u16)opt->val); + set_cp(cur_data_blkoff[opt->idx], (u16)opt->val); + } else { + ERR_MSG("unknown or unsupported member \"%s\"\n", opt->mb); + ret = -EINVAL; + goto out; + } + + print_ckpt_info(sbi); + write_raw_cp_blocks(sbi, cp, opt->cp); + +out: + free(buf); + sbi->ckpt = cur_cp; + return ret; +} + int do_inject(struct f2fs_sb_info *sbi) { struct inject_option *opt = (struct inject_option *)c.private; @@ -191,6 +314,8 @@ int do_inject(struct f2fs_sb_info *sbi) if (opt->sb >= 0) ret = inject_sb(sbi, opt); + else if (opt->cp >= 0) + ret = inject_cp(sbi, opt); return ret; } diff --git a/fsck/inject.h b/fsck/inject.h index c7d0e33..907309f 100644 --- a/fsck/inject.h +++ b/fsck/inject.h @@ -25,6 +25,7 @@ struct inject_option { long long val; /* new value */ char *str; /* new string */ int sb; /* which sb */ + int cp; /* which cp */ }; void inject_usage(void); diff --git a/fsck/main.c b/fsck/main.c index d6a7a47..0318873 100644 --- a/fsck/main.c +++ b/fsck/main.c @@ -819,6 +819,7 @@ void f2fs_parse_options(int argc, char *argv[]) #ifdef WITH_INJECT static struct inject_option inject_opt = { .sb = -1, + .cp = -1, .idx = -1, }; diff --git a/fsck/mount.c b/fsck/mount.c index 8524335..ae2a330 100644 --- a/fsck/mount.c +++ b/fsck/mount.c @@ -3426,6 +3426,32 @@ void write_checkpoints(struct f2fs_sb_info *sbi) write_checkpoint(sbi); } +void write_raw_cp_blocks(struct f2fs_sb_info *sbi, + struct f2fs_checkpoint *cp, int which) +{ + struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi); + uint32_t crc; + block_t cp_blkaddr; + int ret; + + crc = f2fs_checkpoint_chksum(cp); + *((__le32 *)((unsigned char *)cp + get_cp(checksum_offset))) = + cpu_to_le32(crc); + + cp_blkaddr = get_sb(cp_blkaddr); + if (which == 2) + cp_blkaddr += 1 << get_sb(log_blocks_per_seg); + + /* write the first cp block in this CP pack */ + ret = dev_write_block(cp, cp_blkaddr); + ASSERT(ret >= 0); + + /* write the second cp block in this CP pack */ + cp_blkaddr += get_cp(cp_pack_total_block_count) - 1; + ret = dev_write_block(cp, cp_blkaddr); + ASSERT(ret >= 0); +} + void build_nat_area_bitmap(struct f2fs_sb_info *sbi) { struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); From patchwork Fri Jun 28 01:31:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sheng Yong X-Patchwork-Id: 13715365 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 lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E8644C2BD09 for ; Fri, 28 Jun 2024 01:32:39 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-2.v29.lw.sourceforge.com) by sfs-ml-2.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1sN0Tf-0001VN-9a; Fri, 28 Jun 2024 01:32:39 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-2.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sN0Tb-0001Uh-8S for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:35 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=MIME-Version:Content-Type:Content-Transfer-Encoding :References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=39VvJiZQH1/isjvty8mQlcUebSJMEXB1K9KicFC8mJg=; b=MSlP1DQQYBa2KS6zJnjgK6UTr2 zRfHaKR/s9ft2GPtknE6kqqUKfk1I0jYVcdfyZmHY29tPDUOrIZenjsaw6ce24jQaSpD+XWYin0E6 BhQY54+iUHLkZK1RdON4YjctCoX9Qj9Aecm3y6l6Rnz66zVmXsbzcf22zA0op3vj/g4g=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=MIME-Version:Content-Type:Content-Transfer-Encoding:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=39VvJiZQH1/isjvty8mQlcUebSJMEXB1K9KicFC8mJg=; b=Urz7xay7N9uVK1l+oFnGi6hd+u JhN5GfV/g2FPqTwuj8qJ5gSTx8WC7u2uxKFhV6zTKa5tELqr06uuxNkZssG/rAuux/JwiWZGEdAkh YT/6xsNzJCbWeDvKLdVoUldhSpir5SIjQ9FiXiwsk9ExC7MumQCMXPrB7HUeoliXZgRY=; Received: from mail-tyzapc01on2044.outbound.protection.outlook.com ([40.107.117.44] helo=APC01-TYZ-obe.outbound.protection.outlook.com) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sN0Tb-0006JV-Df for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:35 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VS9ZkTatVwSgpVp7XGyX8SUSr1SQM7ofzgeAMkHqnqRfj9FWYm9DU0nEihG/SmefBo7CTcOiVd4Z1ELZHA0veuoXbkCJYy+v4CxaK4DXZlztSFz3Du2RyXTpIsqxMQprJtUs2eS0H1nnRZcqfYVx+4OOmEbvnImPrqlT5dzoT0lCGW8R+2FhqantxIZd9V1hpJ8RnuXJPkjet8Uqps858HuXa2+grzIogI/jR7CWNrdy27xDTLmh190pxL7OgwNVMQk0/8J2q2wNSli4lU/cqiNSI4aC29qBwuAXXsd5wf/6X4/MxTfQkug8oKycEvByYHcDoetvTO/OhPw1pz3Xnw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=39VvJiZQH1/isjvty8mQlcUebSJMEXB1K9KicFC8mJg=; b=AaXr6OMPh7XiCD22iDRP+EI4mUV+T6pz5GsS06TDdqXTdFejo9B0Ywr3rKg8wmqTm/ohKX/S2ESOo5bp++pjWgiSKJM6U19ep9wmgRrRmj/i9EVRQ7temQK6euq2rwDg1BVl7IQ/p+8B863k9siz2vPA5A3cSR9gVw1ZMv3yAP4Y+ts1x4mFAVxVi3YD/DgPKgWGBdiPXIEvgjSNNfFdeUwdum3shgSArRD7UcccRJPx5atTge+97KPNnd6/TcWR9NnUddDbqGbIFtIn6WyKsiP0QnrAkeASzBnyOIkgUyADaP3xcAlmVuYn+5HvWSXLQ5J8+yn43E3XDIqloLV/Hg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oppo.com; dmarc=pass action=none header.from=oppo.com; dkim=pass header.d=oppo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oppo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=39VvJiZQH1/isjvty8mQlcUebSJMEXB1K9KicFC8mJg=; b=q4UbpmIbCIODcamEAdQe6Kr6Ghj2Z+c6pN97nTKVfCvWMkE+KMpRRLmAoDmWGfnX63UrwFS+SVdA+bPSAG6spK8Ij52GPbTLf2JvQw01J7Ms41sSkvUJcA/APCeiTmQnXDOQJNz1Z12/K/N0nLlbfhEYX/eWD/oNlv9JLU3dcRE= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oppo.com; Received: from SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) by TYZPR02MB6576.apcprd02.prod.outlook.com (2603:1096:400:41a::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.35; Fri, 28 Jun 2024 01:32:23 +0000 Received: from SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796]) by SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796%7]) with mapi id 15.20.7698.025; Fri, 28 Jun 2024 01:32:23 +0000 To: chao@kernel.org, jaegeuk@kernel.org Date: Fri, 28 Jun 2024 09:31:35 +0800 Message-Id: <20240628013140.2444209-6-shengyong@oppo.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240628013140.2444209-1-shengyong@oppo.com> References: <20240628013140.2444209-1-shengyong@oppo.com> X-ClientProxiedBy: SI2PR01CA0047.apcprd01.prod.exchangelabs.com (2603:1096:4:193::10) To SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SEYPR02MB6014:EE_|TYZPR02MB6576:EE_ X-MS-Office365-Filtering-Correlation-Id: cc9532a7-0cce-4bf9-081d-08dc971228d5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: trGfTsm7R5SbLPH+0GIqma1zYIXzksLV18eZl1N/prOFlADvWUEy87Ai8A4sYGK7Omm7Hkk8YUSUEvaN5u74fgiefl7VR5rTjUMQdarUlDUNWl0AhUckWAXqBwO1Yrak+rvBftkfYnS+37zs5lEg2EG1jIvsa+/MuemPX6+X+EjUVqugYbfLTSe1y5rr2RfiA5tXn26+nzz/WCDh5Xjd49wKTpi4UAeu+NGNHvYnJD+akTSd6xNcSLYSX3nVb2oReu3HPzo3Co+HSxz1f6iavp9KpkwV0LQ9oWvpQzcUz5fKgnQTXJn+ySgzu65Xj/JKKeYbvY5K7X2+w42dKjZhnPA/690Yapc7I/TqJ1ptdQr/cpEA8tUXGoK22PheiwnkuvMqiRNnJ35PwU+7Q0vH9V5z6sQE0rMpldsrdQFLHqsx4ICbKreIkC1/xVB/rSDP9pUqU0QY5UpurgmlqVwLLTehFCLzCr6YazLg3UJ3WxeoCWCE608AA9S/6iKydwQ/bifdsroyzuMjukV/O2nF0xQdWWVYEGL+SAxVrKOiP+FpMI7ECbLP9EOFrEf1KZm4uPi0Ls5udl85ULualRPuJWe+O0wTHzLJQ1/zaab+48pRQt2xJ7yItm/7jl5LD04x6ScDUn57yauCUIxCFxdrZPHBz4k8tl83xDNCoYcNUoa3GaBSMuoU7ZdoJIZ/Dlex/Q3MwlBDsx18LKyodzKG+4XQE3dlfqDI3oJ8Y6g1982M3Yj0Wm4INQugqs0tGPdKbqWV5LUmJICFoS/LVtDmatwdGpd/HOP4sKIHhBwiG0NvdFTPgV9s5lsEwwZXlM0vXAucdlTwln1mFcV/DqjsWSDuYb2aDEbghNUuYLUtagDjq7NK0pB7n4hvnYjskbdj7sBoGAnQJfzG4iA7pH1n8QXUv+1IaAn65kVW5dsM9MWjfSM79Y8SXCbtVfo6SSipqNypSayrUqeUCvyyvYddSRi//r0fXGyy3x7bfKC36uRnuK/1Cml6qWQYItD5vAdfWnOQLSxUYwTK6TkwufFOaApF0jgh5K/qxJzjPaTlpHzDezz3GTXD7jQUIfcM3ON8TlQMzmty85eQaa4dtIvB+lRige9+uWOIWO0nRmktFiC8/70KDo+FHtR83rZ4nXuzue003/fjvbPCwOME4MURA2C0Fms4W9zDyZ+W1rn1yClADl63vRCc/Y17s6JbdRcoCekCOsbeLeab3C1qPWG+avK7tdd8Jo5SOILbNJIX5oZcxeQPzCwM5zPocDqZU0W095X0nwigPEATuj3ONS/7dQD9aJ9J1yES3IgmzkjvJugSL2Kkn6SfiIGtixUSXhqUgWK/WFpr53i/tprhUT0xff3Sv8dhO4fk2N8eCY4W2QBKuY3CA+HWN6gO9ujlIRsL1Y5NH8sd5EuJ2kzQVlw6aA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEYPR02MB6014.apcprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(52116014)(376014)(1800799024)(38350700014); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: SV1uuvLR5g4YjOiF9LrNWB6pbIl3ifJEu+hC56s+Ro+U4o3shJWSQbQVRtj2mWGVdIDPLRb44bDEO/FkCT1+UF9ORfZ2d2izg4zF6JzcMjPEyacJjc9RCAUz6fqYdXKFdIQBxLH4y29J2DpgN2HV9IAn7Z9CDU6+64RBdWC6VCfvXSixE1RTXRrjquJMkZejFCH3XaxMj75IRBgTUoTEvwOwm15EFIu3SSmeTHOwBVoo5iTPnzbPavPbll5fpx7q3yxvGPQqxgS4MXiuSL3ut0a91NV2GjVUTWzgupBq7vSr4ccgarTVAuwRGwLHsiGfn1U3iSrED8XTAayb+Qtq7KZKUA68/nVSCKdR9vQLAy0PCw1V2Vm510OQP2lfBk84CzRd69hmQSAflFbKptXHnDq/ryGXAfdpwCAQ7jy+UY45xE8rKvVggb7hC4OZEywYoS7L22gr1Kv0VQ+q+Y604K0aQSJsJi7flfrDTcHeBole/405V71Tsy7+A3nvIIopJyZ3DoJT14lxWfZPbjKb4wVV4KSiI3wfLwEhz58000Zmr2A+XlrUuYJ+x+dJG0gqCRrUmkPKGfywKJYkLOwm4nzIlAt6j7JrJlcBYtG3oHSfpAimpjKdX8AP0NcFzcZSuF5L9fH1aMgrHPdmoNalzwCSTxke0WnQwdFB4UPha+02XSOhTrBT2L9ZO2PfIXw2mikJFidHp/4H4hCQ0OcnYCrFf4/VTFkXiF0NMI5VMBCS4ATvb99wNxBsQDhpdwvVhFiCHF+TXy0I0BtCiGb42XzLKtczbJEavb/+JbeMQBmWQFhzPByI789Qiiky4PRulr30fzd7cWeWJxG28q6ATJKBlm0Sray91VtM1IXRUEOZhVyle+wgw0W29RJDwtohggQNjjFBTmyCy5taYLOZvHCNz+SDlUex0uNKfIp7xpG93acmfvFffql6tqHlwKXenP0SPkAIWd5f1c9ytNu1w82QQvYH+XecqHlpd5Dv6x4mzPTvUeTp1fmCssnI2VCdA1lyEXJ04pqQ7rtighwhRxfznKlxCiHUpCvGSTtSb9sav7q3C5n8t+wLEhEUNGz7R68kqWy4EXcIsinnzpDx3qns1EXlLKva26J9sXLk/chRITPNJSY3LuQUVMu0goSIs8zzG8fAbjVH+PucGUSRakrVmh6EuoeLaL+wQ36nPwNM9Gx63diacrXdOOWPNT0mqJK1YoJBxOSuVZ2fmw2kThAMxKm8E4JjjAjMnuea191uCn2AQfI9N+F4WtCjnIYGTj+Trojj8Jql9gdQcGDfnP24rn66u5mHgd8lGhigztRA947eQzzgUHvdif2wcatgBZ40LovHbbN6bdE4CI15xbof1ExfiXr+xjMuLHMqXfvCAxgAz+8GDiCq7kMv+Jz8b/FBg/gp+HswvdF9BITzf9dl/ol+gY52u6UjlvrdFCOKQcNwQyxd4kst2gLuhPmCRziDcgYZHq/uVSQ7Sog0GjzBVui9w+gwGDN41wjbmK0WPg9Mikno3ms41gOqG6dGsn0nJHjAhhFlWy6U7ZmPQJI4UHQ9Goa+Xgo1qvisdQMP+WT0BlLwLFoe1sDi0en2 X-OriginatorOrg: oppo.com X-MS-Exchange-CrossTenant-Network-Message-Id: cc9532a7-0cce-4bf9-081d-08dc971228d5 X-MS-Exchange-CrossTenant-AuthSource: SEYPR02MB6014.apcprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2024 01:32:23.3909 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f1905eb1-c353-41c5-9516-62b4a54b5ee6 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: JN133C9nztYVrOCQPuMKmh+zIysgCUXxVXYaiFeO6e8gvOcDvynIjV2Sjbax4rRkl0fW2RfsTwmQz8WvxxXOfQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR02MB6576 X-Headers-End: 1sN0Tb-0006JV-Df Subject: [f2fs-dev] [RFC PATCH v2 05/10] inject.f2fs: add nat injection X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Sheng Yong via Linux-f2fs-devel From: Sheng Yong Reply-To: Sheng Yong Cc: linux-f2fs-devel@lists.sourceforge.net Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net This patch enables injecting nat entry. print_raw_nat_entry_info() is added to show values of the nat entry. The meanings of options are: * nat: means nat entry is injected, its argument chooses which nat pack to be injected, where 0 means the current valid nat is choosen automatically. * nid: is the nid of the nat entry The members could be injected in cp contains: * version: nat entry version * ino: nat entry ino * block_addr: nat entry block_addr Signed-off-by: Sheng Yong Reviewed-by: Chao Yu --- fsck/inject.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++ fsck/inject.h | 2 + fsck/main.c | 2 + 3 files changed, 123 insertions(+) diff --git a/fsck/inject.c b/fsck/inject.c index 6899dbe..c5081f2 100644 --- a/fsck/inject.c +++ b/fsck/inject.c @@ -12,6 +12,16 @@ #include #include "inject.h" +static void print_raw_nat_entry_info(struct f2fs_nat_entry *ne) +{ + if (!c.dbg_lv) + return; + + DISP_u8(ne, version); + DISP_u32(ne, ino); + DISP_u32(ne, block_addr); +} + void inject_usage(void) { MSG(0, "\nUsage: inject.f2fs [options] device\n"); @@ -22,8 +32,10 @@ void inject_usage(void) MSG(0, " --val new value to set\n"); MSG(0, " --str new string to set\n"); MSG(0, " --idx which slot is injected in an array\n"); + MSG(0, " --nid which nid is injected\n"); MSG(0, " --sb <0|1|2> --mb [--idx ] --val/str inject superblock\n"); MSG(0, " --cp <0|1|2> --mb [--idx ] --val inject checkpoint\n"); + MSG(0, " --nat <0|1|2> --mb --nid --val inject nat entry\n"); MSG(0, " --dry-run do not really inject\n"); exit(1); @@ -59,6 +71,19 @@ static void inject_cp_usage(void) MSG(0, " cur_data_blkoff: inject cur_data_blkoff array selected by --idx \n"); } +static void inject_nat_usage(void) +{ + MSG(0, "inject.f2fs --nat <0|1|2> --mb --nid --val inject nat entry\n"); + MSG(0, "[nat]:\n"); + MSG(0, " 0: auto select the current nat pack\n"); + MSG(0, " 1: select the first nat pack\n"); + MSG(0, " 2: select the second nat pack\n"); + MSG(0, "[mb]:\n"); + MSG(0, " version: inject nat entry version\n"); + MSG(0, " ino: inject nat entry ino\n"); + MSG(0, " block_addr: inject nat entry block_addr\n"); +} + int inject_parse_options(int argc, char *argv[], struct inject_option *opt) { int o = 0; @@ -72,6 +97,8 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) {"str", required_argument, 0, 5}, {"sb", required_argument, 0, 6}, {"cp", required_argument, 0, 7}, + {"nat", required_argument, 0, 8}, + {"nid", required_argument, 0, 9}, {0, 0, 0, 0} }; @@ -115,6 +142,18 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) return -ERANGE; MSG(0, "Info: inject cp pack %s\n", pack[opt->cp]); break; + case 8: + opt->nat = atoi(optarg); + if (opt->nat < 0 || opt->nat > 2) + return -ERANGE; + MSG(0, "Info: inject nat pack %s\n", pack[opt->nat]); + break; + case 9: + opt->nid = strtol(optarg, NULL, 0); + if (opt->nid == ULONG_MAX || opt->nid == LONG_MIN) + return -ERANGE; + MSG(0, "Info: inject nid %u : 0x%x\n", opt->nid, opt->nid); + break; case 'd': if (optarg[0] == '-' || !is_digits(optarg)) return EWRONG_OPT; @@ -132,6 +171,9 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) } else if (opt->cp >= 0) { inject_cp_usage(); exit(0); + } else if (opt->nat >= 0) { + inject_nat_usage(); + exit(0); } return EUNKNOWN_OPT; } @@ -307,6 +349,81 @@ out: return ret; } +static int inject_nat(struct f2fs_sb_info *sbi, struct inject_option *opt) +{ + struct f2fs_nm_info *nm_i = NM_I(sbi); + struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi); + struct f2fs_nat_block *nat_blk; + struct f2fs_nat_entry *ne; + block_t blk_addr; + unsigned int offs; + bool is_set; + int ret; + + if (!IS_VALID_NID(sbi, opt->nid)) { + ERR_MSG("Invalid nid %u range [%u:%lu]\n", opt->nid, 0, + NAT_ENTRY_PER_BLOCK * + ((get_sb(segment_count_nat) << 1) << + sbi->log_blocks_per_seg)); + return -EINVAL; + } + + nat_blk = calloc(F2FS_BLKSIZE, 1); + ASSERT(nat_blk); + + /* change NAT version bitmap temporarily to select specified pack */ + is_set = f2fs_test_bit(opt->nid, nm_i->nat_bitmap); + if (opt->nat == 0) { + opt->nat = is_set ? 2 : 1; + } else { + if (opt->nat == 1) + f2fs_clear_bit(opt->nid, nm_i->nat_bitmap); + else + f2fs_set_bit(opt->nid, nm_i->nat_bitmap); + } + + blk_addr = current_nat_addr(sbi, opt->nid, NULL); + + ret = dev_read_block(nat_blk, blk_addr); + ASSERT(ret >= 0); + + offs = opt->nid % NAT_ENTRY_PER_BLOCK; + ne = &nat_blk->entries[offs]; + + if (!strcmp(opt->mb, "version")) { + MSG(0, "Info: inject nat entry version of nid %u " + "in pack %d: %d -> %d\n", opt->nid, opt->nat, + ne->version, (u8)opt->val); + ne->version = (u8)opt->val; + } else if (!strcmp(opt->mb, "ino")) { + MSG(0, "Info: inject nat entry ino of nid %u " + "in pack %d: %d -> %d\n", opt->nid, opt->nat, + le32_to_cpu(ne->ino), (nid_t)opt->val); + ne->ino = cpu_to_le32((nid_t)opt->val); + } else if (!strcmp(opt->mb, "block_addr")) { + MSG(0, "Info: inject nat entry block_addr of nid %u " + "in pack %d: 0x%x -> 0x%x\n", opt->nid, opt->nat, + le32_to_cpu(ne->block_addr), (block_t)opt->val); + ne->block_addr = cpu_to_le32((block_t)opt->val); + } else { + ERR_MSG("unknown or unsupported member \"%s\"\n", opt->mb); + free(nat_blk); + return -EINVAL; + } + print_raw_nat_entry_info(ne); + + ret = dev_write_block(nat_blk, blk_addr); + ASSERT(ret >= 0); + /* restore NAT version bitmap */ + if (is_set) + f2fs_set_bit(opt->nid, nm_i->nat_bitmap); + else + f2fs_clear_bit(opt->nid, nm_i->nat_bitmap); + + free(nat_blk); + return ret; +} + int do_inject(struct f2fs_sb_info *sbi) { struct inject_option *opt = (struct inject_option *)c.private; @@ -316,6 +433,8 @@ int do_inject(struct f2fs_sb_info *sbi) ret = inject_sb(sbi, opt); else if (opt->cp >= 0) ret = inject_cp(sbi, opt); + else if (opt->nat >= 0) + ret = inject_nat(sbi, opt); return ret; } diff --git a/fsck/inject.h b/fsck/inject.h index 907309f..db45fb9 100644 --- a/fsck/inject.h +++ b/fsck/inject.h @@ -24,8 +24,10 @@ struct inject_option { unsigned int idx; /* slot index */ long long val; /* new value */ char *str; /* new string */ + nid_t nid; int sb; /* which sb */ int cp; /* which cp */ + int nat; /* which nat pack */ }; void inject_usage(void); diff --git a/fsck/main.c b/fsck/main.c index 0318873..3ab49a4 100644 --- a/fsck/main.c +++ b/fsck/main.c @@ -820,7 +820,9 @@ void f2fs_parse_options(int argc, char *argv[]) static struct inject_option inject_opt = { .sb = -1, .cp = -1, + .nat = -1, .idx = -1, + .nid = -1, }; err = inject_parse_options(argc, argv, &inject_opt); From patchwork Fri Jun 28 01:31:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sheng Yong X-Patchwork-Id: 13715369 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 lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1A601C3065B for ; Fri, 28 Jun 2024 01:32:41 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-4.v29.lw.sourceforge.com) by sfs-ml-4.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1sN0Tg-0004O6-1C; Fri, 28 Jun 2024 01:32:40 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-4.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sN0Tc-0004NX-C0 for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:36 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=MIME-Version:Content-Type:Content-Transfer-Encoding :References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=PnuvdXBVJf8McZte9KAupRPyQqftLHFApP3EVBqcxQE=; b=d3PSMLmc/Q+JF158N1KO6UtPA9 koKOBOhO5lwG1MoH0FtJ4MyoHLoNLB66TgYngotyMW6L7nskUozHd2G8F3ZqL+mKG8wZ2PkshBrK8 TE/WjmItsNM+eBzNlQBxvSpyY170rCq3yv8z+dyFU1kY5c9hoDlKiNujqa+Rgf9jK0Qg=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=MIME-Version:Content-Type:Content-Transfer-Encoding:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=PnuvdXBVJf8McZte9KAupRPyQqftLHFApP3EVBqcxQE=; b=XLALsVahfU8XeUQKqWz5PsTgzj ZzT3SDdgS88C1CQjMGsihmY4mCjC8QhVF7frmYVKNmMf825e/Oq83OmmX00tleJWdT2eNrkd7S5Nf NfLr6A47y4YwYtR1nmE927gYgsucR0YbvxIl6GZpNlowZFrIwHE/nsBnroXeei/F3Dd0=; Received: from mail-tyzapc01on2044.outbound.protection.outlook.com ([40.107.117.44] helo=APC01-TYZ-obe.outbound.protection.outlook.com) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sN0Tc-0006JV-HX for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:36 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=kTBjF91yZzmsBAnTBbYDo1kP1T+97/Yi5Rf+GvONT38c82m+MZSvoqbYWsnnCaeQf5JXRlAFdqOKUDXQ8G6XpzvFF+bwM+F9Em/39FJs9POZ0Apt+R1TuVFdUubo/O672tm+TB8Aj5ILL0QhUEyB7sNWABJxEfhoHcDXZNuDypUat24ME/eFlzSojbvR1y6yV66drBh/rQ2ZPUou+mSa/z6ETIS6OXvVROYXd2hPFXuMuJwtAkup4ACIS/uiDBDUOnCWKwBxDjrInw3pAJ9cub0sFZ/rG3ITjQ7ygCFN2yoX4DMfzQCdfG6jHCYLaGnzZP8+kyuDifpZd1Gz6eacMA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=PnuvdXBVJf8McZte9KAupRPyQqftLHFApP3EVBqcxQE=; b=jGOM70mXZSKu1cz1nQxg+nDDZx5YKEO5VN49CMERFueP04V1ilsaXvuRm+5KzqLjcUAo4AYYnV/KC1AVH+4zMLuQrX4Q0STMjol6MwaFLkwi4jiYN4zaDglauAvUXGGFsvh0YK2Ko2e8GFLai91LeiCegmC6+kJ1pnhfhxZ+oUT8WrXdTjbwqP7pSZXSzuAIa/TQIeSzK+ysaSNpRJLVkHrV+vTtDqV2PcQnnP/3uhyPJFKjr7+fex0ZTwlgv0D9Z9S9ZU7gzSY2g6kYZdSrcRrwqwjdEVDoKaLvyYQQgDCop4PwY3qf9/RdrhUeWWgGy0a2YGupt8/LR1zmqDjqbA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oppo.com; dmarc=pass action=none header.from=oppo.com; dkim=pass header.d=oppo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oppo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=PnuvdXBVJf8McZte9KAupRPyQqftLHFApP3EVBqcxQE=; b=K55vGB9ole6EGmkfiJvxe4f0wni9rorj8BaXNvByi5eGkdBrcsERrGeuTTsmsV5KNSPhDnezmCeAPbtbsgi1dCRo0KXvmNT3g1a101tGu2HZYDPrOEmVJfQ0NGLlrB4vyBwCp7MF3usKg3xK9LoJ88+SW/V86Ectf6yCOivACNY= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oppo.com; Received: from SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) by TYZPR02MB6576.apcprd02.prod.outlook.com (2603:1096:400:41a::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.35; Fri, 28 Jun 2024 01:32:24 +0000 Received: from SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796]) by SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796%7]) with mapi id 15.20.7698.025; Fri, 28 Jun 2024 01:32:24 +0000 To: chao@kernel.org, jaegeuk@kernel.org Date: Fri, 28 Jun 2024 09:31:36 +0800 Message-Id: <20240628013140.2444209-7-shengyong@oppo.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240628013140.2444209-1-shengyong@oppo.com> References: <20240628013140.2444209-1-shengyong@oppo.com> X-ClientProxiedBy: SI2PR01CA0047.apcprd01.prod.exchangelabs.com (2603:1096:4:193::10) To SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SEYPR02MB6014:EE_|TYZPR02MB6576:EE_ X-MS-Office365-Filtering-Correlation-Id: 65827124-9c9b-4ff1-2883-08dc971229be X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: gLFls0xLwFnl/uH2gUBvfGa995wB0uq9UoBaay0QGgswUTu9AQFNW9HLgMk1pz/NUk+KDvxgyXT3rLkkJAiQ7srVJSe6DP3Rek0uUsdUKNdT9B+Kxb1m/BfbkHlpD0sSfIMattRgVVMbvdXw0mkzZkkaRNPpIiMg7fhXgJZCHoFqg4P56fPFA055Vg4M0GG7GLE/0wm2oIPbTP8y3dLz7u3qkPGYcAFyczQ5Aj/IE3MQeOZ+kYrBPSKpArfwGrDuXzYM0OzbLEKw4luHlNQM6iZWFuXh/VGfOT85VSjSodtJp0radaWRX2FA4vxrOxpZbfxZDUR/M3NUiB/Hv3kCjqK0p6ICa2DLeoz+FLA42KknpVMH+siJ1TjLB/sus6KtMC0PyKCb9wpzsKqV74jj2BB7hsjS1rw7I8hUaxFRvOl4sn5cDp0sQG682z/O8O8W84PqinPt0PbEUHeX3CZi7dVMwezqIMKjLHJ1+UHSn5+5yMvJWV2fT9uyD91C4UG8TidW7ccX+/eG1iDEYviViI0iRJPic3FdlNUqBX8Csq8gNg7M/p+crSG5N66gsf59dbn1MbmVb2GXOoynsR6lLfIXhGMiydD5Nm08cFHU0aq53HwDc8oznWoHTBng7FHPtnVi1Cnw+HA9RuMcr21t+LvJccZHNDJWDsv5KmJGfEcALDFM9vFRgbWH+PAmfiLj/iGTB5lZ8YAg+nWCEKLXKWtpHtlRuiEOCPzYrHrup7QUt8Z2Nf0pJATvY+UdPhz6WOHtetSBDN1ctd8/A7G5VK72GvzXzF5wqUcufZphRNIaT90hFzP6qL1uQI2NryFrBKJH1Bg/S8zrhvOMI3i5oNQXjFZEdg4y7LiW5JuDJFqi7xoXvQT/YBPIqcdu0ZweQsEZazGO5eVKort4/jz+V4u3J/DcEHmo3ukvYnL0quU8Dxba7u7pCuXV3HdvijwOP9X+fR/IrRMz2hnNQfyeHENWjrlPfX7C2BdlPec6MzJFTyvGJBfH3hB3jwj81wMcfmLqPjvb384BRbg5IEdRWgpUBmnv0nzeeDk6/FHF/EGIXYO23w0Eg2zWIqZUAvkCBV6kR4UJBW91SYNOhF8EU8KJGgMMVs8w9vfyx6rVt/bxy+rH59N2ikmGiOExI+lIKK8cZlo1htuPYOBNSP/3//GgdqyYppAwMX1Wh60qTZe33w7ZtbuoNbTJQhH/yWPSGqoSgCj5vT2YV3sfgOP+XKAFsbCW9P4RhgHx7EL7p4V5Xi4Jp7sa7SUhYz2c+iHYIrU8oekxgRT35TBhqJkvbAzkwy95mPv41MOoRiNpt4IYF2GRXhGekIOUeC34OoX/7sWBsORaTvmrPxRurazu6tbIaePt5bcmkMxVChoSyAjKWn330IXhZg5KIX5x3YeffJzRUdDWDGBlNrCXykWbxw== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEYPR02MB6014.apcprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(52116014)(376014)(1800799024)(38350700014); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: My7/4NZxV9w9qcgrLk6eoM9eMyRRaybw9SOzrPJboKOAAL7A4kOWF6cIdTHJsGffk/ALENb05faDxFsI3UpWcmjbda2Y7DeUacVXX6KI9pocVSnWABrKyQOmPMQeY/npv41GD4NdETzg3V8iEFMjuVWY7GV2k9l+yRG8s/ADW1tFM+MFay5ScaUQCVXfz2S8NjBj+PjfCCSpc0WnOlYDp+I9F9zwKGJK3mmU3hqGyRMdEq6l+bdGf0tB4MtaSzecOdsvrwQawpQEbcHvMXj9lU0p1mNMu123+TfbSIiRtwm2Wi36et8/0W+YGhlPOkZyGFDEwNb0WRfgvMN2eDmwwdsoeOA87CA2s6Va4yaT+VMfG1LVR9Vp/9RLGH48g3FnWJ1VPIx+IKGCWq03kLggWcGJ5a+KAgPSLia+60r5YCYLHIe7x0cqFSiObGQIQqNCeDOUFaeOr6AqQ5sZFU+sTfRw02wf8XbYUBd4yqixNKcHkjaV68qlknGg7uGySGLSUiXLBAHJGc7kNkvcQhWPU7PsK01Q6IqRZMhAQ/AIqcjaMfO9oJtBXKF/Lv0YpokqRdJG4hpTYbjUvxjlGE4j95AeiiaTzcCeBICVWwPWg8hlrCkdc3PIP94Df8YZNzSaNvBjt94EVBUFVHkTbcnXaDdtTzepO3IcuDPS3okmx2rLcBEhIXz3dxVQy/AwqSGD6ueCx1FMdSqMFYNCxEcuBcJxwFSwzt2EgcxaZjROpFfnSekpdQAtFouJP/cpIEoOlq97Tee7cEZSlTWaBkQ8YWju1JKzI0T+peNPn/utMTzTVld4pKmXPJxI91EzPB/YjuxPKlulF2NxlIqbb3tj2U9rKTaq/C94XoB/ALQjhpkpuUl9tZKgf+cJMO/pdfk9CRQKXl6JEMhiFw7HeYB9wWq/zFMqVZh0Ee1I8/uVErdN+I3k1/AM+eBc/K6/rhUr0IBAJCZ+c2L7IGRg62OPNn07RXzVW6F5Hw9Xic9n657rGlwgHZtBYDjPbQOWhnrKpvlB3/4obgFmyZEpgaOseBLSIobRc49RCb1VYeXnnrQQ4+J7Rfzx8qIsJLw8UNhfFWkZC42wBS+y+77ygT8SwgKJ/EI0APJdXha6A3611bs7fCC+OvNVASgQs9QQe54fBcndJjJgUuGiSxco3OOAbVYBY7T1DMNt1sK8Cl7Ea6liUU7rhJjhaz9Ul8YhedXOBIBfCSoe9g8hstgBxw8GX0RdTlhZdg1jUHlBHU6EKmuraXwQrRoM77Inqxmwa+8WwvAMyH2JtBDodtBG/Lcy3AHO7P7H+M4SoMfyLd3v+DDIqIFxdEnldqhQwOOcKWA7C2fhuaGR+FkE3JHquDZjXHHaLfQIrpTrSySgrAl1qfxC/NMK7MelwGruWz4yXCR9/Y8cTG/DcugqX3SMZzlT7Yg6ZWSIgpN9b0eDW/db/LlJH5zFSJ+9042F4ZQU5SiYfGqz0yNMWFIQk/SPEqypwMxZb5E5/m5kueQAaDMIdULkHyy1FG6oJV264lLSoFjgeHYk9NvgGEbaLs6WNzIJ8si8uS4y0W2lS5/QSitYlQ03Tadwwf9ktyD01iJg6h/P X-OriginatorOrg: oppo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 65827124-9c9b-4ff1-2883-08dc971229be X-MS-Exchange-CrossTenant-AuthSource: SEYPR02MB6014.apcprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2024 01:32:24.7133 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f1905eb1-c353-41c5-9516-62b4a54b5ee6 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 0aAVtZY0mIGhXzFSsohY8zASmX71p5VqsuB8DU/WZ1kqR/Fa8P/eA95l899G8KwhnC20YwZ4wjwyLhlZFnoqYQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR02MB6576 X-Headers-End: 1sN0Tc-0006JV-HX Subject: [f2fs-dev] [RFC PATCH v2 06/10] inject.f2fs: add sit injection X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Sheng Yong via Linux-f2fs-devel From: Sheng Yong Reply-To: Sheng Yong Cc: linux-f2fs-devel@lists.sourceforge.net Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net This patch enables injecting sit entry. print_raw_sit_entry_info() is added to show values of the sit entry. The meanings of options are: * sit: means sit entry is injected, its argument chooses which sit pack to be injected, where 0 means the current valid sit is choosen automatically. * blk: is the block address of the sit entry. The members could be injected in cp contains: * vblocks: sit entry vblocks * valid_map: sit entry valid_map * mtime: sit entry mtime Signed-off-by: Sheng Yong Reviewed-by: Chao Yu --- fsck/inject.c | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++ fsck/inject.h | 2 + fsck/main.c | 1 + 3 files changed, 133 insertions(+) diff --git a/fsck/inject.c b/fsck/inject.c index c5081f2..0fe9b9d 100644 --- a/fsck/inject.c +++ b/fsck/inject.c @@ -22,6 +22,27 @@ static void print_raw_nat_entry_info(struct f2fs_nat_entry *ne) DISP_u32(ne, block_addr); } +static void print_raw_sit_entry_info(struct f2fs_sit_entry *se) +{ + int i; + + if (!c.dbg_lv) + return; + + DISP_u16(se, vblocks); + if (c.layout) + printf("%-30s ", "valid_map:"); + else + printf("%-30s\t\t[", "valid_map"); + for (i = 0; i < SIT_VBLOCK_MAP_SIZE; i++) + printf("%02x", se->valid_map[i]); + if (c.layout) + printf("\n"); + else + printf("]\n"); + DISP_u64(se, mtime); +} + void inject_usage(void) { MSG(0, "\nUsage: inject.f2fs [options] device\n"); @@ -33,9 +54,11 @@ void inject_usage(void) MSG(0, " --str new string to set\n"); MSG(0, " --idx which slot is injected in an array\n"); MSG(0, " --nid which nid is injected\n"); + MSG(0, " --blk which blkaddr is injected\n"); MSG(0, " --sb <0|1|2> --mb [--idx ] --val/str inject superblock\n"); MSG(0, " --cp <0|1|2> --mb [--idx ] --val inject checkpoint\n"); MSG(0, " --nat <0|1|2> --mb --nid --val inject nat entry\n"); + MSG(0, " --sit <0|1|2> --mb --blk [--idx ] --val inject sit entry\n"); MSG(0, " --dry-run do not really inject\n"); exit(1); @@ -84,6 +107,19 @@ static void inject_nat_usage(void) MSG(0, " block_addr: inject nat entry block_addr\n"); } +static void inject_sit_usage(void) +{ + MSG(0, "inject.f2fs --sit <0|1|2> --mb --blk [--idx ] --val inject sit entry\n"); + MSG(0, "[sit]:\n"); + MSG(0, " 0: auto select the current sit pack\n"); + MSG(0, " 1: select the first sit pack\n"); + MSG(0, " 2: select the second sit pack\n"); + MSG(0, "[mb]:\n"); + MSG(0, " vblocks: inject sit entry vblocks\n"); + MSG(0, " valid_map: inject sit entry valid_map\n"); + MSG(0, " mtime: inject sit entry mtime\n"); +} + int inject_parse_options(int argc, char *argv[], struct inject_option *opt) { int o = 0; @@ -99,6 +135,8 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) {"cp", required_argument, 0, 7}, {"nat", required_argument, 0, 8}, {"nid", required_argument, 0, 9}, + {"sit", required_argument, 0, 10}, + {"blk", required_argument, 0, 11}, {0, 0, 0, 0} }; @@ -154,6 +192,18 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) return -ERANGE; MSG(0, "Info: inject nid %u : 0x%x\n", opt->nid, opt->nid); break; + case 10: + opt->sit = atoi(optarg); + if (opt->sit < 0 || opt->sit > 2) + return -ERANGE; + MSG(0, "Info: inject sit pack %s\n", pack[opt->sit]); + break; + case 11: + opt->blk = strtol(optarg, NULL, 0); + if (opt->blk == ULONG_MAX || opt->blk == LONG_MIN) + return -ERANGE; + MSG(0, "Info: inject blkaddr %u : 0x%x\n", opt->blk, opt->blk); + break; case 'd': if (optarg[0] == '-' || !is_digits(optarg)) return EWRONG_OPT; @@ -174,6 +224,9 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) } else if (opt->nat >= 0) { inject_nat_usage(); exit(0); + } else if (opt->sit >= 0) { + inject_sit_usage(); + exit(0); } return EUNKNOWN_OPT; } @@ -424,6 +477,81 @@ static int inject_nat(struct f2fs_sb_info *sbi, struct inject_option *opt) return ret; } +static int inject_sit(struct f2fs_sb_info *sbi, struct inject_option *opt) +{ + struct sit_info *sit_i = SIT_I(sbi); + struct f2fs_sit_block *sit_blk; + struct f2fs_sit_entry *sit; + unsigned int segno, offs; + bool is_set; + + if (!f2fs_is_valid_blkaddr(sbi, opt->blk, DATA_GENERIC)) { + ERR_MSG("Invalid blkaddr 0x%x (valid range [0x%x:0x%lx])\n", + opt->blk, SM_I(sbi)->main_blkaddr, + (unsigned long)le64_to_cpu(F2FS_RAW_SUPER(sbi)->block_count)); + return -EINVAL; + } + + sit_blk = calloc(F2FS_BLKSIZE, 1); + ASSERT(sit_blk); + + segno = GET_SEGNO(sbi, opt->blk); + /* change SIT version bitmap temporarily to select specified pack */ + is_set = f2fs_test_bit(segno, sit_i->sit_bitmap); + if (opt->sit == 0) { + opt->sit = is_set ? 2 : 1; + } else { + if (opt->sit == 1) + f2fs_clear_bit(segno, sit_i->sit_bitmap); + else + f2fs_set_bit(segno, sit_i->sit_bitmap); + } + get_current_sit_page(sbi, segno, sit_blk); + offs = SIT_ENTRY_OFFSET(sit_i, segno); + sit = &sit_blk->entries[offs]; + + if (!strcmp(opt->mb, "vblocks")) { + MSG(0, "Info: inject sit entry vblocks of block 0x%x " + "in pack %d: %u -> %u\n", opt->blk, opt->sit, + le16_to_cpu(sit->vblocks), (u16)opt->val); + sit->vblocks = cpu_to_le16((u16)opt->val); + } else if (!strcmp(opt->mb, "valid_map")) { + if (opt->idx == -1) { + MSG(0, "Info: auto idx = %u\n", offs); + opt->idx = offs; + } + if (opt->idx >= SIT_VBLOCK_MAP_SIZE) { + ERR_MSG("invalid idx %u of valid_map[]\n", opt->idx); + free(sit_blk); + return -ERANGE; + } + MSG(0, "Info: inject sit entry valid_map[%d] of block 0x%x " + "in pack %d: 0x%02x -> 0x%02x\n", opt->idx, opt->blk, + opt->sit, sit->valid_map[opt->idx], (u8)opt->val); + sit->valid_map[opt->idx] = (u8)opt->val; + } else if (!strcmp(opt->mb, "mtime")) { + MSG(0, "Info: inject sit entry mtime of block 0x%x " + "in pack %d: %lu -> %lu\n", opt->blk, opt->sit, + le64_to_cpu(sit->mtime), (u64)opt->val); + sit->mtime = cpu_to_le64((u64)opt->val); + } else { + ERR_MSG("unknown or unsupported member \"%s\"\n", opt->mb); + free(sit_blk); + return -EINVAL; + } + print_raw_sit_entry_info(sit); + + rewrite_current_sit_page(sbi, segno, sit_blk); + /* restore SIT version bitmap */ + if (is_set) + f2fs_set_bit(segno, sit_i->sit_bitmap); + else + f2fs_clear_bit(segno, sit_i->sit_bitmap); + + free(sit_blk); + return 0; +} + int do_inject(struct f2fs_sb_info *sbi) { struct inject_option *opt = (struct inject_option *)c.private; @@ -435,6 +563,8 @@ int do_inject(struct f2fs_sb_info *sbi) ret = inject_cp(sbi, opt); else if (opt->nat >= 0) ret = inject_nat(sbi, opt); + else if (opt->sit >= 0) + ret = inject_sit(sbi, opt); return ret; } diff --git a/fsck/inject.h b/fsck/inject.h index db45fb9..ece4915 100644 --- a/fsck/inject.h +++ b/fsck/inject.h @@ -25,9 +25,11 @@ struct inject_option { long long val; /* new value */ char *str; /* new string */ nid_t nid; + block_t blk; int sb; /* which sb */ int cp; /* which cp */ int nat; /* which nat pack */ + int sit; /* which sit pack */ }; void inject_usage(void); diff --git a/fsck/main.c b/fsck/main.c index 3ab49a4..7ec4da7 100644 --- a/fsck/main.c +++ b/fsck/main.c @@ -821,6 +821,7 @@ void f2fs_parse_options(int argc, char *argv[]) .sb = -1, .cp = -1, .nat = -1, + .sit = -1, .idx = -1, .nid = -1, }; From patchwork Fri Jun 28 01:31:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sheng Yong X-Patchwork-Id: 13715370 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 lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C3F00C30658 for ; Fri, 28 Jun 2024 01:32:41 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-1.v29.lw.sourceforge.com) by sfs-ml-1.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1sN0Tg-0005UP-8R; Fri, 28 Jun 2024 01:32:41 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-1.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sN0Tb-0005U8-P2 for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:36 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=MIME-Version:Content-Type:Content-Transfer-Encoding :References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=i4bgclkosFD0UTNYwFawfFNM1WklWN2EzTUGRIE7v20=; b=bcgE4arbP+LZst7iIf9IhbNvF7 cC03wKh/kfuht6dUx8icWDFBK8dLeK09wenj1v08pLlSpp+4apIAg9BZmEXJpmaQ3s5QgtYi5d0v+ Kkoj5HDCfcW09MAt832tyPMFI5McsLvRbx0buelTMVsUE9TxjLAYJVYsZTa6zQVBVdzw=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=MIME-Version:Content-Type:Content-Transfer-Encoding:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=i4bgclkosFD0UTNYwFawfFNM1WklWN2EzTUGRIE7v20=; b=F3Fytc/kDhVlsB09zmfZ1tOj7i GxUA8gPWe2VUWmbYkF8f+wjefIxmEDhmo9olaaZa9SpNuWurIIQyR1DYkkoZ3rX3y7DwmB3fHuAE0 llsLX+W2oHDlRTluPZM1OJ5CKT+iqY+uW/cl7Z053lj0cC+fsZpYW7EWG7PZkFb386n0=; Received: from mail-tyzapc01on2065.outbound.protection.outlook.com ([40.107.117.65] helo=APC01-TYZ-obe.outbound.protection.outlook.com) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sN0Tc-0006Jd-OU for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:36 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=EJPV2Y0eey3iM+SKm5q4+r1ZVlMLeb3eQ23fCvPuDLhmrUnQQ1w95xm7SKWgXNE8EUrn7UczPHl9dLHMQCifsjxvghkFo4kTMPyvOG3xpeeyQcelvpA0ty1w1kaLozmtxGfXZLgw4M2k9+675DGfOPygnY8mLo3HmufXzdQDhhTst8/F683NaGNwHn4TkQWx9Z+McaMX+dmXaJiEwDSIJFo0fGSHnGq8fi558AXhCwAGVcdCEHmEcV8lgJAfZQAs/k9/fG8GjIkWgIq1rSC5yqfBdPios30EqG87ihFik27/uTil9bCcAzkoxYGFWBUJCLBhAxNOsL0P5+yhSZPJ1w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=i4bgclkosFD0UTNYwFawfFNM1WklWN2EzTUGRIE7v20=; b=SA2rjdUZYbW0C90Wingwi1JgQqKZgjOfcu7WcmP+mcy1QhiyuzYAgVKu7aq50CHnn9VI4QlTxqnPJmv9GycOWMYIr2S0SFqMabQkjLodX9cy9O6QKhlicTb1ZaYxQUefthqMjsYs/eph/jfF2nV6OfuIQHGOu+U6+bUib5EmXbLee6xHxiL/Y8nwVKH+VmX3GILo0+6lWgmblctBVhp20R6BuJRPFE2wpG9afzeAqEyi3P4lwsoELWHOX2q2BaCh5RltLuiNTEISZP/CgyTPopqQGfo59wfA1S5CKbkmi7vaYUonyI+xL1Jlmi4CWClGdL/xapplmp+pCySWD1xHew== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oppo.com; dmarc=pass action=none header.from=oppo.com; dkim=pass header.d=oppo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oppo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=i4bgclkosFD0UTNYwFawfFNM1WklWN2EzTUGRIE7v20=; b=MeYs8bDnOetNQh+ns3LYviDhyL/+LpzTCyYGoVwIe68syj1LP4zatZJuI6e9tcx4EaMfhTg0aPIU7QFHl+GPfiW9Z/sP8As4c+1Jq1DFUaCTHSc5bYsPV35Tnfdbu+UisRiahg1aItfDKS9IESYsoN+5kXDpjmnUqpgBofFxts4= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oppo.com; Received: from SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) by TYZPR02MB6576.apcprd02.prod.outlook.com (2603:1096:400:41a::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.35; Fri, 28 Jun 2024 01:32:26 +0000 Received: from SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796]) by SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796%7]) with mapi id 15.20.7698.025; Fri, 28 Jun 2024 01:32:26 +0000 To: chao@kernel.org, jaegeuk@kernel.org Date: Fri, 28 Jun 2024 09:31:37 +0800 Message-Id: <20240628013140.2444209-8-shengyong@oppo.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240628013140.2444209-1-shengyong@oppo.com> References: <20240628013140.2444209-1-shengyong@oppo.com> X-ClientProxiedBy: SI2PR01CA0047.apcprd01.prod.exchangelabs.com (2603:1096:4:193::10) To SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SEYPR02MB6014:EE_|TYZPR02MB6576:EE_ X-MS-Office365-Filtering-Correlation-Id: f3b110eb-9b3b-4a5c-970a-08dc97122a91 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: qejrza+XgXGHPZtBNQVO6lu513U5GiIcIUMY3Om2nCn9W4daPFac0byF5lpIDLqPjRKFiwt06SnUr89zS8jZsKvUPiOo+O+TF87Wim4TnBvnCc8qQTtOy6JkecqATcHCf4AnM8pSuH2zOKp2rKRDKuRgiCpL4w+W4OEXCWQABuEcIsgbYypiKUKumA3B/gdA5ziy5jdsSB56SsOx3ngOfwEQRl6etT1U7MgyfOBOV5+wGCKNPDyrt3peA7X14yNps5RMWUiaGKx/b3fljvrVIjN4xwadQJtpIC3g+olaPJ4cYEma0EA+Kux/FFz9BuuZvCCEj09Sqk+1Ee6tRbyp5xedrCkdgzLrEDzOYk1R4dA/ivAG77AAWcsWOMYK2PZKmXWeQyY4s64+2uNscVQdNQFYhdPfO6DDdyfujFM46bJtnPSi2IHTMgjOHRUW8CzDNlGeXk+cWU6NPWDOjrBM8hlD/8tSkLg5YBH8I/cHi85SlMnT8PJ+sISHlas8Opr8BsUmyBDJ8YVg2w3JzAjTn2z9VZsRAfKcK6i0GiSzXjEFdJUExvisUzOD5u5HoqgG8eRwk0A1gJscelcXNyhY9AWVvn+zLbXq3+H/LX0XXxK/PYq8DtWocxDCoD+8PBgnw5uLUumWv9+EFowhCsc12+NjNamUj4f/ATGd7Fioe9m0cFEglJA0wc8YkXr6tMtNAMdpBAZIfrj61fxxWa3AhpCGQLVtrekMQ65Fm+IA384J8fP8ky1eJR5pvn8b2vUj8ANdfUkMJt4GJb5FU9afcmj6s1XqUU0UDluHNHrtEyAtEz7aVCcYSLQO9R62/kLrMngSbUJ3OYjdXrkxpJiJaYBnlTTweuw+J4jHZRHnXCYlHX/I2IjHicVd74CrCgJVaOa/m7jphIe30TRSpl6VSwmBh+JxCnq2kJQv49cAJdjyYLl5KCHKUJisqJPa/lMIrw45VqHmmQB4ifyfOuTxVhkcOUSVexgG3wwbqOPuTKsWfweswpXOjI7vp7Js9EITb54FN1I5Ecpy6HCXCkwGcc+oEGOdmym7cx2zoBVN4OrgtkPRl1/NQparUHE7Di0yqr6PAaPi7nFRU/G1eOmMJ6qCEQ11ZVSusgsnk+2MnC7h9bgoOZzF0R0UhuphnQIIQPWpToYyLmIEwfTbLA2/6LdILJ6pvP6dEtB2PP13UsH9utENnuHrBDMF1E5U5Ld/lUIQgxfZNYgYOdt/f+4EXjy6oy26PLSDdK03L07h1eJNB6zL8J1C7Gv+xTVP7Vs0cFOnN1wGYzCfImPqisq2goens2tWW6kb8BHoGiGSph0ZaO3QFeUYR770g1Zh0Oa2LG9d/0Z2ARud5pOrh3mqXWGeAJjpR3KVwM4hhCR95Bh7JiqF6V6KrhLxZ8BORteX1p9XK0jJWmppRm4yNlYyGQ== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEYPR02MB6014.apcprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(52116014)(376014)(1800799024)(38350700014); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 943U9qbhICek3xZS6xPetGGKWHN/0dfxHFzCiLmJ/3tK3hluB1bxtLOkNqE7UT7dWtA/XNaDCJGmBZ+RJut/ztu6VS0NnVLai2ST9IyraAPjFs2LqJJqrZE2MaYm+wARjE6c8Ek+We69cKyICwQkJ+g9G0w0HrInfqbCoyWbCLGMmXtweS2eaSdFJiwodDRN2TeRjv9MDpLGU9ZCql/X1RB3ayTT1/9HTszVKqby5evrWY5n7Rh7zV4hLeRnYf4SOs7NjBXqW33E+SFvL/+zMGdqSNaDFUauJb6nDXarK42uzRNjAdpLE9KR3/1xdpQFm0CPgrOzySlCGruEWmFKaPFQOFGkKnPxEYDr+ynoMEzpFQc26YVYK7V/t/Q3Q+y/zbhF7ClCjPGUtmDnCC6ETdXCRQj3+6z7+NrxXHdE080cO7iSWa7gp/lt9sG/B1LaPqbJxQEGyRmJ/vc81gMUmJP+FyAbfWXDZchRUxMh8tGSJv2TsTkduu01+xC+Vv5EoCi7dVluF4OA0vx5pz4VZxld3ptxX8Nt0BOkvt/XVBsZyHsY4RT994yuBP8sCGgEWzWvdvdciTWrcVx7fyw1aOgk0CVbGw/LYJN7Kpc57hfDXJ7fQsP5j8F5JGtf64e2xyCbOCjYfRS21bZXEPFaETVeTwgxBL8+I8qFH6iKQq32KSCKX2cYeImHc2byAC9D6Dd7OccFVRuRPYqhLJiuS8VMso4N7gXZzuEVPtxyKvEpV+3HkKvUa9E8/UutEjzaFMkRmEWXNENffUvJl2tyAnf97I4+d5TumynVR8drx3DJc+1HOtj4MNkq9lxQY+6wkVKOtVRGLVKZCzy43NgcrrJaU7+K+Bx6DhfbQJtjeVV1J8WyJqmc9iQEfx7+t+coC7Vqh/PC5dNvjmrIWvILB13uk+z1aH8fNoDwX2jpI1SGPsM/DnuwLVxsYLzMUWzmlp1yqZoQ5sNSJyo9pdgps3anoxjoGNzpl0U8NM6ucAoLM1DJhuLAf6Adrmdd95QRygOsJqeW2b16lTOxK1lLDN+GEodAqy5C0q+Msgz/0mC7FUsxltcwaSjfkllTdqIBP1yEqMO8JSptLSYfU4c8ZY6pLKGmlP0LqL/HyZAPaMrwhl+sg9okMtdSLy7UVFzCzFvRDBNZ9z0/r8p5aUEyh/j3LyQVW0Jcr4am2BBhTzjmShG1STjGyk25kq99zi2zK/XWeDy0OPWnsI3bLgYev62Ocm7adHINpSkovPgy5RSi0lgIuvjBaXDswPI/bS5Jby6UW5ciwUK9hkI5C4Xsvlnwf6/NEknwSuoHBBaAPogW+so7fuSp7e5uPEPcG9AnXvSE13NAq5+z8TKNRR09JAZYL6qJsiGkAd5haNvBDD0JwNiYue0TuxuiwFaqM1IOWcHq1VltCdjWXStQu7xTnZo9uafRXbMQOyzKdD6pXRSGn0+1Z7b3xmQfKo7WmU2NRXDqq2WXBAaX3Vty9qxhqdkLuwY12nzA+uNDmxCDcTMBfqO7cWIV8ZtqeAi2XLZh8kuHMhuGuoFzWzQAwOl9blyR4zd1EWl6yNC8659EqgVPmqG5TMbhHW+um41rwhYk X-OriginatorOrg: oppo.com X-MS-Exchange-CrossTenant-Network-Message-Id: f3b110eb-9b3b-4a5c-970a-08dc97122a91 X-MS-Exchange-CrossTenant-AuthSource: SEYPR02MB6014.apcprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2024 01:32:26.0860 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f1905eb1-c353-41c5-9516-62b4a54b5ee6 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: LUXIOZm9P2kMVAllZOzR9bcPcLpFvfgd0TwEnF8IO5WyrjKurai5nCqHI4RCNsc4tjTtcBIFrnPl3v4n1ieadA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR02MB6576 X-Headers-End: 1sN0Tc-0006Jd-OU Subject: [f2fs-dev] [RFC PATCH v2 07/10] inject.f2fs: add ssa injection X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Sheng Yong via Linux-f2fs-devel From: Sheng Yong Reply-To: Sheng Yong Cc: linux-f2fs-devel@lists.sourceforge.net Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net This patch enables injecting summary block or summary entry. print_raw_sum_entry_info() and print_sum_footer_info() are added to show values of the ssa entry and summary footer. The meanings of options are: * ssa: means ssa entry is injected. The members could be injected in cp contains: * entry_type: summary block footer entry_type * check_sum: summary block footer check_sum * nid: summary entry nid * version: summary entry version * ofs_in_node: summary entry ofs_in_node Signed-off-by: Sheng Yong Reviewed-by: Chao Yu --- fsck/inject.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++ fsck/inject.h | 1 + 2 files changed, 124 insertions(+) diff --git a/fsck/inject.c b/fsck/inject.c index 0fe9b9d..7df9334 100644 --- a/fsck/inject.c +++ b/fsck/inject.c @@ -43,6 +43,25 @@ static void print_raw_sit_entry_info(struct f2fs_sit_entry *se) DISP_u64(se, mtime); } +static void print_raw_sum_entry_info(struct f2fs_summary *sum) +{ + if (!c.dbg_lv) + return; + + DISP_u32(sum, nid); + DISP_u8(sum, version); + DISP_u16(sum, ofs_in_node); +} + +static void print_sum_footer_info(struct summary_footer *footer) +{ + if (!c.dbg_lv) + return; + + DISP_u8(footer, entry_type); + DISP_u32(footer, check_sum); +} + void inject_usage(void) { MSG(0, "\nUsage: inject.f2fs [options] device\n"); @@ -59,6 +78,7 @@ void inject_usage(void) MSG(0, " --cp <0|1|2> --mb [--idx ] --val inject checkpoint\n"); MSG(0, " --nat <0|1|2> --mb --nid --val inject nat entry\n"); MSG(0, " --sit <0|1|2> --mb --blk [--idx ] --val inject sit entry\n"); + MSG(0, " --ssa --mb --blk [--idx ] --val inject summary entry\n"); MSG(0, " --dry-run do not really inject\n"); exit(1); @@ -120,6 +140,17 @@ static void inject_sit_usage(void) MSG(0, " mtime: inject sit entry mtime\n"); } +static void inject_ssa_usage(void) +{ + MSG(0, "inject.f2fs --ssa --mb --blk [--idx ] --val inject summary entry\n"); + MSG(0, "[mb]:\n"); + MSG(0, " entry_type: inject summary block footer entry_type\n"); + MSG(0, " check_sum: inject summary block footer check_sum\n"); + MSG(0, " nid: inject summary entry nid selected by --idx blk, opt->blk); break; + case 12: + opt->ssa = true; + MSG(0, "Info: inject ssa\n"); + break; case 'd': if (optarg[0] == '-' || !is_digits(optarg)) return EWRONG_OPT; @@ -227,6 +263,9 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) } else if (opt->sit >= 0) { inject_sit_usage(); exit(0); + } else if (opt->ssa) { + inject_ssa_usage(); + exit(0); } return EUNKNOWN_OPT; } @@ -552,6 +591,88 @@ static int inject_sit(struct f2fs_sb_info *sbi, struct inject_option *opt) return 0; } +static int inject_ssa(struct f2fs_sb_info *sbi, struct inject_option *opt) +{ + struct f2fs_summary_block *sum_blk; + struct summary_footer *footer; + struct f2fs_summary *sum; + u32 segno, offset; + block_t ssa_blkaddr; + int type; + int ret; + + if (!f2fs_is_valid_blkaddr(sbi, opt->blk, DATA_GENERIC)) { + ERR_MSG("Invalid blkaddr %#x (valid range [%#x:%#lx])\n", + opt->blk, SM_I(sbi)->main_blkaddr, + (unsigned long)le64_to_cpu(F2FS_RAW_SUPER(sbi)->block_count)); + return -ERANGE; + } + + segno = GET_SEGNO(sbi, opt->blk); + offset = OFFSET_IN_SEG(sbi, opt->blk); + + sum_blk = get_sum_block(sbi, segno, &type); + sum = &sum_blk->entries[offset]; + footer = F2FS_SUMMARY_BLOCK_FOOTER(sum_blk); + + if (!strcmp(opt->mb, "entry_type")) { + MSG(0, "Info: inject summary block footer entry_type of " + "block 0x%x: %d -> %d\n", opt->blk, footer->entry_type, + (unsigned char)opt->val); + footer->entry_type = (unsigned char)opt->val; + } else if (!strcmp(opt->mb, "check_sum")) { + MSG(0, "Info: inject summary block footer check_sum of " + "block 0x%x: 0x%x -> 0x%x\n", opt->blk, + le32_to_cpu(footer->check_sum), (u32)opt->val); + footer->check_sum = cpu_to_le32((u32)opt->val); + } else { + if (opt->idx == -1) { + MSG(0, "Info: auto idx = %u\n", offset); + opt->idx = offset; + } + if (opt->idx >= ENTRIES_IN_SUM) { + ERR_MSG("invalid idx %u of entries[]\n", opt->idx); + ret = -EINVAL; + goto out; + } + sum = &sum_blk->entries[opt->idx]; + if (!strcmp(opt->mb, "nid")) { + MSG(0, "Info: inject summary entry nid of " + "block 0x%x: 0x%x -> 0x%x\n", opt->blk, + le32_to_cpu(sum->nid), (u32)opt->val); + sum->nid = cpu_to_le32((u32)opt->val); + } else if (!strcmp(opt->mb, "version")) { + MSG(0, "Info: inject summary entry version of " + "block 0x%x: %d -> %d\n", opt->blk, + sum->version, (u8)opt->val); + sum->version = (u8)opt->val; + } else if (!strcmp(opt->mb, "ofs_in_node")) { + MSG(0, "Info: inject summary entry ofs_in_node of " + "block 0x%x: %d -> %d\n", opt->blk, + sum->ofs_in_node, (u16)opt->val); + sum->ofs_in_node = cpu_to_le16((u16)opt->val); + } else { + ERR_MSG("unknown or unsupported member \"%s\"\n", opt->mb); + ret = -EINVAL; + goto out; + } + + print_raw_sum_entry_info(sum); + } + + print_sum_footer_info(footer); + + ssa_blkaddr = GET_SUM_BLKADDR(sbi, segno); + ret = dev_write_block(sum_blk, ssa_blkaddr); + ASSERT(ret >= 0); + +out: + if (type == SEG_TYPE_NODE || type == SEG_TYPE_DATA || + type == SEG_TYPE_MAX) + free(sum_blk); + return ret; +} + int do_inject(struct f2fs_sb_info *sbi) { struct inject_option *opt = (struct inject_option *)c.private; @@ -565,6 +686,8 @@ int do_inject(struct f2fs_sb_info *sbi) ret = inject_nat(sbi, opt); else if (opt->sit >= 0) ret = inject_sit(sbi, opt); + else if (opt->ssa) + ret = inject_ssa(sbi, opt); return ret; } diff --git a/fsck/inject.h b/fsck/inject.h index ece4915..c828f3f 100644 --- a/fsck/inject.h +++ b/fsck/inject.h @@ -30,6 +30,7 @@ struct inject_option { int cp; /* which cp */ int nat; /* which nat pack */ int sit; /* which sit pack */ + bool ssa; }; void inject_usage(void); From patchwork Fri Jun 28 01:31:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sheng Yong X-Patchwork-Id: 13715366 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 lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A26A1C30653 for ; Fri, 28 Jun 2024 01:32:40 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-2.v29.lw.sourceforge.com) by sfs-ml-2.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1sN0Tf-0001Va-Lf; Fri, 28 Jun 2024 01:32:39 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-2.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sN0Td-0001V3-MG for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:38 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=MIME-Version:Content-Type:Content-Transfer-Encoding :References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=sJAUlyqq7STQw43aNIX3pt2Z4ocr0X9QP1Iw5EcaABw=; b=XjiRdKE4OIusAPQypd7lDDxmSc Gsl/4JWC53LYWHObzKGL54cR4fq5IR1bQxDiy1aSlue+94HyFk5Pb1rscvcqNe6UoBClPGR76Ooo+ m1VnAXeoEtq4N77ZA2Iyhndq19dA6CzgTFzsH/TKH/HMXeXIcVRBVaI9x69zwoDSiZQQ=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=MIME-Version:Content-Type:Content-Transfer-Encoding:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=sJAUlyqq7STQw43aNIX3pt2Z4ocr0X9QP1Iw5EcaABw=; b=GKKykp4E1Xz0Pd2y75t0r2ugFJ eKIbZiG3ZcC6VzW7gtOBKJGe2IykqoSlrD4L04dPrWiVf8WP7kQN5PJmPn/ixK13et/Fb7GlLz37i D3FSp0d/zAMQbSYWycNWzjewajj/x1DNwJIgHAfVj2QVQjNySpMd5GU5XQQ2OUfaowCA=; Received: from mail-tyzapc01on2044.outbound.protection.outlook.com ([40.107.117.44] helo=APC01-TYZ-obe.outbound.protection.outlook.com) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sN0Td-0006JV-Ox for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:37 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=kqaEnzhMvOJ0LfSEOym6JYXcZsTv84EUQFrVd98hIXyCRFBAslKi1LpB0XhaoUoNNbOpNVfPvbWu6C6rmoK0ubbW8u0N+B4UfOUGHdhwEDoJ2ok9Qx9+x+7L/COgru8p4Xru7/VWfKbbpigjCL4rSiNC7xvmdqkw84zT9JZihb+NHoHT+1q6GA3B47N3cJHFmU2uNGiFTb4ptk/HT3EnW7vUE6CdUJFkkjIBr7D/4te6gC67KNYTrzhr+/Hp+EwqarkGN+DdgDUbTOQD0T4SKnNk/JIAwrTi5Mh08yo+K/uEV+Qo24pM+N7OXhm1nWYYDSwPlBVqw33xsM4yJKy2pg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=sJAUlyqq7STQw43aNIX3pt2Z4ocr0X9QP1Iw5EcaABw=; b=P9FEw3sf5orXyG6D+lk5XF5tTSE6P4oR+gqPqZCIIOmZOV90miTVzkmBdrPVWQs+YJvW5AZod/pfQZwL7FwnMH9f/rYMy9B154/s+9ZudBK8Spjxs10WQ3aIkgVpmN81xFO3xqPbsxFAcFs9F+ZE65Zdn50hTAtgS85qQtAcxxYpnHVqy/RFPtNJ8lLcPyDc0+phcxG8T9VICV2SgGc0jnjv9rWYUd+Wq+jy/lsCEmJpa92b0ANmuiW1pY2GLX+M1EL+Zr74XlgKIGGtUsaID0cPDRhPpFrou5VAMJevC0zEFPHlODKqZV+S5QUqsKKXghL3QEIMLx1T+iOtY8k3ig== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oppo.com; dmarc=pass action=none header.from=oppo.com; dkim=pass header.d=oppo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oppo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=sJAUlyqq7STQw43aNIX3pt2Z4ocr0X9QP1Iw5EcaABw=; b=tOhWOLu7esb5qpnpN9YylUjw4LS9v6MlKjQ8gUerWBityAWUrAsxhqzr4dniBfHvKCaH0qyqff9RFY/tSvoNabPrlZFbAbc1PXRWKkVwsC7jYgjxkSCz0mFMV5zKZOqoTDIuVK++r4mwGJGMybdIRZ2d9KSagLEQW+Ced+phk8M= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oppo.com; Received: from SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) by TYZPR02MB6576.apcprd02.prod.outlook.com (2603:1096:400:41a::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.35; Fri, 28 Jun 2024 01:32:27 +0000 Received: from SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796]) by SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796%7]) with mapi id 15.20.7698.025; Fri, 28 Jun 2024 01:32:27 +0000 To: chao@kernel.org, jaegeuk@kernel.org Date: Fri, 28 Jun 2024 09:31:38 +0800 Message-Id: <20240628013140.2444209-9-shengyong@oppo.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240628013140.2444209-1-shengyong@oppo.com> References: <20240628013140.2444209-1-shengyong@oppo.com> X-ClientProxiedBy: SI2PR01CA0047.apcprd01.prod.exchangelabs.com (2603:1096:4:193::10) To SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SEYPR02MB6014:EE_|TYZPR02MB6576:EE_ X-MS-Office365-Filtering-Correlation-Id: b12dc162-89f5-4dc2-1246-08dc97122b5c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: SegY68kVVo38KIvg2o/16fJ0bOfmZJhF+wNq35ZOZMj6f7DcaqKiUtl6bI+R22QlP90dNg/DeJ2Jzy/sHbORqBzqTRjNZO6wnQHahGzW1wz5Bh7NWovIHv+OcaBiZZVqy3gbzEEy+0VflmANl+cEu/qbu7wRAAHE0vfzuZ8vtJGcUCuWhnobieGi47TyhjhWnW74gst7GyWArECBOqWbBBAuT+3ispvhKkTkqhP4UsiMkBdaHRurmYnOfGvhu2t5ZNRm8y/ogRLZ1rdYW7Es+fimOtD3v4RO5yZr8Lw4hswMpJqlQ9wfchlfgEk9TgDVuXTulKynT1rf6d0jFPsYU8dyLLgFhBTnKFwlfYV83F0xwyXeaubW1xYC8G8Z9/1xc6KvPvEdB9aVGZaTsfdE+ZYE29t4w00jlHCj8Y7bhvM803Y/98mZClz1iIvFCADvXscTB8jWGYH17n5VeQcHN7oaW7WR1O+4/BxkiuPUYNwQ5RG2MfkiJnDqWJVMh81tL4RNLdZSoqHYEZB/BFBcMXj0BeQofpIJLmzeus7MFxCZfouFQSNRMQibeFne/yHgrsz021qaMdl2TZLTmb5dEcAUQgx/iC8pW9U3wiywIwG6xWqHedKYmaLYzpZlE6spn1H3j0NPWaJRT4NmpNy7a4fpmTfcrDsfe13EURLpMoq8Hl59zRiMv6wcoBlzLXAn5ZPY+KcYPBBK281NS10urscmVqY6MPBJ1xCvJTak5IK3qrHhCfrxFNRlQ/vuGLnwobX1kwQqy57FIz74s2/B9H99eRJ9f/HuZlwyCX5YmhfXUrOBBcSRlCSH9EFXHrzrMhqutnxRuy3rfeSCgD5fRmwdceLJUypHhvZGyKoWB9efhaeXo5jdh00WdoFXSjUhKad1TNYGDFKilgOw9x7N3CjQMdS0IahUGzna4JfxPWhBo1HSH5BUtYcXLJScqtiuueEOHxzA9kOlVViO32QLuPItnkK6S0yWPugFrKys3K5CKDIv3qbfQHXlgEgp8vu9lL+rpLVwOvF5tFL5HfimrLP9qaXdDpgPYjgfcmgpuoWLVY7CwqgiQ5zhVlvWvfgsWwDm3z+2VCuat1hFSHgLV65hem+y5MYy08zXiKZ87hVDy/h0vu0MGXqy5TS2/Dg9jmkEYx5Eb8mSfjF+yHMLYJLn7am07VpC3oVpZaLjRbCzIh1fPEtFU2tUOZH8RD/9ACUWnMw5MYeINN3JCL52KcoQz1mnn3InToa+XrJXDBTxG5n+/IekAVRVRccpyRBsLYTemrbiJJ0d8beh6qh9VVvLbWZwSgY+mqd6aOElkjJgiBN5jaJWQY1IqGlgyxLu5VNIpPn40oHO92iFikXFriuv97AIdC2S1IjlBCIw82q65Dib9c6GrFKNIWpA+H5GOP7VuIKPEtH2Xu4JK2TLsA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEYPR02MB6014.apcprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(52116014)(376014)(1800799024)(38350700014); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: tLon4rn5Q6m93wGN6l8+pWPo25M+Tn8HUzlfIr23TeMPDIQ65FNWNksTgliK+y7UFV1WCcWMgwtsYBkDbnSJUNeVXvsSjJc91l+RwSKoFyAAsN+aqCpFqxz1CIFPn2qfR5el7nO6pjgfFSiUYXBeF3L1VFiipRu2hd0vMhGXLZxSKC51EOZz8ehLi2sDO3qA/JERfaUUoumlH5HYxEfw8n4fj+19NeY82vMG3rz0Ja7hdG/3btbDlkXY2lUdhYjZGewi1Q+iBfFvkAsQpOTIMmB/Z8yJ6aFy99o67Y3vS7x0QTHr9Vv47V9y56/3EFOAX9PItMUphmlCuhzIih4eYBzu3Dv3MFKmv+OAuwCTLgpFRXHryFmkvsJzuwetr44Spzoe/U0mrYNXjfb8xBAxcXsqQhvHNyQpA5T5J+Hx2Nlw1DdNykyLJGe3MMJezM4w7c4bB8Mer2l+QbQZJKHYj9CxjUI+eyJPU1bBalzgX+Zzw8xTAov5hTb+16y0UkCUok+TKlIhpcboaC6J9wB5s0/bomopPyQpSyqo1q9HMyjchjlykI4ZLxyGoeZRWak77mSAmglVO8FccNh3NdGEI/+VAOxvslJ2ZfHZttHS71PRI+pTrVvSr5o6vrrKziAbG5+mdq4Z28/tsnFTQE/tnkQQ3Po1vGN61Mgn+Dc5MctAHUuYuW0Ci+2Z2Z+CtpsXpfv3iMvhfA71Piphavn2xLZU384a3n4EXEnTwgXE5BaJmh0OVQuXKNFDGm1hhMD2vbJfe4h1NlJN3Yt+p04hG+0udv+vLcBVhhyARFwb5EZEO5KJqKsjdIv1pL4xDwj1U3qJ+xSGcOQ/6dsEvZ+ATSjjpczFTYq/GefPdg2FRIa2T6XbL+Tqh4WzXf358Oi4YoX6W46aOemgzTb1hHPa1Lq9uNj75Omq7Hs6mVk9v+aAA5ODbbK43Ya6yEEtOJ2CjyFmFuiuFv9V6TdVqS94huossnE3Qm2+WrdRHtC0+cnwFHqltSwq2Uk63pTHxsUSZt5pThpM+uCoui1o23s+pHKx6wqOyJxk7mOg8CD/bMBj5yali36kGv2F4sHqjaZBwl6EzqtQEhAcGneYdeVEmjEdV6CL6mvOQcLMmBWm6QM2YHDKX0iC9u1dZVubCA+lhyhfSwCTUax5Zt+kT/bmYcPB9pXGXGhDPzPZ9OPnhDLhE7FnOUlmBgl1zjkvZUXBesjAuoUcTxjpnc9Fb+Y+fokZVR2iTst0wCUnBkcPTlJhKqcM3N5TqhqSsBYmOFDYoT8aqPrv2bVnZXGkv5pdtEC26xSILCc8x4j3ZpR2oH64GY9bCENJsmMX/bfHcVEafPyUDUls+akW5T36EptEZ0PynaI/aDIRo+0X0vCRd+SxZK3JAmQ2ZR8PBDdwB3fv9vu/KnsgoNLSqm8X2TTXq1IMufQMgb6NqiN27VEqqAlYl1skwLnlOhDcL0RkepbEkI8ALDpeGErE6ljAoCo2Oo49gUrjkKM1Y3iMquNdTpLPQ9poBnokFV15PIwY7nzZuQfTy0UqbnqQDTYrAWSlHM4BAX106oHb6Lbh1ggxDXp313ZYbB5/Hvtk3XSsL6eb X-OriginatorOrg: oppo.com X-MS-Exchange-CrossTenant-Network-Message-Id: b12dc162-89f5-4dc2-1246-08dc97122b5c X-MS-Exchange-CrossTenant-AuthSource: SEYPR02MB6014.apcprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2024 01:32:27.4221 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f1905eb1-c353-41c5-9516-62b4a54b5ee6 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: e3B+iCWee6dQaty7K3BWSZV9ww/obhzemYa48zQbNHVeMDpFIjus7MXu63uGmBJLgBsctp09/axZGvJdwnB5cQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR02MB6576 X-Headers-End: 1sN0Td-0006JV-Ox Subject: [f2fs-dev] [RFC PATCH v2 08/10] inject.f2fs: add node injection X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Sheng Yong via Linux-f2fs-devel From: Sheng Yong Reply-To: Sheng Yong Cc: linux-f2fs-devel@lists.sourceforge.net Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net This patch enables injecting node block. print_node_footer_info() is added to show values of node footer. The meanings of options are: * node: means node is injected. The members could be injected in cp contains: * nid: node footer nid * ino: node footer ino * flag: node footer flag * cp_ver: node footer cp_ver * next_blkaddr: node footer next_blkaddr * i_mode: inode i_mode * i_advise: inode i_advise * i_inline: inode i_inline * i_links: inode i_links * i_size: inode i_size * i_blocks: inode i_blocks * i_extra_isize: inode i_extra_isize * i_inode_checksum: inode i_inode_checksum * i_addr: inode i_addr array * i_nid: inode i_nid array * addr: {in}direct node nid/addr array Signed-off-by: Sheng Yong Reviewed-by: Chao Yu --- fsck/inject.c | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++ fsck/inject.h | 1 + 2 files changed, 214 insertions(+) diff --git a/fsck/inject.c b/fsck/inject.c index 7df9334..c48728e 100644 --- a/fsck/inject.c +++ b/fsck/inject.c @@ -62,6 +62,18 @@ static void print_sum_footer_info(struct summary_footer *footer) DISP_u32(footer, check_sum); } +static void print_node_footer_info(struct node_footer *footer) +{ + if (!c.dbg_lv) + return; + + DISP_u32(footer, nid); + DISP_u32(footer, ino); + DISP_u32(footer, flag); + DISP_u64(footer, cp_ver); + DISP_u32(footer, next_blkaddr); +} + void inject_usage(void) { MSG(0, "\nUsage: inject.f2fs [options] device\n"); @@ -79,6 +91,7 @@ void inject_usage(void) MSG(0, " --nat <0|1|2> --mb --nid --val inject nat entry\n"); MSG(0, " --sit <0|1|2> --mb --blk [--idx ] --val inject sit entry\n"); MSG(0, " --ssa --mb --blk [--idx ] --val inject summary entry\n"); + MSG(0, " --node --mb --nid [--idx ] --val inject node\n"); MSG(0, " --dry-run do not really inject\n"); exit(1); @@ -151,6 +164,28 @@ static void inject_ssa_usage(void) MSG(0, " ofs_in_node: inject summary entry ofs_in_node selected by --idx --nid [--idx ] --val inject node\n"); + MSG(0, "[mb]:\n"); + MSG(0, " nid: inject node footer nid\n"); + MSG(0, " ino: inject node footer ino\n"); + MSG(0, " flag: inject node footer flag\n"); + MSG(0, " cp_ver: inject node footer cp_ver\n"); + MSG(0, " next_blkaddr: inject node footer next_blkaddr\n"); + MSG(0, " i_mode: inject inode i_mode\n"); + MSG(0, " i_advise: inject inode i_advise\n"); + MSG(0, " i_inline: inject inode i_inline\n"); + MSG(0, " i_links: inject inode i_links\n"); + MSG(0, " i_size: inject inode i_size\n"); + MSG(0, " i_blocks: inject inode i_blocks\n"); + MSG(0, " i_extra_isize: inject inode i_extra_isize\n"); + MSG(0, " i_inode_checksum: inject inode i_inode_checksum\n"); + MSG(0, " i_addr: inject inode i_addr array selected by --idx \n"); + MSG(0, " i_nid: inject inode i_nid array selected by --idx \n"); + MSG(0, " addr: inject {in}direct node nid/addr array selected by --idx \n"); +} + int inject_parse_options(int argc, char *argv[], struct inject_option *opt) { int o = 0; @@ -169,6 +204,7 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) {"sit", required_argument, 0, 10}, {"blk", required_argument, 0, 11}, {"ssa", no_argument, 0, 12}, + {"node", no_argument, 0, 13}, {0, 0, 0, 0} }; @@ -240,6 +276,10 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) opt->ssa = true; MSG(0, "Info: inject ssa\n"); break; + case 13: + opt->node = true; + MSG(0, "Info: inject node\n"); + break; case 'd': if (optarg[0] == '-' || !is_digits(optarg)) return EWRONG_OPT; @@ -266,6 +306,9 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) } else if (opt->ssa) { inject_ssa_usage(); exit(0); + } else if (opt->node) { + inject_node_usage(); + exit(0); } return EUNKNOWN_OPT; } @@ -673,6 +716,174 @@ out: return ret; } +static int inject_inode(struct f2fs_sb_info *sbi, struct f2fs_node *node, + struct inject_option *opt) +{ + struct f2fs_inode *inode = &node->i; + + if (!strcmp(opt->mb, "i_mode")) { + MSG(0, "Info: inject inode i_mode of nid %u: 0x%x -> 0x%x\n", + opt->nid, le16_to_cpu(inode->i_mode), (u16)opt->val); + inode->i_mode = cpu_to_le16((u16)opt->val); + } else if (!strcmp(opt->mb, "i_advise")) { + MSG(0, "Info: inject inode i_advise of nid %u: 0x%x -> 0x%x\n", + opt->nid, inode->i_advise, (u8)opt->val); + inode->i_advise = (u8)opt->val; + } else if (!strcmp(opt->mb, "i_inline")) { + MSG(0, "Info: inject inode i_inline of nid %u: 0x%x -> 0x%x\n", + opt->nid, inode->i_inline, (u8)opt->val); + inode->i_inline = (u8)opt->val; + } else if (!strcmp(opt->mb, "i_links")) { + MSG(0, "Info: inject inode i_links of nid %u: %u -> %u\n", + opt->nid, le32_to_cpu(inode->i_links), (u32)opt->val); + inode->i_links = cpu_to_le32((u32)opt->val); + } else if (!strcmp(opt->mb, "i_size")) { + MSG(0, "Info: inject inode i_size of nid %u: %lu -> %lu\n", + opt->nid, le64_to_cpu(inode->i_size), (u64)opt->val); + inode->i_size = cpu_to_le64((u64)opt->val); + } else if (!strcmp(opt->mb, "i_blocks")) { + MSG(0, "Info: inject inode i_blocks of nid %u: %lu -> %lu\n", + opt->nid, le64_to_cpu(inode->i_blocks), (u64)opt->val); + inode->i_blocks = cpu_to_le64((u64)opt->val); + } else if (!strcmp(opt->mb, "i_extra_isize")) { + /* do not care if F2FS_EXTRA_ATTR is enabled */ + MSG(0, "Info: inject inode i_extra_isize of nid %u: %d -> %d\n", + opt->nid, le16_to_cpu(inode->i_extra_isize), (u16)opt->val); + inode->i_extra_isize = cpu_to_le16((u16)opt->val); + } else if (!strcmp(opt->mb, "i_inode_checksum")) { + MSG(0, "Info: inject inode i_inode_checksum of nid %u: " + "0x%x -> 0x%x\n", opt->nid, + le32_to_cpu(inode->i_inode_checksum), (u32)opt->val); + inode->i_inode_checksum = cpu_to_le32((u32)opt->val); + } else if (!strcmp(opt->mb, "i_addr")) { + /* do not care if it is inline data */ + if (opt->idx >= DEF_ADDRS_PER_INODE) { + ERR_MSG("invalid index %u of i_addr[]\n", opt->idx); + return -EINVAL; + } + MSG(0, "Info: inject inode i_addr[%d] of nid %u: " + "0x%x -> 0x%x\n", opt->idx, opt->nid, + le32_to_cpu(inode->i_addr[opt->idx]), (u32)opt->val); + inode->i_addr[opt->idx] = cpu_to_le32((block_t)opt->val); + } else if (!strcmp(opt->mb, "i_nid")) { + if (opt->idx >= 5) { + ERR_MSG("invalid index %u of i_nid[]\n", opt->idx); + return -EINVAL; + } + MSG(0, "Info: inject inode i_nid[%d] of nid %u: " + "0x%x -> 0x%x\n", opt->idx, opt->nid, + le32_to_cpu(F2FS_INODE_I_NID(inode, opt->idx)), + (u32)opt->val); + F2FS_INODE_I_NID(inode, opt->idx) = cpu_to_le32((nid_t)opt->val); + } else { + ERR_MSG("unknown or unsupported member \"%s\"\n", opt->mb); + return -EINVAL; + } + + if (c.dbg_lv > 0) + print_node_info(sbi, node, 1); + + return 0; +} + +static int inject_index_node(struct f2fs_sb_info *sbi, struct f2fs_node *node, + struct inject_option *opt) +{ + struct direct_node *dn = &node->dn; + + if (strcmp(opt->mb, "addr")) { + ERR_MSG("unknown or unsupported member \"%s\"\n", opt->mb); + return -EINVAL; + } + + if (opt->idx >= DEF_ADDRS_PER_BLOCK) { + ERR_MSG("invalid index %u of nid/addr[]\n", opt->idx); + return -EINVAL; + } + + MSG(0, "Info: inject node nid/addr[%d] of nid %u: 0x%x -> 0x%x\n", + opt->idx, opt->nid, le32_to_cpu(dn->addr[opt->idx]), + (block_t)opt->val); + dn->addr[opt->idx] = cpu_to_le32((block_t)opt->val); + + if (c.dbg_lv > 0) + print_node_info(sbi, node, 1); + + return 0; +} + +static int inject_node(struct f2fs_sb_info *sbi, struct inject_option *opt) +{ + struct f2fs_super_block *sb = sbi->raw_super; + struct node_info ni; + struct f2fs_node *node_blk; + struct node_footer *footer; + int ret; + + if (!IS_VALID_NID(sbi, opt->nid)) { + ERR_MSG("Invalid nid %u range [%u:%lu]\n", opt->nid, 0, + NAT_ENTRY_PER_BLOCK * + ((get_sb(segment_count_nat) << 1) << + sbi->log_blocks_per_seg)); + return -EINVAL; + } + + node_blk = calloc(F2FS_BLKSIZE, 1); + ASSERT(node_blk); + + get_node_info(sbi, opt->nid, &ni); + ret = dev_read_block(node_blk, ni.blk_addr); + ASSERT(ret >= 0); + footer = F2FS_NODE_FOOTER(node_blk); + + if (!strcmp(opt->mb, "nid")) { + MSG(0, "Info: inject node footer nid of nid %u: %u -> %u\n", + opt->nid, le32_to_cpu(footer->nid), (u32)opt->val); + footer->nid = cpu_to_le32((u32)opt->val); + } else if (!strcmp(opt->mb, "ino")) { + MSG(0, "Info: inject node footer ino of nid %u: %u -> %u\n", + opt->nid, le32_to_cpu(footer->ino), (u32)opt->val); + footer->ino = cpu_to_le32((u32)opt->val); + } else if (!strcmp(opt->mb, "flag")) { + MSG(0, "Info: inject node footer flag of nid %u: " + "0x%x -> 0x%x\n", opt->nid, le32_to_cpu(footer->flag), + (u32)opt->val); + footer->flag = cpu_to_le32((u32)opt->val); + } else if (!strcmp(opt->mb, "cp_ver")) { + MSG(0, "Info: inject node footer cp_ver of nid %u: " + "0x%lx -> 0x%lx\n", opt->nid, le64_to_cpu(footer->cp_ver), + (u64)opt->val); + footer->cp_ver = cpu_to_le64((u64)opt->val); + } else if (!strcmp(opt->mb, "next_blkaddr")) { + MSG(0, "Info: inject node footer next_blkaddr of nid %u: " + "0x%x -> 0x%x\n", opt->nid, + le32_to_cpu(footer->next_blkaddr), (u32)opt->val); + footer->next_blkaddr = cpu_to_le32((u32)opt->val); + } else if (ni.nid == ni.ino) { + ret = inject_inode(sbi, node_blk, opt); + } else { + ret = inject_index_node(sbi, node_blk, opt); + } + if (ret) + goto out; + + print_node_footer_info(footer); + + /* + * if i_inode_checksum is injected, should call update_block() to + * avoid recalculate inode checksum + */ + if (ni.nid == ni.ino && strcmp(opt->mb, "i_inode_checksum")) + ret = update_inode(sbi, node_blk, &ni.blk_addr); + else + ret = update_block(sbi, node_blk, &ni.blk_addr, NULL); + ASSERT(ret >= 0); + +out: + free(node_blk); + return ret; +} + int do_inject(struct f2fs_sb_info *sbi) { struct inject_option *opt = (struct inject_option *)c.private; @@ -688,6 +899,8 @@ int do_inject(struct f2fs_sb_info *sbi) ret = inject_sit(sbi, opt); else if (opt->ssa) ret = inject_ssa(sbi, opt); + else if (opt->node) + ret = inject_node(sbi, opt); return ret; } diff --git a/fsck/inject.h b/fsck/inject.h index c828f3f..9b14c31 100644 --- a/fsck/inject.h +++ b/fsck/inject.h @@ -31,6 +31,7 @@ struct inject_option { int nat; /* which nat pack */ int sit; /* which sit pack */ bool ssa; + bool node; }; void inject_usage(void); From patchwork Fri Jun 28 01:31:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sheng Yong X-Patchwork-Id: 13715372 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 lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 139B2C3065A for ; Fri, 28 Jun 2024 01:32:44 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-3.v29.lw.sourceforge.com) by sfs-ml-3.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1sN0Tk-00033I-9v; Fri, 28 Jun 2024 01:32:43 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-3.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sN0Te-00032p-MC for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:38 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=MIME-Version:Content-Type:Content-Transfer-Encoding :References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=1CZ5GZZ/IfmA17NR5n5b611q2/g9Zfy47NA+HpUf5Yc=; b=dYAPSl3dNUnWnXCigfbRgtmByL N6Z/uheolYMH9Yc67nkok8AwP2NhnWsf9MlKAwJY9sCjTEseY5p8N7qXdfTnQgUiwUACvSByDv9Vh nnyedooOM71BOXUIYbkGXoe2MQlIyHz+Puuj3DQRREBQvFVoS5/OLStgMx74GZyTvF5c=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=MIME-Version:Content-Type:Content-Transfer-Encoding:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=1CZ5GZZ/IfmA17NR5n5b611q2/g9Zfy47NA+HpUf5Yc=; b=AMV1AK0BzCualEf+qdOPL9hm2k IkRgVWfUPoDAz66L7QKmIvc/ZaUntN6CH1VPRL0BfRQFaqgDXKNIH5IggIRsO02vOcA+uj1fZZ0Xc g3gdObi83RhrelbUc+YoG3sS+Po9za5pFfQaIO7iErVxrGbUXH25xt+LGfXeWI1wlads=; Received: from mail-tyzapc01on2065.outbound.protection.outlook.com ([40.107.117.65] helo=APC01-TYZ-obe.outbound.protection.outlook.com) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sN0Td-0006Jd-UV for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:38 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CtyB8Z8MCKSppseo3mdgOWFLmC32Wlb+Cn6CRb9YU0/fOinevqwbZmiC6ZcdAOSM3Ex7WT6qa3EGqGlIQYBrweKcoTcAg/lEUe+jGH1RfBIDpl0pEpxrUi/Vwk0wIy9DEsRidFg825N8gxJm0+U1SuFkEfq+bGJ0nXocfelbPuztDHgbr4p4NwlR47CrQ23CG/0ngwZQ2ANMGNDETUdo48zWp115VqJQtB7JKoRCHHYsPzakRr+q8J4CNBRzkpqhcZBFOkkNj67Hm3v4ny6QcJf59Ov4Z18enFUwB0/ws1Udvky3C7/Ig6xIAl8PFIZTolKnApAiAdLtpUtM+qjnOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1CZ5GZZ/IfmA17NR5n5b611q2/g9Zfy47NA+HpUf5Yc=; b=KmQhw7p2VXRV443j2a+CTG/ZHSu+RdwVfGzF57pbumhxXrWhigBPadBF+OcCunwvM3Z1Hy2trEdTEgZvQ2iQ7/uEy8RUzBPqQnxLxqYwD3x3t/0uDmwBbefnCzicZFcBWDRMrJaRN5XLof+Y2+KYQkTKY1TKpxP5+7ViZgWiFa+alI3lhX41VA9o2rOSjouzxVskyScpFdfmB159Nxbft2e18fP6x2Jz6V6yjBBznVL25h12Thfq6uZwJY+u1IifOP7kmwkcbLG/6+GvIn6E9tSdHUJvU3VxsTCANL9bOwiKfUh7ScpMwpemLRQCqJPy0Zfdx6XTVjHnU82Kxqqj2w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oppo.com; dmarc=pass action=none header.from=oppo.com; dkim=pass header.d=oppo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oppo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1CZ5GZZ/IfmA17NR5n5b611q2/g9Zfy47NA+HpUf5Yc=; b=Zt7N068ob2PJBiCy11MGWLOH+PpGcH/1XlKlI6rxCBKid8UmHYlWT4cciB0KhLTV0/G+iuojEyvgz4ics3wEk+iIP1V72dLvI+xNDB8BiYsp4qcs1CEfYbO0cC3TWm/Zt2WMZbCdevtaHQXiC6x8+NQyBpfxN7tY4PLoA4I8jJY= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oppo.com; Received: from SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) by TYZPR02MB6576.apcprd02.prod.outlook.com (2603:1096:400:41a::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.35; Fri, 28 Jun 2024 01:32:28 +0000 Received: from SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796]) by SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796%7]) with mapi id 15.20.7698.025; Fri, 28 Jun 2024 01:32:28 +0000 To: chao@kernel.org, jaegeuk@kernel.org Date: Fri, 28 Jun 2024 09:31:39 +0800 Message-Id: <20240628013140.2444209-10-shengyong@oppo.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240628013140.2444209-1-shengyong@oppo.com> References: <20240628013140.2444209-1-shengyong@oppo.com> X-ClientProxiedBy: SI2PR01CA0047.apcprd01.prod.exchangelabs.com (2603:1096:4:193::10) To SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SEYPR02MB6014:EE_|TYZPR02MB6576:EE_ X-MS-Office365-Filtering-Correlation-Id: f81f2389-ec46-4169-7fee-08dc97122c24 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: NRvu3/4zJITrdE6sDa6RAX8j2Ygv8gVMquw9s6c0pY7yGJfnxAESfd40byB81S1Z1GemOzmPCC8FK9MI3C3WN8Dt/yp6DHNNcM09nCC3XuW7NG5TNkKPTnN2YYzwmg6h3os1WjHeJfB13ameALasmutfSKe0F7MkQjwcAvVsCgzx2/Sqz5LA5xr4C77XsHKkW9QpS1TiwpqqU2NoEvrQBQOFlm6yRASgedbF7SHzGx1bPzAqQvewm+iddIqXBrqfRV+i0C7h+/X6FaQ5dLshKP8NXle42VGwFaSQoTdGvtAVFqz56zzdAtUomZdtAlfF6VtZnyLH99IZUNnK+jvIxXN7YaRN3+euA5vyqxr692sLGFlyRCggDrFKkwJ64UDWvDVnlj+vV1Q5SIHDBhUx9mLVkNM+/Pu8USQDUHAkarja4mYM3HUDGhajK0ZJ9t56aVCQFHc7d+nyqzFEbCUDXN4FeCVvg/W41R7yPuZz8ioUpXE517YVtmoR0dFJdWAaJd1pW7X3WXT7bQEHDDw+GL793BL6O4VshplTij7UO6zAdINNAwGu0WOfd2mz95BZreEw74JFvB4bTJwN52T+MJPpppfq5TeATYxpCVdqyxkTWhFPXxxi/7RCs1m59BJJ0C5pYFu+cHs2yQEj1u8mg7i2QDrlB5XiRM5/ZuVw4ZC2lCGlSE6JR09rAI6EYwASv+dBBxsP36VwCGysEZTspmA0pGFJtsqzAMXLzA/VZE9PnSHHX3b8+yrECMsGMRtwHdk7t8e2fFNLkxjrF6KbH/GjgIHH/jQR1eEA73huBe+X/POnOyhv5uJC4xZuPtYSvVZl3Z0VSvabSduzxw1acq9CkpSf47uy2TRhvr+NcVLUGMqS+Y3hm0sWSWXJ5zck8/VFyew626+Im4M1R8D7jCWe6FHBsq3+ouCsKCYqqhlxb6iD1hoOjCoDkY9OhYTpR94O2vGT8XLZssSUymlmMbNLFeYXxpwOWijuTcg8NsB4u9JiQCFI4sCpUgrV6RubxK86inbfsQgz9BnoOIqA6Je/xgaahiS7FjnoeQP9TGv8RYtczJwbzwGjvV1ISzdPvVKLsXNq89NeQ2hQynKX7ouJ08J9PC2+1QbnZu+SHjcPMOdbxC/A11Mos+GULKKNa8KL5zi0D5xx55xtINutgF85N9Md6gyrqGQ9ugJEfRcJYmiOV5hsSVKSMr+IJUUdkV4gEOL0D1j+IU3KbAr9DNUtA87xSS2e6D6MaDE+l/u6C7rt1zwT7weahqTZ2Bm+KTZBDKlJqLGjPIs28frHwFHEeAi++jPYralxTsLBHCZsMu3kRIUAN7FO9cOOEHoJvCoh9qbjl/Rb7jCVp+FJiSK8xk+1oMNdg/463ijnv+pWiscTGRRXaLuFGEAKKEnz6dJUgDN9RPJPFtFmDolD5g== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEYPR02MB6014.apcprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(52116014)(376014)(1800799024)(38350700014); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: l4G63K3JvUz+V9PKnP5DmYCG+AJmQH+/CuTUh0kBHgTJkyFQN2xCfa51zZ5vPhprEILivfzyHVeqCPtj9YqTx4O+gSX2TSTHrH2HlU6YVMU93LA//IRVNc8v344msuv2wPDEQhasJTi6/z7uaFalq9j3mk0rVnq0tP5BgAnFxvODoHfHPZ94JKmxGEXL8aifuhAqHbD7l/Uvpo3ws8Mr1sYastbVnHurSaTTw0Okm59gIwIEml+wsaRrmUvI8C2ebUrsUany/ZJyKAkGrJnaRZ1Ie/U/fvntr52QIrXXvfZA8KlUE5P/kNTEkzw36iV+OAz/w/4hAeC5Us17NSaTwa9xuoRRkNLNXL2AgM3eurTCThxo97hh3SYlmP6JSImnw3U87eYNyygUJKkIFYjYxqMm8Blxn+k0XCd1KLT4d/t7fswOgS20mZIP9/oN10ZCiK0ZsGWY8akSdtiVg2ETSty4I25PJvEhCoERRA2K81TSbuqA/bhzJHqkhI3cnOxDYgYU20JuU7ZDBisU4Ms8woq/zKg1BVdKxKGRNxMFqCiOvgM7I3D020N7gje69KxUNsSk+a2xFMks784ErHqO9v5OaJiYr1ljEzEYp5S7f/m6/MhuZ3b4sPZZvpymATMp6PNYrc1kSvRN3Ag6uY7GLSEvP0DVFDAflxeLmH+F9qMMvWLFjSptQ8NczlEph/g5rSSOo5buE4IqkVwIlFmv38ND8I9KTztWIdg/yReDwvrgj9wNBbxeAk8+yDLG2knxggKzUnBWU2ZhRPyvry1N4hDTPrXSrzfWmRHTk+B8SX82sIFy68TI6+gDWletCn+SQXnvtxpwT3VjOoCNl/rYg5xXwEgYQOZ5Fjms/3/gWhcsnr1IrUL/OtmPUJfLBC/cpyV11V53i2cSLiYWPCg9ApbeJpKn3vP2jgPInvYtAhXHcEAl/YNEMvG3wbrb6QhZylevIVXFB8qptghhVmzwHxll714DiiEKlFRZ6Ni0kYrm8jSm4NvR604CEjy5JTSEPZ5XDf36Y5UYGpEdvD1+95GNb5pnCflla0BEFOovyTrD2fdygVntIyT/tkUyfmvCjxscJrP8xGVjyKhtJCoo6rD7l+hAfkEHCSA2O7RcXWz5rES26NKaJAlY+X0YrcbqV6/eD89GF+GX9Zt472ums1y8X/VhM0KqFdU6JFwwMiy9R+VDBegvIzpX0fUWcEI0jF2j3E40ySUcK6+RaB12IqD/YHVwkbxLY/Vn5arSz1Oidxfs5VGD43Uf0dPq6GXxYkXI6QSI9XKnPSf6TQjNU7SdKGSUydgRFqYi66PNcfj6XKnlph+bGc2RSLleMKDaYwWQITN9r+qmLY6aOhqitChKZ/7J4n3rNhfAw597VyVU3mZLi4cqMWTP+Hq4Qj8guLqHYT2A+VJmz7VzF9gdqZ5XslZk0PMMxcuOoBNuI01RIdCHSnCVENTwmw8T1gUQUVgAm2lOZaz9Hq0c31W0GZ//J/0OaHqOaVFTG4FJhO0DxS1zL69VxrEmklbBv9u2f4qc1Kna9aUORVWpT6Q+bzFHKRX1l/KQnH47riSAEf4EGGD7w8S+0uMmTKIYwpHy X-OriginatorOrg: oppo.com X-MS-Exchange-CrossTenant-Network-Message-Id: f81f2389-ec46-4169-7fee-08dc97122c24 X-MS-Exchange-CrossTenant-AuthSource: SEYPR02MB6014.apcprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2024 01:32:28.8246 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f1905eb1-c353-41c5-9516-62b4a54b5ee6 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: N/zwK3/eLfU1WT5L9arl8OSyUnELle+MWLb8FSHfgshTd9wUj+l8RGCYzj/g6M/JpSx0JCWgPEKzzST6ShPpLA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR02MB6576 X-Headers-End: 1sN0Td-0006Jd-UV Subject: [f2fs-dev] [RFC PATCH v2 09/10] inject.f2fs: add dentry injection X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Sheng Yong via Linux-f2fs-devel From: Sheng Yong Reply-To: Sheng Yong Cc: linux-f2fs-devel@lists.sourceforge.net Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net This patch enables injecting dentry block or dir entry. print_raw_dentry_info() is added to show values of node footer. The meanings of options are: * dent: means dentry is injected. The members could be injected in cp contains: * d_bitmap: dentry block d_bitmap of nid * d_hash: dentry hash * d_ino: dentry ino * d_ftype: dentry ftype Signed-off-by: Sheng Yong --- fsck/inject.c | 179 ++++++++++++++++++++++++++++++++++++++++++++++++++ fsck/inject.h | 1 + 2 files changed, 180 insertions(+) diff --git a/fsck/inject.c b/fsck/inject.c index c48728e..bae9afb 100644 --- a/fsck/inject.c +++ b/fsck/inject.c @@ -10,6 +10,7 @@ */ #include +#include "node.h" #include "inject.h" static void print_raw_nat_entry_info(struct f2fs_nat_entry *ne) @@ -74,6 +75,17 @@ static void print_node_footer_info(struct node_footer *footer) DISP_u32(footer, next_blkaddr); } +static void print_raw_dentry_info(struct f2fs_dir_entry *dentry) +{ + if (!c.dbg_lv) + return; + + DISP_u32(dentry, hash_code); + DISP_u32(dentry, ino); + DISP_u16(dentry, name_len); + DISP_u8(dentry, file_type); +} + void inject_usage(void) { MSG(0, "\nUsage: inject.f2fs [options] device\n"); @@ -92,6 +104,7 @@ void inject_usage(void) MSG(0, " --sit <0|1|2> --mb --blk [--idx ] --val inject sit entry\n"); MSG(0, " --ssa --mb --blk [--idx ] --val inject summary entry\n"); MSG(0, " --node --mb --nid [--idx ] --val inject node\n"); + MSG(0, " --dent --mb --nid [--idx ] --val inject ino's dentry\n"); MSG(0, " --dry-run do not really inject\n"); exit(1); @@ -186,6 +199,16 @@ static void inject_node_usage(void) MSG(0, " addr: inject {in}direct node nid/addr array selected by --idx \n"); } +static void inject_dent_usage(void) +{ + MSG(0, "inject.f2fs --dent --mb --nid [--idx ] --val inject dentry\n"); + MSG(0, "[mb]:\n"); + MSG(0, " d_bitmap: inject dentry block d_bitmap of nid\n"); + MSG(0, " d_hash: inject dentry hash\n"); + MSG(0, " d_ino: inject dentry ino\n"); + MSG(0, " d_ftype: inject dentry ftype\n"); +} + int inject_parse_options(int argc, char *argv[], struct inject_option *opt) { int o = 0; @@ -205,6 +228,7 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) {"blk", required_argument, 0, 11}, {"ssa", no_argument, 0, 12}, {"node", no_argument, 0, 13}, + {"dent", no_argument, 0, 14}, {0, 0, 0, 0} }; @@ -280,6 +304,10 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) opt->node = true; MSG(0, "Info: inject node\n"); break; + case 14: + opt->dent = true; + MSG(0, "Info: inject dentry\n"); + break; case 'd': if (optarg[0] == '-' || !is_digits(optarg)) return EWRONG_OPT; @@ -309,6 +337,9 @@ int inject_parse_options(int argc, char *argv[], struct inject_option *opt) } else if (opt->node) { inject_node_usage(); exit(0); + } else if (opt->dent) { + inject_dent_usage(); + exit(0); } return EUNKNOWN_OPT; } @@ -884,6 +915,152 @@ out: return ret; } +static int find_dir_entry(struct f2fs_dentry_ptr *d, nid_t ino) +{ + struct f2fs_dir_entry *de; + int slot = 0; + + while (slot < d->max) { + if (!test_bit_le(slot, d->bitmap)) { + slot++; + continue; + } + + de = &d->dentry[slot]; + if (le32_to_cpu(de->ino) == ino && de->hash_code != 0) + return slot; + if (de->name_len == 0) { + slot++; + continue; + } + slot += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len)); + } + + return -ENOENT; +} + +static int inject_dentry(struct f2fs_sb_info *sbi, struct inject_option *opt) +{ + struct node_info ni; + struct f2fs_node *node_blk = NULL; + struct f2fs_inode *inode; + struct f2fs_dentry_ptr d; + void *inline_dentry; + struct f2fs_dentry_block *dent_blk = NULL; + block_t addr = 0; + void *buf = NULL; + struct f2fs_dir_entry *dent = NULL; + struct dnode_of_data dn; + nid_t pino; + int slot = -ENOENT, ret; + + node_blk = malloc(F2FS_BLKSIZE); + ASSERT(node_blk != NULL); + + /* get child inode */ + get_node_info(sbi, opt->nid, &ni); + ret = dev_read_block(node_blk, ni.blk_addr); + ASSERT(ret >= 0); + pino = le32_to_cpu(node_blk->i.i_pino); + + /* get parent inode */ + get_node_info(sbi, pino, &ni); + ret = dev_read_block(node_blk, ni.blk_addr); + ASSERT(ret >= 0); + inode = &node_blk->i; + + /* find child dentry */ + if (inode->i_inline & F2FS_INLINE_DENTRY) { + inline_dentry = inline_data_addr(node_blk); + make_dentry_ptr(&d, node_blk, inline_dentry, 2); + addr = ni.blk_addr; + buf = node_blk; + + slot = find_dir_entry(&d, opt->nid); + if (slot >= 0) + dent = &d.dentry[slot]; + } else { + unsigned int level, dirlevel, nbucket; + unsigned long i, end; + + level = le32_to_cpu(inode->i_current_depth); + dirlevel = le32_to_cpu(inode->i_dir_level); + nbucket = dir_buckets(level, dirlevel); + end = dir_block_index(level, dirlevel, nbucket) + + bucket_blocks(level); + + dent_blk = malloc(F2FS_BLKSIZE); + ASSERT(dent_blk != NULL); + + for (i = 0; i < end; i++) { + memset(&dn, 0, sizeof(dn)); + set_new_dnode(&dn, node_blk, NULL, pino); + ret = get_dnode_of_data(sbi, &dn, i, LOOKUP_NODE); + if (ret < 0) + break; + addr = dn.data_blkaddr; + if (dn.inode_blk != dn.node_blk) + free(dn.node_blk); + if (addr == NULL_ADDR || addr == NEW_ADDR) + continue; + ret = dev_read_block(dent_blk, addr); + ASSERT(ret >= 0); + + make_dentry_ptr(&d, node_blk, dent_blk, 1); + slot = find_dir_entry(&d, opt->nid); + if (slot >= 0) { + dent = &d.dentry[slot]; + buf = dent_blk; + break; + } + } + } + + if (slot < 0) { + ERR_MSG("dentry of ino %u not found\n", opt->nid); + ret = -ENOENT; + goto out; + } + + if (!strcmp(opt->mb, "d_bitmap")) { + MSG(0, "Info: inject dentry bitmap of nid %u: 1 -> 0\n", + opt->nid); + test_and_clear_bit_le(slot, d.bitmap); + } else if (!strcmp(opt->mb, "d_hash")) { + MSG(0, "Info: inject dentry d_hash of nid %u: " + "0x%x -> 0x%x\n", opt->nid, le32_to_cpu(dent->hash_code), + (u32)opt->val); + dent->hash_code = cpu_to_le32((u32)opt->val); + } else if (!strcmp(opt->mb, "d_ino")) { + MSG(0, "Info: inject dentry d_ino of nid %u: " + "%u -> %u\n", opt->nid, le32_to_cpu(dent->ino), + (nid_t)opt->val); + dent->ino = cpu_to_le32((nid_t)opt->val); + } else if (!strcmp(opt->mb, "d_ftype")) { + MSG(0, "Info: inject dentry d_type of nid %u: " + "%d -> %d\n", opt->nid, dent->file_type, + (u8)opt->val); + dent->file_type = (u8)opt->val; + } else { + ERR_MSG("unknown or unsupported member \"%s\"\n", opt->mb); + ret = -EINVAL; + goto out; + } + + print_raw_dentry_info(dent); + + if (inode->i_inline & F2FS_INLINE_DENTRY) + ret = update_inode(sbi, buf, &addr); + else + ret = update_block(sbi, buf, &addr, NULL); + ASSERT(ret >= 0); + +out: + free(node_blk); + free(dent_blk); + return ret; +} + int do_inject(struct f2fs_sb_info *sbi) { struct inject_option *opt = (struct inject_option *)c.private; @@ -901,6 +1078,8 @@ int do_inject(struct f2fs_sb_info *sbi) ret = inject_ssa(sbi, opt); else if (opt->node) ret = inject_node(sbi, opt); + else if (opt->dent) + ret = inject_dentry(sbi, opt); return ret; } diff --git a/fsck/inject.h b/fsck/inject.h index 9b14c31..43c21b5 100644 --- a/fsck/inject.h +++ b/fsck/inject.h @@ -32,6 +32,7 @@ struct inject_option { int sit; /* which sit pack */ bool ssa; bool node; + bool dent; }; void inject_usage(void); From patchwork Fri Jun 28 01:31:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sheng Yong X-Patchwork-Id: 13715368 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 lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 554ACC3065C for ; Fri, 28 Jun 2024 01:32:42 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-4.v29.lw.sourceforge.com) by sfs-ml-4.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1sN0Tg-0004OJ-CH; Fri, 28 Jun 2024 01:32:40 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-4.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sN0Te-0004Ns-O9 for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:39 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=MIME-Version:Content-Type:Content-Transfer-Encoding :References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=Dq3dmc001amoNkyNORSo8UT5tprSJxmwuGIVCtG2oHk=; b=A3M80r/yJTbX8W5aAm4vEijjKQ +B6G1GDjU/WA+IKxpsKcxLukL5aa9xawjSegPjMkGeInZ6XvYpxrcNRQ4lyKIJTxIgvTe0EU9Eclx zuo8p1jfak9LPBoi8Xmp/BpqcIKkIT/3Cu0RcbKmy8zdlpfbOI24Ax3Lvb1YYeO5RoD4=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=MIME-Version:Content-Type:Content-Transfer-Encoding:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=Dq3dmc001amoNkyNORSo8UT5tprSJxmwuGIVCtG2oHk=; b=Aidua47Fgm6AbAbRg/NztF6EbV 5D7kPA+Wi/rgPwxkkM0uGelDYxIp3GnD2DMhXGh0DaHeS87ehhAvNBQ2ewQLiIu7wQ9pjEDpNPQ2F 0dN97ezNA+X3pJSWdZ452DRrkv7Z0QBAjp1X47TouwTOsrcf46fxHTTYNwnlYZgMAuVg=; Received: from mail-tyzapc01on2065.outbound.protection.outlook.com ([40.107.117.65] helo=APC01-TYZ-obe.outbound.protection.outlook.com) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sN0Tf-0006Jd-2X for linux-f2fs-devel@lists.sourceforge.net; Fri, 28 Jun 2024 01:32:39 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WmC56ZzdmtrPd+JAte04QNcOHHhUbt5z2i1gq9IpBAlpoucNrUqvrrMi+fRCUrdjNlJDaLUFLCEe0QKRNkWEz3xyvd2tOGiZo5gDweIM6A63KLMdYptKzEjpvMRaDI19dVXtsnpbfgk1/Br+g0xXQ1pZW3mokOgElsVIUiO0vQgHksyfPZOx+DsWnzZe3xh59Wqe5cQodSqY70LIaNzk8xvE2jes53ngnIRXVNs+g68X0PNPPTqrAhZjaWbiWAo1GIuneOYN88gleiN6c54sh8FDLVvQvZvMdIv7q8FCOlRMOsUb8fEa9QqIEee6O9KZjqDyRuwhmYcwThl47bHdQQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Dq3dmc001amoNkyNORSo8UT5tprSJxmwuGIVCtG2oHk=; b=Yi6UqPloQyKue5Eq2wfeViySImI7itAQOydsoZVunHKyO2HFKOJI0wZLd9W0QLdqgf+oyxVSHe90xt9w6F2nGsYhVKO1A+TvdRXulVSVfpEQlTD7ow0/PSqQoPtCfb0PGGm/6RAVIctql/KG6IMxz17K6o8errW1MTvWKm8kzBet17LPqK0JigHrHTRvoPZTKEz5MYHPVcHVyiLNrQhEntyEHY3Fej1i8R/IPRTqhn/TecIW+XaPhT9uIlr4qVjtR/SZvhHbtAQY3zQMgRC0OFPXC3Hg3tCenIRwL9zoQC4jXS2Y/c5G/Ji58AKjYthRvxyXbCouhR7dgtYZz5HC4Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oppo.com; dmarc=pass action=none header.from=oppo.com; dkim=pass header.d=oppo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oppo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Dq3dmc001amoNkyNORSo8UT5tprSJxmwuGIVCtG2oHk=; b=NcDs/69JCPq0Mvcv+bWZURum67ckEFMfyZnMlPNYHt/ufwqgWFBfEsT6h0gHvL/2iB2A2nm9F9jQBSAykheyudG7/y4WfLCIvEjy0F7lQr3BWiuWsJTz0L9QMfAqFdO1qgS07nK5sElN3hzdFGBKevPw5You7zGR+brdqO5KfSc= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oppo.com; Received: from SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) by TYZPR02MB6576.apcprd02.prod.outlook.com (2603:1096:400:41a::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.35; Fri, 28 Jun 2024 01:32:30 +0000 Received: from SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796]) by SEYPR02MB6014.apcprd02.prod.outlook.com ([fe80::bb06:c283:a50:7796%7]) with mapi id 15.20.7698.025; Fri, 28 Jun 2024 01:32:30 +0000 To: chao@kernel.org, jaegeuk@kernel.org Date: Fri, 28 Jun 2024 09:31:40 +0800 Message-Id: <20240628013140.2444209-11-shengyong@oppo.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240628013140.2444209-1-shengyong@oppo.com> References: <20240628013140.2444209-1-shengyong@oppo.com> X-ClientProxiedBy: SI2PR01CA0047.apcprd01.prod.exchangelabs.com (2603:1096:4:193::10) To SEYPR02MB6014.apcprd02.prod.outlook.com (2603:1096:101:6b::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SEYPR02MB6014:EE_|TYZPR02MB6576:EE_ X-MS-Office365-Filtering-Correlation-Id: eb121284-4170-4be4-7b8a-08dc97122cfd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: tea7HavNruBhxN2723Dxd3cjV+SfsL0zfSKntNR9Ci5xZJxtMKlVkCqjeTWlQQuGLPMiWeUWBZvaZCDy3Q4S9OY4Xxg+XYvkaYHpUuqNBnFioCzmjJjm1r8o6qZqVJRYhpnRqVXO778YLqfNDURgeRwQesyL3eoHjnrkg6DrAV5pfE24eiAMF44biBgCAWvsUwRkxUfubJxF98fcXnSJ4TH4hE8nCeN6K2AxNu/1N379/WTih+z9NzJ2R+5WK/vt3Ge84EOLHn87pfv0tXsiQ16lw903YXhpbPYtcGEM5TMA6XO3l0mX1Qb5ZXHsrN5385HAciFrLuJp4O/iQtgSTftoWLxVldEspgWrKJZrEkPvSYjs9hU5+Kr9vOt1r6Hb0MoySHokRNCJEioxslA4lkgM/p1kL+i74X6I0XXZXlsKwJP2hftPq5cajjC3uNDUIszDUPs1nY9/AYt5wBs38QRGp0a463ORWbOJTNVe/ZpKiURih08xhW2dh1tBbSI7QpdH5/Pei9Em2vSA9GzQq3BdbJSu05+UeA9qe1cGY2DujVGHREsbKoRC+qn9ETt9jwyF/Jzjv//y7hufSw69OmbqpkSCQo4JcL2lUt+T5tK09Fk24WZlyArZvpVxLSWERThcNrRJLBmDM0lqfaJCoG1lQC+E0ICwAsvpqeL2t6zl7jlZMmlapbvlszi2ouo8gl3NBwF4FyRVvhmAjzXiaGf4PZCKV+/khWy4BV0KvBGDM27SzPW/Yd1b6/zq0+poroQQICbnD6CrgWwyysTHODkhPREGkKGll27MuDLRD3JKjbg8jcDj6F/BV59NmiiiKE9Hqn2g01DP7E37hB9XTBeXRMtD6YWsD/ZGM7zCyzKzIKVFkg9oQrY132VIbqixaHZmhG/l0m5sMOQyKA0/qSwKTwqojGgKQJ3Jfd+E51uPVqicqfvQfml1n0oeOkmtXVBLG3YBovQT1y771WrT/RwPXX+atDsgUsnfvZTyczgSaav7Gjzmbvb9VtBMAz/rCV+yJkdsDaYNs5ZCxfp3EaaUMC8arWl7RdNSOiyfbBOvI4oNi3/ZVg17Eoux7rIO+m4buOsDWWOGxAh6mUj/0kipo18BBPVW5ZAthNo+Elm1H6TnfIjY478Qd6Qbk8xSjrzFQVz8qezeC3eAgBWdMb/s+Nxj1IGZ1CMALEVsf3X2cLlyuCKzYOZdMLwkFhsaRs0feH52VhSxi46qBmnDdrnZOXvtmjSmRdTZ7MR6otPXhjO2+Sb91latwzlnLLYJxyHGXa34lsQ1poQ8q4wW9hBji3l9SQevS+sDz5IW9pK74KJLocWTcjFMocG6P/qVqmAO6Jd7MGY9fE2/jRPpiTQXlxuRcnw97Ka7b8HIfvRDZCogPt0Z3O49SW6wGwFifgmXLG9qdWqpLYcVgghXGw== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SEYPR02MB6014.apcprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(52116014)(376014)(1800799024)(38350700014); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: TA71eYa6+I7lXQX2+4T92XYd0KYCz7oEfF4i32gyecrk6Zb/cet2r32nBX9iF1qHf/6U3E1aBmb2nCBQOqJ1IlIBuFWZ+5EL/Fk0ZMVKSmt+l14fo8MsO8DVCwlUn75b9QPwUkmmSIWR5pEKY1Fwn1wPy1GG8nHRP59+zRUQb+w11lAOM+KhBYQNOlbljkrtbaP+jtOZrZWS9/VFbckcRF8PW/ZubeivQoe2NbeouEHFTwtFAQ1wobyul5fxn9dWCkmox6R3EcAxhH2TXcVRPM88kR1ljx1kC1GaKHH70KzWxjNdHtKicqWo1ZFKmgbC/lDpV1/ECngPQKc+yIaS7WtMWev7dcMOG9Y4mnJEEy2Z68k3LDOIw5QEiSyFOEMZhzh0JMtNOarnm8tzCPFjY+1m9YtP+YcON0GZ1HWJwIQRcUnjyzi3q1GrncPbx1x/txPwdOpNmnpWjww6Z4E6Mek94tXUybYzGdOYYJoRBgUhk5xJzkqv7/IpWFRea0qjuK5yS8YbuS0VVcgPTl/JIkIOpjKralG+OXAfhWrBff5emja4CaRG9UPbwYLHneK9NSq1mtoDi9qyxiUODK870gR3ea4dSlbmHNzNXvQAb2GbN5r2n4tABN51RLHlA12gw/cwRqwaMKL2i5BoIwydpPjG/K9oxUJ9tmnDZ+0/egrrtgmkVmiyLlxOd5gM9gqw/L8s8GzglWiot0zA2ac5Lrm0mpIEa97yoJoz5gT9hHtMaP36wf91L9ceBeTM+2WzwvIhFTaDEqAFFfAoN4xot+eFPtrzPImIJ59QXRnrVRSkpf69s4D2CvTV5dDXfy7MT1MG3ONwa5JxY15B28kem0w8vQDZs1kpqKnHrFS+BQ2M88yHE4sgsVATWw6RYWpqCAlApExt4Mvej/sc3cIbvsD3NEI+OgK2u4+anuB1m5Qu3VXgoJUa7QLZ5R8p16vI5tJvAJAN6xW8qd9Uw7jtWAGPiY2Lc+PHHveCnYHV/tsWdj7s54+id3J+rQbRIrgz4CYleiF0B0roIy+PolIC0DUHpI9zomWcaZm4HA2dJDSK8ihPPM/gMwYFr8fYJgqeWUXs37RtyLZ89iT2sPfZeN3ipjnYBmb8bQFVNFs0jsDX0DedxFxzmZ0w3S4oU8NR2rKKwhkKGGXAbE7RzJNkGMiHQWm55aiGOY6dd4ksgGYLN92bk+WqBAMrp0PfuWTzuxHSRa8LqxSISTvN79hFJqo5MTW0bxMug5N4NFLogIPZrLkdlv7QEg2ZPCyxzkLnYe+hiTFkPHEKMmc5QW388qf5PkLFKRq3Up1KGEGqXuWokgsoLY82FkB4KAVfzbj7ilNV0rAvc6G5ccJRVg8EQjV7Z01ysiiOgi3mGAew0TjUg2LzuM6SGLXOKMnhb91kMDrJZK1yYWHFvXJFDvVtZacULmMWN61Je7RVfZ1RIlD1If8grm3AEwLbwEJVytbklIFv8AT4lk13WO4HIY8V8+Rj5C6kEsuo5wgi1RB/93IMqf0eohJUisAnNUTLsh8sf5VytFih7tg2o/vbolVRklrtX5sFaxy8PDkWXzVdBu76ZOZp8BXq8Ss9lZhAWewW X-OriginatorOrg: oppo.com X-MS-Exchange-CrossTenant-Network-Message-Id: eb121284-4170-4be4-7b8a-08dc97122cfd X-MS-Exchange-CrossTenant-AuthSource: SEYPR02MB6014.apcprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2024 01:32:30.1592 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f1905eb1-c353-41c5-9516-62b4a54b5ee6 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: /a+nfcMxD/C17JvOn63ddYvoVKcg+Mnztxa9icKO9CHh7WoOjHl9gPVrnd96s0b4gSvT7SmudzTwl8tPP9dfow== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR02MB6576 X-Headers-End: 1sN0Tf-0006Jd-2X Subject: [f2fs-dev] [RFC PATCH v2 10/10] man: add inject.f2fs man page X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Sheng Yong via Linux-f2fs-devel From: Sheng Yong Reply-To: Sheng Yong Cc: linux-f2fs-devel@lists.sourceforge.net Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net Signed-off-by: Sheng Yong Reviewed-by: Chao Yu --- man/Makefile.am | 2 +- man/inject.f2fs.8 | 225 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 man/inject.f2fs.8 diff --git a/man/Makefile.am b/man/Makefile.am index 9363b82..b78344a 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -1,3 +1,3 @@ ## Makefile.am -dist_man_MANS = mkfs.f2fs.8 fsck.f2fs.8 dump.f2fs.8 defrag.f2fs.8 resize.f2fs.8 sload.f2fs.8 f2fs_io.8 f2fslabel.8 +dist_man_MANS = mkfs.f2fs.8 fsck.f2fs.8 dump.f2fs.8 defrag.f2fs.8 resize.f2fs.8 sload.f2fs.8 f2fs_io.8 f2fslabel.8 inject.f2fs.8 diff --git a/man/inject.f2fs.8 b/man/inject.f2fs.8 new file mode 100644 index 0000000..01d58ef --- /dev/null +++ b/man/inject.f2fs.8 @@ -0,0 +1,225 @@ +.\" Copyright (c) 2024 OPPO Mobile Comm Corp., Ltd. +.\" +.TH INJECT.F2FS 8 +.SH NAME +inject.f2fs \- inject a Linux F2FS file system +.SH SYNOPSIS +.B inject.f2fs +[ +.I options +] +.I device +.SH DESCRIPTION +.B inject.f2fs +is used to modify metadata or data (directory entry) of f2fs file system +image offline flexibly. +.SH OPTIONS +.TP +.BI \-d " debug level [default:0]" +Specify the level of debugging options. +.TP +.BI \-V +Print the version number and exit. +.TP +.BI \-\-mb " member name" +Specify the member name in a struct that is injected. +.TP +.BI \-\-val " new value" +New value to set if \fImb\fP is a number. +.TP +.BI \-\-str " new string" +New string to set if \fImb\fP is a string. +.TP +.BI \-\-idx " slot index" +Specify which slot is injected if \fImb\fP is an array. +.TP +.BI \-\-nid " nid" +Specify which nid is injected. +.TP +.BI \-\-blk " blkaddr" +Specify which blkaddr is injected. +.TP +.BI \-\-sb " 0 or 1 or 2" +Inject super block, its argument means which sb pack is injected, where 0 choses the current valid sb automatically. +The available \fImb\fP of \fIsb\fP are: +.RS 1.2i +.TP +.BI magic +magic numbe. +.TP +.BI s_stop_reason +s_stop_reason array. +.TP +.BI s_errors +s_errors array. +.TP +.BI devs.path +path in devs array. +.RE +.TP +.BI \-\-cp " 0 or 1 or 2" +Inject checkpoint, its argument means which cp pack is injected, where 0 choses the current valid cp automatically. +The available \fImb\fP of \fIcp\fP are: +.RS 1.2i +.TP +.BI checkpoint_ver +checkpoint version. +.TP +.BI ckpt_flags +checkpoint flags. +.TP +.BI cur_node_segno +cur_node_segno array. +.TP +.BI cur_node_blkoff +cur_node_blkoff array. +.TP +.BI cur_data_segno +cur_data_segno array. +.TP +.BI cur_data_blkoff +cur_data_blkoff array. +.RE +.TP +.BI \-\-nat " 0 or 1 or 2" +Inject nat entry specified by \fInid\fP, its argument means which nat pack is injected, where 0 choses the current valid nat automatically. +The available \fImb\fP of \fInat\fP are: +.RS 1.2i +.TP +.BI version +nat entry version. +.TP +.BI ino +nat entry ino. +.TP +.BI block_addr +nat entry block_addr. +.RE +.TP +.BI \-\-sit " 0 or 1 or 2" +Inject sit entry specified by \fIblk\fP, its argument means which sit pack is injected, where 0 choses the current valid sit automatically. +The available \fImb\fP of \fIsit\fP are: +.RS 1.2i +.TP +.BI vblocks +sit entry vblocks. +.TP +.BI valid_map +sit entry valid_map. +.TP +.BI mtime +sit entry mtime. +.RE +.TP +.BI \-\-ssa +Inject summary block or summary entry specified by \fIblk\fP. +The available \fImb\fP of \fIssa\fP are: +.RS 1.2i +.TP +.BI entry_type +summary block footer entry_type. +.TP +.BI check_sum +summary block footer check_sum. +.TP +.BI nid +summary entry nid. +.TP +.BI version +summary entry version. +.TP +.BI ofs_in_node +summary entry ofs_in_node. +.RE +.TP +.BI \-\-node +Inject node block specified by \fInid\P. +The available \fImb\fP of \fInode\fP are: +.RS 1.2i +.TP +.BI nid +node footer nid. +.TP +.BI ino +node footer ino. +.TP +.BI flag +node footer flag. +.TP +.BI cp_ver +node footer cp_ver. +.TP +.BI next_blkaddr +node footer next_blkaddr. +.TP +.BI i_mode +inode i_mode. +.TP +.BI i_advise +inode i_advise. +.TP +.BI i_inline +inode i_inline. +.TP +.BI i_links +inode i_links. +.TP +.BI i_size +inode i_size. +.TP +.BI i_blocks +inode i_blocks. +.TP +.BI i_extra_isize +inode i_extra_isize. +.TP +.BI i_inode_checksum +inode i_inode_checksum. +.TP +.BI i_addr +inode i_addr array specified by \fIidx\fP. +.TP +.BI i_nid +inode i_nid array specified by \fIidx\fP. +.TP +.BI addr +{in}direct node nid/addr array specified by \fIidx\fP. +.RE +.TP +.BI \-\-dent +Inject dentry block or dir entry specified \fInid\fP. +The available \fImb\fP of \fIdent\fP are: +.RS 1.2i +.TP +.BI d_bitmap +dentry block d_bitmap. +.TP +.BI d_hash +dentry hash. +.TP +.BI d_ino +dentry ino. +.TP +.BI d_ftype +dentry ftype. +.RE +.TP +.BI \-\-dry\-run +Do not really inject. + +.PP +.SH AUTHOR +This version of +.B inject.f2fs +has been written by Sheng Yong . +.SH AVAILABILITY +.B inject.f2fs +is available from git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git. +.SH "SEE ALSO" +.BR mkfs.f2fs(8), +.BR fsck.f2fs(8), +.BR dump.f2fs(8), +.BR defrag.f2fs(8), +.BR resize.f2fs(8), +.BR sload.f2fs(8), +.BR defrag.f2fs(8).