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:
parent
bcd422f8db
commit
d73d4fde4c
1 changed files with 24 additions and 1 deletions
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue