1    | /* 
2    |  super_block.h
3    |  -------------
4    |  $Id: super_block.h,v 1.13 2003/10/20 07:18:11 stewart Exp $
5    |  
6    |  Part of the FCFS object store.
7    | 
8    |  This file describes the super block and related data structures.
9    | 
10   |  (C)2003 Stewart Smith
11   |  Distributed under the GNU Public License
12   | */
13   | #ifndef __FCFS_SUPER_BLOCK_H__
14   | #define __FCFS_SUPER_BLOCK_H__
15   | 
16   | #include "disk.h"
17   | 
18   | /* fcfs_block_run
19   |    --------------
20   |    We have a max of ~4billion alloction groups,
21   |    within these, we can have up to 4billion blocks.
22   |    and we can address these with *one* block_run structure.
23   |    This means we don't have a lot of block address lookup on large files
24   |    or contiguous files. Should lead to fast IO...
25   |  */
26   | struct fcfs_block_run {
27   |   u32 allocation_group;		/* Allocation group */
28   |   u32 start;			/* Start Block */
29   |   u32 len;			/* Length (blocks) */
30   | };
31   | 
32   | #define FCFS_SB_MAGIC1   0x46436673  /* FCFS */
33   | #define FCFS_SB_VERSION1 0x00010001  /* V1 SB, V1 FS */
34   | #define FCFS_SB_BITS     0x00000040  /* We're 64bit - but could be bigger...*/
35   | 
36   | #define FCFS_NAME_LENGTH 128	     /* Human Readable Name */
37   | #define FCFS_SB_MAGIC2   0x3f8ec2a1  /* There is no meaning, just weird num */
38   | 
39   | enum fcfs_sb_flags {
40   |   FCFS_FLAG_SBLocation1,	/* Three flags make number */
41   |   FCFS_FLAG_SBLocation2,	/* see: enum fcfs_sb_location */
42   |   FCFS_FLAG_SBLocation3,
43   |   FCFS_FLAG_Dirty,		/* Was uncleanly unmounted*/
44   |   FCFS_FLAG_Experimental,	/* Has been written by experimental code */
45   |   FCFS_FLAG_JournalMeta,	/* Journal meta-data */
46   |   FCFS_FLAG_JournalData,	/* Journal all data writes*/
47   |   FCFS_FLAG_Versioned,		/* Is versioned system */
48   | };
49   | 
50   | enum fcfs_sb_location {
51   |   FCFS_SBloc_start_volume,	/* Start of volume */
52   |   FCFS_SBloc_start_ag,		/* Start of allocation group */
53   |   FCFS_SBloc_end_volume		/* Final block of volume */
54   | };
55   | 
56   | struct fcfs_sb {
57   |   u32 magic1;    // first magic number. 
58   |   u32 version;   // version of FS
59   |   u32 bits;      // number of bits to use as a 'base' bits. (64 default)
60   |   u32 sblength;   // length of sb (bytes)
61   | 
62   |   u64 flags;
63   | 
64   |   u32 bsize;     // block size (bytes)
65   |   u64 blocksnr;  // number of blocks
66   | 
67   | 
68   |   char name[FCFS_NAME_LENGTH];  // human readable name of volume
69   |   u32 magic2;    // magic2
70   | 
71   |   u32 allocation_groupsnr;	/* Number of alloction groups on volume */
72   |   u32 ag_blocksnr;		/* Blocks per allocation group */
73   | 
74   |   u64 num_mounts;		/* Number of successful read/write mounts */
75   |   u64 num_dirtymounts;		/* Num dirty mounts */
76   |   u64 time_created;		/* Time volume created*/
77   |   u64 time_clean;		/* Time volume last unmounted cleanly*/
78   |   u64 time_dirtymount;		/* Time volume last mounted dirty */
79   | 
80   |   u64 onode_index_blocknr;	/* Where we find our primary index */
81   | 
82   |   u64 onindex_num_onodes;	/* Num onodes in index */
83   |   u64 onindex_used;		/* Num of used inodes in index */
84   |   u64 onindex_free;		/* Num of free onodes in index */
85   |   u64 onindex_next_id;		/* Next ID to use */
86   |   u32 onindex_node_size;	/* In number of keys */
87   | 
88   |   union space_tracking {
89   |     
90   |     char padding[50];
91   |   }space;
92   | };
93   | 
94   | #define FCFS_ONODE_MAGIC1  0x4f4e6f4465563101ULL	/* ONoDeV1 0x01 */
95   | 
96   | enum fcfs_onode_flags {
97   |   FCFS_OFLAG_NoVersion,		/* Don't version track this onode */
98   |   FCFS_OFLAG_ForkLeaf		/* We have a fork leaf, not a node */
99   | };
100  | 
101  | #define FSFS_ONODE1_SPACE_LEAF_MAXNR 10
102  | 
103  | struct fcfs_onode1_space_leaf {
104  |   char nr;
105  |   struct fcfs_block_run br[FSFS_ONODE1_SPACE_LEAF_MAXNR];
106  | };
107  | 
108  | struct fcfs_onode1_space_node {
109  |   u64 offset[7];
110  |   u64 block[7];
111  | };
112  | 
113  | enum fcfs_fork_flags {
114  |   FCFS_FORK_InForkData,		/* We have data, not space nodes */
115  |   FCFS_FORK_SpaceNode		/* Space is node, not leaf */
116  | };
117  | 
118  | #define FCFS_FORK_SMALL_DATA_SIZE 112
119  | 
120  | struct fcfs_fork {
121  |   u64 fork_type;
122  |   u64 fork_flags;
123  |   u64 content_length;
124  |   union data {
125  |     union space {
126  |       struct fcfs_onode1_space_leaf leaf;
127  |       struct fcfs_onode1_space_node node;
128  |     } space;
129  |     
130  |     char small_data[FCFS_FORK_SMALL_DATA_SIZE];	/* I wish this was neater, as part of the leaf */
131  |   } data ;
132  | };  
133  | 
134  | struct fcfs_fork_leaf {
135  |   char nr;
136  |   struct fcfs_fork fork[10];
137  | };
138  | 
139  | struct fcfs_fork_node {
140  |   u64 offset[7];
141  |   u64 block[7];
142  | };
143  | 
144  | struct fcfs_onode1 {
145  |   u64 magic1;			/* Identify as O-Node */
146  |   u64 onode_num;		/* FS Specific Unique ID */
147  |   u64 onode_revision;		/* Revision of onode */
148  |   u64 flags;			/* fcfs_onode_flags */
149  |   u64 use_count;		/* Reference Counter (for indicies) */
150  |   u32 onode_size;		/* Length of o-node structure. */
151  |   union forks {
152  |     struct fcfs_fork_leaf leaf;
153  |     struct fcfs_fork_node node;
154  |   } forks;
155  |   char small_space[1];		/* used for in-onode data (or metadata) */
156  | };
157  | 
158  | 
159  | /* Functions for manipulating the Super Block */
160  | int fcfs_write_sb(struct fcfs_disk *disk);
161  | int fcfs_sb_mark_dirty(struct fcfs_disk *disk);
162  | int fcfs_sb_mark_clean(struct fcfs_disk *disk);
163  | 
164  | #endif
165  |