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