]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
libext2fs: fix orphan file size > kernel limit with large blocksize maint master
authorBaokun Li <libaokun1@huawei.com>
Thu, 20 Nov 2025 13:55:14 +0000 (21:55 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 12 Mar 2026 22:30:13 +0000 (18:30 -0400)
Kernel commit 0a6ce20c1564 ("ext4: verify orphan file size is not too big")
limits the maximum supported orphan file size to 8 << 20.

However, in e2fsprogs, the orphan file size is set to 32–512 filesystem
blocks when creating a filesystem.

With 64k block size, formatting an ext4 fs >32G gives an orphan file bigger
than the kernel allows, so mount prints an error and fails:

    EXT4-fs (vdb): orphan file too big: 8650752
    EXT4-fs (vdb): mount failed

Thus, orphan file size is capped at 512 filesystem blocks in both e2fsprogs
and the kernel.

Signed-off-by: Baokun Li <libaokun1@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Message-ID: <20251120135514.3013973-1-libaokun@huaweicloud.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
lib/ext2fs/orphan.c

index 14ac35694a39cbcff37ee62beee23fb391abb797..0f1889cbcf619809c0277d81173456f9abfe928d 100644 (file)
@@ -15,6 +15,8 @@
 #include "ext2_fs.h"
 #include "ext2fsP.h"
 
 #include "ext2_fs.h"
 #include "ext2fsP.h"
 
+#define EXT4_MAX_ORPHAN_FILE_BLOCKS 512
+
 errcode_t ext2fs_truncate_orphan_file(ext2_filsys fs)
 {
        struct ext2_inode inode;
 errcode_t ext2fs_truncate_orphan_file(ext2_filsys fs)
 {
        struct ext2_inode inode;
@@ -129,6 +131,9 @@ errcode_t ext2fs_create_orphan_file(ext2_filsys fs, blk_t num_blocks)
        struct ext4_orphan_block_tail *ob_tail;
        time_t now;
 
        struct ext4_orphan_block_tail *ob_tail;
        time_t now;
 
+       if (num_blocks > EXT4_MAX_ORPHAN_FILE_BLOCKS)
+               num_blocks = EXT4_MAX_ORPHAN_FILE_BLOCKS;
+
        if (ino) {
                err = ext2fs_read_inode(fs, ino, &inode);
                if (err)
        if (ino) {
                err = ext2fs_read_inode(fs, ino, &inode);
                if (err)