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_FIRST_DELALLOC (1 << 12)
  20#define EXTENT_NEED_WAIT (1 << 13)
  21#define EXTENT_DAMAGED (1 << 14)
  22#define EXTENT_NORESERVE (1 << 15)
  23#define EXTENT_IOBITS (EXTENT_LOCKED | EXTENT_WRITEBACK)
  24#define EXTENT_CTLBITS (EXTENT_DO_ACCOUNTING | EXTENT_FIRST_DELALLOC)
  25
  26/*
  27 * flags for bio submission. The high bits indicate the compression
  28 * type for this bio
  29 */
  30#define EXTENT_BIO_COMPRESSED 1
  31#define EXTENT_BIO_TREE_LOG 2
  32#define EXTENT_BIO_FLAG_SHIFT 16
  33
  34/* these are bit numbers for test/set bit */
  35#define EXTENT_BUFFER_UPTODATE 0
  36#define EXTENT_BUFFER_BLOCKING 1
  37#define EXTENT_BUFFER_DIRTY 2
  38#define EXTENT_BUFFER_CORRUPT 3
  39#define EXTENT_BUFFER_READAHEAD 4       /* this got triggered by readahead */
  40#define EXTENT_BUFFER_TREE_REF 5
  41#define EXTENT_BUFFER_STALE 6
  42#define EXTENT_BUFFER_WRITEBACK 7
  43#define EXTENT_BUFFER_IOERR 8
  44#define EXTENT_BUFFER_DUMMY 9
  45
  46/* these are flags for extent_clear_unlock_delalloc */
  47#define EXTENT_CLEAR_UNLOCK_PAGE 0x1
  48#define EXTENT_CLEAR_UNLOCK      0x2
  49#define EXTENT_CLEAR_DELALLOC    0x4
  50#define EXTENT_CLEAR_DIRTY       0x8
  51#define EXTENT_SET_WRITEBACK     0x10
  52#define EXTENT_END_WRITEBACK     0x20
  53#define EXTENT_SET_PRIVATE2      0x40
  54#define EXTENT_CLEAR_ACCOUNTING  0x80
  55
  56/*
  57 * page->private values.  Every page that is controlled by the extent
  58 * map has page->private set to one.
  59 */
  60#define EXTENT_PAGE_PRIVATE 1
  61#define EXTENT_PAGE_PRIVATE_FIRST_PAGE 3
  62
  63struct extent_state;
  64struct btrfs_root;
  65
  66typedef int (extent_submit_bio_hook_t)(struct inode *inode, int rw,
  67                                       struct bio *bio, int mirror_num,
  68                                       unsigned long bio_flags, u64 bio_offset);
  69struct extent_io_ops {
  70        int (*fill_delalloc)(struct inode *inode, struct page *locked_page,
  71                             u64 start, u64 end, int *page_started,
  72                             unsigned long *nr_written);
  73        int (*writepage_start_hook)(struct page *page, u64 start, u64 end);
  74        int (*writepage_io_hook)(struct page *page, u64 start, u64 end);
  75        extent_submit_bio_hook_t *submit_bio_hook;
  76        int (*merge_bio_hook)(int rw, struct page *page, unsigned long offset,
  77                              size_t size, struct bio *bio,
  78                              unsigned long bio_flags);
  79        int (*readpage_io_failed_hook)(struct page *page, int failed_mirror);
  80        int (*readpage_end_io_hook)(struct page *page, u64 start, u64 end,
  81                                    struct extent_state *state, int mirror);
  82        int (*writepage_end_io_hook)(struct page *page, u64 start, u64 end,
  83                                      struct extent_state *state, int uptodate);
  84        void (*set_bit_hook)(struct inode *inode, struct extent_state *state,
  85                             unsigned long *bits);
  86        void (*clear_bit_hook)(struct inode *inode, struct extent_state *state,
  87                               unsigned long *bits);
  88        void (*merge_extent_hook)(struct inode *inode,
  89                                  struct extent_state *new,
  90                                  struct extent_state *other);
  91        void (*split_extent_hook)(struct inode *inode,
  92                                  struct extent_state *orig, u64 split);
  93};
  94
  95struct extent_io_tree {
  96        struct rb_root state;
  97        struct radix_tree_root buffer;
  98        struct address_space *mapping;
  99        u64 dirty_bytes;
 100        int track_uptodate;
 101        spinlock_t lock;
 102        spinlock_t buffer_lock;
 103        struct extent_io_ops *ops;
 104};
 105
 106struct extent_state {
 107        u64 start;
 108        u64 end; /* inclusive */
 109        struct rb_node rb_node;
 110
 111        /* ADD NEW ELEMENTS AFTER THIS */
 112        struct extent_io_tree *tree;
 113        wait_queue_head_t wq;
 114        atomic_t refs;
 115        unsigned long state;
 116
 117        /* for use by the FS */
 118        u64 private;
 119
 120#ifdef CONFIG_BTRFS_DEBUG
 121        struct list_head leak_list;
 122#endif
 123};
 124
 125#define INLINE_EXTENT_BUFFER_PAGES 16
 126#define MAX_INLINE_EXTENT_BUFFER_SIZE (INLINE_EXTENT_BUFFER_PAGES * PAGE_CACHE_SIZE)
 127struct extent_buffer {
 128        u64 start;
 129        unsigned long len;
 130        unsigned long map_start;
 131        unsigned long map_len;
 132        unsigned long bflags;
 133        struct extent_io_tree *tree;
 134        spinlock_t refs_lock;
 135        atomic_t refs;
 136        atomic_t io_pages;
 137        int read_mirror;
 138        struct rcu_head rcu_head;
 139        pid_t lock_owner;
 140
 141        /* count of read lock holders on the extent buffer */
 142        atomic_t write_locks;
 143        atomic_t read_locks;
 144        atomic_t blocking_writers;
 145        atomic_t blocking_readers;
 146        atomic_t spinning_readers;
 147        atomic_t spinning_writers;
 148        int lock_nested;
 149
 150        /* protects write locks */
 151        rwlock_t lock;
 152
 153        /* readers use lock_wq while they wait for the write
 154         * lock holders to unlock
 155         */
 156        wait_queue_head_t write_lock_wq;
 157
 158        /* writers use read_lock_wq while they wait for readers
 159         * to unlock
 160         */
 161        wait_queue_head_t read_lock_wq;
 162        wait_queue_head_t lock_wq;
 163        struct page *pages[INLINE_EXTENT_BUFFER_PAGES];
 164#ifdef CONFIG_BTRFS_DEBUG
 165        struct list_head leak_list;
 166#endif
 167};
 168
 169static inline void extent_set_compress_type(unsigned long *bio_flags,
 170                                            int compress_type)
 171{
 172        *bio_flags |= compress_type << EXTENT_BIO_FLAG_SHIFT;
 173}
 174
 175static inline int extent_compress_type(unsigned long bio_flags)
 176{
 177        return bio_flags >> EXTENT_BIO_FLAG_SHIFT;
 178}
 179
 180struct extent_map_tree;
 181
 182typedef struct extent_map *(get_extent_t)(struct inode *inode,
 183                                          struct page *page,
 184                                          size_t pg_offset,
 185                                          u64 start, u64 len,
 186                                          int create);
 187
 188void extent_io_tree_init(struct extent_io_tree *tree,
 189                         struct address_space *mapping);
 190int try_release_extent_mapping(struct extent_map_tree *map,
 191                               struct extent_io_tree *tree, struct page *page,
 192                               gfp_t mask);
 193int try_release_extent_buffer(struct page *page);
 194int lock_extent(struct extent_io_tree *tree, u64 start, u64 end);
 195int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
 196                     unsigned long bits, struct extent_state **cached);
 197int unlock_extent(struct extent_io_tree *tree, u64 start, u64 end);
 198int unlock_extent_cached(struct extent_io_tree *tree, u64 start, u64 end,
 199                         struct extent_state **cached, gfp_t mask);
 200int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end);
 201int extent_read_full_page(struct extent_io_tree *tree, struct page *page,
 202                          get_extent_t *get_extent, int mirror_num);
 203int __init extent_io_init(void);
 204void extent_io_exit(void);
 205
 206u64 count_range_bits(struct extent_io_tree *tree,
 207                     u64 *start, u64 search_end,
 208                     u64 max_bytes, unsigned long bits, int contig);
 209
 210void free_extent_state(struct extent_state *state);
 211int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end,
 212                   unsigned long bits, int filled,
 213                   struct extent_state *cached_state);
 214int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
 215                      unsigned long bits, gfp_t mask);
 216int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
 217                     unsigned long bits, int wake, int delete,
 218                     struct extent_state **cached, gfp_t mask);
 219int set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
 220                    unsigned long bits, gfp_t mask);
 221int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
 222                   unsigned long bits, u64 *failed_start,
 223                   struct extent_state **cached_state, gfp_t mask);
 224int set_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end,
 225                        struct extent_state **cached_state, gfp_t mask);
 226int clear_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end,
 227                          struct extent_state **cached_state, gfp_t mask);
 228int set_extent_new(struct extent_io_tree *tree, u64 start, u64 end,
 229                   gfp_t mask);
 230int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
 231                     gfp_t mask);
 232int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end,
 233                       gfp_t mask);
 234int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
 235                       unsigned long bits, unsigned long clear_bits,
 236                       struct extent_state **cached_state, gfp_t mask);
 237int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end,
 238                        struct extent_state **cached_state, gfp_t mask);
 239int set_extent_defrag(struct extent_io_tree *tree, u64 start, u64 end,
 240                      struct extent_state **cached_state, gfp_t mask);
 241int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
 242                          u64 *start_ret, u64 *end_ret, unsigned long bits,
 243                          struct extent_state **cached_state);
 244int extent_invalidatepage(struct extent_io_tree *tree,
 245                          struct page *page, unsigned long offset);
 246int extent_write_full_page(struct extent_io_tree *tree, struct page *page,
 247                          get_extent_t *get_extent,
 248                          struct writeback_control *wbc);
 249int extent_write_locked_range(struct extent_io_tree *tree, struct inode *inode,
 250                              u64 start, u64 end, get_extent_t *get_extent,
 251                              int mode);
 252int extent_writepages(struct extent_io_tree *tree,
 253                      struct address_space *mapping,
 254                      get_extent_t *get_extent,
 255                      struct writeback_control *wbc);
 256int btree_write_cache_pages(struct address_space *mapping,
 257                            struct writeback_control *wbc);
 258int extent_readpages(struct extent_io_tree *tree,
 259                     struct address_space *mapping,
 260                     struct list_head *pages, unsigned nr_pages,
 261                     get_extent_t get_extent);
 262int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 263                __u64 start, __u64 len, get_extent_t *get_extent);
 264int set_state_private(struct extent_io_tree *tree, u64 start, u64 private);
 265void extent_cache_csums_dio(struct extent_io_tree *tree, u64 start, u32 csums[],
 266                            int count);
 267void extent_cache_csums(struct extent_io_tree *tree, struct bio *bio,
 268                        int bvec_index, u32 csums[], int count);
 269int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private);
 270void set_page_extent_mapped(struct page *page);
 271
 272struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree,
 273                                          u64 start, unsigned long len);
 274struct extent_buffer *alloc_dummy_extent_buffer(u64 start, unsigned long len);
 275struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src);
 276struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree,
 277                                         u64 start, unsigned long len);
 278void free_extent_buffer(struct extent_buffer *eb);
 279void free_extent_buffer_stale(struct extent_buffer *eb);
 280#define WAIT_NONE       0
 281#define WAIT_COMPLETE   1
 282#define WAIT_PAGE_LOCK  2
 283int read_extent_buffer_pages(struct extent_io_tree *tree,
 284                             struct extent_buffer *eb, u64 start, int wait,
 285                             get_extent_t *get_extent, int mirror_num);
 286void wait_on_extent_buffer_writeback(struct extent_buffer *eb);
 287
 288static inline unsigned long num_extent_pages(u64 start, u64 len)
 289{
 290        return ((start + len + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT) -
 291                (start >> PAGE_CACHE_SHIFT);
 292}
 293
 294static inline struct page *extent_buffer_page(struct extent_buffer *eb,
 295                                              unsigned long i)
 296{
 297        return eb->pages[i];
 298}
 299
 300static inline void extent_buffer_get(struct extent_buffer *eb)
 301{
 302        atomic_inc(&eb->refs);
 303}
 304
 305int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv,
 306                          unsigned long start,
 307                          unsigned long len);
 308void read_extent_buffer(struct extent_buffer *eb, void *dst,
 309                        unsigned long start,
 310                        unsigned long len);
 311void write_extent_buffer(struct extent_buffer *eb, const void *src,
 312                         unsigned long start, unsigned long len);
 313void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,
 314                        unsigned long dst_offset, unsigned long src_offset,
 315                        unsigned long len);
 316void memcpy_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
 317                           unsigned long src_offset, unsigned long len);
 318void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
 319                           unsigned long src_offset, unsigned long len);
 320void memset_extent_buffer(struct extent_buffer *eb, char c,
 321                          unsigned long start, unsigned long len);
 322void clear_extent_buffer_dirty(struct extent_buffer *eb);
 323int set_extent_buffer_dirty(struct extent_buffer *eb);
 324int set_extent_buffer_uptodate(struct extent_buffer *eb);
 325int clear_extent_buffer_uptodate(struct extent_buffer *eb);
 326int extent_buffer_uptodate(struct extent_buffer *eb);
 327int map_private_extent_buffer(struct extent_buffer *eb, unsigned long offset,
 328                      unsigned long min_len, char **map,
 329                      unsigned long *map_start,
 330                      unsigned long *map_len);
 331int extent_range_clear_dirty_for_io(struct inode *inode, u64 start, u64 end);
 332int extent_range_redirty_for_io(struct inode *inode, u64 start, u64 end);
 333int extent_clear_unlock_delalloc(struct inode *inode,
 334                                struct extent_io_tree *tree,
 335                                u64 start, u64 end, struct page *locked_page,
 336                                unsigned long op);
 337struct bio *
 338btrfs_bio_alloc(struct block_device *bdev, u64 first_sector, int nr_vecs,
 339                gfp_t gfp_flags);
 340struct bio *btrfs_io_bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs);
 341struct bio *btrfs_bio_clone(struct bio *bio, gfp_t gfp_mask);
 342
 343struct btrfs_fs_info;
 344
 345int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start,
 346                        u64 length, u64 logical, struct page *page,
 347                        int mirror_num);
 348int end_extent_writepage(struct page *page, int err, u64 start, u64 end);
 349int repair_eb_io_failure(struct btrfs_root *root, struct extent_buffer *eb,
 350                         int mirror_num);
 351#endif
 352