From nobody Sun Feb 8 17:37:13 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B0DFBC001DF for ; Mon, 7 Aug 2023 19:52:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229683AbjHGTw0 (ORCPT ); Mon, 7 Aug 2023 15:52:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44016 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229473AbjHGTwY (ORCPT ); Mon, 7 Aug 2023 15:52:24 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BC0FFE66; Mon, 7 Aug 2023 12:52:22 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 4CFE161EB7; Mon, 7 Aug 2023 19:52:22 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9C9F5C433C7; Mon, 7 Aug 2023 19:52:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1691437941; bh=IH39znwDLBIRmDZcSbrudFffMeVXA/5wEHS2vZgdSZM=; h=From:To:Cc:Subject:Date:From; b=VuDazwdxCMW48TtNWpF2UIaT3LPyGTUqYykkRTPr27gutEDYmNWtAILZDTGmOt3U7 CcHoKK8lfvBimNqmG/2RaIHME/vWlsmBwSV151wA8hhGH3HWqMD07MI1B30ikxMvfc vdZfIuFW8XLxmU9YFYyZxggC/29Megg7X2eft+x3lyHmfUF9IiRfBig43oEyH1QtYh gbaNRZkcw2EK/W1cjSzLb3le+0d48ZMvDwDfySvjtvoitxT+cvLuv5RRU3uQntj6gA MjvLh9Ur//LvQkc+lYTDkIS93PL06c7QK6cJ7vKocg6Q4L3Rmv1d7x9RjLEuqVxZlT DrsANJX3Pc6GQ== From: Jaegeuk Kim To: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Cc: Jaegeuk Kim , stable@vger.kernel.org, Shinichiro Kawasaki Subject: [PATCH] Revert "f2fs: clean up w/ sbi->log_sectors_per_block" Date: Mon, 7 Aug 2023 12:52:19 -0700 Message-ID: <20230807195219.371131-1-jaegeuk@kernel.org> X-Mailer: git-send-email 2.41.0.640.ga95def55d0-goog MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This reverts commit bfd476623999118d9c509cb0fa9380f2912bc225. Shinichiro Kawasaki reported: When I ran workloads on f2fs using v6.5-rcX with fixes [1][2] and a zoned b= lock devices with 4kb logical block size, I observe mount failure as follows. Wh= en I revert this commit, the failure goes away. [ 167.781975][ T1555] F2FS-fs (dm-0): IO Block Size: 4 KB [ 167.890728][ T1555] F2FS-fs (dm-0): Found nat_bits in checkpoint [ 171.482588][ T1555] F2FS-fs (dm-0): Zone without valid block has non-zer= o write pointer. Reset the write pointer: wp[0x1300,0x8] [ 171.496000][ T1555] F2FS-fs (dm-0): (0) : Unaligned zone reset attempted= (block 280000 + 80000) [ 171.505037][ T1555] F2FS-fs (dm-0): Discard zone failed: (errno=3D-5) The patch replaced "sbi->log_blocksize - SECTOR_SHIFT" with "sbi->log_sectors_per_block". However, I think these two are not equal when= the device has 4k logical block size. The former uses Linux kernel sector size = 512 byte. The latter use 512b sector size or 4kb sector size depending on the device. mkfs.f2fs obtains logical block size via BLKSSZGET ioctl from the d= evice and reflects it to the value sbi->log_sector_size_per_block. This causes unexpected write pointer calculations in check_zone_write_pointer(). This resulted in unexpected zone reset and the mount failure. [1] https://lkml.kernel.org/linux-f2fs-devel/20230711050101.GA19128@lst.de/ [2] https://lore.kernel.org/linux-f2fs-devel/20230804091556.2372567-1-shini= chiro.kawasaki@wdc.com/ Cc: stable@vger.kernel.org Reported-by: Shinichiro Kawasaki Fixes: bfd476623999 ("f2fs: clean up w/ sbi->log_sectors_per_block") Signed-off-by: Jaegeuk Kim Reviewed-by: Chao Yu --- fs/f2fs/segment.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 0457d620011f..cbb4bd95ea19 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -4846,17 +4846,17 @@ static int check_zone_write_pointer(struct f2fs_sb_= info *sbi, { unsigned int wp_segno, wp_blkoff, zone_secno, zone_segno, segno; block_t zone_block, wp_block, last_valid_block; + unsigned int log_sectors_per_block =3D sbi->log_blocksize - SECTOR_SHIFT; int i, s, b, ret; struct seg_entry *se; =20 if (zone->type !=3D BLK_ZONE_TYPE_SEQWRITE_REQ) return 0; =20 - wp_block =3D fdev->start_blk + (zone->wp >> sbi->log_sectors_per_block); + wp_block =3D fdev->start_blk + (zone->wp >> log_sectors_per_block); wp_segno =3D GET_SEGNO(sbi, wp_block); wp_blkoff =3D wp_block - START_BLOCK(sbi, wp_segno); - zone_block =3D fdev->start_blk + (zone->start >> - sbi->log_sectors_per_block); + zone_block =3D fdev->start_blk + (zone->start >> log_sectors_per_block); zone_segno =3D GET_SEGNO(sbi, zone_block); zone_secno =3D GET_SEC_FROM_SEG(sbi, zone_segno); =20 @@ -4906,7 +4906,7 @@ static int check_zone_write_pointer(struct f2fs_sb_in= fo *sbi, "pointer. Reset the write pointer: wp[0x%x,0x%x]", wp_segno, wp_blkoff); ret =3D __f2fs_issue_discard_zone(sbi, fdev->bdev, zone_block, - zone->len >> sbi->log_sectors_per_block); + zone->len >> log_sectors_per_block); if (ret) f2fs_err(sbi, "Discard zone failed: %s (errno=3D%d)", fdev->path, ret); @@ -4967,6 +4967,7 @@ static int fix_curseg_write_pointer(struct f2fs_sb_in= fo *sbi, int type) struct blk_zone zone; unsigned int cs_section, wp_segno, wp_blkoff, wp_sector_off; block_t cs_zone_block, wp_block; + unsigned int log_sectors_per_block =3D sbi->log_blocksize - SECTOR_SHIFT; sector_t zone_sector; int err; =20 @@ -4978,8 +4979,8 @@ static int fix_curseg_write_pointer(struct f2fs_sb_in= fo *sbi, int type) return 0; =20 /* report zone for the sector the curseg points to */ - zone_sector =3D (sector_t)(cs_zone_block - zbd->start_blk) << - sbi->log_sectors_per_block; + zone_sector =3D (sector_t)(cs_zone_block - zbd->start_blk) + << log_sectors_per_block; err =3D blkdev_report_zones(zbd->bdev, zone_sector, 1, report_one_zone_cb, &zone); if (err !=3D 1) { @@ -4991,10 +4992,10 @@ static int fix_curseg_write_pointer(struct f2fs_sb_= info *sbi, int type) if (zone.type !=3D BLK_ZONE_TYPE_SEQWRITE_REQ) return 0; =20 - wp_block =3D zbd->start_blk + (zone.wp >> sbi->log_sectors_per_block); + wp_block =3D zbd->start_blk + (zone.wp >> log_sectors_per_block); wp_segno =3D GET_SEGNO(sbi, wp_block); wp_blkoff =3D wp_block - START_BLOCK(sbi, wp_segno); - wp_sector_off =3D zone.wp & GENMASK(sbi->log_sectors_per_block - 1, 0); + wp_sector_off =3D zone.wp & GENMASK(log_sectors_per_block - 1, 0); =20 if (cs->segno =3D=3D wp_segno && cs->next_blkoff =3D=3D wp_blkoff && wp_sector_off =3D=3D 0) @@ -5021,8 +5022,8 @@ static int fix_curseg_write_pointer(struct f2fs_sb_in= fo *sbi, int type) if (!zbd) return 0; =20 - zone_sector =3D (sector_t)(cs_zone_block - zbd->start_blk) << - sbi->log_sectors_per_block; + zone_sector =3D (sector_t)(cs_zone_block - zbd->start_blk) + << log_sectors_per_block; err =3D blkdev_report_zones(zbd->bdev, zone_sector, 1, report_one_zone_cb, &zone); if (err !=3D 1) { @@ -5040,7 +5041,7 @@ static int fix_curseg_write_pointer(struct f2fs_sb_in= fo *sbi, int type) "Reset the zone: curseg[0x%x,0x%x]", type, cs->segno, cs->next_blkoff); err =3D __f2fs_issue_discard_zone(sbi, zbd->bdev, cs_zone_block, - zone.len >> sbi->log_sectors_per_block); + zone.len >> log_sectors_per_block); if (err) { f2fs_err(sbi, "Discard zone failed: %s (errno=3D%d)", zbd->path, err); --=20 2.41.0.640.ga95def55d0-goog