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