btrfs-progs: Return more meaningful value for btrfs_read_deve_super

btrfs_read_dev_super() only returns 0 or -1, which doesn't really help,
caller won't know if it's caused by bad superblock or superblock out of
range.

Return -errno if pread64() return -1, and return -EOF if none or part of
the super is read out, and return what check_super() returned.

So caller can get -EIO to catch real corrupted super blocks.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
master
Qu Wenruo 2016-09-26 12:54:26 +08:00 committed by David Sterba
parent 6bdb1cfbc1
commit 50c8c995ea
1 changed files with 10 additions and 4 deletions

View File

@ -1590,14 +1590,20 @@ int btrfs_read_dev_super(int fd, struct btrfs_super_block *sb, u64 sb_bytenr,
if (sb_bytenr != BTRFS_SUPER_INFO_OFFSET) {
ret = pread64(fd, buf, BTRFS_SUPER_INFO_SIZE, sb_bytenr);
/* real error */
if (ret < 0)
return -errno;
/* Not large enough sb, return -ENOENT instead of normal -EIO */
if (ret < BTRFS_SUPER_INFO_SIZE)
return -1;
return -ENOENT;
if (btrfs_super_bytenr(buf) != sb_bytenr)
return -1;
return -EIO;
if (check_super(buf, sbflags))
return -1;
ret = check_super(buf, sbflags);
if (ret < 0)
return ret;
memcpy(sb, buf, BTRFS_SUPER_INFO_SIZE);
return 0;
}