xref: /OK3568_Linux_fs/kernel/fs/jfs/jfs_xtree.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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