jfs_xtree.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Copyright (C) International Business Machines Corp., 2000-2002
  4. */
  5. #ifndef _H_JFS_XTREE
  6. #define _H_JFS_XTREE
  7. /*
  8. * jfs_xtree.h: extent allocation descriptor B+-tree manager
  9. */
  10. #include "jfs_btree.h"
  11. /*
  12. * extent allocation descriptor (xad)
  13. */
  14. typedef struct xad {
  15. __u8 flag; /* 1: flag */
  16. __u8 rsvrd[2]; /* 2: reserved */
  17. __u8 off1; /* 1: offset in unit of fsblksize */
  18. __le32 off2; /* 4: offset in unit of fsblksize */
  19. pxd_t loc; /* 8: length and address in unit of fsblksize */
  20. } xad_t; /* (16) */
  21. #define MAXXLEN ((1 << 24) - 1)
  22. #define XTSLOTSIZE 16
  23. #define L2XTSLOTSIZE 4
  24. /* xad_t field construction */
  25. #define XADoffset(xad, offset64)\
  26. {\
  27. (xad)->off1 = ((u64)offset64) >> 32;\
  28. (xad)->off2 = __cpu_to_le32((offset64) & 0xffffffff);\
  29. }
  30. #define XADaddress(xad, address64) PXDaddress(&(xad)->loc, address64)
  31. #define XADlength(xad, length32) PXDlength(&(xad)->loc, length32)
  32. /* xad_t field extraction */
  33. #define offsetXAD(xad)\
  34. ( ((s64)((xad)->off1)) << 32 | __le32_to_cpu((xad)->off2))
  35. #define addressXAD(xad) addressPXD(&(xad)->loc)
  36. #define lengthXAD(xad) lengthPXD(&(xad)->loc)
  37. /* xad list */
  38. struct xadlist {
  39. s16 maxnxad;
  40. s16 nxad;
  41. xad_t *xad;
  42. };
  43. /* xad_t flags */
  44. #define XAD_NEW 0x01 /* new */
  45. #define XAD_EXTENDED 0x02 /* extended */
  46. #define XAD_COMPRESSED 0x04 /* compressed with recorded length */
  47. #define XAD_NOTRECORDED 0x08 /* allocated but not recorded */
  48. #define XAD_COW 0x10 /* copy-on-write */
  49. /* possible values for maxentry */
  50. #define XTROOTINITSLOT_DIR 6
  51. #define XTROOTINITSLOT 10
  52. #define XTROOTMAXSLOT 18
  53. #define XTPAGEMAXSLOT 256
  54. #define XTENTRYSTART 2
  55. /*
  56. * xtree page:
  57. */
  58. typedef union {
  59. struct xtheader {
  60. __le64 next; /* 8: */
  61. __le64 prev; /* 8: */
  62. u8 flag; /* 1: */
  63. u8 rsrvd1; /* 1: */
  64. __le16 nextindex; /* 2: next index = number of entries */
  65. __le16 maxentry; /* 2: max number of entries */
  66. __le16 rsrvd2; /* 2: */
  67. pxd_t self; /* 8: self */
  68. } header; /* (32) */
  69. xad_t xad[XTROOTMAXSLOT]; /* 16 * maxentry: xad array */
  70. } xtpage_t;
  71. /*
  72. * external declaration
  73. */
  74. extern int xtLookup(struct inode *ip, s64 lstart, s64 llen,
  75. int *pflag, s64 * paddr, int *plen, int flag);
  76. extern void xtInitRoot(tid_t tid, struct inode *ip);
  77. extern int xtInsert(tid_t tid, struct inode *ip,
  78. int xflag, s64 xoff, int xlen, s64 * xaddrp, int flag);
  79. extern int xtExtend(tid_t tid, struct inode *ip, s64 xoff, int xlen,
  80. int flag);
  81. extern int xtUpdate(tid_t tid, struct inode *ip, struct xad *nxad);
  82. extern int xtDelete(tid_t tid, struct inode *ip, s64 xoff, int xlen,
  83. int flag);
  84. extern s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int type);
  85. extern s64 xtTruncate_pmap(tid_t tid, struct inode *ip, s64 committed_size);
  86. extern int xtRelocate(tid_t tid, struct inode *ip,
  87. xad_t * oxad, s64 nxaddr, int xtype);
  88. extern int xtAppend(tid_t tid,
  89. struct inode *ip, int xflag, s64 xoff, int maxblocks,
  90. int *xlenp, s64 * xaddrp, int flag);
  91. #endif /* !_H_JFS_XTREE */