• Marcos Paulo de Souza's avatar
    btrfs: send: emit file capabilities after chown · 89efda52
    Marcos Paulo de Souza authored
    Whenever a chown is executed, all capabilities of the file being touched
    are lost.  When doing incremental send with a file with capabilities,
    there is a situation where the capability can be lost on the receiving
    side. The sequence of actions bellow shows the problem:
    
      $ mount /dev/sda fs1
      $ mount /dev/sdb fs2
    
      $ touch fs1/foo.bar
      $ setcap cap_sys_nice+ep fs1/foo.bar
      $ btrfs subvolume snapshot -r fs1 fs1/snap_init
      $ btrfs send fs1/snap_init | btrfs receive fs2
    
      $ chgrp adm fs1/foo.bar
      $ setcap cap_sys_nice+ep fs1/foo.bar
    
      $ btrfs subvolume snapshot -r fs1 fs1/snap_complete
      $ btrfs subvolume snapshot -r fs1 fs1/snap_incremental
    
      $ btrfs send fs1/snap_complete | btrfs receive fs2
      $ btrfs send -p fs1/snap_init fs1/snap_incremental | btrfs receive fs2
    
    At this point, only a chown was emitted by "btrfs send" since only the
    group was changed. This makes the cap_sys_nice capability to be dropped
    from fs2/snap_incremental/foo.bar
    
    To fix that, only emit capabilities after chown is emitted. The current
    code first checks for xattrs that are new/changed, emits them, and later
    emit the chown. Now, __process_new_xattr skips capabilities, letting
    only finish_inode_if_needed to emit them, if they exist, for the inode
    being processed.
    
    This behavior was being worked around in "btrfs receive" side by caching
    the capability and only applying it after chown. Now, xattrs are only
    emmited _after_ chown, making that workaround not needed anymore.
    
    Link: https://github.com/kdave/btrfs-progs/issues/202
    CC: stable@vger.kernel.org # 4.4+
    Suggested-by: default avatarFilipe Manana <fdmanana@suse.com>
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarMarcos Paulo de Souza <mpdesouza@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    89efda52
send.c 177 KB