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