• Boris Burkov's avatar
    btrfs: initial fsverity support · 14605409
    Boris Burkov authored
    Add support for fsverity in btrfs. To support the generic interface in
    fs/verity, we add two new item types in the fs tree for inodes with
    verity enabled. One stores the per-file verity descriptor and btrfs
    verity item and the other stores the Merkle tree data itself.
    
    Verity checking is done in end_page_read just before a page is marked
    uptodate. This naturally handles a variety of edge cases like holes,
    preallocated extents, and inline extents. Some care needs to be taken to
    not try to verity pages past the end of the file, which are accessed by
    the generic buffered file reading code under some circumstances like
    reading to the end of the last page and trying to read again. Direct IO
    on a verity file falls back to buffered reads.
    
    Verity relies on PageChecked for the Merkle tree data itself to avoid
    re-walking up shared paths in the tree. For this reason, we need to
    cache the Merkle tree data. Since the file is immutable after verity is
    turned on, we can cache it at an index past EOF.
    
    Use the new inode ro_flags to store verity on the inode item, so that we
    can enable verity on a file, then rollback to an older kernel and still
    mount the file system and read the file. Since we can't safely write the
    file anymore without ruining the invariants of the Merkle tree, we mark
    a ro_compat flag on the file system when a file has verity enabled.
    Acked-by: default avatarEric Biggers <ebiggers@google.com>
    Co-developed-by: default avatarChris Mason <clm@fb.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    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>
    14605409
file.c 99.7 KB