diff options
-rw-r--r-- | fs/btrfs/tree-log.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 8e85e0e4333d..c7ef569eb22a 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -3300,6 +3300,7 @@ static int log_one_extent(struct btrfs_trans_handle *trans, | |||
3300 | int index = log->log_transid % 2; | 3300 | int index = log->log_transid % 2; |
3301 | bool skip_csum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; | 3301 | bool skip_csum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; |
3302 | 3302 | ||
3303 | insert: | ||
3303 | INIT_LIST_HEAD(&ordered_sums); | 3304 | INIT_LIST_HEAD(&ordered_sums); |
3304 | btrfs_init_map_token(&token); | 3305 | btrfs_init_map_token(&token); |
3305 | key.objectid = btrfs_ino(inode); | 3306 | key.objectid = btrfs_ino(inode); |
@@ -3315,6 +3316,23 @@ static int log_one_extent(struct btrfs_trans_handle *trans, | |||
3315 | leaf = path->nodes[0]; | 3316 | leaf = path->nodes[0]; |
3316 | fi = btrfs_item_ptr(leaf, path->slots[0], | 3317 | fi = btrfs_item_ptr(leaf, path->slots[0], |
3317 | struct btrfs_file_extent_item); | 3318 | struct btrfs_file_extent_item); |
3319 | |||
3320 | /* | ||
3321 | * If we are overwriting an inline extent with a real one then we need | ||
3322 | * to just delete the inline extent as it may not be large enough to | ||
3323 | * have the entire file_extent_item. | ||
3324 | */ | ||
3325 | if (ret && btrfs_token_file_extent_type(leaf, fi, &token) == | ||
3326 | BTRFS_FILE_EXTENT_INLINE) { | ||
3327 | ret = btrfs_del_item(trans, log, path); | ||
3328 | btrfs_release_path(path); | ||
3329 | if (ret) { | ||
3330 | path->really_keep_locks = 0; | ||
3331 | return ret; | ||
3332 | } | ||
3333 | goto insert; | ||
3334 | } | ||
3335 | |||
3318 | btrfs_set_token_file_extent_generation(leaf, fi, em->generation, | 3336 | btrfs_set_token_file_extent_generation(leaf, fi, em->generation, |
3319 | &token); | 3337 | &token); |
3320 | if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) { | 3338 | if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) { |