]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
UBUNTU: SAUCE: shiftfs: use separate llseek method for directories
authorChristian Brauner <christian@brauner.io>
Tue, 16 Apr 2019 16:29:00 +0000 (18:29 +0200)
committerPaolo Pisati <paolo.pisati@canonical.com>
Tue, 2 Nov 2021 07:24:45 +0000 (08:24 +0100)
BugLink: https://bugs.launchpad.net/bugs/1824812
Give shiftfs it's own proper llseek method for directories.

Before this commit we used to rely on an llseek method that was
targeted for regular files for both directories and regular files.
However, the realfile's f_pos was not correctly handled when userspace
called lseek(2) on a shiftfs directory file. Give directories their
own llseek operation so that seeking on a directory file is properly
supported.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Acked-by: Seth Forshee <seth.forshee@canonical.com>
Acked-by: Tyler Hicks <tyhicks@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
fs/shiftfs.c

index 4c8a6ec2a617f5c406b12f7989d924724dbba155..9771165d1ce079c6c7ac2227f4db863d3db0434e 100644 (file)
@@ -1144,7 +1144,15 @@ static int shiftfs_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static loff_t shiftfs_llseek(struct file *file, loff_t offset, int whence)
+static loff_t shiftfs_dir_llseek(struct file *file, loff_t offset, int whence)
+{
+       struct shiftfs_file_info *file_info = file->private_data;
+       struct file *realfile = file_info->realfile;
+
+       return vfs_llseek(realfile, offset, whence);
+}
+
+static loff_t shiftfs_file_llseek(struct file *file, loff_t offset, int whence)
 {
        struct inode *realinode = file_inode(file)->i_private;
 
@@ -1653,7 +1661,7 @@ static int shiftfs_iterate_shared(struct file *file, struct dir_context *ctx)
 const struct file_operations shiftfs_file_operations = {
        .open                   = shiftfs_open,
        .release                = shiftfs_release,
-       .llseek                 = shiftfs_llseek,
+       .llseek                 = shiftfs_file_llseek,
        .read_iter              = shiftfs_read_iter,
        .write_iter             = shiftfs_write_iter,
        .fsync                  = shiftfs_fsync,
@@ -1670,7 +1678,7 @@ const struct file_operations shiftfs_dir_operations = {
        .compat_ioctl           = shiftfs_compat_ioctl,
        .fsync                  = shiftfs_fsync,
        .iterate_shared         = shiftfs_iterate_shared,
-       .llseek                 = shiftfs_llseek,
+       .llseek                 = shiftfs_dir_llseek,
        .open                   = shiftfs_open,
        .read                   = generic_read_dir,
        .release                = shiftfs_release,