btrfs.c: check first two superblocks, for additional robustness
function old new delta volume_id_probe_btrfs 94 142 +48 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
893009644f
commit
d784b65be7
@ -80,19 +80,26 @@ struct btrfs_super_block {
|
|||||||
|
|
||||||
int FAST_FUNC volume_id_probe_btrfs(struct volume_id *id /*,uint64_t off*/)
|
int FAST_FUNC volume_id_probe_btrfs(struct volume_id *id /*,uint64_t off*/)
|
||||||
{
|
{
|
||||||
#define off ((uint64_t) (64 * 1024))
|
// btrfs has superblocks at 64K, 64M and 256G
|
||||||
|
// minimum btrfs size is 256M
|
||||||
|
// so we never step out the device if we analyze
|
||||||
|
// the first and the second superblocks
|
||||||
struct btrfs_super_block *sb;
|
struct btrfs_super_block *sb;
|
||||||
|
unsigned off = 64;
|
||||||
|
|
||||||
dbg("btrfs: probing at offset 0x%llx", (unsigned long long) off);
|
while (off < 64*1024*1024) {
|
||||||
|
off *= 1024;
|
||||||
|
dbg("btrfs: probing at offset 0x%x", off);
|
||||||
|
|
||||||
sb = volume_id_get_buffer(id, off, sizeof(*sb));
|
sb = volume_id_get_buffer(id, off, sizeof(*sb));
|
||||||
if (sb == NULL)
|
if (sb == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (memcmp(sb->magic, BTRFS_MAGIC, 8) != 0)
|
if (memcmp(sb->magic, BTRFS_MAGIC, 8) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// N.B.: btrfs supports 256-byte labels
|
// N.B.: btrfs natively supports 256 (>VOLUME_ID_LABEL_SIZE) size labels
|
||||||
volume_id_set_label_string(id, sb->label, VOLUME_ID_LABEL_SIZE);
|
volume_id_set_label_string(id, sb->label, VOLUME_ID_LABEL_SIZE);
|
||||||
volume_id_set_uuid(id, sb->fsid, UUID_DCE);
|
volume_id_set_uuid(id, sb->fsid, UUID_DCE);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user