2019-05-27 09:55:05 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2005-04-17 02:20:36 +04:00
/*
2006-10-02 18:55:27 +04:00
* Copyright ( C ) International Business Machines Corp . , 2000 - 2002
2005-04-17 02:20:36 +04:00
*/
# ifndef _H_JFS_XTREE
# define _H_JFS_XTREE
/*
2007-06-07 00:28:35 +04:00
* jfs_xtree . h : extent allocation descriptor B + - tree manager
2005-04-17 02:20:36 +04:00
*/
# include "jfs_btree.h"
/*
2007-06-07 00:28:35 +04:00
* extent allocation descriptor ( xad )
2005-04-17 02:20:36 +04:00
*/
typedef struct xad {
2014-12-19 09:51:26 +03:00
__u8 flag ; /* 1: flag */
__u8 rsvrd [ 2 ] ; /* 2: reserved */
__u8 off1 ; /* 1: offset in unit of fsblksize */
__le32 off2 ; /* 4: offset in unit of fsblksize */
pxd_t loc ; /* 8: length and address in unit of fsblksize */
2005-04-17 02:20:36 +04:00
} xad_t ; /* (16) */
2007-06-07 00:28:35 +04:00
# define MAXXLEN ((1 << 24) - 1)
2005-04-17 02:20:36 +04:00
2007-06-07 00:28:35 +04:00
# define XTSLOTSIZE 16
# define L2XTSLOTSIZE 4
2005-04-17 02:20:36 +04:00
/* xad_t field construction */
# define XADoffset(xad, offset64)\
{ \
2007-06-07 00:28:35 +04:00
( xad ) - > off1 = ( ( u64 ) offset64 ) > > 32 ; \
( xad ) - > off2 = __cpu_to_le32 ( ( offset64 ) & 0xffffffff ) ; \
2005-04-17 02:20:36 +04:00
}
2014-12-19 09:51:26 +03:00
# define XADaddress(xad, address64) PXDaddress(&(xad)->loc, address64)
# define XADlength(xad, length32) PXDlength(&(xad)->loc, length32)
2005-04-17 02:20:36 +04:00
/* xad_t field extraction */
# define offsetXAD(xad)\
2007-06-07 00:28:35 +04:00
( ( ( s64 ) ( ( xad ) - > off1 ) ) < < 32 | __le32_to_cpu ( ( xad ) - > off2 ) )
2014-12-19 09:51:26 +03:00
# define addressXAD(xad) addressPXD(&(xad)->loc)
# define lengthXAD(xad) lengthPXD(&(xad)->loc)
2005-04-17 02:20:36 +04:00
/* xad list */
struct xadlist {
s16 maxnxad ;
s16 nxad ;
xad_t * xad ;
} ;
/* xad_t flags */
2007-06-07 00:28:35 +04:00
# define XAD_NEW 0x01 /* new */
# define XAD_EXTENDED 0x02 /* extended */
# define XAD_COMPRESSED 0x04 /* compressed with recorded length */
2005-04-17 02:20:36 +04:00
# define XAD_NOTRECORDED 0x08 /* allocated but not recorded */
2007-06-07 00:28:35 +04:00
# define XAD_COW 0x10 /* copy-on-write */
2005-04-17 02:20:36 +04:00
/* possible values for maxentry */
2007-06-07 00:28:35 +04:00
# define XTROOTINITSLOT_DIR 6
# define XTROOTINITSLOT 10
# define XTROOTMAXSLOT 18
# define XTPAGEMAXSLOT 256
# define XTENTRYSTART 2
2005-04-17 02:20:36 +04:00
/*
2007-06-07 00:28:35 +04:00
* xtree page :
2005-04-17 02:20:36 +04:00
*/
typedef union {
struct xtheader {
__le64 next ; /* 8: */
__le64 prev ; /* 8: */
u8 flag ; /* 1: */
u8 rsrvd1 ; /* 1: */
__le16 nextindex ; /* 2: next index = number of entries */
__le16 maxentry ; /* 2: max number of entries */
__le16 rsrvd2 ; /* 2: */
pxd_t self ; /* 8: self */
} header ; /* (32) */
xad_t xad [ XTROOTMAXSLOT ] ; /* 16 * maxentry: xad array */
} xtpage_t ;
/*
2007-06-07 00:28:35 +04:00
* external declaration
2005-04-17 02:20:36 +04:00
*/
extern int xtLookup ( struct inode * ip , s64 lstart , s64 llen ,
int * pflag , s64 * paddr , int * plen , int flag ) ;
extern void xtInitRoot ( tid_t tid , struct inode * ip ) ;
extern int xtInsert ( tid_t tid , struct inode * ip ,
int xflag , s64 xoff , int xlen , s64 * xaddrp , int flag ) ;
extern int xtExtend ( tid_t tid , struct inode * ip , s64 xoff , int xlen ,
int flag ) ;
# ifdef _NOTYET
extern int xtTailgate ( tid_t tid , struct inode * ip ,
s64 xoff , int xlen , s64 xaddr , int flag ) ;
# endif
extern int xtUpdate ( tid_t tid , struct inode * ip , struct xad * nxad ) ;
extern int xtDelete ( tid_t tid , struct inode * ip , s64 xoff , int xlen ,
int flag ) ;
extern s64 xtTruncate ( tid_t tid , struct inode * ip , s64 newsize , int type ) ;
extern s64 xtTruncate_pmap ( tid_t tid , struct inode * ip , s64 committed_size ) ;
extern int xtRelocate ( tid_t tid , struct inode * ip ,
xad_t * oxad , s64 nxaddr , int xtype ) ;
extern int xtAppend ( tid_t tid ,
struct inode * ip , int xflag , s64 xoff , int maxblocks ,
int * xlenp , s64 * xaddrp , int flag ) ;
# endif /* !_H_JFS_XTREE */