btrfs: incremental send, move allocation until it's needed in orphan_dir_info
authorRobbie Ko <robbieko@synology.com>
Tue, 8 May 2018 10:11:37 +0000 (18:11 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 28 May 2018 16:07:32 +0000 (18:07 +0200)
Move the allocation after the search when it's clear that the new entry
will be added.

Signed-off-by: Robbie Ko <robbieko@synology.com>
Reviewed-by: Filipe Manana <fdmanana@suse.com>
[ update changelog ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/send.c

index 6e8184f..29cfc0d 100644 (file)
@@ -2844,12 +2844,6 @@ add_orphan_dir_info(struct send_ctx *sctx, u64 dir_ino)
        struct rb_node *parent = NULL;
        struct orphan_dir_info *entry, *odi;
 
-       odi = kmalloc(sizeof(*odi), GFP_KERNEL);
-       if (!odi)
-               return ERR_PTR(-ENOMEM);
-       odi->ino = dir_ino;
-       odi->gen = 0;
-
        while (*p) {
                parent = *p;
                entry = rb_entry(parent, struct orphan_dir_info, node);
@@ -2858,11 +2852,16 @@ add_orphan_dir_info(struct send_ctx *sctx, u64 dir_ino)
                } else if (dir_ino > entry->ino) {
                        p = &(*p)->rb_right;
                } else {
-                       kfree(odi);
                        return entry;
                }
        }
 
+       odi = kmalloc(sizeof(*odi), GFP_KERNEL);
+       if (!odi)
+               return ERR_PTR(-ENOMEM);
+       odi->ino = dir_ino;
+       odi->gen = 0;
+
        rb_link_node(&odi->node, parent, p);
        rb_insert_color(&odi->node, &sctx->orphan_dirs);
        return odi;