LCOV - code coverage report
Current view: top level - fs/btrfs - ordered-data.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-achx @ Mon Jul 31 20:08:12 PDT 2023 Lines: 5 5 100.0 %
Date: 2023-07-31 20:08:12 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : /*
       3             :  * Copyright (C) 2007 Oracle.  All rights reserved.
       4             :  */
       5             : 
       6             : #ifndef BTRFS_ORDERED_DATA_H
       7             : #define BTRFS_ORDERED_DATA_H
       8             : 
       9             : /* one of these per inode */
      10             : struct btrfs_ordered_inode_tree {
      11             :         spinlock_t lock;
      12             :         struct rb_root tree;
      13             :         struct rb_node *last;
      14             : };
      15             : 
      16             : struct btrfs_ordered_sum {
      17             :         /*
      18             :          * Logical start address and length for of the blocks covered by
      19             :          * the sums array.
      20             :          */
      21             :         u64 logical;
      22             :         u32 len;
      23             : 
      24             :         struct list_head list;
      25             :         /* last field is a variable length array of csums */
      26             :         u8 sums[];
      27             : };
      28             : 
      29             : /*
      30             :  * Bits for btrfs_ordered_extent::flags.
      31             :  *
      32             :  * BTRFS_ORDERED_IO_DONE is set when all of the blocks are written.
      33             :  * It is used to make sure metadata is inserted into the tree only once
      34             :  * per extent.
      35             :  *
      36             :  * BTRFS_ORDERED_COMPLETE is set when the extent is removed from the
      37             :  * rbtree, just before waking any waiters.  It is used to indicate the
      38             :  * IO is done and any metadata is inserted into the tree.
      39             :  */
      40             : enum {
      41             :         /*
      42             :          * Different types for ordered extents, one and only one of the 4 types
      43             :          * need to be set when creating ordered extent.
      44             :          *
      45             :          * REGULAR:     For regular non-compressed COW write
      46             :          * NOCOW:       For NOCOW write into existing non-hole extent
      47             :          * PREALLOC:    For NOCOW write into preallocated extent
      48             :          * COMPRESSED:  For compressed COW write
      49             :          */
      50             :         BTRFS_ORDERED_REGULAR,
      51             :         BTRFS_ORDERED_NOCOW,
      52             :         BTRFS_ORDERED_PREALLOC,
      53             :         BTRFS_ORDERED_COMPRESSED,
      54             : 
      55             :         /*
      56             :          * Extra bit for direct io, can only be set for
      57             :          * REGULAR/NOCOW/PREALLOC. No direct io for compressed extent.
      58             :          */
      59             :         BTRFS_ORDERED_DIRECT,
      60             : 
      61             :         /* Extra status bits for ordered extents */
      62             : 
      63             :         /* set when all the pages are written */
      64             :         BTRFS_ORDERED_IO_DONE,
      65             :         /* set when removed from the tree */
      66             :         BTRFS_ORDERED_COMPLETE,
      67             :         /* We had an io error when writing this out */
      68             :         BTRFS_ORDERED_IOERR,
      69             :         /* Set when we have to truncate an extent */
      70             :         BTRFS_ORDERED_TRUNCATED,
      71             :         /* Used during fsync to track already logged extents */
      72             :         BTRFS_ORDERED_LOGGED,
      73             :         /* We have already logged all the csums of the ordered extent */
      74             :         BTRFS_ORDERED_LOGGED_CSUM,
      75             :         /* We wait for this extent to complete in the current transaction */
      76             :         BTRFS_ORDERED_PENDING,
      77             :         /* BTRFS_IOC_ENCODED_WRITE */
      78             :         BTRFS_ORDERED_ENCODED,
      79             : };
      80             : 
      81             : /* BTRFS_ORDERED_* flags that specify the type of the extent. */
      82             : #define BTRFS_ORDERED_TYPE_FLAGS ((1UL << BTRFS_ORDERED_REGULAR) |        \
      83             :                                   (1UL << BTRFS_ORDERED_NOCOW) |  \
      84             :                                   (1UL << BTRFS_ORDERED_PREALLOC) |       \
      85             :                                   (1UL << BTRFS_ORDERED_COMPRESSED) |     \
      86             :                                   (1UL << BTRFS_ORDERED_DIRECT) | \
      87             :                                   (1UL << BTRFS_ORDERED_ENCODED))
      88             : 
      89             : struct btrfs_ordered_extent {
      90             :         /* logical offset in the file */
      91             :         u64 file_offset;
      92             : 
      93             :         /*
      94             :          * These fields directly correspond to the same fields in
      95             :          * btrfs_file_extent_item.
      96             :          */
      97             :         u64 num_bytes;
      98             :         u64 ram_bytes;
      99             :         u64 disk_bytenr;
     100             :         u64 disk_num_bytes;
     101             :         u64 offset;
     102             : 
     103             :         /* number of bytes that still need writing */
     104             :         u64 bytes_left;
     105             : 
     106             :         /*
     107             :          * the end of the ordered extent which is behind it but
     108             :          * didn't update disk_i_size. Please see the comment of
     109             :          * btrfs_ordered_update_i_size();
     110             :          */
     111             :         u64 outstanding_isize;
     112             : 
     113             :         /*
     114             :          * If we get truncated we need to adjust the file extent we enter for
     115             :          * this ordered extent so that we do not expose stale data.
     116             :          */
     117             :         u64 truncated_len;
     118             : 
     119             :         /* flags (described above) */
     120             :         unsigned long flags;
     121             : 
     122             :         /* compression algorithm */
     123             :         int compress_type;
     124             : 
     125             :         /* Qgroup reserved space */
     126             :         int qgroup_rsv;
     127             : 
     128             :         /* reference count */
     129             :         refcount_t refs;
     130             : 
     131             :         /* the inode we belong to */
     132             :         struct inode *inode;
     133             : 
     134             :         /* list of checksums for insertion when the extent io is done */
     135             :         struct list_head list;
     136             : 
     137             :         /* used for fast fsyncs */
     138             :         struct list_head log_list;
     139             : 
     140             :         /* used to wait for the BTRFS_ORDERED_COMPLETE bit */
     141             :         wait_queue_head_t wait;
     142             : 
     143             :         /* our friendly rbtree entry */
     144             :         struct rb_node rb_node;
     145             : 
     146             :         /* a per root list of all the pending ordered extents */
     147             :         struct list_head root_extent_list;
     148             : 
     149             :         struct btrfs_work work;
     150             : 
     151             :         struct completion completion;
     152             :         struct btrfs_work flush_work;
     153             :         struct list_head work_list;
     154             : };
     155             : 
     156             : static inline void
     157     3841783 : btrfs_ordered_inode_tree_init(struct btrfs_ordered_inode_tree *t)
     158             : {
     159     3841783 :         spin_lock_init(&t->lock);
     160     3841252 :         t->tree = RB_ROOT;
     161     3841252 :         t->last = NULL;
     162     3841252 : }
     163             : 
     164             : int btrfs_finish_one_ordered(struct btrfs_ordered_extent *ordered_extent);
     165             : int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent);
     166             : 
     167             : void btrfs_put_ordered_extent(struct btrfs_ordered_extent *entry);
     168             : void btrfs_remove_ordered_extent(struct btrfs_inode *btrfs_inode,
     169             :                                 struct btrfs_ordered_extent *entry);
     170             : bool btrfs_finish_ordered_extent(struct btrfs_ordered_extent *ordered,
     171             :                                  struct page *page, u64 file_offset, u64 len,
     172             :                                  bool uptodate);
     173             : void btrfs_mark_ordered_io_finished(struct btrfs_inode *inode,
     174             :                                 struct page *page, u64 file_offset,
     175             :                                 u64 num_bytes, bool uptodate);
     176             : bool btrfs_dec_test_ordered_pending(struct btrfs_inode *inode,
     177             :                                     struct btrfs_ordered_extent **cached,
     178             :                                     u64 file_offset, u64 io_size);
     179             : struct btrfs_ordered_extent *btrfs_alloc_ordered_extent(
     180             :                         struct btrfs_inode *inode, u64 file_offset,
     181             :                         u64 num_bytes, u64 ram_bytes, u64 disk_bytenr,
     182             :                         u64 disk_num_bytes, u64 offset, unsigned long flags,
     183             :                         int compress_type);
     184             : void btrfs_add_ordered_sum(struct btrfs_ordered_extent *entry,
     185             :                            struct btrfs_ordered_sum *sum);
     186             : struct btrfs_ordered_extent *btrfs_lookup_ordered_extent(struct btrfs_inode *inode,
     187             :                                                          u64 file_offset);
     188             : void btrfs_start_ordered_extent(struct btrfs_ordered_extent *entry);
     189             : int btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len);
     190             : struct btrfs_ordered_extent *
     191             : btrfs_lookup_first_ordered_extent(struct btrfs_inode *inode, u64 file_offset);
     192             : struct btrfs_ordered_extent *btrfs_lookup_first_ordered_range(
     193             :                         struct btrfs_inode *inode, u64 file_offset, u64 len);
     194             : struct btrfs_ordered_extent *btrfs_lookup_ordered_range(
     195             :                 struct btrfs_inode *inode,
     196             :                 u64 file_offset,
     197             :                 u64 len);
     198             : void btrfs_get_ordered_extents_for_logging(struct btrfs_inode *inode,
     199             :                                            struct list_head *list);
     200             : u64 btrfs_wait_ordered_extents(struct btrfs_root *root, u64 nr,
     201             :                                const u64 range_start, const u64 range_len);
     202             : void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, u64 nr,
     203             :                               const u64 range_start, const u64 range_len);
     204             : void btrfs_lock_and_flush_ordered_range(struct btrfs_inode *inode, u64 start,
     205             :                                         u64 end,
     206             :                                         struct extent_state **cached_state);
     207             : bool btrfs_try_lock_ordered_range(struct btrfs_inode *inode, u64 start, u64 end,
     208             :                                   struct extent_state **cached_state);
     209             : struct btrfs_ordered_extent *btrfs_split_ordered_extent(
     210             :                         struct btrfs_ordered_extent *ordered, u64 len);
     211             : int __init ordered_data_init(void);
     212             : void __cold ordered_data_exit(void);
     213             : 
     214             : #endif

Generated by: LCOV version 1.14