• Boris Burkov's avatar
    btrfs: verity metadata orphan items · 70524253
    Boris Burkov authored
    Writing out the verity data is too large of an operation to do in a
    single transaction. If we are interrupted before we finish creating
    fsverity metadata for a file, or fail to clean up already created
    metadata after a failure, we could leak the verity items that we already
    committed.
    
    To address this issue, we use the orphan mechanism. When we start
    enabling verity on a file, we also add an orphan item for that inode.
    When we are finished, we delete the orphan. However, if we are
    interrupted midway, the orphan will be present at mount and we can
    cleanup the half-formed verity state.
    
    There is a possible race with a normal unlink operation: if unlink and
    verity run on the same file in parallel, it is possible for verity to
    succeed and delete the still legitimate orphan added by unlink. Then, if
    we are interrupted and mount in that state, we will never clean up the
    inode properly. This is also possible for a file created with O_TMPFILE.
    Check nlink==0 before deleting to avoid this race.
    
    A final thing to note is that this is a resurrection of using orphans to
    signal an operation besides "delete this inode". The old case was to
    signal the need to do a truncate. That case still technically applies
    for mounting very old file systems, so we need to take some care to not
    clobber it. To that end, we just have to be careful that verity orphan
    cleanup is a no-op for non-verity files.
    Signed-off-by: default avatarBoris Burkov <boris@bur.io>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    70524253
verity.c 22.5 KB