0001
0002
0003
0004
0005 #ifndef _H_JFS_BTREE
0006 #define _H_JFS_BTREE
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #define BT_TYPE 0x07
0030 #define BT_ROOT 0x01
0031 #define BT_LEAF 0x02
0032 #define BT_INTERNAL 0x04
0033 #define BT_RIGHTMOST 0x10
0034 #define BT_LEFTMOST 0x20
0035 #define BT_SWAPPED 0x80
0036
0037
0038 #define BT_RANDOM 0x0000
0039 #define BT_SEQUENTIAL 0x0001
0040 #define BT_LOOKUP 0x0010
0041 #define BT_INSERT 0x0020
0042 #define BT_DELETE 0x0040
0043
0044
0045
0046
0047 #define BT_IS_ROOT(MP) (((MP)->xflag & COMMIT_PAGE) == 0)
0048
0049
0050 #define BT_PAGE(IP, MP, TYPE, ROOT)\
0051 (BT_IS_ROOT(MP) ? (TYPE *)&JFS_IP(IP)->ROOT : (TYPE *)(MP)->data)
0052
0053
0054 #define BT_GETPAGE(IP, BN, MP, TYPE, SIZE, P, RC, ROOT)\
0055 {\
0056 if ((BN) == 0)\
0057 {\
0058 MP = (struct metapage *)&JFS_IP(IP)->bxflag;\
0059 P = (TYPE *)&JFS_IP(IP)->ROOT;\
0060 RC = 0;\
0061 }\
0062 else\
0063 {\
0064 MP = read_metapage((IP), BN, SIZE, 1);\
0065 if (MP) {\
0066 RC = 0;\
0067 P = (MP)->data;\
0068 } else {\
0069 P = NULL;\
0070 jfs_err("bread failed!");\
0071 RC = -EIO;\
0072 }\
0073 }\
0074 }
0075
0076 #define BT_MARK_DIRTY(MP, IP)\
0077 {\
0078 if (BT_IS_ROOT(MP))\
0079 mark_inode_dirty(IP);\
0080 else\
0081 mark_metapage_dirty(MP);\
0082 }
0083
0084
0085 #define BT_PUTPAGE(MP)\
0086 {\
0087 if (! BT_IS_ROOT(MP)) \
0088 release_metapage(MP); \
0089 }
0090
0091
0092
0093
0094
0095
0096
0097
0098 struct btframe {
0099 s64 bn;
0100 s16 index;
0101 s16 lastindex;
0102 struct metapage *mp;
0103 };
0104
0105 struct btstack {
0106 struct btframe *top;
0107 int nsplit;
0108 struct btframe stack[MAXTREEHEIGHT];
0109 };
0110
0111 #define BT_CLR(btstack)\
0112 (btstack)->top = (btstack)->stack
0113
0114 #define BT_STACK_FULL(btstack)\
0115 ( (btstack)->top == &((btstack)->stack[MAXTREEHEIGHT-1]))
0116
0117 #define BT_PUSH(BTSTACK, BN, INDEX)\
0118 {\
0119 assert(!BT_STACK_FULL(BTSTACK));\
0120 (BTSTACK)->top->bn = BN;\
0121 (BTSTACK)->top->index = INDEX;\
0122 ++(BTSTACK)->top;\
0123 }
0124
0125 #define BT_POP(btstack)\
0126 ( (btstack)->top == (btstack)->stack ? NULL : --(btstack)->top )
0127
0128 #define BT_STACK(btstack)\
0129 ( (btstack)->top == (btstack)->stack ? NULL : (btstack)->top )
0130
0131 static inline void BT_STACK_DUMP(struct btstack *btstack)
0132 {
0133 int i;
0134 printk("btstack dump:\n");
0135 for (i = 0; i < MAXTREEHEIGHT; i++)
0136 printk(KERN_ERR "bn = %Lx, index = %d\n",
0137 (long long)btstack->stack[i].bn,
0138 btstack->stack[i].index);
0139 }
0140
0141
0142 #define BT_GETSEARCH(IP, LEAF, BN, MP, TYPE, P, INDEX, ROOT)\
0143 {\
0144 BN = (LEAF)->bn;\
0145 MP = (LEAF)->mp;\
0146 if (BN)\
0147 P = (TYPE *)MP->data;\
0148 else\
0149 P = (TYPE *)&JFS_IP(IP)->ROOT;\
0150 INDEX = (LEAF)->index;\
0151 }
0152
0153
0154 #define BT_PUTSEARCH(BTSTACK)\
0155 {\
0156 if (! BT_IS_ROOT((BTSTACK)->top->mp))\
0157 release_metapage((BTSTACK)->top->mp);\
0158 }
0159 #endif