diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2013-05-15 18:51:49 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-06-29 04:46:47 -0400 |
commit | 80886298c07234331458e963b5f9f57c68edd700 (patch) | |
tree | 89b2df2d0ad43dc2e6a0091b4b04c1105433cf4d /fs/ufs | |
parent | bb6f619b3a49f940d7478112500da312d70866eb (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.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, | |||
430 | * This is blatantly stolen from ext2fs | 430 | * This is blatantly stolen from ext2fs |
431 | */ | 431 | */ |
432 | static int | 432 | static int |
433 | ufs_readdir(struct file *filp, void *dirent, filldir_t filldir) | 433 | ufs_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 | ||
661 | const struct file_operations ufs_dir_operations = { | 657 | const 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 | }; |