]>
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 | { | |
4583e6b2 | 44 | const struct reiserfs_super_block *rs; |
08a53099 KZ |
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 | ||
0f447d49 | 77 | blkid_probe_set_fsblocksize(pr, blocksize); |
cd129b7d MP |
78 | blkid_probe_set_block_size(pr, blocksize); |
79 | ||
08a53099 KZ |
80 | return 0; |
81 | } | |
82 | ||
83 | static int probe_reiser4(blkid_probe pr, const struct blkid_idmag *mag) | |
84 | { | |
4583e6b2 | 85 | const struct reiser4_super_block *rs4; |
cd129b7d | 86 | unsigned int blocksize; |
08a53099 KZ |
87 | |
88 | rs4 = blkid_probe_get_sb(pr, mag, struct reiser4_super_block); | |
89 | if (!rs4) | |
37f40602 | 90 | return errno ? -errno : 1; |
08a53099 | 91 | |
cd129b7d MP |
92 | blocksize = rs4->rs4_blocksize * 256; |
93 | ||
b1646690 | 94 | if (*rs4->rs4_label) |
08a53099 KZ |
95 | blkid_probe_set_label(pr, rs4->rs4_label, sizeof(rs4->rs4_label)); |
96 | blkid_probe_set_uuid(pr, rs4->rs4_uuid); | |
b1646690 | 97 | blkid_probe_set_version(pr, "4"); |
08a53099 | 98 | |
0f447d49 | 99 | blkid_probe_set_fsblocksize(pr, blocksize); |
cd129b7d MP |
100 | blkid_probe_set_block_size(pr, blocksize); |
101 | ||
08a53099 KZ |
102 | return 0; |
103 | } | |
104 | ||
105 | ||
106 | const struct blkid_idinfo reiser_idinfo = | |
107 | { | |
88df7228 | 108 | .name = "reiserfs", |
08a53099 KZ |
109 | .usage = BLKID_USAGE_FILESYSTEM, |
110 | .probefunc = probe_reiser, | |
04f7020e | 111 | .minsz = 128 * 1024, |
08a53099 KZ |
112 | .magics = |
113 | { | |
114 | { .magic = "ReIsErFs", .len = 8, .kboff = 8, .sboff = 0x34 }, | |
115 | { .magic = "ReIsEr2Fs", .len = 9, .kboff = 64, .sboff = 0x34 }, | |
116 | { .magic = "ReIsEr3Fs", .len = 9, .kboff = 64, .sboff = 0x34 }, | |
117 | { .magic = "ReIsErFs", .len = 8, .kboff = 64, .sboff = 0x34 }, | |
118 | { .magic = "ReIsErFs", .len = 8, .kboff = 8, .sboff = 20 }, | |
119 | { NULL } | |
120 | } | |
121 | }; | |
122 | ||
123 | const struct blkid_idinfo reiser4_idinfo = | |
124 | { | |
125 | .name = "reiser4", | |
126 | .usage = BLKID_USAGE_FILESYSTEM, | |
127 | .probefunc = probe_reiser4, | |
04f7020e | 128 | .minsz = 128 * 1024, |
08a53099 KZ |
129 | .magics = |
130 | { | |
131 | { .magic = "ReIsEr4", .len = 7, .kboff = 64 }, | |
132 | { NULL } | |
133 | } | |
134 | }; | |
135 | ||
136 | ||
137 | ||
138 |