- offset = index % gBlockSize;
- blockNum = index / gBlockSize;
-
- buffer = ReadFileBlock(dirInode, blockNum, 0, gBlockSize, 0, 1);
- if (buffer == 0) return -1;
-
- dir = (struct ext2fs_direct *)(buffer + offset);
- inodeNum = bswap32(dir->e2d_ino);
- if (inodeNum == 0) return -1;
+ while (1) {
+ index = *dirIndex;
+
+ offset = index % gBlockSize;
+ blockNum = index / gBlockSize;
+
+ buffer = ReadFileBlock(dirInode, blockNum, 0, gBlockSize, 0, 1);
+ if (buffer == 0) return -1;
+
+ dir = (struct ext2fs_direct *)(buffer + offset);
+ *dirIndex += bswap16(dir->e2d_reclen);
+
+ inodeNum = bswap32(dir->e2d_ino);
+ if (inodeNum != 0) break;
+
+ if (offset != 0) return -1;
+ }