diff options
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/async-thread.c | 44 | ||||
-rw-r--r-- | fs/btrfs/async-thread.h | 28 | ||||
-rw-r--r-- | fs/btrfs/btrfs_inode.h | 13 | ||||
-rw-r--r-- | fs/btrfs/delayed-inode.c | 4 | ||||
-rw-r--r-- | fs/btrfs/disk-io.c | 56 | ||||
-rw-r--r-- | fs/btrfs/extent-tree.c | 23 | ||||
-rw-r--r-- | fs/btrfs/extent_io.c | 5 | ||||
-rw-r--r-- | fs/btrfs/file.c | 19 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 300 | ||||
-rw-r--r-- | fs/btrfs/ioctl.c | 68 | ||||
-rw-r--r-- | fs/btrfs/ordered-data.c | 1 | ||||
-rw-r--r-- | fs/btrfs/qgroup.c | 3 | ||||
-rw-r--r-- | fs/btrfs/raid56.c | 9 | ||||
-rw-r--r-- | fs/btrfs/reada.c | 3 | ||||
-rw-r--r-- | fs/btrfs/scrub.c | 25 | ||||
-rw-r--r-- | fs/btrfs/sysfs.c | 2 | ||||
-rw-r--r-- | fs/btrfs/tree-log.c | 80 | ||||
-rw-r--r-- | fs/btrfs/tree-log.h | 2 | ||||
-rw-r--r-- | fs/btrfs/volumes.c | 64 |
19 files changed, 513 insertions, 236 deletions
diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c index 5a201d81049c..fbd76ded9a34 100644 --- a/fs/btrfs/async-thread.c +++ b/fs/btrfs/async-thread.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <linux/list.h> | 22 | #include <linux/list.h> |
23 | #include <linux/spinlock.h> | 23 | #include <linux/spinlock.h> |
24 | #include <linux/freezer.h> | 24 | #include <linux/freezer.h> |
25 | #include <linux/workqueue.h> | ||
26 | #include "async-thread.h" | 25 | #include "async-thread.h" |
27 | #include "ctree.h" | 26 | #include "ctree.h" |
28 | 27 | ||
@@ -55,8 +54,39 @@ struct btrfs_workqueue { | |||
55 | struct __btrfs_workqueue *high; | 54 | struct __btrfs_workqueue *high; |
56 | }; | 55 | }; |
57 | 56 | ||
58 | static inline struct __btrfs_workqueue | 57 | static void normal_work_helper(struct btrfs_work *work); |
59 | *__btrfs_alloc_workqueue(const char *name, int flags, int max_active, | 58 | |
59 | #define BTRFS_WORK_HELPER(name) \ | ||
60 | void btrfs_##name(struct work_struct *arg) \ | ||
61 | { \ | ||
62 | struct btrfs_work *work = container_of(arg, struct btrfs_work, \ | ||
63 | normal_work); \ | ||
64 | normal_work_helper(work); \ | ||
65 | } | ||
66 | |||
67 | BTRFS_WORK_HELPER(worker_helper); | ||
68 | BTRFS_WORK_HELPER(delalloc_helper); | ||
69 | BTRFS_WORK_HELPER(flush_delalloc_helper); | ||
70 | BTRFS_WORK_HELPER(cache_helper); | ||
71 | BTRFS_WORK_HELPER(submit_helper); | ||
72 | BTRFS_WORK_HELPER(fixup_helper); | ||
73 | BTRFS_WORK_HELPER(endio_helper); | ||
74 | BTRFS_WORK_HELPER(endio_meta_helper); | ||
75 | BTRFS_WORK_HELPER(endio_meta_write_helper); | ||
76 | BTRFS_WORK_HELPER(endio_raid56_helper); | ||
77 | BTRFS_WORK_HELPER(rmw_helper); | ||
78 | BTRFS_WORK_HELPER(endio_write_helper); | ||
79 | BTRFS_WORK_HELPER(freespace_write_helper); | ||
80 | BTRFS_WORK_HELPER(delayed_meta_helper); | ||
81 | BTRFS_WORK_HELPER(readahead_helper); | ||
82 | BTRFS_WORK_HELPER(qgroup_rescan_helper); | ||
83 | BTRFS_WORK_HELPER(extent_refs_helper); | ||
84 | BTRFS_WORK_HELPER(scrub_helper); | ||
85 | BTRFS_WORK_HELPER(scrubwrc_helper); | ||
86 | BTRFS_WORK_HELPER(scrubnc_helper); | ||
87 | |||
88 | static struct __btrfs_workqueue * | ||
89 | __btrfs_alloc_workqueue(const char *name, int flags, int max_active, | ||
60 | int thresh) | 90 | int thresh) |
61 | { | 91 | { |
62 | struct __btrfs_workqueue *ret = kzalloc(sizeof(*ret), GFP_NOFS); | 92 | struct __btrfs_workqueue *ret = kzalloc(sizeof(*ret), GFP_NOFS); |
@@ -232,13 +262,11 @@ static void run_ordered_work(struct __btrfs_workqueue *wq) | |||
232 | spin_unlock_irqrestore(lock, flags); | 262 | spin_unlock_irqrestore(lock, flags); |
233 | } | 263 | } |
234 | 264 | ||
235 | static void normal_work_helper(struct work_struct *arg) | 265 | static void normal_work_helper(struct btrfs_work *work) |
236 | { | 266 | { |
237 | struct btrfs_work *work; | ||
238 | struct __btrfs_workqueue *wq; | 267 | struct __btrfs_workqueue *wq; |
239 | int need_order = 0; | 268 | int need_order = 0; |
240 | 269 | ||
241 | work = container_of(arg, struct btrfs_work, normal_work); | ||
242 | /* | 270 | /* |
243 | * We should not touch things inside work in the following cases: | 271 | * We should not touch things inside work in the following cases: |
244 | * 1) after work->func() if it has no ordered_free | 272 | * 1) after work->func() if it has no ordered_free |
@@ -262,7 +290,7 @@ static void normal_work_helper(struct work_struct *arg) | |||
262 | trace_btrfs_all_work_done(work); | 290 | trace_btrfs_all_work_done(work); |
263 | } | 291 | } |
264 | 292 | ||
265 | void btrfs_init_work(struct btrfs_work *work, | 293 | void btrfs_init_work(struct btrfs_work *work, btrfs_work_func_t uniq_func, |
266 | btrfs_func_t func, | 294 | btrfs_func_t func, |
267 | btrfs_func_t ordered_func, | 295 | btrfs_func_t ordered_func, |
268 | btrfs_func_t ordered_free) | 296 | btrfs_func_t ordered_free) |
@@ -270,7 +298,7 @@ void btrfs_init_work(struct btrfs_work *work, | |||
270 | work->func = func; | 298 | work->func = func; |
271 | work->ordered_func = ordered_func; | 299 | work->ordered_func = ordered_func; |
272 | work->ordered_free = ordered_free; | 300 | work->ordered_free = ordered_free; |
273 | INIT_WORK(&work->normal_work, normal_work_helper); | 301 | INIT_WORK(&work->normal_work, uniq_func); |
274 | INIT_LIST_HEAD(&work->ordered_list); | 302 | INIT_LIST_HEAD(&work->ordered_list); |
275 | work->flags = 0; | 303 | work->flags = 0; |
276 | } | 304 | } |
diff --git a/fs/btrfs/async-thread.h b/fs/btrfs/async-thread.h index 9c6b66d15fb0..e9e31c94758f 100644 --- a/fs/btrfs/async-thread.h +++ b/fs/btrfs/async-thread.h | |||
@@ -19,12 +19,14 @@ | |||
19 | 19 | ||
20 | #ifndef __BTRFS_ASYNC_THREAD_ | 20 | #ifndef __BTRFS_ASYNC_THREAD_ |
21 | #define __BTRFS_ASYNC_THREAD_ | 21 | #define __BTRFS_ASYNC_THREAD_ |
22 | #include <linux/workqueue.h> | ||
22 | 23 | ||
23 | struct btrfs_workqueue; | 24 | struct btrfs_workqueue; |
24 | /* Internal use only */ | 25 | /* Internal use only */ |
25 | struct __btrfs_workqueue; | 26 | struct __btrfs_workqueue; |
26 | struct btrfs_work; | 27 | struct btrfs_work; |
27 | typedef void (*btrfs_func_t)(struct btrfs_work *arg); | 28 | typedef void (*btrfs_func_t)(struct btrfs_work *arg); |
29 | typedef void (*btrfs_work_func_t)(struct work_struct *arg); | ||
28 | 30 | ||
29 | struct btrfs_work { | 31 | struct btrfs_work { |
30 | btrfs_func_t func; | 32 | btrfs_func_t func; |
@@ -38,11 +40,35 @@ struct btrfs_work { | |||
38 | unsigned long flags; | 40 | unsigned long flags; |
39 | }; | 41 | }; |
40 | 42 | ||
43 | #define BTRFS_WORK_HELPER_PROTO(name) \ | ||
44 | void btrfs_##name(struct work_struct *arg) | ||
45 | |||
46 | BTRFS_WORK_HELPER_PROTO(worker_helper); | ||
47 | BTRFS_WORK_HELPER_PROTO(delalloc_helper); | ||
48 | BTRFS_WORK_HELPER_PROTO(flush_delalloc_helper); | ||
49 | BTRFS_WORK_HELPER_PROTO(cache_helper); | ||
50 | BTRFS_WORK_HELPER_PROTO(submit_helper); | ||
51 | BTRFS_WORK_HELPER_PROTO(fixup_helper); | ||
52 | BTRFS_WORK_HELPER_PROTO(endio_helper); | ||
53 | BTRFS_WORK_HELPER_PROTO(endio_meta_helper); | ||
54 | BTRFS_WORK_HELPER_PROTO(endio_meta_write_helper); | ||
55 | BTRFS_WORK_HELPER_PROTO(endio_raid56_helper); | ||
56 | BTRFS_WORK_HELPER_PROTO(rmw_helper); | ||
57 | BTRFS_WORK_HELPER_PROTO(endio_write_helper); | ||
58 | BTRFS_WORK_HELPER_PROTO(freespace_write_helper); | ||
59 | BTRFS_WORK_HELPER_PROTO(delayed_meta_helper); | ||
60 | BTRFS_WORK_HELPER_PROTO(readahead_helper); | ||
61 | BTRFS_WORK_HELPER_PROTO(qgroup_rescan_helper); | ||
62 | BTRFS_WORK_HELPER_PROTO(extent_refs_helper); | ||
63 | BTRFS_WORK_HELPER_PROTO(scrub_helper); | ||
64 | BTRFS_WORK_HELPER_PROTO(scrubwrc_helper); | ||
65 | BTRFS_WORK_HELPER_PROTO(scrubnc_helper); | ||
66 | |||
41 | struct btrfs_workqueue *btrfs_alloc_workqueue(const char *name, | 67 | struct btrfs_workqueue *btrfs_alloc_workqueue(const char *name, |
42 | int flags, | 68 | int flags, |
43 | int max_active, | 69 | int max_active, |
44 | int thresh); | 70 | int thresh); |
45 | void btrfs_init_work(struct btrfs_work *work, | 71 | void btrfs_init_work(struct btrfs_work *work, btrfs_work_func_t helper, |
46 | btrfs_func_t func, | 72 | btrfs_func_t func, |
47 | btrfs_func_t ordered_func, | 73 | btrfs_func_t ordered_func, |
48 | btrfs_func_t ordered_free); | 74 | btrfs_func_t ordered_free); |
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index 43527fd78825..56b8522d5767 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h | |||
@@ -234,8 +234,17 @@ static inline int btrfs_inode_in_log(struct inode *inode, u64 generation) | |||
234 | BTRFS_I(inode)->last_sub_trans <= | 234 | BTRFS_I(inode)->last_sub_trans <= |
235 | BTRFS_I(inode)->last_log_commit && | 235 | BTRFS_I(inode)->last_log_commit && |
236 | BTRFS_I(inode)->last_sub_trans <= | 236 | BTRFS_I(inode)->last_sub_trans <= |
237 | BTRFS_I(inode)->root->last_log_commit) | 237 | BTRFS_I(inode)->root->last_log_commit) { |
238 | return 1; | 238 | /* |
239 | * After a ranged fsync we might have left some extent maps | ||
240 | * (that fall outside the fsync's range). So return false | ||
241 | * here if the list isn't empty, to make sure btrfs_log_inode() | ||
242 | * will be called and process those extent maps. | ||
243 | */ | ||
244 | smp_mb(); | ||
245 | if (list_empty(&BTRFS_I(inode)->extent_tree.modified_extents)) | ||
246 | return 1; | ||
247 | } | ||
239 | return 0; | 248 | return 0; |
240 | } | 249 | } |
241 | 250 | ||
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index da775bfdebc9..a2e90f855d7d 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c | |||
@@ -1395,8 +1395,8 @@ static int btrfs_wq_run_delayed_node(struct btrfs_delayed_root *delayed_root, | |||
1395 | return -ENOMEM; | 1395 | return -ENOMEM; |
1396 | 1396 | ||
1397 | async_work->delayed_root = delayed_root; | 1397 | async_work->delayed_root = delayed_root; |
1398 | btrfs_init_work(&async_work->work, btrfs_async_run_delayed_root, | 1398 | btrfs_init_work(&async_work->work, btrfs_delayed_meta_helper, |
1399 | NULL, NULL); | 1399 | btrfs_async_run_delayed_root, NULL, NULL); |
1400 | async_work->nr = nr; | 1400 | async_work->nr = nr; |
1401 | 1401 | ||
1402 | btrfs_queue_work(root->fs_info->delayed_workers, &async_work->work); | 1402 | btrfs_queue_work(root->fs_info->delayed_workers, &async_work->work); |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index d0ed9e664f7d..a1d36e62179c 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -39,7 +39,6 @@ | |||
39 | #include "btrfs_inode.h" | 39 | #include "btrfs_inode.h" |
40 | #include "volumes.h" | 40 | #include "volumes.h" |
41 | #include "print-tree.h" | 41 | #include "print-tree.h" |
42 | #include "async-thread.h" | ||
43 | #include "locking.h" | 42 | #include "locking.h" |
44 | #include "tree-log.h" | 43 | #include "tree-log.h" |
45 | #include "free-space-cache.h" | 44 | #include "free-space-cache.h" |
@@ -693,35 +692,41 @@ static void end_workqueue_bio(struct bio *bio, int err) | |||
693 | { | 692 | { |
694 | struct end_io_wq *end_io_wq = bio->bi_private; | 693 | struct end_io_wq *end_io_wq = bio->bi_private; |
695 | struct btrfs_fs_info *fs_info; | 694 | struct btrfs_fs_info *fs_info; |
695 | struct btrfs_workqueue *wq; | ||
696 | btrfs_work_func_t func; | ||
696 | 697 | ||
697 | fs_info = end_io_wq->info; | 698 | fs_info = end_io_wq->info; |
698 | end_io_wq->error = err; | 699 | end_io_wq->error = err; |
699 | btrfs_init_work(&end_io_wq->work, end_workqueue_fn, NULL, NULL); | ||
700 | 700 | ||
701 | if (bio->bi_rw & REQ_WRITE) { | 701 | if (bio->bi_rw & REQ_WRITE) { |
702 | if (end_io_wq->metadata == BTRFS_WQ_ENDIO_METADATA) | 702 | if (end_io_wq->metadata == BTRFS_WQ_ENDIO_METADATA) { |
703 | btrfs_queue_work(fs_info->endio_meta_write_workers, | 703 | wq = fs_info->endio_meta_write_workers; |
704 | &end_io_wq->work); | 704 | func = btrfs_endio_meta_write_helper; |
705 | else if (end_io_wq->metadata == BTRFS_WQ_ENDIO_FREE_SPACE) | 705 | } else if (end_io_wq->metadata == BTRFS_WQ_ENDIO_FREE_SPACE) { |
706 | btrfs_queue_work(fs_info->endio_freespace_worker, | 706 | wq = fs_info->endio_freespace_worker; |
707 | &end_io_wq->work); | 707 | func = btrfs_freespace_write_helper; |
708 | else if (end_io_wq->metadata == BTRFS_WQ_ENDIO_RAID56) | 708 | } else if (end_io_wq->metadata == BTRFS_WQ_ENDIO_RAID56) { |
709 | btrfs_queue_work(fs_info->endio_raid56_workers, | 709 | wq = fs_info->endio_raid56_workers; |
710 | &end_io_wq->work); | 710 | func = btrfs_endio_raid56_helper; |
711 | else | 711 | } else { |
712 | btrfs_queue_work(fs_info->endio_write_workers, | 712 | wq = fs_info->endio_write_workers; |
713 | &end_io_wq->work); | 713 | func = btrfs_endio_write_helper; |
714 | } | ||
714 | } else { | 715 | } else { |
715 | if (end_io_wq->metadata == BTRFS_WQ_ENDIO_RAID56) | 716 | if (end_io_wq->metadata == BTRFS_WQ_ENDIO_RAID56) { |
716 | btrfs_queue_work(fs_info->endio_raid56_workers, | 717 | wq = fs_info->endio_raid56_workers; |
717 | &end_io_wq->work); | 718 | func = btrfs_endio_raid56_helper; |
718 | else if (end_io_wq->metadata) | 719 | } else if (end_io_wq->metadata) { |
719 | btrfs_queue_work(fs_info->endio_meta_workers, | 720 | wq = fs_info->endio_meta_workers; |
720 | &end_io_wq->work); | 721 | func = btrfs_endio_meta_helper; |
721 | else | 722 | } else { |
722 | btrfs_queue_work(fs_info->endio_workers, | 723 | wq = fs_info->endio_workers; |
723 | &end_io_wq->work); | 724 | func = btrfs_endio_helper; |
725 | } | ||
724 | } | 726 | } |
727 | |||
728 | btrfs_init_work(&end_io_wq->work, func, end_workqueue_fn, NULL, NULL); | ||
729 | btrfs_queue_work(wq, &end_io_wq->work); | ||
725 | } | 730 | } |
726 | 731 | ||
727 | /* | 732 | /* |
@@ -828,7 +833,7 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, | |||
828 | async->submit_bio_start = submit_bio_start; | 833 | async->submit_bio_start = submit_bio_start; |
829 | async->submit_bio_done = submit_bio_done; | 834 | async->submit_bio_done = submit_bio_done; |
830 | 835 | ||
831 | btrfs_init_work(&async->work, run_one_async_start, | 836 | btrfs_init_work(&async->work, btrfs_worker_helper, run_one_async_start, |
832 | run_one_async_done, run_one_async_free); | 837 | run_one_async_done, run_one_async_free); |
833 | 838 | ||
834 | async->bio_flags = bio_flags; | 839 | async->bio_flags = bio_flags; |
@@ -3450,7 +3455,8 @@ static int write_all_supers(struct btrfs_root *root, int max_mirrors) | |||
3450 | btrfs_set_stack_device_generation(dev_item, 0); | 3455 | btrfs_set_stack_device_generation(dev_item, 0); |
3451 | btrfs_set_stack_device_type(dev_item, dev->type); | 3456 | btrfs_set_stack_device_type(dev_item, dev->type); |
3452 | btrfs_set_stack_device_id(dev_item, dev->devid); | 3457 | btrfs_set_stack_device_id(dev_item, dev->devid); |
3453 | btrfs_set_stack_device_total_bytes(dev_item, dev->total_bytes); | 3458 | btrfs_set_stack_device_total_bytes(dev_item, |
3459 | dev->disk_total_bytes); | ||
3454 | btrfs_set_stack_device_bytes_used(dev_item, dev->bytes_used); | 3460 | btrfs_set_stack_device_bytes_used(dev_item, dev->bytes_used); |
3455 | btrfs_set_stack_device_io_align(dev_item, dev->io_align); | 3461 | btrfs_set_stack_device_io_align(dev_item, dev->io_align); |
3456 | btrfs_set_stack_device_io_width(dev_item, dev->io_width); | 3462 | btrfs_set_stack_device_io_width(dev_item, dev->io_width); |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 102ed3143976..3efe1c3877bf 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -552,7 +552,8 @@ static int cache_block_group(struct btrfs_block_group_cache *cache, | |||
552 | caching_ctl->block_group = cache; | 552 | caching_ctl->block_group = cache; |
553 | caching_ctl->progress = cache->key.objectid; | 553 | caching_ctl->progress = cache->key.objectid; |
554 | atomic_set(&caching_ctl->count, 1); | 554 | atomic_set(&caching_ctl->count, 1); |
555 | btrfs_init_work(&caching_ctl->work, caching_thread, NULL, NULL); | 555 | btrfs_init_work(&caching_ctl->work, btrfs_cache_helper, |
556 | caching_thread, NULL, NULL); | ||
556 | 557 | ||
557 | spin_lock(&cache->lock); | 558 | spin_lock(&cache->lock); |
558 | /* | 559 | /* |
@@ -2749,8 +2750,8 @@ int btrfs_async_run_delayed_refs(struct btrfs_root *root, | |||
2749 | async->sync = 0; | 2750 | async->sync = 0; |
2750 | init_completion(&async->wait); | 2751 | init_completion(&async->wait); |
2751 | 2752 | ||
2752 | btrfs_init_work(&async->work, delayed_ref_async_start, | 2753 | btrfs_init_work(&async->work, btrfs_extent_refs_helper, |
2753 | NULL, NULL); | 2754 | delayed_ref_async_start, NULL, NULL); |
2754 | 2755 | ||
2755 | btrfs_queue_work(root->fs_info->extent_workers, &async->work); | 2756 | btrfs_queue_work(root->fs_info->extent_workers, &async->work); |
2756 | 2757 | ||
@@ -3586,13 +3587,7 @@ static u64 get_restripe_target(struct btrfs_fs_info *fs_info, u64 flags) | |||
3586 | */ | 3587 | */ |
3587 | static u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags) | 3588 | static u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags) |
3588 | { | 3589 | { |
3589 | /* | 3590 | u64 num_devices = root->fs_info->fs_devices->rw_devices; |
3590 | * we add in the count of missing devices because we want | ||
3591 | * to make sure that any RAID levels on a degraded FS | ||
3592 | * continue to be honored. | ||
3593 | */ | ||
3594 | u64 num_devices = root->fs_info->fs_devices->rw_devices + | ||
3595 | root->fs_info->fs_devices->missing_devices; | ||
3596 | u64 target; | 3591 | u64 target; |
3597 | u64 tmp; | 3592 | u64 tmp; |
3598 | 3593 | ||
@@ -8440,13 +8435,7 @@ static u64 update_block_group_flags(struct btrfs_root *root, u64 flags) | |||
8440 | if (stripped) | 8435 | if (stripped) |
8441 | return extended_to_chunk(stripped); | 8436 | return extended_to_chunk(stripped); |
8442 | 8437 | ||
8443 | /* | 8438 | num_devices = root->fs_info->fs_devices->rw_devices; |
8444 | * we add in the count of missing devices because we want | ||
8445 | * to make sure that any RAID levels on a degraded FS | ||
8446 | * continue to be honored. | ||
8447 | */ | ||
8448 | num_devices = root->fs_info->fs_devices->rw_devices + | ||
8449 | root->fs_info->fs_devices->missing_devices; | ||
8450 | 8439 | ||
8451 | stripped = BTRFS_BLOCK_GROUP_RAID0 | | 8440 | stripped = BTRFS_BLOCK_GROUP_RAID0 | |
8452 | BTRFS_BLOCK_GROUP_RAID5 | BTRFS_BLOCK_GROUP_RAID6 | | 8441 | BTRFS_BLOCK_GROUP_RAID5 | BTRFS_BLOCK_GROUP_RAID6 | |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 3e11aab9f391..af0359dcf337 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -2532,6 +2532,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err) | |||
2532 | test_bit(BIO_UPTODATE, &bio->bi_flags); | 2532 | test_bit(BIO_UPTODATE, &bio->bi_flags); |
2533 | if (err) | 2533 | if (err) |
2534 | uptodate = 0; | 2534 | uptodate = 0; |
2535 | offset += len; | ||
2535 | continue; | 2536 | continue; |
2536 | } | 2537 | } |
2537 | } | 2538 | } |
@@ -4207,8 +4208,8 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | |||
4207 | return -ENOMEM; | 4208 | return -ENOMEM; |
4208 | path->leave_spinning = 1; | 4209 | path->leave_spinning = 1; |
4209 | 4210 | ||
4210 | start = ALIGN(start, BTRFS_I(inode)->root->sectorsize); | 4211 | start = round_down(start, BTRFS_I(inode)->root->sectorsize); |
4211 | len = ALIGN(len, BTRFS_I(inode)->root->sectorsize); | 4212 | len = round_up(max, BTRFS_I(inode)->root->sectorsize) - start; |
4212 | 4213 | ||
4213 | /* | 4214 | /* |
4214 | * lookup the last file extent. We're not using i_size here | 4215 | * lookup the last file extent. We're not using i_size here |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index d3afac292d67..ff1cc0399b9a 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -1840,7 +1840,15 @@ int btrfs_release_file(struct inode *inode, struct file *filp) | |||
1840 | { | 1840 | { |
1841 | if (filp->private_data) | 1841 | if (filp->private_data) |
1842 | btrfs_ioctl_trans_end(filp); | 1842 | btrfs_ioctl_trans_end(filp); |
1843 | filemap_flush(inode->i_mapping); | 1843 | /* |
1844 | * ordered_data_close is set by settattr when we are about to truncate | ||
1845 | * a file from a non-zero size to a zero size. This tries to | ||
1846 | * flush down new bytes that may have been written if the | ||
1847 | * application were using truncate to replace a file in place. | ||
1848 | */ | ||
1849 | if (test_and_clear_bit(BTRFS_INODE_ORDERED_DATA_CLOSE, | ||
1850 | &BTRFS_I(inode)->runtime_flags)) | ||
1851 | filemap_flush(inode->i_mapping); | ||
1844 | return 0; | 1852 | return 0; |
1845 | } | 1853 | } |
1846 | 1854 | ||
@@ -1958,7 +1966,7 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
1958 | 1966 | ||
1959 | btrfs_init_log_ctx(&ctx); | 1967 | btrfs_init_log_ctx(&ctx); |
1960 | 1968 | ||
1961 | ret = btrfs_log_dentry_safe(trans, root, dentry, &ctx); | 1969 | ret = btrfs_log_dentry_safe(trans, root, dentry, start, end, &ctx); |
1962 | if (ret < 0) { | 1970 | if (ret < 0) { |
1963 | /* Fallthrough and commit/free transaction. */ | 1971 | /* Fallthrough and commit/free transaction. */ |
1964 | ret = 1; | 1972 | ret = 1; |
@@ -2088,10 +2096,9 @@ static int fill_holes(struct btrfs_trans_handle *trans, struct inode *inode, | |||
2088 | goto out; | 2096 | goto out; |
2089 | } | 2097 | } |
2090 | 2098 | ||
2091 | if (hole_mergeable(inode, leaf, path->slots[0]+1, offset, end)) { | 2099 | if (hole_mergeable(inode, leaf, path->slots[0], offset, end)) { |
2092 | u64 num_bytes; | 2100 | u64 num_bytes; |
2093 | 2101 | ||
2094 | path->slots[0]++; | ||
2095 | key.offset = offset; | 2102 | key.offset = offset; |
2096 | btrfs_set_item_key_safe(root, path, &key); | 2103 | btrfs_set_item_key_safe(root, path, &key); |
2097 | fi = btrfs_item_ptr(leaf, path->slots[0], | 2104 | fi = btrfs_item_ptr(leaf, path->slots[0], |
@@ -2216,7 +2223,7 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len) | |||
2216 | goto out_only_mutex; | 2223 | goto out_only_mutex; |
2217 | } | 2224 | } |
2218 | 2225 | ||
2219 | lockstart = round_up(offset , BTRFS_I(inode)->root->sectorsize); | 2226 | lockstart = round_up(offset, BTRFS_I(inode)->root->sectorsize); |
2220 | lockend = round_down(offset + len, | 2227 | lockend = round_down(offset + len, |
2221 | BTRFS_I(inode)->root->sectorsize) - 1; | 2228 | BTRFS_I(inode)->root->sectorsize) - 1; |
2222 | same_page = ((offset >> PAGE_CACHE_SHIFT) == | 2229 | same_page = ((offset >> PAGE_CACHE_SHIFT) == |
@@ -2277,7 +2284,7 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len) | |||
2277 | tail_start + tail_len, 0, 1); | 2284 | tail_start + tail_len, 0, 1); |
2278 | if (ret) | 2285 | if (ret) |
2279 | goto out_only_mutex; | 2286 | goto out_only_mutex; |
2280 | } | 2287 | } |
2281 | } | 2288 | } |
2282 | } | 2289 | } |
2283 | 2290 | ||
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 03708ef3deef..016c403bfe7e 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -778,8 +778,12 @@ retry: | |||
778 | ins.offset, | 778 | ins.offset, |
779 | BTRFS_ORDERED_COMPRESSED, | 779 | BTRFS_ORDERED_COMPRESSED, |
780 | async_extent->compress_type); | 780 | async_extent->compress_type); |
781 | if (ret) | 781 | if (ret) { |
782 | btrfs_drop_extent_cache(inode, async_extent->start, | ||
783 | async_extent->start + | ||
784 | async_extent->ram_size - 1, 0); | ||
782 | goto out_free_reserve; | 785 | goto out_free_reserve; |
786 | } | ||
783 | 787 | ||
784 | /* | 788 | /* |
785 | * clear dirty, set writeback and unlock the pages. | 789 | * clear dirty, set writeback and unlock the pages. |
@@ -971,14 +975,14 @@ static noinline int cow_file_range(struct inode *inode, | |||
971 | ret = btrfs_add_ordered_extent(inode, start, ins.objectid, | 975 | ret = btrfs_add_ordered_extent(inode, start, ins.objectid, |
972 | ram_size, cur_alloc_size, 0); | 976 | ram_size, cur_alloc_size, 0); |
973 | if (ret) | 977 | if (ret) |
974 | goto out_reserve; | 978 | goto out_drop_extent_cache; |
975 | 979 | ||
976 | if (root->root_key.objectid == | 980 | if (root->root_key.objectid == |
977 | BTRFS_DATA_RELOC_TREE_OBJECTID) { | 981 | BTRFS_DATA_RELOC_TREE_OBJECTID) { |
978 | ret = btrfs_reloc_clone_csums(inode, start, | 982 | ret = btrfs_reloc_clone_csums(inode, start, |
979 | cur_alloc_size); | 983 | cur_alloc_size); |
980 | if (ret) | 984 | if (ret) |
981 | goto out_reserve; | 985 | goto out_drop_extent_cache; |
982 | } | 986 | } |
983 | 987 | ||
984 | if (disk_num_bytes < cur_alloc_size) | 988 | if (disk_num_bytes < cur_alloc_size) |
@@ -1006,6 +1010,8 @@ static noinline int cow_file_range(struct inode *inode, | |||
1006 | out: | 1010 | out: |
1007 | return ret; | 1011 | return ret; |
1008 | 1012 | ||
1013 | out_drop_extent_cache: | ||
1014 | btrfs_drop_extent_cache(inode, start, start + ram_size - 1, 0); | ||
1009 | out_reserve: | 1015 | out_reserve: |
1010 | btrfs_free_reserved_extent(root, ins.objectid, ins.offset, 1); | 1016 | btrfs_free_reserved_extent(root, ins.objectid, ins.offset, 1); |
1011 | out_unlock: | 1017 | out_unlock: |
@@ -1096,8 +1102,10 @@ static int cow_file_range_async(struct inode *inode, struct page *locked_page, | |||
1096 | async_cow->end = cur_end; | 1102 | async_cow->end = cur_end; |
1097 | INIT_LIST_HEAD(&async_cow->extents); | 1103 | INIT_LIST_HEAD(&async_cow->extents); |
1098 | 1104 | ||
1099 | btrfs_init_work(&async_cow->work, async_cow_start, | 1105 | btrfs_init_work(&async_cow->work, |
1100 | async_cow_submit, async_cow_free); | 1106 | btrfs_delalloc_helper, |
1107 | async_cow_start, async_cow_submit, | ||
1108 | async_cow_free); | ||
1101 | 1109 | ||
1102 | nr_pages = (cur_end - start + PAGE_CACHE_SIZE) >> | 1110 | nr_pages = (cur_end - start + PAGE_CACHE_SIZE) >> |
1103 | PAGE_CACHE_SHIFT; | 1111 | PAGE_CACHE_SHIFT; |
@@ -1881,7 +1889,8 @@ static int btrfs_writepage_start_hook(struct page *page, u64 start, u64 end) | |||
1881 | 1889 | ||
1882 | SetPageChecked(page); | 1890 | SetPageChecked(page); |
1883 | page_cache_get(page); | 1891 | page_cache_get(page); |
1884 | btrfs_init_work(&fixup->work, btrfs_writepage_fixup_worker, NULL, NULL); | 1892 | btrfs_init_work(&fixup->work, btrfs_fixup_helper, |
1893 | btrfs_writepage_fixup_worker, NULL, NULL); | ||
1885 | fixup->page = page; | 1894 | fixup->page = page; |
1886 | btrfs_queue_work(root->fs_info->fixup_workers, &fixup->work); | 1895 | btrfs_queue_work(root->fs_info->fixup_workers, &fixup->work); |
1887 | return -EBUSY; | 1896 | return -EBUSY; |
@@ -2822,7 +2831,8 @@ static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, | |||
2822 | struct inode *inode = page->mapping->host; | 2831 | struct inode *inode = page->mapping->host; |
2823 | struct btrfs_root *root = BTRFS_I(inode)->root; | 2832 | struct btrfs_root *root = BTRFS_I(inode)->root; |
2824 | struct btrfs_ordered_extent *ordered_extent = NULL; | 2833 | struct btrfs_ordered_extent *ordered_extent = NULL; |
2825 | struct btrfs_workqueue *workers; | 2834 | struct btrfs_workqueue *wq; |
2835 | btrfs_work_func_t func; | ||
2826 | 2836 | ||
2827 | trace_btrfs_writepage_end_io_hook(page, start, end, uptodate); | 2837 | trace_btrfs_writepage_end_io_hook(page, start, end, uptodate); |
2828 | 2838 | ||
@@ -2831,13 +2841,17 @@ static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, | |||
2831 | end - start + 1, uptodate)) | 2841 | end - start + 1, uptodate)) |
2832 | return 0; | 2842 | return 0; |
2833 | 2843 | ||
2834 | btrfs_init_work(&ordered_extent->work, finish_ordered_fn, NULL, NULL); | 2844 | if (btrfs_is_free_space_inode(inode)) { |
2845 | wq = root->fs_info->endio_freespace_worker; | ||
2846 | func = btrfs_freespace_write_helper; | ||
2847 | } else { | ||
2848 | wq = root->fs_info->endio_write_workers; | ||
2849 | func = btrfs_endio_write_helper; | ||
2850 | } | ||
2835 | 2851 | ||
2836 | if (btrfs_is_free_space_inode(inode)) | 2852 | btrfs_init_work(&ordered_extent->work, func, finish_ordered_fn, NULL, |
2837 | workers = root->fs_info->endio_freespace_worker; | 2853 | NULL); |
2838 | else | 2854 | btrfs_queue_work(wq, &ordered_extent->work); |
2839 | workers = root->fs_info->endio_write_workers; | ||
2840 | btrfs_queue_work(workers, &ordered_extent->work); | ||
2841 | 2855 | ||
2842 | return 0; | 2856 | return 0; |
2843 | } | 2857 | } |
@@ -4234,7 +4248,8 @@ out: | |||
4234 | btrfs_abort_transaction(trans, root, ret); | 4248 | btrfs_abort_transaction(trans, root, ret); |
4235 | } | 4249 | } |
4236 | error: | 4250 | error: |
4237 | if (last_size != (u64)-1) | 4251 | if (last_size != (u64)-1 && |
4252 | root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) | ||
4238 | btrfs_ordered_update_i_size(inode, last_size, NULL); | 4253 | btrfs_ordered_update_i_size(inode, last_size, NULL); |
4239 | btrfs_free_path(path); | 4254 | btrfs_free_path(path); |
4240 | return err; | 4255 | return err; |
@@ -4674,6 +4689,11 @@ static void evict_inode_truncate_pages(struct inode *inode) | |||
4674 | clear_bit(EXTENT_FLAG_LOGGING, &em->flags); | 4689 | clear_bit(EXTENT_FLAG_LOGGING, &em->flags); |
4675 | remove_extent_mapping(map_tree, em); | 4690 | remove_extent_mapping(map_tree, em); |
4676 | free_extent_map(em); | 4691 | free_extent_map(em); |
4692 | if (need_resched()) { | ||
4693 | write_unlock(&map_tree->lock); | ||
4694 | cond_resched(); | ||
4695 | write_lock(&map_tree->lock); | ||
4696 | } | ||
4677 | } | 4697 | } |
4678 | write_unlock(&map_tree->lock); | 4698 | write_unlock(&map_tree->lock); |
4679 | 4699 | ||
@@ -4696,6 +4716,7 @@ static void evict_inode_truncate_pages(struct inode *inode) | |||
4696 | &cached_state, GFP_NOFS); | 4716 | &cached_state, GFP_NOFS); |
4697 | free_extent_state(state); | 4717 | free_extent_state(state); |
4698 | 4718 | ||
4719 | cond_resched(); | ||
4699 | spin_lock(&io_tree->lock); | 4720 | spin_lock(&io_tree->lock); |
4700 | } | 4721 | } |
4701 | spin_unlock(&io_tree->lock); | 4722 | spin_unlock(&io_tree->lock); |
@@ -5181,6 +5202,42 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
5181 | iput(inode); | 5202 | iput(inode); |
5182 | inode = ERR_PTR(ret); | 5203 | inode = ERR_PTR(ret); |
5183 | } | 5204 | } |
5205 | /* | ||
5206 | * If orphan cleanup did remove any orphans, it means the tree | ||
5207 | * was modified and therefore the commit root is not the same as | ||
5208 | * the current root anymore. This is a problem, because send | ||
5209 | * uses the commit root and therefore can see inode items that | ||
5210 | * don't exist in the current root anymore, and for example make | ||
5211 | * calls to btrfs_iget, which will do tree lookups based on the | ||
5212 | * current root and not on the commit root. Those lookups will | ||
5213 | * fail, returning a -ESTALE error, and making send fail with | ||
5214 | * that error. So make sure a send does not see any orphans we | ||
5215 | * have just removed, and that it will see the same inodes | ||
5216 | * regardless of whether a transaction commit happened before | ||
5217 | * it started (meaning that the commit root will be the same as | ||
5218 | * the current root) or not. | ||
5219 | */ | ||
5220 | if (sub_root->node != sub_root->commit_root) { | ||
5221 | u64 sub_flags = btrfs_root_flags(&sub_root->root_item); | ||
5222 | |||
5223 | if (sub_flags & BTRFS_ROOT_SUBVOL_RDONLY) { | ||
5224 | struct extent_buffer *eb; | ||
5225 | |||
5226 | /* | ||
5227 | * Assert we can't have races between dentry | ||
5228 | * lookup called through the snapshot creation | ||
5229 | * ioctl and the VFS. | ||
5230 | */ | ||
5231 | ASSERT(mutex_is_locked(&dir->i_mutex)); | ||
5232 | |||
5233 | down_write(&root->fs_info->commit_root_sem); | ||
5234 | eb = sub_root->commit_root; | ||
5235 | sub_root->commit_root = | ||
5236 | btrfs_root_node(sub_root); | ||
5237 | up_write(&root->fs_info->commit_root_sem); | ||
5238 | free_extent_buffer(eb); | ||
5239 | } | ||
5240 | } | ||
5184 | } | 5241 | } |
5185 | 5242 | ||
5186 | return inode; | 5243 | return inode; |
@@ -5577,6 +5634,17 @@ int btrfs_set_inode_index(struct inode *dir, u64 *index) | |||
5577 | return ret; | 5634 | return ret; |
5578 | } | 5635 | } |
5579 | 5636 | ||
5637 | static int btrfs_insert_inode_locked(struct inode *inode) | ||
5638 | { | ||
5639 | struct btrfs_iget_args args; | ||
5640 | args.location = &BTRFS_I(inode)->location; | ||
5641 | args.root = BTRFS_I(inode)->root; | ||
5642 | |||
5643 | return insert_inode_locked4(inode, | ||
5644 | btrfs_inode_hash(inode->i_ino, BTRFS_I(inode)->root), | ||
5645 | btrfs_find_actor, &args); | ||
5646 | } | ||
5647 | |||
5580 | static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | 5648 | static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, |
5581 | struct btrfs_root *root, | 5649 | struct btrfs_root *root, |
5582 | struct inode *dir, | 5650 | struct inode *dir, |
@@ -5606,6 +5674,13 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
5606 | } | 5674 | } |
5607 | 5675 | ||
5608 | /* | 5676 | /* |
5677 | * O_TMPFILE, set link count to 0, so that after this point, | ||
5678 | * we fill in an inode item with the correct link count. | ||
5679 | */ | ||
5680 | if (!name) | ||
5681 | set_nlink(inode, 0); | ||
5682 | |||
5683 | /* | ||
5609 | * we have to initialize this early, so we can reclaim the inode | 5684 | * we have to initialize this early, so we can reclaim the inode |
5610 | * number if we fail afterwards in this function. | 5685 | * number if we fail afterwards in this function. |
5611 | */ | 5686 | */ |
@@ -5662,10 +5737,19 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
5662 | sizes[1] = name_len + sizeof(*ref); | 5737 | sizes[1] = name_len + sizeof(*ref); |
5663 | } | 5738 | } |
5664 | 5739 | ||
5740 | location = &BTRFS_I(inode)->location; | ||
5741 | location->objectid = objectid; | ||
5742 | location->offset = 0; | ||
5743 | btrfs_set_key_type(location, BTRFS_INODE_ITEM_KEY); | ||
5744 | |||
5745 | ret = btrfs_insert_inode_locked(inode); | ||
5746 | if (ret < 0) | ||
5747 | goto fail; | ||
5748 | |||
5665 | path->leave_spinning = 1; | 5749 | path->leave_spinning = 1; |
5666 | ret = btrfs_insert_empty_items(trans, root, path, key, sizes, nitems); | 5750 | ret = btrfs_insert_empty_items(trans, root, path, key, sizes, nitems); |
5667 | if (ret != 0) | 5751 | if (ret != 0) |
5668 | goto fail; | 5752 | goto fail_unlock; |
5669 | 5753 | ||
5670 | inode_init_owner(inode, dir, mode); | 5754 | inode_init_owner(inode, dir, mode); |
5671 | inode_set_bytes(inode, 0); | 5755 | inode_set_bytes(inode, 0); |
@@ -5688,11 +5772,6 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
5688 | btrfs_mark_buffer_dirty(path->nodes[0]); | 5772 | btrfs_mark_buffer_dirty(path->nodes[0]); |
5689 | btrfs_free_path(path); | 5773 | btrfs_free_path(path); |
5690 | 5774 | ||
5691 | location = &BTRFS_I(inode)->location; | ||
5692 | location->objectid = objectid; | ||
5693 | location->offset = 0; | ||
5694 | btrfs_set_key_type(location, BTRFS_INODE_ITEM_KEY); | ||
5695 | |||
5696 | btrfs_inherit_iflags(inode, dir); | 5775 | btrfs_inherit_iflags(inode, dir); |
5697 | 5776 | ||
5698 | if (S_ISREG(mode)) { | 5777 | if (S_ISREG(mode)) { |
@@ -5703,7 +5782,6 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
5703 | BTRFS_INODE_NODATASUM; | 5782 | BTRFS_INODE_NODATASUM; |
5704 | } | 5783 | } |
5705 | 5784 | ||
5706 | btrfs_insert_inode_hash(inode); | ||
5707 | inode_tree_add(inode); | 5785 | inode_tree_add(inode); |
5708 | 5786 | ||
5709 | trace_btrfs_inode_new(inode); | 5787 | trace_btrfs_inode_new(inode); |
@@ -5718,6 +5796,9 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
5718 | btrfs_ino(inode), root->root_key.objectid, ret); | 5796 | btrfs_ino(inode), root->root_key.objectid, ret); |
5719 | 5797 | ||
5720 | return inode; | 5798 | return inode; |
5799 | |||
5800 | fail_unlock: | ||
5801 | unlock_new_inode(inode); | ||
5721 | fail: | 5802 | fail: |
5722 | if (dir && name) | 5803 | if (dir && name) |
5723 | BTRFS_I(dir)->index_cnt--; | 5804 | BTRFS_I(dir)->index_cnt--; |
@@ -5852,28 +5933,28 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
5852 | goto out_unlock; | 5933 | goto out_unlock; |
5853 | } | 5934 | } |
5854 | 5935 | ||
5855 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); | ||
5856 | if (err) { | ||
5857 | drop_inode = 1; | ||
5858 | goto out_unlock; | ||
5859 | } | ||
5860 | |||
5861 | /* | 5936 | /* |
5862 | * If the active LSM wants to access the inode during | 5937 | * If the active LSM wants to access the inode during |
5863 | * d_instantiate it needs these. Smack checks to see | 5938 | * d_instantiate it needs these. Smack checks to see |
5864 | * if the filesystem supports xattrs by looking at the | 5939 | * if the filesystem supports xattrs by looking at the |
5865 | * ops vector. | 5940 | * ops vector. |
5866 | */ | 5941 | */ |
5867 | |||
5868 | inode->i_op = &btrfs_special_inode_operations; | 5942 | inode->i_op = &btrfs_special_inode_operations; |
5869 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 5943 | init_special_inode(inode, inode->i_mode, rdev); |
5944 | |||
5945 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); | ||
5870 | if (err) | 5946 | if (err) |
5871 | drop_inode = 1; | 5947 | goto out_unlock_inode; |
5872 | else { | 5948 | |
5873 | init_special_inode(inode, inode->i_mode, rdev); | 5949 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
5950 | if (err) { | ||
5951 | goto out_unlock_inode; | ||
5952 | } else { | ||
5874 | btrfs_update_inode(trans, root, inode); | 5953 | btrfs_update_inode(trans, root, inode); |
5954 | unlock_new_inode(inode); | ||
5875 | d_instantiate(dentry, inode); | 5955 | d_instantiate(dentry, inode); |
5876 | } | 5956 | } |
5957 | |||
5877 | out_unlock: | 5958 | out_unlock: |
5878 | btrfs_end_transaction(trans, root); | 5959 | btrfs_end_transaction(trans, root); |
5879 | btrfs_balance_delayed_items(root); | 5960 | btrfs_balance_delayed_items(root); |
@@ -5883,6 +5964,12 @@ out_unlock: | |||
5883 | iput(inode); | 5964 | iput(inode); |
5884 | } | 5965 | } |
5885 | return err; | 5966 | return err; |
5967 | |||
5968 | out_unlock_inode: | ||
5969 | drop_inode = 1; | ||
5970 | unlock_new_inode(inode); | ||
5971 | goto out_unlock; | ||
5972 | |||
5886 | } | 5973 | } |
5887 | 5974 | ||
5888 | static int btrfs_create(struct inode *dir, struct dentry *dentry, | 5975 | static int btrfs_create(struct inode *dir, struct dentry *dentry, |
@@ -5917,15 +6004,6 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
5917 | goto out_unlock; | 6004 | goto out_unlock; |
5918 | } | 6005 | } |
5919 | drop_inode_on_err = 1; | 6006 | drop_inode_on_err = 1; |
5920 | |||
5921 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); | ||
5922 | if (err) | ||
5923 | goto out_unlock; | ||
5924 | |||
5925 | err = btrfs_update_inode(trans, root, inode); | ||
5926 | if (err) | ||
5927 | goto out_unlock; | ||
5928 | |||
5929 | /* | 6007 | /* |
5930 | * If the active LSM wants to access the inode during | 6008 | * If the active LSM wants to access the inode during |
5931 | * d_instantiate it needs these. Smack checks to see | 6009 | * d_instantiate it needs these. Smack checks to see |
@@ -5934,14 +6012,23 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
5934 | */ | 6012 | */ |
5935 | inode->i_fop = &btrfs_file_operations; | 6013 | inode->i_fop = &btrfs_file_operations; |
5936 | inode->i_op = &btrfs_file_inode_operations; | 6014 | inode->i_op = &btrfs_file_inode_operations; |
6015 | inode->i_mapping->a_ops = &btrfs_aops; | ||
6016 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; | ||
6017 | |||
6018 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); | ||
6019 | if (err) | ||
6020 | goto out_unlock_inode; | ||
6021 | |||
6022 | err = btrfs_update_inode(trans, root, inode); | ||
6023 | if (err) | ||
6024 | goto out_unlock_inode; | ||
5937 | 6025 | ||
5938 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 6026 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
5939 | if (err) | 6027 | if (err) |
5940 | goto out_unlock; | 6028 | goto out_unlock_inode; |
5941 | 6029 | ||
5942 | inode->i_mapping->a_ops = &btrfs_aops; | ||
5943 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; | ||
5944 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | 6030 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; |
6031 | unlock_new_inode(inode); | ||
5945 | d_instantiate(dentry, inode); | 6032 | d_instantiate(dentry, inode); |
5946 | 6033 | ||
5947 | out_unlock: | 6034 | out_unlock: |
@@ -5953,6 +6040,11 @@ out_unlock: | |||
5953 | btrfs_balance_delayed_items(root); | 6040 | btrfs_balance_delayed_items(root); |
5954 | btrfs_btree_balance_dirty(root); | 6041 | btrfs_btree_balance_dirty(root); |
5955 | return err; | 6042 | return err; |
6043 | |||
6044 | out_unlock_inode: | ||
6045 | unlock_new_inode(inode); | ||
6046 | goto out_unlock; | ||
6047 | |||
5956 | } | 6048 | } |
5957 | 6049 | ||
5958 | static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | 6050 | static int btrfs_link(struct dentry *old_dentry, struct inode *dir, |
@@ -6060,25 +6152,30 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
6060 | } | 6152 | } |
6061 | 6153 | ||
6062 | drop_on_err = 1; | 6154 | drop_on_err = 1; |
6155 | /* these must be set before we unlock the inode */ | ||
6156 | inode->i_op = &btrfs_dir_inode_operations; | ||
6157 | inode->i_fop = &btrfs_dir_file_operations; | ||
6063 | 6158 | ||
6064 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); | 6159 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
6065 | if (err) | 6160 | if (err) |
6066 | goto out_fail; | 6161 | goto out_fail_inode; |
6067 | |||
6068 | inode->i_op = &btrfs_dir_inode_operations; | ||
6069 | inode->i_fop = &btrfs_dir_file_operations; | ||
6070 | 6162 | ||
6071 | btrfs_i_size_write(inode, 0); | 6163 | btrfs_i_size_write(inode, 0); |
6072 | err = btrfs_update_inode(trans, root, inode); | 6164 | err = btrfs_update_inode(trans, root, inode); |
6073 | if (err) | 6165 | if (err) |
6074 | goto out_fail; | 6166 | goto out_fail_inode; |
6075 | 6167 | ||
6076 | err = btrfs_add_link(trans, dir, inode, dentry->d_name.name, | 6168 | err = btrfs_add_link(trans, dir, inode, dentry->d_name.name, |
6077 | dentry->d_name.len, 0, index); | 6169 | dentry->d_name.len, 0, index); |
6078 | if (err) | 6170 | if (err) |
6079 | goto out_fail; | 6171 | goto out_fail_inode; |
6080 | 6172 | ||
6081 | d_instantiate(dentry, inode); | 6173 | d_instantiate(dentry, inode); |
6174 | /* | ||
6175 | * mkdir is special. We're unlocking after we call d_instantiate | ||
6176 | * to avoid a race with nfsd calling d_instantiate. | ||
6177 | */ | ||
6178 | unlock_new_inode(inode); | ||
6082 | drop_on_err = 0; | 6179 | drop_on_err = 0; |
6083 | 6180 | ||
6084 | out_fail: | 6181 | out_fail: |
@@ -6088,6 +6185,10 @@ out_fail: | |||
6088 | btrfs_balance_delayed_items(root); | 6185 | btrfs_balance_delayed_items(root); |
6089 | btrfs_btree_balance_dirty(root); | 6186 | btrfs_btree_balance_dirty(root); |
6090 | return err; | 6187 | return err; |
6188 | |||
6189 | out_fail_inode: | ||
6190 | unlock_new_inode(inode); | ||
6191 | goto out_fail; | ||
6091 | } | 6192 | } |
6092 | 6193 | ||
6093 | /* helper for btfs_get_extent. Given an existing extent in the tree, | 6194 | /* helper for btfs_get_extent. Given an existing extent in the tree, |
@@ -6097,14 +6198,14 @@ out_fail: | |||
6097 | static int merge_extent_mapping(struct extent_map_tree *em_tree, | 6198 | static int merge_extent_mapping(struct extent_map_tree *em_tree, |
6098 | struct extent_map *existing, | 6199 | struct extent_map *existing, |
6099 | struct extent_map *em, | 6200 | struct extent_map *em, |
6100 | u64 map_start, u64 map_len) | 6201 | u64 map_start) |
6101 | { | 6202 | { |
6102 | u64 start_diff; | 6203 | u64 start_diff; |
6103 | 6204 | ||
6104 | BUG_ON(map_start < em->start || map_start >= extent_map_end(em)); | 6205 | BUG_ON(map_start < em->start || map_start >= extent_map_end(em)); |
6105 | start_diff = map_start - em->start; | 6206 | start_diff = map_start - em->start; |
6106 | em->start = map_start; | 6207 | em->start = map_start; |
6107 | em->len = map_len; | 6208 | em->len = existing->start - em->start; |
6108 | if (em->block_start < EXTENT_MAP_LAST_BYTE && | 6209 | if (em->block_start < EXTENT_MAP_LAST_BYTE && |
6109 | !test_bit(EXTENT_FLAG_COMPRESSED, &em->flags)) { | 6210 | !test_bit(EXTENT_FLAG_COMPRESSED, &em->flags)) { |
6110 | em->block_start += start_diff; | 6211 | em->block_start += start_diff; |
@@ -6275,6 +6376,8 @@ next: | |||
6275 | goto not_found; | 6376 | goto not_found; |
6276 | if (start + len <= found_key.offset) | 6377 | if (start + len <= found_key.offset) |
6277 | goto not_found; | 6378 | goto not_found; |
6379 | if (start > found_key.offset) | ||
6380 | goto next; | ||
6278 | em->start = start; | 6381 | em->start = start; |
6279 | em->orig_start = start; | 6382 | em->orig_start = start; |
6280 | em->len = found_key.offset - start; | 6383 | em->len = found_key.offset - start; |
@@ -6390,8 +6493,7 @@ insert: | |||
6390 | em->len); | 6493 | em->len); |
6391 | if (existing) { | 6494 | if (existing) { |
6392 | err = merge_extent_mapping(em_tree, existing, | 6495 | err = merge_extent_mapping(em_tree, existing, |
6393 | em, start, | 6496 | em, start); |
6394 | root->sectorsize); | ||
6395 | free_extent_map(existing); | 6497 | free_extent_map(existing); |
6396 | if (err) { | 6498 | if (err) { |
6397 | free_extent_map(em); | 6499 | free_extent_map(em); |
@@ -7158,7 +7260,8 @@ again: | |||
7158 | if (!ret) | 7260 | if (!ret) |
7159 | goto out_test; | 7261 | goto out_test; |
7160 | 7262 | ||
7161 | btrfs_init_work(&ordered->work, finish_ordered_fn, NULL, NULL); | 7263 | btrfs_init_work(&ordered->work, btrfs_endio_write_helper, |
7264 | finish_ordered_fn, NULL, NULL); | ||
7162 | btrfs_queue_work(root->fs_info->endio_write_workers, | 7265 | btrfs_queue_work(root->fs_info->endio_write_workers, |
7163 | &ordered->work); | 7266 | &ordered->work); |
7164 | out_test: | 7267 | out_test: |
@@ -7306,10 +7409,8 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
7306 | map_length = orig_bio->bi_iter.bi_size; | 7409 | map_length = orig_bio->bi_iter.bi_size; |
7307 | ret = btrfs_map_block(root->fs_info, rw, start_sector << 9, | 7410 | ret = btrfs_map_block(root->fs_info, rw, start_sector << 9, |
7308 | &map_length, NULL, 0); | 7411 | &map_length, NULL, 0); |
7309 | if (ret) { | 7412 | if (ret) |
7310 | bio_put(orig_bio); | ||
7311 | return -EIO; | 7413 | return -EIO; |
7312 | } | ||
7313 | 7414 | ||
7314 | if (map_length >= orig_bio->bi_iter.bi_size) { | 7415 | if (map_length >= orig_bio->bi_iter.bi_size) { |
7315 | bio = orig_bio; | 7416 | bio = orig_bio; |
@@ -7326,6 +7427,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
7326 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS); | 7427 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS); |
7327 | if (!bio) | 7428 | if (!bio) |
7328 | return -ENOMEM; | 7429 | return -ENOMEM; |
7430 | |||
7329 | bio->bi_private = dip; | 7431 | bio->bi_private = dip; |
7330 | bio->bi_end_io = btrfs_end_dio_bio; | 7432 | bio->bi_end_io = btrfs_end_dio_bio; |
7331 | atomic_inc(&dip->pending_bios); | 7433 | atomic_inc(&dip->pending_bios); |
@@ -7534,7 +7636,8 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb, | |||
7534 | count = iov_iter_count(iter); | 7636 | count = iov_iter_count(iter); |
7535 | if (test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT, | 7637 | if (test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT, |
7536 | &BTRFS_I(inode)->runtime_flags)) | 7638 | &BTRFS_I(inode)->runtime_flags)) |
7537 | filemap_fdatawrite_range(inode->i_mapping, offset, count); | 7639 | filemap_fdatawrite_range(inode->i_mapping, offset, |
7640 | offset + count - 1); | ||
7538 | 7641 | ||
7539 | if (rw & WRITE) { | 7642 | if (rw & WRITE) { |
7540 | /* | 7643 | /* |
@@ -8041,6 +8144,7 @@ int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, | |||
8041 | 8144 | ||
8042 | set_nlink(inode, 1); | 8145 | set_nlink(inode, 1); |
8043 | btrfs_i_size_write(inode, 0); | 8146 | btrfs_i_size_write(inode, 0); |
8147 | unlock_new_inode(inode); | ||
8044 | 8148 | ||
8045 | err = btrfs_subvol_inherit_props(trans, new_root, parent_root); | 8149 | err = btrfs_subvol_inherit_props(trans, new_root, parent_root); |
8046 | if (err) | 8150 | if (err) |
@@ -8495,7 +8599,9 @@ struct btrfs_delalloc_work *btrfs_alloc_delalloc_work(struct inode *inode, | |||
8495 | work->inode = inode; | 8599 | work->inode = inode; |
8496 | work->wait = wait; | 8600 | work->wait = wait; |
8497 | work->delay_iput = delay_iput; | 8601 | work->delay_iput = delay_iput; |
8498 | btrfs_init_work(&work->work, btrfs_run_delalloc_work, NULL, NULL); | 8602 | WARN_ON_ONCE(!inode); |
8603 | btrfs_init_work(&work->work, btrfs_flush_delalloc_helper, | ||
8604 | btrfs_run_delalloc_work, NULL, NULL); | ||
8499 | 8605 | ||
8500 | return work; | 8606 | return work; |
8501 | } | 8607 | } |
@@ -8699,12 +8805,6 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
8699 | goto out_unlock; | 8805 | goto out_unlock; |
8700 | } | 8806 | } |
8701 | 8807 | ||
8702 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); | ||
8703 | if (err) { | ||
8704 | drop_inode = 1; | ||
8705 | goto out_unlock; | ||
8706 | } | ||
8707 | |||
8708 | /* | 8808 | /* |
8709 | * If the active LSM wants to access the inode during | 8809 | * If the active LSM wants to access the inode during |
8710 | * d_instantiate it needs these. Smack checks to see | 8810 | * d_instantiate it needs these. Smack checks to see |
@@ -8713,23 +8813,22 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
8713 | */ | 8813 | */ |
8714 | inode->i_fop = &btrfs_file_operations; | 8814 | inode->i_fop = &btrfs_file_operations; |
8715 | inode->i_op = &btrfs_file_inode_operations; | 8815 | inode->i_op = &btrfs_file_inode_operations; |
8816 | inode->i_mapping->a_ops = &btrfs_aops; | ||
8817 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; | ||
8818 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | ||
8819 | |||
8820 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); | ||
8821 | if (err) | ||
8822 | goto out_unlock_inode; | ||
8716 | 8823 | ||
8717 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 8824 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
8718 | if (err) | 8825 | if (err) |
8719 | drop_inode = 1; | 8826 | goto out_unlock_inode; |
8720 | else { | ||
8721 | inode->i_mapping->a_ops = &btrfs_aops; | ||
8722 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; | ||
8723 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | ||
8724 | } | ||
8725 | if (drop_inode) | ||
8726 | goto out_unlock; | ||
8727 | 8827 | ||
8728 | path = btrfs_alloc_path(); | 8828 | path = btrfs_alloc_path(); |
8729 | if (!path) { | 8829 | if (!path) { |
8730 | err = -ENOMEM; | 8830 | err = -ENOMEM; |
8731 | drop_inode = 1; | 8831 | goto out_unlock_inode; |
8732 | goto out_unlock; | ||
8733 | } | 8832 | } |
8734 | key.objectid = btrfs_ino(inode); | 8833 | key.objectid = btrfs_ino(inode); |
8735 | key.offset = 0; | 8834 | key.offset = 0; |
@@ -8738,9 +8837,8 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
8738 | err = btrfs_insert_empty_item(trans, root, path, &key, | 8837 | err = btrfs_insert_empty_item(trans, root, path, &key, |
8739 | datasize); | 8838 | datasize); |
8740 | if (err) { | 8839 | if (err) { |
8741 | drop_inode = 1; | ||
8742 | btrfs_free_path(path); | 8840 | btrfs_free_path(path); |
8743 | goto out_unlock; | 8841 | goto out_unlock_inode; |
8744 | } | 8842 | } |
8745 | leaf = path->nodes[0]; | 8843 | leaf = path->nodes[0]; |
8746 | ei = btrfs_item_ptr(leaf, path->slots[0], | 8844 | ei = btrfs_item_ptr(leaf, path->slots[0], |
@@ -8764,12 +8862,15 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
8764 | inode_set_bytes(inode, name_len); | 8862 | inode_set_bytes(inode, name_len); |
8765 | btrfs_i_size_write(inode, name_len); | 8863 | btrfs_i_size_write(inode, name_len); |
8766 | err = btrfs_update_inode(trans, root, inode); | 8864 | err = btrfs_update_inode(trans, root, inode); |
8767 | if (err) | 8865 | if (err) { |
8768 | drop_inode = 1; | 8866 | drop_inode = 1; |
8867 | goto out_unlock_inode; | ||
8868 | } | ||
8869 | |||
8870 | unlock_new_inode(inode); | ||
8871 | d_instantiate(dentry, inode); | ||
8769 | 8872 | ||
8770 | out_unlock: | 8873 | out_unlock: |
8771 | if (!err) | ||
8772 | d_instantiate(dentry, inode); | ||
8773 | btrfs_end_transaction(trans, root); | 8874 | btrfs_end_transaction(trans, root); |
8774 | if (drop_inode) { | 8875 | if (drop_inode) { |
8775 | inode_dec_link_count(inode); | 8876 | inode_dec_link_count(inode); |
@@ -8777,6 +8878,11 @@ out_unlock: | |||
8777 | } | 8878 | } |
8778 | btrfs_btree_balance_dirty(root); | 8879 | btrfs_btree_balance_dirty(root); |
8779 | return err; | 8880 | return err; |
8881 | |||
8882 | out_unlock_inode: | ||
8883 | drop_inode = 1; | ||
8884 | unlock_new_inode(inode); | ||
8885 | goto out_unlock; | ||
8780 | } | 8886 | } |
8781 | 8887 | ||
8782 | static int __btrfs_prealloc_file_range(struct inode *inode, int mode, | 8888 | static int __btrfs_prealloc_file_range(struct inode *inode, int mode, |
@@ -8960,14 +9066,6 @@ static int btrfs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
8960 | goto out; | 9066 | goto out; |
8961 | } | 9067 | } |
8962 | 9068 | ||
8963 | ret = btrfs_init_inode_security(trans, inode, dir, NULL); | ||
8964 | if (ret) | ||
8965 | goto out; | ||
8966 | |||
8967 | ret = btrfs_update_inode(trans, root, inode); | ||
8968 | if (ret) | ||
8969 | goto out; | ||
8970 | |||
8971 | inode->i_fop = &btrfs_file_operations; | 9069 | inode->i_fop = &btrfs_file_operations; |
8972 | inode->i_op = &btrfs_file_inode_operations; | 9070 | inode->i_op = &btrfs_file_inode_operations; |
8973 | 9071 | ||
@@ -8975,10 +9073,26 @@ static int btrfs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
8975 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; | 9073 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; |
8976 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | 9074 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; |
8977 | 9075 | ||
9076 | ret = btrfs_init_inode_security(trans, inode, dir, NULL); | ||
9077 | if (ret) | ||
9078 | goto out_inode; | ||
9079 | |||
9080 | ret = btrfs_update_inode(trans, root, inode); | ||
9081 | if (ret) | ||
9082 | goto out_inode; | ||
8978 | ret = btrfs_orphan_add(trans, inode); | 9083 | ret = btrfs_orphan_add(trans, inode); |
8979 | if (ret) | 9084 | if (ret) |
8980 | goto out; | 9085 | goto out_inode; |
8981 | 9086 | ||
9087 | /* | ||
9088 | * We set number of links to 0 in btrfs_new_inode(), and here we set | ||
9089 | * it to 1 because d_tmpfile() will issue a warning if the count is 0, | ||
9090 | * through: | ||
9091 | * | ||
9092 | * d_tmpfile() -> inode_dec_link_count() -> drop_nlink() | ||
9093 | */ | ||
9094 | set_nlink(inode, 1); | ||
9095 | unlock_new_inode(inode); | ||
8982 | d_tmpfile(dentry, inode); | 9096 | d_tmpfile(dentry, inode); |
8983 | mark_inode_dirty(inode); | 9097 | mark_inode_dirty(inode); |
8984 | 9098 | ||
@@ -8988,8 +9102,12 @@ out: | |||
8988 | iput(inode); | 9102 | iput(inode); |
8989 | btrfs_balance_delayed_items(root); | 9103 | btrfs_balance_delayed_items(root); |
8990 | btrfs_btree_balance_dirty(root); | 9104 | btrfs_btree_balance_dirty(root); |
8991 | |||
8992 | return ret; | 9105 | return ret; |
9106 | |||
9107 | out_inode: | ||
9108 | unlock_new_inode(inode); | ||
9109 | goto out; | ||
9110 | |||
8993 | } | 9111 | } |
8994 | 9112 | ||
8995 | static const struct inode_operations btrfs_dir_inode_operations = { | 9113 | static const struct inode_operations btrfs_dir_inode_operations = { |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 47aceb494d1d..8a8e29878c34 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -711,39 +711,6 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir, | |||
711 | if (ret) | 711 | if (ret) |
712 | goto fail; | 712 | goto fail; |
713 | 713 | ||
714 | ret = btrfs_orphan_cleanup(pending_snapshot->snap); | ||
715 | if (ret) | ||
716 | goto fail; | ||
717 | |||
718 | /* | ||
719 | * If orphan cleanup did remove any orphans, it means the tree was | ||
720 | * modified and therefore the commit root is not the same as the | ||
721 | * current root anymore. This is a problem, because send uses the | ||
722 | * commit root and therefore can see inode items that don't exist | ||
723 | * in the current root anymore, and for example make calls to | ||
724 | * btrfs_iget, which will do tree lookups based on the current root | ||
725 | * and not on the commit root. Those lookups will fail, returning a | ||
726 | * -ESTALE error, and making send fail with that error. So make sure | ||
727 | * a send does not see any orphans we have just removed, and that it | ||
728 | * will see the same inodes regardless of whether a transaction | ||
729 | * commit happened before it started (meaning that the commit root | ||
730 | * will be the same as the current root) or not. | ||
731 | */ | ||
732 | if (readonly && pending_snapshot->snap->node != | ||
733 | pending_snapshot->snap->commit_root) { | ||
734 | trans = btrfs_join_transaction(pending_snapshot->snap); | ||
735 | if (IS_ERR(trans) && PTR_ERR(trans) != -ENOENT) { | ||
736 | ret = PTR_ERR(trans); | ||
737 | goto fail; | ||
738 | } | ||
739 | if (!IS_ERR(trans)) { | ||
740 | ret = btrfs_commit_transaction(trans, | ||
741 | pending_snapshot->snap); | ||
742 | if (ret) | ||
743 | goto fail; | ||
744 | } | ||
745 | } | ||
746 | |||
747 | inode = btrfs_lookup_dentry(dentry->d_parent->d_inode, dentry); | 714 | inode = btrfs_lookup_dentry(dentry->d_parent->d_inode, dentry); |
748 | if (IS_ERR(inode)) { | 715 | if (IS_ERR(inode)) { |
749 | ret = PTR_ERR(inode); | 716 | ret = PTR_ERR(inode); |
@@ -1052,8 +1019,10 @@ static bool defrag_check_next_extent(struct inode *inode, struct extent_map *em) | |||
1052 | return false; | 1019 | return false; |
1053 | 1020 | ||
1054 | next = defrag_lookup_extent(inode, em->start + em->len); | 1021 | next = defrag_lookup_extent(inode, em->start + em->len); |
1055 | if (!next || next->block_start >= EXTENT_MAP_LAST_BYTE || | 1022 | if (!next || next->block_start >= EXTENT_MAP_LAST_BYTE) |
1056 | (em->block_start + em->block_len == next->block_start)) | 1023 | ret = false; |
1024 | else if ((em->block_start + em->block_len == next->block_start) && | ||
1025 | (em->block_len > 128 * 1024 && next->block_len > 128 * 1024)) | ||
1057 | ret = false; | 1026 | ret = false; |
1058 | 1027 | ||
1059 | free_extent_map(next); | 1028 | free_extent_map(next); |
@@ -1088,7 +1057,6 @@ static int should_defrag_range(struct inode *inode, u64 start, int thresh, | |||
1088 | } | 1057 | } |
1089 | 1058 | ||
1090 | next_mergeable = defrag_check_next_extent(inode, em); | 1059 | next_mergeable = defrag_check_next_extent(inode, em); |
1091 | |||
1092 | /* | 1060 | /* |
1093 | * we hit a real extent, if it is big or the next extent is not a | 1061 | * we hit a real extent, if it is big or the next extent is not a |
1094 | * real extent, don't bother defragging it | 1062 | * real extent, don't bother defragging it |
@@ -1735,7 +1703,7 @@ static noinline int btrfs_ioctl_snap_create_v2(struct file *file, | |||
1735 | ~(BTRFS_SUBVOL_CREATE_ASYNC | BTRFS_SUBVOL_RDONLY | | 1703 | ~(BTRFS_SUBVOL_CREATE_ASYNC | BTRFS_SUBVOL_RDONLY | |
1736 | BTRFS_SUBVOL_QGROUP_INHERIT)) { | 1704 | BTRFS_SUBVOL_QGROUP_INHERIT)) { |
1737 | ret = -EOPNOTSUPP; | 1705 | ret = -EOPNOTSUPP; |
1738 | goto out; | 1706 | goto free_args; |
1739 | } | 1707 | } |
1740 | 1708 | ||
1741 | if (vol_args->flags & BTRFS_SUBVOL_CREATE_ASYNC) | 1709 | if (vol_args->flags & BTRFS_SUBVOL_CREATE_ASYNC) |
@@ -1745,27 +1713,31 @@ static noinline int btrfs_ioctl_snap_create_v2(struct file *file, | |||
1745 | if (vol_args->flags & BTRFS_SUBVOL_QGROUP_INHERIT) { | 1713 | if (vol_args->flags & BTRFS_SUBVOL_QGROUP_INHERIT) { |
1746 | if (vol_args->size > PAGE_CACHE_SIZE) { | 1714 | if (vol_args->size > PAGE_CACHE_SIZE) { |
1747 | ret = -EINVAL; | 1715 | ret = -EINVAL; |
1748 | goto out; | 1716 | goto free_args; |
1749 | } | 1717 | } |
1750 | inherit = memdup_user(vol_args->qgroup_inherit, vol_args->size); | 1718 | inherit = memdup_user(vol_args->qgroup_inherit, vol_args->size); |
1751 | if (IS_ERR(inherit)) { | 1719 | if (IS_ERR(inherit)) { |
1752 | ret = PTR_ERR(inherit); | 1720 | ret = PTR_ERR(inherit); |
1753 | goto out; | 1721 | goto free_args; |
1754 | } | 1722 | } |
1755 | } | 1723 | } |
1756 | 1724 | ||
1757 | ret = btrfs_ioctl_snap_create_transid(file, vol_args->name, | 1725 | ret = btrfs_ioctl_snap_create_transid(file, vol_args->name, |
1758 | vol_args->fd, subvol, ptr, | 1726 | vol_args->fd, subvol, ptr, |
1759 | readonly, inherit); | 1727 | readonly, inherit); |
1728 | if (ret) | ||
1729 | goto free_inherit; | ||
1760 | 1730 | ||
1761 | if (ret == 0 && ptr && | 1731 | if (ptr && copy_to_user(arg + |
1762 | copy_to_user(arg + | 1732 | offsetof(struct btrfs_ioctl_vol_args_v2, |
1763 | offsetof(struct btrfs_ioctl_vol_args_v2, | 1733 | transid), |
1764 | transid), ptr, sizeof(*ptr))) | 1734 | ptr, sizeof(*ptr))) |
1765 | ret = -EFAULT; | 1735 | ret = -EFAULT; |
1766 | out: | 1736 | |
1767 | kfree(vol_args); | 1737 | free_inherit: |
1768 | kfree(inherit); | 1738 | kfree(inherit); |
1739 | free_args: | ||
1740 | kfree(vol_args); | ||
1769 | return ret; | 1741 | return ret; |
1770 | } | 1742 | } |
1771 | 1743 | ||
@@ -2685,7 +2657,7 @@ static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg) | |||
2685 | vol_args = memdup_user(arg, sizeof(*vol_args)); | 2657 | vol_args = memdup_user(arg, sizeof(*vol_args)); |
2686 | if (IS_ERR(vol_args)) { | 2658 | if (IS_ERR(vol_args)) { |
2687 | ret = PTR_ERR(vol_args); | 2659 | ret = PTR_ERR(vol_args); |
2688 | goto out; | 2660 | goto err_drop; |
2689 | } | 2661 | } |
2690 | 2662 | ||
2691 | vol_args->name[BTRFS_PATH_NAME_MAX] = '\0'; | 2663 | vol_args->name[BTRFS_PATH_NAME_MAX] = '\0'; |
@@ -2703,6 +2675,7 @@ static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg) | |||
2703 | 2675 | ||
2704 | out: | 2676 | out: |
2705 | kfree(vol_args); | 2677 | kfree(vol_args); |
2678 | err_drop: | ||
2706 | mnt_drop_write_file(file); | 2679 | mnt_drop_write_file(file); |
2707 | return ret; | 2680 | return ret; |
2708 | } | 2681 | } |
@@ -3527,7 +3500,8 @@ process_slot: | |||
3527 | btrfs_mark_buffer_dirty(leaf); | 3500 | btrfs_mark_buffer_dirty(leaf); |
3528 | btrfs_release_path(path); | 3501 | btrfs_release_path(path); |
3529 | 3502 | ||
3530 | last_dest_end = new_key.offset + datal; | 3503 | last_dest_end = ALIGN(new_key.offset + datal, |
3504 | root->sectorsize); | ||
3531 | ret = clone_finish_inode_update(trans, inode, | 3505 | ret = clone_finish_inode_update(trans, inode, |
3532 | last_dest_end, | 3506 | last_dest_end, |
3533 | destoff, olen); | 3507 | destoff, olen); |
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index 963895c1f801..ac734ec4cc20 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c | |||
@@ -615,6 +615,7 @@ int btrfs_wait_ordered_extents(struct btrfs_root *root, int nr) | |||
615 | spin_unlock(&root->ordered_extent_lock); | 615 | spin_unlock(&root->ordered_extent_lock); |
616 | 616 | ||
617 | btrfs_init_work(&ordered->flush_work, | 617 | btrfs_init_work(&ordered->flush_work, |
618 | btrfs_flush_delalloc_helper, | ||
618 | btrfs_run_ordered_extent_work, NULL, NULL); | 619 | btrfs_run_ordered_extent_work, NULL, NULL); |
619 | list_add_tail(&ordered->work_list, &works); | 620 | list_add_tail(&ordered->work_list, &works); |
620 | btrfs_queue_work(root->fs_info->flush_workers, | 621 | btrfs_queue_work(root->fs_info->flush_workers, |
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index b497498484be..ded5c601d916 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c | |||
@@ -1973,7 +1973,7 @@ static int qgroup_subtree_accounting(struct btrfs_trans_handle *trans, | |||
1973 | elem.seq, &roots); | 1973 | elem.seq, &roots); |
1974 | btrfs_put_tree_mod_seq(fs_info, &elem); | 1974 | btrfs_put_tree_mod_seq(fs_info, &elem); |
1975 | if (ret < 0) | 1975 | if (ret < 0) |
1976 | return ret; | 1976 | goto out; |
1977 | 1977 | ||
1978 | if (roots->nnodes != 1) | 1978 | if (roots->nnodes != 1) |
1979 | goto out; | 1979 | goto out; |
@@ -2720,6 +2720,7 @@ qgroup_rescan_init(struct btrfs_fs_info *fs_info, u64 progress_objectid, | |||
2720 | memset(&fs_info->qgroup_rescan_work, 0, | 2720 | memset(&fs_info->qgroup_rescan_work, 0, |
2721 | sizeof(fs_info->qgroup_rescan_work)); | 2721 | sizeof(fs_info->qgroup_rescan_work)); |
2722 | btrfs_init_work(&fs_info->qgroup_rescan_work, | 2722 | btrfs_init_work(&fs_info->qgroup_rescan_work, |
2723 | btrfs_qgroup_rescan_helper, | ||
2723 | btrfs_qgroup_rescan_worker, NULL, NULL); | 2724 | btrfs_qgroup_rescan_worker, NULL, NULL); |
2724 | 2725 | ||
2725 | if (ret) { | 2726 | if (ret) { |
diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c index 4a88f073fdd7..0a6b6e4bcbb9 100644 --- a/fs/btrfs/raid56.c +++ b/fs/btrfs/raid56.c | |||
@@ -1416,7 +1416,8 @@ cleanup: | |||
1416 | 1416 | ||
1417 | static void async_rmw_stripe(struct btrfs_raid_bio *rbio) | 1417 | static void async_rmw_stripe(struct btrfs_raid_bio *rbio) |
1418 | { | 1418 | { |
1419 | btrfs_init_work(&rbio->work, rmw_work, NULL, NULL); | 1419 | btrfs_init_work(&rbio->work, btrfs_rmw_helper, |
1420 | rmw_work, NULL, NULL); | ||
1420 | 1421 | ||
1421 | btrfs_queue_work(rbio->fs_info->rmw_workers, | 1422 | btrfs_queue_work(rbio->fs_info->rmw_workers, |
1422 | &rbio->work); | 1423 | &rbio->work); |
@@ -1424,7 +1425,8 @@ static void async_rmw_stripe(struct btrfs_raid_bio *rbio) | |||
1424 | 1425 | ||
1425 | static void async_read_rebuild(struct btrfs_raid_bio *rbio) | 1426 | static void async_read_rebuild(struct btrfs_raid_bio *rbio) |
1426 | { | 1427 | { |
1427 | btrfs_init_work(&rbio->work, read_rebuild_work, NULL, NULL); | 1428 | btrfs_init_work(&rbio->work, btrfs_rmw_helper, |
1429 | read_rebuild_work, NULL, NULL); | ||
1428 | 1430 | ||
1429 | btrfs_queue_work(rbio->fs_info->rmw_workers, | 1431 | btrfs_queue_work(rbio->fs_info->rmw_workers, |
1430 | &rbio->work); | 1432 | &rbio->work); |
@@ -1665,7 +1667,8 @@ static void btrfs_raid_unplug(struct blk_plug_cb *cb, bool from_schedule) | |||
1665 | plug = container_of(cb, struct btrfs_plug_cb, cb); | 1667 | plug = container_of(cb, struct btrfs_plug_cb, cb); |
1666 | 1668 | ||
1667 | if (from_schedule) { | 1669 | if (from_schedule) { |
1668 | btrfs_init_work(&plug->work, unplug_work, NULL, NULL); | 1670 | btrfs_init_work(&plug->work, btrfs_rmw_helper, |
1671 | unplug_work, NULL, NULL); | ||
1669 | btrfs_queue_work(plug->info->rmw_workers, | 1672 | btrfs_queue_work(plug->info->rmw_workers, |
1670 | &plug->work); | 1673 | &plug->work); |
1671 | return; | 1674 | return; |
diff --git a/fs/btrfs/reada.c b/fs/btrfs/reada.c index 09230cf3a244..20408c6b665a 100644 --- a/fs/btrfs/reada.c +++ b/fs/btrfs/reada.c | |||
@@ -798,7 +798,8 @@ static void reada_start_machine(struct btrfs_fs_info *fs_info) | |||
798 | /* FIXME we cannot handle this properly right now */ | 798 | /* FIXME we cannot handle this properly right now */ |
799 | BUG(); | 799 | BUG(); |
800 | } | 800 | } |
801 | btrfs_init_work(&rmw->work, reada_start_machine_worker, NULL, NULL); | 801 | btrfs_init_work(&rmw->work, btrfs_readahead_helper, |
802 | reada_start_machine_worker, NULL, NULL); | ||
802 | rmw->fs_info = fs_info; | 803 | rmw->fs_info = fs_info; |
803 | 804 | ||
804 | btrfs_queue_work(fs_info->readahead_workers, &rmw->work); | 805 | btrfs_queue_work(fs_info->readahead_workers, &rmw->work); |
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index b6d198f5181e..f4a41f37be22 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
@@ -428,8 +428,8 @@ struct scrub_ctx *scrub_setup_ctx(struct btrfs_device *dev, int is_dev_replace) | |||
428 | sbio->index = i; | 428 | sbio->index = i; |
429 | sbio->sctx = sctx; | 429 | sbio->sctx = sctx; |
430 | sbio->page_count = 0; | 430 | sbio->page_count = 0; |
431 | btrfs_init_work(&sbio->work, scrub_bio_end_io_worker, | 431 | btrfs_init_work(&sbio->work, btrfs_scrub_helper, |
432 | NULL, NULL); | 432 | scrub_bio_end_io_worker, NULL, NULL); |
433 | 433 | ||
434 | if (i != SCRUB_BIOS_PER_SCTX - 1) | 434 | if (i != SCRUB_BIOS_PER_SCTX - 1) |
435 | sctx->bios[i]->next_free = i + 1; | 435 | sctx->bios[i]->next_free = i + 1; |
@@ -999,8 +999,8 @@ nodatasum_case: | |||
999 | fixup_nodatasum->root = fs_info->extent_root; | 999 | fixup_nodatasum->root = fs_info->extent_root; |
1000 | fixup_nodatasum->mirror_num = failed_mirror_index + 1; | 1000 | fixup_nodatasum->mirror_num = failed_mirror_index + 1; |
1001 | scrub_pending_trans_workers_inc(sctx); | 1001 | scrub_pending_trans_workers_inc(sctx); |
1002 | btrfs_init_work(&fixup_nodatasum->work, scrub_fixup_nodatasum, | 1002 | btrfs_init_work(&fixup_nodatasum->work, btrfs_scrub_helper, |
1003 | NULL, NULL); | 1003 | scrub_fixup_nodatasum, NULL, NULL); |
1004 | btrfs_queue_work(fs_info->scrub_workers, | 1004 | btrfs_queue_work(fs_info->scrub_workers, |
1005 | &fixup_nodatasum->work); | 1005 | &fixup_nodatasum->work); |
1006 | goto out; | 1006 | goto out; |
@@ -1616,7 +1616,8 @@ static void scrub_wr_bio_end_io(struct bio *bio, int err) | |||
1616 | sbio->err = err; | 1616 | sbio->err = err; |
1617 | sbio->bio = bio; | 1617 | sbio->bio = bio; |
1618 | 1618 | ||
1619 | btrfs_init_work(&sbio->work, scrub_wr_bio_end_io_worker, NULL, NULL); | 1619 | btrfs_init_work(&sbio->work, btrfs_scrubwrc_helper, |
1620 | scrub_wr_bio_end_io_worker, NULL, NULL); | ||
1620 | btrfs_queue_work(fs_info->scrub_wr_completion_workers, &sbio->work); | 1621 | btrfs_queue_work(fs_info->scrub_wr_completion_workers, &sbio->work); |
1621 | } | 1622 | } |
1622 | 1623 | ||
@@ -2904,6 +2905,7 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, | |||
2904 | struct scrub_ctx *sctx; | 2905 | struct scrub_ctx *sctx; |
2905 | int ret; | 2906 | int ret; |
2906 | struct btrfs_device *dev; | 2907 | struct btrfs_device *dev; |
2908 | struct rcu_string *name; | ||
2907 | 2909 | ||
2908 | if (btrfs_fs_closing(fs_info)) | 2910 | if (btrfs_fs_closing(fs_info)) |
2909 | return -EINVAL; | 2911 | return -EINVAL; |
@@ -2965,6 +2967,16 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, | |||
2965 | return -ENODEV; | 2967 | return -ENODEV; |
2966 | } | 2968 | } |
2967 | 2969 | ||
2970 | if (!is_dev_replace && !readonly && !dev->writeable) { | ||
2971 | mutex_unlock(&fs_info->fs_devices->device_list_mutex); | ||
2972 | rcu_read_lock(); | ||
2973 | name = rcu_dereference(dev->name); | ||
2974 | btrfs_err(fs_info, "scrub: device %s is not writable", | ||
2975 | name->str); | ||
2976 | rcu_read_unlock(); | ||
2977 | return -EROFS; | ||
2978 | } | ||
2979 | |||
2968 | mutex_lock(&fs_info->scrub_lock); | 2980 | mutex_lock(&fs_info->scrub_lock); |
2969 | if (!dev->in_fs_metadata || dev->is_tgtdev_for_dev_replace) { | 2981 | if (!dev->in_fs_metadata || dev->is_tgtdev_for_dev_replace) { |
2970 | mutex_unlock(&fs_info->scrub_lock); | 2982 | mutex_unlock(&fs_info->scrub_lock); |
@@ -3203,7 +3215,8 @@ static int copy_nocow_pages(struct scrub_ctx *sctx, u64 logical, u64 len, | |||
3203 | nocow_ctx->len = len; | 3215 | nocow_ctx->len = len; |
3204 | nocow_ctx->mirror_num = mirror_num; | 3216 | nocow_ctx->mirror_num = mirror_num; |
3205 | nocow_ctx->physical_for_dev_replace = physical_for_dev_replace; | 3217 | nocow_ctx->physical_for_dev_replace = physical_for_dev_replace; |
3206 | btrfs_init_work(&nocow_ctx->work, copy_nocow_pages_worker, NULL, NULL); | 3218 | btrfs_init_work(&nocow_ctx->work, btrfs_scrubnc_helper, |
3219 | copy_nocow_pages_worker, NULL, NULL); | ||
3207 | INIT_LIST_HEAD(&nocow_ctx->inodes); | 3220 | INIT_LIST_HEAD(&nocow_ctx->inodes); |
3208 | btrfs_queue_work(fs_info->scrub_nocow_workers, | 3221 | btrfs_queue_work(fs_info->scrub_nocow_workers, |
3209 | &nocow_ctx->work); | 3222 | &nocow_ctx->work); |
diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 78699364f537..12e53556e214 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c | |||
@@ -614,7 +614,7 @@ int btrfs_kobj_rm_device(struct btrfs_fs_info *fs_info, | |||
614 | if (!fs_info->device_dir_kobj) | 614 | if (!fs_info->device_dir_kobj) |
615 | return -EINVAL; | 615 | return -EINVAL; |
616 | 616 | ||
617 | if (one_device) { | 617 | if (one_device && one_device->bdev) { |
618 | disk = one_device->bdev->bd_part; | 618 | disk = one_device->bdev->bd_part; |
619 | disk_kobj = &part_to_dev(disk)->kobj; | 619 | disk_kobj = &part_to_dev(disk)->kobj; |
620 | 620 | ||
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 9e1f2cd5e67a..1d1ba083ca6e 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -94,8 +94,10 @@ | |||
94 | #define LOG_WALK_REPLAY_ALL 3 | 94 | #define LOG_WALK_REPLAY_ALL 3 |
95 | 95 | ||
96 | static int btrfs_log_inode(struct btrfs_trans_handle *trans, | 96 | static int btrfs_log_inode(struct btrfs_trans_handle *trans, |
97 | struct btrfs_root *root, struct inode *inode, | 97 | struct btrfs_root *root, struct inode *inode, |
98 | int inode_only); | 98 | int inode_only, |
99 | const loff_t start, | ||
100 | const loff_t end); | ||
99 | static int link_to_fixup_dir(struct btrfs_trans_handle *trans, | 101 | static int link_to_fixup_dir(struct btrfs_trans_handle *trans, |
100 | struct btrfs_root *root, | 102 | struct btrfs_root *root, |
101 | struct btrfs_path *path, u64 objectid); | 103 | struct btrfs_path *path, u64 objectid); |
@@ -3298,7 +3300,7 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, | |||
3298 | struct list_head ordered_sums; | 3300 | struct list_head ordered_sums; |
3299 | int skip_csum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; | 3301 | int skip_csum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; |
3300 | bool has_extents = false; | 3302 | bool has_extents = false; |
3301 | bool need_find_last_extent = (*last_extent == 0); | 3303 | bool need_find_last_extent = true; |
3302 | bool done = false; | 3304 | bool done = false; |
3303 | 3305 | ||
3304 | INIT_LIST_HEAD(&ordered_sums); | 3306 | INIT_LIST_HEAD(&ordered_sums); |
@@ -3352,8 +3354,7 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, | |||
3352 | */ | 3354 | */ |
3353 | if (ins_keys[i].type == BTRFS_EXTENT_DATA_KEY) { | 3355 | if (ins_keys[i].type == BTRFS_EXTENT_DATA_KEY) { |
3354 | has_extents = true; | 3356 | has_extents = true; |
3355 | if (need_find_last_extent && | 3357 | if (first_key.objectid == (u64)-1) |
3356 | first_key.objectid == (u64)-1) | ||
3357 | first_key = ins_keys[i]; | 3358 | first_key = ins_keys[i]; |
3358 | } else { | 3359 | } else { |
3359 | need_find_last_extent = false; | 3360 | need_find_last_extent = false; |
@@ -3427,6 +3428,16 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, | |||
3427 | if (!has_extents) | 3428 | if (!has_extents) |
3428 | return ret; | 3429 | return ret; |
3429 | 3430 | ||
3431 | if (need_find_last_extent && *last_extent == first_key.offset) { | ||
3432 | /* | ||
3433 | * We don't have any leafs between our current one and the one | ||
3434 | * we processed before that can have file extent items for our | ||
3435 | * inode (and have a generation number smaller than our current | ||
3436 | * transaction id). | ||
3437 | */ | ||
3438 | need_find_last_extent = false; | ||
3439 | } | ||
3440 | |||
3430 | /* | 3441 | /* |
3431 | * Because we use btrfs_search_forward we could skip leaves that were | 3442 | * Because we use btrfs_search_forward we could skip leaves that were |
3432 | * not modified and then assume *last_extent is valid when it really | 3443 | * not modified and then assume *last_extent is valid when it really |
@@ -3537,7 +3548,7 @@ fill_holes: | |||
3537 | 0, 0); | 3548 | 0, 0); |
3538 | if (ret) | 3549 | if (ret) |
3539 | break; | 3550 | break; |
3540 | *last_extent = offset + len; | 3551 | *last_extent = extent_end; |
3541 | } | 3552 | } |
3542 | /* | 3553 | /* |
3543 | * Need to let the callers know we dropped the path so they should | 3554 | * Need to let the callers know we dropped the path so they should |
@@ -3849,8 +3860,10 @@ process: | |||
3849 | * This handles both files and directories. | 3860 | * This handles both files and directories. |
3850 | */ | 3861 | */ |
3851 | static int btrfs_log_inode(struct btrfs_trans_handle *trans, | 3862 | static int btrfs_log_inode(struct btrfs_trans_handle *trans, |
3852 | struct btrfs_root *root, struct inode *inode, | 3863 | struct btrfs_root *root, struct inode *inode, |
3853 | int inode_only) | 3864 | int inode_only, |
3865 | const loff_t start, | ||
3866 | const loff_t end) | ||
3854 | { | 3867 | { |
3855 | struct btrfs_path *path; | 3868 | struct btrfs_path *path; |
3856 | struct btrfs_path *dst_path; | 3869 | struct btrfs_path *dst_path; |
@@ -3867,6 +3880,7 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans, | |||
3867 | int ins_nr; | 3880 | int ins_nr; |
3868 | bool fast_search = false; | 3881 | bool fast_search = false; |
3869 | u64 ino = btrfs_ino(inode); | 3882 | u64 ino = btrfs_ino(inode); |
3883 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | ||
3870 | 3884 | ||
3871 | path = btrfs_alloc_path(); | 3885 | path = btrfs_alloc_path(); |
3872 | if (!path) | 3886 | if (!path) |
@@ -4040,13 +4054,35 @@ log_extents: | |||
4040 | goto out_unlock; | 4054 | goto out_unlock; |
4041 | } | 4055 | } |
4042 | } else if (inode_only == LOG_INODE_ALL) { | 4056 | } else if (inode_only == LOG_INODE_ALL) { |
4043 | struct extent_map_tree *tree = &BTRFS_I(inode)->extent_tree; | ||
4044 | struct extent_map *em, *n; | 4057 | struct extent_map *em, *n; |
4045 | 4058 | ||
4046 | write_lock(&tree->lock); | 4059 | write_lock(&em_tree->lock); |
4047 | list_for_each_entry_safe(em, n, &tree->modified_extents, list) | 4060 | /* |
4048 | list_del_init(&em->list); | 4061 | * We can't just remove every em if we're called for a ranged |
4049 | write_unlock(&tree->lock); | 4062 | * fsync - that is, one that doesn't cover the whole possible |
4063 | * file range (0 to LLONG_MAX). This is because we can have | ||
4064 | * em's that fall outside the range we're logging and therefore | ||
4065 | * their ordered operations haven't completed yet | ||
4066 | * (btrfs_finish_ordered_io() not invoked yet). This means we | ||
4067 | * didn't get their respective file extent item in the fs/subvol | ||
4068 | * tree yet, and need to let the next fast fsync (one which | ||
4069 | * consults the list of modified extent maps) find the em so | ||
4070 | * that it logs a matching file extent item and waits for the | ||
4071 | * respective ordered operation to complete (if it's still | ||
4072 | * running). | ||
4073 | * | ||
4074 | * Removing every em outside the range we're logging would make | ||
4075 | * the next fast fsync not log their matching file extent items, | ||
4076 | * therefore making us lose data after a log replay. | ||
4077 | */ | ||
4078 | list_for_each_entry_safe(em, n, &em_tree->modified_extents, | ||
4079 | list) { | ||
4080 | const u64 mod_end = em->mod_start + em->mod_len - 1; | ||
4081 | |||
4082 | if (em->mod_start >= start && mod_end <= end) | ||
4083 | list_del_init(&em->list); | ||
4084 | } | ||
4085 | write_unlock(&em_tree->lock); | ||
4050 | } | 4086 | } |
4051 | 4087 | ||
4052 | if (inode_only == LOG_INODE_ALL && S_ISDIR(inode->i_mode)) { | 4088 | if (inode_only == LOG_INODE_ALL && S_ISDIR(inode->i_mode)) { |
@@ -4056,6 +4092,7 @@ log_extents: | |||
4056 | goto out_unlock; | 4092 | goto out_unlock; |
4057 | } | 4093 | } |
4058 | } | 4094 | } |
4095 | |||
4059 | BTRFS_I(inode)->logged_trans = trans->transid; | 4096 | BTRFS_I(inode)->logged_trans = trans->transid; |
4060 | BTRFS_I(inode)->last_log_commit = BTRFS_I(inode)->last_sub_trans; | 4097 | BTRFS_I(inode)->last_log_commit = BTRFS_I(inode)->last_sub_trans; |
4061 | out_unlock: | 4098 | out_unlock: |
@@ -4152,7 +4189,10 @@ out: | |||
4152 | */ | 4189 | */ |
4153 | static int btrfs_log_inode_parent(struct btrfs_trans_handle *trans, | 4190 | static int btrfs_log_inode_parent(struct btrfs_trans_handle *trans, |
4154 | struct btrfs_root *root, struct inode *inode, | 4191 | struct btrfs_root *root, struct inode *inode, |
4155 | struct dentry *parent, int exists_only, | 4192 | struct dentry *parent, |
4193 | const loff_t start, | ||
4194 | const loff_t end, | ||
4195 | int exists_only, | ||
4156 | struct btrfs_log_ctx *ctx) | 4196 | struct btrfs_log_ctx *ctx) |
4157 | { | 4197 | { |
4158 | int inode_only = exists_only ? LOG_INODE_EXISTS : LOG_INODE_ALL; | 4198 | int inode_only = exists_only ? LOG_INODE_EXISTS : LOG_INODE_ALL; |
@@ -4198,7 +4238,7 @@ static int btrfs_log_inode_parent(struct btrfs_trans_handle *trans, | |||
4198 | if (ret) | 4238 | if (ret) |
4199 | goto end_no_trans; | 4239 | goto end_no_trans; |
4200 | 4240 | ||
4201 | ret = btrfs_log_inode(trans, root, inode, inode_only); | 4241 | ret = btrfs_log_inode(trans, root, inode, inode_only, start, end); |
4202 | if (ret) | 4242 | if (ret) |
4203 | goto end_trans; | 4243 | goto end_trans; |
4204 | 4244 | ||
@@ -4226,7 +4266,8 @@ static int btrfs_log_inode_parent(struct btrfs_trans_handle *trans, | |||
4226 | 4266 | ||
4227 | if (BTRFS_I(inode)->generation > | 4267 | if (BTRFS_I(inode)->generation > |
4228 | root->fs_info->last_trans_committed) { | 4268 | root->fs_info->last_trans_committed) { |
4229 | ret = btrfs_log_inode(trans, root, inode, inode_only); | 4269 | ret = btrfs_log_inode(trans, root, inode, inode_only, |
4270 | 0, LLONG_MAX); | ||
4230 | if (ret) | 4271 | if (ret) |
4231 | goto end_trans; | 4272 | goto end_trans; |
4232 | } | 4273 | } |
@@ -4260,13 +4301,15 @@ end_no_trans: | |||
4260 | */ | 4301 | */ |
4261 | int btrfs_log_dentry_safe(struct btrfs_trans_handle *trans, | 4302 | int btrfs_log_dentry_safe(struct btrfs_trans_handle *trans, |
4262 | struct btrfs_root *root, struct dentry *dentry, | 4303 | struct btrfs_root *root, struct dentry *dentry, |
4304 | const loff_t start, | ||
4305 | const loff_t end, | ||
4263 | struct btrfs_log_ctx *ctx) | 4306 | struct btrfs_log_ctx *ctx) |
4264 | { | 4307 | { |
4265 | struct dentry *parent = dget_parent(dentry); | 4308 | struct dentry *parent = dget_parent(dentry); |
4266 | int ret; | 4309 | int ret; |
4267 | 4310 | ||
4268 | ret = btrfs_log_inode_parent(trans, root, dentry->d_inode, parent, | 4311 | ret = btrfs_log_inode_parent(trans, root, dentry->d_inode, parent, |
4269 | 0, ctx); | 4312 | start, end, 0, ctx); |
4270 | dput(parent); | 4313 | dput(parent); |
4271 | 4314 | ||
4272 | return ret; | 4315 | return ret; |
@@ -4503,6 +4546,7 @@ int btrfs_log_new_name(struct btrfs_trans_handle *trans, | |||
4503 | root->fs_info->last_trans_committed)) | 4546 | root->fs_info->last_trans_committed)) |
4504 | return 0; | 4547 | return 0; |
4505 | 4548 | ||
4506 | return btrfs_log_inode_parent(trans, root, inode, parent, 1, NULL); | 4549 | return btrfs_log_inode_parent(trans, root, inode, parent, 0, |
4550 | LLONG_MAX, 1, NULL); | ||
4507 | } | 4551 | } |
4508 | 4552 | ||
diff --git a/fs/btrfs/tree-log.h b/fs/btrfs/tree-log.h index 7f5b41bd5373..e2e798ae7cd7 100644 --- a/fs/btrfs/tree-log.h +++ b/fs/btrfs/tree-log.h | |||
@@ -59,6 +59,8 @@ int btrfs_free_log_root_tree(struct btrfs_trans_handle *trans, | |||
59 | int btrfs_recover_log_trees(struct btrfs_root *tree_root); | 59 | int btrfs_recover_log_trees(struct btrfs_root *tree_root); |
60 | int btrfs_log_dentry_safe(struct btrfs_trans_handle *trans, | 60 | int btrfs_log_dentry_safe(struct btrfs_trans_handle *trans, |
61 | struct btrfs_root *root, struct dentry *dentry, | 61 | struct btrfs_root *root, struct dentry *dentry, |
62 | const loff_t start, | ||
63 | const loff_t end, | ||
62 | struct btrfs_log_ctx *ctx); | 64 | struct btrfs_log_ctx *ctx); |
63 | int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans, | 65 | int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans, |
64 | struct btrfs_root *root, | 66 | struct btrfs_root *root, |
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 6cb82f62cb7c..2c2d6d1d8eee 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -508,6 +508,43 @@ static noinline int device_list_add(const char *path, | |||
508 | ret = 1; | 508 | ret = 1; |
509 | device->fs_devices = fs_devices; | 509 | device->fs_devices = fs_devices; |
510 | } else if (!device->name || strcmp(device->name->str, path)) { | 510 | } else if (!device->name || strcmp(device->name->str, path)) { |
511 | /* | ||
512 | * When FS is already mounted. | ||
513 | * 1. If you are here and if the device->name is NULL that | ||
514 | * means this device was missing at time of FS mount. | ||
515 | * 2. If you are here and if the device->name is different | ||
516 | * from 'path' that means either | ||
517 | * a. The same device disappeared and reappeared with | ||
518 | * different name. or | ||
519 | * b. The missing-disk-which-was-replaced, has | ||
520 | * reappeared now. | ||
521 | * | ||
522 | * We must allow 1 and 2a above. But 2b would be a spurious | ||
523 | * and unintentional. | ||
524 | * | ||
525 | * Further in case of 1 and 2a above, the disk at 'path' | ||
526 | * would have missed some transaction when it was away and | ||
527 | * in case of 2a the stale bdev has to be updated as well. | ||
528 | * 2b must not be allowed at all time. | ||
529 | */ | ||
530 | |||
531 | /* | ||
532 | * For now, we do allow update to btrfs_fs_device through the | ||
533 | * btrfs dev scan cli after FS has been mounted. We're still | ||
534 | * tracking a problem where systems fail mount by subvolume id | ||
535 | * when we reject replacement on a mounted FS. | ||
536 | */ | ||
537 | if (!fs_devices->opened && found_transid < device->generation) { | ||
538 | /* | ||
539 | * That is if the FS is _not_ mounted and if you | ||
540 | * are here, that means there is more than one | ||
541 | * disk with same uuid and devid.We keep the one | ||
542 | * with larger generation number or the last-in if | ||
543 | * generation are equal. | ||
544 | */ | ||
545 | return -EEXIST; | ||
546 | } | ||
547 | |||
511 | name = rcu_string_strdup(path, GFP_NOFS); | 548 | name = rcu_string_strdup(path, GFP_NOFS); |
512 | if (!name) | 549 | if (!name) |
513 | return -ENOMEM; | 550 | return -ENOMEM; |
@@ -519,6 +556,15 @@ static noinline int device_list_add(const char *path, | |||
519 | } | 556 | } |
520 | } | 557 | } |
521 | 558 | ||
559 | /* | ||
560 | * Unmount does not free the btrfs_device struct but would zero | ||
561 | * generation along with most of the other members. So just update | ||
562 | * it back. We need it to pick the disk with largest generation | ||
563 | * (as above). | ||
564 | */ | ||
565 | if (!fs_devices->opened) | ||
566 | device->generation = found_transid; | ||
567 | |||
522 | if (found_transid > fs_devices->latest_trans) { | 568 | if (found_transid > fs_devices->latest_trans) { |
523 | fs_devices->latest_devid = devid; | 569 | fs_devices->latest_devid = devid; |
524 | fs_devices->latest_trans = found_transid; | 570 | fs_devices->latest_trans = found_transid; |
@@ -1436,7 +1482,7 @@ static int btrfs_add_device(struct btrfs_trans_handle *trans, | |||
1436 | btrfs_set_device_io_align(leaf, dev_item, device->io_align); | 1482 | btrfs_set_device_io_align(leaf, dev_item, device->io_align); |
1437 | btrfs_set_device_io_width(leaf, dev_item, device->io_width); | 1483 | btrfs_set_device_io_width(leaf, dev_item, device->io_width); |
1438 | btrfs_set_device_sector_size(leaf, dev_item, device->sector_size); | 1484 | btrfs_set_device_sector_size(leaf, dev_item, device->sector_size); |
1439 | btrfs_set_device_total_bytes(leaf, dev_item, device->total_bytes); | 1485 | btrfs_set_device_total_bytes(leaf, dev_item, device->disk_total_bytes); |
1440 | btrfs_set_device_bytes_used(leaf, dev_item, device->bytes_used); | 1486 | btrfs_set_device_bytes_used(leaf, dev_item, device->bytes_used); |
1441 | btrfs_set_device_group(leaf, dev_item, 0); | 1487 | btrfs_set_device_group(leaf, dev_item, 0); |
1442 | btrfs_set_device_seek_speed(leaf, dev_item, 0); | 1488 | btrfs_set_device_seek_speed(leaf, dev_item, 0); |
@@ -1671,7 +1717,7 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path) | |||
1671 | device->fs_devices->total_devices--; | 1717 | device->fs_devices->total_devices--; |
1672 | 1718 | ||
1673 | if (device->missing) | 1719 | if (device->missing) |
1674 | root->fs_info->fs_devices->missing_devices--; | 1720 | device->fs_devices->missing_devices--; |
1675 | 1721 | ||
1676 | next_device = list_entry(root->fs_info->fs_devices->devices.next, | 1722 | next_device = list_entry(root->fs_info->fs_devices->devices.next, |
1677 | struct btrfs_device, dev_list); | 1723 | struct btrfs_device, dev_list); |
@@ -1801,8 +1847,12 @@ void btrfs_rm_dev_replace_srcdev(struct btrfs_fs_info *fs_info, | |||
1801 | if (srcdev->bdev) { | 1847 | if (srcdev->bdev) { |
1802 | fs_info->fs_devices->open_devices--; | 1848 | fs_info->fs_devices->open_devices--; |
1803 | 1849 | ||
1804 | /* zero out the old super */ | 1850 | /* |
1805 | btrfs_scratch_superblock(srcdev); | 1851 | * zero out the old super if it is not writable |
1852 | * (e.g. seed device) | ||
1853 | */ | ||
1854 | if (srcdev->writeable) | ||
1855 | btrfs_scratch_superblock(srcdev); | ||
1806 | } | 1856 | } |
1807 | 1857 | ||
1808 | call_rcu(&srcdev->rcu, free_device); | 1858 | call_rcu(&srcdev->rcu, free_device); |
@@ -1941,6 +1991,9 @@ static int btrfs_prepare_sprout(struct btrfs_root *root) | |||
1941 | fs_devices->seeding = 0; | 1991 | fs_devices->seeding = 0; |
1942 | fs_devices->num_devices = 0; | 1992 | fs_devices->num_devices = 0; |
1943 | fs_devices->open_devices = 0; | 1993 | fs_devices->open_devices = 0; |
1994 | fs_devices->missing_devices = 0; | ||
1995 | fs_devices->num_can_discard = 0; | ||
1996 | fs_devices->rotating = 0; | ||
1944 | fs_devices->seed = seed_devices; | 1997 | fs_devices->seed = seed_devices; |
1945 | 1998 | ||
1946 | generate_random_uuid(fs_devices->fsid); | 1999 | generate_random_uuid(fs_devices->fsid); |
@@ -5800,7 +5853,8 @@ struct btrfs_device *btrfs_alloc_device(struct btrfs_fs_info *fs_info, | |||
5800 | else | 5853 | else |
5801 | generate_random_uuid(dev->uuid); | 5854 | generate_random_uuid(dev->uuid); |
5802 | 5855 | ||
5803 | btrfs_init_work(&dev->work, pending_bios_fn, NULL, NULL); | 5856 | btrfs_init_work(&dev->work, btrfs_submit_helper, |
5857 | pending_bios_fn, NULL, NULL); | ||
5804 | 5858 | ||
5805 | return dev; | 5859 | return dev; |
5806 | } | 5860 | } |