Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 
0003 #ifndef BTRFS_EXTENT_IO_H
0004 #define BTRFS_EXTENT_IO_H
0005 
0006 #include <linux/rbtree.h>
0007 #include <linux/refcount.h>
0008 #include <linux/fiemap.h>
0009 #include <linux/btrfs_tree.h>
0010 #include "compression.h"
0011 #include "ulist.h"
0012 
0013 enum {
0014     EXTENT_BUFFER_UPTODATE,
0015     EXTENT_BUFFER_DIRTY,
0016     EXTENT_BUFFER_CORRUPT,
0017     /* this got triggered by readahead */
0018     EXTENT_BUFFER_READAHEAD,
0019     EXTENT_BUFFER_TREE_REF,
0020     EXTENT_BUFFER_STALE,
0021     EXTENT_BUFFER_WRITEBACK,
0022     /* read IO error */
0023     EXTENT_BUFFER_READ_ERR,
0024     EXTENT_BUFFER_UNMAPPED,
0025     EXTENT_BUFFER_IN_TREE,
0026     /* write IO error */
0027     EXTENT_BUFFER_WRITE_ERR,
0028     EXTENT_BUFFER_NO_CHECK,
0029 };
0030 
0031 /* these are flags for __process_pages_contig */
0032 #define PAGE_UNLOCK     (1 << 0)
0033 /* Page starts writeback, clear dirty bit and set writeback bit */
0034 #define PAGE_START_WRITEBACK    (1 << 1)
0035 #define PAGE_END_WRITEBACK  (1 << 2)
0036 #define PAGE_SET_ORDERED    (1 << 3)
0037 #define PAGE_SET_ERROR      (1 << 4)
0038 #define PAGE_LOCK       (1 << 5)
0039 
0040 /*
0041  * page->private values.  Every page that is controlled by the extent
0042  * map has page->private set to one.
0043  */
0044 #define EXTENT_PAGE_PRIVATE 1
0045 
0046 /*
0047  * The extent buffer bitmap operations are done with byte granularity instead of
0048  * word granularity for two reasons:
0049  * 1. The bitmaps must be little-endian on disk.
0050  * 2. Bitmap items are not guaranteed to be aligned to a word and therefore a
0051  *    single word in a bitmap may straddle two pages in the extent buffer.
0052  */
0053 #define BIT_BYTE(nr) ((nr) / BITS_PER_BYTE)
0054 #define BYTE_MASK ((1 << BITS_PER_BYTE) - 1)
0055 #define BITMAP_FIRST_BYTE_MASK(start) \
0056     ((BYTE_MASK << ((start) & (BITS_PER_BYTE - 1))) & BYTE_MASK)
0057 #define BITMAP_LAST_BYTE_MASK(nbits) \
0058     (BYTE_MASK >> (-(nbits) & (BITS_PER_BYTE - 1)))
0059 
0060 struct btrfs_bio;
0061 struct btrfs_root;
0062 struct btrfs_inode;
0063 struct btrfs_io_bio;
0064 struct btrfs_fs_info;
0065 struct io_failure_record;
0066 struct extent_io_tree;
0067 
0068 typedef void (submit_bio_hook_t)(struct inode *inode, struct bio *bio,
0069                      int mirror_num,
0070                      enum btrfs_compression_type compress_type);
0071 
0072 typedef blk_status_t (extent_submit_bio_start_t)(struct inode *inode,
0073         struct bio *bio, u64 dio_file_offset);
0074 
0075 #define INLINE_EXTENT_BUFFER_PAGES     (BTRFS_MAX_METADATA_BLOCKSIZE / PAGE_SIZE)
0076 struct extent_buffer {
0077     u64 start;
0078     unsigned long len;
0079     unsigned long bflags;
0080     struct btrfs_fs_info *fs_info;
0081     spinlock_t refs_lock;
0082     atomic_t refs;
0083     atomic_t io_pages;
0084     int read_mirror;
0085     struct rcu_head rcu_head;
0086     pid_t lock_owner;
0087     /* >= 0 if eb belongs to a log tree, -1 otherwise */
0088     s8 log_index;
0089 
0090     struct rw_semaphore lock;
0091 
0092     struct page *pages[INLINE_EXTENT_BUFFER_PAGES];
0093     struct list_head release_list;
0094 #ifdef CONFIG_BTRFS_DEBUG
0095     struct list_head leak_list;
0096 #endif
0097 };
0098 
0099 /*
0100  * Structure to record how many bytes and which ranges are set/cleared
0101  */
0102 struct extent_changeset {
0103     /* How many bytes are set/cleared in this operation */
0104     u64 bytes_changed;
0105 
0106     /* Changed ranges */
0107     struct ulist range_changed;
0108 };
0109 
0110 static inline void extent_changeset_init(struct extent_changeset *changeset)
0111 {
0112     changeset->bytes_changed = 0;
0113     ulist_init(&changeset->range_changed);
0114 }
0115 
0116 static inline struct extent_changeset *extent_changeset_alloc(void)
0117 {
0118     struct extent_changeset *ret;
0119 
0120     ret = kmalloc(sizeof(*ret), GFP_KERNEL);
0121     if (!ret)
0122         return NULL;
0123 
0124     extent_changeset_init(ret);
0125     return ret;
0126 }
0127 
0128 static inline void extent_changeset_release(struct extent_changeset *changeset)
0129 {
0130     if (!changeset)
0131         return;
0132     changeset->bytes_changed = 0;
0133     ulist_release(&changeset->range_changed);
0134 }
0135 
0136 static inline void extent_changeset_free(struct extent_changeset *changeset)
0137 {
0138     if (!changeset)
0139         return;
0140     extent_changeset_release(changeset);
0141     kfree(changeset);
0142 }
0143 
0144 struct extent_map_tree;
0145 
0146 int try_release_extent_mapping(struct page *page, gfp_t mask);
0147 int try_release_extent_buffer(struct page *page);
0148 
0149 int btrfs_read_folio(struct file *file, struct folio *folio);
0150 int extent_write_locked_range(struct inode *inode, u64 start, u64 end);
0151 int extent_writepages(struct address_space *mapping,
0152               struct writeback_control *wbc);
0153 int btree_write_cache_pages(struct address_space *mapping,
0154                 struct writeback_control *wbc);
0155 void extent_readahead(struct readahead_control *rac);
0156 int extent_fiemap(struct btrfs_inode *inode, struct fiemap_extent_info *fieinfo,
0157           u64 start, u64 len);
0158 int set_page_extent_mapped(struct page *page);
0159 void clear_page_extent_mapped(struct page *page);
0160 
0161 struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
0162                       u64 start, u64 owner_root, int level);
0163 struct extent_buffer *__alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
0164                           u64 start, unsigned long len);
0165 struct extent_buffer *alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
0166                         u64 start);
0167 struct extent_buffer *btrfs_clone_extent_buffer(const struct extent_buffer *src);
0168 struct extent_buffer *find_extent_buffer(struct btrfs_fs_info *fs_info,
0169                      u64 start);
0170 void free_extent_buffer(struct extent_buffer *eb);
0171 void free_extent_buffer_stale(struct extent_buffer *eb);
0172 #define WAIT_NONE   0
0173 #define WAIT_COMPLETE   1
0174 #define WAIT_PAGE_LOCK  2
0175 int read_extent_buffer_pages(struct extent_buffer *eb, int wait,
0176                  int mirror_num);
0177 void wait_on_extent_buffer_writeback(struct extent_buffer *eb);
0178 void btrfs_readahead_tree_block(struct btrfs_fs_info *fs_info,
0179                 u64 bytenr, u64 owner_root, u64 gen, int level);
0180 void btrfs_readahead_node_child(struct extent_buffer *node, int slot);
0181 
0182 static inline int num_extent_pages(const struct extent_buffer *eb)
0183 {
0184     /*
0185      * For sectorsize == PAGE_SIZE case, since nodesize is always aligned to
0186      * sectorsize, it's just eb->len >> PAGE_SHIFT.
0187      *
0188      * For sectorsize < PAGE_SIZE case, we could have nodesize < PAGE_SIZE,
0189      * thus have to ensure we get at least one page.
0190      */
0191     return (eb->len >> PAGE_SHIFT) ?: 1;
0192 }
0193 
0194 static inline int extent_buffer_uptodate(const struct extent_buffer *eb)
0195 {
0196     return test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
0197 }
0198 
0199 int memcmp_extent_buffer(const struct extent_buffer *eb, const void *ptrv,
0200              unsigned long start, unsigned long len);
0201 void read_extent_buffer(const struct extent_buffer *eb, void *dst,
0202             unsigned long start,
0203             unsigned long len);
0204 int read_extent_buffer_to_user_nofault(const struct extent_buffer *eb,
0205                        void __user *dst, unsigned long start,
0206                        unsigned long len);
0207 void write_extent_buffer_fsid(const struct extent_buffer *eb, const void *src);
0208 void write_extent_buffer_chunk_tree_uuid(const struct extent_buffer *eb,
0209         const void *src);
0210 void write_extent_buffer(const struct extent_buffer *eb, const void *src,
0211              unsigned long start, unsigned long len);
0212 void copy_extent_buffer_full(const struct extent_buffer *dst,
0213                  const struct extent_buffer *src);
0214 void copy_extent_buffer(const struct extent_buffer *dst,
0215             const struct extent_buffer *src,
0216             unsigned long dst_offset, unsigned long src_offset,
0217             unsigned long len);
0218 void memcpy_extent_buffer(const struct extent_buffer *dst,
0219               unsigned long dst_offset, unsigned long src_offset,
0220               unsigned long len);
0221 void memmove_extent_buffer(const struct extent_buffer *dst,
0222                unsigned long dst_offset, unsigned long src_offset,
0223                unsigned long len);
0224 void memzero_extent_buffer(const struct extent_buffer *eb, unsigned long start,
0225                unsigned long len);
0226 int extent_buffer_test_bit(const struct extent_buffer *eb, unsigned long start,
0227                unsigned long pos);
0228 void extent_buffer_bitmap_set(const struct extent_buffer *eb, unsigned long start,
0229                   unsigned long pos, unsigned long len);
0230 void extent_buffer_bitmap_clear(const struct extent_buffer *eb,
0231                 unsigned long start, unsigned long pos,
0232                 unsigned long len);
0233 void clear_extent_buffer_dirty(const struct extent_buffer *eb);
0234 bool set_extent_buffer_dirty(struct extent_buffer *eb);
0235 void set_extent_buffer_uptodate(struct extent_buffer *eb);
0236 void clear_extent_buffer_uptodate(struct extent_buffer *eb);
0237 int extent_buffer_under_io(const struct extent_buffer *eb);
0238 void extent_range_clear_dirty_for_io(struct inode *inode, u64 start, u64 end);
0239 void extent_range_redirty_for_io(struct inode *inode, u64 start, u64 end);
0240 void extent_clear_unlock_delalloc(struct btrfs_inode *inode, u64 start, u64 end,
0241                   struct page *locked_page,
0242                   u32 bits_to_clear, unsigned long page_ops);
0243 
0244 int btrfs_alloc_page_array(unsigned int nr_pages, struct page **page_array);
0245 struct bio *btrfs_bio_alloc(unsigned int nr_iovecs);
0246 struct bio *btrfs_bio_clone_partial(struct bio *orig, u64 offset, u64 size);
0247 
0248 void end_extent_writepage(struct page *page, int err, u64 start, u64 end);
0249 int btrfs_repair_eb_io_failure(const struct extent_buffer *eb, int mirror_num);
0250 
0251 /*
0252  * When IO fails, either with EIO or csum verification fails, we
0253  * try other mirrors that might have a good copy of the data.  This
0254  * io_failure_record is used to record state as we go through all the
0255  * mirrors.  If another mirror has good data, the sector is set up to date
0256  * and things continue.  If a good mirror can't be found, the original
0257  * bio end_io callback is called to indicate things have failed.
0258  */
0259 struct io_failure_record {
0260     struct page *page;
0261     u64 start;
0262     u64 len;
0263     u64 logical;
0264     int this_mirror;
0265     int failed_mirror;
0266     int num_copies;
0267 };
0268 
0269 int btrfs_repair_one_sector(struct inode *inode, struct btrfs_bio *failed_bbio,
0270                 u32 bio_offset, struct page *page, unsigned int pgoff,
0271                 submit_bio_hook_t *submit_bio_hook);
0272 
0273 #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
0274 bool find_lock_delalloc_range(struct inode *inode,
0275                  struct page *locked_page, u64 *start,
0276                  u64 *end);
0277 #endif
0278 struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info,
0279                            u64 start);
0280 
0281 #ifdef CONFIG_BTRFS_DEBUG
0282 void btrfs_extent_buffer_leak_debug_check(struct btrfs_fs_info *fs_info);
0283 #else
0284 #define btrfs_extent_buffer_leak_debug_check(fs_info)   do {} while (0)
0285 #endif
0286 
0287 #endif