|
@@ -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,
|
|
|
};
|