adfs_fs.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _ADFS_FS_H
  2. #define _ADFS_FS_H
  3. #include <linux/types.h>
  4. /*
  5.  * Disc Record at disc address 0xc00
  6.  */
  7. struct adfs_discrecord {
  8.     __u8  log2secsize;
  9.     __u8  secspertrack;
  10.     __u8  heads;
  11.     __u8  density;
  12.     __u8  idlen;
  13.     __u8  log2bpmb;
  14.     __u8  skew;
  15.     __u8  bootoption;
  16.     __u8  lowsector;
  17.     __u8  nzones;
  18.     __u16 zone_spare;
  19.     __u32 root;
  20.     __u32 disc_size;
  21.     __u16 disc_id;
  22.     __u8  disc_name[10];
  23.     __u32 disc_type;
  24.     __u32 disc_size_high;
  25.     __u8  log2sharesize:4;
  26.     __u8  unused40:4;
  27.     __u8  big_flag:1;
  28.     __u8  unused41:1;
  29.     __u8  nzones_high;
  30.     __u32 format_version;
  31.     __u32 root_size;
  32.     __u8  unused52[60 - 52];
  33. };
  34. #define ADFS_DISCRECORD (0xc00)
  35. #define ADFS_DR_OFFSET (0x1c0)
  36. #define ADFS_DR_SIZE  60
  37. #define ADFS_DR_SIZE_BITS (ADFS_DR_SIZE << 3)
  38. #define ADFS_SUPER_MAGIC  0xadf5
  39. #ifdef __KERNEL__
  40. /*
  41.  * Calculate the boot block checksum on an ADFS drive.  Note that this will
  42.  * appear to be correct if the sector contains all zeros, so also check that
  43.  * the disk size is non-zero!!!
  44.  */
  45. static inline int adfs_checkbblk(unsigned char *ptr)
  46. {
  47. unsigned int result = 0;
  48. unsigned char *p = ptr + 511;
  49. do {
  50.         result = (result & 0xff) + (result >> 8);
  51.          result = result + *--p;
  52. } while (p != ptr);
  53. return (result & 0xff) != ptr[511];
  54. }
  55. #endif
  56. #endif