23
25
* Authors: Sunil Mushran, Mark Fasheh
28
30
extern dbgfs_gbls gbls;
30
static void scan_journal(FILE *out, char *buf, int len,
31
uint64_t *blocknum, uint64_t *last_unknown)
32
static enum dump_block_type detect_block (char *buf);
34
static void scan_journal(FILE *out, journal_superblock_t *jsb, char *buf,
35
int len, uint64_t *blocknum, uint64_t *last_unknown)
39
enum dump_block_type type;
36
40
journal_header_t *header;
42
46
header = (journal_header_t *)block;
43
if (header->h_magic == ntohl(JFS_MAGIC_NUMBER)) {
47
if (header->h_magic == ntohl(JBD2_MAGIC_NUMBER)) {
44
48
if (*last_unknown) {
45
49
dump_jbd_unknown(out, *last_unknown, *blocknum);
48
dump_jbd_block(out, header, *blocknum);
52
dump_jbd_block(out, jsb, header, *blocknum);
50
54
type = detect_block(block);
55
if (type == DUMP_BLOCK_UNKNOWN) {
52
56
if (*last_unknown == 0)
53
57
*last_unknown = *blocknum;
97
ret = ocfs2_malloc_block(fs->fs_io, &jsb_buf);
99
com_err(gbls.cmd, ret,
100
"while allocating journal superblock buffer");
91
104
buflenbits = buflen >>
92
105
OCFS2_RAW_SB(gbls.fs->fs_super)->s_blocksize_bits;
93
106
ret = ocfs2_malloc_blocks(fs->fs_io, buflenbits, &buf);
114
128
if (offset == 0) {
115
dump_jbd_superblock(out, (journal_superblock_t *)buf);
129
memcpy(jsb_buf, buf, fs->fs_blocksize);
130
dump_jbd_superblock(out, jsb);
131
ocfs2_swap_journal_superblock(jsb);
117
133
p += fs->fs_blocksize;
118
134
len -= fs->fs_blocksize;
121
scan_journal(out, p, len, &blocknum, &last_unknown);
137
scan_journal(out, jsb, p, len, &blocknum, &last_unknown);
123
139
if (got < buflen)
146
int detect_block (char *buf)
164
static enum dump_block_type detect_block (char *buf)
148
166
struct ocfs2_dinode *inode;
149
167
struct ocfs2_extent_block *extent;
150
168
struct ocfs2_group_desc *group;
169
struct ocfs2_dir_block_trailer *trailer;
170
enum dump_block_type ret = DUMP_BLOCK_UNKNOWN;
153
172
inode = (struct ocfs2_dinode *)buf;
154
if (!memcmp(inode->i_signature, OCFS2_INODE_SIGNATURE,
155
sizeof(OCFS2_INODE_SIGNATURE))) {
173
if (!strncmp((char *)inode->i_signature, OCFS2_INODE_SIGNATURE,
174
sizeof(inode->i_signature))) {
175
ret = DUMP_BLOCK_INODE;
160
179
extent = (struct ocfs2_extent_block *)buf;
161
if (!memcmp(extent->h_signature, OCFS2_EXTENT_BLOCK_SIGNATURE,
162
sizeof(OCFS2_EXTENT_BLOCK_SIGNATURE))) {
180
if (!strncmp((char *)extent->h_signature, OCFS2_EXTENT_BLOCK_SIGNATURE,
181
sizeof(extent->h_signature))) {
182
ret = DUMP_BLOCK_EXTENT_BLOCK;
167
186
group = (struct ocfs2_group_desc *)buf;
168
if (!memcmp(group->bg_signature, OCFS2_GROUP_DESC_SIGNATURE,
169
sizeof(OCFS2_GROUP_DESC_SIGNATURE))) {
187
if (!strncmp((char *)group->bg_signature, OCFS2_GROUP_DESC_SIGNATURE,
188
sizeof(group->bg_signature))) {
189
ret = DUMP_BLOCK_GROUP_DESCRIPTOR;
193
trailer = ocfs2_dir_trailer_from_block(gbls.fs, buf);
194
if (!strncmp((char *)trailer->db_signature, OCFS2_DIR_TRAILER_SIGNATURE,
195
sizeof(trailer->db_signature))) {
196
ret = DUMP_BLOCK_DIR_BLOCK;