diff options
Diffstat (limited to 'fs/btrfs/tree-log.c')
| -rw-r--r-- | fs/btrfs/tree-log.c | 35 |
1 files changed, 16 insertions, 19 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index eb1ae908582c..2017d0ff511c 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
| @@ -1628,7 +1628,9 @@ static int replay_one_buffer(struct btrfs_root *log, struct extent_buffer *eb, | |||
| 1628 | int i; | 1628 | int i; |
| 1629 | int ret; | 1629 | int ret; |
| 1630 | 1630 | ||
| 1631 | btrfs_read_buffer(eb, gen); | 1631 | ret = btrfs_read_buffer(eb, gen); |
| 1632 | if (ret) | ||
| 1633 | return ret; | ||
| 1632 | 1634 | ||
| 1633 | level = btrfs_header_level(eb); | 1635 | level = btrfs_header_level(eb); |
| 1634 | 1636 | ||
| @@ -1749,7 +1751,11 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans, | |||
| 1749 | 1751 | ||
| 1750 | path->slots[*level]++; | 1752 | path->slots[*level]++; |
| 1751 | if (wc->free) { | 1753 | if (wc->free) { |
| 1752 | btrfs_read_buffer(next, ptr_gen); | 1754 | ret = btrfs_read_buffer(next, ptr_gen); |
| 1755 | if (ret) { | ||
| 1756 | free_extent_buffer(next); | ||
| 1757 | return ret; | ||
| 1758 | } | ||
| 1753 | 1759 | ||
| 1754 | btrfs_tree_lock(next); | 1760 | btrfs_tree_lock(next); |
| 1755 | btrfs_set_lock_blocking(next); | 1761 | btrfs_set_lock_blocking(next); |
| @@ -1766,7 +1772,11 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans, | |||
| 1766 | free_extent_buffer(next); | 1772 | free_extent_buffer(next); |
| 1767 | continue; | 1773 | continue; |
| 1768 | } | 1774 | } |
| 1769 | btrfs_read_buffer(next, ptr_gen); | 1775 | ret = btrfs_read_buffer(next, ptr_gen); |
| 1776 | if (ret) { | ||
| 1777 | free_extent_buffer(next); | ||
| 1778 | return ret; | ||
| 1779 | } | ||
| 1770 | 1780 | ||
| 1771 | WARN_ON(*level <= 0); | 1781 | WARN_ON(*level <= 0); |
| 1772 | if (path->nodes[*level-1]) | 1782 | if (path->nodes[*level-1]) |
| @@ -2657,6 +2667,8 @@ static int drop_objectid_items(struct btrfs_trans_handle *trans, | |||
| 2657 | btrfs_release_path(path); | 2667 | btrfs_release_path(path); |
| 2658 | } | 2668 | } |
| 2659 | btrfs_release_path(path); | 2669 | btrfs_release_path(path); |
| 2670 | if (ret > 0) | ||
| 2671 | ret = 0; | ||
| 2660 | return ret; | 2672 | return ret; |
| 2661 | } | 2673 | } |
| 2662 | 2674 | ||
| @@ -3028,21 +3040,6 @@ out: | |||
| 3028 | return ret; | 3040 | return ret; |
| 3029 | } | 3041 | } |
| 3030 | 3042 | ||
| 3031 | static int inode_in_log(struct btrfs_trans_handle *trans, | ||
| 3032 | struct inode *inode) | ||
| 3033 | { | ||
| 3034 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
| 3035 | int ret = 0; | ||
| 3036 | |||
| 3037 | mutex_lock(&root->log_mutex); | ||
| 3038 | if (BTRFS_I(inode)->logged_trans == trans->transid && | ||
| 3039 | BTRFS_I(inode)->last_sub_trans <= root->last_log_commit) | ||
| 3040 | ret = 1; | ||
| 3041 | mutex_unlock(&root->log_mutex); | ||
| 3042 | return ret; | ||
| 3043 | } | ||
| 3044 | |||
| 3045 | |||
| 3046 | /* | 3043 | /* |
| 3047 | * helper function around btrfs_log_inode to make sure newly created | 3044 | * helper function around btrfs_log_inode to make sure newly created |
| 3048 | * parent directories also end up in the log. A minimal inode and backref | 3045 | * parent directories also end up in the log. A minimal inode and backref |
| @@ -3083,7 +3080,7 @@ int btrfs_log_inode_parent(struct btrfs_trans_handle *trans, | |||
| 3083 | if (ret) | 3080 | if (ret) |
| 3084 | goto end_no_trans; | 3081 | goto end_no_trans; |
| 3085 | 3082 | ||
| 3086 | if (inode_in_log(trans, inode)) { | 3083 | if (btrfs_inode_in_log(inode, trans->transid)) { |
| 3087 | ret = BTRFS_NO_LOG_SYNC; | 3084 | ret = BTRFS_NO_LOG_SYNC; |
| 3088 | goto end_no_trans; | 3085 | goto end_no_trans; |
| 3089 | } | 3086 | } |
