Btrfs: fix tree mod log del_ptr
authorJan Schmidt <list.btrfs@jan-o-sch.net>
Thu, 31 May 2012 13:02:32 +0000 (15:02 +0200)
committerJan Schmidt <list.btrfs@jan-o-sch.net>
Thu, 31 May 2012 17:56:19 +0000 (19:56 +0200)
Logging for del_ptr when we're not deleting the last pointer was wrong. This
fixes both, duplicate log entries and log sequence.

Signed-off-by: Jan Schmidt <list.btrfs@jan-o-sch.net>
fs/btrfs/ctree.c

index c7c4848..63147c1 100644 (file)
@@ -540,9 +540,8 @@ tree_mod_log_insert_move(struct btrfs_fs_info *fs_info,
        int ret;
        int i;
 
-       ret = tree_mod_alloc(fs_info, flags, &tm);
-       if (ret <= 0)
-               return ret;
+       if (tree_mod_dont_log(fs_info, eb))
+               return 0;
 
        for (i = 0; i + dst_slot < src_slot && i < nr_items; i++) {
                ret = tree_mod_log_insert_key(fs_info, eb, i + dst_slot,
@@ -550,6 +549,10 @@ tree_mod_log_insert_move(struct btrfs_fs_info *fs_info,
                BUG_ON(ret < 0);
        }
 
+       ret = tree_mod_alloc(fs_info, flags, &tm);
+       if (ret <= 0)
+               return ret;
+
        tm->index = eb->start >> PAGE_CACHE_SHIFT;
        tm->slot = src_slot;
        tm->move.dst_slot = dst_slot;
@@ -4548,9 +4551,7 @@ static void del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
                              btrfs_node_key_ptr_offset(slot + 1),
                              sizeof(struct btrfs_key_ptr) *
                              (nritems - slot - 1));
-       }
-
-       if (tree_mod_log && level) {
+       } else if (tree_mod_log && level) {
                ret = tree_mod_log_insert_key(root->fs_info, parent, slot,
                                              MOD_LOG_KEY_REMOVE);
                BUG_ON(ret < 0);