Wrapfs: fix ->llseek to update upper and lower offsets
authorErez Zadok <ezk@cs.sunysb.edu>
Thu, 26 Jun 2014 03:22:55 +0000 (23:22 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Tue, 27 Dec 2016 03:11:39 +0000 (22:11 -0500)
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>
fs/wrapfs/file.c

index 4776dbe4fcd73f7cab8ae6fdced02fce275992fd..79b34fb310a9cb82b9bec9902144e4782f575355 100644 (file)
@@ -305,6 +305,28 @@ out:
        return err;
 }
 
+/*
+ * Wrapfs 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 wrapfs_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 = wrapfs_lower_file(file);
+       err = generic_file_llseek(lower_file, offset, whence);
+
+out:
+       return err;
+}
+
 const struct file_operations wrapfs_main_fops = {
        .llseek         = generic_file_llseek,
        .read           = wrapfs_read,
@@ -325,7 +347,7 @@ const struct file_operations wrapfs_main_fops = {
 
 /* trimmed directory options */
 const struct file_operations wrapfs_dir_fops = {
-       .llseek         = generic_file_llseek,
+       .llseek         = wrapfs_file_llseek,
        .read           = generic_read_dir,
        .readdir        = wrapfs_readdir,
        .unlocked_ioctl = wrapfs_unlocked_ioctl,