]>
Commit | Line | Data |
---|---|---|
d321ceac | 1 | /* |
0d3e0b37 | 2 | * Copyright (c) 2000-2001 Silicon Graphics, Inc. All Rights Reserved. |
d321ceac NS |
3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | |
5 | * under the terms of version 2 of the GNU General Public License as | |
6 | * published by the Free Software Foundation. | |
7 | * | |
8 | * This program is distributed in the hope that it would be useful, but | |
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
11 | * | |
12 | * Further, this software is distributed without any warranty that it is | |
13 | * free of the rightful claim of any third person regarding infringement | |
14 | * or the like. Any license provided herein, whether implied or | |
15 | * otherwise, applies only to this software file. Patent licenses, if | |
16 | * any, provided herein do not apply to combinations of this program with | |
17 | * other software, or any other product whatsoever. | |
18 | * | |
19 | * You should have received a copy of the GNU General Public License along | |
20 | * with this program; if not, write the Free Software Foundation, Inc., 59 | |
21 | * Temple Place - Suite 330, Boston MA 02111-1307, USA. | |
22 | * | |
23 | * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, | |
24 | * Mountain View, CA 94043, or: | |
25 | * | |
26 | * http://www.sgi.com | |
27 | * | |
28 | * For further information regarding this notice, see: | |
29 | * | |
30 | * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ | |
31 | */ | |
32 | ||
33 | #include <libxlog.h> | |
34 | ||
35 | int print_exit; | |
36 | int print_record_header; | |
37 | libxfs_init_t x; | |
38 | ||
39 | static int | |
40 | header_check_uuid(xfs_mount_t *mp, xlog_rec_header_t *head) | |
41 | { | |
42 | char uu_log[64], uu_sb[64]; | |
43 | ||
44 | if (!uuid_compare(mp->m_sb.sb_uuid, head->h_fs_uuid)) return 0; | |
45 | ||
46 | uuid_unparse(mp->m_sb.sb_uuid, uu_sb); | |
47 | uuid_unparse(head->h_fs_uuid, uu_log); | |
48 | ||
49 | printf("* ERROR: mismatched uuid in log\n" | |
50 | "* SB : %s\n* log: %s\n", | |
51 | uu_sb, uu_log); | |
52 | ||
53 | return 1; | |
54 | } | |
55 | ||
56 | int | |
57 | xlog_header_check_recover(xfs_mount_t *mp, xlog_rec_header_t *head) | |
58 | { | |
59 | if (print_record_header) | |
60 | printf("\nLOG REC AT LSN cycle %d block %d (0x%x, 0x%x)\n", | |
61 | CYCLE_LSN(head->h_lsn, ARCH_CONVERT), | |
62 | BLOCK_LSN(head->h_lsn, ARCH_CONVERT), | |
63 | CYCLE_LSN(head->h_lsn, ARCH_CONVERT), | |
64 | BLOCK_LSN(head->h_lsn, ARCH_CONVERT)); | |
65 | ||
66 | if (INT_GET(head->h_magicno, ARCH_CONVERT) != XLOG_HEADER_MAGIC_NUM) { | |
67 | ||
68 | printf("* ERROR: bad magic number in log header: 0x%x\n", | |
69 | INT_GET(head->h_magicno, ARCH_CONVERT)); | |
70 | ||
71 | } else if (header_check_uuid(mp, head)) { | |
72 | ||
73 | /* failed - fall through */ | |
74 | ||
75 | } else if (INT_GET(head->h_fmt, ARCH_CONVERT) != XLOG_FMT) { | |
76 | ||
77 | printf("* ERROR: log format incompatible (log=%d, ours=%d)\n", | |
78 | INT_GET(head->h_fmt, ARCH_CONVERT), XLOG_FMT); | |
79 | ||
80 | } else { | |
81 | /* everything is ok */ | |
82 | return 0; | |
83 | } | |
84 | ||
85 | /* bail out now or just carry on regardless */ | |
86 | if (print_exit) | |
87 | xlog_exit("Bad log"); | |
88 | ||
89 | return 0; | |
90 | } | |
91 | ||
92 | int | |
93 | xlog_header_check_mount(xfs_mount_t *mp, xlog_rec_header_t *head) | |
94 | { | |
95 | if (uuid_is_null(head->h_fs_uuid)) return 0; | |
96 | if (header_check_uuid(mp, head)) { | |
97 | /* bail out now or just carry on regardless */ | |
98 | if (print_exit) | |
99 | xlog_exit("Bad log"); | |
100 | } | |
101 | return 0; | |
102 | } |