]> www.infradead.org Git - users/hch/block.git/commitdiff
fs: add offset parameter to iterate_dir function
authorStefan Roesch <shr@fb.com>
Tue, 21 Dec 2021 16:40:02 +0000 (08:40 -0800)
committerJens Axboe <axboe@kernel.dk>
Tue, 21 Dec 2021 19:15:40 +0000 (12:15 -0700)
This change adds the offset parameter to the iterate_dir
function. The offset paramater allows the caller to specify
the offset position.

This change is required to support getdents in io_uring.

Signed-off-by: Stefan Roesch <shr@fb.com>
Link: https://lore.kernel.org/r/20211221164004.119663-2-shr@fb.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
arch/alpha/kernel/osf_sys.c
fs/ecryptfs/file.c
fs/exportfs/expfs.c
fs/ksmbd/smb2pdu.c
fs/ksmbd/vfs.c
fs/nfsd/nfs4recover.c
fs/nfsd/vfs.c
fs/overlayfs/readdir.c
fs/readdir.c
include/linux/fs.h

index 8bbeebb73cf03309aa2654cbd67c00ad32d92eb9..cf68c459bca69b5e58c48dbb6fd9e997ec57b0d0 100644 (file)
@@ -162,7 +162,7 @@ SYSCALL_DEFINE4(osf_getdirentries, unsigned int, fd,
        if (!arg.file)
                return -EBADF;
 
-       error = iterate_dir(arg.file, &buf.ctx);
+       error = iterate_dir(arg.file, &buf.ctx, &arg.file->f_pos);
        if (error >= 0)
                error = buf.error;
        if (count != buf.count)
index 18d5b91cb573edc34e4e3e8876911b14c6c2fe76..b68f1945e6158169a7b7ecbc57eb3427e5df84ac 100644 (file)
@@ -109,7 +109,7 @@ static int ecryptfs_readdir(struct file *file, struct dir_context *ctx)
                .sb = inode->i_sb,
        };
        lower_file = ecryptfs_file_to_lower(file);
-       rc = iterate_dir(lower_file, &buf.ctx);
+       rc = iterate_dir(lower_file, &buf.ctx, &lower_file->f_pos);
        ctx->pos = buf.ctx.pos;
        if (rc < 0)
                goto out;
index 0106eba46d5afcf6738dd0db21186754b7b99128..654e2d4b1d4f59f94c18466ade12a41919c83586 100644 (file)
@@ -323,7 +323,7 @@ static int get_name(const struct path *path, char *name, struct dentry *child)
        while (1) {
                int old_seq = buffer.sequence;
 
-               error = iterate_dir(file, &buffer.ctx);
+               error = iterate_dir(file, &buffer.ctx, &file->f_pos);
                if (buffer.found) {
                        error = 0;
                        break;
index 121f8e8c70aca16d6ce134724f129e0cb4d651ec..b64d2731ff9dcdfb850b1c4094239308f7a68f87 100644 (file)
@@ -3923,7 +3923,8 @@ int smb2_query_dir(struct ksmbd_work *work)
        dir_fp->readdir_data.private            = &query_dir_private;
        set_ctx_actor(&dir_fp->readdir_data.ctx, __query_dir);
 
-       rc = iterate_dir(dir_fp->filp, &dir_fp->readdir_data.ctx);
+       rc = iterate_dir(dir_fp->filp, &dir_fp->readdir_data.ctx,
+                       &dir_fp->filp->f_pos);
        if (rc == 0)
                restart_ctx(&dir_fp->readdir_data.ctx);
        if (rc == -ENOSPC)
index 19d36393974ca95a30590921f98ad649e11014c2..5b8e23d3c8465502dd72bdc079a54d4c90e73f08 100644 (file)
@@ -1136,7 +1136,7 @@ int ksmbd_vfs_empty_dir(struct ksmbd_file *fp)
        set_ctx_actor(&readdir_data.ctx, __dir_empty);
        readdir_data.dirent_count = 0;
 
-       err = iterate_dir(fp->filp, &readdir_data.ctx);
+       err = iterate_dir(fp->filp, &readdir_data.ctx, &fp->filp->f_pos);
        if (readdir_data.dirent_count > 2)
                err = -ENOTEMPTY;
        else
@@ -1186,7 +1186,7 @@ static int ksmbd_vfs_lookup_in_dir(struct path *dir, char *name, size_t namelen)
        if (IS_ERR(dfilp))
                return PTR_ERR(dfilp);
 
-       ret = iterate_dir(dfilp, &readdir_data.ctx);
+       ret = iterate_dir(dfilp, &readdir_data.ctx, &dfilp->f_pos);
        if (readdir_data.dirent_count > 0)
                ret = 0;
        fput(dfilp);
index 6fedc49726bf7c7b1d27ff692c3913fefbb1ccc9..79a2799891e443832e8ebe49863ff6d78b219184 100644 (file)
@@ -307,7 +307,7 @@ nfsd4_list_rec_dir(recdir_func *f, struct nfsd_net *nn)
                return status;
        }
 
-       status = iterate_dir(nn->rec_file, &ctx.ctx);
+       status = iterate_dir(nn->rec_file, &ctx.ctx, &nn->rec_file->f_pos);
        inode_lock_nested(d_inode(dir), I_MUTEX_PARENT);
 
        list_for_each_entry_safe(entry, tmp, &ctx.names, list) {
index c99857689e2c2ab5dec2d4fff53c15d1d05ecfd7..085864c25318b7d284f80570c6b0bb0b3309b0f9 100644 (file)
@@ -1980,7 +1980,7 @@ static __be32 nfsd_buffered_readdir(struct file *file, struct svc_fh *fhp,
                buf.used = 0;
                buf.full = 0;
 
-               host_err = iterate_dir(file, &buf.ctx);
+               host_err = iterate_dir(file, &buf.ctx, &file->f_pos);
                if (buf.full)
                        host_err = 0;
 
index 150fdf3bc68d4c812fe45a886c724e58c56f84aa..52167ff9e513ad82779443ed74a1e5fb9863c4cb 100644 (file)
@@ -306,7 +306,7 @@ static inline int ovl_dir_read(struct path *realpath,
        do {
                rdd->count = 0;
                rdd->err = 0;
-               err = iterate_dir(realfile, &rdd->ctx);
+               err = iterate_dir(realfile, &rdd->ctx, &realfile->f_pos);
                if (err >= 0)
                        err = rdd->err;
        } while (!err && rdd->count);
@@ -722,7 +722,7 @@ static int ovl_iterate_real(struct file *file, struct dir_context *ctx)
                        return PTR_ERR(rdt.cache);
        }
 
-       err = iterate_dir(od->realfile, &rdt.ctx);
+       err = iterate_dir(od->realfile, &rdt.ctx, &od->realfile->f_pos);
        ctx->pos = rdt.ctx.pos;
 
        return err;
@@ -753,7 +753,7 @@ static int ovl_iterate(struct file *file, struct dir_context *ctx)
                      OVL_TYPE_MERGE(ovl_path_type(dentry->d_parent))))) {
                        err = ovl_iterate_real(file, ctx);
                } else {
-                       err = iterate_dir(od->realfile, ctx);
+                       err = iterate_dir(od->realfile, ctx, &od->realfile->f_pos);
                }
                goto out;
        }
