2022-10-17 19:54:21

by Saeed Mirzamohammadi

[permalink] [raw]
Subject: [PATCH stable 0/5] Fix missing patches in stable

The following patches has been applied to 6.0 but only patch#2 below
has been applied to stable. This caused regression with nfs tests in
all stable releases.

This patchset backports patches 1 and 3-6 to stable.

1. 868941b14441 fs: remove no_llseek
2. 97ef77c52b78 fs: check FMODE_LSEEK to control internal pipe splicing
3. 54ef7a47f67d vfio: do not set FMODE_LSEEK flag
4. c9eb2d427c1c dma-buf: remove useless FMODE_LSEEK flag
5. 4e3299eaddff fs: do not compare against ->llseek
6. e7478158e137 fs: clear or set FMODE_LSEEK based on llseek function

For 5.10.y and 5.4.y only, a revert of patch#2 is already included.
Please apply patch#2, for 5.4.y and 5.10.y as well.

Thanks,
Saeed

Jason A. Donenfeld (5):
fs: clear or set FMODE_LSEEK based on llseek function
fs: do not compare against ->llseek
dma-buf: remove useless FMODE_LSEEK flag
vfio: do not set FMODE_LSEEK flag
fs: remove no_llseek

Documentation/filesystems/porting.rst | 8 ++++++++
drivers/dma-buf/dma-buf.c | 1 -
drivers/gpu/drm/drm_file.c | 3 +--
drivers/vfio/vfio.c | 2 +-
fs/coredump.c | 4 ++--
fs/file_table.c | 2 ++
fs/open.c | 4 ++++
fs/overlayfs/copy_up.c | 3 +--
fs/read_write.c | 17 +++--------------
include/linux/fs.h | 2 +-
kernel/bpf/bpf_iter.c | 3 +--
11 files changed, 24 insertions(+), 25 deletions(-)

--
2.31.1


2022-10-17 19:58:54

by Saeed Mirzamohammadi

[permalink] [raw]
Subject: [PATCH stable 3/5] dma-buf: remove useless FMODE_LSEEK flag

From: "Jason A. Donenfeld" <[email protected]>

This is already set by anon_inode_getfile(), since dma_buf_fops has
non-NULL ->llseek, so we don't need to set it here too.

Acked-by: Daniel Vetter <[email protected]>
Acked-by: Sumit Semwal <[email protected]>
Signed-off-by: Jason A. Donenfeld <[email protected]>
Signed-off-by: Al Viro <[email protected]>
(cherry picked from commit c9eb2d427c1c428e4f4e29f1e635b9a83236c015)
Cc: [email protected]
Signed-off-by: Saeed Mirzamohammadi <[email protected]>
---
drivers/dma-buf/dma-buf.c | 1 -
1 file changed, 1 deletion(-)

diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index 968c3df2810e..3c3d0e2258b4 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -584,7 +584,6 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
goto err_dmabuf;
}

- file->f_mode |= FMODE_LSEEK;
dmabuf->file = file;

mutex_init(&dmabuf->lock);
--
2.31.1

2022-10-17 19:59:31

by Saeed Mirzamohammadi

[permalink] [raw]
Subject: [PATCH stable 5/5] fs: remove no_llseek

From: "Jason A. Donenfeld" <[email protected]>

Now that all callers of ->llseek are going through vfs_llseek(), we
don't gain anything by keeping no_llseek around. Nothing actually calls
it and setting ->llseek to no_lseek is completely equivalent to
leaving it NULL.

Longer term (== by the end of merge window) we want to remove all such
intializations. To simplify the merge window this commit does *not*
touch initializers - it only defines no_llseek as NULL (and simplifies
the tests on file opening).

At -rc1 we'll need do a mechanical removal of no_llseek -

git grep -l -w no_llseek | grep -v porting.rst | while read i; do
sed -i '/\<no_llseek\>/d' $i
done
would do it.

