Skip to content

Commit 0bea828

Browse files
committed
ufs: store cookie in private data
Store the cookie to detect concurrent seeks on directories in file->private_data. Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Jan Kara <[email protected]> Reviewed-by: Jeff Layton <[email protected]> Signed-off-by: Christian Brauner <[email protected]>
1 parent 3dd4624 commit 0bea828

File tree

1 file changed

+25
-3
lines changed

1 file changed

+25
-3
lines changed

fs/ufs/dir.c

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ ufs_readdir(struct file *file, struct dir_context *ctx)
435435
unsigned long n = pos >> PAGE_SHIFT;
436436
unsigned long npages = dir_pages(inode);
437437
unsigned chunk_mask = ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1);
438-
bool need_revalidate = !inode_eq_iversion(inode, file->f_version);
438+
bool need_revalidate = !inode_eq_iversion(inode, *(u64 *)file->private_data);
439439
unsigned flags = UFS_SB(sb)->s_flags;
440440

441441
UFSD("BEGIN\n");
@@ -462,7 +462,7 @@ ufs_readdir(struct file *file, struct dir_context *ctx)
462462
offset = ufs_validate_entry(sb, kaddr, offset, chunk_mask);
463463
ctx->pos = (n<<PAGE_SHIFT) + offset;
464464
}
465-
file->f_version = inode_query_iversion(inode);
465+
*(u64 *)file->private_data = inode_query_iversion(inode);
466466
need_revalidate = false;
467467
}
468468
de = (struct ufs_dir_entry *)(kaddr+offset);
@@ -646,9 +646,31 @@ int ufs_empty_dir(struct inode * inode)
646646
return 0;
647647
}
648648

649+
static int ufs_dir_open(struct inode *inode, struct file *file)
650+
{
651+
file->private_data = kzalloc(sizeof(u64), GFP_KERNEL);
652+
if (!file->private_data)
653+
return -ENOMEM;
654+
return 0;
655+
}
656+
657+
static int ufs_dir_release(struct inode *inode, struct file *file)
658+
{
659+
kfree(file->private_data);
660+
return 0;
661+
}
662+
663+
static loff_t ufs_dir_llseek(struct file *file, loff_t offset, int whence)
664+
{
665+
return generic_llseek_cookie(file, offset, whence,
666+
(u64 *)file->private_data);
667+
}
668+
649669
const struct file_operations ufs_dir_operations = {
670+
.open = ufs_dir_open,
671+
.release = ufs_dir_release,
650672
.read = generic_read_dir,
651673
.iterate_shared = ufs_readdir,
652674
.fsync = generic_file_fsync,
653-
.llseek = generic_file_llseek,
675+
.llseek = ufs_dir_llseek,
654676
};

0 commit comments

Comments
 (0)