Skip to content

Commit

Permalink
orangefs: invalidate stored directory on seek
Browse files Browse the repository at this point in the history
If an application seeks to a position before the point which has been
read, it must want updates which have been made to the directory.  So
delete the copy stored in the kernel so it will be fetched again.

Signed-off-by: Martin Brandenburg <martin@omnibond.com>
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
  • Loading branch information
Martin Brandenburg authored and Mike Marshall committed May 4, 2017
1 parent bf15ba7 commit 942835d
Showing 1 changed file with 23 additions and 1 deletion.
24 changes: 23 additions & 1 deletion fs/orangefs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,28 @@ static int orangefs_dir_fill(struct orangefs_inode_s *oi,
return 0;
}

static loff_t orangefs_dir_llseek(struct file *file, loff_t offset,
int whence)
{
struct orangefs_dir *od = file->private_data;
/*
* Delete the stored data so userspace sees new directory
* entries.
*/
if (!whence && offset < od->end) {
struct orangefs_dir_part *part = od->part;
while (part) {
struct orangefs_dir_part *next = part->next;
vfree(part);
part = next;
}
od->token = ORANGEFS_ITERATE_START;
od->part = NULL;
od->end = 1 << PART_SHIFT;
}
return default_llseek(file, offset, whence);
}

static int orangefs_dir_iterate(struct file *file,
struct dir_context *ctx)
{
Expand Down Expand Up @@ -371,7 +393,7 @@ static int orangefs_dir_release(struct inode *inode, struct file *file)
}

const struct file_operations orangefs_dir_operations = {
.llseek = default_llseek,
.llseek = orangefs_dir_llseek,
.read = generic_read_dir,
.iterate = orangefs_dir_iterate,
.open = orangefs_dir_open,
Expand Down

0 comments on commit 942835d

Please sign in to comment.