@@ -477,16 +477,13 @@ static void dump_superblock(struct btrfs_super_block *sb, int full)
static int load_and_dump_sb(char *filename, int fd, u64 sb_bytenr, int full,
int force)
{
- u8 super_block_data[BTRFS_SUPER_INFO_SIZE];
- struct btrfs_super_block *sb;
+ struct btrfs_super_block sb;
u64 ret;
- sb = (struct btrfs_super_block *)super_block_data;
-
- ret = pread64(fd, super_block_data, BTRFS_SUPER_INFO_SIZE, sb_bytenr);
- if (ret != BTRFS_SUPER_INFO_SIZE) {
+ ret = load_sb(fd, sb_bytenr, &sb);
+ if (ret) {
/* check if the disk if too short for further superblock */
- if (ret == 0 && errno == 0)
+ if (ret == -ENOSPC)
return 0;
error("failed to read the superblock on %s at %llu",
@@ -496,11 +493,11 @@ static int load_and_dump_sb(char *filename, int fd, u64 sb_bytenr, int full,
}
printf("superblock: bytenr=%llu, device=%s\n", sb_bytenr, filename);
printf("---------------------------------------------------------\n");
- if (btrfs_super_magic(sb) != BTRFS_MAGIC && !force) {
+ if (btrfs_super_magic(&sb) != BTRFS_MAGIC && !force) {
error("bad magic on superblock on %s at %llu",
filename, (unsigned long long)sb_bytenr);
} else {
- dump_superblock(sb, full);
+ dump_superblock(&sb, full);
}
return 0;
}
@@ -2593,3 +2593,18 @@ void print_all_devices(struct list_head *devices)
print_device_info(dev, "\t");
printf("\n");
}
+
+int load_sb(int fd, u64 bytenr, struct btrfs_super_block *sb)
+{
+ size_t size = sizeof(sizeof(struct btrfs_super_block));
+ int ret;
+
+ ret = pread64(fd, sb, size, bytenr);
+ if (ret != size) {
+ if (ret == 0 && errno == 0)
+ return -EINVAL;
+
+ return -errno;
+ }
+ return 0;
+}
@@ -171,6 +171,8 @@ unsigned long total_memory(void);
void print_device_info(struct btrfs_device *device, char *prefix);
void print_all_devices(struct list_head *devices);
+int load_sb(int fd, u64 bytenr, struct btrfs_super_block *sb);
+
/*
* Global program state, configurable by command line and available to
* functions without extra context passing.
inspect-internal dump-superblock's load_and_dump_sb() already reads a super block from a file descriptor and places it into a 'struct btrfs_super_block'. For inspect-internal dump-csum we need this super block as well but don't care about printing it. Separate the read from the dump phase so we can re-use it elsewhere. Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de> --- cmds-inspect-dump-super.c | 15 ++++++--------- utils.c | 15 +++++++++++++++ utils.h | 2 ++ 3 files changed, 23 insertions(+), 9 deletions(-)