• Johannes Thumshirn's avatar
    btrfs: pass checksum type via BTRFS_IOC_FS_INFO ioctl · 137c5418
    Johannes Thumshirn authored
    With the recent addition of filesystem checksum types other than CRC32c,
    it is not anymore hard-coded which checksum type a btrfs filesystem uses.
    
    Up to now there is no good way to read the filesystem checksum, apart from
    reading the filesystem UUID and then query sysfs for the checksum type.
    
    Add a new csum_type and csum_size fields to the BTRFS_IOC_FS_INFO ioctl
    command which usually is used to query filesystem features. Also add a
    flags member indicating that the kernel responded with a set csum_type and
    csum_size field.
    
    For compatibility reasons, only return the csum_type and csum_size if
    the BTRFS_FS_INFO_FLAG_CSUM_INFO flag was passed to the kernel. Also
    clear any unknown flags so we don't pass false positives to user-space
    newer than the kernel.
    
    To simplify further additions to the ioctl, also switch the padding to a
    u8 array. Pahole was used to verify the result of this switch:
    
    The csum members are added before flags, which might look odd, but this
    is to keep the alignment requirements and not to introduce holes in the
    structure.
    
      $ pahole -C btrfs_ioctl_fs_info_args fs/btrfs/btrfs.ko
      struct btrfs_ioctl_fs_info_args {
    	  __u64                      max_id;               /*     0     8 */
    	  __u64                      num_devices;          /*     8     8 */
    	  __u8                       fsid[16];             /*    16    16 */
    	  __u32                      nodesize;             /*    32     4 */
    	  __u32                      sectorsize;           /*    36     4 */
    	  __u32                      clone_alignment;      /*    40     4 */
    	  __u16                      csum_type;            /*    44     2 */
    	  __u16                      csum_size;            /*    46     2 */
    	  __u64                      flags;                /*    48     8 */
    	  __u8                       reserved[968];        /*    56   968 */
    
    	  /* size: 1024, cachelines: 16, members: 10 */
      };
    
    Fixes: 3951e7f0 ("btrfs: add xxhash64 to checksumming algorithms")
    Fixes: 3831bf00 ("btrfs: add sha256 to checksumming algorithm")
    CC: stable@vger.kernel.org # 5.5+
    Signed-off-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    137c5418
ioctl.c 119 KB