@@ -435,7 +435,7 @@ ufs_readdir(struct file *file, struct dir_context *ctx)
435435 unsigned long n = pos >> PAGE_SHIFT ;
436436 unsigned long npages = dir_pages (inode );
437437 unsigned chunk_mask = ~(UFS_SB (sb )-> s_uspi -> s_dirblksize - 1 );
438- bool need_revalidate = !inode_eq_iversion (inode , file -> f_version );
438+ bool need_revalidate = !inode_eq_iversion (inode , * ( u64 * ) file -> private_data );
439439 unsigned flags = UFS_SB (sb )-> s_flags ;
440440
441441 UFSD ("BEGIN\n" );
@@ -462,7 +462,7 @@ ufs_readdir(struct file *file, struct dir_context *ctx)
462462 offset = ufs_validate_entry (sb , kaddr , offset , chunk_mask );
463463 ctx -> pos = (n <<PAGE_SHIFT ) + offset ;
464464 }
465- file -> f_version = inode_query_iversion (inode );
465+ * ( u64 * ) file -> private_data = inode_query_iversion (inode );
466466 need_revalidate = false;
467467 }
468468 de = (struct ufs_dir_entry * )(kaddr + offset );
@@ -646,9 +646,31 @@ int ufs_empty_dir(struct inode * inode)
646646 return 0 ;
647647}
648648
649+ static int ufs_dir_open (struct inode * inode , struct file * file )
650+ {
651+ file -> private_data = kzalloc (sizeof (u64 ), GFP_KERNEL );
652+ if (!file -> private_data )
653+ return - ENOMEM ;
654+ return 0 ;
655+ }
656+
657+ static int ufs_dir_release (struct inode * inode , struct file * file )
658+ {
659+ kfree (file -> private_data );
660+ return 0 ;
661+ }
662+
663+ static loff_t ufs_dir_llseek (struct file * file , loff_t offset , int whence )
664+ {
665+ return generic_llseek_cookie (file , offset , whence ,
666+ (u64 * )file -> private_data );
667+ }
668+
649669const struct file_operations ufs_dir_operations = {
670+ .open = ufs_dir_open ,
671+ .release = ufs_dir_release ,
650672 .read = generic_read_dir ,
651673 .iterate_shared = ufs_readdir ,
652674 .fsync = generic_file_fsync ,
653- .llseek = generic_file_llseek ,
675+ .llseek = ufs_dir_llseek ,
654676};
0 commit comments