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 * load_befs_sb -- Read from disk and properly byteswap all the fields
18 * of the befs superblock
25 befs_load_sb(struct super_block
*sb
, befs_super_block
* disk_sb
)
27 struct befs_sb_info
*befs_sb
= BEFS_SB(sb
);
29 /* Check the byte order of the filesystem */
30 if (disk_sb
->fs_byte_order
== BEFS_BYTEORDER_NATIVE_LE
)
31 befs_sb
->byte_order
= BEFS_BYTESEX_LE
;
32 else if (disk_sb
->fs_byte_order
== BEFS_BYTEORDER_NATIVE_BE
)
33 befs_sb
->byte_order
= BEFS_BYTESEX_BE
;
35 befs_sb
->magic1
= fs32_to_cpu(sb
, disk_sb
->magic1
);
36 befs_sb
->magic2
= fs32_to_cpu(sb
, disk_sb
->magic2
);
37 befs_sb
->magic3
= fs32_to_cpu(sb
, disk_sb
->magic3
);
38 befs_sb
->block_size
= fs32_to_cpu(sb
, disk_sb
->block_size
);
39 befs_sb
->block_shift
= fs32_to_cpu(sb
, disk_sb
->block_shift
);
40 befs_sb
->num_blocks
= fs64_to_cpu(sb
, disk_sb
->num_blocks
);
41 befs_sb
->used_blocks
= fs64_to_cpu(sb
, disk_sb
->used_blocks
);
42 befs_sb
->inode_size
= fs32_to_cpu(sb
, disk_sb
->inode_size
);
44 befs_sb
->blocks_per_ag
= fs32_to_cpu(sb
, disk_sb
->blocks_per_ag
);
45 befs_sb
->ag_shift
= fs32_to_cpu(sb
, disk_sb
->ag_shift
);
46 befs_sb
->num_ags
= fs32_to_cpu(sb
, disk_sb
->num_ags
);
48 befs_sb
->log_blocks
= fsrun_to_cpu(sb
, disk_sb
->log_blocks
);
49 befs_sb
->log_start
= fs64_to_cpu(sb
, disk_sb
->log_start
);
50 befs_sb
->log_end
= fs64_to_cpu(sb
, disk_sb
->log_end
);
52 befs_sb
->root_dir
= fsrun_to_cpu(sb
, disk_sb
->root_dir
);
53 befs_sb
->indices
= fsrun_to_cpu(sb
, disk_sb
->indices
);
60 befs_check_sb(struct super_block
*sb
)
62 struct befs_sb_info
*befs_sb
= BEFS_SB(sb
);
64 /* Check magic headers of super block */
65 if ((befs_sb
->magic1
!= BEFS_SUPER_MAGIC1
)
66 || (befs_sb
->magic2
!= BEFS_SUPER_MAGIC2
)
67 || (befs_sb
->magic3
!= BEFS_SUPER_MAGIC3
)) {
68 befs_error(sb
, "invalid magic header");
73 * Check blocksize of BEFS.
75 * Blocksize of BEFS is 1024, 2048, 4096 or 8192.
78 if ((befs_sb
->block_size
!= 1024)
79 && (befs_sb
->block_size
!= 2048)
80 && (befs_sb
->block_size
!= 4096)
81 && (befs_sb
->block_size
!= 8192)) {
82 befs_error(sb
, "invalid blocksize: %u", befs_sb
->block_size
);
86 if (befs_sb
->block_size
> PAGE_SIZE
) {
87 befs_error(sb
, "blocksize(%u) cannot be larger"
88 "than system pagesize(%lu)", befs_sb
->block_size
,
94 * block_shift and block_size encode the same information
95 * in different ways as a consistency check.
98 if ((1 << befs_sb
->block_shift
) != befs_sb
->block_size
) {
99 befs_error(sb
, "block_shift disagrees with block_size. "
100 "Corruption likely.");
104 if (befs_sb
->log_start
!= befs_sb
->log_end
) {
105 befs_error(sb
, "Filesystem not clean! There are blocks in the "
106 "journal. You must boot into BeOS and mount this volume "
107 "to make it clean.");