Skip to contentSkip to conversation

ext4: fix loop in do_split()

PATCH In review roel kluin 2 participants 2 messages Nov 29, 2008 – Nov 30, 2008 ext4 file system

lore
Share & tools
lore

roel kluin

author
#0 lore raw

PATCH 1/1 ext4: fix loop in do_split()

unsigned i >= 0 is always true

---

fs/ext4/namei.c +1 -1
index 63adcb7..389cf60 100644
@@ -1198,7 +1198,7 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
 	/* Split the existing block in the middle, size-wise */
 	size = 0;
 	move = 0;
-	for (i = count-1; i >= 0; i--) {
+	for (i = count-1; i < count; i--) {
 		/* is more than half of this entry in 2nd half of the block? */
 		if (size + map[i].size/2 > blocksize/2)
 			break;
#1 lore raw
Quoted 10 lines · roel kluin

unsigned i >= 0 is always true

---

fs/ext4/namei.c +0 -0
index 63adcb7..389cf60 100644

fs/ext4/namei.c static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, · line 1204

Quoted 8 lines
fs/ext4/namei.c +1 -1
@@ -1198,7 +1198,7 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
 	/* Split the existing block in the middle, size-wise */
 	size = 0;
 	move = 0;
-	for (i = count-1; i >= 0; i--) {
+	for (i = count-1; i < count; i--) {
 		/* is more than half of this entry in 2nd half of the block? */
 		if (size + map[i].size/2 > blocksize/2)
 			break;

While this unsigned wrap method is technically valid, it certainly isn't obvious, and making code readable should be a goal as well as making it correct.
After all, code which is hard to read is hard to understand, making it hard to
maintain. I therefore suggest the simpler form:

	for (i = count; i--; ) {

which gives the same i values inside the loop, but does assume that the reader remembers that i is unsigned, and intuitively understand wraparound while passing zero.

Signature · 3 lines
Bill Davidsen <[email protected]>
  "We have more to fear from the bungling of the incompetent than from
the machinations of the wicked."  - from Slashdot