mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 02:39:48 +00:00
btrfs: Add read_backup_root
This function will replace next_root_backup with a much saner/cleaner interface. Signed-off-by: Nikolay Borisov <nborisov@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
fc2e4c5b35
commit
bd2336b2ac
1 changed files with 44 additions and 0 deletions
|
@ -1928,6 +1928,50 @@ static void backup_super_roots(struct btrfs_fs_info *info)
|
|||
sizeof(*root_backup) * BTRFS_NUM_BACKUP_ROOTS);
|
||||
}
|
||||
|
||||
/*
|
||||
* read_backup_root - Reads a backup root based on the passed priority. Prio 0
|
||||
* is the newest, prio 1/2/3 are 2nd newest/3rd newest/4th (oldest) backup roots
|
||||
*
|
||||
* fs_info - filesystem whose backup roots need to be read
|
||||
* priority - priority of backup root required
|
||||
*
|
||||
* Returns backup root index on success and -EINVAL otherwise.
|
||||
*/
|
||||
static int read_backup_root(struct btrfs_fs_info *fs_info, u8 priority)
|
||||
{
|
||||
int backup_index = find_newest_super_backup(fs_info);
|
||||
struct btrfs_super_block *super = fs_info->super_copy;
|
||||
struct btrfs_root_backup *root_backup;
|
||||
|
||||
if (priority < BTRFS_NUM_BACKUP_ROOTS && backup_index >= 0) {
|
||||
if (priority == 0)
|
||||
return backup_index;
|
||||
|
||||
backup_index = backup_index + BTRFS_NUM_BACKUP_ROOTS - priority;
|
||||
backup_index %= BTRFS_NUM_BACKUP_ROOTS;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
root_backup = super->super_roots + backup_index;
|
||||
|
||||
btrfs_set_super_generation(super,
|
||||
btrfs_backup_tree_root_gen(root_backup));
|
||||
btrfs_set_super_root(super, btrfs_backup_tree_root(root_backup));
|
||||
btrfs_set_super_root_level(super,
|
||||
btrfs_backup_tree_root_level(root_backup));
|
||||
btrfs_set_super_bytes_used(super, btrfs_backup_bytes_used(root_backup));
|
||||
|
||||
/*
|
||||
* Fixme: the total bytes and num_devices need to match or we should
|
||||
* need a fsck
|
||||
*/
|
||||
btrfs_set_super_total_bytes(super, btrfs_backup_total_bytes(root_backup));
|
||||
btrfs_set_super_num_devices(super, btrfs_backup_num_devices(root_backup));
|
||||
|
||||
return backup_index;
|
||||
}
|
||||
|
||||
/*
|
||||
* this copies info out of the root backup array and back into
|
||||
* the in-memory super block. It is meant to help iterate through
|
||||
|
|
Loading…
Reference in a new issue