]>
git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - fs/befs/super.c
4 * Copyright (C) 2001-2002 Will Dyson <will_dyson@pobox.com>
6 * Licensed under the GNU GPL. See the file COPYING for details.
11 #include <asm/page.h> /* for PAGE_SIZE */
17 * befs_load_sb -- Read from disk and properly byteswap all the fields
18 * of the befs superblock
21 befs_load_sb(struct super_block
*sb
, befs_super_block
*disk_sb
)
23 struct befs_sb_info
*befs_sb
= BEFS_SB(sb
);
25 /* Check the byte order of the filesystem */
26 if (disk_sb
->fs_byte_order
== BEFS_BYTEORDER_NATIVE_LE
)
27 befs_sb
->byte_order
= BEFS_BYTESEX_LE
;
28 else if (disk_sb
->fs_byte_order
== BEFS_BYTEORDER_NATIVE_BE
)
29 befs_sb
->byte_order
= BEFS_BYTESEX_BE
;
31 befs_sb
->magic1
= fs32_to_cpu(sb
, disk_sb
->magic1
);
32 befs_sb
->magic2
= fs32_to_cpu(sb
, disk_sb
->magic2
);
33 befs_sb
->magic3
= fs32_to_cpu(sb
, disk_sb
->magic3
);
34 befs_sb
->block_size
= fs32_to_cpu(sb
, disk_sb
->block_size
);
35 befs_sb
->block_shift
= fs32_to_cpu(sb
, disk_sb
->block_shift
);
36 befs_sb
->num_blocks
= fs64_to_cpu(sb
, disk_sb
->num_blocks
);
37 befs_sb
->used_blocks
= fs64_to_cpu(sb
, disk_sb
->used_blocks
);
38 befs_sb
->inode_size
= fs32_to_cpu(sb
, disk_sb
->inode_size
);
40 befs_sb
->blocks_per_ag
= fs32_to_cpu(sb
, disk_sb
->blocks_per_ag
);
41 befs_sb
->ag_shift
= fs32_to_cpu(sb
, disk_sb
->ag_shift
);
42 befs_sb
->num_ags
= fs32_to_cpu(sb
, disk_sb
->num_ags
);
44 befs_sb
->flags
= fs32_to_cpu(sb
, disk_sb
->flags
);
46 befs_sb
->log_blocks
= fsrun_to_cpu(sb
, disk_sb
->log_blocks
);
47 befs_sb
->log_start
= fs64_to_cpu(sb
, disk_sb
->log_start
);
48 befs_sb
->log_end
= fs64_to_cpu(sb
, disk_sb
->log_end
);
50 befs_sb
->root_dir
= fsrun_to_cpu(sb
, disk_sb
->root_dir
);
51 befs_sb
->indices
= fsrun_to_cpu(sb
, disk_sb
->indices
);
58 befs_check_sb(struct super_block
*sb
)
60 struct befs_sb_info
*befs_sb
= BEFS_SB(sb
);
62 /* Check magic headers of super block */
63 if ((befs_sb
->magic1
!= BEFS_SUPER_MAGIC1
)
64 || (befs_sb
->magic2
!= BEFS_SUPER_MAGIC2
)
65 || (befs_sb
->magic3
!= BEFS_SUPER_MAGIC3
)) {
66 befs_error(sb
, "invalid magic header");
71 * Check blocksize of BEFS.
73 * Blocksize of BEFS is 1024, 2048, 4096 or 8192.
76 if ((befs_sb
->block_size
!= 1024)
77 && (befs_sb
->block_size
!= 2048)
78 && (befs_sb
->block_size
!= 4096)
79 && (befs_sb
->block_size
!= 8192)) {
80 befs_error(sb
, "invalid blocksize: %u", befs_sb
->block_size
);
84 if (befs_sb
->block_size
> PAGE_SIZE
) {
85 befs_error(sb
, "blocksize(%u) cannot be larger "
86 "than system pagesize(%lu)", befs_sb
->block_size
,
92 * block_shift and block_size encode the same information
93 * in different ways as a consistency check.
96 if ((1 << befs_sb
->block_shift
) != befs_sb
->block_size
) {
97 befs_error(sb
, "block_shift disagrees with block_size. "
98 "Corruption likely.");
103 /* ag_shift also encodes the same information as blocks_per_ag in a
104 * different way, non-fatal consistency check
106 if ((1 << befs_sb
->ag_shift
) != befs_sb
->blocks_per_ag
)
107 befs_error(sb
, "ag_shift disagrees with blocks_per_ag.");
109 if (befs_sb
->log_start
!= befs_sb
->log_end
||
110 befs_sb
->flags
== BEFS_DIRTY
) {
111 befs_error(sb
, "Filesystem not clean! There are blocks in the "
112 "journal. You must boot into BeOS and mount this "
113 "volume to make it clean.");