Commit 6d85ed05 authored by Alexander Block's avatar Alexander Block Committed by Chris Mason

Btrfs: don't treat top/root directory inode as deleted/reused

We can't do the deleted/reused logic for top/root inodes as it would
create a stream that tries to delete and recreate the root dir.
Reported-by: default avatarAlex Lyakas <alex.bolshoy.btrfs@gmail.com>
Signed-off-by: default avatarAlexander Block <ablock84@googlemail.com>
parent 2981e225
...@@ -2627,6 +2627,12 @@ static int can_rmdir(struct send_ctx *sctx, u64 dir, u64 send_progress) ...@@ -2627,6 +2627,12 @@ static int can_rmdir(struct send_ctx *sctx, u64 dir, u64 send_progress)
struct btrfs_key loc; struct btrfs_key loc;
struct btrfs_dir_item *di; struct btrfs_dir_item *di;
/*
* Don't try to rmdir the top/root subvolume dir.
*/
if (dir == BTRFS_FIRST_FREE_OBJECTID)
return 0;
path = alloc_path_for_send(); path = alloc_path_for_send();
if (!path) if (!path)
return -ENOMEM; return -ENOMEM;
...@@ -2687,6 +2693,12 @@ static int process_recorded_refs(struct send_ctx *sctx) ...@@ -2687,6 +2693,12 @@ static int process_recorded_refs(struct send_ctx *sctx)
verbose_printk("btrfs: process_recorded_refs %llu\n", sctx->cur_ino); verbose_printk("btrfs: process_recorded_refs %llu\n", sctx->cur_ino);
/*
* This should never happen as the root dir always has the same ref
* which is always '..'
*/
BUG_ON(sctx->cur_ino <= BTRFS_FIRST_FREE_OBJECTID);
valid_path = fs_path_alloc(sctx); valid_path = fs_path_alloc(sctx);
if (!valid_path) { if (!valid_path) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -4094,7 +4106,14 @@ static int changed_inode(struct send_ctx *sctx, ...@@ -4094,7 +4106,14 @@ static int changed_inode(struct send_ctx *sctx,
right_gen = btrfs_inode_generation(sctx->right_path->nodes[0], right_gen = btrfs_inode_generation(sctx->right_path->nodes[0],
right_ii); right_ii);
if (left_gen != right_gen)
/*
* The cur_ino = root dir case is special here. We can't treat
* the inode as deleted+reused because it would generate a
* stream that tries to delete/mkdir the root dir.
*/
if (left_gen != right_gen &&
sctx->cur_ino != BTRFS_FIRST_FREE_OBJECTID)
sctx->cur_inode_new_gen = 1; sctx->cur_inode_new_gen = 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment