4 * Copyright (C) 2001-2002 Will Dyson <will_dyson@pobox.com>
6 * Licensed under the GNU GPL. See the file COPYING for details.
16 * load_befs_sb -- Read from disk and properly byteswap all the fields
17 * of the befs superblock
24 befs_load_sb(struct super_block
*sb
, befs_super_block
* disk_sb
)
26 befs_sb_info
*befs_sb
= BEFS_SB(sb
);
28 /* Check the byte order of the filesystem */
29 if (disk_sb
->fs_byte_order
== BEFS_BYTEORDER_NATIVE_LE
)
30 befs_sb
->byte_order
= BEFS_BYTESEX_LE
;
31 else if (disk_sb
->fs_byte_order
== BEFS_BYTEORDER_NATIVE_BE
)
32 befs_sb
->byte_order
= BEFS_BYTESEX_BE
;
34 befs_sb
->magic1
= fs32_to_cpu(sb
, disk_sb
->magic1
);
35 befs_sb
->magic2
= fs32_to_cpu(sb
, disk_sb
->magic2
);
36 befs_sb
->magic3
= fs32_to_cpu(sb
, disk_sb
->magic3
);
37 befs_sb
->block_size
= fs32_to_cpu(sb
, disk_sb
->block_size
);
38 befs_sb
->block_shift
= fs32_to_cpu(sb
, disk_sb
->block_shift
);
39 befs_sb
->num_blocks
= fs64_to_cpu(sb
, disk_sb
->num_blocks
);
40 befs_sb
->used_blocks
= fs64_to_cpu(sb
, disk_sb
->used_blocks
);
41 befs_sb
->inode_size
= fs32_to_cpu(sb
, disk_sb
->inode_size
);
43 befs_sb
->blocks_per_ag
= fs32_to_cpu(sb
, disk_sb
->blocks_per_ag
);
44 befs_sb
->ag_shift
= fs32_to_cpu(sb
, disk_sb
->ag_shift
);
45 befs_sb
->num_ags
= fs32_to_cpu(sb
, disk_sb
->num_ags
);
47 befs_sb
->log_blocks
= fsrun_to_cpu(sb
, disk_sb
->log_blocks
);
48 befs_sb
->log_start
= fs64_to_cpu(sb
, disk_sb
->log_start
);
49 befs_sb
->log_end
= fs64_to_cpu(sb
, disk_sb
->log_end
);
51 befs_sb
->root_dir
= fsrun_to_cpu(sb
, disk_sb
->root_dir
);
52 befs_sb
->indices
= fsrun_to_cpu(sb
, disk_sb
->indices
);
59 befs_check_sb(struct super_block
*sb
)
61 befs_sb_info
*befs_sb
= BEFS_SB(sb
);
63 /* Check magic headers of super block */
64 if ((befs_sb
->magic1
!= BEFS_SUPER_MAGIC1
)
65 || (befs_sb
->magic2
!= BEFS_SUPER_MAGIC2
)
66 || (befs_sb
->magic3
!= BEFS_SUPER_MAGIC3
)) {
67 befs_error(sb
, "invalid magic header");
72 * Check blocksize of BEFS.
74 * Blocksize of BEFS is 1024, 2048, 4096 or 8192.
77 if ((befs_sb
->block_size
!= 1024)
78 && (befs_sb
->block_size
!= 2048)
79 && (befs_sb
->block_size
!= 4096)
80 && (befs_sb
->block_size
!= 8192)) {
81 befs_error(sb
, "invalid blocksize: %u", befs_sb
->block_size
);
85 if (befs_sb
->block_size
> PAGE_SIZE
) {
86 befs_error(sb
, "blocksize(%u) cannot be larger"
87 "than system pagesize(%lu)", befs_sb
->block_size
,
93 * block_shift and block_size encode the same information
94 * in different ways as a consistency check.
97 if ((1 << befs_sb
->block_shift
) != befs_sb
->block_size
) {
98 befs_error(sb
, "block_shift disagrees with block_size. "
99 "Corruption likely.");
103 if (befs_sb
->log_start
!= befs_sb
->log_end
) {
104 befs_error(sb
, "Filesystem not clean! There are blocks in the "
105 "journal. You must boot into BeOS and mount this volume "
106 "to make it clean.");