diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2018-07-10 22:43:57 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2018-07-10 22:43:57 -0700 |
| commit | 4049db73f1a32cd633827f479cb25fdcd231d7f4 (patch) | |
| tree | ae3c1d3eb12080b447d732ba37540bb9f87f3a48 /fs/btrfs/inode.c | |
| parent | 62b5f32c45c31528c5228a44c59d150e8a786421 (diff) | |
| parent | e1496b74425e222e349b829e84415a380a59f178 (diff) | |
Merge "Merge android-4.4.139 (7ba5557) into msm-4.4"
Diffstat (limited to 'fs/btrfs/inode.c')
| -rw-r--r-- | fs/btrfs/inode.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 81b5a461d94e..beade8d381c2 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1202,6 +1202,8 @@ static noinline int csum_exist_in_range(struct btrfs_root *root, list_del(&sums->list); kfree(sums); } + if (ret < 0) + return ret; return 1; } @@ -1351,10 +1353,23 @@ next_slot: goto out_check; if (btrfs_extent_readonly(root, disk_bytenr)) goto out_check; - if (btrfs_cross_ref_exist(trans, root, ino, + ret = btrfs_cross_ref_exist(trans, root, ino, found_key.offset - - extent_offset, disk_bytenr)) + extent_offset, disk_bytenr); + if (ret) { + /* + * ret could be -EIO if the above fails to read + * metadata. + */ + if (ret < 0) { + if (cow_start != (u64)-1) + cur_offset = cow_start; + goto error; + } + + WARN_ON_ONCE(nolock); goto out_check; + } disk_bytenr += extent_offset; disk_bytenr += cur_offset - found_key.offset; num_bytes = min(end + 1, extent_end) - cur_offset; @@ -1372,8 +1387,20 @@ next_slot: * this ensure that csum for a given extent are * either valid or do not exist. */ - if (csum_exist_in_range(root, disk_bytenr, num_bytes)) + ret = csum_exist_in_range(root, disk_bytenr, num_bytes); + if (ret) { + /* + * ret could be -EIO if the above fails to read + * metadata. + */ + if (ret < 0) { + if (cow_start != (u64)-1) + cur_offset = cow_start; + goto error; + } + WARN_ON_ONCE(nolock); goto out_check; + } nocow = 1; } else if (extent_type == BTRFS_FILE_EXTENT_INLINE) { extent_end = found_key.offset + |
