xref: /openbmc/linux/fs/ocfs2/ocfs2_ioctl.h (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
11802d0beSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2*fa60ce2cSMasahiro Yamada /*
39df5778eSTristan Ye  * ocfs2_ioctl.h
49df5778eSTristan Ye  *
59df5778eSTristan Ye  * Defines OCFS2 ioctls.
69df5778eSTristan Ye  *
79df5778eSTristan Ye  * Copyright (C) 2010 Oracle.  All rights reserved.
89df5778eSTristan Ye  */
99df5778eSTristan Ye 
109df5778eSTristan Ye #ifndef OCFS2_IOCTL_H
119df5778eSTristan Ye #define OCFS2_IOCTL_H
129df5778eSTristan Ye 
139df5778eSTristan Ye /*
149df5778eSTristan Ye  * Space reservation / allocation / free ioctls and argument structure
159df5778eSTristan Ye  * are designed to be compatible with XFS.
169df5778eSTristan Ye  *
179df5778eSTristan Ye  * ALLOCSP* and FREESP* are not and will never be supported, but are
189df5778eSTristan Ye  * included here for completeness.
199df5778eSTristan Ye  */
209df5778eSTristan Ye struct ocfs2_space_resv {
219df5778eSTristan Ye 	__s16		l_type;
229df5778eSTristan Ye 	__s16		l_whence;
239df5778eSTristan Ye 	__s64		l_start;
249df5778eSTristan Ye 	__s64		l_len;		/* len == 0 means until end of file */
259df5778eSTristan Ye 	__s32		l_sysid;
269df5778eSTristan Ye 	__u32		l_pid;
279df5778eSTristan Ye 	__s32		l_pad[4];	/* reserve area			    */
289df5778eSTristan Ye };
299df5778eSTristan Ye 
309df5778eSTristan Ye #define OCFS2_IOC_ALLOCSP		_IOW ('X', 10, struct ocfs2_space_resv)
319df5778eSTristan Ye #define OCFS2_IOC_FREESP		_IOW ('X', 11, struct ocfs2_space_resv)
329df5778eSTristan Ye #define OCFS2_IOC_RESVSP		_IOW ('X', 40, struct ocfs2_space_resv)
339df5778eSTristan Ye #define OCFS2_IOC_UNRESVSP	_IOW ('X', 41, struct ocfs2_space_resv)
349df5778eSTristan Ye #define OCFS2_IOC_ALLOCSP64	_IOW ('X', 36, struct ocfs2_space_resv)
359df5778eSTristan Ye #define OCFS2_IOC_FREESP64	_IOW ('X', 37, struct ocfs2_space_resv)
369df5778eSTristan Ye #define OCFS2_IOC_RESVSP64	_IOW ('X', 42, struct ocfs2_space_resv)
379df5778eSTristan Ye #define OCFS2_IOC_UNRESVSP64	_IOW ('X', 43, struct ocfs2_space_resv)
389df5778eSTristan Ye 
399df5778eSTristan Ye /* Used to pass group descriptor data when online resize is done */
409df5778eSTristan Ye struct ocfs2_new_group_input {
419df5778eSTristan Ye 	__u64 group;		/* Group descriptor's blkno. */
429df5778eSTristan Ye 	__u32 clusters;		/* Total number of clusters in this group */
439df5778eSTristan Ye 	__u32 frees;		/* Total free clusters in this group */
449df5778eSTristan Ye 	__u16 chain;		/* Chain for this group */
459df5778eSTristan Ye 	__u16 reserved1;
469df5778eSTristan Ye 	__u32 reserved2;
479df5778eSTristan Ye };
489df5778eSTristan Ye 
499df5778eSTristan Ye #define OCFS2_IOC_GROUP_EXTEND	_IOW('o', 1, int)
509df5778eSTristan Ye #define OCFS2_IOC_GROUP_ADD	_IOW('o', 2,struct ocfs2_new_group_input)
519df5778eSTristan Ye #define OCFS2_IOC_GROUP_ADD64	_IOW('o', 3,struct ocfs2_new_group_input)
529df5778eSTristan Ye 
539df5778eSTristan Ye /* Used to pass 2 file names to reflink. */
549df5778eSTristan Ye struct reflink_arguments {
559df5778eSTristan Ye 	__u64 old_path;
569df5778eSTristan Ye 	__u64 new_path;
579df5778eSTristan Ye 	__u64 preserve;
589df5778eSTristan Ye };
599df5778eSTristan Ye #define OCFS2_IOC_REFLINK	_IOW('o', 4, struct reflink_arguments)
609df5778eSTristan Ye 
61ddee5cdbSTristan Ye /* Following definitions dedicated for ocfs2_info_request ioctls. */
62ddee5cdbSTristan Ye #define OCFS2_INFO_MAX_REQUEST		(50)
63ddee5cdbSTristan Ye #define OCFS2_TEXT_UUID_LEN		(OCFS2_VOL_UUID_LEN * 2)
64ddee5cdbSTristan Ye 
65ddee5cdbSTristan Ye /* Magic number of all requests */
66ddee5cdbSTristan Ye #define OCFS2_INFO_MAGIC		(0x4F32494E)
67ddee5cdbSTristan Ye 
68ddee5cdbSTristan Ye /*
69ddee5cdbSTristan Ye  * Always try to separate info request into small pieces to
70ddee5cdbSTristan Ye  * guarantee the backward&forward compatibility.
71ddee5cdbSTristan Ye  */
72ddee5cdbSTristan Ye struct ocfs2_info {
73ddee5cdbSTristan Ye 	__u64 oi_requests;	/* Array of __u64 pointers to requests */
74ddee5cdbSTristan Ye 	__u32 oi_count;		/* Number of requests in info_requests */
75ddee5cdbSTristan Ye 	__u32 oi_pad;
76ddee5cdbSTristan Ye };
77ddee5cdbSTristan Ye 
78ddee5cdbSTristan Ye struct ocfs2_info_request {
79ddee5cdbSTristan Ye /*00*/	__u32 ir_magic;	/* Magic number */
80ddee5cdbSTristan Ye 	__u32 ir_code;	/* Info request code */
81ddee5cdbSTristan Ye 	__u32 ir_size;	/* Size of request */
82ddee5cdbSTristan Ye 	__u32 ir_flags;	/* Request flags */
83ddee5cdbSTristan Ye /*10*/			/* Request specific fields */
84ddee5cdbSTristan Ye };
85ddee5cdbSTristan Ye 
86ddee5cdbSTristan Ye struct ocfs2_info_clustersize {
87ddee5cdbSTristan Ye 	struct ocfs2_info_request ic_req;
88ddee5cdbSTristan Ye 	__u32 ic_clustersize;
89ddee5cdbSTristan Ye 	__u32 ic_pad;
90ddee5cdbSTristan Ye };
91ddee5cdbSTristan Ye 
92ddee5cdbSTristan Ye struct ocfs2_info_blocksize {
93ddee5cdbSTristan Ye 	struct ocfs2_info_request ib_req;
94ddee5cdbSTristan Ye 	__u32 ib_blocksize;
95ddee5cdbSTristan Ye 	__u32 ib_pad;
96ddee5cdbSTristan Ye };
97ddee5cdbSTristan Ye 
98ddee5cdbSTristan Ye struct ocfs2_info_maxslots {
99ddee5cdbSTristan Ye 	struct ocfs2_info_request im_req;
100ddee5cdbSTristan Ye 	__u32 im_max_slots;
101ddee5cdbSTristan Ye 	__u32 im_pad;
102ddee5cdbSTristan Ye };
103ddee5cdbSTristan Ye 
104ddee5cdbSTristan Ye struct ocfs2_info_label {
105ddee5cdbSTristan Ye 	struct ocfs2_info_request il_req;
106ddee5cdbSTristan Ye 	__u8	il_label[OCFS2_MAX_VOL_LABEL_LEN];
107ddee5cdbSTristan Ye } __attribute__ ((packed));
108ddee5cdbSTristan Ye 
109ddee5cdbSTristan Ye struct ocfs2_info_uuid {
110ddee5cdbSTristan Ye 	struct ocfs2_info_request iu_req;
111ddee5cdbSTristan Ye 	__u8	iu_uuid_str[OCFS2_TEXT_UUID_LEN + 1];
112ddee5cdbSTristan Ye } __attribute__ ((packed));
113ddee5cdbSTristan Ye 
114ddee5cdbSTristan Ye struct ocfs2_info_fs_features {
115ddee5cdbSTristan Ye 	struct ocfs2_info_request if_req;
116ddee5cdbSTristan Ye 	__u32 if_compat_features;
117ddee5cdbSTristan Ye 	__u32 if_incompat_features;
118ddee5cdbSTristan Ye 	__u32 if_ro_compat_features;
119ddee5cdbSTristan Ye 	__u32 if_pad;
120ddee5cdbSTristan Ye };
121ddee5cdbSTristan Ye 
122ddee5cdbSTristan Ye struct ocfs2_info_journal_size {
123ddee5cdbSTristan Ye 	struct ocfs2_info_request ij_req;
124ddee5cdbSTristan Ye 	__u64 ij_journal_size;
125ddee5cdbSTristan Ye };
126ddee5cdbSTristan Ye 
1273e5db17dSTristan Ye struct ocfs2_info_freeinode {
1283e5db17dSTristan Ye 	struct ocfs2_info_request ifi_req;
1293e5db17dSTristan Ye 	struct ocfs2_info_local_freeinode {
1303e5db17dSTristan Ye 		__u64 lfi_total;
1313e5db17dSTristan Ye 		__u64 lfi_free;
1323e5db17dSTristan Ye 	} ifi_stat[OCFS2_MAX_SLOTS];
1333e5db17dSTristan Ye 	__u32 ifi_slotnum; /* out */
1343e5db17dSTristan Ye 	__u32 ifi_pad;
1353e5db17dSTristan Ye };
1363e5db17dSTristan Ye 
137d24a10b9STristan Ye #define OCFS2_INFO_MAX_HIST     (32)
138d24a10b9STristan Ye 
139d24a10b9STristan Ye struct ocfs2_info_freefrag {
140d24a10b9STristan Ye 	struct ocfs2_info_request iff_req;
141d24a10b9STristan Ye 	struct ocfs2_info_freefrag_stats { /* (out) */
142d24a10b9STristan Ye 		struct ocfs2_info_free_chunk_list {
143d24a10b9STristan Ye 			__u32 fc_chunks[OCFS2_INFO_MAX_HIST];
144d24a10b9STristan Ye 			__u32 fc_clusters[OCFS2_INFO_MAX_HIST];
145d24a10b9STristan Ye 		} ffs_fc_hist;
146d24a10b9STristan Ye 		__u32 ffs_clusters;
147d24a10b9STristan Ye 		__u32 ffs_free_clusters;
148d24a10b9STristan Ye 		__u32 ffs_free_chunks;
149d24a10b9STristan Ye 		__u32 ffs_free_chunks_real;
150d24a10b9STristan Ye 		__u32 ffs_min; /* Minimum free chunksize in clusters */
151d24a10b9STristan Ye 		__u32 ffs_max;
152d24a10b9STristan Ye 		__u32 ffs_avg;
153d24a10b9STristan Ye 		__u32 ffs_pad;
154d24a10b9STristan Ye 	} iff_ffs;
155d24a10b9STristan Ye 	__u32 iff_chunksize; /* chunksize in clusters(in) */
156d24a10b9STristan Ye 	__u32 iff_pad;
157d24a10b9STristan Ye };
158d24a10b9STristan Ye 
159ddee5cdbSTristan Ye /* Codes for ocfs2_info_request */
160ddee5cdbSTristan Ye enum ocfs2_info_type {
161ddee5cdbSTristan Ye 	OCFS2_INFO_CLUSTERSIZE = 1,
162ddee5cdbSTristan Ye 	OCFS2_INFO_BLOCKSIZE,
163ddee5cdbSTristan Ye 	OCFS2_INFO_MAXSLOTS,
164ddee5cdbSTristan Ye 	OCFS2_INFO_LABEL,
165ddee5cdbSTristan Ye 	OCFS2_INFO_UUID,
166ddee5cdbSTristan Ye 	OCFS2_INFO_FS_FEATURES,
167ddee5cdbSTristan Ye 	OCFS2_INFO_JOURNAL_SIZE,
1683e5db17dSTristan Ye 	OCFS2_INFO_FREEINODE,
169d24a10b9STristan Ye 	OCFS2_INFO_FREEFRAG,
170ddee5cdbSTristan Ye 	OCFS2_INFO_NUM_TYPES
171ddee5cdbSTristan Ye };
172ddee5cdbSTristan Ye 
173ddee5cdbSTristan Ye /* Flags for struct ocfs2_info_request */
174ddee5cdbSTristan Ye /* Filled by the caller */
175ddee5cdbSTristan Ye #define OCFS2_INFO_FL_NON_COHERENT	(0x00000001)	/* Cluster coherency not
176ddee5cdbSTristan Ye 							   required. This is a hint.
177ddee5cdbSTristan Ye 							   It is up to ocfs2 whether
178ddee5cdbSTristan Ye 							   the request can be fulfilled
179ddee5cdbSTristan Ye 							   without locking. */
180ddee5cdbSTristan Ye /* Filled by ocfs2 */
181ddee5cdbSTristan Ye #define OCFS2_INFO_FL_FILLED		(0x40000000)	/* Filesystem understood
182ddee5cdbSTristan Ye 							   this request and
183ddee5cdbSTristan Ye 							   filled in the answer */
184ddee5cdbSTristan Ye 
185ddee5cdbSTristan Ye #define OCFS2_INFO_FL_ERROR		(0x80000000)	/* Error happened during
186ddee5cdbSTristan Ye 							   request handling. */
187ddee5cdbSTristan Ye 
188ddee5cdbSTristan Ye #define OCFS2_IOC_INFO		_IOR('o', 5, struct ocfs2_info)
189ddee5cdbSTristan Ye 
190220ebc43STristan Ye struct ocfs2_move_extents {
191220ebc43STristan Ye /* All values are in bytes */
192220ebc43STristan Ye 	/* in */
193220ebc43STristan Ye 	__u64 me_start;		/* Virtual start in the file to move */
194220ebc43STristan Ye 	__u64 me_len;		/* Length of the extents to be moved */
195220ebc43STristan Ye 	__u64 me_goal;		/* Physical offset of the goal,
196220ebc43STristan Ye 				   it's in block unit */
197220ebc43STristan Ye 	__u64 me_threshold;	/* Maximum distance from goal or threshold
198220ebc43STristan Ye 				   for auto defragmentation */
199220ebc43STristan Ye 	__u64 me_flags;		/* Flags for the operation:
200220ebc43STristan Ye 				 * - auto defragmentation.
201220ebc43STristan Ye 				 * - refcount,xattr cases.
202220ebc43STristan Ye 				 */
203220ebc43STristan Ye 	/* out */
204220ebc43STristan Ye 	__u64 me_moved_len;	/* Moved/defraged length */
205220ebc43STristan Ye 	__u64 me_new_offset;	/* Resulting physical location */
206220ebc43STristan Ye 	__u32 me_reserved[2];	/* Reserved for futhure */
207220ebc43STristan Ye };
208220ebc43STristan Ye 
209220ebc43STristan Ye #define OCFS2_MOVE_EXT_FL_AUTO_DEFRAG	(0x00000001)	/* Kernel manages to
210220ebc43STristan Ye 							   claim new clusters
211220ebc43STristan Ye 							   as the goal place
212220ebc43STristan Ye 							   for extents moving */
213220ebc43STristan Ye #define OCFS2_MOVE_EXT_FL_PART_DEFRAG	(0x00000002)	/* Allow partial extent
214220ebc43STristan Ye 							   moving, is to make
215220ebc43STristan Ye 							   movement less likely
216220ebc43STristan Ye 							   to fail, may make fs
217220ebc43STristan Ye 							   even more fragmented */
218220ebc43STristan Ye #define OCFS2_MOVE_EXT_FL_COMPLETE	(0x00000004)	/* Move or defragmenation
219220ebc43STristan Ye 							   completely gets done.
220220ebc43STristan Ye 							 */
221220ebc43STristan Ye 
222220ebc43STristan Ye #define OCFS2_IOC_MOVE_EXT	_IOW('o', 6, struct ocfs2_move_extents)
223220ebc43STristan Ye 
2249df5778eSTristan Ye #endif /* OCFS2_IOCTL_H */
225