* [PATCH] fs: delay sysctl_nr_open check in expand_files()
@ 2024-11-16 6:41 Mateusz Guzik
2024-11-16 7:36 ` Al Viro
2024-11-20 8:08 ` Christian Brauner
0 siblings, 2 replies; 5+ messages in thread
From: Mateusz Guzik @ 2024-11-16 6:41 UTC (permalink / raw)
To: brauner; +Cc: viro, jack, linux-kernel, linux-fsdevel, Mateusz Guzik
Suppose a thread sharing the table started a resize, while
sysctl_nr_open got lowered to a value which prohibits it. This is still
going to go through with and without the patch, which is fine.
Further suppose another thread shows up to do a matching expansion while
resize_in_progress == true. It is going to error out since it performs
the sysctl_nr_open check *before* finding out if there is an expansion
in progress. But the aformentioned thread is going to succeded, so the
error is spurious (and it would not happen if the thread showed up a
little bit later).
Checking the sysctl *after* we know there are no pending updates sorts
it out.
While here annotate the thing as unlikely.
Signed-off-by: Mateusz Guzik <mjguzik@gmail.com>
---
This is a random tidbit I found while looking at the code, I don't think
this is a particularly impactful problem but definitely worth sorting
out in master.
I doubt it warrants backports to stable so I'm not cc-ing it.
fs/file.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/fs/file.c b/fs/file.c
index fb1011cf6b4a..019fb9acf91b 100644
--- a/fs/file.c
+++ b/fs/file.c
@@ -278,10 +278,6 @@ static int expand_files(struct files_struct *files, unsigned int nr)
if (nr < fdt->max_fds)
return 0;
- /* Can we expand? */
- if (nr >= sysctl_nr_open)
- return -EMFILE;
-
if (unlikely(files->resize_in_progress)) {
spin_unlock(&files->file_lock);
wait_event(files->resize_wait, !files->resize_in_progress);
@@ -289,6 +285,10 @@ static int expand_files(struct files_struct *files, unsigned int nr)
goto repeat;
}
+ /* Can we expand? */
+ if (unlikely(nr >= sysctl_nr_open))
+ return -EMFILE;
+
/* All good, so we try */
files->resize_in_progress = true;
error = expand_fdtable(files, nr);
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH] fs: delay sysctl_nr_open check in expand_files()
2024-11-16 6:41 [PATCH] fs: delay sysctl_nr_open check in expand_files() Mateusz Guzik
@ 2024-11-16 7:36 ` Al Viro
2024-11-16 7:42 ` Al Viro
2024-11-20 8:08 ` Christian Brauner
1 sibling, 1 reply; 5+ messages in thread
From: Al Viro @ 2024-11-16 7:36 UTC (permalink / raw)
To: Mateusz Guzik; +Cc: brauner, jack, linux-kernel, linux-fsdevel
On Sat, Nov 16, 2024 at 07:41:28AM +0100, Mateusz Guzik wrote:
> Suppose a thread sharing the table started a resize, while
> sysctl_nr_open got lowered to a value which prohibits it. This is still
> going to go through with and without the patch, which is fine.
>
> Further suppose another thread shows up to do a matching expansion while
> resize_in_progress == true. It is going to error out since it performs
> the sysctl_nr_open check *before* finding out if there is an expansion
> in progress. But the aformentioned thread is going to succeded, so the
> error is spurious (and it would not happen if the thread showed up a
> little bit later).
>
> Checking the sysctl *after* we know there are no pending updates sorts
> it out.
What for? No, seriously - what's the point? What could possibly
observe an inconsistent situation? How would that look like?
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] fs: delay sysctl_nr_open check in expand_files()
2024-11-16 7:36 ` Al Viro
@ 2024-11-16 7:42 ` Al Viro
2024-11-16 8:01 ` Mateusz Guzik
0 siblings, 1 reply; 5+ messages in thread
From: Al Viro @ 2024-11-16 7:42 UTC (permalink / raw)
To: Mateusz Guzik; +Cc: brauner, jack, linux-kernel, linux-fsdevel
On Sat, Nov 16, 2024 at 07:36:26AM +0000, Al Viro wrote:
> On Sat, Nov 16, 2024 at 07:41:28AM +0100, Mateusz Guzik wrote:
> > Suppose a thread sharing the table started a resize, while
> > sysctl_nr_open got lowered to a value which prohibits it. This is still
> > going to go through with and without the patch, which is fine.
> >
> > Further suppose another thread shows up to do a matching expansion while
> > resize_in_progress == true. It is going to error out since it performs
> > the sysctl_nr_open check *before* finding out if there is an expansion
> > in progress. But the aformentioned thread is going to succeded, so the
> > error is spurious (and it would not happen if the thread showed up a
> > little bit later).
> >
> > Checking the sysctl *after* we know there are no pending updates sorts
> > it out.
>
> What for? No, seriously - what's the point? What could possibly
> observe an inconsistent situation? How would that look like?
PS: I'm not saying I hate that patch; I just don't understand the point...
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] fs: delay sysctl_nr_open check in expand_files()
2024-11-16 7:42 ` Al Viro
@ 2024-11-16 8:01 ` Mateusz Guzik
0 siblings, 0 replies; 5+ messages in thread
From: Mateusz Guzik @ 2024-11-16 8:01 UTC (permalink / raw)
To: Al Viro; +Cc: brauner, jack, linux-kernel, linux-fsdevel
On Sat, Nov 16, 2024 at 8:42 AM Al Viro <viro@zeniv.linux.org.uk> wrote:
>
> On Sat, Nov 16, 2024 at 07:36:26AM +0000, Al Viro wrote:
> > On Sat, Nov 16, 2024 at 07:41:28AM +0100, Mateusz Guzik wrote:
> > > Suppose a thread sharing the table started a resize, while
> > > sysctl_nr_open got lowered to a value which prohibits it. This is still
> > > going to go through with and without the patch, which is fine.
> > >
> > > Further suppose another thread shows up to do a matching expansion while
> > > resize_in_progress == true. It is going to error out since it performs
> > > the sysctl_nr_open check *before* finding out if there is an expansion
> > > in progress. But the aformentioned thread is going to succeded, so the
> > > error is spurious (and it would not happen if the thread showed up a
> > > little bit later).
> > >
> > > Checking the sysctl *after* we know there are no pending updates sorts
> > > it out.
> >
> > What for? No, seriously - what's the point? What could possibly
> > observe an inconsistent situation? How would that look like?
>
> PS: I'm not saying I hate that patch; I just don't understand the point...
Per the description, if you get unlucky enough one thread is going to
spuriously error out. So basically any multithreaded program which
ends up trying to expand the fd table while racing against
sysctl_nr_open going down can in principle run into it. Except people
normally don't mess with sysctl_nr_open, so I don't think this shows
up during normal operation.
I explicitly noted this is not a serious problem, just a thing I
noticed while poking around. If you want to NAK this that's fine with
me, it's not worth arguing over.
--
Mateusz Guzik <mjguzik gmail.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] fs: delay sysctl_nr_open check in expand_files()
2024-11-16 6:41 [PATCH] fs: delay sysctl_nr_open check in expand_files() Mateusz Guzik
2024-11-16 7:36 ` Al Viro
@ 2024-11-20 8:08 ` Christian Brauner
1 sibling, 0 replies; 5+ messages in thread
From: Christian Brauner @ 2024-11-20 8:08 UTC (permalink / raw)
To: Mateusz Guzik; +Cc: Christian Brauner, viro, jack, linux-kernel, linux-fsdevel
On Sat, 16 Nov 2024 07:41:28 +0100, Mateusz Guzik wrote:
> Suppose a thread sharing the table started a resize, while
> sysctl_nr_open got lowered to a value which prohibits it. This is still
> going to go through with and without the patch, which is fine.
>
> Further suppose another thread shows up to do a matching expansion while
> resize_in_progress == true. It is going to error out since it performs
> the sysctl_nr_open check *before* finding out if there is an expansion
> in progress. But the aformentioned thread is going to succeded, so the
> error is spurious (and it would not happen if the thread showed up a
> little bit later).
>
> [...]
Applied to the vfs-6.14.misc branch of the vfs/vfs.git tree.
Patches in the vfs-6.14.misc branch should appear in linux-next soon.
Please report any outstanding bugs that were missed during review in a
new review to the original patch series allowing us to drop it.
It's encouraged to provide Acked-bys and Reviewed-bys even though the
patch has now been applied. If possible patch trailers will be updated.
Note that commit hashes shown below are subject to change due to rebase,
trailer updates or similar. If in doubt, please check the listed branch.
tree: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git
branch: vfs-6.14.misc
[1/1] fs: delay sysctl_nr_open check in expand_files()
https://git.kernel.org/vfs/vfs/c/bb35f8709172
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-11-20 8:08 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-16 6:41 [PATCH] fs: delay sysctl_nr_open check in expand_files() Mateusz Guzik
2024-11-16 7:36 ` Al Viro
2024-11-16 7:42 ` Al Viro
2024-11-16 8:01 ` Mateusz Guzik
2024-11-20 8:08 ` Christian Brauner
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.