btrfs: protect snapshots from deleting during send
authorDavid Sterba <dsterba@suse.cz>
Tue, 15 Apr 2014 14:41:44 +0000 (16:41 +0200)
committerChris Mason <clm@fb.com>
Tue, 10 Jun 2014 00:20:31 +0000 (17:20 -0700)
commit521e0546c970c3d845076f243828fa7abd71edfc
treee203f19e76c97629173c097e051946e2aeb6ce4a
parent944a4515b27302ac42d5964b7400c72f4d692782
btrfs: protect snapshots from deleting during send

The patch "Btrfs: fix protection between send and root deletion"
(18f687d538449373c37c) does not actually prevent to delete the snapshot
and just takes care during background cleaning, but this seems rather
user unfriendly, this patch implements the idea presented in

http://www.spinics.net/lists/linux-btrfs/msg30813.html

- add an internal root_item flag to denote a dead root
- check if the send_in_progress is set and refuse to delete, otherwise
  set the flag and proceed
- check the flag in send similar to the btrfs_root_readonly checks, for
  all involved roots

The root lookup in send via btrfs_read_fs_root_no_name will check if the
root is really dead or not. If it is, ENOENT, aborted send. If it's
alive, it's protected by send_in_progress, send can continue.

CC: Miao Xie <miaox@cn.fujitsu.com>
CC: Wang Shilong <wangsl.fnst@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/ctree.h
fs/btrfs/ioctl.c
fs/btrfs/send.c