[readdir] convert nilfs2
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 16 May 2013 18:36:14 +0000 (14:36 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 29 Jun 2013 08:56:36 +0000 (12:56 +0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/nilfs2/dir.c

index f30b017740a7baeaee8a5394443d790f855653c8..197a63e9d10215b54e28179b7976e6c0b56b5384 100644 (file)
@@ -256,22 +256,18 @@ static void nilfs_set_de_type(struct nilfs_dir_entry *de, struct inode *inode)
        de->file_type = nilfs_type_by_mode[(mode & S_IFMT)>>S_SHIFT];
 }
 
-static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
+static int nilfs_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 = dir_pages(inode);
 /*     unsigned chunk_mask = ~(nilfs_chunk_size(inode)-1); */
-       unsigned char *types = NULL;
-       int ret;
 
        if (pos > inode->i_size - NILFS_DIR_REC_LEN(1))
-               goto success;
-
-       types = nilfs_filetype_table;
+               return 0;
 
        for ( ; n < npages; n++, offset = 0) {
                char *kaddr, *limit;
@@ -281,9 +277,8 @@ static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
                if (IS_ERR(page)) {
                        nilfs_error(sb, __func__, "bad page in #%lu",
                                    inode->i_ino);
-                       filp->f_pos += PAGE_CACHE_SIZE - offset;
-                       ret = -EIO;
-                       goto done;
+                       ctx->pos += PAGE_CACHE_SIZE - offset;
+                       return -EIO;
                }
                kaddr = page_address(page);
                de = (struct nilfs_dir_entry *)(kaddr + offset);
@@ -293,35 +288,28 @@ static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
                        if (de->rec_len == 0) {
                                nilfs_error(sb, __func__,
                                            "zero-length directory entry");
-                               ret = -EIO;
                                nilfs_put_page(page);
-                               goto done;
+                               return -EIO;
                        }
                        if (de->inode) {
-                               int over;
-                               unsigned char d_type = DT_UNKNOWN;
+                               unsigned char t;
 
-                               if (types && de->file_type < NILFS_FT_MAX)
-                                       d_type = types[de->file_type];
+                               if (de->file_type < NILFS_FT_MAX)
+                                       t = nilfs_filetype_table[de->file_type];
+                               else
+                                       t = DT_UNKNOWN;
 
-                               offset = (char *)de - kaddr;
-                               over = filldir(dirent, de->name, de->name_len,
-                                               (n<<PAGE_CACHE_SHIFT) | offset,
-                                               le64_to_cpu(de->inode), d_type);
-                               if (over) {
+                               if (!dir_emit(ctx, de->name, de->name_len,
+                                               le64_to_cpu(de->inode), t)) {
                                        nilfs_put_page(page);
-                                       goto success;
+                                       return 0;
                                }
                        }
-                       filp->f_pos += nilfs_rec_len_from_disk(de->rec_len);
+                       ctx->pos += nilfs_rec_len_from_disk(de->rec_len);
                }
                nilfs_put_page(page);
        }
-
-success:
-       ret = 0;
-done:
-       return ret;
+       return 0;
 }
 
 /*
@@ -678,7 +666,7 @@ not_empty:
 const struct file_operations nilfs_dir_operations = {
        .llseek         = generic_file_llseek,
        .read           = generic_read_dir,
-       .readdir        = nilfs_readdir,
+       .iterate        = nilfs_readdir,
        .unlocked_ioctl = nilfs_ioctl,
 #ifdef CONFIG_COMPAT
        .compat_ioctl   = nilfs_compat_ioctl,