diff options
Diffstat (limited to 'fs/btrfs/ctree.h')
| -rw-r--r-- | fs/btrfs/ctree.h | 298 | 
1 files changed, 259 insertions, 39 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 0d195b50766..547b7b05727 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -48,7 +48,7 @@ struct btrfs_ordered_sum;  #define BTRFS_MAGIC "_BHRfS_M" -#define BTRFS_MAX_MIRRORS 2 +#define BTRFS_MAX_MIRRORS 3  #define BTRFS_MAX_LEVEL 8 @@ -116,7 +116,7 @@ struct btrfs_ordered_sum;  #define BTRFS_FREE_SPACE_OBJECTID -11ULL  /* - * The inode number assigned to the special inode for sotring + * The inode number assigned to the special inode for storing   * free ino cache   */  #define BTRFS_FREE_INO_OBJECTID -12ULL @@ -142,6 +142,8 @@ struct btrfs_ordered_sum;  #define BTRFS_EMPTY_SUBVOL_DIR_OBJECTID 2 +#define BTRFS_DEV_REPLACE_DEVID 0 +  /*   * the max metadata block size.  This limit is somewhat artificial,   * but the memmove costs go through the roof for larger blocks. @@ -154,6 +156,13 @@ struct btrfs_ordered_sum;   */  #define BTRFS_NAME_LEN 255 +/* + * Theoretical limit is larger, but we keep this down to a sane + * value. That should limit greatly the possibility of collisions on + * inode ref items. + */ +#define BTRFS_LINK_MAX 65535U +  /* 32 bytes in various csum fields */  #define BTRFS_CSUM_SIZE 32 @@ -165,6 +174,9 @@ static int btrfs_csum_sizes[] = { 4, 0 };  /* four bytes for CRC32 */  #define BTRFS_EMPTY_DIR_SIZE 0 +/* spefic to btrfs_map_block(), therefore not in include/linux/blk_types.h */ +#define REQ_GET_READ_MIRRORS	(1 << 30) +  #define BTRFS_FT_UNKNOWN	0  #define BTRFS_FT_REG_FILE	1  #define BTRFS_FT_DIR		2 @@ -406,7 +418,7 @@ struct btrfs_root_backup {  	__le64 bytes_used;  	__le64 num_devices;  	/* future */ -	__le64 unsed_64[4]; +	__le64 unused_64[4];  	u8 tree_root_level;  	u8 chunk_root_level; @@ -489,6 +501,8 @@ struct btrfs_super_block {   */  #define BTRFS_FEATURE_INCOMPAT_BIG_METADATA	(1ULL << 5) +#define BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF	(1ULL << 6) +  #define BTRFS_FEATURE_COMPAT_SUPP		0ULL  #define BTRFS_FEATURE_COMPAT_RO_SUPP		0ULL  #define BTRFS_FEATURE_INCOMPAT_SUPP			\ @@ -496,7 +510,8 @@ struct btrfs_super_block {  	 BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL |	\  	 BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS |		\  	 BTRFS_FEATURE_INCOMPAT_BIG_METADATA |		\ -	 BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO) +	 BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO |		\ +	 BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF)  /*   * A leaf is full of items. offset and size tell us where to find @@ -561,6 +576,7 @@ struct btrfs_path {  	unsigned int skip_locking:1;  	unsigned int leave_spinning:1;  	unsigned int search_commit_root:1; +	unsigned int really_keep_locks:1;  };  /* @@ -643,6 +659,14 @@ struct btrfs_inode_ref {  	/* name goes here */  } __attribute__ ((__packed__)); +struct btrfs_inode_extref { +	__le64 parent_objectid; +	__le64 index; +	__le16 name_len; +	__u8   name[0]; +	/* name goes here */ +} __attribute__ ((__packed__)); +  struct btrfs_timespec {  	__le64 sec;  	__le32 nsec; @@ -867,6 +891,59 @@ struct btrfs_dev_stats_item {  	__le64 values[BTRFS_DEV_STAT_VALUES_MAX];  } __attribute__ ((__packed__)); +#define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_ALWAYS	0 +#define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_AVOID	1 +#define BTRFS_DEV_REPLACE_ITEM_STATE_NEVER_STARTED	0 +#define BTRFS_DEV_REPLACE_ITEM_STATE_STARTED		1 +#define BTRFS_DEV_REPLACE_ITEM_STATE_SUSPENDED		2 +#define BTRFS_DEV_REPLACE_ITEM_STATE_FINISHED		3 +#define BTRFS_DEV_REPLACE_ITEM_STATE_CANCELED		4 + +struct btrfs_dev_replace { +	u64 replace_state;	/* see #define above */ +	u64 time_started;	/* seconds since 1-Jan-1970 */ +	u64 time_stopped;	/* seconds since 1-Jan-1970 */ +	atomic64_t num_write_errors; +	atomic64_t num_uncorrectable_read_errors; + +	u64 cursor_left; +	u64 committed_cursor_left; +	u64 cursor_left_last_write_of_item; +	u64 cursor_right; + +	u64 cont_reading_from_srcdev_mode;	/* see #define above */ + +	int is_valid; +	int item_needs_writeback; +	struct btrfs_device *srcdev; +	struct btrfs_device *tgtdev; + +	pid_t lock_owner; +	atomic_t nesting_level; +	struct mutex lock_finishing_cancel_unmount; +	struct mutex lock_management_lock; +	struct mutex lock; + +	struct btrfs_scrub_progress scrub_progress; +}; + +struct btrfs_dev_replace_item { +	/* +	 * grow this item struct at the end for future enhancements and keep +	 * the existing values unchanged +	 */ +	__le64 src_devid; +	__le64 cursor_left; +	__le64 cursor_right; +	__le64 cont_reading_from_srcdev_mode; + +	__le64 replace_state; +	__le64 time_started; +	__le64 time_stopped; +	__le64 num_write_errors; +	__le64 num_uncorrectable_read_errors; +} __attribute__ ((__packed__)); +  /* different types of block groups (and chunks) */  #define BTRFS_BLOCK_GROUP_DATA		(1ULL << 0)  #define BTRFS_BLOCK_GROUP_SYSTEM	(1ULL << 1) @@ -1028,12 +1105,22 @@ struct btrfs_space_info {  	wait_queue_head_t wait;  }; +#define	BTRFS_BLOCK_RSV_GLOBAL		1 +#define	BTRFS_BLOCK_RSV_DELALLOC	2 +#define	BTRFS_BLOCK_RSV_TRANS		3 +#define	BTRFS_BLOCK_RSV_CHUNK		4 +#define	BTRFS_BLOCK_RSV_DELOPS		5 +#define	BTRFS_BLOCK_RSV_EMPTY		6 +#define	BTRFS_BLOCK_RSV_TEMP		7 +  struct btrfs_block_rsv {  	u64 size;  	u64 reserved;  	struct btrfs_space_info *space_info;  	spinlock_t lock; -	unsigned int full; +	unsigned short full; +	unsigned short type; +	unsigned short failfast;  };  /* @@ -1127,6 +1214,9 @@ struct btrfs_block_group_cache {  	 * Today it will only have one thing on it, but that may change  	 */  	struct list_head cluster_list; + +	/* For delayed block group creation */ +	struct list_head new_bg_list;  };  /* delayed seq elem */ @@ -1240,7 +1330,6 @@ struct btrfs_fs_info {  	struct mutex reloc_mutex;  	struct list_head trans_list; -	struct list_head hashers;  	struct list_head dead_roots;  	struct list_head caching_block_groups; @@ -1303,6 +1392,7 @@ struct btrfs_fs_info {  	struct btrfs_workers generic_worker;  	struct btrfs_workers workers;  	struct btrfs_workers delalloc_workers; +	struct btrfs_workers flush_workers;  	struct btrfs_workers endio_workers;  	struct btrfs_workers endio_meta_workers;  	struct btrfs_workers endio_meta_write_workers; @@ -1366,9 +1456,6 @@ struct btrfs_fs_info {  	struct rb_root defrag_inodes;  	atomic_t defrag_running; -	spinlock_t ref_cache_lock; -	u64 total_ref_cache_size; -  	/*  	 * these three are in extended format (availability of single  	 * chunks is denoted by BTRFS_AVAIL_ALLOC_BIT_SINGLE bit, other @@ -1402,6 +1489,8 @@ struct btrfs_fs_info {  	struct rw_semaphore scrub_super_lock;  	int scrub_workers_refcnt;  	struct btrfs_workers scrub_workers; +	struct btrfs_workers scrub_wr_completion_workers; +	struct btrfs_workers scrub_nocow_workers;  #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY  	u32 check_integrity_print_mask; @@ -1441,6 +1530,13 @@ struct btrfs_fs_info {  	/* next backup root to be overwritten */  	int backup_root_index; + +	int num_tolerated_disk_barrier_failures; + +	/* device replace state */ +	struct btrfs_dev_replace dev_replace; + +	atomic_t mutually_exclusive_operation_running;  };  /* @@ -1481,9 +1577,9 @@ struct btrfs_root {  	wait_queue_head_t log_commit_wait[2];  	atomic_t log_writers;  	atomic_t log_commit[2]; +	atomic_t log_batch;  	unsigned long log_transid;  	unsigned long last_log_commit; -	unsigned long log_batch;  	pid_t log_start_pid;  	bool log_multiple_pids; @@ -1550,7 +1646,7 @@ struct btrfs_root {  	int force_cow; -	spinlock_t root_times_lock; +	spinlock_t root_item_lock;  };  struct btrfs_ioctl_defrag_range_args { @@ -1592,6 +1688,7 @@ struct btrfs_ioctl_defrag_range_args {   */  #define BTRFS_INODE_ITEM_KEY		1  #define BTRFS_INODE_REF_KEY		12 +#define BTRFS_INODE_EXTREF_KEY		13  #define BTRFS_XATTR_ITEM_KEY		24  #define BTRFS_ORPHAN_ITEM_KEY		48  /* reserve 2-15 close to the inode for later flexibility */ @@ -1693,6 +1790,12 @@ struct btrfs_ioctl_defrag_range_args {  #define BTRFS_DEV_STATS_KEY	249  /* + * Persistantly stores the device replace state in the device tree. + * The key is built like this: (0, BTRFS_DEV_REPLACE_KEY, 0). + */ +#define BTRFS_DEV_REPLACE_KEY	250 + +/*   * string items are for debugging.  They just store a short string of   * data in the FS   */ @@ -1757,7 +1860,7 @@ struct btrfs_map_token {  static inline void btrfs_init_map_token (struct btrfs_map_token *token)  { -	memset(token, 0, sizeof(*token)); +	token->kaddr = NULL;  }  /* some macros to generate set/get funcs for the struct fields.  This @@ -1978,6 +2081,13 @@ BTRFS_SETGET_STACK_FUNCS(block_group_flags,  BTRFS_SETGET_FUNCS(inode_ref_name_len, struct btrfs_inode_ref, name_len, 16);  BTRFS_SETGET_FUNCS(inode_ref_index, struct btrfs_inode_ref, index, 64); +/* struct btrfs_inode_extref */ +BTRFS_SETGET_FUNCS(inode_extref_parent, struct btrfs_inode_extref, +		   parent_objectid, 64); +BTRFS_SETGET_FUNCS(inode_extref_name_len, struct btrfs_inode_extref, +		   name_len, 16); +BTRFS_SETGET_FUNCS(inode_extref_index, struct btrfs_inode_extref, index, 64); +  /* struct btrfs_inode_item */  BTRFS_SETGET_FUNCS(inode_generation, struct btrfs_inode_item, generation, 64);  BTRFS_SETGET_FUNCS(inode_sequence, struct btrfs_inode_item, sequence, 64); @@ -2718,6 +2828,49 @@ BTRFS_SETGET_FUNCS(qgroup_limit_rsv_rfer, struct btrfs_qgroup_limit_item,  BTRFS_SETGET_FUNCS(qgroup_limit_rsv_excl, struct btrfs_qgroup_limit_item,  		   rsv_excl, 64); +/* btrfs_dev_replace_item */ +BTRFS_SETGET_FUNCS(dev_replace_src_devid, +		   struct btrfs_dev_replace_item, src_devid, 64); +BTRFS_SETGET_FUNCS(dev_replace_cont_reading_from_srcdev_mode, +		   struct btrfs_dev_replace_item, cont_reading_from_srcdev_mode, +		   64); +BTRFS_SETGET_FUNCS(dev_replace_replace_state, struct btrfs_dev_replace_item, +		   replace_state, 64); +BTRFS_SETGET_FUNCS(dev_replace_time_started, struct btrfs_dev_replace_item, +		   time_started, 64); +BTRFS_SETGET_FUNCS(dev_replace_time_stopped, struct btrfs_dev_replace_item, +		   time_stopped, 64); +BTRFS_SETGET_FUNCS(dev_replace_num_write_errors, struct btrfs_dev_replace_item, +		   num_write_errors, 64); +BTRFS_SETGET_FUNCS(dev_replace_num_uncorrectable_read_errors, +		   struct btrfs_dev_replace_item, num_uncorrectable_read_errors, +		   64); +BTRFS_SETGET_FUNCS(dev_replace_cursor_left, struct btrfs_dev_replace_item, +		   cursor_left, 64); +BTRFS_SETGET_FUNCS(dev_replace_cursor_right, struct btrfs_dev_replace_item, +		   cursor_right, 64); + +BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_src_devid, +			 struct btrfs_dev_replace_item, src_devid, 64); +BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_cont_reading_from_srcdev_mode, +			 struct btrfs_dev_replace_item, +			 cont_reading_from_srcdev_mode, 64); +BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_replace_state, +			 struct btrfs_dev_replace_item, replace_state, 64); +BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_time_started, +			 struct btrfs_dev_replace_item, time_started, 64); +BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_time_stopped, +			 struct btrfs_dev_replace_item, time_stopped, 64); +BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_num_write_errors, +			 struct btrfs_dev_replace_item, num_write_errors, 64); +BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_num_uncorrectable_read_errors, +			 struct btrfs_dev_replace_item, +			 num_uncorrectable_read_errors, 64); +BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_cursor_left, +			 struct btrfs_dev_replace_item, cursor_left, 64); +BTRFS_SETGET_STACK_FUNCS(stack_dev_replace_cursor_right, +			 struct btrfs_dev_replace_item, cursor_right, 64); +  static inline struct btrfs_fs_info *btrfs_sb(struct super_block *sb)  {  	return sb->s_fs_info; @@ -2858,9 +3011,23 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans,  			   u64 size);  int btrfs_remove_block_group(struct btrfs_trans_handle *trans,  			     struct btrfs_root *root, u64 group_start); +void btrfs_create_pending_block_groups(struct btrfs_trans_handle *trans, +				       struct btrfs_root *root);  u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags);  u64 btrfs_get_alloc_profile(struct btrfs_root *root, int data);  void btrfs_clear_space_info_full(struct btrfs_fs_info *info); + +enum btrfs_reserve_flush_enum { +	/* If we are in the transaction, we can't flush anything.*/ +	BTRFS_RESERVE_NO_FLUSH, +	/* +	 * Flushing delalloc may cause deadlock somewhere, in this +	 * case, use FLUSH LIMIT +	 */ +	BTRFS_RESERVE_FLUSH_LIMIT, +	BTRFS_RESERVE_FLUSH_ALL, +}; +  int btrfs_check_data_free_space(struct inode *inode, u64 bytes);  void btrfs_free_reserved_data_space(struct inode *inode, u64 bytes);  void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans, @@ -2874,24 +3041,19 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes);  void btrfs_delalloc_release_metadata(struct inode *inode, u64 num_bytes);  int btrfs_delalloc_reserve_space(struct inode *inode, u64 num_bytes);  void btrfs_delalloc_release_space(struct inode *inode, u64 num_bytes); -void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv); -struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root); +void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, unsigned short type); +struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root, +					      unsigned short type);  void btrfs_free_block_rsv(struct btrfs_root *root,  			  struct btrfs_block_rsv *rsv);  int btrfs_block_rsv_add(struct btrfs_root *root, -			struct btrfs_block_rsv *block_rsv, -			u64 num_bytes); -int btrfs_block_rsv_add_noflush(struct btrfs_root *root, -				struct btrfs_block_rsv *block_rsv, -				u64 num_bytes); +			struct btrfs_block_rsv *block_rsv, u64 num_bytes, +			enum btrfs_reserve_flush_enum flush);  int btrfs_block_rsv_check(struct btrfs_root *root,  			  struct btrfs_block_rsv *block_rsv, int min_factor);  int btrfs_block_rsv_refill(struct btrfs_root *root, -			  struct btrfs_block_rsv *block_rsv, -			  u64 min_reserved); -int btrfs_block_rsv_refill_noflush(struct btrfs_root *root, -				   struct btrfs_block_rsv *block_rsv, -				   u64 min_reserved); +			   struct btrfs_block_rsv *block_rsv, u64 min_reserved, +			   enum btrfs_reserve_flush_enum flush);  int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv,  			    struct btrfs_block_rsv *dst_rsv,  			    u64 num_bytes); @@ -2915,6 +3077,7 @@ int btrfs_trim_fs(struct btrfs_root *root, struct fstrim_range *range);  int btrfs_init_space_info(struct btrfs_fs_info *fs_info);  int btrfs_delayed_refs_qgroup_accounting(struct btrfs_trans_handle *trans,  					 struct btrfs_fs_info *fs_info); +int __get_raid_index(u64 flags);  /* ctree.c */  int btrfs_bin_search(struct extent_buffer *eb, struct btrfs_key *key,  		     int level, int *slot); @@ -3025,6 +3188,9 @@ static inline int btrfs_insert_empty_item(struct btrfs_trans_handle *trans,  }  int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path); +int btrfs_next_leaf_write(struct btrfs_trans_handle *trans, +			  struct btrfs_root *root, struct btrfs_path *path, +			  int del);  int btrfs_next_old_leaf(struct btrfs_root *root, struct btrfs_path *path,  			u64 time_seq);  static inline int btrfs_next_old_item(struct btrfs_root *root, @@ -3080,6 +3246,7 @@ static inline u64 btrfs_inc_tree_mod_seq(struct btrfs_fs_info *fs_info)  {  	return atomic_inc_return(&fs_info->tree_mod_seq);  } +int btrfs_old_root_level(struct btrfs_root *root, u64 time_seq);  /* root-item.c */  int btrfs_find_root_ref(struct btrfs_root *tree_root, @@ -3116,6 +3283,8 @@ void btrfs_update_root_times(struct btrfs_trans_handle *trans,  			     struct btrfs_root *root);  /* dir-item.c */ +int btrfs_check_dir_item_collision(struct btrfs_root *root, u64 dir, +			  const char *name, int name_len);  int btrfs_insert_dir_item(struct btrfs_trans_handle *trans,  			  struct btrfs_root *root, const char *name,  			  int name_len, struct inode *dir, @@ -3172,12 +3341,12 @@ int btrfs_del_inode_ref(struct btrfs_trans_handle *trans,  			   struct btrfs_root *root,  			   const char *name, int name_len,  			   u64 inode_objectid, u64 ref_objectid, u64 *index); -struct btrfs_inode_ref * -btrfs_lookup_inode_ref(struct btrfs_trans_handle *trans, -			struct btrfs_root *root, -			struct btrfs_path *path, -			const char *name, int name_len, -			u64 inode_objectid, u64 ref_objectid, int mod); +int btrfs_get_inode_ref_index(struct btrfs_trans_handle *trans, +			      struct btrfs_root *root, +			      struct btrfs_path *path, +			      const char *name, int name_len, +			      u64 inode_objectid, u64 ref_objectid, int mod, +			      u64 *ret_index);  int btrfs_insert_empty_inode(struct btrfs_trans_handle *trans,  			     struct btrfs_root *root,  			     struct btrfs_path *path, u64 objectid); @@ -3185,6 +3354,19 @@ int btrfs_lookup_inode(struct btrfs_trans_handle *trans, struct btrfs_root  		       *root, struct btrfs_path *path,  		       struct btrfs_key *location, int mod); +struct btrfs_inode_extref * +btrfs_lookup_inode_extref(struct btrfs_trans_handle *trans, +			  struct btrfs_root *root, +			  struct btrfs_path *path, +			  const char *name, int name_len, +			  u64 inode_objectid, u64 ref_objectid, int ins_len, +			  int cow); + +int btrfs_find_name_in_ext_backref(struct btrfs_path *path, +				   u64 ref_objectid, const char *name, +				   int name_len, +				   struct btrfs_inode_extref **extref_ret); +  /* file-item.c */  int btrfs_del_csums(struct btrfs_trans_handle *trans,  		    struct btrfs_root *root, u64 bytenr, u64 len); @@ -3202,6 +3384,7 @@ int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans,  			     struct btrfs_root *root,  			     struct btrfs_path *path, u64 objectid,  			     u64 bytenr, int mod); +u64 btrfs_file_extent_length(struct btrfs_path *path);  int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans,  			   struct btrfs_root *root,  			   struct btrfs_ordered_sum *sums); @@ -3217,6 +3400,19 @@ int btrfs_csum_truncate(struct btrfs_trans_handle *trans,  int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,  			     struct list_head *list, int search_commit);  /* inode.c */ +struct btrfs_delalloc_work { +	struct inode *inode; +	int wait; +	int delay_iput; +	struct completion completion; +	struct list_head list; +	struct btrfs_work work; +}; + +struct btrfs_delalloc_work *btrfs_alloc_delalloc_work(struct inode *inode, +						    int wait, int delay_iput); +void btrfs_wait_and_free_delalloc_work(struct btrfs_delalloc_work *work); +  struct extent_map *btrfs_get_extent_fiemap(struct inode *inode, struct page *page,  					   size_t pg_offset, u64 start, u64 len,  					   int create); @@ -3249,6 +3445,8 @@ int btrfs_unlink_subvol(struct btrfs_trans_handle *trans,  			struct btrfs_root *root,  			struct inode *dir, u64 objectid,  			const char *name, int name_len); +int btrfs_truncate_page(struct inode *inode, loff_t from, loff_t len, +			int front);  int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,  			       struct btrfs_root *root,  			       struct inode *inode, u64 new_size, @@ -3283,6 +3481,8 @@ struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page,  int btrfs_update_inode(struct btrfs_trans_handle *trans,  			      struct btrfs_root *root,  			      struct inode *inode); +int btrfs_update_inode_fallback(struct btrfs_trans_handle *trans, +				struct btrfs_root *root, struct inode *inode);  int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode);  int btrfs_orphan_del(struct btrfs_trans_handle *trans, struct inode *inode);  int btrfs_orphan_cleanup(struct btrfs_root *root); @@ -3308,16 +3508,30 @@ void btrfs_inherit_iflags(struct inode *inode, struct inode *dir);  int btrfs_defrag_file(struct inode *inode, struct file *file,  		      struct btrfs_ioctl_defrag_range_args *range,  		      u64 newer_than, unsigned long max_pages); +void btrfs_get_block_group_info(struct list_head *groups_list, +				struct btrfs_ioctl_space_info *space); +  /* file.c */ +int btrfs_auto_defrag_init(void); +void btrfs_auto_defrag_exit(void);  int btrfs_add_inode_defrag(struct btrfs_trans_handle *trans,  			   struct inode *inode);  int btrfs_run_defrag_inodes(struct btrfs_fs_info *fs_info); +void btrfs_cleanup_defrag_inodes(struct btrfs_fs_info *fs_info);  int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync); -int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, -			    int skip_pinned); +void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, +			     int skip_pinned); +int btrfs_replace_extent_cache(struct inode *inode, struct extent_map *replace, +			       u64 start, u64 end, int skip_pinned, +			       int modified);  extern const struct file_operations btrfs_file_operations; -int btrfs_drop_extents(struct btrfs_trans_handle *trans, struct inode *inode, -		       u64 start, u64 end, u64 *hint_byte, int drop_cache); +int __btrfs_drop_extents(struct btrfs_trans_handle *trans, +			 struct btrfs_root *root, struct inode *inode, +			 struct btrfs_path *path, u64 start, u64 end, +			 u64 *drop_end, int drop_cache); +int btrfs_drop_extents(struct btrfs_trans_handle *trans, +		       struct btrfs_root *root, struct inode *inode, u64 start, +		       u64 end, int drop_cache);  int btrfs_mark_extent_written(struct btrfs_trans_handle *trans,  			      struct inode *inode, u64 start, u64 end);  int btrfs_release_file(struct inode *inode, struct file *file); @@ -3378,6 +3592,11 @@ static inline void __btrfs_set_fs_incompat(struct btrfs_fs_info *fs_info,  	}  } +/* + * Call btrfs_abort_transaction as early as possible when an error condition is + * detected, that way the exact line number is reported. + */ +  #define btrfs_abort_transaction(trans, root, errno)		\  do {								\  	__btrfs_abort_transaction(trans, root, __func__,	\ @@ -3445,15 +3664,16 @@ int btrfs_reloc_post_snapshot(struct btrfs_trans_handle *trans,  			      struct btrfs_pending_snapshot *pending);  /* scrub.c */ -int btrfs_scrub_dev(struct btrfs_root *root, u64 devid, u64 start, u64 end, -		    struct btrfs_scrub_progress *progress, int readonly); +int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, +		    u64 end, struct btrfs_scrub_progress *progress, +		    int readonly, int is_dev_replace);  void btrfs_scrub_pause(struct btrfs_root *root);  void btrfs_scrub_pause_super(struct btrfs_root *root);  void btrfs_scrub_continue(struct btrfs_root *root);  void btrfs_scrub_continue_super(struct btrfs_root *root); -int __btrfs_scrub_cancel(struct btrfs_fs_info *info); -int btrfs_scrub_cancel(struct btrfs_root *root); -int btrfs_scrub_cancel_dev(struct btrfs_root *root, struct btrfs_device *dev); +int btrfs_scrub_cancel(struct btrfs_fs_info *info); +int btrfs_scrub_cancel_dev(struct btrfs_fs_info *info, +			   struct btrfs_device *dev);  int btrfs_scrub_cancel_devid(struct btrfs_root *root, u64 devid);  int btrfs_scrub_progress(struct btrfs_root *root, u64 devid,  			 struct btrfs_scrub_progress *progress);  |