[readdir] convert freevxfs
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 18 May 2013 07:15:00 +0000 (03:15 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 29 Jun 2013 08:56:53 +0000 (12:56 +0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/freevxfs/vxfs_lookup.c

index 664b07a..25d4099 100644 (file)
@@ -49,7 +49,7 @@
 
 
 static struct dentry * vxfs_lookup(struct inode *, struct dentry *, unsigned int);
-static int             vxfs_readdir(struct file *, void *, filldir_t);
+static int             vxfs_readdir(struct file *, struct dir_context *);
 
 const struct inode_operations vxfs_dir_inode_ops = {
        .lookup =               vxfs_lookup,
@@ -58,7 +58,7 @@ const struct inode_operations vxfs_dir_inode_ops = {
 const struct file_operations vxfs_dir_operations = {
        .llseek =               generic_file_llseek,
        .read =                 generic_read_dir,
-       .readdir =              vxfs_readdir,
+       .iterate =              vxfs_readdir,
 };
 
  
@@ -235,7 +235,7 @@ vxfs_lookup(struct inode *dip, struct dentry *dp, unsigned int flags)
  *   Zero.
  */
 static int
-vxfs_readdir(struct file *fp, void *retp, filldir_t filler)
+vxfs_readdir(struct file *fp, struct dir_context *ctx)
 {
        struct inode            *ip = file_inode(fp);
        struct super_block      *sbp = ip->i_sb;
@@ -243,20 +243,17 @@ vxfs_readdir(struct file *fp, void *retp, filldir_t filler)
        u_long                  page, npages, block, pblocks, nblocks, offset;
        loff_t                  pos;
 
-       switch ((long)fp->f_pos) {
-       case 0:
-               if (filler(retp, ".", 1, fp->f_pos, ip->i_ino, DT_DIR) < 0)
-                       goto out;
-               fp->f_pos++;
-               /* fallthrough */
-       case 1:
-               if (filler(retp, "..", 2, fp->f_pos, VXFS_INO(ip)->vii_dotdot, DT_DIR) < 0)
-                       goto out;
-               fp->f_pos++;
-               /* fallthrough */
+       if (ctx->pos == 0) {
+               if (!dir_emit_dot(fp, ctx))
+                       return 0;
+               ctx->pos = 1;
        }
-
-       pos = fp->f_pos - 2;
+       if (ctx->pos == 1) {
+               if (!dir_emit(ctx, "..", 2, VXFS_INO(ip)->vii_dotdot, DT_DIR))
+                       return 0;
+               ctx->pos = 2;
+       }
+       pos = ctx->pos - 2;
        
        if (pos > VXFS_DIRROUND(ip->i_size))
                return 0;
@@ -270,16 +267,16 @@ vxfs_readdir(struct file *fp, void *retp, filldir_t filler)
        block = (u_long)(pos >> sbp->s_blocksize_bits) % pblocks;
 
        for (; page < npages; page++, block = 0) {
-               caddr_t                 kaddr;
+               char                    *kaddr;
                struct page             *pp;
 
                pp = vxfs_get_page(ip->i_mapping, page);
                if (IS_ERR(pp))
                        continue;
-               kaddr = (caddr_t)page_address(pp);
+               kaddr = (char *)page_address(pp);
 
                for (; block <= nblocks && block <= pblocks; block++) {
-                       caddr_t                 baddr, limit;
+                       char                    *baddr, *limit;
                        struct vxfs_dirblk      *dbp;
                        struct vxfs_direct      *de;
 
@@ -292,21 +289,18 @@ vxfs_readdir(struct file *fp, void *retp, filldir_t filler)
                                 (kaddr + offset) :
                                 (baddr + VXFS_DIRBLKOV(dbp)));
 
-                       for (; (caddr_t)de <= limit; de = vxfs_next_entry(de)) {
-                               int     over;
-
+                       for (; (char *)de <= limit; de = vxfs_next_entry(de)) {
                                if (!de->d_reclen)
                                        break;
                                if (!de->d_ino)
                                        continue;
 
-                               offset = (caddr_t)de - kaddr;
-                               over = filler(retp, de->d_name, de->d_namelen,
-                                       ((page << PAGE_CACHE_SHIFT) | offset) + 2,
-                                       de->d_ino, DT_UNKNOWN);
-                               if (over) {
+                               offset = (char *)de - kaddr;
+                               ctx->pos = ((page << PAGE_CACHE_SHIFT) | offset) + 2;
+                               if (!dir_emit(ctx, de->d_name, de->d_namelen,
+                                       de->d_ino, DT_UNKNOWN)) {
                                        vxfs_put_page(pp);
-                                       goto done;
+                                       return 0;
                                }
                        }
                        offset = 0;
@@ -314,9 +308,6 @@ vxfs_readdir(struct file *fp, void *retp, filldir_t filler)
                vxfs_put_page(pp);
                offset = 0;
        }
-
-done:
-       fp->f_pos = ((page << PAGE_CACHE_SHIFT) | offset) + 2;
-out:
+       ctx->pos = ((page << PAGE_CACHE_SHIFT) | offset) + 2;
        return 0;
 }