From 6650f35ceef35f32d9d9adead2d60123fc14fcd2 Mon Sep 17 00:00:00 2001 From: Yan Date: Thu, 25 Oct 2007 15:42:57 -0400 Subject: [PATCH] --- yaml --- r: 128511 b: refs/heads/master c: 18f16f7ba62a01c29e09b40ac6ad6d92a8955859 h: refs/heads/master i: 128509: d90f6ea149c75883ee7809d509285d29d4a238d7 128507: 648a90c13245c49202a643c9d0bdb52af44be6f1 128503: 94f5f6e25e8e69f18d3c70f52a796b1b8f1a2327 128495: 93c8db5fc5e99b4c4a21a68dc3b2127bae9c7b5e 128479: 5a0651eec879913c2c5889ccfaebeec1814e8b78 128447: 7c56bb80079ec4682bb489c6716828b661814ac3 128383: fe58e7879c89e7208e55cac2499cb3e283a2bf6b 128255: ad8077debb2c18cb67e30b7ca636237486081690 127999: c3235cfcfeead2886fbe3590299afabe7ec72392 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/file.c | 21 ++++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/[refs] b/[refs] index 21628cceb94e..91b10d0e7f72 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: cc0c55384796b422133ff1f21646835b31590f88 +refs/heads/master: 18f16f7ba62a01c29e09b40ac6ad6d92a8955859 diff --git a/trunk/fs/btrfs/file.c b/trunk/fs/btrfs/file.c index 96df1b10cb60..9260d3478aad 100644 --- a/trunk/fs/btrfs/file.c +++ b/trunk/fs/btrfs/file.c @@ -108,7 +108,6 @@ static int insert_inline_extent(struct btrfs_trans_handle *trans, key.objectid = inode->i_ino; key.offset = offset; btrfs_set_key_type(&key, BTRFS_EXTENT_DATA_KEY); - datasize = btrfs_file_extent_calc_inline_size(offset + size); ret = btrfs_search_slot(trans, root, &key, path, 0, 1); if (ret < 0) { @@ -130,7 +129,7 @@ static int insert_inline_extent(struct btrfs_trans_handle *trans, } if (ret == 0) { u32 found_size; - u64 found_start; + u64 found_end; leaf = path->nodes[0]; ei = btrfs_item_ptr(leaf, path->slots[0], @@ -144,19 +143,17 @@ static int insert_inline_extent(struct btrfs_trans_handle *trans, offset, inode->i_ino); goto fail; } - found_start = key.offset; found_size = btrfs_file_extent_inline_len(leaf, btrfs_item_nr(leaf, path->slots[0])); + found_end = key.offset + found_size; - if (found_size < offset + size) { + if (found_end < offset + size) { btrfs_release_path(root, path); ret = btrfs_search_slot(trans, root, &key, path, - offset + size - found_size - - found_start, 1); + offset + size - found_end, 1); BUG_ON(ret != 0); ret = btrfs_extend_item(trans, root, path, - offset + size - found_size - - found_start); + offset + size - found_end); if (ret) { err = ret; goto fail; @@ -165,9 +162,15 @@ static int insert_inline_extent(struct btrfs_trans_handle *trans, ei = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_file_extent_item); } + if (found_end < offset) { + ptr = btrfs_file_extent_inline_start(ei) + found_size; + memset_extent_buffer(leaf, 0, ptr, offset - found_end); + } } else { insert: btrfs_release_path(root, path); + datasize = offset + size - key.offset; + datasize = btrfs_file_extent_calc_inline_size(datasize); ret = btrfs_insert_empty_item(trans, root, path, &key, datasize); if (ret) { @@ -181,7 +184,7 @@ static int insert_inline_extent(struct btrfs_trans_handle *trans, btrfs_set_file_extent_generation(leaf, ei, trans->transid); btrfs_set_file_extent_type(leaf, ei, BTRFS_FILE_EXTENT_INLINE); } - ptr = btrfs_file_extent_inline_start(ei) + offset; + ptr = btrfs_file_extent_inline_start(ei) + offset - key.offset; cur_size = size; i = 0;