ANDROID: sdcardfs: fix ->llseek to update upper and lower offset

Adapted from wrapfs
commit 1d1d23a47baa ("Wrapfs: fix ->llseek to update upper and lower
offsets")

Fixes bug: xfstests generic/257. f_pos consistently is required by and
only by dir_ops->wrapfs_readdir, main_ops is not affected.

Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
Signed-off-by: Mengyang Li <li.mengyang@stonybrook.edu>
Signed-off-by: Daniel Rosenberg <drosen@google.com>
Bug: 35766959
Change-Id: I360a1368ac37ea8966910a58972b81504031d437
This commit is contained in:
Daniel Rosenberg 2017-03-09 21:42:01 -08:00 committed by Amit Pundir
parent bcd422f8db
commit d73d4fde4c

View file

@ -316,6 +316,29 @@ static int sdcardfs_fasync(int fd, struct file *file, int flag)
return err;
}
/*
* Sdcardfs cannot use generic_file_llseek as ->llseek, because it would
* only set the offset of the upper file. So we have to implement our
* own method to set both the upper and lower file offsets
* consistently.
*/
static loff_t sdcardfs_file_llseek(struct file *file, loff_t offset, int whence)
{
int err;
struct file *lower_file;
err = generic_file_llseek(file, offset, whence);
if (err < 0)
goto out;
lower_file = sdcardfs_lower_file(file);
err = generic_file_llseek(lower_file, offset, whence);
out:
return err;
}
const struct file_operations sdcardfs_main_fops = {
.llseek = generic_file_llseek,
.read = sdcardfs_read,
@ -334,7 +357,7 @@ const struct file_operations sdcardfs_main_fops = {
/* trimmed directory options */
const struct file_operations sdcardfs_dir_fops = {
.llseek = generic_file_llseek,
.llseek = sdcardfs_file_llseek,
.read = generic_read_dir,
.iterate = sdcardfs_readdir,
.unlocked_ioctl = sdcardfs_unlocked_ioctl,