* [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