1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /* -*- mode: c; c-basic-offset: 8; -*-
3 * vim: noexpandtab sw=8 ts=8 sts=0:
7 * Defines OCFS2 ioctls.
9 * Copyright (C) 2010 Oracle. All rights reserved.
16 * Space reservation / allocation / free ioctls and argument structure
17 * are designed to be compatible with XFS.
19 * ALLOCSP* and FREESP* are not and will never be supported, but are
20 * included here for completeness.
22 struct ocfs2_space_resv {
26 __s64 l_len; /* len == 0 means until end of file */
29 __s32 l_pad[4]; /* reserve area */
32 #define OCFS2_IOC_ALLOCSP _IOW ('X', 10, struct ocfs2_space_resv)
33 #define OCFS2_IOC_FREESP _IOW ('X', 11, struct ocfs2_space_resv)
34 #define OCFS2_IOC_RESVSP _IOW ('X', 40, struct ocfs2_space_resv)
35 #define OCFS2_IOC_UNRESVSP _IOW ('X', 41, struct ocfs2_space_resv)
36 #define OCFS2_IOC_ALLOCSP64 _IOW ('X', 36, struct ocfs2_space_resv)
37 #define OCFS2_IOC_FREESP64 _IOW ('X', 37, struct ocfs2_space_resv)
38 #define OCFS2_IOC_RESVSP64 _IOW ('X', 42, struct ocfs2_space_resv)
39 #define OCFS2_IOC_UNRESVSP64 _IOW ('X', 43, struct ocfs2_space_resv)
41 /* Used to pass group descriptor data when online resize is done */
42 struct ocfs2_new_group_input {
43 __u64 group; /* Group descriptor's blkno. */
44 __u32 clusters; /* Total number of clusters in this group */
45 __u32 frees; /* Total free clusters in this group */
46 __u16 chain; /* Chain for this group */
51 #define OCFS2_IOC_GROUP_EXTEND _IOW('o', 1, int)
52 #define OCFS2_IOC_GROUP_ADD _IOW('o', 2,struct ocfs2_new_group_input)
53 #define OCFS2_IOC_GROUP_ADD64 _IOW('o', 3,struct ocfs2_new_group_input)
55 /* Used to pass 2 file names to reflink. */
56 struct reflink_arguments {
61 #define OCFS2_IOC_REFLINK _IOW('o', 4, struct reflink_arguments)
63 /* Following definitions dedicated for ocfs2_info_request ioctls. */
64 #define OCFS2_INFO_MAX_REQUEST (50)
65 #define OCFS2_TEXT_UUID_LEN (OCFS2_VOL_UUID_LEN * 2)
67 /* Magic number of all requests */
68 #define OCFS2_INFO_MAGIC (0x4F32494E)
71 * Always try to separate info request into small pieces to
72 * guarantee the backward&forward compatibility.
75 __u64 oi_requests; /* Array of __u64 pointers to requests */
76 __u32 oi_count; /* Number of requests in info_requests */
80 struct ocfs2_info_request {
81 /*00*/ __u32 ir_magic; /* Magic number */
82 __u32 ir_code; /* Info request code */
83 __u32 ir_size; /* Size of request */
84 __u32 ir_flags; /* Request flags */
85 /*10*/ /* Request specific fields */
88 struct ocfs2_info_clustersize {
89 struct ocfs2_info_request ic_req;
94 struct ocfs2_info_blocksize {
95 struct ocfs2_info_request ib_req;
100 struct ocfs2_info_maxslots {
101 struct ocfs2_info_request im_req;
106 struct ocfs2_info_label {
107 struct ocfs2_info_request il_req;
108 __u8 il_label[OCFS2_MAX_VOL_LABEL_LEN];
109 } __attribute__ ((packed));
111 struct ocfs2_info_uuid {
112 struct ocfs2_info_request iu_req;
113 __u8 iu_uuid_str[OCFS2_TEXT_UUID_LEN + 1];
114 } __attribute__ ((packed));
116 struct ocfs2_info_fs_features {
117 struct ocfs2_info_request if_req;
118 __u32 if_compat_features;
119 __u32 if_incompat_features;
120 __u32 if_ro_compat_features;
124 struct ocfs2_info_journal_size {
125 struct ocfs2_info_request ij_req;
126 __u64 ij_journal_size;
129 struct ocfs2_info_freeinode {
130 struct ocfs2_info_request ifi_req;
131 struct ocfs2_info_local_freeinode {
134 } ifi_stat[OCFS2_MAX_SLOTS];
135 __u32 ifi_slotnum; /* out */
139 #define OCFS2_INFO_MAX_HIST (32)
141 struct ocfs2_info_freefrag {
142 struct ocfs2_info_request iff_req;
143 struct ocfs2_info_freefrag_stats { /* (out) */
144 struct ocfs2_info_free_chunk_list {
145 __u32 fc_chunks[OCFS2_INFO_MAX_HIST];
146 __u32 fc_clusters[OCFS2_INFO_MAX_HIST];
149 __u32 ffs_free_clusters;
150 __u32 ffs_free_chunks;
151 __u32 ffs_free_chunks_real;
152 __u32 ffs_min; /* Minimum free chunksize in clusters */
157 __u32 iff_chunksize; /* chunksize in clusters(in) */
161 /* Codes for ocfs2_info_request */
162 enum ocfs2_info_type {
163 OCFS2_INFO_CLUSTERSIZE = 1,
164 OCFS2_INFO_BLOCKSIZE,
168 OCFS2_INFO_FS_FEATURES,
169 OCFS2_INFO_JOURNAL_SIZE,
170 OCFS2_INFO_FREEINODE,
175 /* Flags for struct ocfs2_info_request */
176 /* Filled by the caller */
177 #define OCFS2_INFO_FL_NON_COHERENT (0x00000001) /* Cluster coherency not
178 required. This is a hint.
179 It is up to ocfs2 whether
180 the request can be fulfilled
182 /* Filled by ocfs2 */
183 #define OCFS2_INFO_FL_FILLED (0x40000000) /* Filesystem understood
185 filled in the answer */
187 #define OCFS2_INFO_FL_ERROR (0x80000000) /* Error happened during
190 #define OCFS2_IOC_INFO _IOR('o', 5, struct ocfs2_info)
192 struct ocfs2_move_extents {
193 /* All values are in bytes */
195 __u64 me_start; /* Virtual start in the file to move */
196 __u64 me_len; /* Length of the extents to be moved */
197 __u64 me_goal; /* Physical offset of the goal,
198 it's in block unit */
199 __u64 me_threshold; /* Maximum distance from goal or threshold
200 for auto defragmentation */
201 __u64 me_flags; /* Flags for the operation:
202 * - auto defragmentation.
203 * - refcount,xattr cases.
206 __u64 me_moved_len; /* Moved/defraged length */
207 __u64 me_new_offset; /* Resulting physical location */
208 __u32 me_reserved[2]; /* Reserved for futhure */
211 #define OCFS2_MOVE_EXT_FL_AUTO_DEFRAG (0x00000001) /* Kernel manages to
214 for extents moving */
215 #define OCFS2_MOVE_EXT_FL_PART_DEFRAG (0x00000002) /* Allow partial extent
219 even more fragmented */
220 #define OCFS2_MOVE_EXT_FL_COMPLETE (0x00000004) /* Move or defragmenation
221 completely gets done.
224 #define OCFS2_IOC_MOVE_EXT _IOW('o', 6, struct ocfs2_move_extents)
226 #endif /* OCFS2_IOCTL_H */