btrfs: Add overview of device replace
The overview of btrfs dev-replace. It mentions some corner cases caused by the write duplication and scrub based data copy. Reviewed-by: Anand Jain <anand.jain@oracle.com> Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> [ adjust wording ] Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
16fbf79b0f
commit
30b3688e1f
@ -22,6 +22,46 @@
|
|||||||
#include "dev-replace.h"
|
#include "dev-replace.h"
|
||||||
#include "sysfs.h"
|
#include "sysfs.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Device replace overview
|
||||||
|
*
|
||||||
|
* [Objective]
|
||||||
|
* To copy all extents (both new and on-disk) from source device to target
|
||||||
|
* device, while still keeping the filesystem read-write.
|
||||||
|
*
|
||||||
|
* [Method]
|
||||||
|
* There are two main methods involved:
|
||||||
|
*
|
||||||
|
* - Write duplication
|
||||||
|
*
|
||||||
|
* All new writes will be written to both target and source devices, so even
|
||||||
|
* if replace gets canceled, sources device still contans up-to-date data.
|
||||||
|
*
|
||||||
|
* Location: handle_ops_on_dev_replace() from __btrfs_map_block()
|
||||||
|
* Start: btrfs_dev_replace_start()
|
||||||
|
* End: btrfs_dev_replace_finishing()
|
||||||
|
* Content: Latest data/metadata
|
||||||
|
*
|
||||||
|
* - Copy existing extents
|
||||||
|
*
|
||||||
|
* This happens by re-using scrub facility, as scrub also iterates through
|
||||||
|
* existing extents from commit root.
|
||||||
|
*
|
||||||
|
* Location: scrub_write_block_to_dev_replace() from
|
||||||
|
* scrub_block_complete()
|
||||||
|
* Content: Data/meta from commit root.
|
||||||
|
*
|
||||||
|
* Due to the content difference, we need to avoid nocow write when dev-replace
|
||||||
|
* is happening. This is done by marking the block group read-only and waiting
|
||||||
|
* for NOCOW writes.
|
||||||
|
*
|
||||||
|
* After replace is done, the finishing part is done by swapping the target and
|
||||||
|
* source devices.
|
||||||
|
*
|
||||||
|
* Location: btrfs_dev_replace_update_device_in_mapping_tree() from
|
||||||
|
* btrfs_dev_replace_finishing()
|
||||||
|
*/
|
||||||
|
|
||||||
static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
|
static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
|
||||||
int scrub_ret);
|
int scrub_ret);
|
||||||
static void btrfs_dev_replace_update_device_in_mapping_tree(
|
static void btrfs_dev_replace_update_device_in_mapping_tree(
|
||||||
|
Loading…
Reference in New Issue
Block a user