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:
Denys Vlasenko 2009-11-02 00:12:35 +01:00
parent 893009644f
commit d784b65be7

View File

@ -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);