[btrfs-devel][patch]fix for insert_inline_extent

Yan Zheng yanzheng at 21cn.com
Tue Oct 23 07:44:42 PDT 2007


Hello,

This patch fix the issues in insert_inline_extent described in my
previous mail. It modifies inline extent size calculation, so that
insert_inline_extent can handle the case that parameter 'offset' is
not zero; it also a few codes to zero uninitialized area in inline
extent.

Regards
YZ

--
diff -r 9bf00d0c038f file.c
--- a/file.c	Fri Oct 19 14:01:21 2007 -0400
+++ b/file.c	Mon Oct 22 21:17:28 2007 +0800
@@ -108,7 +108,6 @@ static int insert_inline_extent(struct b
 	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 b
 	}
 	if (ret == 0) {
 		u32 found_size;
-		u64 found_start;
+		u32 found_end;

 		leaf = path->nodes[0];
 		ei = btrfs_item_ptr(leaf, path->slots[0],
@@ -144,19 +143,17 @@ static int insert_inline_extent(struct b
 			       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]));
-
-		if (found_size < offset + size) {
+		found_end = key.offset + found_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 b
 			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 @@ insert:
 		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;



More information about the Btrfs-devel mailing list