The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/fs/befs/super.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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 
   10 #include <linux/fs.h>
   11 
   12 #include "befs.h"
   13 #include "super.h"
   14 #include "endian.h"
   15 
   16 /**
   17  * load_befs_sb -- Read from disk and properly byteswap all the fields
   18  * of the befs superblock
   19  *
   20  *
   21  *
   22  *
   23  */
   24 int
   25 befs_load_sb(struct super_block *sb, befs_super_block * disk_sb)
   26 {
   27         befs_sb_info *befs_sb = BEFS_SB(sb);
   28 
   29         /* Check the byte order of the filesystem */
   30         if (le32_to_cpu(disk_sb->fs_byte_order) == BEFS_BYTEORDER_NATIVE)
   31                 befs_sb->byte_order = BEFS_BYTESEX_LE;
   32         else if (be32_to_cpu(disk_sb->fs_byte_order) == BEFS_BYTEORDER_NATIVE)
   33                 befs_sb->byte_order = BEFS_BYTESEX_BE;
   34 
   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);
   43 
   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);
   47 
   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);
   51 
   52         befs_sb->root_dir = fsrun_to_cpu(sb, disk_sb->root_dir);
   53         befs_sb->indices = fsrun_to_cpu(sb, disk_sb->indices);
   54         befs_sb->nls = NULL;
   55 
   56         return BEFS_OK;
   57 }
   58 
   59 int
   60 befs_check_sb(struct super_block *sb)
   61 {
   62         befs_sb_info *befs_sb = BEFS_SB(sb);
   63 
   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");
   69                 return BEFS_ERR;
   70         }
   71 
   72         /*
   73          * Check blocksize of BEFS.
   74          *
   75          * Blocksize of BEFS is 1024, 2048, 4096 or 8192.
   76          */
   77 
   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);
   83                 return BEFS_ERR;
   84         }
   85 
   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,
   89                            PAGE_SIZE);
   90                 return BEFS_ERR;
   91         }
   92 
   93         /*
   94            * block_shift and block_size encode the same information
   95            * in different ways as a consistency check.
   96          */
   97 
   98         if ((1 << befs_sb->block_shift) != befs_sb->block_size) {
   99                 befs_error(sb, "block_shift disagrees with block_size. "
  100                            "Corruption likely.");
  101                 return BEFS_ERR;
  102         }
  103 
  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.");
  108                 return BEFS_ERR;
  109         }
  110 
  111         return BEFS_OK;
  112 }

Cache object: 18e6941c5c8bb72898438a044efd7988


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.