Re: [REGRESSION] Return change in 6.12.80+ with volatile mounting

Samuel Karp <[email protected]>
Newsgroups org.kernel.vger.linux-unionfs,dev.linux.lists.regressions,org.kernel.vger.stable
Message-ID <CAE6nXrPes8T9Cn4ihTt43qmtgCCZvmMwYXo-yG_HJgNO7y+vVg@mail.gmail.com>
We can fix the test case for the "volatile" option and expect either
"volatile" or "fsync=volatile". Existing use within containerd beyond
the test code involves us producing the "volatile" option and passing
it to the mount syscall (or _not_ passing it, depending on the
situation). This seems like it should still work if "fsync=volatile"
is an alias rather than a replacement.  However, containerd is not in
full control of the mount options; as part of snapshot (layer)
management external snapshotter implementations can provide mount
options to containerd which containerd then passes to the kernel.  The
protection in RemoveVolatileOption will break if a newer snapshotter
produces "fsync=volatile" and provides it to an unpatched version of
containerd.  I think the breakage scenario then becomes new kernel +
new snapshotter (producing the new option) + old containerd.

-- 
Samuel Karp

-- 
Samuel Karp


On Tue, Apr 21, 2026 at 10:20 AM Chenglong Tang
<[email protected]> wrote:
>
> CC: Samnuel from containerd
>
> On Mon, Apr 20, 2026 at 12:59 AM Amir Goldstein <[email protected]> wrote:
> >
> > On Mon, Apr 20, 2026 at 8:31 AM Chenglong Tang <[email protected]> wrote:
> > >
> > > Hi, Amir,
> > >
> > > Thanks for looking into this! To answer your questions:
> > >
> > > 1. Production vs. Test Suite Impact
> > >
> > > The immediate failure we encountered is in containerd's integration
> > > test suite (TestImageVolumeCheckVolatileOption). The test explicitly
> > > reads /proc/mounts and expects the exact string "volatile".
> > >
> > > In default production, containerd passes the legacy "volatile" string
> > > to the mount syscall, which your patch correctly handles under the
> > > hood. So the standard "happy path" is not broken in production.
> > >
> > > 2. The purpose of WithTempMount() / RemoveVolatileOption
> > >
> > > Containerd regularly makes temporary overlay mounts (e.g., for
> > > unpacking layers). Because overlayfs rejects reusing upper/work dirs
> > > from a volatile mount, containerd uses RemoveVolatileOption to strip
> > > the volatile flag before these temporary mounts.
> > >
> > > Currently, containerd's RemoveVolatileOption does an exact string
> > > match for "volatile". While it works for the default path, there is a
> > > production edge case: if a user explicitly configures their container
> > > runtime to use the new "fsync=volatile" option, older containerd
> > > binaries will fail to strip it, and the temporary mounts will be
> > > rejected by the kernel.
> >
> > I need to challenge this specific argument because I do not agree
> > that this edge case could be considered a regression at all.
> >
> > An admin from the past could not have set an explicit
> > "fsync=volatile" mount option.
> >
> > Though experiment - overlayfs adds a new mode fsync=off
> > which is more loose than "volatile" because "volatile" can actually
> > return error on fsync in some cases.
> >
> > Overlayfs would also not allow to reuse workdir from such
> > a mount.
> >
> > So would you then claim that adding the new mount option
> > "fsync=off" is a regression because of the edge case that an admin
> > decided to explicitly add "fsync=off" and RemoveVolatileOption()
> > does not handle it.
> >
> > I don't buy it.
> >
> > There is a more correct way to handle this situation and it is
> > documented in overlayfs.rst:
> >
> > "When overlay is mounted with "volatile" option, the directory
> > "$workdir/work/incompat/volatile" is created.  During next mount, overlay
> > checks for this directory and refuses to mount if present. This is a strong
> > indicator that the user should discard upper and work directories and create
> > fresh ones. In very limited cases where the user knows that the system has
> > not crashed and contents of upperdir are intact, the "volatile" directory
> > can be removed."
> >
> > containerd unpacking layers falls under this very limited case.
> > containerd can syncfs() workdir after unpack & unmount of temp
> > overlayfs and remove the "incompat/volatile" directory and then
> > the upperdir/workdir are are free to be remounted.
> >
> > >
> > > Conclusion
> > >
> > > While containerd could theoretically patch their code to accept
> > > strings.Contains() or fsync=volatile going forward, there are many
> >
> > Following the documentation advise would be better.
> >
> > > existing containerd binaries in the wild. Given that this patch breaks
> > > containerd's CI tests and introduces an edge case for
> > > RemoveVolatileOption, it might be safest to fix ovl_show_options in
> > > the kernel to continue outputting the legacy "volatile" string to
> > > strictly guarantee backwards compatibility with userspace.
> > >
> >
> > Considering my comments above, I think we have not yet reached
> > the point where the backward compat "volatile" string is called for,
> > but with other reports from production workloads, we could get there.
> >
> > Thanks for the clear and honest explanations of the containerd situation!
> > Amir.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.