@@ -60,7 +60,7 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
6060 * identifying beginning of dir entry (names are under user control),
6161 * we need to scan the directory from the beginning.
6262 */
63- if (!inode_eq_iversion (dir , file -> f_version )) {
63+ if (!inode_eq_iversion (dir , * ( u64 * ) file -> private_data )) {
6464 emit_pos = nf_pos ;
6565 nf_pos = 0 ;
6666 } else {
@@ -122,15 +122,37 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
122122 udf_fiiter_release (& iter );
123123out :
124124 if (pos_valid )
125- file -> f_version = inode_query_iversion (dir );
125+ * ( u64 * ) file -> private_data = inode_query_iversion (dir );
126126 kfree (fname );
127127
128128 return ret ;
129129}
130130
131+ static int udf_dir_open (struct inode * inode , struct file * file )
132+ {
133+ file -> private_data = kzalloc (sizeof (u64 ), GFP_KERNEL );
134+ if (!file -> private_data )
135+ return - ENOMEM ;
136+ return 0 ;
137+ }
138+
139+ static int udf_dir_release (struct inode * inode , struct file * file )
140+ {
141+ kfree (file -> private_data );
142+ return 0 ;
143+ }
144+
145+ static loff_t udf_dir_llseek (struct file * file , loff_t offset , int whence )
146+ {
147+ return generic_llseek_cookie (file , offset , whence ,
148+ (u64 * )file -> private_data );
149+ }
150+
131151/* readdir and lookup functions */
132152const struct file_operations udf_dir_operations = {
133- .llseek = generic_file_llseek ,
153+ .open = udf_dir_open ,
154+ .release = udf_dir_release ,
155+ .llseek = udf_dir_llseek ,
134156 .read = generic_read_dir ,
135157 .iterate_shared = udf_readdir ,
136158 .unlocked_ioctl = udf_ioctl ,
0 commit comments