Hello,

While getting the fstests stuff nailed down to deal with btrfs I ran into
failures with generic/595, specifically the multi-threaded part.

In one thread we have a loop adding and removing the master key.

In the other thread we have us trying to echo a character into a flie in the
encrypted side, and if it succeeds we echo a character into a temporary file,
and then after the runtime has elapsed we compare these two files to make sure
they match.

The problem with this is that btrfs derives the per-extent key from the master
key at writeout time.  Everybody else has their content key derived at flie open
time, so they don't need the master key to be around once the file is opened, so
any writes that occur while that file is held open are allowed to happen.

Sweet Tea had some changes around soft unloading the master key to handle this
case.  Basically we allow the master key to stick around by anybody who may need
it who is currently open, and then any new users get denied.  Once all the
outstanding open files are closed the master key is unloaded.

This keeps the semantics of what happens for everybody else.

What is currently happening with my version of the patchset, which didn't bring
in those patches, is that you get an ENOKEY at writeout time if you remove the
key.  The fstest fails because even tho we let you write to the file sometimes,
it doesn't necessarily mean it'll make it to disk.

If we want to keep the semantics of "when userspace tells us to throw away the
master key, we absolutely throw the master key away" then I can just make
adjustments to the fstests test and call what I have good enough.

If we want to have the semantics of "when userspace tells us to throw away the
master key we'll make it unavailable for any new users, but existing open files
operate as normal" then I can pull in Sweet Tea's soft removal patches and call
it good enough.

There's a third option that is a bit of a middle ground with varying degrees of
raciness.  We could sync the file system before we do the removal just to narrow
the window where we could successfully write to a file but get an ENOKEY at
writeout time.  We could freeze the filesystem to make sure it's sync'ed and
allow any current writers to complete, this would be a stronger version of the
first option, again just narrows the window.  Neither of these cases help if the
file is being held open.  If we wanted to fully deal with the file being held
open case we could set a flag, sync, then remove the key.  Then we add a new
fscrypt_prep_write() hook that filesystems could optionally use, obviously just
btrfs for now, that we'd stick in the write path that would check for this flag
or if the master key had been removed so we can deny dirtying when the key is
removed.

At this point I don't have strong opinions, it's easier for me to just leave it
like it is and change fstests.  Anything else is a change in the semantics of
how the master key is handled, and that's not really a decision I feel
comfortable making for everybody.  Once we nail this detail down I can send the
updated version of all the patches and we can start talking about inclusion.
Thanks,

Josef

Reply via email to