2
* Copyright (C) 1999, 2001 by Andries Brouwer
3
* Copyright (C) 1999, 2000, 2003 by Theodore Ts'o
4
* Copyright (C) 2008 Karel Zak <kzak@redhat.com>
6
* This file may be redistributed under the terms of the
7
* GNU Lesser General Public License.
15
#include "superblocks.h"
17
struct reiserfs_super_block {
18
uint32_t rs_blocks_count;
19
uint32_t rs_free_blocks;
20
uint32_t rs_root_block;
21
uint32_t rs_journal_block;
22
uint32_t rs_journal_dev;
23
uint32_t rs_orig_journal_size;
24
uint32_t rs_dummy2[5];
25
uint16_t rs_blocksize;
26
uint16_t rs_dummy3[3];
27
unsigned char rs_magic[12];
28
uint32_t rs_dummy4[5];
29
unsigned char rs_uuid[16];
31
} __attribute__((packed));
33
struct reiser4_super_block {
34
unsigned char rs4_magic[16];
35
uint16_t rs4_dummy[2];
36
unsigned char rs4_uuid[16];
37
unsigned char rs4_label[16];
39
} __attribute__((packed));
41
static int probe_reiser(blkid_probe pr, const struct blkid_idmag *mag)
43
struct reiserfs_super_block *rs;
44
unsigned int blocksize;
46
rs = blkid_probe_get_sb(pr, mag, struct reiserfs_super_block);
50
blocksize = le16_to_cpu(rs->rs_blocksize);
52
/* The blocksize must be at least 1k */
53
if ((blocksize >> 10) == 0)
54
return -BLKID_ERR_PARAM;
56
/* If the superblock is inside the journal, we have the wrong one */
57
if (mag->kboff / (blocksize >> 10) > le32_to_cpu(rs->rs_journal_block))
58
return -BLKID_ERR_BIG;
60
/* LABEL/UUID are only valid for later versions of Reiserfs v3.6. */
61
if (mag->magic[6] == '2' || mag->magic[6] == '3') {
63
blkid_probe_set_label(pr,
64
(unsigned char *) rs->rs_label,
65
sizeof(rs->rs_label));
66
blkid_probe_set_uuid(pr, rs->rs_uuid);
69
if (mag->magic[6] == '3')
70
blkid_probe_set_version(pr, "JR");
71
else if (mag->magic[6] == '2')
72
blkid_probe_set_version(pr, "3.6");
74
blkid_probe_set_version(pr, "3.5");
79
static int probe_reiser4(blkid_probe pr, const struct blkid_idmag *mag)
81
struct reiser4_super_block *rs4;
83
rs4 = blkid_probe_get_sb(pr, mag, struct reiser4_super_block);
88
blkid_probe_set_label(pr, rs4->rs4_label, sizeof(rs4->rs4_label));
89
blkid_probe_set_uuid(pr, rs4->rs4_uuid);
90
blkid_probe_set_version(pr, "4");
96
const struct blkid_idinfo reiser_idinfo =
99
.usage = BLKID_USAGE_FILESYSTEM,
100
.probefunc = probe_reiser,
101
.minsz = 4096 * 512, /* not sure, this is minimal size of journal */
104
{ .magic = "ReIsErFs", .len = 8, .kboff = 8, .sboff = 0x34 },
105
{ .magic = "ReIsEr2Fs", .len = 9, .kboff = 64, .sboff = 0x34 },
106
{ .magic = "ReIsEr3Fs", .len = 9, .kboff = 64, .sboff = 0x34 },
107
{ .magic = "ReIsErFs", .len = 8, .kboff = 64, .sboff = 0x34 },
108
{ .magic = "ReIsErFs", .len = 8, .kboff = 8, .sboff = 20 },
113
const struct blkid_idinfo reiser4_idinfo =
116
.usage = BLKID_USAGE_FILESYSTEM,
117
.probefunc = probe_reiser4,
118
.minsz = 4096 * 512, /* not sure, this is minimal size of journal */
121
{ .magic = "ReIsEr4", .len = 7, .kboff = 64 },