Skip to content

Commit 3dd4624

Browse files
committed
udf: 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 b4dba2e commit 3dd4624

File tree

1 file changed

+25
-3
lines changed

1 file changed

+25
-3
lines changed

fs/udf/dir.c

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
6060
* identifying beginning of dir entry (names are under user control),
6161
* we need to scan the directory from the beginning.
6262
*/
63-
if (!inode_eq_iversion(dir, file->f_version)) {
63+
if (!inode_eq_iversion(dir, *(u64 *)file->private_data)) {
6464
emit_pos = nf_pos;
6565
nf_pos = 0;
6666
} else {
@@ -122,15 +122,37 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
122122
udf_fiiter_release(&iter);
123123
out:
124124
if (pos_valid)
125-
file->f_version = inode_query_iversion(dir);
125+
*(u64 *)file->private_data = inode_query_iversion(dir);
126126
kfree(fname);
127127

128128
return ret;
129129
}
130130

131+
static int udf_dir_open(struct inode *inode, struct file *file)
132+
{
133+
file->private_data = kzalloc(sizeof(u64), GFP_KERNEL);
134+
if (!file->private_data)
135+
return -ENOMEM;
136+
return 0;
137+
}
138+
139+
static int udf_dir_release(struct inode *inode, struct file *file)
140+
{
141+
kfree(file->private_data);
142+
return 0;
143+
}
144+
145+
static loff_t udf_dir_llseek(struct file *file, loff_t offset, int whence)
146+
{
147+
return generic_llseek_cookie(file, offset, whence,
148+
(u64 *)file->private_data);
149+
}
150+
131151
/* readdir and lookup functions */
132152
const struct file_operations udf_dir_operations = {
133-
.llseek = generic_file_llseek,
153+
.open = udf_dir_open,
154+
.release = udf_dir_release,
155+
.llseek = udf_dir_llseek,
134156
.read = generic_read_dir,
135157
.iterate_shared = udf_readdir,
136158
.unlocked_ioctl = udf_ioctl,

0 commit comments

Comments
 (0)