aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2019-09-15 08:17:27 -0400
committerDavid S. Miller <davem@davemloft.net>2019-09-15 08:17:27 -0400
commitaa2eaa8c272a3211dec07ce9c6c863a7e355c10e (patch)
tree8454a23d36b2ff36133c276ee0ba80eabc00850e /fs/btrfs
parenta3d3c74da49c65fc63a937fa559186b0e16adca3 (diff)
parent1609d7604b847a9820e63393d1a3b6cac7286d40 (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.c35
-rw-r--r--fs/btrfs/tree-log.c16
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
3631static 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
3721static 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
3728static void set_btree_ioerr(struct page *page) 3745static 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