hfs_btree.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:11k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/fs/hfs/hfs_btree.h
  3.  *
  4.  * Copyright (C) 1995-1997  Paul H. Hargrove
  5.  * This file may be distributed under the terms of the GNU General Public License.
  6.  *
  7.  * This file contains the declarations of the private B-tree
  8.  * structures and functions.
  9.  *
  10.  * "XXX" in a comment is a note to myself to consider changing something.
  11.  */
  12. #ifndef _HFS_BTREE_H
  13. #define _HFS_BTREE_H
  14. #include "hfs.h"
  15. /*================ Variable-like macros ================*/
  16. /* The stickiness of a (struct hfs_bnode) */
  17. #define HFS_NOT_STICKY 0
  18. #define HFS_STICKY 1
  19. /* The number of hash buckets in a B-tree's bnode cache */
  20. #define HFS_CACHELEN 17 /* primes are best? */
  21. /*
  22.  * Legal values for the 'ndType' field of a (struct NodeDescriptor)
  23.  *
  24.  * Reference: _Inside Macintosh: Files_ p. 2-65
  25.  */
  26. #define ndIndxNode 0x00 /* An internal (index) node */
  27. #define ndHdrNode 0x01 /* The tree header node (node 0) */
  28. #define ndMapNode 0x02 /* Holds part of the bitmap of used nodes */
  29. #define ndLeafNode 0xFF /* A leaf (ndNHeight==1) node */
  30. /*
  31.  * Legal values for the bthAtrb field of a (struct BTHdrRec)
  32.  *
  33.  * Reference: TN 1150
  34.  */
  35. #define bthBadClose     0x00000001  /* b-tree not closed properly. not
  36.                                        used by hfsplus. */
  37. #define bthBigKeys      0x00000002  /* key length is u16 instead of u8.
  38.        used by hfsplus. */
  39. #define bthVarIndxKeys  0x00000004  /* variable key length instead of
  40.                                        max key length. use din catalog
  41.                                        b-tree but not in extents
  42.                                        b-tree (hfsplus). */
  43. /*================ Function-like macros ================*/
  44. /* Access the cache slot which should contain the desired node */
  45. #define bhash(tree, node) ((tree)->cache[(node) % HFS_CACHELEN])
  46. /* round up to multiple of sizeof(hfs_u16) */
  47. #define ROUND(X) ((X + sizeof(hfs_u16) - 1) & ~(sizeof(hfs_u16)-1))
  48. /* Refer to the (base-1) array of offsets in a bnode */
  49. #define RECTBL(X,N) 
  50. (((hfs_u16 *)(hfs_buffer_data((X)->buf)+HFS_SECTOR_SIZE))-(N))
  51. /*================ Private data types ================*/
  52. /*
  53.  * struct BTHdrRec
  54.  *
  55.  * The B-tree header record
  56.  *
  57.  * This data structure is stored in the first node (512-byte block) of
  58.  * each B-tree file.  It contains important information about the
  59.  * B-tree.  Most fields vary over the life of the tree and are
  60.  * indicated by a 'V' in the comments. The other fields are fixed for
  61.  * the life of the tree and are indicated by a 'F'.
  62.  *
  63.  * Reference: _Inside Macintosh: Files_ pp. 2-68 through 2-69 */
  64. struct BTHdrRec {
  65. hfs_word_t  bthDepth; /* (V) The number of levels in this B-tree */
  66. hfs_lword_t bthRoot; /* (V) The node number of the root node */
  67. hfs_lword_t bthNRecs; /* (V) The number of leaf records */
  68. hfs_lword_t bthFNode; /* (V) The number of the first leaf node */
  69. hfs_lword_t bthLNode; /* (V) The number of the last leaf node */
  70. hfs_word_t  bthNodeSize; /* (F) The number of bytes in a node (=512) */
  71. hfs_word_t  bthKeyLen; /* (F) The length of a key in an index node */
  72. hfs_lword_t bthNNodes; /* (V) The total number of nodes */
  73. hfs_lword_t bthFree; /* (V) The number of unused nodes */
  74.         hfs_word_t  bthResv1;   /* reserved */
  75.         hfs_lword_t bthClpSiz;  /* (F) clump size. not usually used. */
  76.         hfs_byte_t  bthType;    /* (F) BTree type */
  77.         hfs_byte_t  bthResv2;   /* reserved */
  78.         hfs_lword_t bthAtrb;    /* (F) attributes */
  79.         hfs_lword_t bthResv3[16]; /* Reserved */
  80. } __attribute__((packed));
  81. /*
  82.  * struct NodeDescriptor
  83.  *
  84.  * The B-tree node descriptor.
  85.  *
  86.  * This structure begins each node in the B-tree file. It contains
  87.  * important information about the node's contents.  'V' and 'F' in
  88.  * the comments indicate fields that are variable or fixed over the
  89.  * life of a node, where the 'life' of a node is defined as the period
  90.  * between leaving and reentering the free pool.
  91.  *
  92.  * Reference: _Inside Macintosh: Files_ p. 2-64
  93.  */
  94. struct NodeDescriptor {
  95. hfs_lword_t ndFLink; /* (V) Number of the next node at this level */
  96. hfs_lword_t ndBLink; /* (V) Number of the prev node at this level */
  97. hfs_byte_t  ndType; /* (F) The type of node */
  98. hfs_byte_t  ndNHeight; /* (F) The level of this node (leaves=1) */
  99. hfs_word_t  ndNRecs; /* (V) The number of records in this node */
  100. hfs_word_t  ndResv2; /* Reserved */
  101. } __attribute__((packed));
  102. /*
  103.  * typedef hfs_cmpfn
  104.  *
  105.  * The type 'hfs_cmpfn' is a comparison function taking 2 keys and
  106.  * returning a positive, negative or zero integer according to the
  107.  * ordering of the two keys (just like strcmp() does for strings).
  108.  */
  109. typedef int (*hfs_cmpfn)(const void *, const void *);
  110. /*
  111.  * struct hfs_bnode
  112.  *
  113.  * An in-core B-tree node
  114.  *
  115.  * This structure holds information from the NodeDescriptor in native
  116.  * byte-order, a pointer to the buffer which contains the actual
  117.  * node and fields necessary for locking access to the node during
  118.  * updates.  The use of the locking fields is explained with the
  119.  * locking functions.
  120.  */
  121. struct hfs_bnode {
  122. int     magic;   /* Magic number to guard against
  123. wild pointers */
  124. hfs_buffer     buf;     /* The buffer containing the
  125. actual node */
  126. struct hfs_btree    *tree;   /* The tree to which this node
  127. belongs */
  128. struct hfs_bnode    *prev;   /* Next node in this hash bucket */
  129. struct hfs_bnode    *next;   /* Previous node in this hash
  130. bucket */
  131. int     sticky;  /* Boolean: non-zero means keep
  132. this node in-core (set for
  133. root and head) */
  134. hfs_u32     node;    /* Node number */
  135. hfs_u16             nodeSize; /* node size */
  136.         hfs_u16             keyLen;  /* key length */
  137. /* locking related fields: */
  138. hfs_wait_queue     wqueue;  /* Wait queue for write access */
  139. hfs_wait_queue     rqueue;  /* Wait queue for read or reserve
  140. access */
  141. int     count;   /* Number of processes accessing
  142. this node */
  143. int     resrv;   /* Boolean, true means a process
  144. had placed a 'reservation' on
  145. this node */
  146. int     lock;    /* Boolean, true means some
  147. process has exclusive access,
  148. so KEEP OUT */
  149. /* fields from the NodeDescriptor in native byte-order: */
  150. hfs_u32     ndFLink;
  151. hfs_u32     ndBLink;
  152. hfs_u16     ndNRecs;
  153. hfs_u8     ndType;
  154. hfs_u8     ndNHeight;
  155. };
  156. /*
  157.  * struct hfs_btree
  158.  *
  159.  * An in-core B-tree.
  160.  *
  161.  * This structure holds information from the BTHdrRec, MDB
  162.  * (superblock) and other information needed to work with the B-tree.
  163.  */
  164. struct hfs_btree {
  165. int magic;        /* Magic number to
  166.   guard against wild
  167.   pointers */
  168. hfs_cmpfn compare;       /* Comparison function
  169.   for this tree */
  170. struct hfs_bnode head;        /* in-core copy of node 0 */
  171. struct hfs_bnode *root;        /* Pointer to the in-core
  172.   copy of the root node */
  173. hfs_sysmdb sys_mdb;       /* The "device" holding
  174.   the filesystem */
  175. int reserved;      /* bnodes claimed but
  176.   not yet used */
  177. struct hfs_bnode        /* The bnode cache */
  178. *cache[HFS_CACHELEN];
  179. struct hfs_cat_entry entry;        /* Fake catalog entry */
  180. int lock;
  181. hfs_wait_queue wait;
  182. int dirt;
  183. int                     keySize;   
  184. /* Fields from the BTHdrRec in native byte-order: */
  185. hfs_u32 bthRoot;
  186. hfs_u32 bthNRecs;
  187. hfs_u32 bthFNode;
  188. hfs_u32 bthLNode;
  189. hfs_u32 bthNNodes;
  190. hfs_u32 bthFree;
  191. hfs_u16 bthKeyLen;
  192. hfs_u16 bthDepth;
  193. };
  194. /*================ Global functions ================*/
  195. /* Convert a (struct hfs_bnode *) and an index to the value of the
  196.    n-th offset in the bnode (N >= 1) to the offset */
  197. extern inline hfs_u16 bnode_offset(const struct hfs_bnode *bnode, int n)
  198. { return hfs_get_hs(RECTBL(bnode,n)); }
  199. /* Convert a (struct hfs_bnode *) and an index to the size of the
  200.    n-th record in the bnode (N >= 1) */
  201. extern inline hfs_u16 bnode_rsize(const struct hfs_bnode *bnode, int n)
  202. { return bnode_offset(bnode, n+1) - bnode_offset(bnode, n); }
  203. /* Convert a (struct hfs_bnode *) to the offset of the empty part */
  204. extern inline hfs_u16 bnode_end(const struct hfs_bnode *bnode)
  205. { return bnode_offset(bnode, bnode->ndNRecs + 1); }
  206. /* Convert a (struct hfs_bnode *) to the number of free bytes it contains */
  207. extern inline hfs_u16 bnode_freespace(const struct hfs_bnode *bnode)
  208. { return HFS_SECTOR_SIZE - bnode_end(bnode)
  209.   - (bnode->ndNRecs + 1)*sizeof(hfs_u16); }
  210. /* Convert a (struct hfs_bnode *) X and an index N to
  211.    the address of the record N in the bnode (N >= 1) */
  212. extern inline void *bnode_datastart(const struct hfs_bnode *bnode)
  213. { return (void *)(hfs_buffer_data(bnode->buf)+sizeof(struct NodeDescriptor)); }
  214. /* Convert a (struct hfs_bnode *) to the address of the empty part */
  215. extern inline void *bnode_dataend(const struct hfs_bnode *bnode)
  216. { return (void *)(hfs_buffer_data(bnode->buf) + bnode_end(bnode)); }
  217. /* Convert various pointers to address of record's key */
  218. extern inline void *bnode_key(const struct hfs_bnode *bnode, int n)
  219. { return (void *)(hfs_buffer_data(bnode->buf) + bnode_offset(bnode, n)); }
  220. extern inline void *belem_key(const struct hfs_belem *elem)
  221. { return bnode_key(elem->bnr.bn, elem->record); }
  222. extern inline void *brec_key(const struct hfs_brec *brec)
  223. { return belem_key(brec->bottom); }
  224. /* Convert various pointers to the address of a record */
  225. extern inline void *bkey_record(const struct hfs_bkey *key)
  226. { return (void *)key + ROUND(key->KeyLen + 1); }
  227. extern inline void *bnode_record(const struct hfs_bnode *bnode, int n)
  228. { return bkey_record(bnode_key(bnode, n)); }
  229. extern inline void *belem_record(const struct hfs_belem *elem)
  230. { return bkey_record(belem_key(elem)); }
  231. extern inline void *brec_record(const struct hfs_brec *brec)
  232. { return bkey_record(brec_key(brec)); }
  233. /*================ Function Prototypes ================*/
  234. /* balloc.c */
  235. extern int hfs_bnode_bitop(struct hfs_btree *, hfs_u32, int);
  236. extern struct hfs_bnode_ref hfs_bnode_alloc(struct hfs_btree *);
  237. extern int hfs_bnode_free(struct hfs_bnode_ref *);
  238. extern void hfs_btree_extend(struct hfs_btree *);
  239. /* bins_del.c */
  240. extern void hfs_bnode_update_key(struct hfs_brec *, struct hfs_belem *,
  241.  struct hfs_bnode *, int);
  242. extern void hfs_bnode_shift_right(struct hfs_bnode *, struct hfs_bnode *, int);
  243. extern void hfs_bnode_shift_left(struct hfs_bnode *, struct hfs_bnode *, int);
  244. extern int hfs_bnode_in_brec(hfs_u32 node, const struct hfs_brec *brec);
  245. /* bnode.c */
  246. extern void hfs_bnode_read(struct hfs_bnode *, struct hfs_btree *,
  247.    hfs_u32, int);
  248. extern void hfs_bnode_relse(struct hfs_bnode_ref *);
  249. extern struct hfs_bnode_ref hfs_bnode_find(struct hfs_btree *, hfs_u32, int);
  250. extern void hfs_bnode_lock(struct hfs_bnode_ref *, int);
  251. extern void hfs_bnode_delete(struct hfs_bnode *);
  252. extern void hfs_bnode_commit(struct hfs_bnode *);
  253. /* brec.c */
  254. extern void hfs_brec_lock(struct hfs_brec *, struct hfs_belem *);
  255. extern struct hfs_belem *hfs_brec_init(struct hfs_brec *, struct hfs_btree *,
  256.        int);
  257. extern struct hfs_belem *hfs_brec_next(struct hfs_brec *);
  258. #endif