1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef _H_JFS_XTREE
19#define _H_JFS_XTREE
20
21
22
23
24
25#include "jfs_btree.h"
26
27
28
29
30
31typedef struct xad {
32 unsigned flag:8;
33 unsigned rsvrd:16;
34 unsigned off1:8;
35 __le32 off2;
36 unsigned len:24;
37 unsigned addr1:8;
38 __le32 addr2;
39} xad_t;
40
41#define MAXXLEN ((1 << 24) - 1)
42
43#define XTSLOTSIZE 16
44#define L2XTSLOTSIZE 4
45
46
47#define XADoffset(xad, offset64)\
48{\
49 (xad)->off1 = ((u64)offset64) >> 32;\
50 (xad)->off2 = __cpu_to_le32((offset64) & 0xffffffff);\
51}
52#define XADaddress(xad, address64)\
53{\
54 (xad)->addr1 = ((u64)address64) >> 32;\
55 (xad)->addr2 = __cpu_to_le32((address64) & 0xffffffff);\
56}
57#define XADlength(xad, length32) (xad)->len = __cpu_to_le24(length32)
58
59
60#define offsetXAD(xad)\
61 ( ((s64)((xad)->off1)) << 32 | __le32_to_cpu((xad)->off2))
62#define addressXAD(xad)\
63 ( ((s64)((xad)->addr1)) << 32 | __le32_to_cpu((xad)->addr2))
64#define lengthXAD(xad) __le24_to_cpu((xad)->len)
65
66
67struct xadlist {
68 s16 maxnxad;
69 s16 nxad;
70 xad_t *xad;
71};
72
73
74#define XAD_NEW 0x01
75#define XAD_EXTENDED 0x02
76#define XAD_COMPRESSED 0x04
77#define XAD_NOTRECORDED 0x08
78#define XAD_COW 0x10
79
80
81
82#define XTROOTINITSLOT_DIR 6
83#define XTROOTINITSLOT 10
84#define XTROOTMAXSLOT 18
85#define XTPAGEMAXSLOT 256
86#define XTENTRYSTART 2
87
88
89
90
91typedef union {
92 struct xtheader {
93 __le64 next;
94 __le64 prev;
95
96 u8 flag;
97 u8 rsrvd1;
98 __le16 nextindex;
99 __le16 maxentry;
100 __le16 rsrvd2;
101
102 pxd_t self;
103 } header;
104
105 xad_t xad[XTROOTMAXSLOT];
106} xtpage_t;
107
108
109
110
111extern int xtLookup(struct inode *ip, s64 lstart, s64 llen,
112 int *pflag, s64 * paddr, int *plen, int flag);
113extern void xtInitRoot(tid_t tid, struct inode *ip);
114extern int xtInsert(tid_t tid, struct inode *ip,
115 int xflag, s64 xoff, int xlen, s64 * xaddrp, int flag);
116extern int xtExtend(tid_t tid, struct inode *ip, s64 xoff, int xlen,
117 int flag);
118#ifdef _NOTYET
119extern int xtTailgate(tid_t tid, struct inode *ip,
120 s64 xoff, int xlen, s64 xaddr, int flag);
121#endif
122extern int xtUpdate(tid_t tid, struct inode *ip, struct xad *nxad);
123extern int xtDelete(tid_t tid, struct inode *ip, s64 xoff, int xlen,
124 int flag);
125extern s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int type);
126extern s64 xtTruncate_pmap(tid_t tid, struct inode *ip, s64 committed_size);
127extern int xtRelocate(tid_t tid, struct inode *ip,
128 xad_t * oxad, s64 nxaddr, int xtype);
129extern int xtAppend(tid_t tid,
130 struct inode *ip, int xflag, s64 xoff, int maxblocks,
131 int *xlenp, s64 * xaddrp, int flag);
132#endif
133