]>
Commit | Line | Data |
---|---|---|
08a53099 KZ |
1 | /* |
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> | |
5 | * | |
9c863b75 KZ |
6 | * This file may be redistributed under the terms of the |
7 | * GNU Lesser General Public License. | |
08a53099 | 8 | */ |
08a53099 KZ |
9 | #include <stdio.h> |
10 | #include <stdlib.h> | |
11 | #include <unistd.h> | |
12 | #include <string.h> | |
08a53099 KZ |
13 | #include <stdint.h> |
14 | ||
1e3cf6a2 | 15 | #include "superblocks.h" |
08a53099 KZ |
16 | |
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]; | |
30 | char rs_label[16]; | |
11854e2e | 31 | } __attribute__((packed)); |
08a53099 KZ |
32 | |
33 | struct reiser4_super_block { | |
34 | unsigned char rs4_magic[16]; | |
cd129b7d MP |
35 | uint8_t rs4_dummy[3]; |
36 | uint8_t rs4_blocksize; | |
08a53099 KZ |
37 | unsigned char rs4_uuid[16]; |
38 | unsigned char rs4_label[16]; | |
39 | uint64_t rs4_dummy2; | |
11854e2e | 40 | } __attribute__((packed)); |
08a53099 KZ |
41 | |
42 | static int probe_reiser(blkid_probe pr, const struct blkid_idmag *mag) | |
43 | { | |
44 | struct reiserfs_super_block *rs; | |
45 | unsigned int blocksize; | |
46 | ||
47 | rs = blkid_probe_get_sb(pr, mag, struct reiserfs_super_block); | |
48 | if (!rs) | |
37f40602 | 49 | return errno ? -errno : 1; |
08a53099 KZ |
50 | |
51 | blocksize = le16_to_cpu(rs->rs_blocksize); | |
52 | ||
fd688b6c VS |
53 | /* The blocksize must be at least 512B */ |
54 | if ((blocksize >> 9) == 0) | |
37f40602 | 55 | return 1; |
08a53099 KZ |
56 | |
57 | /* If the superblock is inside the journal, we have the wrong one */ | |
fd688b6c | 58 | if (mag->kboff / (blocksize >> 9) > le32_to_cpu(rs->rs_journal_block) / 2) |
37f40602 | 59 | return 1; |
08a53099 KZ |
60 | |
61 | /* LABEL/UUID are only valid for later versions of Reiserfs v3.6. */ | |
62 | if (mag->magic[6] == '2' || mag->magic[6] == '3') { | |
b1646690 | 63 | if (*rs->rs_label) |
08a53099 KZ |
64 | blkid_probe_set_label(pr, |
65 | (unsigned char *) rs->rs_label, | |
66 | sizeof(rs->rs_label)); | |
67 | blkid_probe_set_uuid(pr, rs->rs_uuid); | |
68 | } | |
69 | ||
b1646690 KZ |
70 | if (mag->magic[6] == '3') |
71 | blkid_probe_set_version(pr, "JR"); | |
72 | else if (mag->magic[6] == '2') | |
73 | blkid_probe_set_version(pr, "3.6"); | |
74 | else | |
75 | blkid_probe_set_version(pr, "3.5"); | |
76 | ||
cd129b7d MP |
77 | blkid_probe_set_block_size(pr, blocksize); |
78 | ||
08a53099 KZ |
79 | return 0; |
80 | } | |
81 | ||
82 | static int probe_reiser4(blkid_probe pr, const struct blkid_idmag *mag) | |
83 | { | |
84 | struct reiser4_super_block *rs4; | |
cd129b7d | 85 | unsigned int blocksize; |
08a53099 KZ |
86 | |
87 | rs4 = blkid_probe_get_sb(pr, mag, struct reiser4_super_block); | |
88 | if (!rs4) | |
37f40602 | 89 | return errno ? -errno : 1; |
08a53099 | 90 | |
cd129b7d MP |
91 | blocksize = rs4->rs4_blocksize * 256; |
92 | ||
b1646690 | 93 | if (*rs4->rs4_label) |
08a53099 KZ |
94 | blkid_probe_set_label(pr, rs4->rs4_label, sizeof(rs4->rs4_label)); |
95 | blkid_probe_set_uuid(pr, rs4->rs4_uuid); | |
b1646690 | 96 | blkid_probe_set_version(pr, "4"); |
08a53099 | 97 | |
cd129b7d MP |
98 | blkid_probe_set_block_size(pr, blocksize); |
99 | ||
08a53099 KZ |
100 | return 0; |
101 | } | |
102 | ||
103 | ||
104 | const struct blkid_idinfo reiser_idinfo = | |
105 | { | |
88df7228 | 106 | .name = "reiserfs", |
08a53099 KZ |
107 | .usage = BLKID_USAGE_FILESYSTEM, |
108 | .probefunc = probe_reiser, | |
04f7020e | 109 | .minsz = 128 * 1024, |
08a53099 KZ |
110 | .magics = |
111 | { | |
112 | { .magic = "ReIsErFs", .len = 8, .kboff = 8, .sboff = 0x34 }, | |
113 | { .magic = "ReIsEr2Fs", .len = 9, .kboff = 64, .sboff = 0x34 }, | |
114 | { .magic = "ReIsEr3Fs", .len = 9, .kboff = 64, .sboff = 0x34 }, | |
115 | { .magic = "ReIsErFs", .len = 8, .kboff = 64, .sboff = 0x34 }, | |
116 | { .magic = "ReIsErFs", .len = 8, .kboff = 8, .sboff = 20 }, | |
117 | { NULL } | |
118 | } | |
119 | }; | |
120 | ||
121 | const struct blkid_idinfo reiser4_idinfo = | |
122 | { | |
123 | .name = "reiser4", | |
124 | .usage = BLKID_USAGE_FILESYSTEM, | |
125 | .probefunc = probe_reiser4, | |
04f7020e | 126 | .minsz = 128 * 1024, |
08a53099 KZ |
127 | .magics = |
128 | { | |
129 | { .magic = "ReIsEr4", .len = 7, .kboff = 64 }, | |
130 | { NULL } | |
131 | } | |
132 | }; | |
133 | ||
134 | ||
135 | ||
136 |