0001
0002
0003
0004
0005 #ifndef _H_JFS_DMAP
0006 #define _H_JFS_DMAP
0007
0008 #include "jfs_txnmgr.h"
0009
0010 #define BMAPVERSION 1
0011 #define TREESIZE (256+64+16+4+1)
0012 #define LEAFIND (64+16+4+1)
0013 #define LPERDMAP 256
0014 #define L2LPERDMAP 8
0015 #define DBWORD 32
0016 #define L2DBWORD 5
0017 #define BUDMIN L2DBWORD
0018 #define BPERDMAP (LPERDMAP * DBWORD)
0019 #define L2BPERDMAP 13
0020 #define CTLTREESIZE (1024+256+64+16+4+1)
0021 #define CTLLEAFIND (256+64+16+4+1)
0022 #define LPERCTL 1024
0023 #define L2LPERCTL 10
0024 #define ROOT 0
0025 #define NOFREE ((s8) -1)
0026 #define MAXAG 128
0027 #define L2MAXAG 7
0028 #define L2MINAGSZ 25
0029 #define BMAPBLKNO 0
0030
0031
0032
0033
0034 #define L2MAXL0SIZE (L2BPERDMAP + 1 * L2LPERCTL)
0035 #define L2MAXL1SIZE (L2BPERDMAP + 2 * L2LPERCTL)
0036 #define L2MAXL2SIZE (L2BPERDMAP + 3 * L2LPERCTL)
0037
0038
0039
0040
0041 #define MAXL0SIZE ((s64)1 << L2MAXL0SIZE)
0042 #define MAXL1SIZE ((s64)1 << L2MAXL1SIZE)
0043 #define MAXL2SIZE ((s64)1 << L2MAXL2SIZE)
0044
0045 #define MAXMAPSIZE MAXL2SIZE
0046
0047
0048
0049
0050
0051 static inline signed char TREEMAX(signed char *cp)
0052 {
0053 signed char tmp1, tmp2;
0054
0055 tmp1 = max(*(cp+2), *(cp+3));
0056 tmp2 = max(*(cp), *(cp+1));
0057
0058 return max(tmp1, tmp2);
0059 }
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072 #define BLKTODMAP(b,s) \
0073 ((((b) >> 13) + ((b) >> 23) + ((b) >> 33) + 3 + 1) << (s))
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087 #define BLKTOL0(b,s) \
0088 (((((b) >> 23) << 10) + ((b) >> 23) + ((b) >> 33) + 2 + 1) << (s))
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102 #define BLKTOL1(b,s) \
0103 (((((b) >> 33) << 20) + (((b) >> 33) << 10) + ((b) >> 33) + 1 + 1) << (s))
0104
0105
0106
0107
0108
0109 #define BLKTOCTL(b,s,l) \
0110 (((l) == 2) ? 1 : ((l) == 1) ? BLKTOL1((b),(s)) : BLKTOL0((b),(s)))
0111
0112
0113
0114
0115
0116 #define BMAPSZTOLEV(size) \
0117 (((size) <= MAXL0SIZE) ? 0 : ((size) <= MAXL1SIZE) ? 1 : 2)
0118
0119
0120
0121 #define BLKTOAG(b,sbi) ((b) >> ((sbi)->bmap->db_agl2size))
0122
0123
0124
0125
0126 #define AGTOBLK(a,ip) \
0127 ((s64)(a) << (JFS_SBI((ip)->i_sb)->bmap->db_agl2size))
0128
0129
0130
0131
0132
0133
0134 struct dmaptree {
0135 __le32 nleafs;
0136 __le32 l2nleafs;
0137 __le32 leafidx;
0138 __le32 height;
0139 s8 budmin;
0140 s8 stree[TREESIZE];
0141 u8 pad[2];
0142 };
0143
0144
0145
0146
0147 struct dmap {
0148 __le32 nblocks;
0149 __le32 nfree;
0150 __le64 start;
0151 struct dmaptree tree;
0152 u8 pad[1672];
0153 __le32 wmap[LPERDMAP];
0154 __le32 pmap[LPERDMAP];
0155 };
0156
0157
0158
0159
0160
0161
0162 struct dmapctl {
0163 __le32 nleafs;
0164 __le32 l2nleafs;
0165 __le32 leafidx;
0166 __le32 height;
0167 s8 budmin;
0168 s8 stree[CTLTREESIZE];
0169 u8 pad[2714];
0170 };
0171
0172
0173
0174
0175 typedef union dmtree {
0176 struct dmaptree t1;
0177 struct dmapctl t2;
0178 } dmtree_t;
0179
0180
0181 #define dmt_nleafs t1.nleafs
0182 #define dmt_l2nleafs t1.l2nleafs
0183 #define dmt_leafidx t1.leafidx
0184 #define dmt_height t1.height
0185 #define dmt_budmin t1.budmin
0186 #define dmt_stree t2.stree
0187
0188
0189
0190
0191 struct dbmap_disk {
0192 __le64 dn_mapsize;
0193 __le64 dn_nfree;
0194 __le32 dn_l2nbperpage;
0195 __le32 dn_numag;
0196 __le32 dn_maxlevel;
0197 __le32 dn_maxag;
0198 __le32 dn_agpref;
0199 __le32 dn_aglevel;
0200 __le32 dn_agheight;
0201 __le32 dn_agwidth;
0202 __le32 dn_agstart;
0203 __le32 dn_agl2size;
0204 __le64 dn_agfree[MAXAG];
0205 __le64 dn_agsize;
0206 s8 dn_maxfreebud;
0207 u8 pad[3007];
0208 };
0209
0210 struct dbmap {
0211 s64 dn_mapsize;
0212 s64 dn_nfree;
0213 int dn_l2nbperpage;
0214 int dn_numag;
0215 int dn_maxlevel;
0216 int dn_maxag;
0217 int dn_agpref;
0218 int dn_aglevel;
0219 int dn_agheight;
0220 int dn_agwidth;
0221 int dn_agstart;
0222 int dn_agl2size;
0223 s64 dn_agfree[MAXAG];
0224 s64 dn_agsize;
0225 signed char dn_maxfreebud;
0226 };
0227
0228
0229
0230 struct bmap {
0231 struct dbmap db_bmap;
0232 struct inode *db_ipbmap;
0233 struct mutex db_bmaplock;
0234 atomic_t db_active[MAXAG];
0235 u32 *db_DBmap;
0236 };
0237
0238
0239 #define db_mapsize db_bmap.dn_mapsize
0240 #define db_nfree db_bmap.dn_nfree
0241 #define db_agfree db_bmap.dn_agfree
0242 #define db_agsize db_bmap.dn_agsize
0243 #define db_agl2size db_bmap.dn_agl2size
0244 #define db_agwidth db_bmap.dn_agwidth
0245 #define db_agheight db_bmap.dn_agheight
0246 #define db_agstart db_bmap.dn_agstart
0247 #define db_numag db_bmap.dn_numag
0248 #define db_maxlevel db_bmap.dn_maxlevel
0249 #define db_aglevel db_bmap.dn_aglevel
0250 #define db_agpref db_bmap.dn_agpref
0251 #define db_maxag db_bmap.dn_maxag
0252 #define db_maxfreebud db_bmap.dn_maxfreebud
0253 #define db_l2nbperpage db_bmap.dn_l2nbperpage
0254
0255
0256
0257
0258
0259
0260
0261
0262 #define BLKSTOL2(d) (blkstol2(d))
0263
0264
0265 #define NLSTOL2BSZ(n) (31 - cntlz((n)) + BUDMIN)
0266
0267
0268 #define LITOL2BSZ(n,m,b) ((((n) == 0) ? (m) : cnttz((n))) + (b))
0269
0270
0271 #define BLKTOCTLLEAF(b,m) \
0272 (((b) & (((s64)1 << ((m) + L2LPERCTL)) - 1)) >> (m))
0273
0274
0275 #define BUDSIZE(s,m) (1 << ((s) - (m)))
0276
0277
0278
0279
0280 extern int dbMount(struct inode *ipbmap);
0281
0282 extern int dbUnmount(struct inode *ipbmap, int mounterror);
0283
0284 extern int dbFree(struct inode *ipbmap, s64 blkno, s64 nblocks);
0285
0286 extern int dbUpdatePMap(struct inode *ipbmap,
0287 int free, s64 blkno, s64 nblocks, struct tblock * tblk);
0288
0289 extern int dbNextAG(struct inode *ipbmap);
0290
0291 extern int dbAlloc(struct inode *ipbmap, s64 hint, s64 nblocks, s64 * results);
0292
0293 extern int dbReAlloc(struct inode *ipbmap,
0294 s64 blkno, s64 nblocks, s64 addnblocks, s64 * results);
0295
0296 extern int dbSync(struct inode *ipbmap);
0297 extern int dbAllocBottomUp(struct inode *ip, s64 blkno, s64 nblocks);
0298 extern int dbExtendFS(struct inode *ipbmap, s64 blkno, s64 nblocks);
0299 extern void dbFinalizeBmap(struct inode *ipbmap);
0300 extern s64 dbMapFileSizeToMapSize(struct inode *ipbmap);
0301 extern s64 dbDiscardAG(struct inode *ip, int agno, s64 minlen);
0302
0303 #endif