aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/tree-log.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/tree-log.c')
-rw-r--r--fs/btrfs/tree-log.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index ba2f15109dac..b561e7a4007d 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -3495,21 +3495,27 @@ static int log_one_extent(struct btrfs_trans_handle *trans,
3495 int ret; 3495 int ret;
3496 int index = log->log_transid % 2; 3496 int index = log->log_transid % 2;
3497 bool skip_csum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; 3497 bool skip_csum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM;
3498 3498 int extent_inserted = 0;
3499 ret = __btrfs_drop_extents(trans, log, inode, path, em->start,
3500 em->start + em->len, NULL, 0);
3501 if (ret)
3502 return ret;
3503 3499
3504 INIT_LIST_HEAD(&ordered_sums); 3500 INIT_LIST_HEAD(&ordered_sums);
3505 btrfs_init_map_token(&token); 3501 btrfs_init_map_token(&token);
3506 key.objectid = btrfs_ino(inode);
3507 key.type = BTRFS_EXTENT_DATA_KEY;
3508 key.offset = em->start;
3509 3502
3510 ret = btrfs_insert_empty_item(trans, log, path, &key, sizeof(*fi)); 3503 ret = __btrfs_drop_extents(trans, log, inode, path, em->start,
3504 em->start + em->len, NULL, 0, 1,
3505 sizeof(*fi), &extent_inserted);
3511 if (ret) 3506 if (ret)
3512 return ret; 3507 return ret;
3508
3509 if (!extent_inserted) {
3510 key.objectid = btrfs_ino(inode);
3511 key.type = BTRFS_EXTENT_DATA_KEY;
3512 key.offset = em->start;
3513
3514 ret = btrfs_insert_empty_item(trans, log, path, &key,
3515 sizeof(*fi));
3516 if (ret)
3517 return ret;
3518 }
3513 leaf = path->nodes[0]; 3519 leaf = path->nodes[0];
3514 fi = btrfs_item_ptr(leaf, path->slots[0], 3520 fi = btrfs_item_ptr(leaf, path->slots[0],
3515 struct btrfs_file_extent_item); 3521 struct btrfs_file_extent_item);