btrfs: use assertion helpers for spinning writers
[sfrench/cifs-2.6.git] / fs / btrfs / extent_io.h
index 08749e0b9c32d52a8c70ce1c08a8f8f2cda2f614..3577ef33bc36761e4bedc4c106259ee045a2d619 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,11 +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;
-       int track_uptodate;
+       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;
 };
@@ -152,7 +166,6 @@ struct extent_buffer {
        atomic_t blocking_writers;
        atomic_t blocking_readers;
        atomic_t spinning_readers;
-       atomic_t spinning_writers;
        short lock_nested;
        /* >= 0 if eb belongs to a log tree, -1 otherwise */
        short log_index;
@@ -171,6 +184,7 @@ 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;
        struct list_head leak_list;
 #endif
 };
@@ -239,7 +253,9 @@ typedef struct extent_map *(get_extent_t)(struct btrfs_inode *inode,
                                          u64 start, u64 len,
                                          int create);
 
-void extent_io_tree_init(struct extent_io_tree *tree, void *private_data);
+void extent_io_tree_init(struct btrfs_fs_info *fs_info,
+                        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,