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