Btrfs: introduce btrfs_{start, end}_nocow_write() for each subvolume
[firefly-linux-kernel-4.4.55.git] / fs / btrfs / ctree.h
index 7b50def3f20665a8773c57e6b221c14ec709f31c..374bb2f8ccd9bd1a1307d558ce1f3a7201e4cc89 100644 (file)
@@ -1221,7 +1221,7 @@ struct btrfs_caching_control {
        struct list_head list;
        struct mutex mutex;
        wait_queue_head_t wait;
-       struct btrfs_work_struct work;
+       struct btrfs_work work;
        struct btrfs_block_group_cache *block_group;
        u64 progress;
        atomic_t count;
@@ -1504,28 +1504,27 @@ struct btrfs_fs_info {
         * A third pool does submit_bio to avoid deadlocking with the other
         * two
         */
-       struct btrfs_workers generic_worker;
-       struct btrfs_workqueue_struct *workers;
-       struct btrfs_workqueue_struct *delalloc_workers;
-       struct btrfs_workqueue_struct *flush_workers;
-       struct btrfs_workqueue_struct *endio_workers;
-       struct btrfs_workqueue_struct *endio_meta_workers;
-       struct btrfs_workqueue_struct *endio_raid56_workers;
-       struct btrfs_workqueue_struct *rmw_workers;
-       struct btrfs_workqueue_struct *endio_meta_write_workers;
-       struct btrfs_workqueue_struct *endio_write_workers;
-       struct btrfs_workqueue_struct *endio_freespace_worker;
-       struct btrfs_workqueue_struct *submit_workers;
-       struct btrfs_workqueue_struct *caching_workers;
-       struct btrfs_workqueue_struct *readahead_workers;
+       struct btrfs_workqueue *workers;
+       struct btrfs_workqueue *delalloc_workers;
+       struct btrfs_workqueue *flush_workers;
+       struct btrfs_workqueue *endio_workers;
+       struct btrfs_workqueue *endio_meta_workers;
+       struct btrfs_workqueue *endio_raid56_workers;
+       struct btrfs_workqueue *rmw_workers;
+       struct btrfs_workqueue *endio_meta_write_workers;
+       struct btrfs_workqueue *endio_write_workers;
+       struct btrfs_workqueue *endio_freespace_worker;
+       struct btrfs_workqueue *submit_workers;
+       struct btrfs_workqueue *caching_workers;
+       struct btrfs_workqueue *readahead_workers;
 
        /*
         * fixup workers take dirty pages that didn't properly go through
         * the cow mechanism and make them safe to write.  It happens
         * for the sys_munmap function call path
         */
-       struct btrfs_workqueue_struct *fixup_workers;
-       struct btrfs_workqueue_struct *delayed_workers;
+       struct btrfs_workqueue *fixup_workers;
+       struct btrfs_workqueue *delayed_workers;
        struct task_struct *transaction_kthread;
        struct task_struct *cleaner_kthread;
        int thread_pool_size;
@@ -1605,9 +1604,9 @@ struct btrfs_fs_info {
        atomic_t scrub_cancel_req;
        wait_queue_head_t scrub_pause_wait;
        int scrub_workers_refcnt;
-       struct btrfs_workers scrub_workers;
-       struct btrfs_workers scrub_wr_completion_workers;
-       struct btrfs_workers scrub_nocow_workers;
+       struct btrfs_workqueue *scrub_workers;
+       struct btrfs_workqueue *scrub_wr_completion_workers;
+       struct btrfs_workqueue *scrub_nocow_workers;
 
 #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY
        u32 check_integrity_print_mask;
@@ -1648,9 +1647,9 @@ struct btrfs_fs_info {
        /* qgroup rescan items */
        struct mutex qgroup_rescan_lock; /* protects the progress item */
        struct btrfs_key qgroup_rescan_progress;
-       struct btrfs_workqueue_struct *qgroup_rescan_workers;
+       struct btrfs_workqueue *qgroup_rescan_workers;
        struct completion qgroup_rescan_completion;
-       struct btrfs_work_struct qgroup_rescan_work;
+       struct btrfs_work qgroup_rescan_work;
 
        /* filesystem state */
        unsigned long fs_state;
@@ -1682,6 +1681,11 @@ struct btrfs_fs_info {
        unsigned int update_uuid_tree_gen:1;
 };
 
+struct btrfs_subvolume_writers {
+       struct percpu_counter   counter;
+       wait_queue_head_t       wait;
+};
+
 /*
  * in ram representation of the tree.  extent_root is used for all allocations
  * and for the extent tree extent_root root.
@@ -1830,6 +1834,8 @@ struct btrfs_root {
         * manipulation with the read-only status via SUBVOL_SETFLAGS
         */
        int send_in_progress;
+       struct btrfs_subvolume_writers *subv_writers;
+       atomic_t will_be_snapshoted;
 };
 
 struct btrfs_ioctl_defrag_range_args {
@@ -3354,6 +3360,9 @@ 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);
+
+int btrfs_start_nocow_write(struct btrfs_root *root);
+void btrfs_end_nocow_write(struct btrfs_root *root);
 /* ctree.c */
 int btrfs_bin_search(struct extent_buffer *eb, struct btrfs_key *key,
                     int level, int *slot);
@@ -3681,7 +3690,7 @@ struct btrfs_delalloc_work {
        int delay_iput;
        struct completion completion;
        struct list_head list;
-       struct btrfs_work_struct work;
+       struct btrfs_work work;
 };
 
 struct btrfs_delalloc_work *btrfs_alloc_delalloc_work(struct inode *inode,