brintos

brintos / linux-shallow public Read only

0
0
Text · 6.5 KiB · 4e15273 Raw
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