diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/btrfs.h | 1 | ||||
-rw-r--r-- | fs/btrfs/super.c | 30 |
2 files changed, 22 insertions, 9 deletions
diff --git a/fs/btrfs/btrfs.h b/fs/btrfs/btrfs.h index 27d78837c54..986d0786797 100644 --- a/fs/btrfs/btrfs.h +++ b/fs/btrfs/btrfs.h @@ -13,7 +13,6 @@ struct btrfs_info { struct btrfs_super_block sb; - struct btrfs_root_backup *root_backup; struct btrfs_root tree_root; struct btrfs_root fs_root; diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index ad6641f3148..e680caa56a4 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -15,18 +15,34 @@ #define BTRFS_SUPER_INFO_SIZE 4096 -static int btrfs_newest_root_backup(struct btrfs_super_block *sb) +/* + * checks if a valid root backup is present. + * considers the case when all root backups empty valid. + * returns -1 in case of invalid root backup and 0 for valid. + */ +static int btrfs_check_super_roots(struct btrfs_super_block *sb) { struct btrfs_root_backup *root_backup; int i, newest = -1; + int num_empty = 0; for (i = 0; i < BTRFS_NUM_BACKUP_ROOTS; ++i) { root_backup = sb->super_roots + i; + + if (root_backup->tree_root == 0 && root_backup->tree_root_gen == 0) + num_empty++; + if (root_backup->tree_root_gen == sb->generation) newest = i; } - return newest; + if (num_empty == BTRFS_NUM_BACKUP_ROOTS) { + return 0; + } else if (newest >= 0) { + return 0; + } + + return -1; } static inline int is_power_of_2(u64 x) @@ -166,7 +182,7 @@ int btrfs_read_superblock(void) char raw_sb[BTRFS_SUPER_INFO_SIZE]; struct btrfs_super_block *sb = (struct btrfs_super_block *) raw_sb; u64 dev_total_bytes; - int i, root_backup_idx; + int i; dev_total_bytes = (u64) btrfs_part_info->size * btrfs_part_info->blksz; @@ -211,17 +227,15 @@ int btrfs_read_superblock(void) return -1; } - root_backup_idx = btrfs_newest_root_backup(&btrfs_info.sb); - if (root_backup_idx < 0) { + if (btrfs_check_super_roots(&btrfs_info.sb)) { printf("%s: No valid root_backup found!\n", __func__); return -1; } - btrfs_info.root_backup = btrfs_info.sb.super_roots + root_backup_idx; - if (btrfs_info.root_backup->num_devices != 1) { + if (btrfs_info.sb.num_devices != 1) { printf("%s: Unsupported number of devices (%lli). This driver " "only supports filesystem on one device.\n", __func__, - btrfs_info.root_backup->num_devices); + btrfs_info.sb.num_devices); return -1; } |