xref: /openbmc/linux/fs/jfs/jfs_xtree.h (revision 26d0dfbb16fcb17d128a79dc70f3020ea6992af0)
11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /*
363f83c9fSDave Kleikamp  *   Copyright (C) International Business Machines Corp., 2000-2002
41da177e4SLinus Torvalds  */
51da177e4SLinus Torvalds #ifndef _H_JFS_XTREE
61da177e4SLinus Torvalds #define _H_JFS_XTREE
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds /*
91da177e4SLinus Torvalds  *	jfs_xtree.h: extent allocation descriptor B+-tree manager
101da177e4SLinus Torvalds  */
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds #include "jfs_btree.h"
131da177e4SLinus Torvalds 
141da177e4SLinus Torvalds 
151da177e4SLinus Torvalds /*
161da177e4SLinus Torvalds  *	extent allocation descriptor (xad)
171da177e4SLinus Torvalds  */
181da177e4SLinus Torvalds typedef struct xad {
19e1f1fe79SAl Viro 	__u8 flag;	/* 1: flag */
20e1f1fe79SAl Viro 	__u8 rsvrd[2];	/* 2: reserved */
21e1f1fe79SAl Viro 	__u8 off1;	/* 1: offset in unit of fsblksize */
221da177e4SLinus Torvalds 	__le32 off2;	/* 4: offset in unit of fsblksize */
23e1f1fe79SAl Viro 	pxd_t loc;	/* 8: length and address in unit of fsblksize */
241da177e4SLinus Torvalds } xad_t;			/* (16) */
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds #define MAXXLEN		((1 << 24) - 1)
271da177e4SLinus Torvalds 
281da177e4SLinus Torvalds #define XTSLOTSIZE	16
291da177e4SLinus Torvalds #define L2XTSLOTSIZE	4
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds /* xad_t field construction */
321da177e4SLinus Torvalds #define XADoffset(xad, offset64)\
331da177e4SLinus Torvalds {\
341da177e4SLinus Torvalds 	(xad)->off1 = ((u64)offset64) >> 32;\
351da177e4SLinus Torvalds 	(xad)->off2 = __cpu_to_le32((offset64) & 0xffffffff);\
361da177e4SLinus Torvalds }
37e1f1fe79SAl Viro #define XADaddress(xad, address64) PXDaddress(&(xad)->loc, address64)
38e1f1fe79SAl Viro #define XADlength(xad, length32) PXDlength(&(xad)->loc, length32)
391da177e4SLinus Torvalds 
401da177e4SLinus Torvalds /* xad_t field extraction */
411da177e4SLinus Torvalds #define offsetXAD(xad)\
421da177e4SLinus Torvalds 	( ((s64)((xad)->off1)) << 32 | __le32_to_cpu((xad)->off2))
43e1f1fe79SAl Viro #define addressXAD(xad) addressPXD(&(xad)->loc)
44e1f1fe79SAl Viro #define lengthXAD(xad) lengthPXD(&(xad)->loc)
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds /* xad list */
471da177e4SLinus Torvalds struct xadlist {
481da177e4SLinus Torvalds 	s16 maxnxad;
491da177e4SLinus Torvalds 	s16 nxad;
501da177e4SLinus Torvalds 	xad_t *xad;
511da177e4SLinus Torvalds };
521da177e4SLinus Torvalds 
531da177e4SLinus Torvalds /* xad_t flags */
541da177e4SLinus Torvalds #define XAD_NEW		0x01	/* new */
551da177e4SLinus Torvalds #define XAD_EXTENDED	0x02	/* extended */
561da177e4SLinus Torvalds #define XAD_COMPRESSED	0x04	/* compressed with recorded length */
571da177e4SLinus Torvalds #define XAD_NOTRECORDED 0x08	/* allocated but not recorded */
581da177e4SLinus Torvalds #define XAD_COW		0x10	/* copy-on-write */
591da177e4SLinus Torvalds 
601da177e4SLinus Torvalds 
611da177e4SLinus Torvalds /* possible values for maxentry */
621da177e4SLinus Torvalds #define XTROOTINITSLOT_DIR 6
631da177e4SLinus Torvalds #define XTROOTINITSLOT	10
641da177e4SLinus Torvalds #define XTROOTMAXSLOT	18
651da177e4SLinus Torvalds #define XTPAGEMAXSLOT	256
661da177e4SLinus Torvalds #define XTENTRYSTART	2
671da177e4SLinus Torvalds 
681da177e4SLinus Torvalds struct xtheader {
691da177e4SLinus Torvalds 	__le64 next;	/* 8: */
701da177e4SLinus Torvalds 	__le64 prev;	/* 8: */
711da177e4SLinus Torvalds 
721da177e4SLinus Torvalds 	u8 flag;	/* 1: */
731da177e4SLinus Torvalds 	u8 rsrvd1;	/* 1: */
741da177e4SLinus Torvalds 	__le16 nextindex;	/* 2: next index = number of entries */
751da177e4SLinus Torvalds 	__le16 maxentry;	/* 2: max number of entries */
761da177e4SLinus Torvalds 	__le16 rsrvd2;	/* 2: */
771da177e4SLinus Torvalds 
781da177e4SLinus Torvalds 	pxd_t self;	/* 8: self */
79*2ff51719SDave Kleikamp };
801da177e4SLinus Torvalds 
81*2ff51719SDave Kleikamp /*
82*2ff51719SDave Kleikamp  *	xtree root (in inode):
83*2ff51719SDave Kleikamp  */
84*2ff51719SDave Kleikamp typedef union {
85*2ff51719SDave Kleikamp 	struct xtheader header;
861da177e4SLinus Torvalds 	xad_t xad[XTROOTMAXSLOT];	/* 16 * maxentry: xad array */
87*2ff51719SDave Kleikamp } xtroot_t;
88*2ff51719SDave Kleikamp 
89*2ff51719SDave Kleikamp /*
90*2ff51719SDave Kleikamp  *	xtree page:
91*2ff51719SDave Kleikamp  */
92*2ff51719SDave Kleikamp typedef union {
93*2ff51719SDave Kleikamp 	struct xtheader header;
94*2ff51719SDave Kleikamp 	xad_t xad[XTPAGEMAXSLOT];	/* 16 * maxentry: xad array */
951da177e4SLinus Torvalds } xtpage_t;
961da177e4SLinus Torvalds 
971da177e4SLinus Torvalds /*
981da177e4SLinus Torvalds  *	external declaration
991da177e4SLinus Torvalds  */
1001da177e4SLinus Torvalds extern int xtLookup(struct inode *ip, s64 lstart, s64 llen,
1011da177e4SLinus Torvalds 		    int *pflag, s64 * paddr, int *plen, int flag);
1021da177e4SLinus Torvalds extern void xtInitRoot(tid_t tid, struct inode *ip);
1031da177e4SLinus Torvalds extern int xtInsert(tid_t tid, struct inode *ip,
1041da177e4SLinus Torvalds 		    int xflag, s64 xoff, int xlen, s64 * xaddrp, int flag);
1051da177e4SLinus Torvalds extern int xtExtend(tid_t tid, struct inode *ip, s64 xoff, int xlen,
1061da177e4SLinus Torvalds 		    int flag);
1071da177e4SLinus Torvalds extern int xtUpdate(tid_t tid, struct inode *ip, struct xad *nxad);
1081da177e4SLinus Torvalds extern s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int type);
1091da177e4SLinus Torvalds extern s64 xtTruncate_pmap(tid_t tid, struct inode *ip, s64 committed_size);
1101da177e4SLinus Torvalds extern int xtAppend(tid_t tid,
1111da177e4SLinus Torvalds 		    struct inode *ip, int xflag, s64 xoff, int maxblocks,
1121da177e4SLinus Torvalds 		    int *xlenp, s64 * xaddrp, int flag);
1131da177e4SLinus Torvalds #endif				/* !_H_JFS_XTREE */
114