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 c9a24444ec9a..2256e9cceec5 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 3955e475ceec..4cd0ac983f91 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -3458,7 +3458,7 @@ static int lock_extent_buffer_for_io(struct extent_buffer *eb, | |||
3458 | static void end_extent_buffer_writeback(struct extent_buffer *eb) | 3458 | static void end_extent_buffer_writeback(struct extent_buffer *eb) |
3459 | { | 3459 | { |
3460 | clear_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags); | 3460 | clear_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags); |
3461 | smp_mb__after_clear_bit(); | 3461 | smp_mb__after_atomic(); |
3462 | wake_up_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK); | 3462 | wake_up_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK); |
3463 | } | 3463 | } |
3464 | 3464 | ||
@@ -4510,7 +4510,8 @@ static void check_buffer_tree_ref(struct extent_buffer *eb) | |||
4510 | spin_unlock(&eb->refs_lock); | 4510 | spin_unlock(&eb->refs_lock); |
4511 | } | 4511 | } |
4512 | 4512 | ||
4513 | static void mark_extent_buffer_accessed(struct extent_buffer *eb) | 4513 | static void mark_extent_buffer_accessed(struct extent_buffer *eb, |
4514 | struct page *accessed) | ||
4514 | { | 4515 | { |
4515 | unsigned long num_pages, i; | 4516 | unsigned long num_pages, i; |
4516 | 4517 | ||
@@ -4519,7 +4520,8 @@ static void mark_extent_buffer_accessed(struct extent_buffer *eb) | |||
4519 | num_pages = num_extent_pages(eb->start, eb->len); | 4520 | num_pages = num_extent_pages(eb->start, eb->len); |
4520 | for (i = 0; i < num_pages; i++) { | 4521 | for (i = 0; i < num_pages; i++) { |
4521 | struct page *p = extent_buffer_page(eb, i); | 4522 | struct page *p = extent_buffer_page(eb, i); |
4522 | mark_page_accessed(p); | 4523 | if (p != accessed) |
4524 | mark_page_accessed(p); | ||
4523 | } | 4525 | } |
4524 | } | 4526 | } |
4525 | 4527 | ||
@@ -4533,7 +4535,7 @@ struct extent_buffer *find_extent_buffer(struct btrfs_fs_info *fs_info, | |||
4533 | start >> PAGE_CACHE_SHIFT); | 4535 | start >> PAGE_CACHE_SHIFT); |
4534 | if (eb && atomic_inc_not_zero(&eb->refs)) { | 4536 | if (eb && atomic_inc_not_zero(&eb->refs)) { |
4535 | rcu_read_unlock(); | 4537 | rcu_read_unlock(); |
4536 | mark_extent_buffer_accessed(eb); | 4538 | mark_extent_buffer_accessed(eb, NULL); |
4537 | return eb; | 4539 | return eb; |
4538 | } | 4540 | } |
4539 | rcu_read_unlock(); | 4541 | rcu_read_unlock(); |
@@ -4581,7 +4583,7 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info, | |||
4581 | spin_unlock(&mapping->private_lock); | 4583 | spin_unlock(&mapping->private_lock); |
4582 | unlock_page(p); | 4584 | unlock_page(p); |
4583 | page_cache_release(p); | 4585 | page_cache_release(p); |
4584 | mark_extent_buffer_accessed(exists); | 4586 | mark_extent_buffer_accessed(exists, p); |
4585 | goto free_eb; | 4587 | goto free_eb; |
4586 | } | 4588 | } |
4587 | 4589 | ||
@@ -4596,7 +4598,6 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info, | |||
4596 | attach_extent_buffer_page(eb, p); | 4598 | attach_extent_buffer_page(eb, p); |
4597 | spin_unlock(&mapping->private_lock); | 4599 | spin_unlock(&mapping->private_lock); |
4598 | WARN_ON(PageDirty(p)); | 4600 | WARN_ON(PageDirty(p)); |
4599 | mark_page_accessed(p); | ||
4600 | eb->pages[i] = p; | 4601 | eb->pages[i] = p; |
4601 | if (!PageUptodate(p)) | 4602 | if (!PageUptodate(p)) |
4602 | uptodate = 0; | 4603 | uptodate = 0; |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index ae6af072b635..74272a3f9d9b 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -470,11 +470,12 @@ static void btrfs_drop_pages(struct page **pages, size_t num_pages) | |||
470 | for (i = 0; i < num_pages; i++) { | 470 | for (i = 0; i < num_pages; i++) { |
471 | /* page checked is some magic around finding pages that | 471 | /* page checked is some magic around finding pages that |
472 | * have been modified without going through btrfs_set_page_dirty | 472 | * have been modified without going through btrfs_set_page_dirty |
473 | * clear it here | 473 | * clear it here. There should be no need to mark the pages |
474 | * accessed as prepare_pages should have marked them accessed | ||
475 | * in prepare_pages via find_or_create_page() | ||
474 | */ | 476 | */ |
475 | ClearPageChecked(pages[i]); | 477 | ClearPageChecked(pages[i]); |
476 | unlock_page(pages[i]); | 478 | unlock_page(pages[i]); |
477 | mark_page_accessed(pages[i]); | ||
478 | page_cache_release(pages[i]); | 479 | page_cache_release(pages[i]); |
479 | } | 480 | } |
480 | } | 481 | } |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 5f805bc944fa..5a3b8371772e 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -7126,7 +7126,7 @@ static void btrfs_end_dio_bio(struct bio *bio, int err) | |||
7126 | * before atomic variable goto zero, we must make sure | 7126 | * before atomic variable goto zero, we must make sure |
7127 | * dip->errors is perceived to be set. | 7127 | * dip->errors is perceived to be set. |
7128 | */ | 7128 | */ |
7129 | smp_mb__before_atomic_dec(); | 7129 | smp_mb__before_atomic(); |
7130 | } | 7130 | } |
7131 | 7131 | ||
7132 | /* if there are more bios still pending for this dio, just exit */ | 7132 | /* if there are more bios still pending for this dio, just exit */ |
@@ -7306,7 +7306,7 @@ out_err: | |||
7306 | * before atomic variable goto zero, we must | 7306 | * before atomic variable goto zero, we must |
7307 | * make sure dip->errors is perceived to be set. | 7307 | * make sure dip->errors is perceived to be set. |
7308 | */ | 7308 | */ |
7309 | smp_mb__before_atomic_dec(); | 7309 | smp_mb__before_atomic(); |
7310 | if (atomic_dec_and_test(&dip->pending_bios)) | 7310 | if (atomic_dec_and_test(&dip->pending_bios)) |
7311 | bio_io_error(dip->orig_bio); | 7311 | bio_io_error(dip->orig_bio); |
7312 | 7312 | ||
@@ -7449,7 +7449,7 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb, | |||
7449 | return 0; | 7449 | return 0; |
7450 | 7450 | ||
7451 | atomic_inc(&inode->i_dio_count); | 7451 | atomic_inc(&inode->i_dio_count); |
7452 | smp_mb__after_atomic_inc(); | 7452 | smp_mb__after_atomic(); |
7453 | 7453 | ||
7454 | /* | 7454 | /* |
7455 | * The generic stuff only does filemap_write_and_wait_range, which | 7455 | * The generic stuff only does filemap_write_and_wait_range, which |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 2f6d7b13b5bd..3f52bb7a58d2 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -642,7 +642,7 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir, | |||
642 | return -EINVAL; | 642 | return -EINVAL; |
643 | 643 | ||
644 | atomic_inc(&root->will_be_snapshoted); | 644 | atomic_inc(&root->will_be_snapshoted); |
645 | smp_mb__after_atomic_inc(); | 645 | smp_mb__after_atomic(); |
646 | btrfs_wait_nocow_write(root); | 646 | btrfs_wait_nocow_write(root); |
647 | 647 | ||
648 | ret = btrfs_start_delalloc_inodes(root, 0); | 648 | ret = btrfs_start_delalloc_inodes(root, 0); |