Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  *   Copyright (C) International Business Machines Corp., 2000-2002
0004  */
0005 #ifndef _H_JFS_XTREE
0006 #define _H_JFS_XTREE
0007 
0008 /*
0009  *  jfs_xtree.h: extent allocation descriptor B+-tree manager
0010  */
0011 
0012 #include "jfs_btree.h"
0013 
0014 
0015 /*
0016  *  extent allocation descriptor (xad)
0017  */
0018 typedef struct xad {
0019     __u8 flag;  /* 1: flag */
0020     __u8 rsvrd[2];  /* 2: reserved */
0021     __u8 off1;  /* 1: offset in unit of fsblksize */
0022     __le32 off2;    /* 4: offset in unit of fsblksize */
0023     pxd_t loc;  /* 8: length and address in unit of fsblksize */
0024 } xad_t;            /* (16) */
0025 
0026 #define MAXXLEN     ((1 << 24) - 1)
0027 
0028 #define XTSLOTSIZE  16
0029 #define L2XTSLOTSIZE    4
0030 
0031 /* xad_t field construction */
0032 #define XADoffset(xad, offset64)\
0033 {\
0034     (xad)->off1 = ((u64)offset64) >> 32;\
0035     (xad)->off2 = __cpu_to_le32((offset64) & 0xffffffff);\
0036 }
0037 #define XADaddress(xad, address64) PXDaddress(&(xad)->loc, address64)
0038 #define XADlength(xad, length32) PXDlength(&(xad)->loc, length32)
0039 
0040 /* xad_t field extraction */
0041 #define offsetXAD(xad)\
0042     ( ((s64)((xad)->off1)) << 32 | __le32_to_cpu((xad)->off2))
0043 #define addressXAD(xad) addressPXD(&(xad)->loc)
0044 #define lengthXAD(xad) lengthPXD(&(xad)->loc)
0045 
0046 /* xad list */
0047 struct xadlist {
0048     s16 maxnxad;
0049     s16 nxad;
0050     xad_t *xad;
0051 };
0052 
0053 /* xad_t flags */
0054 #define XAD_NEW     0x01    /* new */
0055 #define XAD_EXTENDED    0x02    /* extended */
0056 #define XAD_COMPRESSED  0x04    /* compressed with recorded length */
0057 #define XAD_NOTRECORDED 0x08    /* allocated but not recorded */
0058 #define XAD_COW     0x10    /* copy-on-write */
0059 
0060 
0061 /* possible values for maxentry */
0062 #define XTROOTINITSLOT_DIR 6
0063 #define XTROOTINITSLOT  10
0064 #define XTROOTMAXSLOT   18
0065 #define XTPAGEMAXSLOT   256
0066 #define XTENTRYSTART    2
0067 
0068 /*
0069  *  xtree page:
0070  */
0071 typedef union {
0072     struct xtheader {
0073         __le64 next;    /* 8: */
0074         __le64 prev;    /* 8: */
0075 
0076         u8 flag;    /* 1: */
0077         u8 rsrvd1;  /* 1: */
0078         __le16 nextindex;   /* 2: next index = number of entries */
0079         __le16 maxentry;    /* 2: max number of entries */
0080         __le16 rsrvd2;  /* 2: */
0081 
0082         pxd_t self; /* 8: self */
0083     } header;       /* (32) */
0084 
0085     xad_t xad[XTROOTMAXSLOT];   /* 16 * maxentry: xad array */
0086 } xtpage_t;
0087 
0088 /*
0089  *  external declaration
0090  */
0091 extern int xtLookup(struct inode *ip, s64 lstart, s64 llen,
0092             int *pflag, s64 * paddr, int *plen, int flag);
0093 extern void xtInitRoot(tid_t tid, struct inode *ip);
0094 extern int xtInsert(tid_t tid, struct inode *ip,
0095             int xflag, s64 xoff, int xlen, s64 * xaddrp, int flag);
0096 extern int xtExtend(tid_t tid, struct inode *ip, s64 xoff, int xlen,
0097             int flag);
0098 extern int xtUpdate(tid_t tid, struct inode *ip, struct xad *nxad);
0099 extern int xtDelete(tid_t tid, struct inode *ip, s64 xoff, int xlen,
0100             int flag);
0101 extern s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int type);
0102 extern s64 xtTruncate_pmap(tid_t tid, struct inode *ip, s64 committed_size);
0103 extern int xtRelocate(tid_t tid, struct inode *ip,
0104               xad_t * oxad, s64 nxaddr, int xtype);
0105 extern int xtAppend(tid_t tid,
0106             struct inode *ip, int xflag, s64 xoff, int maxblocks,
0107             int *xlenp, s64 * xaddrp, int flag);
0108 #endif              /* !_H_JFS_XTREE */