]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ocfs2: store cookie in private data
authorChristian Brauner <brauner@kernel.org>
Fri, 30 Aug 2024 13:04:54 +0000 (15:04 +0200)
committerChristian Brauner <brauner@kernel.org>
Thu, 12 Sep 2024 09:58:44 +0000 (11:58 +0200)
Store the cookie to detect concurrent seeks on directories in
file->private_data.

Link: https://lore.kernel.org/r/20240830-vfs-file-f_version-v1-13-6d3e4816aa7b@kernel.org
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/ocfs2/dir.c
fs/ocfs2/file.c
fs/ocfs2/file.h

index f0beb173dbba29ce9df50ee28b482f2306753c6d..ccef3f42b333be20368e96a9ec8cabc05b288d33 100644 (file)
@@ -1932,6 +1932,7 @@ int ocfs2_readdir(struct file *file, struct dir_context *ctx)
 {
        int error = 0;
        struct inode *inode = file_inode(file);
+       struct ocfs2_file_private *fp = file->private_data;
        int lock_level = 0;
 
        trace_ocfs2_readdir((unsigned long long)OCFS2_I(inode)->ip_blkno);
@@ -1952,7 +1953,7 @@ int ocfs2_readdir(struct file *file, struct dir_context *ctx)
                goto bail_nolock;
        }
 
-       error = ocfs2_dir_foreach_blk(inode, &file->f_version, ctx, false);
+       error = ocfs2_dir_foreach_blk(inode, &fp->cookie, ctx, false);
 
        ocfs2_inode_unlock(inode, lock_level);
        if (error)
index ccc57038a9779f7105667c08138d4b3b170ef1db..115ab21728205fdac037d3c24b3cdd90d1e6f3d7 100644 (file)
@@ -2750,6 +2750,13 @@ out_unlock:
        return remapped > 0 ? remapped : ret;
 }
 
+static loff_t ocfs2_dir_llseek(struct file *file, loff_t offset, int whence)
+{
+       struct ocfs2_file_private *fp = file->private_data;
+
+       return generic_llseek_cookie(file, offset, whence, &fp->cookie);
+}
+
 const struct inode_operations ocfs2_file_iops = {
        .setattr        = ocfs2_setattr,
        .getattr        = ocfs2_getattr,
@@ -2797,7 +2804,7 @@ const struct file_operations ocfs2_fops = {
 
 WRAP_DIR_ITER(ocfs2_readdir) // FIXME!
 const struct file_operations ocfs2_dops = {
-       .llseek         = generic_file_llseek,
+       .llseek         = ocfs2_dir_llseek,
        .read           = generic_read_dir,
        .iterate_shared = shared_ocfs2_readdir,
        .fsync          = ocfs2_sync_file,
@@ -2843,7 +2850,7 @@ const struct file_operations ocfs2_fops_no_plocks = {
 };
 
 const struct file_operations ocfs2_dops_no_plocks = {
-       .llseek         = generic_file_llseek,
+       .llseek         = ocfs2_dir_llseek,
        .read           = generic_read_dir,
        .iterate_shared = shared_ocfs2_readdir,
        .fsync          = ocfs2_sync_file,
index 8e53e4ac11204d3f37c611cdc378a177bc35e9d1..41e65e45a9f3ff5a1f6266f7b96d9063ef44b037 100644 (file)
@@ -20,6 +20,7 @@ struct ocfs2_alloc_context;
 enum ocfs2_alloc_restarted;
 
 struct ocfs2_file_private {
+       u64                     cookie;
        struct file             *fp_file;
        struct mutex            fp_mutex;
        struct ocfs2_lock_res   fp_flock;