btrfs: get fs_info from eb in repair_eb_io_failure
[sfrench/cifs-2.6.git] / fs / btrfs / extent_io.h
index bd5c1259905729dd23cf3be26b2457daa7de7b76..c4ec104ac15705df29ebde9b07a20b95f492f9d3 100644 (file)
@@ -9,22 +9,20 @@
 
 /* bits for the extent state */
 #define EXTENT_DIRTY           (1U << 0)
-#define EXTENT_WRITEBACK       (1U << 1)
-#define EXTENT_UPTODATE                (1U << 2)
-#define EXTENT_LOCKED          (1U << 3)
-#define EXTENT_NEW             (1U << 4)
-#define EXTENT_DELALLOC                (1U << 5)
-#define EXTENT_DEFRAG          (1U << 6)
-#define EXTENT_BOUNDARY                (1U << 9)
-#define EXTENT_NODATASUM       (1U << 10)
-#define EXTENT_CLEAR_META_RESV (1U << 11)
-#define EXTENT_NEED_WAIT       (1U << 12)
-#define EXTENT_DAMAGED         (1U << 13)
-#define EXTENT_NORESERVE       (1U << 14)
-#define EXTENT_QGROUP_RESERVED (1U << 15)
-#define EXTENT_CLEAR_DATA_RESV (1U << 16)
-#define EXTENT_DELALLOC_NEW    (1U << 17)
-#define EXTENT_IOBITS          (EXTENT_LOCKED | EXTENT_WRITEBACK)
+#define EXTENT_UPTODATE                (1U << 1)
+#define EXTENT_LOCKED          (1U << 2)
+#define EXTENT_NEW             (1U << 3)
+#define EXTENT_DELALLOC                (1U << 4)
+#define EXTENT_DEFRAG          (1U << 5)
+#define EXTENT_BOUNDARY                (1U << 6)
+#define EXTENT_NODATASUM       (1U << 7)
+#define EXTENT_CLEAR_META_RESV (1U << 8)
+#define EXTENT_NEED_WAIT       (1U << 9)
+#define EXTENT_DAMAGED         (1U << 10)
+#define EXTENT_NORESERVE       (1U << 11)
+#define EXTENT_QGROUP_RESERVED (1U << 12)
+#define EXTENT_CLEAR_DATA_RESV (1U << 13)
+#define EXTENT_DELALLOC_NEW    (1U << 14)
 #define EXTENT_DO_ACCOUNTING    (EXTENT_CLEAR_META_RESV | \
                                 EXTENT_CLEAR_DATA_RESV)
 #define EXTENT_CTLBITS         (EXTENT_DO_ACCOUNTING)
@@ -106,12 +104,27 @@ struct extent_io_ops {
                                    int mirror);
 };
 
+enum {
+       IO_TREE_FS_INFO_FREED_EXTENTS0,
+       IO_TREE_FS_INFO_FREED_EXTENTS1,
+       IO_TREE_INODE_IO,
+       IO_TREE_INODE_IO_FAILURE,
+       IO_TREE_RELOC_BLOCKS,
+       IO_TREE_TRANS_DIRTY_PAGES,
+       IO_TREE_ROOT_DIRTY_LOG_PAGES,
+       IO_TREE_SELFTEST,
+};
+
 struct extent_io_tree {
        struct rb_root state;
        struct btrfs_fs_info *fs_info;
        void *private_data;
        u64 dirty_bytes;
        bool track_uptodate;
+
+       /* Who owns this io tree, should be one of IO_TREE_* */
+       u8 owner;
+
        spinlock_t lock;
        const struct extent_io_ops *ops;
 };
@@ -147,14 +160,9 @@ struct extent_buffer {
        struct rcu_head rcu_head;
        pid_t lock_owner;
 
-       /* count of read lock holders on the extent buffer */
-       atomic_t write_locks;
-       atomic_t read_locks;
        atomic_t blocking_writers;
        atomic_t blocking_readers;
-       atomic_t spinning_readers;
-       atomic_t spinning_writers;
-       short lock_nested;
+       bool lock_nested;
        /* >= 0 if eb belongs to a log tree, -1 otherwise */
        short log_index;
 
@@ -172,6 +180,10 @@ struct extent_buffer {
        wait_queue_head_t read_lock_wq;
        struct page *pages[INLINE_EXTENT_BUFFER_PAGES];
 #ifdef CONFIG_BTRFS_DEBUG
+       atomic_t spinning_writers;
+       atomic_t spinning_readers;
+       atomic_t read_locks;
+       atomic_t write_locks;
        struct list_head leak_list;
 #endif
 };
@@ -241,7 +253,8 @@ typedef struct extent_map *(get_extent_t)(struct btrfs_inode *inode,
                                          int create);
 
 void extent_io_tree_init(struct btrfs_fs_info *fs_info,
-                        struct extent_io_tree *tree, void *private_data);
+                        struct extent_io_tree *tree, unsigned int owner,
+                        void *private_data);
 int try_release_extent_mapping(struct page *page, gfp_t mask);
 int try_release_extent_buffer(struct page *page);
 int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end,
@@ -489,8 +502,7 @@ int clean_io_failure(struct btrfs_fs_info *fs_info,
                     struct extent_io_tree *io_tree, u64 start,
                     struct page *page, u64 ino, unsigned int pg_offset);
 void end_extent_writepage(struct page *page, int err, u64 start, u64 end);
-int repair_eb_io_failure(struct btrfs_fs_info *fs_info,
-                        struct extent_buffer *eb, int mirror_num);
+int btrfs_repair_eb_io_failure(struct extent_buffer *eb, int mirror_num);
 
 /*
  * When IO fails, either with EIO or csum verification fails, we