OSDN Git Service

ANDROID: sdcardfs: fix ->llseek to update upper and lower offset
authorDaniel Rosenberg <drosen@google.com>
Fri, 10 Mar 2017 05:42:01 +0000 (21:42 -0800)
committerDaniel Rosenberg <drosen@google.com>
Fri, 7 Apr 2017 00:37:39 +0000 (17:37 -0700)
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

fs/sdcardfs/file.c

index 41a550f..f49df7a 100644 (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,