• Filipe Manana's avatar
    btrfs: add and use helpers for reading and writing fs_info->generation · 4a4f8fe2
    Filipe Manana authored
    Currently the generation field of struct btrfs_fs_info is always modified
    while holding fs_info->trans_lock locked. Most readers will access this
    field without taking that lock but while holding a transaction handle,
    which is safe to do due to the transaction life cycle.
    
    However there are other readers that are neither holding the lock nor
    holding a transaction handle open:
    
    1) When reading an inode from disk, at btrfs_read_locked_inode();
    
    2) When reading the generation to expose it to sysfs, at
       btrfs_generation_show();
    
    3) Early in the fsync path, at skip_inode_logging();
    
    4) When creating a hole at btrfs_cont_expand(), during write paths,
       truncate and reflinking;
    
    5) In the fs_info ioctl (btrfs_ioctl_fs_info());
    
    6) While mounting the filesystem, in the open_ctree() path. In these
       cases it's safe to directly read fs_info->generation as no one
       can concurrently start a transaction and update fs_info->generation.
    
    In case of the fsync path, races here should be harmless, and in the worst
    case they may cause a fsync to log an inode when it's not really needed,
    so nothing bad from a functional perspective. In the other cases it's not
    so clear if functional problems may arise, though in case 1 rare things
    like a load/store tearing [1] may cause the BTRFS_INODE_NEEDS_FULL_SYNC
    flag not being set on an inode and therefore result in incorrect logging
    later on in case a fsync call is made.
    
    To avoid data race warnings from tools like KCSAN and other issues such
    as load and store tearing (amongst others, see [1]), create helpers to
    access the generation field of struct btrfs_fs_info using READ_ONCE() and
    WRITE_ONCE(), and use these helpers where needed.
    
    [1] https://lwn.net/Articles/793253/Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    4a4f8fe2
inode.c 312 KB