• Lee Trager's avatar
    btrfs: copy dir permission and time when creating a stub subvolume · 94628ad9
    Lee Trager authored
    btrfs supports creating nested subvolumes however snapshots are not
    recursive.  When a snapshot is taken of a volume which contains a
    subvolume the subvolume is replaced with a stub subvolume which has the
    same name and uses inode number 2[1]. The stub subvolume kept the
    directory name but did not set the time or permissions of the stub
    subvolume. This resulted in all time information being the current time
    and ownership defaulting to root. When subvolumes and snapshots are
    created using unshare this results in a snapshot directory the user
    created but has no permissions for.
    
    Test case:
    
      [vmuser@archvm ~]# sudo -i
      [root@archvm ~]# mkdir -p /mnt/btrfs/test
      [root@archvm ~]# chown vmuser:users /mnt/btrfs/test/
      [root@archvm ~]# exit
      logout
      [vmuser@archvm ~]$ cd /mnt/btrfs/test
      [vmuser@archvm test]$ unshare --user --keep-caps --map-auto --map-root-user
      [root@archvm test]# btrfs subvolume create subvolume
      Create subvolume './subvolume'
      [root@archvm test]# btrfs subvolume create subvolume/subsubvolume
      Create subvolume 'subvolume/subsubvolume'
      [root@archvm test]# btrfs subvolume snapshot subvolume snapshot
      Create a snapshot of 'subvolume' in './snapshot'
      [root@archvm test]# exit
      logout
      [vmuser@archvm test]$ tree -ug
      [vmuser   users   ]  .
      ├── [vmuser   users   ]  snapshot
      │   └── [vmuser   users   ]  subsubvolume  <-- Without patch perm is root:root
      └── [vmuser   users   ]  subvolume
          └── [vmuser   users   ]  subsubvolume
    
      5 directories, 0 files
    
    [1] https://btrfs.readthedocs.io/en/latest/btrfs-subvolume.html#nested-subvolumesSigned-off-by: default avatarLee Trager <lee@trager.us>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    94628ad9
inode.c 313 KB