shithub: lwext4

Download patch

ref: 9503c359b58ef633f2de0f3a169c94e15edecccf
parent: 91d3934d13b81f5edd3811af364bd412ba1d880d
author: ngkaho1234 <[email protected]>
date: Sun Feb 14 09:49:52 EST 2016

ext4_extent: introduce need_split boolean to invoke splitting.

--- a/src/ext4_extent.c
+++ b/src/ext4_extent.c
@@ -901,13 +901,12 @@
 	return 1;
 }
 
-#define EXT_INODE_HDR_NEED_GROW 0x1
-
 static int ext4_ext_insert_leaf(struct ext4_inode_ref *inode_ref,
 				struct ext4_extent_path *path,
 				int at,
 				struct ext4_extent *newext,
-				int flags)
+				int flags,
+				bool *need_split)
 {
 	struct ext4_extent_path *curp = path + at;
 	struct ext4_extent *ex = curp->extent;
@@ -914,6 +913,8 @@
 	int len, err, unwritten;
 	struct ext4_extent_header *eh;
 
+	*need_split = false;
+
 	if (curp->extent && to_le32(newext->first_block) == to_le32(curp->extent->first_block))
 		return EIO;
 
@@ -944,7 +945,8 @@
 
 	if (to_le16(curp->header->entries_count)
 			     == to_le16(curp->header->max_entries_count)) {
-		err = EXT_INODE_HDR_NEED_GROW;
+		err = EIO;
+		*need_split = true;
 		goto out;
 	} else {
 		eh = curp->header;
@@ -1084,13 +1086,15 @@
 	struct ext4_extent_path *path = *ppath;
 	struct ext4_extent_path *npath = NULL;
 	bool ins_right_leaf = false;
+	bool need_split;
 
 again:
 	depth = ext_depth(inode_ref->inode);
 	ret = ext4_ext_insert_leaf(inode_ref, path, depth,
 				   newext,
-				   flags);
-	if (ret == EXT_INODE_HDR_NEED_GROW) {
+				   flags,
+				   &need_split);
+	if (ret == EIO && need_split == true) {
 		int i;
 		for (i = depth, level = 0;i >= 0;i--, level++)
 			if (EXT_HAS_FREE_INDEX(path + i))