diff options
Diffstat (limited to 'fs/ufs/dir.c')
| -rw-r--r-- | fs/ufs/dir.c | 28 | 
1 files changed, 12 insertions, 16 deletions
| diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c index 3a75ca09c506..0ecc2cebed8f 100644 --- a/fs/ufs/dir.c +++ b/fs/ufs/dir.c @@ -430,16 +430,16 @@ ufs_validate_entry(struct super_block *sb, char *base,   * This is blatantly stolen from ext2fs   */  static int -ufs_readdir(struct file *filp, void *dirent, filldir_t filldir) +ufs_readdir(struct file *file, struct dir_context *ctx)  { -	loff_t pos = filp->f_pos; -	struct inode *inode = file_inode(filp); +	loff_t pos = ctx->pos; +	struct inode *inode = file_inode(file);  	struct super_block *sb = inode->i_sb;  	unsigned int offset = pos & ~PAGE_CACHE_MASK;  	unsigned long n = pos >> PAGE_CACHE_SHIFT;  	unsigned long npages = ufs_dir_pages(inode);  	unsigned chunk_mask = ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1); -	int need_revalidate = filp->f_version != inode->i_version; +	int need_revalidate = file->f_version != inode->i_version;  	unsigned flags = UFS_SB(sb)->s_flags;  	UFSD("BEGIN\n"); @@ -457,16 +457,16 @@ ufs_readdir(struct file *filp, void *dirent, filldir_t filldir)  			ufs_error(sb, __func__,  				  "bad page in #%lu",  				  inode->i_ino); -			filp->f_pos += PAGE_CACHE_SIZE - offset; +			ctx->pos += PAGE_CACHE_SIZE - offset;  			return -EIO;  		}  		kaddr = page_address(page);  		if (unlikely(need_revalidate)) {  			if (offset) {  				offset = ufs_validate_entry(sb, kaddr, offset, chunk_mask); -				filp->f_pos = (n<<PAGE_CACHE_SHIFT) + offset; +				ctx->pos = (n<<PAGE_CACHE_SHIFT) + offset;  			} -			filp->f_version = inode->i_version; +			file->f_version = inode->i_version;  			need_revalidate = 0;  		}  		de = (struct ufs_dir_entry *)(kaddr+offset); @@ -479,11 +479,8 @@ ufs_readdir(struct file *filp, void *dirent, filldir_t filldir)  				return -EIO;  			}  			if (de->d_ino) { -				int over;  				unsigned char d_type = DT_UNKNOWN; -				offset = (char *)de - kaddr; -  				UFSD("filldir(%s,%u)\n", de->d_name,  				      fs32_to_cpu(sb, de->d_ino));  				UFSD("namlen %u\n", ufs_get_de_namlen(sb, de)); @@ -491,16 +488,15 @@ ufs_readdir(struct file *filp, void *dirent, filldir_t filldir)  				if ((flags & UFS_DE_MASK) == UFS_DE_44BSD)  					d_type = de->d_u.d_44.d_type; -				over = filldir(dirent, de->d_name, +				if (!dir_emit(ctx, de->d_name,  					       ufs_get_de_namlen(sb, de), -						(n<<PAGE_CACHE_SHIFT) | offset, -					       fs32_to_cpu(sb, de->d_ino), d_type); -				if (over) { +					       fs32_to_cpu(sb, de->d_ino), +					       d_type)) {  					ufs_put_page(page);  					return 0;  				}  			} -			filp->f_pos += fs16_to_cpu(sb, de->d_reclen); +			ctx->pos += fs16_to_cpu(sb, de->d_reclen);  		}  		ufs_put_page(page);  	} @@ -660,7 +656,7 @@ not_empty:  const struct file_operations ufs_dir_operations = {  	.read		= generic_read_dir, -	.readdir	= ufs_readdir, +	.iterate	= ufs_readdir,  	.fsync		= generic_file_fsync,  	.llseek		= generic_file_llseek,  }; |