aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ufs
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2013-05-15 18:51:49 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2013-06-29 04:46:47 -0400
commit80886298c07234331458e963b5f9f57c68edd700 (patch)
tree89b2df2d0ad43dc2e6a0091b4b04c1105433cf4d /fs/ufs
parentbb6f619b3a49f940d7478112500da312d70866eb (diff)
[readdir] simple local unixlike: switch to ->iterate()
ext2, ufs, minix, sysv Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/ufs')
-rw-r--r--fs/ufs/dir.c28
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,
430 * This is blatantly stolen from ext2fs 430 * This is blatantly stolen from ext2fs
431 */ 431 */
432static int 432static int
433ufs_readdir(struct file *filp, void *dirent, filldir_t filldir) 433ufs_readdir(struct file *file, struct dir_context *ctx)
434{ 434{
435 loff_t pos = filp->f_pos; 435 loff_t pos = ctx->pos;
436 struct inode *inode = file_inode(filp); 436 struct inode *inode = file_inode(file);
437 struct super_block *sb = inode->i_sb; 437 struct super_block *sb = inode->i_sb;
438 unsigned int offset = pos & ~PAGE_CACHE_MASK; 438 unsigned int offset = pos & ~PAGE_CACHE_MASK;
439 unsigned long n = pos >> PAGE_CACHE_SHIFT; 439 unsigned long n = pos >> PAGE_CACHE_SHIFT;
440 unsigned long npages = ufs_dir_pages(inode); 440 unsigned long npages = ufs_dir_pages(inode);
441 unsigned chunk_mask = ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1); 441 unsigned chunk_mask = ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1);
442 int need_revalidate = filp->f_version != inode->i_version; 442 int need_revalidate = file->f_version != inode->i_version;
443 unsigned flags = UFS_SB(sb)->s_flags; 443 unsigned flags = UFS_SB(sb)->s_flags;
444 444
445 UFSD("BEGIN\n"); 445 UFSD("BEGIN\n");
@@ -457,16 +457,16 @@ ufs_readdir(struct file *filp, void *dirent, filldir_t filldir)
457 ufs_error(sb, __func__, 457 ufs_error(sb, __func__,
458 "bad page in #%lu", 458 "bad page in #%lu",
459 inode->i_ino); 459 inode->i_ino);
460 filp->f_pos += PAGE_CACHE_SIZE - offset; 460 ctx->pos += PAGE_CACHE_SIZE - offset;
461 return -EIO; 461 return -EIO;
462 } 462 }
463 kaddr = page_address(page); 463 kaddr = page_address(page);
464 if (unlikely(need_revalidate)) { 464 if (unlikely(need_revalidate)) {
465 if (offset) { 465 if (offset) {
466 offset = ufs_validate_entry(sb, kaddr, offset, chunk_mask); 466 offset = ufs_validate_entry(sb, kaddr, offset, chunk_mask);
467 filp->f_pos = (n<<PAGE_CACHE_SHIFT) + offset; 467 ctx->pos = (n<<PAGE_CACHE_SHIFT) + offset;
468 } 468 }
469 filp->f_version = inode->i_version; 469 file->f_version = inode->i_version;
470 need_revalidate = 0; 470 need_revalidate = 0;
471 } 471 }
472 de = (struct ufs_dir_entry *)(kaddr+offset); 472 de = (struct ufs_dir_entry *)(kaddr+offset);
@@ -479,11 +479,8 @@ ufs_readdir(struct file *filp, void *dirent, filldir_t filldir)
479 return -EIO; 479 return -EIO;
480 } 480 }
481 if (de->d_ino) { 481 if (de->d_ino) {
482 int over;
483 unsigned char d_type = DT_UNKNOWN; 482 unsigned char d_type = DT_UNKNOWN;
484 483
485 offset = (char *)de - kaddr;
486
487 UFSD("filldir(%s,%u)\n", de->d_name, 484 UFSD("filldir(%s,%u)\n", de->d_name,
488 fs32_to_cpu(sb, de->d_ino)); 485 fs32_to_cpu(sb, de->d_ino));
489 UFSD("namlen %u\n", ufs_get_de_namlen(sb, de)); 486 UFSD("namlen %u\n", ufs_get_de_namlen(sb, de));
@@ -491,16 +488,15 @@ ufs_readdir(struct file *filp, void *dirent, filldir_t filldir)
491 if ((flags & UFS_DE_MASK) == UFS_DE_44BSD) 488 if ((flags & UFS_DE_MASK) == UFS_DE_44BSD)
492 d_type = de->d_u.d_44.d_type; 489 d_type = de->d_u.d_44.d_type;
493 490
494 over = filldir(dirent, de->d_name, 491 if (!dir_emit(ctx, de->d_name,
495 ufs_get_de_namlen(sb, de), 492 ufs_get_de_namlen(sb, de),
496 (n<<PAGE_CACHE_SHIFT) | offset, 493 fs32_to_cpu(sb, de->d_ino),
497 fs32_to_cpu(sb, de->d_ino), d_type); 494 d_type)) {
498 if (over) {
499 ufs_put_page(page); 495 ufs_put_page(page);
500 return 0; 496 return 0;
501 } 497 }
502 } 498 }
503 filp->f_pos += fs16_to_cpu(sb, de->d_reclen); 499 ctx->pos += fs16_to_cpu(sb, de->d_reclen);
504 } 500 }
505 ufs_put_page(page); 501 ufs_put_page(page);
506 } 502 }
@@ -660,7 +656,7 @@ not_empty:
660 656
661const struct file_operations ufs_dir_operations = { 657const struct file_operations ufs_dir_operations = {
662 .read = generic_read_dir, 658 .read = generic_read_dir,
663 .readdir = ufs_readdir, 659 .iterate = ufs_readdir,
664 .fsync = generic_file_fsync, 660 .fsync = generic_file_fsync,
665 .llseek = generic_file_llseek, 661 .llseek = generic_file_llseek,
666}; 662};