1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) International Business Machines Corp., 2000-2002 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun #ifndef _H_JFS_XTREE 6*4882a593Smuzhiyun #define _H_JFS_XTREE 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun /* 9*4882a593Smuzhiyun * jfs_xtree.h: extent allocation descriptor B+-tree manager 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include "jfs_btree.h" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* 16*4882a593Smuzhiyun * extent allocation descriptor (xad) 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun typedef struct xad { 19*4882a593Smuzhiyun __u8 flag; /* 1: flag */ 20*4882a593Smuzhiyun __u8 rsvrd[2]; /* 2: reserved */ 21*4882a593Smuzhiyun __u8 off1; /* 1: offset in unit of fsblksize */ 22*4882a593Smuzhiyun __le32 off2; /* 4: offset in unit of fsblksize */ 23*4882a593Smuzhiyun pxd_t loc; /* 8: length and address in unit of fsblksize */ 24*4882a593Smuzhiyun } xad_t; /* (16) */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define MAXXLEN ((1 << 24) - 1) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define XTSLOTSIZE 16 29*4882a593Smuzhiyun #define L2XTSLOTSIZE 4 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* xad_t field construction */ 32*4882a593Smuzhiyun #define XADoffset(xad, offset64)\ 33*4882a593Smuzhiyun {\ 34*4882a593Smuzhiyun (xad)->off1 = ((u64)offset64) >> 32;\ 35*4882a593Smuzhiyun (xad)->off2 = __cpu_to_le32((offset64) & 0xffffffff);\ 36*4882a593Smuzhiyun } 37*4882a593Smuzhiyun #define XADaddress(xad, address64) PXDaddress(&(xad)->loc, address64) 38*4882a593Smuzhiyun #define XADlength(xad, length32) PXDlength(&(xad)->loc, length32) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* xad_t field extraction */ 41*4882a593Smuzhiyun #define offsetXAD(xad)\ 42*4882a593Smuzhiyun ( ((s64)((xad)->off1)) << 32 | __le32_to_cpu((xad)->off2)) 43*4882a593Smuzhiyun #define addressXAD(xad) addressPXD(&(xad)->loc) 44*4882a593Smuzhiyun #define lengthXAD(xad) lengthPXD(&(xad)->loc) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /* xad list */ 47*4882a593Smuzhiyun struct xadlist { 48*4882a593Smuzhiyun s16 maxnxad; 49*4882a593Smuzhiyun s16 nxad; 50*4882a593Smuzhiyun xad_t *xad; 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* xad_t flags */ 54*4882a593Smuzhiyun #define XAD_NEW 0x01 /* new */ 55*4882a593Smuzhiyun #define XAD_EXTENDED 0x02 /* extended */ 56*4882a593Smuzhiyun #define XAD_COMPRESSED 0x04 /* compressed with recorded length */ 57*4882a593Smuzhiyun #define XAD_NOTRECORDED 0x08 /* allocated but not recorded */ 58*4882a593Smuzhiyun #define XAD_COW 0x10 /* copy-on-write */ 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* possible values for maxentry */ 62*4882a593Smuzhiyun #define XTROOTINITSLOT_DIR 6 63*4882a593Smuzhiyun #define XTROOTINITSLOT 10 64*4882a593Smuzhiyun #define XTROOTMAXSLOT 18 65*4882a593Smuzhiyun #define XTPAGEMAXSLOT 256 66*4882a593Smuzhiyun #define XTENTRYSTART 2 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* 69*4882a593Smuzhiyun * xtree page: 70*4882a593Smuzhiyun */ 71*4882a593Smuzhiyun typedef union { 72*4882a593Smuzhiyun struct xtheader { 73*4882a593Smuzhiyun __le64 next; /* 8: */ 74*4882a593Smuzhiyun __le64 prev; /* 8: */ 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun u8 flag; /* 1: */ 77*4882a593Smuzhiyun u8 rsrvd1; /* 1: */ 78*4882a593Smuzhiyun __le16 nextindex; /* 2: next index = number of entries */ 79*4882a593Smuzhiyun __le16 maxentry; /* 2: max number of entries */ 80*4882a593Smuzhiyun __le16 rsrvd2; /* 2: */ 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun pxd_t self; /* 8: self */ 83*4882a593Smuzhiyun } header; /* (32) */ 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun xad_t xad[XTROOTMAXSLOT]; /* 16 * maxentry: xad array */ 86*4882a593Smuzhiyun } xtpage_t; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* 89*4882a593Smuzhiyun * external declaration 90*4882a593Smuzhiyun */ 91*4882a593Smuzhiyun extern int xtLookup(struct inode *ip, s64 lstart, s64 llen, 92*4882a593Smuzhiyun int *pflag, s64 * paddr, int *plen, int flag); 93*4882a593Smuzhiyun extern void xtInitRoot(tid_t tid, struct inode *ip); 94*4882a593Smuzhiyun extern int xtInsert(tid_t tid, struct inode *ip, 95*4882a593Smuzhiyun int xflag, s64 xoff, int xlen, s64 * xaddrp, int flag); 96*4882a593Smuzhiyun extern int xtExtend(tid_t tid, struct inode *ip, s64 xoff, int xlen, 97*4882a593Smuzhiyun int flag); 98*4882a593Smuzhiyun #ifdef _NOTYET 99*4882a593Smuzhiyun extern int xtTailgate(tid_t tid, struct inode *ip, 100*4882a593Smuzhiyun s64 xoff, int xlen, s64 xaddr, int flag); 101*4882a593Smuzhiyun #endif 102*4882a593Smuzhiyun extern int xtUpdate(tid_t tid, struct inode *ip, struct xad *nxad); 103*4882a593Smuzhiyun extern int xtDelete(tid_t tid, struct inode *ip, s64 xoff, int xlen, 104*4882a593Smuzhiyun int flag); 105*4882a593Smuzhiyun extern s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int type); 106*4882a593Smuzhiyun extern s64 xtTruncate_pmap(tid_t tid, struct inode *ip, s64 committed_size); 107*4882a593Smuzhiyun extern int xtRelocate(tid_t tid, struct inode *ip, 108*4882a593Smuzhiyun xad_t * oxad, s64 nxaddr, int xtype); 109*4882a593Smuzhiyun extern int xtAppend(tid_t tid, 110*4882a593Smuzhiyun struct inode *ip, int xflag, s64 xoff, int maxblocks, 111*4882a593Smuzhiyun int *xlenp, s64 * xaddrp, int flag); 112*4882a593Smuzhiyun #endif /* !_H_JFS_XTREE */ 113