Signed-off-by: Jason A. Donenfeld <[email protected]>
Signed-off-by: Al Viro <[email protected]>
(cherry picked from commit 868941b14441282ba08761b770fc6cad69d5bdb7)
Conflicts:
fs/open.c
Cc: [email protected]
Signed-off-by: Saeed Mirzamohammadi <[email protected]>
---
Documentation/filesystems/porting.rst | 8 ++++++++
drivers/gpu/drm/drm_file.c | 3 +--
fs/file_table.c | 2 +-
fs/read_write.c | 6 ------
include/linux/fs.h | 2 +-
kernel/bpf/bpf_iter.c | 3 +--
6 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/Documentation/filesystems/porting.rst b/Documentation/filesystems/porting.rst
index bf19fd6b86e7..9d362f80a644 100644
--- a/Documentation/filesystems/porting.rst
+++ b/Documentation/filesystems/porting.rst
@@ -908,3 +908,11 @@ Calling conventions for file_open_root() changed; now it takes struct path *
instead of passing mount and dentry separately. For callers that used to
pass <mnt, mnt->mnt_root> pair (i.e. the root of given mount), a new helper
is provided - file_open_root_mnt(). In-tree users adjusted.
+
+---
+
+**mandatory**
+
+no_llseek is gone; don't set .llseek to that - just leave it NULL instead.
+Checks for "does that file have llseek(2), or should it fail with ESPIPE"
+should be done by looking at FMODE_LSEEK in file->f_mode.
diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c
index ed25168619fc..dc7d2e5b16c8 100644
--- a/drivers/gpu/drm/drm_file.c
+++ b/drivers/gpu/drm/drm_file.c
@@ -552,8 +552,7 @@ EXPORT_SYMBOL(drm_release_noglobal);
* Since events are used by the KMS API for vblank and page flip completion this
* means all modern display drivers must use it.
*
- * @offset is ignored, DRM events are read like a pipe. Therefore drivers also
- * must set the &file_operation.llseek to no_llseek(). Polling support is
+ * @offset is ignored, DRM events are read like a pipe. Polling support is
* provided by drm_poll().
*
* This function will only ever read a full event. Therefore userspace must
diff --git a/fs/file_table.c b/fs/file_table.c
index f675817be4ad..652b70841df6 100644
--- a/fs/file_table.c
+++ b/fs/file_table.c
@@ -198,7 +198,7 @@ static struct file *alloc_file(const struct path *path, int flags,
file->f_mapping = path->dentry->d_inode->i_mapping;
file->f_wb_err = filemap_sample_wb_err(file->f_mapping);
file->f_sb_err = file_sample_sb_err(file);
- if (fop->llseek && fop->llseek != no_llseek)
+ if (fop->llseek)
file->f_mode |= FMODE_LSEEK;
if ((file->f_mode & FMODE_READ) &&
likely(fop->read || fop->read_iter))
diff --git a/fs/read_write.c b/fs/read_write.c
index b64527211b32..582beb67e48e 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -227,12 +227,6 @@ loff_t noop_llseek(struct file *file, loff_t offset, int whence)
}
EXPORT_SYMBOL(noop_llseek);

