public inbox for linux-fsdevel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] hpfs: obsolete check=none mount option
@ 2026-02-26 13:19 Tetsuo Handa
  2026-02-27 14:20 ` kernel test robot
  2026-03-12 13:24 ` Tetsuo Handa
  0 siblings, 2 replies; 4+ messages in thread
From: Tetsuo Handa @ 2026-02-26 13:19 UTC (permalink / raw)
  To: Mikulas Patocka, Linus Torvalds; +Cc: linux-fsdevel

syzbot is reporting use-after-free read problems when a crafted HPFS image
was mounted with "check=none" option.

The "check=none" option is intended for only users who want maximum speed
and use the filesystem only on trusted input. But fuzzers are for testing
the filesystem on untrusted input.

Mikulas Patocka (the HPFS maintainer) was thinking that there is no need to
add some middle ground where "check=none" would check some structures and
won't check others [1]. But now, Mikulas came to think that "check=none"
is not required at all because HPFS is not considered 'high-performance'
anymore [2].

This patch does not eliminate "check=none" option itself in order not to
break existing scripts or /etc/fstab configurations that people may have.

This patch instead eliminates sb_chk != 0 test that becomes redundant.
But in order to keep this patch minimal, this patch does not fix coding
style problems.

Reported-by: syzbot+fa88eb476e42878f2844@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=fa88eb476e42878f2844
Reported-by: syzbot+8debf4b3f7c7391cd8eb@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=8debf4b3f7c7391cd8eb
Link: https://lkml.kernel.org/r/9ca81125-1c7b-ddaf-09ea-638bc5712632@redhat.com [1]
Link: https://lkml.kernel.org/r/31825fd6-45b8-928f-0022-0696202032ce@twibright.com [2]
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
---
 fs/hpfs/alloc.c |  4 ++--
 fs/hpfs/anode.c | 13 ++++---------
 fs/hpfs/dir.c   |  5 ++---
 fs/hpfs/dnode.c | 19 ++++---------------
 fs/hpfs/map.c   | 14 +++++++-------
 fs/hpfs/super.c | 12 +++++-------
 6 files changed, 24 insertions(+), 43 deletions(-)

