X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=extras%2Fvolume_id%2Fvolume_id%2Freiserfs.c;h=094062dba20c1e8f329cce4dcee6cfd65c669099;hp=b74b8ae5760bb2d64713bedeff35017e8140b350;hb=8d1b4df2192915dc94442c1ef3327a28a57b3615;hpb=e4d4a557e53c3fbcf14bd1bb29686fd884905b53 diff --git a/extras/volume_id/volume_id/reiserfs.c b/extras/volume_id/volume_id/reiserfs.c index b74b8ae57..094062dba 100644 --- a/extras/volume_id/volume_id/reiserfs.c +++ b/extras/volume_id/volume_id/reiserfs.c @@ -2,6 +2,7 @@ * volume_id - reads filesystem label and uuid * * Copyright (C) 2004 Kay Sievers + * Copyright (C) 2005 Tobias Klauser * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -55,26 +56,45 @@ struct reiserfs_super_block { __u8 label[16]; } __attribute__((__packed__)); +struct reiser4_super_block { + __u8 magic[16]; + __u16 dummy[2]; + __u8 uuid[16]; + __u8 label[16]; + __u64 dummy2; +} __attribute__((__packed__)); + #define REISERFS1_SUPERBLOCK_OFFSET 0x2000 #define REISERFS_SUPERBLOCK_OFFSET 0x10000 int volume_id_probe_reiserfs(struct volume_id *id, __u64 off) { struct reiserfs_super_block *rs; + struct reiser4_super_block *rs4; + __u8 *buf; dbg("probing at offset %llu", off); - rs = (struct reiserfs_super_block *) volume_id_get_buffer(id, off + REISERFS_SUPERBLOCK_OFFSET, 0x200); - if (rs == NULL) + buf = volume_id_get_buffer(id, off + REISERFS_SUPERBLOCK_OFFSET, 0x200); + if (buf == NULL) return -1; + rs = (struct reiserfs_super_block *) buf;; if (memcmp(rs->magic, "ReIsEr2Fs", 9) == 0) { strcpy(id->type_version, "3.6"); - goto found; + goto found_v3; } - if (memcmp(rs->magic, "ReIsEr3Fs", 9) == 0) { strcpy(id->type_version, "JR"); + goto found_v3; + } + + rs4 = (struct reiser4_super_block *) buf; + if (memcmp(rs4->magic, "ReIsEr4", 7) == 0) { + strcpy(id->type_version, "4"); + volume_id_set_label_raw(id, rs4->label, 16); + volume_id_set_label_string(id, rs4->label, 16); + volume_id_set_uuid(id, rs4->uuid, UUID_DCE); goto found; } @@ -84,16 +104,17 @@ int volume_id_probe_reiserfs(struct volume_id *id, __u64 off) if (memcmp(rs->magic, "ReIsErFs", 8) == 0) { strcpy(id->type_version, "3.5"); - goto found; + goto found_v3; } return -1; -found: +found_v3: volume_id_set_label_raw(id, rs->label, 16); volume_id_set_label_string(id, rs->label, 16); volume_id_set_uuid(id, rs->uuid, UUID_DCE); +found: volume_id_set_usage(id, VOLUME_ID_FILESYSTEM); id->type = "reiserfs";