1
0
mirror of https://github.com/Zygo/bees.git synced 2025-05-17 13:25:45 +02:00

fs: add support and workarounds for btrfs fs_info v2

Define a local copy of the header that has fields for the csum type
and length, so we can build in places that haven't caught up to kernel
5.5 headers yet.

The reason why the csum type and length are not unconditionally filled
in eludes me.  csum_length is necessarily non-zero, and the cost of
the conditional is worse than the cost of the copy, so the whole flags
dance is a WTF...but it's part of the kernel API now, so it's too late
to NAK it.

Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
Zygo Blaxell 2020-10-26 22:50:14 -04:00
parent c80af1cb4f
commit 180bb60cde
3 changed files with 39 additions and 5 deletions

View File

@ -205,8 +205,27 @@
#endif #endif
#ifndef BTRFS_IOC_LOGICAL_INO_V2 #ifndef BTRFS_IOC_LOGICAL_INO_V2
#define BTRFS_IOC_LOGICAL_INO_V2 _IOWR(BTRFS_IOCTL_MAGIC, 59, struct btrfs_ioctl_logical_ino_args) #define BTRFS_IOC_LOGICAL_INO_V2 _IOWR(BTRFS_IOCTL_MAGIC, 59, struct btrfs_ioctl_logical_ino_args)
#define BTRFS_LOGICAL_INO_ARGS_IGNORE_OFFSET (1ULL << 0) #define BTRFS_LOGICAL_INO_ARGS_IGNORE_OFFSET (1ULL << 0)
#endif #endif
#ifndef BTRFS_FS_INFO_FLAG_CSUM_INFO
/* Request information about checksum type and size */
#define BTRFS_FS_INFO_FLAG_CSUM_INFO (1 << 0)
#endif
struct btrfs_ioctl_fs_info_args_v2 {
__u64 max_id; /* out */
__u64 num_devices; /* out */
__u8 fsid[BTRFS_FSID_SIZE]; /* out */
__u32 nodesize; /* out */
__u32 sectorsize; /* out */
__u32 clone_alignment; /* out */
/* See BTRFS_FS_INFO_FLAG_* */
__u16 csum_type; /* out */
__u16 csum_size; /* out */
__u64 flags; /* in/out */
__u8 reserved[968]; /* pad to 1k */
};
#endif // CRUCIBLE_BTRFS_H #endif // CRUCIBLE_BTRFS_H

View File

@ -258,10 +258,12 @@ namespace crucible {
ostream &hexdump(ostream &os, const vector<char> &v); ostream &hexdump(ostream &os, const vector<char> &v);
struct BtrfsIoctlFsInfoArgs : public btrfs_ioctl_fs_info_args { struct BtrfsIoctlFsInfoArgs : public btrfs_ioctl_fs_info_args_v2 {
BtrfsIoctlFsInfoArgs(); BtrfsIoctlFsInfoArgs();
void do_ioctl(int fd); void do_ioctl(int fd);
string uuid() const; string uuid() const;
uint16_t csum_type() const;
uint16_t csum_size() const;
}; };
ostream & operator<<(ostream &os, const BtrfsIoctlFsInfoArgs &a); ostream & operator<<(ostream &os, const BtrfsIoctlFsInfoArgs &a);

View File

@ -1084,13 +1084,14 @@ namespace crucible {
BtrfsIoctlFsInfoArgs::BtrfsIoctlFsInfoArgs() BtrfsIoctlFsInfoArgs::BtrfsIoctlFsInfoArgs()
{ {
memset_zero<btrfs_ioctl_fs_info_args>(this); memset_zero<btrfs_ioctl_fs_info_args_v2>(this);
flags = BTRFS_FS_INFO_FLAG_CSUM_INFO;
} }
void void
BtrfsIoctlFsInfoArgs::do_ioctl(int fd) BtrfsIoctlFsInfoArgs::do_ioctl(int fd)
{ {
btrfs_ioctl_fs_info_args *p = static_cast<btrfs_ioctl_fs_info_args *>(this); btrfs_ioctl_fs_info_args_v2 *p = static_cast<btrfs_ioctl_fs_info_args_v2 *>(this);
if (ioctl(fd, BTRFS_IOC_FS_INFO, p)) { if (ioctl(fd, BTRFS_IOC_FS_INFO, p)) {
THROW_ERRNO("BTRFS_IOC_FS_INFO: fd " << fd); THROW_ERRNO("BTRFS_IOC_FS_INFO: fd " << fd);
} }
@ -1102,4 +1103,16 @@ namespace crucible {
return uuid_unparse(fsid); return uuid_unparse(fsid);
} }
uint16_t
BtrfsIoctlFsInfoArgs::csum_type() const
{
return this->btrfs_ioctl_fs_info_args_v2::csum_type;
}
uint16_t
BtrfsIoctlFsInfoArgs::csum_size() const
{
return this->btrfs_ioctl_fs_info_args_v2::csum_size;
}
}; };