2022-09-28 11:10:44

by Thomas Weißschuh

[permalink] [raw]
Subject: [PATCH] tmpfs: ensure O_LARGEFILE with generic_file_open()

From: Thomas Weißschuh <[email protected]>

Without this check open() will open large files on tmpfs although
O_LARGEFILE was not specified. This is inconsistent with other
filesystems.
Also it will later result in EOVERFLOW on stat() or EFBIG on write().

Link: https://lore.kernel.org/lkml/[email protected]/
Signed-off-by: Thomas Weißschuh <[email protected]>
---
mm/shmem.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/mm/shmem.c b/mm/shmem.c
index 42e5888bf84d..902c5550fabc 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -3876,6 +3876,7 @@ EXPORT_SYMBOL(shmem_aops);

static const struct file_operations shmem_file_operations = {
.mmap = shmem_mmap,
+ .open = generic_file_open,
.get_unmapped_area = shmem_get_unmapped_area,
#ifdef CONFIG_TMPFS
.llseek = shmem_file_llseek,

base-commit: f76349cf41451c5c42a99f18a9163377e4b364ff
--
2.37.3


2022-09-28 20:47:50

by Hugh Dickins

[permalink] [raw]
Subject: Re: [PATCH] tmpfs: ensure O_LARGEFILE with generic_file_open()

On Wed, 28 Sep 2022, Thomas Weißschuh wrote:
> From: Thomas Weißschuh <[email protected]>
>
> Without this check open() will open large files on tmpfs although
> O_LARGEFILE was not specified. This is inconsistent with other
> filesystems.
> Also it will later result in EOVERFLOW on stat() or EFBIG on write().
>
> Link: https://lore.kernel.org/lkml/[email protected]/
> Signed-off-by: Thomas Weißschuh <[email protected]>

Acked-by: Hugh Dickins <[email protected]>

Thanks! I think you deserve some special award for finding and fixing
such an ancient bug/inconsistency - dating back to early v2.4 it seems.

But only affecting 32-bit; and since we've happily lived with it so long,
and the fix does change behaviour for userspace, better not to Cc stable.

There are some other filesystems still behaving as tmpfs was (ramfs,
hugetlbfsi, and I didn't look further); but we do make more of an effort
to keep tmpfs in line with the major filesystems - thank you.

> ---
> mm/shmem.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/mm/shmem.c b/mm/shmem.c
> index 42e5888bf84d..902c5550fabc 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -3876,6 +3876,7 @@ EXPORT_SYMBOL(shmem_aops);
>
> static const struct file_operations shmem_file_operations = {
> .mmap = shmem_mmap,
> + .open = generic_file_open,
> .get_unmapped_area = shmem_get_unmapped_area,
> #ifdef CONFIG_TMPFS
> .llseek = shmem_file_llseek,
>
> base-commit: f76349cf41451c5c42a99f18a9163377e4b364ff
> --
> 2.37.3

2022-09-28 22:08:30

by Thomas Weißschuh

[permalink] [raw]
Subject: Re: [PATCH] tmpfs: ensure O_LARGEFILE with generic_file_open()

On 2022-09-28 13:27-0700, Hugh Dickins wrote:
> From: Hugh Dickins <[email protected]>
>
> On Wed, 28 Sep 2022, Thomas Weißschuh wrote:
> > From: Thomas Weißschuh <[email protected]>
> >
> > Without this check open() will open large files on tmpfs although
> > O_LARGEFILE was not specified. This is inconsistent with other
> > filesystems.
> > Also it will later result in EOVERFLOW on stat() or EFBIG on write().
> >
> > Link: https://lore.kernel.org/lkml/[email protected]/
> > Signed-off-by: Thomas Weißschuh <[email protected]>
>
> Acked-by: Hugh Dickins <[email protected]>
>
> Thanks! I think you deserve some special award for finding and fixing
> such an ancient bug/inconsistency - dating back to early v2.4 it seems.

Seems to be my special talent.

> But only affecting 32-bit; and since we've happily lived with it so long,
> and the fix does change behaviour for userspace, better not to Cc stable.

That was my feeling, too.

> There are some other filesystems still behaving as tmpfs was (ramfs,
> hugetlbfsi, and I didn't look further); but we do make more of an effort
> to keep tmpfs in line with the major filesystems - thank you.

NFS seems also to be affected, which I think warrants a fix.
My plan was to wait for the feedback to this patch and if it works out to then
submit patches for NFS as validating that will be a bit more involved.

> > ---
> > mm/shmem.c | 1 +
> > 1 file changed, 1 insertion(+)
> >
> > diff --git a/mm/shmem.c b/mm/shmem.c
> > index 42e5888bf84d..902c5550fabc 100644
> > --- a/mm/shmem.c
> > +++ b/mm/shmem.c
> > @@ -3876,6 +3876,7 @@ EXPORT_SYMBOL(shmem_aops);
> >
> > static const struct file_operations shmem_file_operations = {
> > .mmap = shmem_mmap,
> > + .open = generic_file_open,
> > .get_unmapped_area = shmem_get_unmapped_area,
> > #ifdef CONFIG_TMPFS
> > .llseek = shmem_file_llseek,
> >
> > base-commit: f76349cf41451c5c42a99f18a9163377e4b364ff
> > --
> > 2.37.3