ldm.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _FS_PT_LDM_H_
  2. #define _FS_PT_LDM_H_
  3. /*
  4.  * ldm - Part of the Linux-NTFS project.
  5.  *
  6.  * Copyright (C) 2001 Richard Russon <ldm@flatcap.org>
  7.  * Copyright (C) 2001 Anton Altaparmakov <antona@users.sf.net>
  8.  *
  9.  * Documentation is available at http://linux-ntfs.sf.net/ldm
  10.  *
  11.  * This program is free software; you can redistribute it and/or modify it
  12.  * under the terms of the GNU General Public License as published by the Free
  13.  * Software Foundation; either version 2 of the License, or (at your option)
  14.  * any later version.
  15.  *
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program (in the main directory of the Linux-NTFS source
  23.  * in the file COPYING); if not, write to the Free Software Foundation,
  24.  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  25.  */
  26. #include <linux/types.h>
  27. #include <asm/unaligned.h>
  28. #include <asm/byteorder.h>
  29. #include <linux/genhd.h>
  30. /* Borrowed from kernel.h. */
  31. #define LDM_PREFIX "LDM: "    /* Prefix our error messages with this. */
  32. #define LDM_CRIT KERN_CRIT LDM_PREFIX /* critical conditions */
  33. #define LDM_ERR KERN_ERR LDM_PREFIX /* error conditions */
  34. #define LDM_DEBUG KERN_DEBUG LDM_PREFIX /* debug-level messages */
  35. /* Magic numbers in CPU format. */
  36. #define MAGIC_VMDB 0x564D4442 /* VMDB */
  37. #define MAGIC_VBLK 0x56424C4B /* VBLK */
  38. #define MAGIC_PRIVHEAD 0x5052495648454144 /* PRIVHEAD */
  39. #define MAGIC_TOCBLOCK 0x544F43424C4F434B /* TOCBLOCK */
  40. /* The defined vblk types. */
  41. #define VBLK_COMP 0x32 /* Component */
  42. #define VBLK_PART 0x33 /* Partition */
  43. #define VBLK_DSK1 0x34 /* Disk */
  44. #define VBLK_DSK2 0x44 /* Disk */
  45. #define VBLK_DGR1 0x35 /* Disk Group */
  46. #define VBLK_DGR2 0x45 /* Disk Group */
  47. #define VBLK_VOLU 0x51 /* Volume */
  48. /* Other constants. */
  49. #define LDM_BLOCKSIZE 1024 /* Size of block in bytes. */
  50. #define LDM_DB_SIZE 2048 /* Size in sectors (= 1MiB). */
  51. #define LDM_FIRST_PART_OFFSET 4 /* Add this to first_part_minor
  52.    to get to the first data
  53.    partition device minor. */
  54. #define OFF_PRIVHEAD1 3 /* Offset of the first privhead
  55.    relative to the start of the
  56.    device in units of
  57.    LDM_BLOCKSIZE. */
  58. /* Offsets to structures within the LDM Database in units of LDM_BLOCKSIZE. */
  59. #define OFF_PRIVHEAD2 928 /* Backup private headers. */
  60. #define OFF_PRIVHEAD3 1023
  61. #define OFF_TOCBLOCK1 0 /* Tables of contents. */
  62. #define OFF_TOCBLOCK2 1
  63. #define OFF_TOCBLOCK3 1022
  64. #define OFF_TOCBLOCK4 1023
  65. #define OFF_VMDB 8 /* List of partitions. */
  66. #define OFF_VBLK 9
  67. #define WIN2K_DYNAMIC_PARTITION 0x42 /* Formerly SFS (Landis). */
  68. #define WIN2K_EXTENDED_PARTITION 0x05 /* A standard extended
  69.    partition. */
  70. #define TOC_BITMAP1 "config" /* Names of the two defined */
  71. #define TOC_BITMAP2 "log" /* bitmaps in the TOCBLOCK. */
  72. /* Most numbers we deal with are big-endian and won't be aligned. */
  73. #define BE16(x) ((u16)be16_to_cpu(get_unaligned((u16*)(x))))
  74. #define BE32(x) ((u32)be32_to_cpu(get_unaligned((u32*)(x))))
  75. #define BE64(x) ((u64)be64_to_cpu(get_unaligned((u64*)(x))))
  76. /* Borrowed from msdos.c. */
  77. #define SYS_IND(p) (get_unaligned(&(p)->sys_ind))
  78. #define NR_SECTS(p) ({ __typeof__((p)->nr_sects) __a =
  79. get_unaligned(&(p)->nr_sects);
  80. le32_to_cpu(__a);
  81. })
  82. #define START_SECT(p) ({ __typeof__((p)->start_sect) __a =
  83. get_unaligned(&(p)->start_sect);
  84. le32_to_cpu(__a);
  85. })
  86. /* In memory LDM database structures. */
  87. #define DISK_ID_SIZE 64 /* Size in bytes. */
  88. struct ldmdisk {
  89. u64 obj_id;
  90. u8 disk_id[DISK_ID_SIZE];
  91. };
  92. struct privhead { /* Offsets and sizes are in sectors. */
  93. u16 ver_major;
  94. u16 ver_minor;
  95. u64 logical_disk_start;
  96. u64 logical_disk_size;
  97. u64 config_start;
  98. u64 config_size;
  99. u8 disk_id[DISK_ID_SIZE];
  100. };
  101. struct tocblock { /* We have exactly two bitmaps. */
  102. u8 bitmap1_name[16];
  103. u64 bitmap1_start;
  104. u64 bitmap1_size;
  105. /*u64 bitmap1_flags;*/
  106. u8 bitmap2_name[16];
  107. u64 bitmap2_start;
  108. u64 bitmap2_size;
  109. /*u64 bitmap2_flags;*/
  110. };
  111. struct vmdb {
  112. u16 ver_major;
  113. u16 ver_minor;
  114. u32 vblk_size;
  115. u32 vblk_offset;
  116. u32 last_vblk_seq;
  117. };
  118. struct vblk {
  119. u8 name[64];
  120. u8 vblk_type;
  121. u64 obj_id;
  122. u64 disk_id;
  123. u64 start_sector;
  124. u64 num_sectors;
  125. };
  126. struct ldm_part {
  127. struct list_head part_list;
  128. unsigned long start;
  129. unsigned long size;
  130. };
  131. int ldm_partition(struct gendisk *hd, struct block_device *bdev,
  132. unsigned long first_sector, int first_part_minor);
  133. #endif /* _FS_PT_LDM_H_ */