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 | 8 | ||||
| -rw-r--r-- | fs/btrfs/send.c | 9 |
6 files changed, 26 insertions, 17 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 2ad7de94efef..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); |
| @@ -3120,6 +3120,8 @@ process_slot: | |||
| 3120 | } else if (type == BTRFS_FILE_EXTENT_INLINE) { | 3120 | } else if (type == BTRFS_FILE_EXTENT_INLINE) { |
| 3121 | u64 skip = 0; | 3121 | u64 skip = 0; |
| 3122 | u64 trim = 0; | 3122 | u64 trim = 0; |
| 3123 | u64 aligned_end = 0; | ||
| 3124 | |||
| 3123 | if (off > key.offset) { | 3125 | if (off > key.offset) { |
| 3124 | skip = off - key.offset; | 3126 | skip = off - key.offset; |
| 3125 | new_key.offset += skip; | 3127 | new_key.offset += skip; |
| @@ -3136,9 +3138,11 @@ process_slot: | |||
| 3136 | size -= skip + trim; | 3138 | size -= skip + trim; |
| 3137 | datal -= skip + trim; | 3139 | datal -= skip + trim; |
| 3138 | 3140 | ||
| 3141 | aligned_end = ALIGN(new_key.offset + datal, | ||
| 3142 | root->sectorsize); | ||
| 3139 | ret = btrfs_drop_extents(trans, root, inode, | 3143 | ret = btrfs_drop_extents(trans, root, inode, |
| 3140 | new_key.offset, | 3144 | new_key.offset, |
| 3141 | new_key.offset + datal, | 3145 | aligned_end, |
| 3142 | 1); | 3146 | 1); |
| 3143 | if (ret) { | 3147 | if (ret) { |
| 3144 | if (ret != -EOPNOTSUPP) | 3148 | if (ret != -EOPNOTSUPP) |
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index eb6537a08c1b..484aacac2c89 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c | |||
| @@ -360,10 +360,13 @@ static int fs_path_ensure_buf(struct fs_path *p, int len) | |||
| 360 | /* | 360 | /* |
| 361 | * First time the inline_buf does not suffice | 361 | * First time the inline_buf does not suffice |
| 362 | */ | 362 | */ |
| 363 | if (p->buf == p->inline_buf) | 363 | if (p->buf == p->inline_buf) { |
| 364 | tmp_buf = kmalloc(len, GFP_NOFS); | 364 | tmp_buf = kmalloc(len, GFP_NOFS); |
| 365 | else | 365 | if (tmp_buf) |
| 366 | memcpy(tmp_buf, p->buf, old_buf_len); | ||
| 367 | } else { | ||
| 366 | tmp_buf = krealloc(p->buf, len, GFP_NOFS); | 368 | tmp_buf = krealloc(p->buf, len, GFP_NOFS); |
| 369 | } | ||
| 367 | if (!tmp_buf) | 370 | if (!tmp_buf) |
| 368 | return -ENOMEM; | 371 | return -ENOMEM; |
| 369 | p->buf = tmp_buf; | 372 | p->buf = tmp_buf; |
| @@ -1668,7 +1671,7 @@ static int get_first_ref(struct btrfs_root *root, u64 ino, | |||
| 1668 | goto out; | 1671 | goto out; |
| 1669 | } | 1672 | } |
| 1670 | 1673 | ||
| 1671 | if (key.type == BTRFS_INODE_REF_KEY) { | 1674 | if (found_key.type == BTRFS_INODE_REF_KEY) { |
| 1672 | struct btrfs_inode_ref *iref; | 1675 | struct btrfs_inode_ref *iref; |
| 1673 | iref = btrfs_item_ptr(path->nodes[0], path->slots[0], | 1676 | iref = btrfs_item_ptr(path->nodes[0], path->slots[0], |
| 1674 | struct btrfs_inode_ref); | 1677 | struct btrfs_inode_ref); |
