On Fri 30-08-24 15:04:54, Christian Brauner wrote: > Store the cookie to detect concurrent seeks on directories in > file->private_data. > > Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > fs/ocfs2/dir.c | 3 ++- > fs/ocfs2/file.c | 11 +++++++++-- > fs/ocfs2/file.h | 1 + > 3 files changed, 12 insertions(+), 3 deletions(-) > > diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c > index f0beb173dbba..ccef3f42b333 100644 > --- a/fs/ocfs2/dir.c > +++ b/fs/ocfs2/dir.c > @@ -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) > diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c > index ccc57038a977..115ab2172820 100644 > --- a/fs/ocfs2/file.c > +++ b/fs/ocfs2/file.c > @@ -2750,6 +2750,13 @@ static loff_t ocfs2_remap_file_range(struct file *file_in, loff_t pos_in, > 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, > diff --git a/fs/ocfs2/file.h b/fs/ocfs2/file.h > index 8e53e4ac1120..41e65e45a9f3 100644 > --- a/fs/ocfs2/file.h > +++ b/fs/ocfs2/file.h > @@ -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; > > -- > 2.45.2 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR