xref: /onnv-gate/usr/src/lib/libparted/common/libparted/fs/hfs/cache.h (revision 9663:ace9a2ac3683)
1 /*
2     libparted - a library for manipulating disk partitions
3     Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
4 
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 3 of the License, or
8     (at your option) any later version.
9 
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14 
15     You should have received a copy of the GNU General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #ifndef _CACHE_H
20 #define _CACHE_H
21 
22 #include <parted/parted.h>
23 #include <parted/endian.h>
24 #include <parted/debug.h>
25 
26 #include "hfs.h"
27 
28 /* CR => CACHE REF */
29 #define CR_NULL			 0 /* reserved */
30 #define CR_PRIM_CAT		 1
31 #define CR_PRIM_EXT		 2
32 #define CR_PRIM_ATTR		 3
33 #define CR_PRIM_ALLOC		 4
34 #define CR_PRIM_START		 5
35 #define CR_BTREE_CAT		 6
36 #define CR_BTREE_ATTR		 7
37 #define CR_BTREE_EXT_0		 8
38 #define CR_BTREE_EXT_CAT	 9
39 #define CR_BTREE_EXT_EXT	10 /* should not happen ! */
40 #define CR_BTREE_EXT_ATTR	11
41 #define CR_BTREE_EXT_ALLOC	12
42 #define CR_BTREE_EXT_START	13 /* unneeded in current code */
43 #define CR_BTREE_CAT_JIB	14 /* journal info block */
44 #define CR_BTREE_CAT_JL		15 /* journal */
45 /* 16 -> 31 || high order bit */   /* reserved */
46 
47 /* tuning */
48 #define CR_SHIFT		 8 /* number of bits to shift start_block by */
49 				   /* to get the index of the linked list */
50 #define CR_OVER_DIV		16 /* alloc a table for (1+1/CR_OVER_DIV) *
51 				      file_number + CR_ADD_CST */
52 #define CR_ADD_CST		16
53 #define CR_NEW_ALLOC_DIV	 4 /* divide the size of the first alloc table
54 				      by this value to allocate next tables */
55 
56 /* See DOC for an explaination of this structure */
57 /* Access read only from outside cache.c */
58 struct _HfsCPrivateExtent {
59 	struct _HfsCPrivateExtent*	next;
60 	uint32_t			ext_start;
61 	uint32_t			ext_length;
62 	uint32_t			ref_block;
63 	uint16_t			ref_offset;
64 	uint8_t				sect_by_block;
65 	unsigned			where : 5;
66 	unsigned			ref_index : 3; /* 0 -> 7 */
67 };
68 typedef struct _HfsCPrivateExtent HfsCPrivateExtent;
69 
70 /* Internaly used by cache.c for custom memory managment only */
71 struct _HfsCPrivateCacheTable {
72 	struct _HfsCPrivateCacheTable*	next_cache;
73 	HfsCPrivateExtent*		table;
74 	unsigned int			table_size;
75 	unsigned int			table_first_free;
76 	/* first_elemt ? */
77 };
78 typedef struct _HfsCPrivateCacheTable HfsCPrivateCacheTable;
79 
80 /* Internaly used by cache.c for custom memory managment
81    and cache handling only */
82 struct _HfsCPrivateCache {
83 	HfsCPrivateCacheTable*		table_list;
84 	HfsCPrivateCacheTable*		last_table;
85 	HfsCPrivateExtent**		linked_ref;
86 	unsigned int			linked_ref_size;
87 	unsigned int			block_number;
88 	unsigned int			first_cachetable_size;
89 	unsigned int			needed_alloc_size;
90 };
91 typedef struct _HfsCPrivateCache HfsCPrivateCache;
92 
93 HfsCPrivateCache*
94 hfsc_new_cache(unsigned int block_number, unsigned int file_number);
95 
96 void
97 hfsc_delete_cache(HfsCPrivateCache* cache);
98 
99 HfsCPrivateExtent*
100 hfsc_cache_add_extent(HfsCPrivateCache* cache, uint32_t start, uint32_t length,
101 		      uint32_t block, uint16_t offset, uint8_t sbb,
102 		      uint8_t where, uint8_t index);
103 
104 HfsCPrivateExtent*
105 hfsc_cache_search_extent(HfsCPrivateCache* cache, uint32_t start);
106 
107 HfsCPrivateExtent*
108 hfsc_cache_move_extent(HfsCPrivateCache* cache, uint32_t old_start,
109 			uint32_t new_start);
110 
111 static __inline__ unsigned int
hfsc_cache_needed_buffer(HfsCPrivateCache * cache)112 hfsc_cache_needed_buffer(HfsCPrivateCache* cache)
113 {
114 	return cache->needed_alloc_size;
115 }
116 
117 #endif /* _CACHE_H */
118