diff mbox series

[2/3] btrfs-progs: Add BTRFS_IOC_GET_CHUNK_INFO ioctl.

Message ID 20200315152430.7532-3-kreijack@libero.it (mailing list archive)
State New, archived
Headers show
Series [1/3] btrfs-progs: remove use BLKGETSIZE64 | expand

Commit Message

Goffredo Baroncelli March 15, 2020, 3:24 p.m. UTC
From: Goffredo Baroncelli <kreijack@inwind.it>

Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it>
---
 ioctl.h | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)
diff mbox series

Patch

diff --git a/ioctl.h b/ioctl.h
index 4e7efd94..bdf70849 100644
--- a/ioctl.h
+++ b/ioctl.h
@@ -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
 }