@@ -60,9 +60,9 @@ static void exfat_get_uniname_from_ext_entry(struct super_block *sb,
6060}
6161
6262/* read a directory entry from the opened directory */
63- static int exfat_readdir (struct inode * inode , struct exfat_dir_entry * dir_entry )
63+ static int exfat_readdir (struct inode * inode , loff_t * cpos , struct exfat_dir_entry * dir_entry )
6464{
65- int i , dentries_per_clu , dentries_per_clu_bits = 0 ;
65+ int i , dentries_per_clu , dentries_per_clu_bits = 0 , num_ext ;
6666 unsigned int type , clu_offset ;
6767 sector_t sector ;
6868 struct exfat_chain dir , clu ;
@@ -71,7 +71,7 @@ static int exfat_readdir(struct inode *inode, struct exfat_dir_entry *dir_entry)
7171 struct super_block * sb = inode -> i_sb ;
7272 struct exfat_sb_info * sbi = EXFAT_SB (sb );
7373 struct exfat_inode_info * ei = EXFAT_I (inode );
74- unsigned int dentry = ei -> rwoffset & 0xFFFFFFFF ;
74+ unsigned int dentry = EXFAT_B_TO_DEN ( * cpos ) & 0xFFFFFFFF ;
7575 struct buffer_head * bh ;
7676
7777 /* check if the given file ID is opened */
@@ -128,6 +128,7 @@ static int exfat_readdir(struct inode *inode, struct exfat_dir_entry *dir_entry)
128128 continue ;
129129 }
130130
131+ num_ext = ep -> dentry .file .num_ext ;
131132 dir_entry -> attr = le16_to_cpu (ep -> dentry .file .attr );
132133 exfat_get_entry_time (sbi , & dir_entry -> crtime ,
133134 ep -> dentry .file .create_tz ,
@@ -158,12 +159,13 @@ static int exfat_readdir(struct inode *inode, struct exfat_dir_entry *dir_entry)
158159 return - EIO ;
159160 dir_entry -> size =
160161 le64_to_cpu (ep -> dentry .stream .valid_size );
162+ dir_entry -> entry = dentry ;
161163 brelse (bh );
162164
163165 ei -> hint_bmap .off = dentry >> dentries_per_clu_bits ;
164166 ei -> hint_bmap .clu = clu .dir ;
165167
166- ei -> rwoffset = ++ dentry ;
168+ * cpos = EXFAT_DEN_TO_B ( dentry + 1 + num_ext ) ;
167169 return 0 ;
168170 }
169171
@@ -179,7 +181,7 @@ static int exfat_readdir(struct inode *inode, struct exfat_dir_entry *dir_entry)
179181 }
180182
181183 dir_entry -> namebuf .lfn [0 ] = '\0' ;
182- ei -> rwoffset = dentry ;
184+ * cpos = EXFAT_DEN_TO_B ( dentry ) ;
183185 return 0 ;
184186}
185187
@@ -243,12 +245,10 @@ static int exfat_iterate(struct file *filp, struct dir_context *ctx)
243245 if (err )
244246 goto unlock ;
245247get_new :
246- ei -> rwoffset = EXFAT_B_TO_DEN (cpos );
247-
248248 if (cpos >= i_size_read (inode ))
249249 goto end_of_dir ;
250250
251- err = exfat_readdir (inode , & de );
251+ err = exfat_readdir (inode , & cpos , & de );
252252 if (err ) {
253253 /*
254254 * At least we tried to read a sector. Move cpos to next sector
@@ -263,13 +263,10 @@ static int exfat_iterate(struct file *filp, struct dir_context *ctx)
263263 goto end_of_dir ;
264264 }
265265
266- cpos = EXFAT_DEN_TO_B (ei -> rwoffset );
267-
268266 if (!nb -> lfn [0 ])
269267 goto end_of_dir ;
270268
271- i_pos = ((loff_t )ei -> start_clu << 32 ) |
272- ((ei -> rwoffset - 1 ) & 0xffffffff );
269+ i_pos = ((loff_t )ei -> start_clu << 32 ) | (de .entry & 0xffffffff );
273270 tmp = exfat_iget (sb , i_pos );
274271 if (tmp ) {
275272 inum = tmp -> i_ino ;
@@ -922,7 +919,6 @@ enum {
922919/*
923920 * return values:
924921 * >= 0 : return dir entiry position with the name in dir
925- * -EEXIST : (root dir, ".") it is the root dir itself
926922 * -ENOENT : entry with the name does not exist
927923 * -EIO : I/O error
928924 */
@@ -990,11 +986,8 @@ int exfat_find_dir_entry(struct super_block *sb, struct exfat_inode_info *ei,
990986 if (ei -> hint_femp .eidx ==
991987 EXFAT_HINT_NONE ||
992988 candi_empty .eidx <=
993- ei -> hint_femp .eidx ) {
994- memcpy (& ei -> hint_femp ,
995- & candi_empty ,
996- sizeof (candi_empty ));
997- }
989+ ei -> hint_femp .eidx )
990+ ei -> hint_femp = candi_empty ;
998991 }
999992
1000993 brelse (bh );
0 commit comments