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

index 4637589..49f51ab 100644 (file)
@@ -239,22 +239,19 @@ void exofs_set_de_type(struct exofs_dir_entry *de, struct inode *inode)
 }
 
 static int
-exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)
+exofs_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);
        unsigned int offset = pos & ~PAGE_CACHE_MASK;
        unsigned long n = pos >> PAGE_CACHE_SHIFT;
        unsigned long npages = dir_pages(inode);
        unsigned chunk_mask = ~(exofs_chunk_size(inode)-1);
-       unsigned char *types = NULL;
-       int need_revalidate = (filp->f_version != inode->i_version);
+       int need_revalidate = (file->f_version != inode->i_version);
 
        if (pos > inode->i_size - EXOFS_DIR_REC_LEN(1))
                return 0;
 
-       types = exofs_filetype_table;
-
        for ( ; n < npages; n++, offset = 0) {
                char *kaddr, *limit;
                struct exofs_dir_entry *de;
@@ -263,7 +260,7 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)
                if (IS_ERR(page)) {
                        EXOFS_ERR("ERROR: bad page in directory(0x%lx)\n",
                                  inode->i_ino);
-                       filp->f_pos += PAGE_CACHE_SIZE - offset;
+                       ctx->pos += PAGE_CACHE_SIZE - offset;
                        return PTR_ERR(page);
                }
                kaddr = page_address(page);
@@ -271,9 +268,9 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)
                        if (offset) {
                                offset = exofs_validate_entry(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 exofs_dir_entry *)(kaddr + offset);
@@ -288,27 +285,24 @@ exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)
                                return -EIO;
                        }
                        if (de->inode_no) {
-                               int over;
-                               unsigned char d_type = DT_UNKNOWN;
+                               unsigned char t;
 
-                               if (types && de->file_type < EXOFS_FT_MAX)
-                                       d_type = types[de->file_type];
+                               if (de->file_type < EXOFS_FT_MAX)
+                                       t = exofs_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,
+                               if (!dir_emit(ctx, de->name, de->name_len,
                                                le64_to_cpu(de->inode_no),
-                                               d_type);
-                               if (over) {
+                                               t)) {
                                        exofs_put_page(page);
                                        return 0;
                                }
                        }
-                       filp->f_pos += le16_to_cpu(de->rec_len);
+                       ctx->pos += le16_to_cpu(de->rec_len);
                }
                exofs_put_page(page);
        }
-
        return 0;
 }
 
@@ -669,5 +663,5 @@ not_empty:
 const struct file_operations exofs_dir_operations = {
        .llseek         = generic_file_llseek,
        .read           = generic_read_dir,
-       .readdir        = exofs_readdir,
+       .iterate        = exofs_readdir,
 };