mirror of
https://github.com/kdave/btrfs-progs
synced 2025-04-23 07:25:20 +00:00
btrfs-progs: convert: Add comment for the overall convert design
Convert is now a little complex due to that fact we need to separate metadata and data chunks for different profiles. Add a comment with ascii art explaining the whole design and point out the really complex part, so any newcomers interested in convert can get a quick overview of it before digging into the hard to read code. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> [ wording and formatting adjustments ] Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
21e8582d32
commit
0117fdf1fc
@ -16,6 +16,70 @@
|
|||||||
* Boston, MA 021110-1307, USA.
|
* Boston, MA 021110-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Btrfs convert design:
|
||||||
|
*
|
||||||
|
* The overall design of btrfs convert is like the following:
|
||||||
|
*
|
||||||
|
* |<------------------Old fs----------------------------->|
|
||||||
|
* |<- used ->| |<- used ->| |<- used ->|
|
||||||
|
* ||
|
||||||
|
* \/
|
||||||
|
* |<---------------Btrfs fs------------------------------>|
|
||||||
|
* |<- Old data chunk ->|< new chunk (D/M/S)>|<- ODC ->|
|
||||||
|
* |<-Old-FE->| |<-Old-FE->|<- Btrfs extents ->|<-Old-FE->|
|
||||||
|
*
|
||||||
|
* ODC = Old data chunk, btrfs chunks containing old fs data
|
||||||
|
* Mapped 1:1 (logical address == device offset)
|
||||||
|
* Old-FE = file extents pointing to old fs.
|
||||||
|
*
|
||||||
|
* So old fs used space is (mostly) kept as is, while btrfs will insert
|
||||||
|
* its chunk (Data/Meta/Sys) into large enough free space.
|
||||||
|
* In this way, we can create different profiles for metadata/data for
|
||||||
|
* converted fs.
|
||||||
|
*
|
||||||
|
* We must reserve and relocate 3 ranges for btrfs:
|
||||||
|
* * [0, 1M) - area never used for any data except the first
|
||||||
|
* superblock
|
||||||
|
* * [btrfs_sb_offset(1), +64K) - 1st superblock backup copy
|
||||||
|
* * [btrfs_sb_offset(2), +64K) - 2nd, dtto
|
||||||
|
*
|
||||||
|
* Most work is spent handling corner cases around these reserved ranges.
|
||||||
|
*
|
||||||
|
* Detailed workflow is:
|
||||||
|
* 1) Scan old fs used space and calculate data chunk layout
|
||||||
|
* 1.1) Scan old fs
|
||||||
|
* We can a map used space of old fs
|
||||||
|
*
|
||||||
|
* 1.2) Calculate data chunk layout - this is the hard part
|
||||||
|
* New data chunks must meet 3 conditions using result fomr 1.1
|
||||||
|
* a. Large enough to be a chunk
|
||||||
|
* b. Doesn't intersect reserved ranges
|
||||||
|
* c. Covers all the remaining old fs used space
|
||||||
|
*
|
||||||
|
* NOTE: This can be simplified if we don't need to handle backup supers
|
||||||
|
*
|
||||||
|
* 1.3) Calculate usable space for new btrfs chunks
|
||||||
|
* Btrfs chunk usable space must meet 3 conditions using result from 1.2
|
||||||
|
* a. Large enough to be a chunk
|
||||||
|
* b. Doesn't intersect reserved ranges
|
||||||
|
* c. Doesn't cover any data chunks in 1.1
|
||||||
|
*
|
||||||
|
* 2) Create basic btrfs filesystem structure
|
||||||
|
* Initial metadata and sys chunks are inserted in the first availabe
|
||||||
|
* space found in step 1.3
|
||||||
|
* Then insert all data chunks into the basic btrfs
|
||||||
|
*
|
||||||
|
* 3) Create convert image
|
||||||
|
* We need to relocate reserved ranges here.
|
||||||
|
* After this step, the convert image is done, and we can use the image
|
||||||
|
* as reflink source to create old files
|
||||||
|
*
|
||||||
|
* 4) Iterate old fs to create files
|
||||||
|
* We just reflink file extents from old fs to newly created files on
|
||||||
|
* btrfs.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "kerncompat.h"
|
#include "kerncompat.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
Loading…
Reference in New Issue
Block a user