diff options
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/btrfs_inode.h | 2 | ||||
-rw-r--r-- | fs/btrfs/extent_io.c | 13 | ||||
-rw-r--r-- | fs/btrfs/file.c | 5 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 6 | ||||
-rw-r--r-- | fs/btrfs/ioctl.c | 2 |
5 files changed, 15 insertions, 13 deletions
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index a0cf3e56fe20..4794923c410c 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h | |||
@@ -279,7 +279,7 @@ static inline void btrfs_inode_block_unlocked_dio(struct inode *inode) | |||
279 | 279 | ||
280 | static inline void btrfs_inode_resume_unlocked_dio(struct inode *inode) | 280 | static inline void btrfs_inode_resume_unlocked_dio(struct inode *inode) |
281 | { | 281 | { |
282 | smp_mb__before_clear_bit(); | 282 | smp_mb__before_atomic(); |
283 | clear_bit(BTRFS_INODE_READDIO_NEED_LOCK, | 283 | clear_bit(BTRFS_INODE_READDIO_NEED_LOCK, |
284 | &BTRFS_I(inode)->runtime_flags); | 284 | &BTRFS_I(inode)->runtime_flags); |
285 | } | 285 | } |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 0b5fa91d9a88..f25a9092b946 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -3523,7 +3523,7 @@ lock_extent_buffer_for_io(struct extent_buffer *eb, | |||
3523 | static void end_extent_buffer_writeback(struct extent_buffer *eb) | 3523 | static void end_extent_buffer_writeback(struct extent_buffer *eb) |
3524 | { | 3524 | { |
3525 | clear_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags); | 3525 | clear_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags); |
3526 | smp_mb__after_clear_bit(); | 3526 | smp_mb__after_atomic(); |
3527 | wake_up_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK); | 3527 | wake_up_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK); |
3528 | } | 3528 | } |
3529 | 3529 | ||
@@ -4576,7 +4576,8 @@ static void check_buffer_tree_ref(struct extent_buffer *eb) | |||
4576 | spin_unlock(&eb->refs_lock); | 4576 | spin_unlock(&eb->refs_lock); |
4577 | } | 4577 | } |
4578 | 4578 | ||
4579 | static void mark_extent_buffer_accessed(struct extent_buffer *eb) | 4579 | static void mark_extent_buffer_accessed(struct extent_buffer *eb, |
4580 | struct page *accessed) | ||
4580 | { | 4581 | { |
4581 | unsigned long num_pages, i; | 4582 | unsigned long num_pages, i; |
4582 | 4583 | ||
@@ -4585,7 +4586,8 @@ static void mark_extent_buffer_accessed(struct extent_buffer *eb) | |||
4585 | num_pages = num_extent_pages(eb->start, eb->len); | 4586 | num_pages = num_extent_pages(eb->start, eb->len); |
4586 | for (i = 0; i < num_pages; i++) { | 4587 | for (i = 0; i < num_pages; i++) { |
4587 | struct page *p = extent_buffer_page(eb, i); | 4588 | struct page *p = extent_buffer_page(eb, i); |
4588 | mark_page_accessed(p); | 4589 | if (p != accessed) |
4590 | mark_page_accessed(p); | ||
4589 | } | 4591 | } |
4590 | } | 4592 | } |
4591 | 4593 | ||
@@ -4599,7 +4601,7 @@ struct extent_buffer *find_extent_buffer(struct btrfs_fs_info *fs_info, | |||
4599 | start >> PAGE_CACHE_SHIFT); | 4601 | start >> PAGE_CACHE_SHIFT); |
4600 | if (eb && atomic_inc_not_zero(&eb->refs)) { | 4602 | if (eb && atomic_inc_not_zero(&eb->refs)) { |
4601 | rcu_read_unlock(); | 4603 | rcu_read_unlock(); |
4602 | mark_extent_buffer_accessed(eb); | 4604 | mark_extent_buffer_accessed(eb, NULL); |
4603 | return eb; | 4605 | return eb; |
4604 | } | 4606 | } |
4605 | rcu_read_unlock(); | 4607 | rcu_read_unlock(); |
@@ -4694,7 +4696,7 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info, | |||
4694 | spin_unlock(&mapping->private_lock); | 4696 | spin_unlock(&mapping->private_lock); |
4695 | unlock_page(p); | 4697 | unlock_page(p); |
4696 | page_cache_release(p); | 4698 | page_cache_release(p); |
4697 | mark_extent_buffer_accessed(exists); | 4699 | mark_extent_buffer_accessed(exists, p); |
4698 | goto free_eb; | 4700 | goto free_eb; |
4699 | } | 4701 | } |
4700 | 4702 | ||
@@ -4709,7 +4711,6 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info, | |||
4709 | attach_extent_buffer_page(eb, p); | 4711 | attach_extent_buffer_page(eb, p); |
4710 | spin_unlock(&mapping->private_lock); | 4712 | spin_unlock(&mapping->private_lock); |
4711 | WARN_ON(PageDirty(p)); | 4713 | WARN_ON(PageDirty(p)); |
4712 | mark_page_accessed(p); | ||
4713 | eb->pages[i] = p; | 4714 | eb->pages[i] = p; |
4714 | if (!PageUptodate(p)) | 4715 | if (!PageUptodate(p)) |
4715 | uptodate = 0; | 4716 | uptodate = 0; |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index ad7c05909a49..e472441feb5d 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -471,11 +471,12 @@ static void btrfs_drop_pages(struct page **pages, size_t num_pages) | |||
471 | for (i = 0; i < num_pages; i++) { | 471 | for (i = 0; i < num_pages; i++) { |
472 | /* page checked is some magic around finding pages that | 472 | /* page checked is some magic around finding pages that |
473 | * have been modified without going through btrfs_set_page_dirty | 473 | * have been modified without going through btrfs_set_page_dirty |
474 | * clear it here | 474 | * clear it here. There should be no need to mark the pages |
475 | * accessed as prepare_pages should have marked them accessed | ||
476 | * in prepare_pages via find_or_create_page() | ||
475 | */ | 477 | */ |
476 | ClearPageChecked(pages[i]); | 478 | ClearPageChecked(pages[i]); |
477 | unlock_page(pages[i]); | 479 | unlock_page(pages[i]); |
478 | mark_page_accessed(pages[i]); | ||
479 | page_cache_release(pages[i]); | 480 | page_cache_release(pages[i]); |
480 | } | 481 | } |
481 | } | 482 | } |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 372b2cb2b297..7fa5f7fd7bc7 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -7180,7 +7180,7 @@ static void btrfs_end_dio_bio(struct bio *bio, int err) | |||
7180 | * before atomic variable goto zero, we must make sure | 7180 | * before atomic variable goto zero, we must make sure |
7181 | * dip->errors is perceived to be set. | 7181 | * dip->errors is perceived to be set. |
7182 | */ | 7182 | */ |
7183 | smp_mb__before_atomic_dec(); | 7183 | smp_mb__before_atomic(); |
7184 | } | 7184 | } |
7185 | 7185 | ||
7186 | /* if there are more bios still pending for this dio, just exit */ | 7186 | /* if there are more bios still pending for this dio, just exit */ |
@@ -7360,7 +7360,7 @@ out_err: | |||
7360 | * before atomic variable goto zero, we must | 7360 | * before atomic variable goto zero, we must |
7361 | * make sure dip->errors is perceived to be set. | 7361 | * make sure dip->errors is perceived to be set. |
7362 | */ | 7362 | */ |
7363 | smp_mb__before_atomic_dec(); | 7363 | smp_mb__before_atomic(); |
7364 | if (atomic_dec_and_test(&dip->pending_bios)) | 7364 | if (atomic_dec_and_test(&dip->pending_bios)) |
7365 | bio_io_error(dip->orig_bio); | 7365 | bio_io_error(dip->orig_bio); |
7366 | 7366 | ||
@@ -7503,7 +7503,7 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb, | |||
7503 | return 0; | 7503 | return 0; |
7504 | 7504 | ||
7505 | atomic_inc(&inode->i_dio_count); | 7505 | atomic_inc(&inode->i_dio_count); |
7506 | smp_mb__after_atomic_inc(); | 7506 | smp_mb__after_atomic(); |
7507 | 7507 | ||
7508 | /* | 7508 | /* |
7509 | * The generic stuff only does filemap_write_and_wait_range, which | 7509 | * The generic stuff only does filemap_write_and_wait_range, which |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index c2e796b664c1..82c18ba12e3f 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -643,7 +643,7 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir, | |||
643 | return -EINVAL; | 643 | return -EINVAL; |
644 | 644 | ||
645 | atomic_inc(&root->will_be_snapshoted); | 645 | atomic_inc(&root->will_be_snapshoted); |
646 | smp_mb__after_atomic_inc(); | 646 | smp_mb__after_atomic(); |
647 | btrfs_wait_nocow_write(root); | 647 | btrfs_wait_nocow_write(root); |
648 | 648 | ||
649 | ret = btrfs_start_delalloc_inodes(root, 0); | 649 | ret = btrfs_start_delalloc_inodes(root, 0); |