[readdir] convert reiserfs
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 18 May 2013 02:42:17 +0000 (22:42 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 29 Jun 2013 08:56:49 +0000 (12:56 +0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/reiserfs/dir.c
fs/reiserfs/reiserfs.h
fs/reiserfs/xattr.c

index 6c2d136..cba7016 100644 (file)
 
 extern const struct reiserfs_key MIN_KEY;
 
-static int reiserfs_readdir(struct file *, void *, filldir_t);
+static int reiserfs_readdir(struct file *, struct dir_context *);
 static int reiserfs_dir_fsync(struct file *filp, loff_t start, loff_t end,
                              int datasync);
 
 const struct file_operations reiserfs_dir_operations = {
        .llseek = generic_file_llseek,
        .read = generic_read_dir,
-       .readdir = reiserfs_readdir,
+       .iterate = reiserfs_readdir,
        .fsync = reiserfs_dir_fsync,
        .unlocked_ioctl = reiserfs_ioctl,
 #ifdef CONFIG_COMPAT
@@ -58,8 +58,7 @@ static inline bool is_privroot_deh(struct dentry *dir,
                deh->deh_objectid == INODE_PKEY(privroot->d_inode)->k_objectid);
 }
 
-int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,
-                          filldir_t filldir, loff_t *pos)
+int reiserfs_readdir_dentry(struct dentry *dentry, struct dir_context *ctx)
 {
        struct inode *inode = dentry->d_inode;
        struct cpu_key pos_key; /* key of current position in the directory (key of directory entry) */
@@ -81,7 +80,7 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,
 
        /* form key for search the next directory entry using f_pos field of
           file structure */
-       make_cpu_key(&pos_key, inode, *pos ?: DOT_OFFSET, TYPE_DIRENTRY, 3);
+       make_cpu_key(&pos_key, inode, ctx->pos ?: DOT_OFFSET, TYPE_DIRENTRY, 3);
        next_pos = cpu_key_k_offset(&pos_key);
 
        path_to_entry.reada = PATH_READA;
@@ -126,7 +125,6 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,
                             entry_num++, deh++) {
                                int d_reclen;
                                char *d_name;
-                               off_t d_off;
                                ino_t d_ino;
 
                                if (!de_visible(deh))
@@ -158,8 +156,7 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,
                                if (is_privroot_deh(dentry, deh))
                                        continue;
 
-                               d_off = deh_offset(deh);
-                               *pos = d_off;
+                               ctx->pos = deh_offset(deh);
                                d_ino = deh_objectid(deh);
                                if (d_reclen <= 32) {
                                        local_buf = small_buf;
@@ -187,9 +184,9 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,
                                 * the write lock here for other waiters
                                 */
                                reiserfs_write_unlock(inode->i_sb);
-                               if (filldir
-                                   (dirent, local_buf, d_reclen, d_off, d_ino,
-                                    DT_UNKNOWN) < 0) {
+                               if (!dir_emit
+                                   (ctx, local_buf, d_reclen, d_ino,
+                                    DT_UNKNOWN)) {
                                        reiserfs_write_lock(inode->i_sb);
                                        if (local_buf != small_buf) {
                                                kfree(local_buf);
@@ -237,7 +234,7 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,
        }                       /* while */
 
 end:
-       *pos = next_pos;
+       ctx->pos = next_pos;
        pathrelse(&path_to_entry);
        reiserfs_check_path(&path_to_entry);
 out:
@@ -245,10 +242,9 @@ out:
        return ret;
 }
 
-static int reiserfs_readdir(struct file *file, void *dirent, filldir_t filldir)
+static int reiserfs_readdir(struct file *file, struct dir_context *ctx)
 {
-       struct dentry *dentry = file->f_path.dentry;
-       return reiserfs_readdir_dentry(dentry, dirent, filldir, &file->f_pos);
+       return reiserfs_readdir_dentry(file->f_path.dentry, ctx);
 }
 
 /* compose directory item containing "." and ".." entries (entries are
index 157e474..27e0ba0 100644 (file)
@@ -2709,7 +2709,7 @@ extern const struct inode_operations reiserfs_dir_inode_operations;
 extern const struct inode_operations reiserfs_symlink_inode_operations;
 extern const struct inode_operations reiserfs_special_inode_operations;
 extern const struct file_operations reiserfs_dir_operations;
-int reiserfs_readdir_dentry(struct dentry *, void *, filldir_t, loff_t *);
+int reiserfs_readdir_dentry(struct dentry *, struct dir_context *);
 
 /* tail_conversion.c */
 int direct2indirect(struct reiserfs_transaction_handle *, struct inode *,
index 821bcf7..26648a4 100644 (file)
@@ -171,6 +171,7 @@ static struct dentry *open_xa_dir(const struct inode *inode, int flags)
  * modifying extended attributes. This includes operations such as permissions
  * or ownership changes, object deletions, etc. */
 struct reiserfs_dentry_buf {
+       struct dir_context ctx;
        struct dentry *xadir;
        int count;
        struct dentry *dentries[8];
@@ -223,9 +224,8 @@ static int reiserfs_for_each_xattr(struct inode *inode,
 {
        struct dentry *dir;
        int i, err = 0;
-       loff_t pos = 0;
        struct reiserfs_dentry_buf buf = {
-               .count = 0,
+               .ctx.actor = fill_with_dentries,
        };
 
        /* Skip out, an xattr has no xattrs associated with it */
@@ -249,7 +249,7 @@ static int reiserfs_for_each_xattr(struct inode *inode,
        reiserfs_write_lock(inode->i_sb);
 
        buf.xadir = dir;
-       err = reiserfs_readdir_dentry(dir, &buf, fill_with_dentries, &pos);
+       err = reiserfs_readdir_dentry(dir, &buf.ctx);
        while ((err == 0 || err == -ENOSPC) && buf.count) {
                err = 0;
 
@@ -266,8 +266,7 @@ static int reiserfs_for_each_xattr(struct inode *inode,
                }
                buf.count = 0;
                if (!err)
-                       err = reiserfs_readdir_dentry(dir, &buf,
-                                                     fill_with_dentries, &pos);
+                       err = reiserfs_readdir_dentry(dir, &buf.ctx);
        }
        mutex_unlock(&dir->d_inode->i_mutex);
 
@@ -800,6 +799,7 @@ int reiserfs_removexattr(struct dentry *dentry, const char *name)
 }
 
 struct listxattr_buf {
+       struct dir_context ctx;
        size_t size;
        size_t pos;
        char *buf;
@@ -845,8 +845,8 @@ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size)
 {
        struct dentry *dir;
        int err = 0;
-       loff_t pos = 0;
        struct listxattr_buf buf = {
+               .ctx.actor = listxattr_filler,
                .dentry = dentry,
                .buf = buffer,
                .size = buffer ? size : 0,
@@ -868,7 +868,7 @@ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size)
        }
 
        mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
-       err = reiserfs_readdir_dentry(dir, &buf, listxattr_filler, &pos);
+       err = reiserfs_readdir_dentry(dir, &buf.ctx);
        mutex_unlock(&dir->d_inode->i_mutex);
 
        if (!err)