linux/fs/btrfs/extent_io.h
<<
>>
Prefs
   1#ifndef __EXTENTIO__
   2#define __EXTENTIO__
   3
   4#include <linux/rbtree.h>
   5
   6/* bits for the extent state */
   7#define EXTENT_DIRTY 1
   8#define EXTENT_WRITEBACK (1 << 1)
   9#define EXTENT_UPTODATE (1 << 2)
  10#define EXTENT_LOCKED (1 << 3)
  11#define EXTENT_NEW (1 << 4)
  12#define EXTENT_DELALLOC (1 << 5)
  13#define EXTENT_DEFRAG (1 << 6)
  14#define EXTENT_DEFRAG_DONE (1 << 7)
  15#define EXTENT_BUFFER_FILLED (1 << 8)
  16#define EXTENT_BOUNDARY (1 << 9)
  17#define EXTENT_NODATASUM (1 << 10)
  18#define EXTENT_DO_ACCOUNTING (1 << 11)
  19#define EXTENT_IOBITS (EXTENT_LOCKED | EXTENT_WRITEBACK)
  20
  21/* flags for bio submission */
  22#define EXTENT_BIO_COMPRESSED 1
  23
  24/* these are bit numbers for test/set bit */
  25#define EXTENT_BUFFER_UPTODATE 0
  26#define EXTENT_BUFFER_BLOCKING 1
  27#define EXTENT_BUFFER_DIRTY 2
  28
  29/* these are flags for extent_clear_unlock_delalloc */
  30#define EXTENT_CLEAR_UNLOCK_PAGE 0x1
  31#define EXTENT_CLEAR_UNLOCK      0x2
  32#define EXTENT_CLEAR_DELALLOC    0x4
  33#define EXTENT_CLEAR_DIRTY       0x8
  34#define EXTENT_SET_WRITEBACK     0x10
  35#define EXTENT_END_WRITEBACK     0x20
  36#define EXTENT_SET_PRIVATE2      0x40
  37#define EXTENT_CLEAR_ACCOUNTING  0x80
  38
  39/*
  40 * page->private values.  Every page that is controlled by the extent
  41 * map has page->private set to one.
  42 */
  43#define EXTENT_PAGE_PRIVATE 1
  44#define EXTENT_PAGE_PRIVATE_FIRST_PAGE 3
  45
  46struct extent_state;
  47
  48typedef int (extent_submit_bio_hook_t)(struct inode *inode, int rw,
  49                                       struct bio *bio, int mirror_num,
  50                                       unsigned long bio_flags);
  51struct extent_io_ops {
  52        int (*fill_delalloc)(struct inode *inode, struct page *locked_page,
  53                             u64 start, u64 end, int *page_started,
  54                             unsigned long *nr_written);
  55        int (*writepage_start_hook)(struct page *page, u64 start, u64 end);
  56        int (*writepage_io_hook)(struct page *page, u64 start, u64 end);
  57        extent_submit_bio_hook_t *submit_bio_hook;
  58        int (*merge_bio_hook)(struct page *page, unsigned long offset,
  59                              size_t size, struct bio *bio,
  60                              unsigned long bio_flags);
  61        int (*readpage_io_hook)(struct page *page, u64 start, u64 end);
  62        int (*readpage_io_failed_hook)(struct bio *bio, struct page *page,
  63                                       u64 start, u64 end,
  64                                       struct extent_state *state);
  65        int (*writepage_io_failed_hook)(struct bio *bio, struct page *page,
  66                                        u64 start, u64 end,
  67                                       struct extent_state *state);
  68        int (*readpage_end_io_hook)(struct page *page, u64 start, u64 end,
  69                                    struct extent_state *state);
  70        int (*writepage_end_io_hook)(struct page *page, u64 start, u64 end,
  71                                      struct extent_state *state, int uptodate);
  72        int (*set_bit_hook)(struct inode *inode, u64 start, u64 end,
  73                            unsigned long old, unsigned long bits);
  74        int (*clear_bit_hook)(struct inode *inode, struct extent_state *state,
  75                              unsigned long bits);
  76        int (*merge_extent_hook)(struct inode *inode,
  77                                 struct extent_state *new,
  78                                 struct extent_state *other);
  79        int (*split_extent_hook)(struct inode *inode,
  80                                 struct extent_state *orig, u64 split);
  81        int (*write_cache_pages_lock_hook)(struct page *page);
  82};
  83
  84struct extent_io_tree {
  85        struct rb_root state;
  86        struct rb_root buffer;
  87        struct address_space *mapping;
  88        u64 dirty_bytes;
  89        spinlock_t lock;
  90        spinlock_t buffer_lock;
  91        struct extent_io_ops *ops;
  92};
  93
  94struct extent_state {
  95        u64 start;
  96        u64 end; /* inclusive */
  97        struct rb_node rb_node;
  98
  99        /* ADD NEW ELEMENTS AFTER THIS */
 100        struct extent_io_tree *tree;
 101        wait_queue_head_t wq;
 102        atomic_t refs;
 103        unsigned long state;
 104        u64 split_start;
 105        u64 split_end;
 106
 107        /* for use by the FS */
 108        u64 private;
 109
 110        struct list_head leak_list;
 111};
 112
 113struct extent_buffer {
 114        u64 start;
 115        unsigned long len;
 116        char *map_token;
 117        char *kaddr;
 118        unsigned long map_start;
 119        unsigned long map_len;
 120        struct page *first_page;
 121        unsigned long bflags;
 122        atomic_t refs;
 123        struct list_head leak_list;
 124        struct rb_node rb_node;
 125
 126        /* the spinlock is used to protect most operations */
 127        spinlock_t lock;
 128
 129        /*
 130         * when we keep the lock held while blocking, waiters go onto
 131         * the wq
 132         */
 133        wait_queue_head_t lock_wq;
 134};
 135
 136struct extent_map_tree;
 137
 138static inline struct extent_state *extent_state_next(struct extent_state *state)
 139{
 140        struct rb_node *node;
 141        node = rb_next(&state->rb_node);
 142        if (!node)
 143                return NULL;
 144        return rb_entry(node, struct extent_state, rb_node);
 145}
 146
 147typedef struct extent_map *(get_extent_t)(struct inode *inode,
 148                                          struct page *page,
 149                                          size_t page_offset,
 150                                          u64 start, u64 len,
 151                                          int create);
 152
 153void extent_io_tree_init(struct extent_io_tree *tree,
 154                          struct address_space *mapping, gfp_t mask);
 155int try_release_extent_mapping(struct extent_map_tree *map,
 156                               struct extent_io_tree *tree, struct page *page,
 157                               gfp_t mask);
 158int try_release_extent_buffer(struct extent_io_tree *tree, struct page *page);
 159int try_release_extent_state(struct extent_map_tree *map,
 160                             struct extent_io_tree *tree, struct page *page,
 161                             gfp_t mask);
 162int lock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask);
 163int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
 164                     int bits, struct extent_state **cached, gfp_t mask);
 165int unlock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask);
 166int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end,
 167                    gfp_t mask);
 168int extent_read_full_page(struct extent_io_tree *tree, struct page *page,
 169                          get_extent_t *get_extent);
 170int __init extent_io_init(void);
 171void extent_io_exit(void);
 172
 173u64 count_range_bits(struct extent_io_tree *tree,
 174                     u64 *start, u64 search_end,
 175                     u64 max_bytes, unsigned long bits);
 176
 177int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end,
 178                   int bits, int filled, struct extent_state *cached_state);
 179int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
 180                      int bits, gfp_t mask);
 181int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
 182                     int bits, int wake, int delete, struct extent_state **cached,
 183                     gfp_t mask);
 184int set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
 185                    int bits, gfp_t mask);
 186int set_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end,
 187                        gfp_t mask);
 188int set_extent_new(struct extent_io_tree *tree, u64 start, u64 end,
 189                   gfp_t mask);
 190int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
 191                     gfp_t mask);
 192int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
 193                       gfp_t mask);
 194int clear_extent_ordered(struct extent_io_tree *tree, u64 start, u64 end,
 195                       gfp_t mask);
 196int clear_extent_ordered_metadata(struct extent_io_tree *tree, u64 start,
 197                                  u64 end, gfp_t mask);
 198int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end,
 199                     gfp_t mask);
 200int set_extent_ordered(struct extent_io_tree *tree, u64 start, u64 end,
 201                     gfp_t mask);
 202int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
 203                          u64 *start_ret, u64 *end_ret, int bits);
 204struct extent_state *find_first_extent_bit_state(struct extent_io_tree *tree,
 205                                                 u64 start, int bits);
 206int extent_invalidatepage(struct extent_io_tree *tree,
 207                          struct page *page, unsigned long offset);
 208int extent_write_full_page(struct extent_io_tree *tree, struct page *page,
 209                          get_extent_t *get_extent,
 210                          struct writeback_control *wbc);
 211int extent_write_locked_range(struct extent_io_tree *tree, struct inode *inode,
 212                              u64 start, u64 end, get_extent_t *get_extent,
 213                              int mode);
 214int extent_writepages(struct extent_io_tree *tree,
 215                      struct address_space *mapping,
 216                      get_extent_t *get_extent,
 217                      struct writeback_control *wbc);
 218int extent_readpages(struct extent_io_tree *tree,
 219                     struct address_space *mapping,
 220                     struct list_head *pages, unsigned nr_pages,
 221                     get_extent_t get_extent);
 222int extent_prepare_write(struct extent_io_tree *tree,
 223                         struct inode *inode, struct page *page,
 224                         unsigned from, unsigned to, get_extent_t *get_extent);
 225int extent_commit_write(struct extent_io_tree *tree,
 226                        struct inode *inode, struct page *page,
 227                        unsigned from, unsigned to);
 228sector_t extent_bmap(struct address_space *mapping, sector_t iblock,
 229                get_extent_t *get_extent);
 230int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 231                __u64 start, __u64 len, get_extent_t *get_extent);
 232int set_range_dirty(struct extent_io_tree *tree, u64 start, u64 end);
 233int set_state_private(struct extent_io_tree *tree, u64 start, u64 private);
 234int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private);
 235void set_page_extent_mapped(struct page *page);
 236
 237struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree,
 238                                          u64 start, unsigned long len,
 239                                          struct page *page0,
 240                                          gfp_t mask);
 241struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree,
 242                                         u64 start, unsigned long len,
 243                                          gfp_t mask);
 244void free_extent_buffer(struct extent_buffer *eb);
 245int read_extent_buffer_pages(struct extent_io_tree *tree,
 246                             struct extent_buffer *eb, u64 start, int wait,
 247                             get_extent_t *get_extent, int mirror_num);
 248
 249static inline void extent_buffer_get(struct extent_buffer *eb)
 250{
 251        atomic_inc(&eb->refs);
 252}
 253
 254int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv,
 255                          unsigned long start,
 256                          unsigned long len);
 257void read_extent_buffer(struct extent_buffer *eb, void *dst,
 258                        unsigned long start,
 259                        unsigned long len);
 260void write_extent_buffer(struct extent_buffer *eb, const void *src,
 261                         unsigned long start, unsigned long len);
 262void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,
 263                        unsigned long dst_offset, unsigned long src_offset,
 264                        unsigned long len);
 265void memcpy_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
 266                           unsigned long src_offset, unsigned long len);
 267void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
 268                           unsigned long src_offset, unsigned long len);
 269void memset_extent_buffer(struct extent_buffer *eb, char c,
 270                          unsigned long start, unsigned long len);
 271int wait_on_extent_buffer_writeback(struct extent_io_tree *tree,
 272                                    struct extent_buffer *eb);
 273int wait_on_extent_writeback(struct extent_io_tree *tree, u64 start, u64 end);
 274int wait_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, int bits);
 275int clear_extent_buffer_dirty(struct extent_io_tree *tree,
 276                              struct extent_buffer *eb);
 277int set_extent_buffer_dirty(struct extent_io_tree *tree,
 278                             struct extent_buffer *eb);
 279int test_extent_buffer_dirty(struct extent_io_tree *tree,
 280                             struct extent_buffer *eb);
 281int set_extent_buffer_uptodate(struct extent_io_tree *tree,
 282                               struct extent_buffer *eb);
 283int clear_extent_buffer_uptodate(struct extent_io_tree *tree,
 284                                struct extent_buffer *eb);
 285int extent_buffer_uptodate(struct extent_io_tree *tree,
 286                           struct extent_buffer *eb);
 287int map_extent_buffer(struct extent_buffer *eb, unsigned long offset,
 288                      unsigned long min_len, char **token, char **map,
 289                      unsigned long *map_start,
 290                      unsigned long *map_len, int km);
 291int map_private_extent_buffer(struct extent_buffer *eb, unsigned long offset,
 292                      unsigned long min_len, char **token, char **map,
 293                      unsigned long *map_start,
 294                      unsigned long *map_len, int km);
 295void unmap_extent_buffer(struct extent_buffer *eb, char *token, int km);
 296int release_extent_buffer_tail_pages(struct extent_buffer *eb);
 297int extent_range_uptodate(struct extent_io_tree *tree,
 298                          u64 start, u64 end);
 299int extent_clear_unlock_delalloc(struct inode *inode,
 300                                struct extent_io_tree *tree,
 301                                u64 start, u64 end, struct page *locked_page,
 302                                unsigned long op);
 303#endif
 304