@@ -775,6 +775,64 @@ struct btrfs_ioctl_get_subvol_rootref_args {
};
BUILD_ASSERT(sizeof(struct btrfs_ioctl_get_subvol_rootref_args) == 4096);
+struct btrfs_chunk_info_stripe {
+ __u64 devid;
+ __u64 offset;
+ __u8 dev_uuid[BTRFS_UUID_SIZE];
+};
+
+struct btrfs_chunk_info {
+ /* logical start of this chunk */
+ __u64 offset;
+ /* size of this chunk in bytes */
+ __u64 length;
+
+ __u64 stripe_len;
+ __u64 type;
+
+ /* 2^16 stripes is quite a lot, a second limit is the size of a single
+ * item in the btree
+ */
+ __u16 num_stripes;
+
+ /* sub stripes only matter for raid10 */
+ __u16 sub_stripes;
+
+ struct btrfs_chunk_info_stripe stripes[1];
+ /* additional stripes go here */
+};
+
+struct btrfs_ioctl_chunk_info {
+ /* offset to start the search; after the ioctl, this field contains
+ * the next offset to start a search
+ */
+ u64 offset; /* in/out */
+ /* size of the passed buffer, including btrfs_ioctl_chunk_info */
+ u32 buf_size; /* in */
+ /* number of items returned */
+ u32 items_count; /* out */
+};
+
+static inline struct btrfs_chunk_info *
+btrfs_first_chunk_info(struct btrfs_ioctl_chunk_info *bici)
+{
+ return (struct btrfs_chunk_info *)((char *)bici +
+ sizeof(struct btrfs_ioctl_chunk_info));
+}
+
+static inline int btrfs_chunk_info_size(struct btrfs_chunk_info *ci)
+{
+ return sizeof(struct btrfs_chunk_info) +
+ sizeof(struct btrfs_chunk_info_stripe) * (ci->num_stripes-1);
+}
+
+static inline struct btrfs_chunk_info *
+btrfs_next_chunk_info(struct btrfs_chunk_info *ci)
+{
+ return (struct btrfs_chunk_info *)((char *)ci +
+ btrfs_chunk_info_size(ci));
+}
+
/* Error codes as returned by the kernel */
enum btrfs_err_code {
notused,
@@ -945,6 +1003,8 @@ static inline char *btrfs_err_str(enum btrfs_err_code err_code)
struct btrfs_ioctl_ino_lookup_user_args)
#define BTRFS_IOC_SNAP_DESTROY_V2 _IOW(BTRFS_IOCTL_MAGIC, 63, \
struct btrfs_ioctl_vol_args_v2)
+#define BTRFS_IOC_GET_CHUNK_INFO _IOR(BTRFS_IOCTL_MAGIC, 64, \
+ struct btrfs_ioctl_chunk_info)
#ifdef __cplusplus
}