-loff_t no_llseek(struct file *file, loff_t offset, int whence)
-{
- return -ESPIPE;
-}
-EXPORT_SYMBOL(no_llseek);
-
loff_t default_llseek(struct file *file, loff_t offset, int whence)
{
struct inode *inode = file_inode(file);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 76162f046670..f5eac9d76e9d 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -3174,7 +3174,7 @@ extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
extern void
file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping);
extern loff_t noop_llseek(struct file *file, loff_t offset, int whence);
-extern loff_t no_llseek(struct file *file, loff_t offset, int whence);
+#define no_llseek NULL
extern loff_t vfs_setpos(struct file *file, loff_t offset, loff_t maxsize);
extern loff_t generic_file_llseek(struct file *file, loff_t offset, int whence);
extern loff_t generic_file_llseek_size(struct file *file, loff_t offset,
diff --git a/kernel/bpf/bpf_iter.c b/kernel/bpf/bpf_iter.c
index b2ee45064e06..60e8f611954e 100644
--- a/kernel/bpf/bpf_iter.c
+++ b/kernel/bpf/bpf_iter.c
@@ -80,10 +80,9 @@ static bool bpf_iter_support_resched(struct seq_file *seq)
#define MAX_ITER_OBJECTS 1000000

/* bpf_seq_read, a customized and simpler version for bpf iterator.
- * no_llseek is assumed for this file.
* The following are differences from seq_read():
* . fixed buffer size (PAGE_SIZE)
- * . assuming no_llseek
+ * . assuming NULL ->llseek()
* . stop() may call bpf program, handling potential overflow there
*/
static ssize_t bpf_seq_read(struct file *file, char __user *buf, size_t size,
--
2.31.1

2022-10-26 17:02:50

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [PATCH stable 0/5] Fix missing patches in stable

On Mon, Oct 17, 2022 at 12:20:01PM -0700, Saeed Mirzamohammadi wrote:
> The following patches has been applied to 6.0 but only patch#2 below
> has been applied to stable. This caused regression with nfs tests in
> all stable releases.
>
> This patchset backports patches 1 and 3-6 to stable.
>
> 1. 868941b14441 fs: remove no_llseek
> 2. 97ef77c52b78 fs: check FMODE_LSEEK to control internal pipe splicing
> 3. 54ef7a47f67d vfio: do not set FMODE_LSEEK flag
> 4. c9eb2d427c1c dma-buf: remove useless FMODE_LSEEK flag
> 5. 4e3299eaddff fs: do not compare against ->llseek
> 6. e7478158e137 fs: clear or set FMODE_LSEEK based on llseek function
>
> For 5.10.y and 5.4.y only, a revert of patch#2 is already included.
> Please apply patch#2, for 5.4.y and 5.10.y as well.

I am sorry, I really do not understand here.

You list these commits in a specific order, yet the patches you send are
in a different order.

And they don't apply to 5.10 or older.

Can you resend proper patch series, for each stable branch that you want
these applied to, so that I can correctly queue them up?

thanks,

greg k-h

2022-10-27 15:23:44

by Jason A. Donenfeld

[permalink] [raw]
Subject: Re: [PATCH stable 0/5] Fix missing patches in stable

On Mon, Oct 17, 2022 at 9:20 PM Saeed Mirzamohammadi
<[email protected]> wrote:
>
> The following patches has been applied to 6.0 but only patch#2 below
> has been applied to stable. This caused regression with nfs tests in
> all stable releases.
>
> This patchset backports patches 1 and 3-6 to stable.
>
> 1. 868941b14441 fs: remove no_llseek
> 2. 97ef77c52b78 fs: check FMODE_LSEEK to control internal pipe splicing
> 3. 54ef7a47f67d vfio: do not set FMODE_LSEEK flag
> 4. c9eb2d427c1c dma-buf: remove useless FMODE_LSEEK flag
> 5. 4e3299eaddff fs: do not compare against ->llseek
> 6. e7478158e137 fs: clear or set FMODE_LSEEK based on llseek function
>
> For 5.10.y and 5.4.y only, a revert of patch#2 is already included.
> Please apply patch#2, for 5.4.y and 5.10.y as well.

This is confusing and there's no way Greg is going to do this right
given the limited information you've provided and wrong ordering of
the patches. I couldn't really even follow this without some detective
work, and I wrote these patches.

Here are your options:
- Let the revert of "97ef77c52b78 fs: check FMODE_LSEEK to control
internal pipe splicing" work its way into all stable trees; or
- Send a proper backport series for each and every stable kernel,
depending on what each one needs. Send these as different patchsets,
marked with the version number it applies to. Make sure they apply,
compile, and work correctly.

Anything short of those is going to lead to chaos.

Jason