aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext2/dir.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext2/dir.c')
-rw-r--r--fs/ext2/dir.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c
index 4237722bfd27..6e1d4ab09d72 100644
--- a/fs/ext2/dir.c
+++ b/fs/ext2/dir.c
@@ -287,17 +287,17 @@ static inline void ext2_set_de_type(ext2_dirent *de, struct inode *inode)
287} 287}
288 288
289static int 289static int
290ext2_readdir (struct file * filp, void * dirent, filldir_t filldir) 290ext2_readdir(struct file *file, struct dir_context *ctx)
291{ 291{
292 loff_t pos = filp->f_pos; 292 loff_t pos = ctx->pos;
293 struct inode *inode = file_inode(filp); 293 struct inode *inode = file_inode(file);
294 struct super_block *sb = inode->i_sb; 294 struct super_block *sb = inode->i_sb;
295 unsigned int offset = pos & ~PAGE_CACHE_MASK; 295 unsigned int offset = pos & ~PAGE_CACHE_MASK;
296 unsigned long n = pos >> PAGE_CACHE_SHIFT; 296 unsigned long n = pos >> PAGE_CACHE_SHIFT;
297 unsigned long npages = dir_pages(inode); 297 unsigned long npages = dir_pages(inode);
298 unsigned chunk_mask = ~(ext2_chunk_size(inode)-1); 298 unsigned chunk_mask = ~(ext2_chunk_size(inode)-1);
299 unsigned char *types = NULL; 299 unsigned char *types = NULL;
300 int need_revalidate = filp->f_version != inode->i_version; 300 int need_revalidate = file->f_version != inode->i_version;
301 301
302 if (pos > inode->i_size - EXT2_DIR_REC_LEN(1)) 302 if (pos > inode->i_size - EXT2_DIR_REC_LEN(1))
303 return 0; 303 return 0;
@@ -314,16 +314,16 @@ ext2_readdir (struct file * filp, void * dirent, filldir_t filldir)
314 ext2_error(sb, __func__, 314 ext2_error(sb, __func__,
315 "bad page in #%lu", 315 "bad page in #%lu",
316 inode->i_ino); 316 inode->i_ino);
317 filp->f_pos += PAGE_CACHE_SIZE - offset; 317 ctx->pos += PAGE_CACHE_SIZE - offset;
318 return PTR_ERR(page); 318 return PTR_ERR(page);
319 } 319 }
320 kaddr = page_address(page); 320 kaddr = page_address(page);
321 if (unlikely(need_revalidate)) { 321 if (unlikely(need_revalidate)) {
322 if (offset) { 322 if (offset) {
323 offset = ext2_validate_entry(kaddr, offset, chunk_mask); 323 offset = ext2_validate_entry(kaddr, offset, chunk_mask);
324 filp->f_pos = (n<<PAGE_CACHE_SHIFT) + offset; 324 ctx->pos = (n<<PAGE_CACHE_SHIFT) + offset;
325 } 325 }
326 filp->f_version = inode->i_version; 326 file->f_version = inode->i_version;
327 need_revalidate = 0; 327 need_revalidate = 0;
328 } 328 }
329 de = (ext2_dirent *)(kaddr+offset); 329 de = (ext2_dirent *)(kaddr+offset);
@@ -336,22 +336,19 @@ ext2_readdir (struct file * filp, void * dirent, filldir_t filldir)
336 return -EIO; 336 return -EIO;
337 } 337 }
338 if (de->inode) { 338 if (de->inode) {
339 int over;
340 unsigned char d_type = DT_UNKNOWN; 339 unsigned char d_type = DT_UNKNOWN;
341 340
342 if (types && de->file_type < EXT2_FT_MAX) 341 if (types && de->file_type < EXT2_FT_MAX)
343 d_type = types[de->file_type]; 342 d_type = types[de->file_type];
344 343
345 offset = (char *)de - kaddr; 344 if (!dir_emit(ctx, de->name, de->name_len,
346 over = filldir(dirent, de->name, de->name_len, 345 le32_to_cpu(de->inode),
347 (n<<PAGE_CACHE_SHIFT) | offset, 346 d_type)) {
348 le32_to_cpu(de->inode), d_type);
349 if (over) {
350 ext2_put_page(page); 347 ext2_put_page(page);
351 return 0; 348 return 0;
352 } 349 }
353 } 350 }
354 filp->f_pos += ext2_rec_len_from_disk(de->rec_len); 351 ctx->pos += ext2_rec_len_from_disk(de->rec_len);
355 } 352 }
356 ext2_put_page(page); 353 ext2_put_page(page);
357 } 354 }
@@ -724,7 +721,7 @@ not_empty:
724const struct file_operations ext2_dir_operations = { 721const struct file_operations ext2_dir_operations = {
725 .llseek = generic_file_llseek, 722 .llseek = generic_file_llseek,
726 .read = generic_read_dir, 723 .read = generic_read_dir,
727 .readdir = ext2_readdir, 724 .iterate = ext2_readdir,
728 .unlocked_ioctl = ext2_ioctl, 725 .unlocked_ioctl = ext2_ioctl,
729#ifdef CONFIG_COMPAT 726#ifdef CONFIG_COMPAT
730 .compat_ioctl = ext2_compat_ioctl, 727 .compat_ioctl = ext2_compat_ioctl,