forked from Mirrors/btrfs-progs
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
parent
6bdb1cfbc1
commit
50c8c995ea
14
disk-io.c
14
disk-io.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue