0001
0002
0003
0004
0005 #ifndef _H_JFS_XTREE
0006 #define _H_JFS_XTREE
0007
0008
0009
0010
0011
0012 #include "jfs_btree.h"
0013
0014
0015
0016
0017
0018 typedef struct xad {
0019 __u8 flag;
0020 __u8 rsvrd[2];
0021 __u8 off1;
0022 __le32 off2;
0023 pxd_t loc;
0024 } xad_t;
0025
0026 #define MAXXLEN ((1 << 24) - 1)
0027
0028 #define XTSLOTSIZE 16
0029 #define L2XTSLOTSIZE 4
0030
0031
0032 #define XADoffset(xad, offset64)\
0033 {\
0034 (xad)->off1 = ((u64)offset64) >> 32;\
0035 (xad)->off2 = __cpu_to_le32((offset64) & 0xffffffff);\
0036 }
0037 #define XADaddress(xad, address64) PXDaddress(&(xad)->loc, address64)
0038 #define XADlength(xad, length32) PXDlength(&(xad)->loc, length32)
0039
0040
0041 #define offsetXAD(xad)\
0042 ( ((s64)((xad)->off1)) << 32 | __le32_to_cpu((xad)->off2))
0043 #define addressXAD(xad) addressPXD(&(xad)->loc)
0044 #define lengthXAD(xad) lengthPXD(&(xad)->loc)
0045
0046
0047 struct xadlist {
0048 s16 maxnxad;
0049 s16 nxad;
0050 xad_t *xad;
0051 };
0052
0053
0054 #define XAD_NEW 0x01
0055 #define XAD_EXTENDED 0x02
0056 #define XAD_COMPRESSED 0x04
0057 #define XAD_NOTRECORDED 0x08
0058 #define XAD_COW 0x10
0059
0060
0061
0062 #define XTROOTINITSLOT_DIR 6
0063 #define XTROOTINITSLOT 10
0064 #define XTROOTMAXSLOT 18
0065 #define XTPAGEMAXSLOT 256
0066 #define XTENTRYSTART 2
0067
0068
0069
0070
0071 typedef union {
0072 struct xtheader {
0073 __le64 next;
0074 __le64 prev;
0075
0076 u8 flag;
0077 u8 rsrvd1;
0078 __le16 nextindex;
0079 __le16 maxentry;
0080 __le16 rsrvd2;
0081
0082 pxd_t self;
0083 } header;
0084
0085 xad_t xad[XTROOTMAXSLOT];
0086 } xtpage_t;
0087
0088
0089
0090
0091 extern int xtLookup(struct inode *ip, s64 lstart, s64 llen,
0092 int *pflag, s64 * paddr, int *plen, int flag);
0093 extern void xtInitRoot(tid_t tid, struct inode *ip);
0094 extern int xtInsert(tid_t tid, struct inode *ip,
0095 int xflag, s64 xoff, int xlen, s64 * xaddrp, int flag);
0096 extern int xtExtend(tid_t tid, struct inode *ip, s64 xoff, int xlen,
0097 int flag);
0098 extern int xtUpdate(tid_t tid, struct inode *ip, struct xad *nxad);
0099 extern int xtDelete(tid_t tid, struct inode *ip, s64 xoff, int xlen,
0100 int flag);
0101 extern s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int type);
0102 extern s64 xtTruncate_pmap(tid_t tid, struct inode *ip, s64 committed_size);
0103 extern int xtRelocate(tid_t tid, struct inode *ip,
0104 xad_t * oxad, s64 nxaddr, int xtype);
0105 extern int xtAppend(tid_t tid,
0106 struct inode *ip, int xflag, s64 xoff, int maxblocks,
0107 int *xlenp, s64 * xaddrp, int flag);
0108 #endif