super.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * super.c
  3. *
  4. * Copyright (C) 2001-2002 Will Dyson <will_dyson@pobox.com>
  5. *
  6. * Licensed under the GNU GPL. See the file COPYING for details.
  7. *
  8. */
  9. #include <linux/fs.h>
  10. #include "befs.h"
  11. #include "super.h"
  12. /**
  13. * load_befs_sb -- Read from disk and properly byteswap all the fields
  14. * of the befs superblock
  15. *
  16. *
  17. *
  18. *
  19. */
  20. int
  21. befs_load_sb(struct super_block *sb, befs_super_block * disk_sb)
  22. {
  23. befs_sb_info *befs_sb = BEFS_SB(sb);
  24. /* Check the byte order of the filesystem */
  25. if (le32_to_cpu(disk_sb->fs_byte_order) == BEFS_BYTEORDER_NATIVE)
  26. befs_sb->byte_order = BEFS_BYTESEX_LE;
  27. else if (be32_to_cpu(disk_sb->fs_byte_order) == BEFS_BYTEORDER_NATIVE)
  28. befs_sb->byte_order = BEFS_BYTESEX_BE;
  29. befs_sb->magic1 = fs32_to_cpu(sb, disk_sb->magic1);
  30. befs_sb->magic2 = fs32_to_cpu(sb, disk_sb->magic2);
  31. befs_sb->magic3 = fs32_to_cpu(sb, disk_sb->magic3);
  32. befs_sb->block_size = fs32_to_cpu(sb, disk_sb->block_size);
  33. befs_sb->block_shift = fs32_to_cpu(sb, disk_sb->block_shift);
  34. befs_sb->num_blocks = fs64_to_cpu(sb, disk_sb->num_blocks);
  35. befs_sb->used_blocks = fs64_to_cpu(sb, disk_sb->used_blocks);
  36. befs_sb->inode_size = fs32_to_cpu(sb, disk_sb->inode_size);
  37. befs_sb->blocks_per_ag = fs32_to_cpu(sb, disk_sb->blocks_per_ag);
  38. befs_sb->ag_shift = fs32_to_cpu(sb, disk_sb->ag_shift);
  39. befs_sb->num_ags = fs32_to_cpu(sb, disk_sb->num_ags);
  40. befs_sb->log_blocks = fsrun_to_cpu(sb, disk_sb->log_blocks);
  41. befs_sb->log_start = fs64_to_cpu(sb, disk_sb->log_start);
  42. befs_sb->log_end = fs64_to_cpu(sb, disk_sb->log_end);
  43. befs_sb->root_dir = fsrun_to_cpu(sb, disk_sb->root_dir);
  44. befs_sb->indices = fsrun_to_cpu(sb, disk_sb->indices);
  45. befs_sb->nls = NULL;
  46. return BEFS_OK;
  47. }
  48. int
  49. befs_check_sb(struct super_block *sb)
  50. {
  51. befs_sb_info *befs_sb = BEFS_SB(sb);
  52. /* Check magic headers of super block */
  53. if ((befs_sb->magic1 != BEFS_SUPER_MAGIC1)
  54. || (befs_sb->magic2 != BEFS_SUPER_MAGIC2)
  55. || (befs_sb->magic3 != BEFS_SUPER_MAGIC3)) {
  56. befs_error(sb, "invalid magic header");
  57. return BEFS_ERR;
  58. }
  59. /*
  60. * Check blocksize of BEFS.
  61. *
  62. * Blocksize of BEFS is 1024, 2048, 4096 or 8192.
  63. */
  64. if ((befs_sb->block_size != 1024)
  65. && (befs_sb->block_size != 2048)
  66. && (befs_sb->block_size != 4096)
  67. && (befs_sb->block_size != 8192)) {
  68. befs_error(sb, "invalid blocksize: %u", befs_sb->block_size);
  69. return BEFS_ERR;
  70. }
  71. if (befs_sb->block_size > PAGE_SIZE) {
  72. befs_error(sb, "blocksize(%u) cannot be larger"
  73. "than system pagesize(%lu)", befs_sb->block_size,
  74. PAGE_SIZE);
  75. return BEFS_ERR;
  76. }
  77. /*
  78. * block_shift and block_size encode the same information
  79. * in different ways as a consistency check.
  80. */
  81. if ((1 << befs_sb->block_shift) != befs_sb->block_size) {
  82. befs_error(sb, "block_shift disagrees with block_size. "
  83. "Corruption likely.");
  84. return BEFS_ERR;
  85. }
  86. if (befs_sb->log_start != befs_sb->log_end) {
  87. befs_error(sb, "Filesystem not clean! There are blocks in the "
  88. "journal. You must boot into BeOS and mount this volume "
  89. "to make it clean.");
  90. return BEFS_ERR;
  91. }
  92. return BEFS_OK;
  93. }