Merge tag 'for-6.6-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave...
[sfrench/cifs-2.6.git] / fs / btrfs / delayed-inode.c
index 6e779bc1634008b347917ca6f16c728824604802..caf0bbd028d11070ea8d87524c9e8c670e7d905d 100644 (file)
@@ -412,6 +412,7 @@ static void finish_one_item(struct btrfs_delayed_root *delayed_root)
 
 static void __btrfs_remove_delayed_item(struct btrfs_delayed_item *delayed_item)
 {
+       struct btrfs_delayed_node *delayed_node = delayed_item->delayed_node;
        struct rb_root_cached *root;
        struct btrfs_delayed_root *delayed_root;
 
@@ -419,18 +420,21 @@ static void __btrfs_remove_delayed_item(struct btrfs_delayed_item *delayed_item)
        if (RB_EMPTY_NODE(&delayed_item->rb_node))
                return;
 
-       delayed_root = delayed_item->delayed_node->root->fs_info->delayed_root;
+       /* If it's in a rbtree, then we need to have delayed node locked. */
+       lockdep_assert_held(&delayed_node->mutex);
+
+       delayed_root = delayed_node->root->fs_info->delayed_root;
 
        BUG_ON(!delayed_root);
 
        if (delayed_item->type == BTRFS_DELAYED_INSERTION_ITEM)
-               root = &delayed_item->delayed_node->ins_root;
+               root = &delayed_node->ins_root;
        else
-               root = &delayed_item->delayed_node->del_root;
+               root = &delayed_node->del_root;
 
        rb_erase_cached(&delayed_item->rb_node, root);
        RB_CLEAR_NODE(&delayed_item->rb_node);
-       delayed_item->delayed_node->count--;
+       delayed_node->count--;
 
        finish_one_item(delayed_root);
 }
@@ -1840,9 +1844,9 @@ static void fill_stack_inode_item(struct btrfs_trans_handle *trans,
                                      inode->i_mtime.tv_nsec);
 
        btrfs_set_stack_timespec_sec(&inode_item->ctime,
-                                    inode->i_ctime.tv_sec);
+                                    inode_get_ctime(inode).tv_sec);
        btrfs_set_stack_timespec_nsec(&inode_item->ctime,
-                                     inode->i_ctime.tv_nsec);
+                                     inode_get_ctime(inode).tv_nsec);
 
        btrfs_set_stack_timespec_sec(&inode_item->otime,
                                     BTRFS_I(inode)->i_otime.tv_sec);
@@ -1893,8 +1897,8 @@ int btrfs_fill_inode(struct inode *inode, u32 *rdev)
        inode->i_mtime.tv_sec = btrfs_stack_timespec_sec(&inode_item->mtime);
        inode->i_mtime.tv_nsec = btrfs_stack_timespec_nsec(&inode_item->mtime);
 
-       inode->i_ctime.tv_sec = btrfs_stack_timespec_sec(&inode_item->ctime);
-       inode->i_ctime.tv_nsec = btrfs_stack_timespec_nsec(&inode_item->ctime);
+       inode_set_ctime(inode, btrfs_stack_timespec_sec(&inode_item->ctime),
+                       btrfs_stack_timespec_nsec(&inode_item->ctime));
 
        BTRFS_I(inode)->i_otime.tv_sec =
                btrfs_stack_timespec_sec(&inode_item->otime);