xref: /OK3568_Linux_fs/kernel/block/partitions/ldm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /**
3*4882a593Smuzhiyun  * ldm - Part of the Linux-NTFS project.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2001,2002 Richard Russon <ldm@flatcap.org>
6*4882a593Smuzhiyun  * Copyright (c) 2001-2007 Anton Altaparmakov
7*4882a593Smuzhiyun  * Copyright (C) 2001,2002 Jakob Kemi <jakob.kemi@telia.com>
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * Documentation is available at http://www.linux-ntfs.org/doku.php?id=downloads
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifndef _FS_PT_LDM_H_
13*4882a593Smuzhiyun #define _FS_PT_LDM_H_
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <linux/types.h>
16*4882a593Smuzhiyun #include <linux/list.h>
17*4882a593Smuzhiyun #include <linux/genhd.h>
18*4882a593Smuzhiyun #include <linux/fs.h>
19*4882a593Smuzhiyun #include <asm/unaligned.h>
20*4882a593Smuzhiyun #include <asm/byteorder.h>
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun struct parsed_partitions;
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun /* Magic numbers in CPU format. */
25*4882a593Smuzhiyun #define MAGIC_VMDB	0x564D4442		/* VMDB */
26*4882a593Smuzhiyun #define MAGIC_VBLK	0x56424C4B		/* VBLK */
27*4882a593Smuzhiyun #define MAGIC_PRIVHEAD	0x5052495648454144ULL	/* PRIVHEAD */
28*4882a593Smuzhiyun #define MAGIC_TOCBLOCK	0x544F43424C4F434BULL	/* TOCBLOCK */
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /* The defined vblk types. */
31*4882a593Smuzhiyun #define VBLK_VOL5		0x51		/* Volume,     version 5 */
32*4882a593Smuzhiyun #define VBLK_CMP3		0x32		/* Component,  version 3 */
33*4882a593Smuzhiyun #define VBLK_PRT3		0x33		/* Partition,  version 3 */
34*4882a593Smuzhiyun #define VBLK_DSK3		0x34		/* Disk,       version 3 */
35*4882a593Smuzhiyun #define VBLK_DSK4		0x44		/* Disk,       version 4 */
36*4882a593Smuzhiyun #define VBLK_DGR3		0x35		/* Disk Group, version 3 */
37*4882a593Smuzhiyun #define VBLK_DGR4		0x45		/* Disk Group, version 4 */
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /* vblk flags indicating extra information will be present */
40*4882a593Smuzhiyun #define	VBLK_FLAG_COMP_STRIPE	0x10
41*4882a593Smuzhiyun #define	VBLK_FLAG_PART_INDEX	0x08
42*4882a593Smuzhiyun #define	VBLK_FLAG_DGR3_IDS	0x08
43*4882a593Smuzhiyun #define	VBLK_FLAG_DGR4_IDS	0x08
44*4882a593Smuzhiyun #define	VBLK_FLAG_VOLU_ID1	0x08
45*4882a593Smuzhiyun #define	VBLK_FLAG_VOLU_ID2	0x20
46*4882a593Smuzhiyun #define	VBLK_FLAG_VOLU_SIZE	0x80
47*4882a593Smuzhiyun #define	VBLK_FLAG_VOLU_DRIVE	0x02
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /* size of a vblk's static parts */
50*4882a593Smuzhiyun #define VBLK_SIZE_HEAD		16
51*4882a593Smuzhiyun #define VBLK_SIZE_CMP3		22		/* Name and version */
52*4882a593Smuzhiyun #define VBLK_SIZE_DGR3		12
53*4882a593Smuzhiyun #define VBLK_SIZE_DGR4		44
54*4882a593Smuzhiyun #define VBLK_SIZE_DSK3		12
55*4882a593Smuzhiyun #define VBLK_SIZE_DSK4		45
56*4882a593Smuzhiyun #define VBLK_SIZE_PRT3		28
57*4882a593Smuzhiyun #define VBLK_SIZE_VOL5		58
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun /* component types */
60*4882a593Smuzhiyun #define COMP_STRIPE		0x01		/* Stripe-set */
61*4882a593Smuzhiyun #define COMP_BASIC		0x02		/* Basic disk */
62*4882a593Smuzhiyun #define COMP_RAID		0x03		/* Raid-set */
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /* Other constants. */
65*4882a593Smuzhiyun #define LDM_DB_SIZE		2048		/* Size in sectors (= 1MiB). */
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define OFF_PRIV1		6		/* Offset of the first privhead
68*4882a593Smuzhiyun 						   relative to the start of the
69*4882a593Smuzhiyun 						   device in sectors */
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /* Offsets to structures within the LDM Database in sectors. */
72*4882a593Smuzhiyun #define OFF_PRIV2		1856		/* Backup private headers. */
73*4882a593Smuzhiyun #define OFF_PRIV3		2047
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #define OFF_TOCB1		1		/* Tables of contents. */
76*4882a593Smuzhiyun #define OFF_TOCB2		2
77*4882a593Smuzhiyun #define OFF_TOCB3		2045
78*4882a593Smuzhiyun #define OFF_TOCB4		2046
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun #define OFF_VMDB		17		/* List of partitions. */
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun #define LDM_PARTITION		0x42		/* Formerly SFS (Landis). */
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define TOC_BITMAP1		"config"	/* Names of the two defined */
85*4882a593Smuzhiyun #define TOC_BITMAP2		"log"		/* bitmaps in the TOCBLOCK. */
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun struct frag {				/* VBLK Fragment handling */
88*4882a593Smuzhiyun 	struct list_head list;
89*4882a593Smuzhiyun 	u32		group;
90*4882a593Smuzhiyun 	u8		num;		/* Total number of records */
91*4882a593Smuzhiyun 	u8		rec;		/* This is record number n */
92*4882a593Smuzhiyun 	u8		map;		/* Which portions are in use */
93*4882a593Smuzhiyun 	u8		data[];
94*4882a593Smuzhiyun };
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /* In memory LDM database structures. */
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun struct privhead {			/* Offsets and sizes are in sectors. */
99*4882a593Smuzhiyun 	u16	ver_major;
100*4882a593Smuzhiyun 	u16	ver_minor;
101*4882a593Smuzhiyun 	u64	logical_disk_start;
102*4882a593Smuzhiyun 	u64	logical_disk_size;
103*4882a593Smuzhiyun 	u64	config_start;
104*4882a593Smuzhiyun 	u64	config_size;
105*4882a593Smuzhiyun 	uuid_t	disk_id;
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun struct tocblock {			/* We have exactly two bitmaps. */
109*4882a593Smuzhiyun 	u8	bitmap1_name[16];
110*4882a593Smuzhiyun 	u64	bitmap1_start;
111*4882a593Smuzhiyun 	u64	bitmap1_size;
112*4882a593Smuzhiyun 	u8	bitmap2_name[16];
113*4882a593Smuzhiyun 	u64	bitmap2_start;
114*4882a593Smuzhiyun 	u64	bitmap2_size;
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun struct vmdb {				/* VMDB: The database header */
118*4882a593Smuzhiyun 	u16	ver_major;
119*4882a593Smuzhiyun 	u16	ver_minor;
120*4882a593Smuzhiyun 	u32	vblk_size;
121*4882a593Smuzhiyun 	u32	vblk_offset;
122*4882a593Smuzhiyun 	u32	last_vblk_seq;
123*4882a593Smuzhiyun };
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun struct vblk_comp {			/* VBLK Component */
126*4882a593Smuzhiyun 	u8	state[16];
127*4882a593Smuzhiyun 	u64	parent_id;
128*4882a593Smuzhiyun 	u8	type;
129*4882a593Smuzhiyun 	u8	children;
130*4882a593Smuzhiyun 	u16	chunksize;
131*4882a593Smuzhiyun };
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun struct vblk_dgrp {			/* VBLK Disk Group */
134*4882a593Smuzhiyun 	u8	disk_id[64];
135*4882a593Smuzhiyun };
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun struct vblk_disk {			/* VBLK Disk */
138*4882a593Smuzhiyun 	uuid_t	disk_id;
139*4882a593Smuzhiyun 	u8	alt_name[128];
140*4882a593Smuzhiyun };
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun struct vblk_part {			/* VBLK Partition */
143*4882a593Smuzhiyun 	u64	start;
144*4882a593Smuzhiyun 	u64	size;			/* start, size and vol_off in sectors */
145*4882a593Smuzhiyun 	u64	volume_offset;
146*4882a593Smuzhiyun 	u64	parent_id;
147*4882a593Smuzhiyun 	u64	disk_id;
148*4882a593Smuzhiyun 	u8	partnum;
149*4882a593Smuzhiyun };
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun struct vblk_volu {			/* VBLK Volume */
152*4882a593Smuzhiyun 	u8	volume_type[16];
153*4882a593Smuzhiyun 	u8	volume_state[16];
154*4882a593Smuzhiyun 	u8	guid[16];
155*4882a593Smuzhiyun 	u8	drive_hint[4];
156*4882a593Smuzhiyun 	u64	size;
157*4882a593Smuzhiyun 	u8	partition_type;
158*4882a593Smuzhiyun };
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun struct vblk_head {			/* VBLK standard header */
161*4882a593Smuzhiyun 	u32 group;
162*4882a593Smuzhiyun 	u16 rec;
163*4882a593Smuzhiyun 	u16 nrec;
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun struct vblk {				/* Generalised VBLK */
167*4882a593Smuzhiyun 	u8	name[64];
168*4882a593Smuzhiyun 	u64	obj_id;
169*4882a593Smuzhiyun 	u32	sequence;
170*4882a593Smuzhiyun 	u8	flags;
171*4882a593Smuzhiyun 	u8	type;
172*4882a593Smuzhiyun 	union {
173*4882a593Smuzhiyun 		struct vblk_comp comp;
174*4882a593Smuzhiyun 		struct vblk_dgrp dgrp;
175*4882a593Smuzhiyun 		struct vblk_disk disk;
176*4882a593Smuzhiyun 		struct vblk_part part;
177*4882a593Smuzhiyun 		struct vblk_volu volu;
178*4882a593Smuzhiyun 	} vblk;
179*4882a593Smuzhiyun 	struct list_head list;
180*4882a593Smuzhiyun };
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun struct ldmdb {				/* Cache of the database */
183*4882a593Smuzhiyun 	struct privhead ph;
184*4882a593Smuzhiyun 	struct tocblock toc;
185*4882a593Smuzhiyun 	struct vmdb     vm;
186*4882a593Smuzhiyun 	struct list_head v_dgrp;
187*4882a593Smuzhiyun 	struct list_head v_disk;
188*4882a593Smuzhiyun 	struct list_head v_volu;
189*4882a593Smuzhiyun 	struct list_head v_comp;
190*4882a593Smuzhiyun 	struct list_head v_part;
191*4882a593Smuzhiyun };
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun #endif /* _FS_PT_LDM_H_ */
194*4882a593Smuzhiyun 
195