This is a note to let you know that I've just added the patch titled ext4: don't use the orphan list when migrating an inode to the 5.10-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: ext4-don-t-use-the-orphan-list-when-migrating-an-inode.patch and it can be found in the queue-5.10 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. >From 6eeaf88fd586f05aaf1d48cb3a139d2a5c6eb055 Mon Sep 17 00:00:00 2001 From: Theodore Ts'o <tytso@xxxxxxx> Date: Wed, 5 Jan 2022 23:59:56 -0500 Subject: ext4: don't use the orphan list when migrating an inode From: Theodore Ts'o <tytso@xxxxxxx> commit 6eeaf88fd586f05aaf1d48cb3a139d2a5c6eb055 upstream. We probably want to remove the indirect block to extents migration feature after a deprecation window, but until then, let's fix a potential data loss problem caused by the fact that we put the tmp_inode on the orphan list. In the unlikely case where we crash and do a journal recovery, the data blocks belonging to the inode being migrated are also represented in the tmp_inode on the orphan list --- and so its data blocks will get marked unallocated, and available for reuse. Instead, stop putting the tmp_inode on the oprhan list. So in the case where we crash while migrating the inode, we'll leak an inode, which is not a disaster. It will be easily fixed the next time we run fsck, and it's better than potentially having blocks getting claimed by two different files, and losing data as a result. Signed-off-by: Theodore Ts'o <tytso@xxxxxxx> Reviewed-by: Lukas Czerner <lczerner@xxxxxxxxxx> Cc: stable@xxxxxxxxxx Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- fs/ext4/migrate.c | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) --- a/fs/ext4/migrate.c +++ b/fs/ext4/migrate.c @@ -437,12 +437,12 @@ int ext4_ext_migrate(struct inode *inode percpu_down_write(&sbi->s_writepages_rwsem); /* - * Worst case we can touch the allocation bitmaps, a bgd - * block, and a block to link in the orphan list. We do need - * need to worry about credits for modifying the quota inode. + * Worst case we can touch the allocation bitmaps and a block + * group descriptor block. We do need need to worry about + * credits for modifying the quota inode. */ handle = ext4_journal_start(inode, EXT4_HT_MIGRATE, - 4 + EXT4_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb)); + 3 + EXT4_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb)); if (IS_ERR(handle)) { retval = PTR_ERR(handle); @@ -463,10 +463,6 @@ int ext4_ext_migrate(struct inode *inode * Use the correct seed for checksum (i.e. the seed from 'inode'). This * is so that the metadata blocks will have the correct checksum after * the migration. - * - * Note however that, if a crash occurs during the migration process, - * the recovery process is broken because the tmp_inode checksums will - * be wrong and the orphans cleanup will fail. */ ei = EXT4_I(inode); EXT4_I(tmp_inode)->i_csum_seed = ei->i_csum_seed; @@ -478,7 +474,6 @@ int ext4_ext_migrate(struct inode *inode clear_nlink(tmp_inode); ext4_ext_tree_init(handle, tmp_inode); - ext4_orphan_add(handle, tmp_inode); ext4_journal_stop(handle); /* @@ -503,12 +498,6 @@ int ext4_ext_migrate(struct inode *inode handle = ext4_journal_start(inode, EXT4_HT_MIGRATE, 1); if (IS_ERR(handle)) { - /* - * It is impossible to update on-disk structures without - * a handle, so just rollback in-core changes and live other - * work to orphan_list_cleanup() - */ - ext4_orphan_del(NULL, tmp_inode); retval = PTR_ERR(handle); goto out_tmp_inode; } Patches currently in stable-queue which might be from tytso@xxxxxxx are queue-5.10/ext4-avoid-trim-error-on-fs-with-small-groups.patch queue-5.10/ext4-fast-commit-may-miss-tracking-unwritten-range-during-ftruncate.patch queue-5.10/ext4-use-ext4_ext_remove_space-for-fast-commit-replay-delete-range.patch queue-5.10/ext4-destroy-ext4_fc_dentry_cachep-kmemcache-on-module-removal.patch queue-5.10/ext4-make-sure-quota-gets-properly-shutdown-on-error.patch queue-5.10/ext4-don-t-use-the-orphan-list-when-migrating-an-inode.patch queue-5.10/ext4-fix-fast-commit-may-miss-tracking-range-for-falloc_fl_zero_range.patch queue-5.10/ext4-fix-null-ptr-deref-in-__ext4_journal_ensure_credits.patch queue-5.10/ext4-make-sure-to-reset-inode-lockdep-class-when-quota-enabling-fails.patch queue-5.10/ext4-set-csum-seed-in-tmp-inode-while-migrating-to-extents.patch queue-5.10/ext4-fix-bug_on-in-ext4_bread-when-write-quota-data.patch queue-5.10/ext4-initialize-err_blk-before-calling-__ext4_get_inode_loc.patch queue-5.10/ext4-fix-a-possible-abba-deadlock-due-to-busy-pa.patch queue-5.10/pci-pciehp-use-down_read-write_nested-reset_lock-to-fix-lockdep-errors.patch