diff --git a/fs/hpfs/alloc.c b/fs/hpfs/alloc.c
index 66617b1557c6..a821dbd4e8cd 100644
--- a/fs/hpfs/alloc.c
+++ b/fs/hpfs/alloc.c
@@ -178,7 +178,7 @@ static secno alloc_in_bmp(struct super_block *s, secno near, unsigned n, unsigne
 	} while (i != nr);
 	rt:
 	if (ret) {
-		if (hpfs_sb(s)->sb_chk && ((ret >> 14) != (bs >> 14) || (le32_to_cpu(bmp[(ret & 0x3fff) >> 5]) | ~(((1 << n) - 1) << (ret & 0x1f))) != 0xffffffff)) {
+		if (((ret >> 14) != (bs >> 14) || (le32_to_cpu(bmp[(ret & 0x3fff) >> 5]) | ~(((1 << n) - 1) << (ret & 0x1f))) != 0xffffffff)) {
 			hpfs_error(s, "Allocation doesn't work! Wanted %d, allocated at %08x", n, ret);
 			ret = 0;
 			goto b;
@@ -404,7 +404,7 @@ int hpfs_check_free_dnodes(struct super_block *s, int n)
 
 void hpfs_free_dnode(struct super_block *s, dnode_secno dno)
 {
-	if (hpfs_sb(s)->sb_chk) if (dno & 3) {
+	if (dno & 3) {
 		hpfs_error(s, "hpfs_free_dnode: dnode %08x not aligned", dno);
 		return;
 	}
diff --git a/fs/hpfs/anode.c b/fs/hpfs/anode.c
index a4f5321eafae..efa534cd7abc 100644
--- a/fs/hpfs/anode.c
+++ b/fs/hpfs/anode.c
@@ -20,7 +20,7 @@ secno hpfs_bplus_lookup(struct super_block *s, struct inode *inode,
 	int i;
 	int c1, c2 = 0;
 	go_down:
-	if (hpfs_sb(s)->sb_chk) if (hpfs_stop_cycles(s, a, &c1, &c2, "hpfs_bplus_lookup")) return -1;
+	if (hpfs_stop_cycles(s, a, &c1, &c2, "hpfs_bplus_lookup")) return -1;
 	if (bp_internal(btree)) {
 		for (i = 0; i < btree->n_used_nodes; i++)
 			if (le32_to_cpu(btree->u.internal[i].file_secno) > sec) {
@@ -38,7 +38,7 @@ secno hpfs_bplus_lookup(struct super_block *s, struct inode *inode,
 		if (le32_to_cpu(btree->u.external[i].file_secno) <= sec &&
 		    le32_to_cpu(btree->u.external[i].file_secno) + le32_to_cpu(btree->u.external[i].length) > sec) {
 			a = le32_to_cpu(btree->u.external[i].disk_secno) + sec - le32_to_cpu(btree->u.external[i].file_secno);
-			if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, a, 1, "data")) {
+			if (hpfs_chk_sectors(s, a, 1, "data")) {
 				brelse(bh);
 				return -1;
 			}
@@ -89,7 +89,6 @@ secno hpfs_add_sector_to_btree(struct super_block *s, secno node, int fnod, unsi
 		btree->u.internal[n].file_secno = cpu_to_le32(-1);
 		mark_buffer_dirty(bh);
 		brelse(bh);
-		if (hpfs_sb(s)->sb_chk)
 			if (hpfs_stop_cycles(s, a, &c1, &c2, "hpfs_add_sector_to_btree #1")) return -1;
 		if (!(anode = hpfs_map_anode(s, a, &bh))) return -1;
 		btree = GET_BTREE_PTR(&anode->btree);
@@ -165,7 +164,6 @@ secno hpfs_add_sector_to_btree(struct super_block *s, secno node, int fnod, unsi
 	c2 = 0;
 	while (up != (anode_secno)-1) {
 		struct anode *new_anode;
-		if (hpfs_sb(s)->sb_chk)
 			if (hpfs_stop_cycles(s, up, &c1, &c2, "hpfs_add_sector_to_btree #2")) return -1;
 		if (up != node || !fnod) {
 			if (!(anode = hpfs_map_anode(s, up, &bh))) return -1;
@@ -288,7 +286,6 @@ void hpfs_remove_btree(struct super_block *s, struct bplus_header *btree)
 	while (bp_internal(btree1)) {
 		ano = le32_to_cpu(btree1->u.internal[pos].down);
 		if (level) brelse(bh);
-		if (hpfs_sb(s)->sb_chk)
 			if (hpfs_stop_cycles(s, ano, &d1, &d2, "hpfs_remove_btree #1"))
 				return;
 		if (!(anode = hpfs_map_anode(s, ano, &bh))) return;
@@ -301,7 +298,6 @@ void hpfs_remove_btree(struct super_block *s, struct bplus_header *btree)
 	go_up:
 	if (!level) return;
 	brelse(bh);
-	if (hpfs_sb(s)->sb_chk)
 		if (hpfs_stop_cycles(s, ano, &c1, &c2, "hpfs_remove_btree #2")) return;
 	hpfs_free_sectors(s, ano, 1);
 	oano = ano;
@@ -348,7 +344,7 @@ int hpfs_ea_read(struct super_block *s, secno a, int ano, unsigned pos,
 			if ((sec = anode_lookup(s, a, pos >> 9)) == -1)
 				return -1;
 		} else sec = a + (pos >> 9);
-		if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, sec, 1, "ea #1")) return -1;
+		if (hpfs_chk_sectors(s, sec, 1, "ea #1")) return -1;
 		if (!(data = hpfs_map_sector(s, sec, &bh, (len - 1) >> 9)))
 			return -1;
 		l = 0x200 - (pos & 0x1ff); if (l > len) l = len;
@@ -371,7 +367,7 @@ int hpfs_ea_write(struct super_block *s, secno a, int ano, unsigned pos,
 			if ((sec = anode_lookup(s, a, pos >> 9)) == -1)
 				return -1;
 		} else sec = a + (pos >> 9);
-		if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, sec, 1, "ea #2")) return -1;
+		if (hpfs_chk_sectors(s, sec, 1, "ea #2")) return -1;
 		if (!(data = hpfs_map_sector(s, sec, &bh, (len - 1) >> 9)))
 			return -1;
 		l = 0x200 - (pos & 0x1ff); if (l > len) l = len;
@@ -445,7 +441,6 @@ void hpfs_truncate_btree(struct super_block *s, secno f, int fno, unsigned secs)
 		}
 		node = le32_to_cpu(btree->u.internal[i].down);
 		brelse(bh);
-		if (hpfs_sb(s)->sb_chk)
 			if (hpfs_stop_cycles(s, node, &c1, &c2, "hpfs_truncate_btree"))
 				return;
 		if (!(anode = hpfs_map_anode(s, node, &bh))) return;
diff --git a/fs/hpfs/dir.c b/fs/hpfs/dir.c
index ceb50b2dc91a..01ca66da2f50 100644
--- a/fs/hpfs/dir.c
+++ b/fs/hpfs/dir.c
@@ -76,7 +76,7 @@ static int hpfs_readdir(struct file *file, struct dir_context *ctx)
 
 	hpfs_lock(inode->i_sb);
 
-	if (hpfs_sb(inode->i_sb)->sb_chk) {
+	{
 		if (hpfs_chk_sectors(inode->i_sb, inode->i_ino, 1, "dir_fnode")) {
 			ret = -EFSERROR;
 			goto out;
@@ -124,7 +124,6 @@ static int hpfs_readdir(struct file *file, struct dir_context *ctx)
 		/* This won't work when cycle is longer than number of dirents
 		   accepted by filldir, but what can I do?
 		   maybe killall -9 ls helps */
-		if (hpfs_sb(inode->i_sb)->sb_chk)
 			if (hpfs_stop_cycles(inode->i_sb, ctx->pos, &c1, &c2, "hpfs_readdir")) {
 				ret = -EFSERROR;
 				goto out;
@@ -158,7 +157,7 @@ static int hpfs_readdir(struct file *file, struct dir_context *ctx)
 			goto out;
 		}
 		if (de->first || de->last) {
-			if (hpfs_sb(inode->i_sb)->sb_chk) {
+			{
 				if (de->first && !de->last && (de->namelen != 2
 				    || de ->name[0] != 1 || de->name[1] != 1))
 					hpfs_error(inode->i_sb, "hpfs_readdir: bad ^A^A entry; pos = %08lx", (unsigned long)ctx->pos);
diff --git a/fs/hpfs/dnode.c b/fs/hpfs/dnode.c
index dde764ebe246..5a15b76d13eb 100644
--- a/fs/hpfs/dnode.c
+++ b/fs/hpfs/dnode.c
@@ -144,7 +144,7 @@ static void set_last_pointer(struct super_block *s, struct dnode *d, dnode_secno
 		hpfs_error(s, "set_last_pointer: empty dnode %08x", le32_to_cpu(d->self));
 		return;
 	}
-	if (hpfs_sb(s)->sb_chk) {
+	{
 		if (de->down) {
 			hpfs_error(s, "set_last_pointer: dnode %08x has already last pointer %08x",
 				le32_to_cpu(d->self), de_down_pointer(de));
@@ -266,7 +266,6 @@ static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno,
 		return 1;
 	}
 	go_up_a:
-	if (hpfs_sb(i->i_sb)->sb_chk)
 		if (hpfs_stop_cycles(i->i_sb, dno, &c1, &c2, "hpfs_add_to_dnode")) {
 			hpfs_brelse4(&qbh);
 			kfree(nd);
@@ -397,7 +396,6 @@ int hpfs_add_dirent(struct inode *i,
 	int c1, c2 = 0;
 	dno = hpfs_inode->i_dno;
 	down:
-	if (hpfs_sb(i->i_sb)->sb_chk)
 		if (hpfs_stop_cycles(i->i_sb, dno, &c1, &c2, "hpfs_add_dirent")) return 1;
 	if (!(d = hpfs_map_dnode(i->i_sb, dno, &qbh))) return 1;
 	de_end = dnode_end_de(d);
@@ -442,11 +440,10 @@ static secno move_to_top(struct inode *i, dnode_secno from, dnode_secno to)
 	int c1, c2 = 0;
 	dno = from;
 	while (1) {
-		if (hpfs_sb(i->i_sb)->sb_chk)
 			if (hpfs_stop_cycles(i->i_sb, dno, &c1, &c2, "move_to_top"))
 				return 0;
 		if (!(dnode = hpfs_map_dnode(i->i_sb, dno, &qbh))) return 0;
-		if (hpfs_sb(i->i_sb)->sb_chk) {
+		{
 			if (le32_to_cpu(dnode->up) != chk_up) {
 				hpfs_error(i->i_sb, "move_to_top: up pointer from %08x should be %08x, is %08x",
 					dno, chk_up, le32_to_cpu(dnode->up));
@@ -534,7 +531,7 @@ static void delete_empty_dnode(struct inode *i, dnode_secno dno)
 		up = le32_to_cpu(dnode->up);
 		de = dnode_first_de(dnode);
 		down = de->down ? de_down_pointer(de) : 0;
-		if (hpfs_sb(i->i_sb)->sb_chk) if (root && !down) {
+		if (root && !down) {
 			hpfs_error(i->i_sb, "delete_empty_dnode: root dnode %08x is empty", dno);
 			goto end;
 		}
@@ -547,7 +544,6 @@ static void delete_empty_dnode(struct inode *i, dnode_secno dno)
 			struct buffer_head *bh;
 			struct dnode *d1;
 			struct quad_buffer_head qbh1;
-			if (hpfs_sb(i->i_sb)->sb_chk)
 				if (up != i->i_ino) {
 					hpfs_error(i->i_sb,
 						   "bad pointer to fnode, dnode %08x, pointing to %08x, should be %08lx",
@@ -751,12 +747,11 @@ void hpfs_count_dnodes(struct super_block *s, dnode_secno dno, int *n_dnodes,
 	int d1, d2 = 0;
 	go_down:
 	if (n_dnodes) (*n_dnodes)++;
-	if (hpfs_sb(s)->sb_chk)
 		if (hpfs_stop_cycles(s, dno, &c1, &c2, "hpfs_count_dnodes #1")) return;
 	ptr = 0;
 	go_up:
 	if (!(dnode = hpfs_map_dnode(s, dno, &qbh))) return;
-	if (hpfs_sb(s)->sb_chk) if (odno && odno != -1 && le32_to_cpu(dnode->up) != odno)
+	if (odno && odno != -1 && le32_to_cpu(dnode->up) != odno)
 		hpfs_error(s, "hpfs_count_dnodes: bad up pointer; dnode %08x, down %08x points to %08x", odno, dno, le32_to_cpu(dnode->up));
 	de = dnode_first_de(dnode);
 	if (ptr) while(1) {
@@ -787,7 +782,6 @@ void hpfs_count_dnodes(struct super_block *s, dnode_secno dno, int *n_dnodes,
 		return;
 	}
 	hpfs_brelse4(&qbh);
-	if (hpfs_sb(s)->sb_chk)
 		if (hpfs_stop_cycles(s, ptr, &d1, &d2, "hpfs_count_dnodes #2")) return;
 	odno = -1;
 	goto go_up;
@@ -824,11 +818,9 @@ dnode_secno hpfs_de_as_down_as_possible(struct super_block *s, dnode_secno dno)
 	int c1, c2 = 0;
 
 	again:
-	if (hpfs_sb(s)->sb_chk)
 		if (hpfs_stop_cycles(s, d, &c1, &c2, "hpfs_de_as_down_as_possible"))
 			return d;
 	if (!(de = map_nth_dirent(s, d, 1, &qbh, NULL))) return dno;
-	if (hpfs_sb(s)->sb_chk)
 		if (up && le32_to_cpu(((struct dnode *)qbh.data)->up) != up)
 			hpfs_error(s, "hpfs_de_as_down_as_possible: bad up pointer; dnode %08x, down %08x points to %08x", up, d, le32_to_cpu(((struct dnode *)qbh.data)->up));
 	if (!de->down) {
@@ -917,7 +909,6 @@ struct hpfs_dirent *map_dirent(struct inode *inode, dnode_secno dno,
 
 	if (!S_ISDIR(inode->i_mode)) hpfs_error(inode->i_sb, "map_dirent: not a directory\n");
 	again:
-	if (hpfs_sb(inode->i_sb)->sb_chk)
 		if (hpfs_stop_cycles(inode->i_sb, dno, &c1, &c2, "map_dirent")) return NULL;
 	if (!(dnode = hpfs_map_dnode(inode->i_sb, dno, qbh))) return NULL;
 	
@@ -1062,7 +1053,6 @@ struct hpfs_dirent *map_fnode_dirent(struct super_block *s, fnode_secno fno,
 	if (c < 0 && de->down) {
 		dno = de_down_pointer(de);
 		hpfs_brelse4(qbh);
-		if (hpfs_sb(s)->sb_chk)
 			if (hpfs_stop_cycles(s, dno, &c1, &c2, "map_fnode_dirent #1")) {
 				kfree(name2);
 				return NULL;
@@ -1081,7 +1071,6 @@ struct hpfs_dirent *map_fnode_dirent(struct super_block *s, fnode_secno fno,
 	downd = dno;
 	dno = le32_to_cpu(d->up);
 	hpfs_brelse4(qbh);
-	if (hpfs_sb(s)->sb_chk)
 		if (hpfs_stop_cycles(s, downd, &d1, &d2, "map_fnode_dirent #2")) {
 			kfree(name2);
 			return NULL;
diff --git a/fs/hpfs/map.c b/fs/hpfs/map.c
index be73233502f8..eeb8ff9b34bb 100644
--- a/fs/hpfs/map.c
+++ b/fs/hpfs/map.c
@@ -20,7 +20,7 @@ __le32 *hpfs_map_bitmap(struct super_block *s, unsigned bmp_block,
 	secno sec;
 	__le32 *ret;
 	unsigned n_bands = (hpfs_sb(s)->sb_fs_size + 0x3fff) >> 14;
-	if (hpfs_sb(s)->sb_chk) if (bmp_block >= n_bands) {
+	if (bmp_block >= n_bands) {
 		hpfs_error(s, "hpfs_map_bitmap called with bad parameter: %08x at %s", bmp_block, id);
 		return NULL;
 	}
@@ -164,11 +164,11 @@ void hpfs_load_hotfix_map(struct super_block *s, struct hpfs_spare_block *spareb
 struct fnode *hpfs_map_fnode(struct super_block *s, ino_t ino, struct buffer_head **bhp)
 {
 	struct fnode *fnode;
-	if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, ino, 1, "fnode")) {
+	if (hpfs_chk_sectors(s, ino, 1, "fnode")) {
 		return NULL;
 	}
 	if ((fnode = hpfs_map_sector(s, ino, bhp, FNODE_RD_AHEAD))) {
-		if (hpfs_sb(s)->sb_chk) {
+		{
 			struct extended_attribute *ea;
 			struct extended_attribute *ea_end;
 			if (le32_to_cpu(fnode->magic) != FNODE_MAGIC) {
@@ -221,9 +221,9 @@ struct fnode *hpfs_map_fnode(struct super_block *s, ino_t ino, struct buffer_hea
 struct anode *hpfs_map_anode(struct super_block *s, anode_secno ano, struct buffer_head **bhp)
 {
 	struct anode *anode;
-	if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, ano, 1, "anode")) return NULL;
+	if (hpfs_chk_sectors(s, ano, 1, "anode")) return NULL;
 	if ((anode = hpfs_map_sector(s, ano, bhp, ANODE_RD_AHEAD)))
-		if (hpfs_sb(s)->sb_chk) {
+		{
 			if (le32_to_cpu(anode->magic) != ANODE_MAGIC) {
 				hpfs_error(s, "bad magic on anode %08x", ano);
 				goto bail;
@@ -257,7 +257,7 @@ struct dnode *hpfs_map_dnode(struct super_block *s, unsigned secno,
 			     struct quad_buffer_head *qbh)
 {
 	struct dnode *dnode;
-	if (hpfs_sb(s)->sb_chk) {
+	{
 		if (hpfs_chk_sectors(s, secno, 4, "dnode")) return NULL;
 		if (secno & 3) {
 			hpfs_error(s, "dnode %08x not byte-aligned", secno);
@@ -265,7 +265,7 @@ struct dnode *hpfs_map_dnode(struct super_block *s, unsigned secno,
 		}	
 	}
 	if ((dnode = hpfs_map_4sectors(s, secno, qbh, DNODE_RD_AHEAD)))
-		if (hpfs_sb(s)->sb_chk) {
+		{
 			unsigned p, pp = 0;
 			unsigned char *d = (unsigned char *)dnode;
 			int b = 0;
diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c
index c16d5d4caead..a6efb723f7d5 100644
--- a/fs/hpfs/super.c
+++ b/fs/hpfs/super.c
@@ -349,8 +349,7 @@ HPFS filesystem options:\n\
       umask=xxx         set mode of files that don't have mode specified in eas\n\
       case=lower        lowercase all files\n\
       case=asis         do not lowercase files (default)\n\
-      check=none        no fs checks - kernel may crash on corrupted filesystem\n\
-      check=normal      do some checks - it should not crash (default)\n\
+      check=normal      do some checks - kernel should not crash (default)\n\
       check=strict      do extra time-consuming checks, used for debugging\n\
       errors=continue   continue on errors\n\
       errors=remount-ro remount read-only if errors found (default)\n\
@@ -465,8 +464,6 @@ static int hpfs_show_options(struct seq_file *seq, struct dentry *root)
 	seq_printf(seq, ",umask=%03o", (~sbi->sb_mode & 0777));
 	if (sbi->sb_lowercase)
 		seq_printf(seq, ",case=lower");
-	if (!sbi->sb_chk)
-		seq_printf(seq, ",check=none");
 	if (sbi->sb_chk == 2)
 		seq_printf(seq, ",check=strict");
 	if (!sbi->sb_err)
@@ -615,7 +612,9 @@ static int hpfs_fill_super(struct super_block *s, struct fs_context *fc)
 		if (sbi->sb_err == 0)
 			pr_err("Proceeding, but your filesystem could be corrupted if you delete files or directories\n");
 	}
-	if (sbi->sb_chk) {
+	if (!ctx->chk)
+		pr_info_once("check=none was obsoleted. Treating as check=normal.\n");
+	{
 		unsigned a;
 		if (le32_to_cpu(superblock->dir_band_end) - le32_to_cpu(superblock->dir_band_start) + 1 != le32_to_cpu(superblock->n_dir_band) ||
 		    le32_to_cpu(superblock->dir_band_end) < le32_to_cpu(superblock->dir_band_start) || le32_to_cpu(superblock->n_dir_band) > 0x4000) {
@@ -632,8 +631,7 @@ static int hpfs_fill_super(struct super_block *s, struct fs_context *fc)
 			goto bail4;
 		}
 		sbi->sb_dirband_size = a;
-	} else
-		pr_err("You really don't want any checks? You are crazy...\n");
+	}
 
 	/* Load code page table */
 	if (le32_to_cpu(spareblock->n_code_pages))
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] hpfs: obsolete check=none mount option
  2026-02-26 13:19 [PATCH] hpfs: obsolete check=none mount option Tetsuo Handa
@ 2026-02-27 14:20 ` kernel test robot
  2026-03-12 13:24 ` Tetsuo Handa
  1 sibling, 0 replies; 4+ messages in thread
From: kernel test robot @ 2026-02-27 14:20 UTC (permalink / raw)
  To: Tetsuo Handa, Mikulas Patocka, Linus Torvalds
  Cc: oe-kbuild-all, LKML, linux-fsdevel

Hi Tetsuo,

kernel test robot noticed the following build warnings:

[auto build test WARNING on brauner-vfs/vfs.all]
[also build test WARNING on linus/master linux/master v7.0-rc1 next-20260226]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Tetsuo-Handa/hpfs-obsolete-check-none-mount-option/20260226-222815
base:   https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git vfs.all
patch link:    https://lore.kernel.org/r/fd8dabf8-f0a5-418a-9b3d-da981101ca86%40I-love.SAKURA.ne.jp
patch subject: [PATCH] hpfs: obsolete check=none mount option
config: x86_64-randconfig-r071-20260227 (https://download.01.org/0day-ci/archive/20260227/202602272252.89OlLXUV-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
smatch version: v0.5.0-8994-gd50c5a4c

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202602272252.89OlLXUV-lkp@intel.com/

New smatch warnings:
fs/hpfs/anode.c:92 hpfs_add_sector_to_btree() warn: inconsistent indenting
fs/hpfs/anode.c:289 hpfs_remove_btree() warn: inconsistent indenting
fs/hpfs/anode.c:444 hpfs_truncate_btree() warn: inconsistent indenting
fs/hpfs/dnode.c:445 move_to_top() warn: inconsistent indenting
fs/hpfs/dnode.c:547 delete_empty_dnode() warn: inconsistent indenting
fs/hpfs/dnode.c:751 hpfs_count_dnodes() warn: inconsistent indenting
fs/hpfs/dnode.c:824 hpfs_de_as_down_as_possible() warn: inconsistent indenting
fs/hpfs/dnode.c:1056 map_fnode_dirent() warn: inconsistent indenting

Old smatch warnings:
fs/hpfs/anode.c:167 hpfs_add_sector_to_btree() warn: inconsistent indenting
fs/hpfs/anode.c:301 hpfs_remove_btree() warn: inconsistent indenting
fs/hpfs/anode.c:322 hpfs_remove_btree() warn: passing freed memory 'bh' (line 300)
fs/hpfs/anode.c:452 hpfs_truncate_btree() warn: passing freed memory 'bh' (line 443)
fs/hpfs/anode.c:470 hpfs_truncate_btree() warn: passing freed memory 'bh' (line 443)
fs/hpfs/dnode.c:47 hpfs_add_pos() error: we previously assumed 'hpfs_inode->i_rddir_off' could be null (see line 31)
fs/hpfs/dnode.c:786 hpfs_count_dnodes() warn: inconsistent indenting
fs/hpfs/dnode.c:1074 map_fnode_dirent() warn: inconsistent indenting

vim +92 fs/hpfs/anode.c

^1da177e4c3f41 Linus Torvalds      2005-04-16   60  
^1da177e4c3f41 Linus Torvalds      2005-04-16   61  secno hpfs_add_sector_to_btree(struct super_block *s, secno node, int fnod, unsigned fsecno)
^1da177e4c3f41 Linus Torvalds      2005-04-16   62  {
^1da177e4c3f41 Linus Torvalds      2005-04-16   63  	struct bplus_header *btree;
^1da177e4c3f41 Linus Torvalds      2005-04-16   64  	struct anode *anode = NULL, *ranode = NULL;
^1da177e4c3f41 Linus Torvalds      2005-04-16   65  	struct fnode *fnode;
^1da177e4c3f41 Linus Torvalds      2005-04-16   66  	anode_secno a, na = -1, ra, up = -1;
^1da177e4c3f41 Linus Torvalds      2005-04-16   67  	secno se;
^1da177e4c3f41 Linus Torvalds      2005-04-16   68  	struct buffer_head *bh, *bh1, *bh2;
^1da177e4c3f41 Linus Torvalds      2005-04-16   69  	int n;
^1da177e4c3f41 Linus Torvalds      2005-04-16   70  	unsigned fs;
^1da177e4c3f41 Linus Torvalds      2005-04-16   71  	int c1, c2 = 0;
68a74490629eb6 Gustavo A. R. Silva 2025-08-11   72  
^1da177e4c3f41 Linus Torvalds      2005-04-16   73  	if (fnod) {
^1da177e4c3f41 Linus Torvalds      2005-04-16   74  		if (!(fnode = hpfs_map_fnode(s, node, &bh))) return -1;
68a74490629eb6 Gustavo A. R. Silva 2025-08-11   75  		btree = GET_BTREE_PTR(&fnode->btree);
^1da177e4c3f41 Linus Torvalds      2005-04-16   76  	} else {
^1da177e4c3f41 Linus Torvalds      2005-04-16   77  		if (!(anode = hpfs_map_anode(s, node, &bh))) return -1;
68a74490629eb6 Gustavo A. R. Silva 2025-08-11   78  		btree = GET_BTREE_PTR(&anode->btree);
^1da177e4c3f41 Linus Torvalds      2005-04-16   79  	}
^1da177e4c3f41 Linus Torvalds      2005-04-16   80  	a = node;
^1da177e4c3f41 Linus Torvalds      2005-04-16   81  	go_down:
^1da177e4c3f41 Linus Torvalds      2005-04-16   82  	if ((n = btree->n_used_nodes - 1) < -!!fnod) {
^1da177e4c3f41 Linus Torvalds      2005-04-16   83  		hpfs_error(s, "anode %08x has no entries", a);
^1da177e4c3f41 Linus Torvalds      2005-04-16   84  		brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16   85  		return -1;
^1da177e4c3f41 Linus Torvalds      2005-04-16   86  	}
ddc19e6e04c113 Al Viro             2012-04-17   87  	if (bp_internal(btree)) {
0b69760be6968c Mikulas Patocka     2011-05-08   88  		a = le32_to_cpu(btree->u.internal[n].down);
0b69760be6968c Mikulas Patocka     2011-05-08   89  		btree->u.internal[n].file_secno = cpu_to_le32(-1);
^1da177e4c3f41 Linus Torvalds      2005-04-16   90  		mark_buffer_dirty(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16   91  		brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  @92  			if (hpfs_stop_cycles(s, a, &c1, &c2, "hpfs_add_sector_to_btree #1")) return -1;
^1da177e4c3f41 Linus Torvalds      2005-04-16   93  		if (!(anode = hpfs_map_anode(s, a, &bh))) return -1;
68a74490629eb6 Gustavo A. R. Silva 2025-08-11   94  		btree = GET_BTREE_PTR(&anode->btree);
^1da177e4c3f41 Linus Torvalds      2005-04-16   95  		goto go_down;
^1da177e4c3f41 Linus Torvalds      2005-04-16   96  	}
^1da177e4c3f41 Linus Torvalds      2005-04-16   97  	if (n >= 0) {
0b69760be6968c Mikulas Patocka     2011-05-08   98  		if (le32_to_cpu(btree->u.external[n].file_secno) + le32_to_cpu(btree->u.external[n].length) != fsecno) {
^1da177e4c3f41 Linus Torvalds      2005-04-16   99  			hpfs_error(s, "allocated size %08x, trying to add sector %08x, %cnode %08x",
0b69760be6968c Mikulas Patocka     2011-05-08  100  				le32_to_cpu(btree->u.external[n].file_secno) + le32_to_cpu(btree->u.external[n].length), fsecno,
^1da177e4c3f41 Linus Torvalds      2005-04-16  101  				fnod?'f':'a', node);
^1da177e4c3f41 Linus Torvalds      2005-04-16  102  			brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  103  			return -1;
^1da177e4c3f41 Linus Torvalds      2005-04-16  104  		}
0b69760be6968c Mikulas Patocka     2011-05-08  105  		if (hpfs_alloc_if_possible(s, se = le32_to_cpu(btree->u.external[n].disk_secno) + le32_to_cpu(btree->u.external[n].length))) {
32daab969cc16e Wei Yongjun         2012-10-04  106  			le32_add_cpu(&btree->u.external[n].length, 1);
^1da177e4c3f41 Linus Torvalds      2005-04-16  107  			mark_buffer_dirty(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  108  			brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  109  			return se;
^1da177e4c3f41 Linus Torvalds      2005-04-16  110  		}
^1da177e4c3f41 Linus Torvalds      2005-04-16  111  	} else {
^1da177e4c3f41 Linus Torvalds      2005-04-16  112  		if (fsecno) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  113  			hpfs_error(s, "empty file %08x, trying to add sector %08x", node, fsecno);
^1da177e4c3f41 Linus Torvalds      2005-04-16  114  			brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  115  			return -1;
^1da177e4c3f41 Linus Torvalds      2005-04-16  116  		}
^1da177e4c3f41 Linus Torvalds      2005-04-16  117  		se = !fnod ? node : (node + 16384) & ~16383;
^1da177e4c3f41 Linus Torvalds      2005-04-16  118  	}	
7d23ce36e3f52f Mikulas Patocka     2011-05-08  119  	if (!(se = hpfs_alloc_sector(s, se, 1, fsecno*ALLOC_M>ALLOC_FWD_MAX ? ALLOC_FWD_MAX : fsecno*ALLOC_M<ALLOC_FWD_MIN ? ALLOC_FWD_MIN : fsecno*ALLOC_M))) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  120  		brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  121  		return -1;
^1da177e4c3f41 Linus Torvalds      2005-04-16  122  	}
0b69760be6968c Mikulas Patocka     2011-05-08  123  	fs = n < 0 ? 0 : le32_to_cpu(btree->u.external[n].file_secno) + le32_to_cpu(btree->u.external[n].length);
^1da177e4c3f41 Linus Torvalds      2005-04-16  124  	if (!btree->n_free_nodes) {
0b69760be6968c Mikulas Patocka     2011-05-08  125  		up = a != node ? le32_to_cpu(anode->up) : -1;
^1da177e4c3f41 Linus Torvalds      2005-04-16  126  		if (!(anode = hpfs_alloc_anode(s, a, &na, &bh1))) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  127  			brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  128  			hpfs_free_sectors(s, se, 1);
^1da177e4c3f41 Linus Torvalds      2005-04-16  129  			return -1;
^1da177e4c3f41 Linus Torvalds      2005-04-16  130  		}
^1da177e4c3f41 Linus Torvalds      2005-04-16  131  		if (a == node && fnod) {
0b69760be6968c Mikulas Patocka     2011-05-08  132  			anode->up = cpu_to_le32(node);
ddc19e6e04c113 Al Viro             2012-04-17  133  			anode->btree.flags |= BP_fnode_parent;
^1da177e4c3f41 Linus Torvalds      2005-04-16  134  			anode->btree.n_used_nodes = btree->n_used_nodes;
^1da177e4c3f41 Linus Torvalds      2005-04-16  135  			anode->btree.first_free = btree->first_free;
^1da177e4c3f41 Linus Torvalds      2005-04-16  136  			anode->btree.n_free_nodes = 40 - anode->btree.n_used_nodes;
^1da177e4c3f41 Linus Torvalds      2005-04-16  137  			memcpy(&anode->u, &btree->u, btree->n_used_nodes * 12);
ddc19e6e04c113 Al Viro             2012-04-17  138  			btree->flags |= BP_internal;
^1da177e4c3f41 Linus Torvalds      2005-04-16  139  			btree->n_free_nodes = 11;
^1da177e4c3f41 Linus Torvalds      2005-04-16  140  			btree->n_used_nodes = 1;
0b69760be6968c Mikulas Patocka     2011-05-08  141  			btree->first_free = cpu_to_le16((char *)&(btree->u.internal[1]) - (char *)btree);
0b69760be6968c Mikulas Patocka     2011-05-08  142  			btree->u.internal[0].file_secno = cpu_to_le32(-1);
0b69760be6968c Mikulas Patocka     2011-05-08  143  			btree->u.internal[0].down = cpu_to_le32(na);
^1da177e4c3f41 Linus Torvalds      2005-04-16  144  			mark_buffer_dirty(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  145  		} else if (!(ranode = hpfs_alloc_anode(s, /*a*/0, &ra, &bh2))) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  146  			brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  147  			brelse(bh1);
^1da177e4c3f41 Linus Torvalds      2005-04-16  148  			hpfs_free_sectors(s, se, 1);
^1da177e4c3f41 Linus Torvalds      2005-04-16  149  			hpfs_free_sectors(s, na, 1);
^1da177e4c3f41 Linus Torvalds      2005-04-16  150  			return -1;
^1da177e4c3f41 Linus Torvalds      2005-04-16  151  		}
^1da177e4c3f41 Linus Torvalds      2005-04-16  152  		brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  153  		bh = bh1;
68a74490629eb6 Gustavo A. R. Silva 2025-08-11  154  		btree = GET_BTREE_PTR(&anode->btree);
^1da177e4c3f41 Linus Torvalds      2005-04-16  155  	}
^1da177e4c3f41 Linus Torvalds      2005-04-16  156  	btree->n_free_nodes--; n = btree->n_used_nodes++;
32daab969cc16e Wei Yongjun         2012-10-04  157  	le16_add_cpu(&btree->first_free, 12);
0b69760be6968c Mikulas Patocka     2011-05-08  158  	btree->u.external[n].disk_secno = cpu_to_le32(se);
0b69760be6968c Mikulas Patocka     2011-05-08  159  	btree->u.external[n].file_secno = cpu_to_le32(fs);
0b69760be6968c Mikulas Patocka     2011-05-08  160  	btree->u.external[n].length = cpu_to_le32(1);
^1da177e4c3f41 Linus Torvalds      2005-04-16  161  	mark_buffer_dirty(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  162  	brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  163  	if ((a == node && fnod) || na == -1) return se;
^1da177e4c3f41 Linus Torvalds      2005-04-16  164  	c2 = 0;
0b69760be6968c Mikulas Patocka     2011-05-08  165  	while (up != (anode_secno)-1) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  166  		struct anode *new_anode;
^1da177e4c3f41 Linus Torvalds      2005-04-16  167  			if (hpfs_stop_cycles(s, up, &c1, &c2, "hpfs_add_sector_to_btree #2")) return -1;
^1da177e4c3f41 Linus Torvalds      2005-04-16  168  		if (up != node || !fnod) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  169  			if (!(anode = hpfs_map_anode(s, up, &bh))) return -1;
68a74490629eb6 Gustavo A. R. Silva 2025-08-11  170  			btree = GET_BTREE_PTR(&anode->btree);
^1da177e4c3f41 Linus Torvalds      2005-04-16  171  		} else {
^1da177e4c3f41 Linus Torvalds      2005-04-16  172  			if (!(fnode = hpfs_map_fnode(s, up, &bh))) return -1;
68a74490629eb6 Gustavo A. R. Silva 2025-08-11  173  			btree = GET_BTREE_PTR(&fnode->btree);
^1da177e4c3f41 Linus Torvalds      2005-04-16  174  		}
^1da177e4c3f41 Linus Torvalds      2005-04-16  175  		if (btree->n_free_nodes) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  176  			btree->n_free_nodes--; n = btree->n_used_nodes++;
32daab969cc16e Wei Yongjun         2012-10-04  177  			le16_add_cpu(&btree->first_free, 8);
0b69760be6968c Mikulas Patocka     2011-05-08  178  			btree->u.internal[n].file_secno = cpu_to_le32(-1);
0b69760be6968c Mikulas Patocka     2011-05-08  179  			btree->u.internal[n].down = cpu_to_le32(na);
0b69760be6968c Mikulas Patocka     2011-05-08  180  			btree->u.internal[n-1].file_secno = cpu_to_le32(fs);
^1da177e4c3f41 Linus Torvalds      2005-04-16  181  			mark_buffer_dirty(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  182  			brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  183  			brelse(bh2);
^1da177e4c3f41 Linus Torvalds      2005-04-16  184  			hpfs_free_sectors(s, ra, 1);
^1da177e4c3f41 Linus Torvalds      2005-04-16  185  			if ((anode = hpfs_map_anode(s, na, &bh))) {
0b69760be6968c Mikulas Patocka     2011-05-08  186  				anode->up = cpu_to_le32(up);
ddc19e6e04c113 Al Viro             2012-04-17  187  				if (up == node && fnod)
ddc19e6e04c113 Al Viro             2012-04-17  188  					anode->btree.flags |= BP_fnode_parent;
ddc19e6e04c113 Al Viro             2012-04-17  189  				else
ddc19e6e04c113 Al Viro             2012-04-17  190  					anode->btree.flags &= ~BP_fnode_parent;
^1da177e4c3f41 Linus Torvalds      2005-04-16  191  				mark_buffer_dirty(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  192  				brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  193  			}
^1da177e4c3f41 Linus Torvalds      2005-04-16  194  			return se;
^1da177e4c3f41 Linus Torvalds      2005-04-16  195  		}
0b69760be6968c Mikulas Patocka     2011-05-08  196  		up = up != node ? le32_to_cpu(anode->up) : -1;
0b69760be6968c Mikulas Patocka     2011-05-08  197  		btree->u.internal[btree->n_used_nodes - 1].file_secno = cpu_to_le32(/*fs*/-1);
^1da177e4c3f41 Linus Torvalds      2005-04-16  198  		mark_buffer_dirty(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  199  		brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  200  		a = na;
^1da177e4c3f41 Linus Torvalds      2005-04-16  201  		if ((new_anode = hpfs_alloc_anode(s, a, &na, &bh))) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  202  			anode = new_anode;
0b69760be6968c Mikulas Patocka     2011-05-08  203  			/*anode->up = cpu_to_le32(up != -1 ? up : ra);*/
ddc19e6e04c113 Al Viro             2012-04-17  204  			anode->btree.flags |= BP_internal;
^1da177e4c3f41 Linus Torvalds      2005-04-16  205  			anode->btree.n_used_nodes = 1;
^1da177e4c3f41 Linus Torvalds      2005-04-16  206  			anode->btree.n_free_nodes = 59;
0b69760be6968c Mikulas Patocka     2011-05-08  207  			anode->btree.first_free = cpu_to_le16(16);
68a74490629eb6 Gustavo A. R. Silva 2025-08-11  208  			GET_BTREE_PTR(&anode->btree)->u.internal[0].down = cpu_to_le32(a);
68a74490629eb6 Gustavo A. R. Silva 2025-08-11  209  			GET_BTREE_PTR(&anode->btree)->u.internal[0].file_secno = cpu_to_le32(-1);
^1da177e4c3f41 Linus Torvalds      2005-04-16  210  			mark_buffer_dirty(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  211  			brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  212  			if ((anode = hpfs_map_anode(s, a, &bh))) {
0b69760be6968c Mikulas Patocka     2011-05-08  213  				anode->up = cpu_to_le32(na);
^1da177e4c3f41 Linus Torvalds      2005-04-16  214  				mark_buffer_dirty(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  215  				brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  216  			}
^1da177e4c3f41 Linus Torvalds      2005-04-16  217  		} else na = a;
^1da177e4c3f41 Linus Torvalds      2005-04-16  218  	}
^1da177e4c3f41 Linus Torvalds      2005-04-16  219  	if ((anode = hpfs_map_anode(s, na, &bh))) {
0b69760be6968c Mikulas Patocka     2011-05-08  220  		anode->up = cpu_to_le32(node);
ddc19e6e04c113 Al Viro             2012-04-17  221  		if (fnod)
ddc19e6e04c113 Al Viro             2012-04-17  222  			anode->btree.flags |= BP_fnode_parent;
^1da177e4c3f41 Linus Torvalds      2005-04-16  223  		mark_buffer_dirty(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  224  		brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  225  	}
^1da177e4c3f41 Linus Torvalds      2005-04-16  226  	if (!fnod) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  227  		if (!(anode = hpfs_map_anode(s, node, &bh))) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  228  			brelse(bh2);
^1da177e4c3f41 Linus Torvalds      2005-04-16  229  			return -1;
^1da177e4c3f41 Linus Torvalds      2005-04-16  230  		}
68a74490629eb6 Gustavo A. R. Silva 2025-08-11  231  		btree = GET_BTREE_PTR(&anode->btree);
^1da177e4c3f41 Linus Torvalds      2005-04-16  232  	} else {
^1da177e4c3f41 Linus Torvalds      2005-04-16  233  		if (!(fnode = hpfs_map_fnode(s, node, &bh))) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  234  			brelse(bh2);
^1da177e4c3f41 Linus Torvalds      2005-04-16  235  			return -1;
^1da177e4c3f41 Linus Torvalds      2005-04-16  236  		}
68a74490629eb6 Gustavo A. R. Silva 2025-08-11  237  		btree = GET_BTREE_PTR(&fnode->btree);
^1da177e4c3f41 Linus Torvalds      2005-04-16  238  	}
0b69760be6968c Mikulas Patocka     2011-05-08  239  	ranode->up = cpu_to_le32(node);
0b69760be6968c Mikulas Patocka     2011-05-08  240  	memcpy(&ranode->btree, btree, le16_to_cpu(btree->first_free));
ddc19e6e04c113 Al Viro             2012-04-17  241  	if (fnod)
ddc19e6e04c113 Al Viro             2012-04-17  242  		ranode->btree.flags |= BP_fnode_parent;
68a74490629eb6 Gustavo A. R. Silva 2025-08-11  243  	GET_BTREE_PTR(&ranode->btree)->n_free_nodes = (bp_internal(GET_BTREE_PTR(&ranode->btree)) ? 60 : 40) - GET_BTREE_PTR(&ranode->btree)->n_used_nodes;
68a74490629eb6 Gustavo A. R. Silva 2025-08-11  244  	if (bp_internal(GET_BTREE_PTR(&ranode->btree))) for (n = 0; n < GET_BTREE_PTR(&ranode->btree)->n_used_nodes; n++) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  245  		struct anode *unode;
0b69760be6968c Mikulas Patocka     2011-05-08  246  		if ((unode = hpfs_map_anode(s, le32_to_cpu(ranode->u.internal[n].down), &bh1))) {
0b69760be6968c Mikulas Patocka     2011-05-08  247  			unode->up = cpu_to_le32(ra);
ddc19e6e04c113 Al Viro             2012-04-17  248  			unode->btree.flags &= ~BP_fnode_parent;
^1da177e4c3f41 Linus Torvalds      2005-04-16  249  			mark_buffer_dirty(bh1);
^1da177e4c3f41 Linus Torvalds      2005-04-16  250  			brelse(bh1);
^1da177e4c3f41 Linus Torvalds      2005-04-16  251  		}
^1da177e4c3f41 Linus Torvalds      2005-04-16  252  	}
ddc19e6e04c113 Al Viro             2012-04-17  253  	btree->flags |= BP_internal;
^1da177e4c3f41 Linus Torvalds      2005-04-16  254  	btree->n_free_nodes = fnod ? 10 : 58;
^1da177e4c3f41 Linus Torvalds      2005-04-16  255  	btree->n_used_nodes = 2;
0b69760be6968c Mikulas Patocka     2011-05-08  256  	btree->first_free = cpu_to_le16((char *)&btree->u.internal[2] - (char *)btree);
0b69760be6968c Mikulas Patocka     2011-05-08  257  	btree->u.internal[0].file_secno = cpu_to_le32(fs);
0b69760be6968c Mikulas Patocka     2011-05-08  258  	btree->u.internal[0].down = cpu_to_le32(ra);
0b69760be6968c Mikulas Patocka     2011-05-08  259  	btree->u.internal[1].file_secno = cpu_to_le32(-1);
0b69760be6968c Mikulas Patocka     2011-05-08  260  	btree->u.internal[1].down = cpu_to_le32(na);
^1da177e4c3f41 Linus Torvalds      2005-04-16  261  	mark_buffer_dirty(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  262  	brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  263  	mark_buffer_dirty(bh2);
^1da177e4c3f41 Linus Torvalds      2005-04-16  264  	brelse(bh2);
^1da177e4c3f41 Linus Torvalds      2005-04-16  265  	return se;
^1da177e4c3f41 Linus Torvalds      2005-04-16  266  }
^1da177e4c3f41 Linus Torvalds      2005-04-16  267  
^1da177e4c3f41 Linus Torvalds      2005-04-16  268  /*
^1da177e4c3f41 Linus Torvalds      2005-04-16  269   * Remove allocation tree. Recursion would look much nicer but
^1da177e4c3f41 Linus Torvalds      2005-04-16  270   * I want to avoid it because it can cause stack overflow.
^1da177e4c3f41 Linus Torvalds      2005-04-16  271   */
^1da177e4c3f41 Linus Torvalds      2005-04-16  272  
^1da177e4c3f41 Linus Torvalds      2005-04-16  273  void hpfs_remove_btree(struct super_block *s, struct bplus_header *btree)
^1da177e4c3f41 Linus Torvalds      2005-04-16  274  {
^1da177e4c3f41 Linus Torvalds      2005-04-16  275  	struct bplus_header *btree1 = btree;
^1da177e4c3f41 Linus Torvalds      2005-04-16  276  	struct anode *anode = NULL;
^1da177e4c3f41 Linus Torvalds      2005-04-16  277  	anode_secno ano = 0, oano;
^1da177e4c3f41 Linus Torvalds      2005-04-16  278  	struct buffer_head *bh;
^1da177e4c3f41 Linus Torvalds      2005-04-16  279  	int level = 0;
^1da177e4c3f41 Linus Torvalds      2005-04-16  280  	int pos = 0;
^1da177e4c3f41 Linus Torvalds      2005-04-16  281  	int i;
^1da177e4c3f41 Linus Torvalds      2005-04-16  282  	int c1, c2 = 0;
^1da177e4c3f41 Linus Torvalds      2005-04-16  283  	int d1, d2;
^1da177e4c3f41 Linus Torvalds      2005-04-16  284  	go_down:
^1da177e4c3f41 Linus Torvalds      2005-04-16  285  	d2 = 0;
ddc19e6e04c113 Al Viro             2012-04-17  286  	while (bp_internal(btree1)) {
0b69760be6968c Mikulas Patocka     2011-05-08  287  		ano = le32_to_cpu(btree1->u.internal[pos].down);
^1da177e4c3f41 Linus Torvalds      2005-04-16  288  		if (level) brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16 @289  			if (hpfs_stop_cycles(s, ano, &d1, &d2, "hpfs_remove_btree #1"))
^1da177e4c3f41 Linus Torvalds      2005-04-16  290  				return;
^1da177e4c3f41 Linus Torvalds      2005-04-16  291  		if (!(anode = hpfs_map_anode(s, ano, &bh))) return;
68a74490629eb6 Gustavo A. R. Silva 2025-08-11  292  		btree1 = GET_BTREE_PTR(&anode->btree);
^1da177e4c3f41 Linus Torvalds      2005-04-16  293  		level++;
^1da177e4c3f41 Linus Torvalds      2005-04-16  294  		pos = 0;
^1da177e4c3f41 Linus Torvalds      2005-04-16  295  	}
^1da177e4c3f41 Linus Torvalds      2005-04-16  296  	for (i = 0; i < btree1->n_used_nodes; i++)
0b69760be6968c Mikulas Patocka     2011-05-08  297  		hpfs_free_sectors(s, le32_to_cpu(btree1->u.external[i].disk_secno), le32_to_cpu(btree1->u.external[i].length));
^1da177e4c3f41 Linus Torvalds      2005-04-16  298  	go_up:
^1da177e4c3f41 Linus Torvalds      2005-04-16  299  	if (!level) return;
^1da177e4c3f41 Linus Torvalds      2005-04-16  300  	brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  301  		if (hpfs_stop_cycles(s, ano, &c1, &c2, "hpfs_remove_btree #2")) return;
^1da177e4c3f41 Linus Torvalds      2005-04-16  302  	hpfs_free_sectors(s, ano, 1);
^1da177e4c3f41 Linus Torvalds      2005-04-16  303  	oano = ano;
0b69760be6968c Mikulas Patocka     2011-05-08  304  	ano = le32_to_cpu(anode->up);
^1da177e4c3f41 Linus Torvalds      2005-04-16  305  	if (--level) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  306  		if (!(anode = hpfs_map_anode(s, ano, &bh))) return;
68a74490629eb6 Gustavo A. R. Silva 2025-08-11  307  		btree1 = GET_BTREE_PTR(&anode->btree);
^1da177e4c3f41 Linus Torvalds      2005-04-16  308  	} else btree1 = btree;
^1da177e4c3f41 Linus Torvalds      2005-04-16  309  	for (i = 0; i < btree1->n_used_nodes; i++) {
0b69760be6968c Mikulas Patocka     2011-05-08  310  		if (le32_to_cpu(btree1->u.internal[i].down) == oano) {
^1da177e4c3f41 Linus Torvalds      2005-04-16  311  			if ((pos = i + 1) < btree1->n_used_nodes)
^1da177e4c3f41 Linus Torvalds      2005-04-16  312  				goto go_down;
^1da177e4c3f41 Linus Torvalds      2005-04-16  313  			else
^1da177e4c3f41 Linus Torvalds      2005-04-16  314  				goto go_up;
^1da177e4c3f41 Linus Torvalds      2005-04-16  315  		}
^1da177e4c3f41 Linus Torvalds      2005-04-16  316  	}
^1da177e4c3f41 Linus Torvalds      2005-04-16  317  	hpfs_error(s,
^1da177e4c3f41 Linus Torvalds      2005-04-16  318  		   "reference to anode %08x not found in anode %08x "
^1da177e4c3f41 Linus Torvalds      2005-04-16  319  		   "(probably bad up pointer)",
^1da177e4c3f41 Linus Torvalds      2005-04-16  320  		   oano, level ? ano : -1);
^1da177e4c3f41 Linus Torvalds      2005-04-16  321  	if (level)
^1da177e4c3f41 Linus Torvalds      2005-04-16  322  		brelse(bh);
^1da177e4c3f41 Linus Torvalds      2005-04-16  323  }
^1da177e4c3f41 Linus Torvalds      2005-04-16  324  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] hpfs: obsolete check=none mount option
  2026-02-26 13:19 [PATCH] hpfs: obsolete check=none mount option Tetsuo Handa
  2026-02-27 14:20 ` kernel test robot
@ 2026-03-12 13:24 ` Tetsuo Handa
  2026-03-23 13:38   ` Tetsuo Handa
  1 sibling, 1 reply; 4+ messages in thread
From: Tetsuo Handa @ 2026-03-12 13:24 UTC (permalink / raw)
  To: Mikulas Patocka, Linus Torvalds; +Cc: linux-fsdevel

Linus, which approach is acceptable for you?

(1) https://lkml.kernel.org/r/51bdd056-61dd-4b57-8780-324b2f8bc99f@I-love.SAKURA.ne.jp

(2) https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git/commit/fs/hpfs/super.c?h=for-6.20/hpfs-changes&id=a4664a2bc61c2abbc772df9139da9dbd2b26dc7f

(3) https://lkml.kernel.org/r/fd8dabf8-f0a5-418a-9b3d-da981101ca86@I-love.SAKURA.ne.jp


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] hpfs: obsolete check=none mount option
  2026-03-12 13:24 ` Tetsuo Handa
@ 2026-03-23 13:38   ` Tetsuo Handa
  0 siblings, 0 replies; 4+ messages in thread
From: Tetsuo Handa @ 2026-03-23 13:38 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-fsdevel, Mikulas Patocka

Linus, we are blocked by your comment. Please tell us how we can make progress.

On 2026/03/12 22:24, Tetsuo Handa wrote:
> Linus, which approach is acceptable for you?
> 
> (1) https://lkml.kernel.org/r/51bdd056-61dd-4b57-8780-324b2f8bc99f@I-love.SAKURA.ne.jp
> 
> (2) https://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git/commit/fs/hpfs/super.c?h=for-6.20/hpfs-changes&id=a4664a2bc61c2abbc772df9139da9dbd2b26dc7f
> 
> (3) https://lkml.kernel.org/r/fd8dabf8-f0a5-418a-9b3d-da981101ca86@I-love.SAKURA.ne.jp
> 

-------- Forwarded Message --------
Date: Tue, 10 Feb 2026 12:21:21 +0100 (CET)
From: Mikulas Patocka <mpatocka@redhat.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
cc: linux-fsdevel@vger.kernel.org, Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>, syzkaller <syzkaller@googlegroups.com>
Subject: Re: [git pull] HPFS changes for 6.20
Message-ID: <0a4797ab-07a5-11ef-074f-19ad637f84ea@redhat.com>
References: <6dd35359-3ffa-8cd5-a614-5410a25335c0@redhat.com> <CAHk-=wjmFiptPgaPx9vY3RG=rqO452UmOAPb1y_f9GQBtuJVjg@mail.gmail.com>

On Mon, 9 Feb 2026, Linus Torvalds wrote:

> On Mon, 9 Feb 2026 at 09:01, Mikulas Patocka <mpatocka@redhat.com> wrote:
> >
> >   hpfs: disable the no-check mode (2026-02-02 18:06:33 +0100)
> 
> This looks like a totally bogus commit.
> 
> If "check=none" suddenly means the same as "check=normal", then why
> does that "none" thing exist at all?
> 
> None of this makes any sense.
> 
>              Linus

I wanted to keep the "check=none" option so that I don't break scripts or 
/etc/fstab configurations that people may have.

If you don't like it, you can drop it, it's not a big deal. The syzbot 
people will have to deal with it in some other way.

Mikulas


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-03-23 13:38 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-26 13:19 [PATCH] hpfs: obsolete check=none mount option Tetsuo Handa
2026-02-27 14:20 ` kernel test robot
2026-03-12 13:24 ` Tetsuo Handa
2026-03-23 13:38   ` Tetsuo Handa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox