Linux Btrfs filesystem development
 help / color / mirror / Atom feed
From: Qu Wenruo <quwenruo.btrfs@gmx.com>
To: fdmanana@kernel.org, linux-btrfs@vger.kernel.org
Subject: Re: [PATCH 1/4] btrfs: use NOFS context when getting inodes during logging and log replay
Date: Fri, 14 Jun 2024 07:07:10 +0930	[thread overview]
Message-ID: <04f49180-cdb0-4665-abe4-136dbc85fbb3@gmx.com> (raw)
In-Reply-To: <818b41faf6260be972ffa3bd436dda518963384b.1718276261.git.fdmanana@suse.com>



在 2024/6/13 20:35, fdmanana@kernel.org 写道:
> From: Filipe Manana <fdmanana@suse.com>
>
> During inode logging (and log replay too), we are holding a transaction
> handle and we often need to call btrfs_iget(), which will read an inode
> from its subvolume btree if it's not loaded in memory and that results in
> allocating an inode with GFP_KERNEL semantics at the btrfs_alloc_inode()
> callback - and this may recurse into the filesystem in case we are under
> memory pressure and attempt to commit the current transaction, resulting
> in a deadlock since the logging (or log replay) task is holding a
> transaction handle open.
>
> Syzbot reported this with the following stack traces:
>
>     ======================================================
>     WARNING: possible circular locking dependency detected
>     6.10.0-rc2-syzkaller-00361-g061d1af7b030 #0 Not tainted
>     ------------------------------------------------------
>     syz-executor.1/9919 is trying to acquire lock:
>     ffffffff8dd3aac0 (fs_reclaim){+.+.}-{0:0}, at: might_alloc include/linux/sched/mm.h:334 [inline]
>     ffffffff8dd3aac0 (fs_reclaim){+.+.}-{0:0}, at: slab_pre_alloc_hook mm/slub.c:3891 [inline]
>     ffffffff8dd3aac0 (fs_reclaim){+.+.}-{0:0}, at: slab_alloc_node mm/slub.c:3981 [inline]
>     ffffffff8dd3aac0 (fs_reclaim){+.+.}-{0:0}, at: kmem_cache_alloc_lru_noprof+0x58/0x2f0 mm/slub.c:4020
>
>     but task is already holding lock:
>     ffff88804b569358 (&ei->log_mutex){+.+.}-{3:3}, at: btrfs_log_inode+0x39c/0x4660 fs/btrfs/tree-log.c:6481
>
>     which lock already depends on the new lock.
>
>     the existing dependency chain (in reverse order) is:
>
>     -> #3 (&ei->log_mutex){+.+.}-{3:3}:
>            __mutex_lock_common kernel/locking/mutex.c:608 [inline]
>            __mutex_lock+0x175/0x9c0 kernel/locking/mutex.c:752
>            btrfs_log_inode+0x39c/0x4660 fs/btrfs/tree-log.c:6481
>            btrfs_log_inode_parent+0x8cb/0x2a90 fs/btrfs/tree-log.c:7079
>            btrfs_log_dentry_safe+0x59/0x80 fs/btrfs/tree-log.c:7180
>            btrfs_sync_file+0x9c1/0xe10 fs/btrfs/file.c:1959
>            vfs_fsync_range+0x141/0x230 fs/sync.c:188
>            generic_write_sync include/linux/fs.h:2794 [inline]
>            btrfs_do_write_iter+0x584/0x10c0 fs/btrfs/file.c:1705
>            new_sync_write fs/read_write.c:497 [inline]
>            vfs_write+0x6b6/0x1140 fs/read_write.c:590
>            ksys_write+0x12f/0x260 fs/read_write.c:643
>            do_syscall_32_irqs_on arch/x86/entry/common.c:165 [inline]
>            __do_fast_syscall_32+0x73/0x120 arch/x86/entry/common.c:386
>            do_fast_syscall_32+0x32/0x80 arch/x86/entry/common.c:411
>            entry_SYSENTER_compat_after_hwframe+0x84/0x8e
>
>     -> #2 (btrfs_trans_num_extwriters){++++}-{0:0}:
>            join_transaction+0x164/0xf40 fs/btrfs/transaction.c:315
>            start_transaction+0x427/0x1a70 fs/btrfs/transaction.c:700
>            btrfs_commit_super+0xa1/0x110 fs/btrfs/disk-io.c:4170
>            close_ctree+0xcb0/0xf90 fs/btrfs/disk-io.c:4324
>            generic_shutdown_super+0x159/0x3d0 fs/super.c:642
>            kill_anon_super+0x3a/0x60 fs/super.c:1226
>            btrfs_kill_super+0x3b/0x50 fs/btrfs/super.c:2096
>            deactivate_locked_super+0xbe/0x1a0 fs/super.c:473
>            deactivate_super+0xde/0x100 fs/super.c:506
>            cleanup_mnt+0x222/0x450 fs/namespace.c:1267
>            task_work_run+0x14e/0x250 kernel/task_work.c:180
>            resume_user_mode_work include/linux/resume_user_mode.h:50 [inline]
>            exit_to_user_mode_loop kernel/entry/common.c:114 [inline]
>            exit_to_user_mode_prepare include/linux/entry-common.h:328 [inline]
>            __syscall_exit_to_user_mode_work kernel/entry/common.c:207 [inline]
>            syscall_exit_to_user_mode+0x278/0x2a0 kernel/entry/common.c:218
>            __do_fast_syscall_32+0x80/0x120 arch/x86/entry/common.c:389
>            do_fast_syscall_32+0x32/0x80 arch/x86/entry/common.c:411
>            entry_SYSENTER_compat_after_hwframe+0x84/0x8e
>
>     -> #1 (btrfs_trans_num_writers){++++}-{0:0}:
>            __lock_release kernel/locking/lockdep.c:5468 [inline]
>            lock_release+0x33e/0x6c0 kernel/locking/lockdep.c:5774
>            percpu_up_read include/linux/percpu-rwsem.h:99 [inline]
>            __sb_end_write include/linux/fs.h:1650 [inline]
>            sb_end_intwrite include/linux/fs.h:1767 [inline]
>            __btrfs_end_transaction+0x5ca/0x920 fs/btrfs/transaction.c:1071
>            btrfs_commit_inode_delayed_inode+0x228/0x330 fs/btrfs/delayed-inode.c:1301
>            btrfs_evict_inode+0x960/0xe80 fs/btrfs/inode.c:5291
>            evict+0x2ed/0x6c0 fs/inode.c:667
>            iput_final fs/inode.c:1741 [inline]
>            iput.part.0+0x5a8/0x7f0 fs/inode.c:1767
>            iput+0x5c/0x80 fs/inode.c:1757
>            dentry_unlink_inode+0x295/0x480 fs/dcache.c:400
>            __dentry_kill+0x1d0/0x600 fs/dcache.c:603
>            dput.part.0+0x4b1/0x9b0 fs/dcache.c:845
>            dput+0x1f/0x30 fs/dcache.c:835
>            ovl_stack_put+0x60/0x90 fs/overlayfs/util.c:132
>            ovl_destroy_inode+0xc6/0x190 fs/overlayfs/super.c:182
>            destroy_inode+0xc4/0x1b0 fs/inode.c:311
>            iput_final fs/inode.c:1741 [inline]
>            iput.part.0+0x5a8/0x7f0 fs/inode.c:1767
>            iput+0x5c/0x80 fs/inode.c:1757
>            dentry_unlink_inode+0x295/0x480 fs/dcache.c:400
>            __dentry_kill+0x1d0/0x600 fs/dcache.c:603
>            shrink_kill fs/dcache.c:1048 [inline]
>            shrink_dentry_list+0x140/0x5d0 fs/dcache.c:1075
>            prune_dcache_sb+0xeb/0x150 fs/dcache.c:1156
>            super_cache_scan+0x32a/0x550 fs/super.c:221
>            do_shrink_slab+0x44f/0x11c0 mm/shrinker.c:435
>            shrink_slab_memcg mm/shrinker.c:548 [inline]
>            shrink_slab+0xa87/0x1310 mm/shrinker.c:626
>            shrink_one+0x493/0x7c0 mm/vmscan.c:4790
>            shrink_many mm/vmscan.c:4851 [inline]
>            lru_gen_shrink_node+0x89f/0x1750 mm/vmscan.c:4951
>            shrink_node mm/vmscan.c:5910 [inline]
>            kswapd_shrink_node mm/vmscan.c:6720 [inline]
>            balance_pgdat+0x1105/0x1970 mm/vmscan.c:6911
>            kswapd+0x5ea/0xbf0 mm/vmscan.c:7180
>            kthread+0x2c1/0x3a0 kernel/kthread.c:389
>            ret_from_fork+0x45/0x80 arch/x86/kernel/process.c:147
>            ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
>
>     -> #0 (fs_reclaim){+.+.}-{0:0}:
>            check_prev_add kernel/locking/lockdep.c:3134 [inline]
>            check_prevs_add kernel/locking/lockdep.c:3253 [inline]
>            validate_chain kernel/locking/lockdep.c:3869 [inline]
>            __lock_acquire+0x2478/0x3b30 kernel/locking/lockdep.c:5137
>            lock_acquire kernel/locking/lockdep.c:5754 [inline]
>            lock_acquire+0x1b1/0x560 kernel/locking/lockdep.c:5719
>            __fs_reclaim_acquire mm/page_alloc.c:3801 [inline]
>            fs_reclaim_acquire+0x102/0x160 mm/page_alloc.c:3815
>            might_alloc include/linux/sched/mm.h:334 [inline]
>            slab_pre_alloc_hook mm/slub.c:3891 [inline]
>            slab_alloc_node mm/slub.c:3981 [inline]
>            kmem_cache_alloc_lru_noprof+0x58/0x2f0 mm/slub.c:4020
>            btrfs_alloc_inode+0x118/0xb20 fs/btrfs/inode.c:8411
>            alloc_inode+0x5d/0x230 fs/inode.c:261
>            iget5_locked fs/inode.c:1235 [inline]
>            iget5_locked+0x1c9/0x2c0 fs/inode.c:1228
>            btrfs_iget_locked fs/btrfs/inode.c:5590 [inline]
>            btrfs_iget_path fs/btrfs/inode.c:5607 [inline]
>            btrfs_iget+0xfb/0x230 fs/btrfs/inode.c:5636
>            add_conflicting_inode fs/btrfs/tree-log.c:5657 [inline]
>            copy_inode_items_to_log+0x1039/0x1e30 fs/btrfs/tree-log.c:5928
>            btrfs_log_inode+0xa48/0x4660 fs/btrfs/tree-log.c:6592
>            log_new_delayed_dentries fs/btrfs/tree-log.c:6363 [inline]
>            btrfs_log_inode+0x27dd/0x4660 fs/btrfs/tree-log.c:6718
>            btrfs_log_all_parents fs/btrfs/tree-log.c:6833 [inline]
>            btrfs_log_inode_parent+0x22ba/0x2a90 fs/btrfs/tree-log.c:7141
>            btrfs_log_dentry_safe+0x59/0x80 fs/btrfs/tree-log.c:7180
>            btrfs_sync_file+0x9c1/0xe10 fs/btrfs/file.c:1959
>            vfs_fsync_range+0x141/0x230 fs/sync.c:188
>            generic_write_sync include/linux/fs.h:2794 [inline]
>            btrfs_do_write_iter+0x584/0x10c0 fs/btrfs/file.c:1705
>            do_iter_readv_writev+0x504/0x780 fs/read_write.c:741
>            vfs_writev+0x36f/0xde0 fs/read_write.c:971
>            do_pwritev+0x1b2/0x260 fs/read_write.c:1072
>            __do_compat_sys_pwritev2 fs/read_write.c:1218 [inline]
>            __se_compat_sys_pwritev2 fs/read_write.c:1210 [inline]
>            __ia32_compat_sys_pwritev2+0x121/0x1b0 fs/read_write.c:1210
>            do_syscall_32_irqs_on arch/x86/entry/common.c:165 [inline]
>            __do_fast_syscall_32+0x73/0x120 arch/x86/entry/common.c:386
>            do_fast_syscall_32+0x32/0x80 arch/x86/entry/common.c:411
>            entry_SYSENTER_compat_after_hwframe+0x84/0x8e
>
>     other info that might help us debug this:
>
>     Chain exists of:
>       fs_reclaim --> btrfs_trans_num_extwriters --> &ei->log_mutex
>
>      Possible unsafe locking scenario:
>
>            CPU0                    CPU1
>            ----                    ----
>       lock(&ei->log_mutex);
>                                    lock(btrfs_trans_num_extwriters);
>                                    lock(&ei->log_mutex);
>       lock(fs_reclaim);
>
>      *** DEADLOCK ***
>
>     7 locks held by syz-executor.1/9919:
>      #0: ffff88802be20420 (sb_writers#23){.+.+}-{0:0}, at: do_pwritev+0x1b2/0x260 fs/read_write.c:1072
>      #1: ffff888065c0f8f0 (&sb->s_type->i_mutex_key#33){++++}-{3:3}, at: inode_lock include/linux/fs.h:791 [inline]
>      #1: ffff888065c0f8f0 (&sb->s_type->i_mutex_key#33){++++}-{3:3}, at: btrfs_inode_lock+0xc8/0x110 fs/btrfs/inode.c:385
>      #2: ffff888065c0f778 (&ei->i_mmap_lock){++++}-{3:3}, at: btrfs_inode_lock+0xee/0x110 fs/btrfs/inode.c:388
>      #3: ffff88802be20610 (sb_internal#4){.+.+}-{0:0}, at: btrfs_sync_file+0x95b/0xe10 fs/btrfs/file.c:1952
>      #4: ffff8880546323f0 (btrfs_trans_num_writers){++++}-{0:0}, at: join_transaction+0x430/0xf40 fs/btrfs/transaction.c:290
>      #5: ffff888054632418 (btrfs_trans_num_extwriters){++++}-{0:0}, at: join_transaction+0x430/0xf40 fs/btrfs/transaction.c:290
>      #6: ffff88804b569358 (&ei->log_mutex){+.+.}-{3:3}, at: btrfs_log_inode+0x39c/0x4660 fs/btrfs/tree-log.c:6481
>
>     stack backtrace:
>     CPU: 2 PID: 9919 Comm: syz-executor.1 Not tainted 6.10.0-rc2-syzkaller-00361-g061d1af7b030 #0
>     Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.2-debian-1.16.2-1 04/01/2014
>     Call Trace:
>      <TASK>
>      __dump_stack lib/dump_stack.c:88 [inline]
>      dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:114
>      check_noncircular+0x31a/0x400 kernel/locking/lockdep.c:2187
>      check_prev_add kernel/locking/lockdep.c:3134 [inline]
>      check_prevs_add kernel/locking/lockdep.c:3253 [inline]
>      validate_chain kernel/locking/lockdep.c:3869 [inline]
>      __lock_acquire+0x2478/0x3b30 kernel/locking/lockdep.c:5137
>      lock_acquire kernel/locking/lockdep.c:5754 [inline]
>      lock_acquire+0x1b1/0x560 kernel/locking/lockdep.c:5719
>      __fs_reclaim_acquire mm/page_alloc.c:3801 [inline]
>      fs_reclaim_acquire+0x102/0x160 mm/page_alloc.c:3815
>      might_alloc include/linux/sched/mm.h:334 [inline]
>      slab_pre_alloc_hook mm/slub.c:3891 [inline]
>      slab_alloc_node mm/slub.c:3981 [inline]
>      kmem_cache_alloc_lru_noprof+0x58/0x2f0 mm/slub.c:4020
>      btrfs_alloc_inode+0x118/0xb20 fs/btrfs/inode.c:8411
>      alloc_inode+0x5d/0x230 fs/inode.c:261
>      iget5_locked fs/inode.c:1235 [inline]
>      iget5_locked+0x1c9/0x2c0 fs/inode.c:1228
>      btrfs_iget_locked fs/btrfs/inode.c:5590 [inline]
>      btrfs_iget_path fs/btrfs/inode.c:5607 [inline]
>      btrfs_iget+0xfb/0x230 fs/btrfs/inode.c:5636
>      add_conflicting_inode fs/btrfs/tree-log.c:5657 [inline]
>      copy_inode_items_to_log+0x1039/0x1e30 fs/btrfs/tree-log.c:5928
>      btrfs_log_inode+0xa48/0x4660 fs/btrfs/tree-log.c:6592
>      log_new_delayed_dentries fs/btrfs/tree-log.c:6363 [inline]
>      btrfs_log_inode+0x27dd/0x4660 fs/btrfs/tree-log.c:6718
>      btrfs_log_all_parents fs/btrfs/tree-log.c:6833 [inline]
>      btrfs_log_inode_parent+0x22ba/0x2a90 fs/btrfs/tree-log.c:7141
>      btrfs_log_dentry_safe+0x59/0x80 fs/btrfs/tree-log.c:7180
>      btrfs_sync_file+0x9c1/0xe10 fs/btrfs/file.c:1959
>      vfs_fsync_range+0x141/0x230 fs/sync.c:188
>      generic_write_sync include/linux/fs.h:2794 [inline]
>      btrfs_do_write_iter+0x584/0x10c0 fs/btrfs/file.c:1705
>      do_iter_readv_writev+0x504/0x780 fs/read_write.c:741
>      vfs_writev+0x36f/0xde0 fs/read_write.c:971
>      do_pwritev+0x1b2/0x260 fs/read_write.c:1072
>      __do_compat_sys_pwritev2 fs/read_write.c:1218 [inline]
>      __se_compat_sys_pwritev2 fs/read_write.c:1210 [inline]
>      __ia32_compat_sys_pwritev2+0x121/0x1b0 fs/read_write.c:1210
>      do_syscall_32_irqs_on arch/x86/entry/common.c:165 [inline]
>      __do_fast_syscall_32+0x73/0x120 arch/x86/entry/common.c:386
>      do_fast_syscall_32+0x32/0x80 arch/x86/entry/common.c:411
>      entry_SYSENTER_compat_after_hwframe+0x84/0x8e
>     RIP: 0023:0xf7334579
>     Code: b8 01 10 06 03 (...)
>     RSP: 002b:00000000f5f265ac EFLAGS: 00000292 ORIG_RAX: 000000000000017b
>     RAX: ffffffffffffffda RBX: 0000000000000004 RCX: 00000000200002c0
>     RDX: 0000000000000001 RSI: 0000000000000000 RDI: 0000000000000000
>     RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000
>     R10: 0000000000000000 R11: 0000000000000292 R12: 0000000000000000
>     R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
>      </TASK>
>
> Fix this by ensuring we are under a NOFS scope whenever we call
> btrfs_iget() during inode logging and log replay.
>
> Reported-by: syzbot+8576cfa84070dce4d59b@syzkaller.appspotmail.com
> Link: https://lore.kernel.org/linux-btrfs/000000000000274a3a061abbd928@google.com/
> Fixes: 712e36c5f2a7 ("btrfs: use GFP_KERNEL in btrfs_alloc_inode")

I'm wondering if logging is the only location where we can trigger the
deadlock.

Would regular inode_get() causing such deadlock?

Otherwise the patch looks good to me.

Thanks,
Qu

> Signed-off-by: Filipe Manana <fdmanana@suse.com>
> ---
>   fs/btrfs/tree-log.c | 43 ++++++++++++++++++++++++++++---------------
>   1 file changed, 28 insertions(+), 15 deletions(-)
>
> diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
> index 6d892d76d4fb..4c9cc8eecb30 100644
> --- a/fs/btrfs/tree-log.c
> +++ b/fs/btrfs/tree-log.c
> @@ -138,6 +138,25 @@ static void wait_log_commit(struct btrfs_root *root, int transid);
>    * and once to do all the other items.
>    */
>
> +static struct inode *btrfs_iget_logging(u64 objectid, struct btrfs_root *root)
> +{
> +	unsigned int nofs_flag;
> +	struct inode *inode;
> +
> +	/*
> +	 * We're holding a transaction handle whether we are logging or
> +	 * replaying a log tree, so we must make sure NOFS semantics apply
> +	 * because btrfs_alloc_inode() may be triggered and it uses GFP_KERNEL
> +	 * to allocate an inode, which can recurse back into the filesystem and
> +	 * attempt a transaction commit, resulting in a deadlock.
> +	 */
> +	nofs_flag = memalloc_nofs_save();
> +	inode = btrfs_iget(root->fs_info->sb, objectid, root);
> +	memalloc_nofs_restore(nofs_flag);
> +
> +	return inode;
> +}
> +
>   /*
>    * start a sub transaction and setup the log tree
>    * this increments the log tree writer count to make the people
> @@ -600,7 +619,7 @@ static noinline struct inode *read_one_inode(struct btrfs_root *root,
>   {
>   	struct inode *inode;
>
> -	inode = btrfs_iget(root->fs_info->sb, objectid, root);
> +	inode = btrfs_iget_logging(objectid, root);
>   	if (IS_ERR(inode))
>   		inode = NULL;
>   	return inode;
> @@ -5443,7 +5462,6 @@ static int log_new_dir_dentries(struct btrfs_trans_handle *trans,
>   				struct btrfs_log_ctx *ctx)
>   {
>   	struct btrfs_root *root = start_inode->root;
> -	struct btrfs_fs_info *fs_info = root->fs_info;
>   	struct btrfs_path *path;
>   	LIST_HEAD(dir_list);
>   	struct btrfs_dir_list *dir_elem;
> @@ -5504,7 +5522,7 @@ static int log_new_dir_dentries(struct btrfs_trans_handle *trans,
>   				continue;
>
>   			btrfs_release_path(path);
> -			di_inode = btrfs_iget(fs_info->sb, di_key.objectid, root);
> +			di_inode = btrfs_iget_logging(di_key.objectid, root);
>   			if (IS_ERR(di_inode)) {
>   				ret = PTR_ERR(di_inode);
>   				goto out;
> @@ -5564,7 +5582,7 @@ static int log_new_dir_dentries(struct btrfs_trans_handle *trans,
>   		btrfs_add_delayed_iput(curr_inode);
>   		curr_inode = NULL;
>
> -		vfs_inode = btrfs_iget(fs_info->sb, ino, root);
> +		vfs_inode = btrfs_iget_logging(ino, root);
>   		if (IS_ERR(vfs_inode)) {
>   			ret = PTR_ERR(vfs_inode);
>   			break;
> @@ -5659,7 +5677,7 @@ static int add_conflicting_inode(struct btrfs_trans_handle *trans,
>   	if (ctx->num_conflict_inodes >= MAX_CONFLICT_INODES)
>   		return BTRFS_LOG_FORCE_COMMIT;
>
> -	inode = btrfs_iget(root->fs_info->sb, ino, root);
> +	inode = btrfs_iget_logging(ino, root);
>   	/*
>   	 * If the other inode that had a conflicting dir entry was deleted in
>   	 * the current transaction then we either:
> @@ -5760,7 +5778,6 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans,
>   				  struct btrfs_root *root,
>   				  struct btrfs_log_ctx *ctx)
>   {
> -	struct btrfs_fs_info *fs_info = root->fs_info;
>   	int ret = 0;
>
>   	/*
> @@ -5791,7 +5808,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans,
>   		list_del(&curr->list);
>   		kfree(curr);
>
> -		inode = btrfs_iget(fs_info->sb, ino, root);
> +		inode = btrfs_iget_logging(ino, root);
>   		/*
>   		 * If the other inode that had a conflicting dir entry was
>   		 * deleted in the current transaction, we need to log its parent
> @@ -5802,7 +5819,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans,
>   			if (ret != -ENOENT)
>   				break;
>
> -			inode = btrfs_iget(fs_info->sb, parent, root);
> +			inode = btrfs_iget_logging(parent, root);
>   			if (IS_ERR(inode)) {
>   				ret = PTR_ERR(inode);
>   				break;
> @@ -6324,7 +6341,6 @@ static int log_new_delayed_dentries(struct btrfs_trans_handle *trans,
>   				    struct btrfs_log_ctx *ctx)
>   {
>   	const bool orig_log_new_dentries = ctx->log_new_dentries;
> -	struct btrfs_fs_info *fs_info = trans->fs_info;
>   	struct btrfs_delayed_item *item;
>   	int ret = 0;
>
> @@ -6350,7 +6366,7 @@ static int log_new_delayed_dentries(struct btrfs_trans_handle *trans,
>   		if (key.type == BTRFS_ROOT_ITEM_KEY)
>   			continue;
>
> -		di_inode = btrfs_iget(fs_info->sb, key.objectid, inode->root);
> +		di_inode = btrfs_iget_logging(key.objectid, inode->root);
>   		if (IS_ERR(di_inode)) {
>   			ret = PTR_ERR(di_inode);
>   			break;
> @@ -6734,7 +6750,6 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans,
>   				 struct btrfs_inode *inode,
>   				 struct btrfs_log_ctx *ctx)
>   {
> -	struct btrfs_fs_info *fs_info = trans->fs_info;
>   	int ret;
>   	struct btrfs_path *path;
>   	struct btrfs_key key;
> @@ -6799,8 +6814,7 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans,
>   				cur_offset = item_size;
>   			}
>
> -			dir_inode = btrfs_iget(fs_info->sb, inode_key.objectid,
> -					       root);
> +			dir_inode = btrfs_iget_logging(inode_key.objectid, root);
>   			/*
>   			 * If the parent inode was deleted, return an error to
>   			 * fallback to a transaction commit. This is to prevent
> @@ -6862,7 +6876,6 @@ static int log_new_ancestors(struct btrfs_trans_handle *trans,
>   	btrfs_item_key_to_cpu(path->nodes[0], &found_key, path->slots[0]);
>
>   	while (true) {
> -		struct btrfs_fs_info *fs_info = root->fs_info;
>   		struct extent_buffer *leaf;
>   		int slot;
>   		struct btrfs_key search_key;
> @@ -6877,7 +6890,7 @@ static int log_new_ancestors(struct btrfs_trans_handle *trans,
>   		search_key.objectid = found_key.offset;
>   		search_key.type = BTRFS_INODE_ITEM_KEY;
>   		search_key.offset = 0;
> -		inode = btrfs_iget(fs_info->sb, ino, root);
> +		inode = btrfs_iget_logging(ino, root);
>   		if (IS_ERR(inode))
>   			return PTR_ERR(inode);
>

  reply	other threads:[~2024-06-13 21:37 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-13 11:05 [PATCH 0/4] btrfs: fix a deadlock with reclaim during logging/log replay fdmanana
2024-06-13 11:05 ` [PATCH 1/4] btrfs: use NOFS context when getting inodes during logging and log replay fdmanana
2024-06-13 21:37   ` Qu Wenruo [this message]
2024-06-13 21:54     ` Filipe Manana
2024-06-13 22:21       ` Qu Wenruo
2024-06-13 22:29         ` Filipe Manana
2024-06-16 18:40         ` David Sterba
2024-06-13 11:05 ` [PATCH 2/4] btrfs: remove super block argument from btrfs_iget() fdmanana
2024-06-13 11:05 ` [PATCH 3/4] btrfs: remove super block argument from btrfs_iget_path() fdmanana
2024-06-13 11:05 ` [PATCH 4/4] btrfs: remove super block argument from btrfs_iget_locked() fdmanana
2024-06-13 14:04 ` [PATCH 0/4] btrfs: fix a deadlock with reclaim during logging/log replay Johannes Thumshirn
2024-06-13 14:56 ` Josef Bacik
2024-06-13 21:10 ` David Sterba
2024-06-13 21:37 ` Qu Wenruo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=04f49180-cdb0-4665-abe4-136dbc85fbb3@gmx.com \
    --to=quwenruo.btrfs@gmx.com \
    --cc=fdmanana@kernel.org \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox