aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/btrfs_inode.h2
-rw-r--r--fs/btrfs/extent_io.c13
-rw-r--r--fs/btrfs/file.c5
-rw-r--r--fs/btrfs/inode.c6
-rw-r--r--fs/btrfs/ioctl.c2
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
280static inline void btrfs_inode_resume_unlocked_dio(struct inode *inode) 280static 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,
3523static void end_extent_buffer_writeback(struct extent_buffer *eb) 3523static 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
4579static void mark_extent_buffer_accessed(struct extent_buffer *eb) 4579static 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);