linux/fs/btrfs/extent_io.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2
   3#ifndef BTRFS_EXTENT_IO_H
   4#define BTRFS_EXTENT_IO_H
   5
   6#include <linux/rbtree.h>
   7#include <linux/refcount.h>
   8#include <linux/fiemap.h>
   9#include "ulist.h"
  10
  11/*
  12 * flags for bio submission. The high bits indicate the compression
  13 * type for this bio
  14 */
  15#define EXTENT_BIO_COMPRESSED 1
  16#define EXTENT_BIO_FLAG_SHIFT 16
  17
  18enum {
  19        EXTENT_BUFFER_UPTODATE,
  20        EXTENT_BUFFER_DIRTY,
  21        EXTENT_BUFFER_CORRUPT,
  22        /* this got triggered by readahead */
  23        EXTENT_BUFFER_READAHEAD,
  24        EXTENT_BUFFER_TREE_REF,
  25        EXTENT_BUFFER_STALE,
  26        EXTENT_BUFFER_WRITEBACK,
  27        /* read IO error */
  28        EXTENT_BUFFER_READ_ERR,
  29        EXTENT_BUFFER_UNMAPPED,
  30        EXTENT_BUFFER_IN_TREE,
  31        /* write IO error */
  32        EXTENT_BUFFER_WRITE_ERR,
  33};
  34
  35/* these are flags for __process_pages_contig */
  36#define PAGE_UNLOCK             (1 << 0)
  37#define PAGE_CLEAR_DIRTY        (1 << 1)
  38#define PAGE_SET_WRITEBACK      (1 << 2)
  39#define PAGE_END_WRITEBACK      (1 << 3)
  40#define PAGE_SET_PRIVATE2       (1 << 4)
  41#define PAGE_SET_ERROR          (1 << 5)
  42#define PAGE_LOCK               (1 << 6)
  43
  44/*
  45 * page->private values.  Every page that is controlled by the extent
  46 * map has page->private set to one.
  47 */
  48#define EXTENT_PAGE_PRIVATE 1
  49
  50/*
  51 * The extent buffer bitmap operations are done with byte granularity instead of
  52 * word granularity for two reasons:
  53 * 1. The bitmaps must be little-endian on disk.
  54 * 2. Bitmap items are not guaranteed to be aligned to a word and therefore a
  55 *    single word in a bitmap may straddle two pages in the extent buffer.
  56 */
  57#define BIT_BYTE(nr) ((nr) / BITS_PER_BYTE)
  58#define BYTE_MASK ((1 << BITS_PER_BYTE) - 1)
  59#define BITMAP_FIRST_BYTE_MASK(start) \
  60        ((BYTE_MASK << ((start) & (BITS_PER_BYTE - 1))) & BYTE_MASK)
  61#define BITMAP_LAST_BYTE_MASK(nbits) \
  62        (BYTE_MASK >> (-(nbits) & (BITS_PER_BYTE - 1)))
  63
  64struct btrfs_root;
  65struct btrfs_inode;
  66struct btrfs_io_bio;
  67struct io_failure_record;
  68struct extent_io_tree;
  69
  70typedef blk_status_t (submit_bio_hook_t)(struct inode *inode, struct bio *bio,
  71                                         int mirror_num,
  72                                         unsigned long bio_flags);
  73
  74typedef blk_status_t (extent_submit_bio_start_t)(void *private_data,
  75                struct bio *bio, u64 bio_offset);
  76
  77struct extent_io_ops {
  78        /*
  79         * The following callbacks must be always defined, the function
  80         * pointer will be called unconditionally.
  81         */
  82        submit_bio_hook_t *submit_bio_hook;
  83        int (*readpage_end_io_hook)(struct btrfs_io_bio *io_bio, u64 phy_offset,
  84                                    struct page *page, u64 start, u64 end,
  85                                    int mirror);
  86};
  87
  88
  89#define INLINE_EXTENT_BUFFER_PAGES 16
  90#define MAX_INLINE_EXTENT_BUFFER_SIZE (INLINE_EXTENT_BUFFER_PAGES * PAGE_SIZE)
  91struct extent_buffer {
  92        u64 start;
  93        unsigned long len;
  94        unsigned long bflags;
  95        struct btrfs_fs_info *fs_info;
  96        spinlock_t refs_lock;
  97        atomic_t refs;
  98        atomic_t io_pages;
  99        int read_mirror;
 100        struct rcu_head rcu_head;
 101        pid_t lock_owner;
 102
 103        int blocking_writers;
 104        atomic_t blocking_readers;
 105        bool lock_nested;
 106        /* >= 0 if eb belongs to a log tree, -1 otherwise */
 107        short log_index;
 108
 109        /* protects write locks */
 110        rwlock_t lock;
 111
 112        /* readers use lock_wq while they wait for the write
 113         * lock holders to unlock
 114         */
 115        wait_queue_head_t write_lock_wq;
 116
 117        /* writers use read_lock_wq while they wait for readers
 118         * to unlock
 119         */
 120        wait_queue_head_t read_lock_wq;
 121        struct page *pages[INLINE_EXTENT_BUFFER_PAGES];
 122#ifdef CONFIG_BTRFS_DEBUG
 123        int spinning_writers;
 124        atomic_t spinning_readers;
 125        atomic_t read_locks;
 126        int write_locks;
 127        struct list_head leak_list;
 128#endif
 129};
 130
 131/*
 132 * Structure to record how many bytes and which ranges are set/cleared
 133 */
 134struct extent_changeset {
 135        /* How many bytes are set/cleared in this operation */
 136        unsigned int bytes_changed;
 137
 138        /* Changed ranges */
 139        struct ulist range_changed;
 140};
 141
 142static inline void extent_changeset_init(struct extent_changeset *changeset)
 143{
 144        changeset->bytes_changed = 0;
 145        ulist_init(&changeset->range_changed);
 146}
 147
 148static inline struct extent_changeset *extent_changeset_alloc(void)
 149{
 150        struct extent_changeset *ret;
 151
 152        ret = kmalloc(sizeof(*ret), GFP_KERNEL);
 153        if (!ret)
 154                return NULL;
 155
 156        extent_changeset_init(ret);
 157        return ret;
 158}
 159
 160static inline void extent_changeset_release(struct extent_changeset *changeset)
 161{
 162        if (!changeset)
 163                return;
 164        changeset->bytes_changed = 0;
 165        ulist_release(&changeset->range_changed);
 166}
 167
 168static inline void extent_changeset_free(struct extent_changeset *changeset)
 169{
 170        if (!changeset)
 171                return;
 172        extent_changeset_release(changeset);
 173        kfree(changeset);
 174}
 175
 176static inline void extent_set_compress_type(unsigned long *bio_flags,
 177                                            int compress_type)
 178{
 179        *bio_flags |= compress_type << EXTENT_BIO_FLAG_SHIFT;
 180}
 181
 182static inline int extent_compress_type(unsigned long bio_flags)
 183{
 184        return bio_flags >> EXTENT_BIO_FLAG_SHIFT;
 185}
 186
 187struct extent_map_tree;
 188
 189typedef struct extent_map *(get_extent_t)(struct btrfs_inode *inode,
 190                                          struct page *page, size_t pg_offset,
 191                                          u64 start, u64 len);
 192
 193int try_release_extent_mapping(struct page *page, gfp_t mask);
 194int try_release_extent_buffer(struct page *page);
 195
 196int extent_read_full_page(struct page *page, get_extent_t *get_extent,
 197                          int mirror_num);
 198int extent_write_full_page(struct page *page, struct writeback_control *wbc);
 199int extent_write_locked_range(struct inode *inode, u64 start, u64 end,
 200                              int mode);
 201int extent_writepages(struct address_space *mapping,
 202                      struct writeback_control *wbc);
 203int btree_write_cache_pages(struct address_space *mapping,
 204                            struct writeback_control *wbc);
 205void extent_readahead(struct readahead_control *rac);
 206int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 207                  u64 start, u64 len);
 208void set_page_extent_mapped(struct page *page);
 209
 210struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
 211                                          u64 start);
 212struct extent_buffer *__alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
 213                                                  u64 start, unsigned long len);
 214struct extent_buffer *alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
 215                                                u64 start);
 216struct extent_buffer *btrfs_clone_extent_buffer(const struct extent_buffer *src);
 217struct extent_buffer *find_extent_buffer(struct btrfs_fs_info *fs_info,
 218                                         u64 start);
 219void free_extent_buffer(struct extent_buffer *eb);
 220void free_extent_buffer_stale(struct extent_buffer *eb);
 221#define WAIT_NONE       0
 222#define WAIT_COMPLETE   1
 223#define WAIT_PAGE_LOCK  2
 224int read_extent_buffer_pages(struct extent_buffer *eb, int wait,
 225                             int mirror_num);
 226void wait_on_extent_buffer_writeback(struct extent_buffer *eb);
 227
 228static inline int num_extent_pages(const struct extent_buffer *eb)
 229{
 230        return (round_up(eb->start + eb->len, PAGE_SIZE) >> PAGE_SHIFT) -
 231               (eb->start >> PAGE_SHIFT);
 232}
 233
 234static inline int extent_buffer_uptodate(const struct extent_buffer *eb)
 235{
 236        return test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
 237}
 238
 239int memcmp_extent_buffer(const struct extent_buffer *eb, const void *ptrv,
 240                         unsigned long start, unsigned long len);
 241void read_extent_buffer(const struct extent_buffer *eb, void *dst,
 242                        unsigned long start,
 243                        unsigned long len);
 244int read_extent_buffer_to_user_nofault(const struct extent_buffer *eb,
 245                                       void __user *dst, unsigned long start,
 246                                       unsigned long len);
 247void write_extent_buffer_fsid(const struct extent_buffer *eb, const void *src);
 248void write_extent_buffer_chunk_tree_uuid(const struct extent_buffer *eb,
 249                const void *src);
 250void write_extent_buffer(const struct extent_buffer *eb, const void *src,
 251                         unsigned long start, unsigned long len);
 252void copy_extent_buffer_full(const struct extent_buffer *dst,
 253                             const struct extent_buffer *src);
 254void copy_extent_buffer(const struct extent_buffer *dst,
 255                        const struct extent_buffer *src,
 256                        unsigned long dst_offset, unsigned long src_offset,
 257                        unsigned long len);
 258void memcpy_extent_buffer(const struct extent_buffer *dst,
 259                          unsigned long dst_offset, unsigned long src_offset,
 260                          unsigned long len);
 261void memmove_extent_buffer(const struct extent_buffer *dst,
 262                           unsigned long dst_offset, unsigned long src_offset,
 263                           unsigned long len);
 264void memzero_extent_buffer(const struct extent_buffer *eb, unsigned long start,
 265                           unsigned long len);
 266int extent_buffer_test_bit(const struct extent_buffer *eb, unsigned long start,
 267                           unsigned long pos);
 268void extent_buffer_bitmap_set(const struct extent_buffer *eb, unsigned long start,
 269                              unsigned long pos, unsigned long len);
 270void extent_buffer_bitmap_clear(const struct extent_buffer *eb,
 271                                unsigned long start, unsigned long pos,
 272                                unsigned long len);
 273void clear_extent_buffer_dirty(const struct extent_buffer *eb);
 274bool set_extent_buffer_dirty(struct extent_buffer *eb);
 275void set_extent_buffer_uptodate(struct extent_buffer *eb);
 276void clear_extent_buffer_uptodate(struct extent_buffer *eb);
 277int extent_buffer_under_io(const struct extent_buffer *eb);
 278void extent_range_clear_dirty_for_io(struct inode *inode, u64 start, u64 end);
 279void extent_range_redirty_for_io(struct inode *inode, u64 start, u64 end);
 280void extent_clear_unlock_delalloc(struct btrfs_inode *inode, u64 start, u64 end,
 281                                  struct page *locked_page,
 282                                  unsigned bits_to_clear,
 283                                  unsigned long page_ops);
 284struct bio *btrfs_bio_alloc(u64 first_byte);
 285struct bio *btrfs_io_bio_alloc(unsigned int nr_iovecs);
 286struct bio *btrfs_bio_clone(struct bio *bio);
 287struct bio *btrfs_bio_clone_partial(struct bio *orig, int offset, int size);
 288
 289struct btrfs_fs_info;
 290struct btrfs_inode;
 291
 292int repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start,
 293                      u64 length, u64 logical, struct page *page,
 294                      unsigned int pg_offset, int mirror_num);
 295void end_extent_writepage(struct page *page, int err, u64 start, u64 end);
 296int btrfs_repair_eb_io_failure(const struct extent_buffer *eb, int mirror_num);
 297
 298/*
 299 * When IO fails, either with EIO or csum verification fails, we
 300 * try other mirrors that might have a good copy of the data.  This
 301 * io_failure_record is used to record state as we go through all the
 302 * mirrors.  If another mirror has good data, the page is set up to date
 303 * and things continue.  If a good mirror can't be found, the original
 304 * bio end_io callback is called to indicate things have failed.
 305 */
 306struct io_failure_record {
 307        struct page *page;
 308        u64 start;
 309        u64 len;
 310        u64 logical;
 311        unsigned long bio_flags;
 312        int this_mirror;
 313        int failed_mirror;
 314        int in_validation;
 315};
 316
 317
 318blk_status_t btrfs_submit_read_repair(struct inode *inode,
 319                                      struct bio *failed_bio, u64 phy_offset,
 320                                      struct page *page, unsigned int pgoff,
 321                                      u64 start, u64 end, int failed_mirror,
 322                                      submit_bio_hook_t *submit_bio_hook);
 323
 324#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
 325bool find_lock_delalloc_range(struct inode *inode,
 326                             struct page *locked_page, u64 *start,
 327                             u64 *end);
 328#endif
 329struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info,
 330                                               u64 start);
 331
 332#ifdef CONFIG_BTRFS_DEBUG
 333void btrfs_extent_buffer_leak_debug_check(struct btrfs_fs_info *fs_info);
 334#else
 335#define btrfs_extent_buffer_leak_debug_check(fs_info)   do {} while (0)
 336#endif
 337
 338#endif
 339