diff options
| author | David S. Miller <davem@davemloft.net> | 2019-09-15 08:17:27 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2019-09-15 08:17:27 -0400 |
| commit | aa2eaa8c272a3211dec07ce9c6c863a7e355c10e (patch) | |
| tree | 8454a23d36b2ff36133c276ee0ba80eabc00850e /fs/btrfs | |
| parent | a3d3c74da49c65fc63a937fa559186b0e16adca3 (diff) | |
| parent | 1609d7604b847a9820e63393d1a3b6cac7286d40 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Minor overlapping changes in the btusb and ixgbe drivers.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'fs/btrfs')
| -rw-r--r-- | fs/btrfs/extent_io.c | 35 | ||||
| -rw-r--r-- | fs/btrfs/tree-log.c | 16 |
2 files changed, 34 insertions, 17 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 1ff438fd5bc2..eeb75281894e 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
| @@ -3628,6 +3628,13 @@ void wait_on_extent_buffer_writeback(struct extent_buffer *eb) | |||
| 3628 | TASK_UNINTERRUPTIBLE); | 3628 | TASK_UNINTERRUPTIBLE); |
| 3629 | } | 3629 | } |
| 3630 | 3630 | ||
| 3631 | static void end_extent_buffer_writeback(struct extent_buffer *eb) | ||
| 3632 | { | ||
| 3633 | clear_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags); | ||
| 3634 | smp_mb__after_atomic(); | ||
| 3635 | wake_up_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK); | ||
| 3636 | } | ||
| 3637 | |||
| 3631 | /* | 3638 | /* |
| 3632 | * Lock eb pages and flush the bio if we can't the locks | 3639 | * Lock eb pages and flush the bio if we can't the locks |
| 3633 | * | 3640 | * |
| @@ -3699,8 +3706,11 @@ static noinline_for_stack int lock_extent_buffer_for_io(struct extent_buffer *eb | |||
| 3699 | 3706 | ||
| 3700 | if (!trylock_page(p)) { | 3707 | if (!trylock_page(p)) { |
| 3701 | if (!flush) { | 3708 | if (!flush) { |
| 3702 | ret = flush_write_bio(epd); | 3709 | int err; |
| 3703 | if (ret < 0) { | 3710 | |
| 3711 | err = flush_write_bio(epd); | ||
| 3712 | if (err < 0) { | ||
| 3713 | ret = err; | ||
| 3704 | failed_page_nr = i; | 3714 | failed_page_nr = i; |
| 3705 | goto err_unlock; | 3715 | goto err_unlock; |
| 3706 | } | 3716 | } |
| @@ -3715,16 +3725,23 @@ err_unlock: | |||
| 3715 | /* Unlock already locked pages */ | 3725 | /* Unlock already locked pages */ |
| 3716 | for (i = 0; i < failed_page_nr; i++) | 3726 | for (i = 0; i < failed_page_nr; i++) |
| 3717 | unlock_page(eb->pages[i]); | 3727 | unlock_page(eb->pages[i]); |
| 3728 | /* | ||
| 3729 | * Clear EXTENT_BUFFER_WRITEBACK and wake up anyone waiting on it. | ||
| 3730 | * Also set back EXTENT_BUFFER_DIRTY so future attempts to this eb can | ||
| 3731 | * be made and undo everything done before. | ||
| 3732 | */ | ||
| 3733 | btrfs_tree_lock(eb); | ||
| 3734 | spin_lock(&eb->refs_lock); | ||
| 3735 | set_bit(EXTENT_BUFFER_DIRTY, &eb->bflags); | ||
| 3736 | end_extent_buffer_writeback(eb); | ||
| 3737 | spin_unlock(&eb->refs_lock); | ||
| 3738 | percpu_counter_add_batch(&fs_info->dirty_metadata_bytes, eb->len, | ||
| 3739 | fs_info->dirty_metadata_batch); | ||
| 3740 | btrfs_clear_header_flag(eb, BTRFS_HEADER_FLAG_WRITTEN); | ||
| 3741 | btrfs_tree_unlock(eb); | ||
| 3718 | return ret; | 3742 | return ret; |
| 3719 | } | 3743 | } |
| 3720 | 3744 | ||
| 3721 | static void end_extent_buffer_writeback(struct extent_buffer *eb) | ||
| 3722 | { | ||
| 3723 | clear_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags); | ||
| 3724 | smp_mb__after_atomic(); | ||
| 3725 | wake_up_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK); | ||
| 3726 | } | ||
| 3727 | |||
| 3728 | static void set_btree_ioerr(struct page *page) | 3745 | static void set_btree_ioerr(struct page *page) |
| 3729 | { | 3746 | { |
| 3730 | struct extent_buffer *eb = (struct extent_buffer *)page->private; | 3747 | struct extent_buffer *eb = (struct extent_buffer *)page->private; |
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 6c8297bcfeb7..1bfd7e34f31e 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
| @@ -4985,7 +4985,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, | |||
| 4985 | BTRFS_I(inode), | 4985 | BTRFS_I(inode), |
| 4986 | LOG_OTHER_INODE_ALL, | 4986 | LOG_OTHER_INODE_ALL, |
| 4987 | 0, LLONG_MAX, ctx); | 4987 | 0, LLONG_MAX, ctx); |
| 4988 | iput(inode); | 4988 | btrfs_add_delayed_iput(inode); |
| 4989 | } | 4989 | } |
| 4990 | } | 4990 | } |
| 4991 | continue; | 4991 | continue; |
| @@ -5000,7 +5000,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, | |||
| 5000 | ret = btrfs_log_inode(trans, root, BTRFS_I(inode), | 5000 | ret = btrfs_log_inode(trans, root, BTRFS_I(inode), |
| 5001 | LOG_OTHER_INODE, 0, LLONG_MAX, ctx); | 5001 | LOG_OTHER_INODE, 0, LLONG_MAX, ctx); |
| 5002 | if (ret) { | 5002 | if (ret) { |
| 5003 | iput(inode); | 5003 | btrfs_add_delayed_iput(inode); |
| 5004 | continue; | 5004 | continue; |
| 5005 | } | 5005 | } |
| 5006 | 5006 | ||
| @@ -5009,7 +5009,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, | |||
| 5009 | key.offset = 0; | 5009 | key.offset = 0; |
| 5010 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 5010 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
| 5011 | if (ret < 0) { | 5011 | if (ret < 0) { |
| 5012 | iput(inode); | 5012 | btrfs_add_delayed_iput(inode); |
| 5013 | continue; | 5013 | continue; |
| 5014 | } | 5014 | } |
| 5015 | 5015 | ||
| @@ -5056,7 +5056,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, | |||
| 5056 | } | 5056 | } |
| 5057 | path->slots[0]++; | 5057 | path->slots[0]++; |
| 5058 | } | 5058 | } |
| 5059 | iput(inode); | 5059 | btrfs_add_delayed_iput(inode); |
| 5060 | } | 5060 | } |
| 5061 | 5061 | ||
| 5062 | return ret; | 5062 | return ret; |
| @@ -5689,7 +5689,7 @@ process_leaf: | |||
| 5689 | } | 5689 | } |
| 5690 | 5690 | ||
| 5691 | if (btrfs_inode_in_log(BTRFS_I(di_inode), trans->transid)) { | 5691 | if (btrfs_inode_in_log(BTRFS_I(di_inode), trans->transid)) { |
| 5692 | iput(di_inode); | 5692 | btrfs_add_delayed_iput(di_inode); |
| 5693 | break; | 5693 | break; |
| 5694 | } | 5694 | } |
| 5695 | 5695 | ||
| @@ -5701,7 +5701,7 @@ process_leaf: | |||
| 5701 | if (!ret && | 5701 | if (!ret && |
| 5702 | btrfs_must_commit_transaction(trans, BTRFS_I(di_inode))) | 5702 | btrfs_must_commit_transaction(trans, BTRFS_I(di_inode))) |
| 5703 | ret = 1; | 5703 | ret = 1; |
| 5704 | iput(di_inode); | 5704 | btrfs_add_delayed_iput(di_inode); |
| 5705 | if (ret) | 5705 | if (ret) |
| 5706 | goto next_dir_inode; | 5706 | goto next_dir_inode; |
| 5707 | if (ctx->log_new_dentries) { | 5707 | if (ctx->log_new_dentries) { |
| @@ -5848,7 +5848,7 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans, | |||
| 5848 | if (!ret && ctx && ctx->log_new_dentries) | 5848 | if (!ret && ctx && ctx->log_new_dentries) |
| 5849 | ret = log_new_dir_dentries(trans, root, | 5849 | ret = log_new_dir_dentries(trans, root, |
| 5850 | BTRFS_I(dir_inode), ctx); | 5850 | BTRFS_I(dir_inode), ctx); |
| 5851 | iput(dir_inode); | 5851 | btrfs_add_delayed_iput(dir_inode); |
| 5852 | if (ret) | 5852 | if (ret) |
| 5853 | goto out; | 5853 | goto out; |
| 5854 | } | 5854 | } |
| @@ -5891,7 +5891,7 @@ static int log_new_ancestors(struct btrfs_trans_handle *trans, | |||
| 5891 | ret = btrfs_log_inode(trans, root, BTRFS_I(inode), | 5891 | ret = btrfs_log_inode(trans, root, BTRFS_I(inode), |
| 5892 | LOG_INODE_EXISTS, | 5892 | LOG_INODE_EXISTS, |
| 5893 | 0, LLONG_MAX, ctx); | 5893 | 0, LLONG_MAX, ctx); |
| 5894 | iput(inode); | 5894 | btrfs_add_delayed_iput(inode); |
| 5895 | if (ret) | 5895 | if (ret) |
| 5896 | return ret; | 5896 | return ret; |
| 5897 | 5897 | ||
