extents_status.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * fs/ext4/extents_status.h
  3. *
  4. * Written by Yongqiang Yang <xiaoqiangnk@gmail.com>
  5. * Modified by
  6. * Allison Henderson <achender@linux.vnet.ibm.com>
  7. * Zheng Liu <wenqing.lz@taobao.com>
  8. *
  9. */
  10. #ifndef _EXT4_EXTENTS_STATUS_H
  11. #define _EXT4_EXTENTS_STATUS_H
  12. /*
  13. * Turn on ES_DEBUG__ to get lots of info about extent status operations.
  14. */
  15. #ifdef ES_DEBUG__
  16. #define es_debug(fmt, ...) printk(fmt, ##__VA_ARGS__)
  17. #else
  18. #define es_debug(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
  19. #endif
  20. #define EXTENT_STATUS_WRITTEN 0x80000000 /* written extent */
  21. #define EXTENT_STATUS_UNWRITTEN 0x40000000 /* unwritten extent */
  22. #define EXTENT_STATUS_DELAYED 0x20000000 /* delayed extent */
  23. #define EXTENT_STATUS_HOLE 0x10000000 /* hole */
  24. #define EXTENT_STATUS_FLAGS (EXTENT_STATUS_WRITTEN | \
  25. EXTENT_STATUS_UNWRITTEN | \
  26. EXTENT_STATUS_DELAYED | \
  27. EXTENT_STATUS_HOLE)
  28. struct extent_status {
  29. struct rb_node rb_node;
  30. ext4_lblk_t es_lblk; /* first logical block extent covers */
  31. ext4_lblk_t es_len; /* length of extent in block */
  32. ext4_fsblk_t es_pblk; /* first physical block */
  33. };
  34. struct ext4_es_tree {
  35. struct rb_root root;
  36. struct extent_status *cache_es; /* recently accessed extent */
  37. };
  38. extern int __init ext4_init_es(void);
  39. extern void ext4_exit_es(void);
  40. extern void ext4_es_init_tree(struct ext4_es_tree *tree);
  41. extern int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk,
  42. ext4_lblk_t len, ext4_fsblk_t pblk,
  43. unsigned long long status);
  44. extern int ext4_es_remove_extent(struct inode *inode, ext4_lblk_t lblk,
  45. ext4_lblk_t len);
  46. extern void ext4_es_find_delayed_extent(struct inode *inode, ext4_lblk_t lblk,
  47. struct extent_status *es);
  48. extern int ext4_es_lookup_extent(struct inode *inode, ext4_lblk_t lblk,
  49. struct extent_status *es);
  50. static inline int ext4_es_is_written(struct extent_status *es)
  51. {
  52. return (es->es_pblk & EXTENT_STATUS_WRITTEN);
  53. }
  54. static inline int ext4_es_is_unwritten(struct extent_status *es)
  55. {
  56. return (es->es_pblk & EXTENT_STATUS_UNWRITTEN);
  57. }
  58. static inline int ext4_es_is_delayed(struct extent_status *es)
  59. {
  60. return (es->es_pblk & EXTENT_STATUS_DELAYED);
  61. }
  62. static inline int ext4_es_is_hole(struct extent_status *es)
  63. {
  64. return (es->es_pblk & EXTENT_STATUS_HOLE);
  65. }
  66. static inline ext4_fsblk_t ext4_es_status(struct extent_status *es)
  67. {
  68. return (es->es_pblk & EXTENT_STATUS_FLAGS);
  69. }
  70. static inline ext4_fsblk_t ext4_es_pblock(struct extent_status *es)
  71. {
  72. return (es->es_pblk & ~EXTENT_STATUS_FLAGS);
  73. }
  74. static inline void ext4_es_store_pblock(struct extent_status *es,
  75. ext4_fsblk_t pb)
  76. {
  77. ext4_fsblk_t block;
  78. block = (pb & ~EXTENT_STATUS_FLAGS) |
  79. (es->es_pblk & EXTENT_STATUS_FLAGS);
  80. es->es_pblk = block;
  81. }
  82. static inline void ext4_es_store_status(struct extent_status *es,
  83. unsigned long long status)
  84. {
  85. ext4_fsblk_t block;
  86. block = (status & EXTENT_STATUS_FLAGS) |
  87. (es->es_pblk & ~EXTENT_STATUS_FLAGS);
  88. es->es_pblk = block;
  89. }
  90. #endif /* _EXT4_EXTENTS_STATUS_H */