diff options
Diffstat (limited to 'fs')
| -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)) { |
