ep = exfat_get_dentry(sb, &clu, i + 1, &bh);
                        if (!ep)
                                return -EIO;
-                       dir_entry->entry = dentry;
+                       dir_entry->entry = i;
+                       dir_entry->dir = clu;
                        brelse(bh);
 
                        ei->hint_bmap.off = EXFAT_DEN_TO_CLU(dentry, sbi);
        if (!nb->lfn[0])
                goto end_of_dir;
 
-       i_pos = ((loff_t)ei->start_clu << 32) | (de.entry & 0xffffffff);
+       i_pos = ((loff_t)de.dir.dir << 32) | (de.entry & 0xffffffff);
        tmp = exfat_iget(sb, i_pos);
        if (tmp) {
                inum = tmp->i_ino;
 
 #define IS_DYNAMIC_ES(es)      ((es)->__bh != (es)->bh)
 
 struct exfat_dir_entry {
+       /* the cluster where file dentry is located */
        struct exfat_chain dir;
+       /* the index of file dentry in ->dir */
        int entry;
        unsigned int type;
        unsigned int start_clu;
  * EXFAT file system inode in-memory data
  */
 struct exfat_inode_info {
+       /* the cluster where file dentry is located */
        struct exfat_chain dir;
+       /* the index of file dentry in ->dir */
        int entry;
        unsigned int type;
        unsigned short attr;
 
        return 0;
 }
 
-/* find empty directory entry.
- * if there isn't any empty slot, expand cluster chain.
+/*
+ * Find an empty directory entry set.
+ *
+ * If there isn't any empty slot, expand cluster chain.
+ *
+ * in:
+ *   inode: inode of the parent directory
+ *   num_entries: specifies how many dentries in the empty directory entry set
+ *
+ * out:
+ *   p_dir: the cluster where the empty directory entry set is located
+ *   es: The found empty directory entry set
+ *
+ * return:
+ *   the directory entry index in p_dir is returned on succeeds
+ *   -error code is returned on failure
  */
 static int exfat_find_empty_entry(struct inode *inode,
                struct exfat_chain *p_dir, int num_entries,
                inode->i_blocks += sbi->cluster_size >> 9;
        }
 
-       return dentry;
+       p_dir->dir = exfat_sector_to_cluster(sbi, es->bh[0]->b_blocknr);
+       p_dir->size -= dentry / sbi->dentries_per_clu;
+
+       return dentry & (sbi->dentries_per_clu - 1);
 }
 
 /*
        if (dentry < 0)
                return dentry; /* -error value */
 
-       info->dir = cdir;
-       info->entry = dentry;
-       info->num_subdirs = 0;
-
        /* adjust cdir to the optimized value */
        cdir.dir = hint_opt.clu;
        if (cdir.flags & ALLOC_NO_FAT_CHAIN)
                cdir.size -= dentry / sbi->dentries_per_clu;
        dentry = hint_opt.eidx;
+
+       info->dir = cdir;
+       info->entry = dentry;
+       info->num_subdirs = 0;
+
        if (exfat_get_dentry_set(&es, sb, &cdir, dentry, ES_2_ENTRIES))
                return -EIO;
        ep = exfat_get_dentry_cached(&es, ES_IDX_FILE);