index 09e8ed7d416141406ed5b2eacef0a9de30120bd3..c1e6612e0f475b1f429bd5acdca9145f291d2c10 100644 (file)
        unsafe_copy_to_user(dst, src, len, label);              \
 } while (0)
 
-
-int iterate_dir(struct file *file, struct dir_context *ctx)
+/**
+ * iterate_dir - iterate over directory
+ * @file    : pointer to file struct of directory
+ * @ctx     : pointer to directory ctx structure
+ * @pos     : file offset
+ */
+int iterate_dir(struct file *file, struct dir_context *ctx, loff_t *pos)
 {
        struct inode *inode = file_inode(file);
        bool shared = false;
@@ -60,12 +65,15 @@ int iterate_dir(struct file *file, struct dir_context *ctx)
 
        res = -ENOENT;
        if (!IS_DEADDIR(inode)) {
-               ctx->pos = file->f_pos;
+               ctx->pos = *pos;
+
                if (shared)
                        res = file->f_op->iterate_shared(file, ctx);
                else
                        res = file->f_op->iterate(file, ctx);
-               file->f_pos = ctx->pos;
+
+               *pos = ctx->pos;
+
                fsnotify_access(file);
                file_accessed(file);
        }
@@ -190,7 +198,7 @@ SYSCALL_DEFINE3(old_readdir, unsigned int, fd,
        if (!f.file)
                return -EBADF;
 
-       error = iterate_dir(f.file, &buf.ctx);
+       error = iterate_dir(f.file, &buf.ctx, &f.file->f_pos);
        if (buf.result)
                error = buf.result;
 
@@ -283,7 +291,7 @@ SYSCALL_DEFINE3(getdents, unsigned int, fd,
        if (!f.file)
                return -EBADF;
 
-       error = iterate_dir(f.file, &buf.ctx);
+       error = iterate_dir(f.file, &buf.ctx, &f.file->f_pos);
        if (error >= 0)
                error = buf.error;
        if (buf.prev_reclen) {
@@ -366,7 +374,7 @@ SYSCALL_DEFINE3(getdents64, unsigned int, fd,
        if (!f.file)
                return -EBADF;
 
-       error = iterate_dir(f.file, &buf.ctx);
+       error = iterate_dir(f.file, &buf.ctx, &f.file->f_pos);
        if (error >= 0)
                error = buf.error;
        if (buf.prev_reclen) {
@@ -379,7 +387,7 @@ SYSCALL_DEFINE3(getdents64, unsigned int, fd,
                else
                        error = count - buf.count;
        }
-       fdput_pos(f);
+
        return error;
 }
 
@@ -448,7 +456,7 @@ COMPAT_SYSCALL_DEFINE3(old_readdir, unsigned int, fd,
        if (!f.file)
                return -EBADF;
 
-       error = iterate_dir(f.file, &buf.ctx);
+       error = iterate_dir(f.file, &buf.ctx, &f.file->f_pos);
        if (buf.result)
                error = buf.result;
 
@@ -534,7 +542,7 @@ COMPAT_SYSCALL_DEFINE3(getdents, unsigned int, fd,
        if (!f.file)
                return -EBADF;
 
-       error = iterate_dir(f.file, &buf.ctx);
+       error = iterate_dir(f.file, &buf.ctx, &f.file->f_pos);
        if (error >= 0)
                error = buf.error;
        if (buf.prev_reclen) {
index 1cb616fc11053beda5c7dd6be6da84122a3adc61..7a57ce41992f78dc689462fdabf09f676b43a056 100644 (file)
@@ -3343,7 +3343,7 @@ const char *simple_get_link(struct dentry *, struct inode *,
                            struct delayed_call *);
 extern const struct inode_operations simple_symlink_inode_operations;
 
-extern int iterate_dir(struct file *, struct dir_context *);
+extern int iterate_dir(struct file *, struct dir_context *, loff_t *pos);
 
 int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,
                int flags);