Skip to content

Commit ab5079c

Browse files
adam900710kdave
authored andcommitted
btrfs-progs: image: Verify the superblock before restore
This patch will export disk-io.c::check_super() as btrfs_check_super() and use it in btrfs-image for extra verification. Signed-off-by: Qu Wenruo <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent 686e86d commit ab5079c

File tree

3 files changed

+9
-3
lines changed

3 files changed

+9
-3
lines changed

disk-io.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,7 +1347,7 @@ struct btrfs_root *open_ctree_fd(int fp, const char *path, u64 sb_bytenr,
13471347
* - number of devices - something sane
13481348
* - sys array size - maximum
13491349
*/
1350-
static int check_super(struct btrfs_super_block *sb, unsigned sbflags)
1350+
int btrfs_check_super(struct btrfs_super_block *sb, unsigned sbflags)
13511351
{
13521352
u8 result[BTRFS_CSUM_SIZE];
13531353
u32 crc;
@@ -1547,7 +1547,7 @@ int btrfs_read_dev_super(int fd, struct btrfs_super_block *sb, u64 sb_bytenr,
15471547
if (btrfs_super_bytenr(buf) != sb_bytenr)
15481548
return -EIO;
15491549

1550-
ret = check_super(buf, sbflags);
1550+
ret = btrfs_check_super(buf, sbflags);
15511551
if (ret < 0)
15521552
return ret;
15531553
memcpy(sb, buf, BTRFS_SUPER_INFO_SIZE);
@@ -1572,7 +1572,7 @@ int btrfs_read_dev_super(int fd, struct btrfs_super_block *sb, u64 sb_bytenr,
15721572
/* if magic is NULL, the device was removed */
15731573
if (btrfs_super_magic(buf) == 0 && i == 0)
15741574
break;
1575-
if (check_super(buf, sbflags))
1575+
if (btrfs_check_super(buf, sbflags))
15761576
continue;
15771577

15781578
if (!fsid_is_initialized) {

disk-io.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ static inline int close_ctree(struct btrfs_root *root)
171171

172172
int write_all_supers(struct btrfs_fs_info *fs_info);
173173
int write_ctree_super(struct btrfs_trans_handle *trans);
174+
int btrfs_check_super(struct btrfs_super_block *sb, unsigned sbflags);
174175
int btrfs_read_dev_super(int fd, struct btrfs_super_block *sb, u64 sb_bytenr,
175176
unsigned sbflags);
176177
int btrfs_map_bh_to_logical(struct btrfs_root *root, struct extent_buffer *bh,

image/main.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1983,6 +1983,11 @@ static int build_chunk_tree(struct mdrestore_struct *mdres,
19831983

19841984
pthread_mutex_lock(&mdres->mutex);
19851985
super = (struct btrfs_super_block *)buffer;
1986+
ret = btrfs_check_super(super, 0);
1987+
if (ret < 0) {
1988+
error("invalid superblock");
1989+
return ret;
1990+
}
19861991
chunk_root_bytenr = btrfs_super_chunk_root(super);
19871992
mdres->nodesize = btrfs_super_nodesize(super);
19881993
if (btrfs_super_incompat_flags(super) &

0 commit comments

Comments
 (0)