xref: /OK3568_Linux_fs/kernel/fs/ocfs2/ocfs2_ioctl.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /* -*- mode: c; c-basic-offset: 8; -*-
3*4882a593Smuzhiyun  * vim: noexpandtab sw=8 ts=8 sts=0:
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * ocfs2_ioctl.h
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Defines OCFS2 ioctls.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * Copyright (C) 2010 Oracle.  All rights reserved.
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifndef OCFS2_IOCTL_H
13*4882a593Smuzhiyun #define OCFS2_IOCTL_H
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun /*
16*4882a593Smuzhiyun  * ioctl commands
17*4882a593Smuzhiyun  */
18*4882a593Smuzhiyun #define OCFS2_IOC_GETFLAGS	FS_IOC_GETFLAGS
19*4882a593Smuzhiyun #define OCFS2_IOC_SETFLAGS	FS_IOC_SETFLAGS
20*4882a593Smuzhiyun #define OCFS2_IOC32_GETFLAGS	FS_IOC32_GETFLAGS
21*4882a593Smuzhiyun #define OCFS2_IOC32_SETFLAGS	FS_IOC32_SETFLAGS
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /*
24*4882a593Smuzhiyun  * Space reservation / allocation / free ioctls and argument structure
25*4882a593Smuzhiyun  * are designed to be compatible with XFS.
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  * ALLOCSP* and FREESP* are not and will never be supported, but are
28*4882a593Smuzhiyun  * included here for completeness.
29*4882a593Smuzhiyun  */
30*4882a593Smuzhiyun struct ocfs2_space_resv {
31*4882a593Smuzhiyun 	__s16		l_type;
32*4882a593Smuzhiyun 	__s16		l_whence;
33*4882a593Smuzhiyun 	__s64		l_start;
34*4882a593Smuzhiyun 	__s64		l_len;		/* len == 0 means until end of file */
35*4882a593Smuzhiyun 	__s32		l_sysid;
36*4882a593Smuzhiyun 	__u32		l_pid;
37*4882a593Smuzhiyun 	__s32		l_pad[4];	/* reserve area			    */
38*4882a593Smuzhiyun };
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define OCFS2_IOC_ALLOCSP		_IOW ('X', 10, struct ocfs2_space_resv)
41*4882a593Smuzhiyun #define OCFS2_IOC_FREESP		_IOW ('X', 11, struct ocfs2_space_resv)
42*4882a593Smuzhiyun #define OCFS2_IOC_RESVSP		_IOW ('X', 40, struct ocfs2_space_resv)
43*4882a593Smuzhiyun #define OCFS2_IOC_UNRESVSP	_IOW ('X', 41, struct ocfs2_space_resv)
44*4882a593Smuzhiyun #define OCFS2_IOC_ALLOCSP64	_IOW ('X', 36, struct ocfs2_space_resv)
45*4882a593Smuzhiyun #define OCFS2_IOC_FREESP64	_IOW ('X', 37, struct ocfs2_space_resv)
46*4882a593Smuzhiyun #define OCFS2_IOC_RESVSP64	_IOW ('X', 42, struct ocfs2_space_resv)
47*4882a593Smuzhiyun #define OCFS2_IOC_UNRESVSP64	_IOW ('X', 43, struct ocfs2_space_resv)
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /* Used to pass group descriptor data when online resize is done */
50*4882a593Smuzhiyun struct ocfs2_new_group_input {
51*4882a593Smuzhiyun 	__u64 group;		/* Group descriptor's blkno. */
52*4882a593Smuzhiyun 	__u32 clusters;		/* Total number of clusters in this group */
53*4882a593Smuzhiyun 	__u32 frees;		/* Total free clusters in this group */
54*4882a593Smuzhiyun 	__u16 chain;		/* Chain for this group */
55*4882a593Smuzhiyun 	__u16 reserved1;
56*4882a593Smuzhiyun 	__u32 reserved2;
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #define OCFS2_IOC_GROUP_EXTEND	_IOW('o', 1, int)
60*4882a593Smuzhiyun #define OCFS2_IOC_GROUP_ADD	_IOW('o', 2,struct ocfs2_new_group_input)
61*4882a593Smuzhiyun #define OCFS2_IOC_GROUP_ADD64	_IOW('o', 3,struct ocfs2_new_group_input)
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /* Used to pass 2 file names to reflink. */
64*4882a593Smuzhiyun struct reflink_arguments {
65*4882a593Smuzhiyun 	__u64 old_path;
66*4882a593Smuzhiyun 	__u64 new_path;
67*4882a593Smuzhiyun 	__u64 preserve;
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun #define OCFS2_IOC_REFLINK	_IOW('o', 4, struct reflink_arguments)
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /* Following definitions dedicated for ocfs2_info_request ioctls. */
72*4882a593Smuzhiyun #define OCFS2_INFO_MAX_REQUEST		(50)
73*4882a593Smuzhiyun #define OCFS2_TEXT_UUID_LEN		(OCFS2_VOL_UUID_LEN * 2)
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /* Magic number of all requests */
76*4882a593Smuzhiyun #define OCFS2_INFO_MAGIC		(0x4F32494E)
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun /*
79*4882a593Smuzhiyun  * Always try to separate info request into small pieces to
80*4882a593Smuzhiyun  * guarantee the backward&forward compatibility.
81*4882a593Smuzhiyun  */
82*4882a593Smuzhiyun struct ocfs2_info {
83*4882a593Smuzhiyun 	__u64 oi_requests;	/* Array of __u64 pointers to requests */
84*4882a593Smuzhiyun 	__u32 oi_count;		/* Number of requests in info_requests */
85*4882a593Smuzhiyun 	__u32 oi_pad;
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun struct ocfs2_info_request {
89*4882a593Smuzhiyun /*00*/	__u32 ir_magic;	/* Magic number */
90*4882a593Smuzhiyun 	__u32 ir_code;	/* Info request code */
91*4882a593Smuzhiyun 	__u32 ir_size;	/* Size of request */
92*4882a593Smuzhiyun 	__u32 ir_flags;	/* Request flags */
93*4882a593Smuzhiyun /*10*/			/* Request specific fields */
94*4882a593Smuzhiyun };
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun struct ocfs2_info_clustersize {
97*4882a593Smuzhiyun 	struct ocfs2_info_request ic_req;
98*4882a593Smuzhiyun 	__u32 ic_clustersize;
99*4882a593Smuzhiyun 	__u32 ic_pad;
100*4882a593Smuzhiyun };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun struct ocfs2_info_blocksize {
103*4882a593Smuzhiyun 	struct ocfs2_info_request ib_req;
104*4882a593Smuzhiyun 	__u32 ib_blocksize;
105*4882a593Smuzhiyun 	__u32 ib_pad;
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun struct ocfs2_info_maxslots {
109*4882a593Smuzhiyun 	struct ocfs2_info_request im_req;
110*4882a593Smuzhiyun 	__u32 im_max_slots;
111*4882a593Smuzhiyun 	__u32 im_pad;
112*4882a593Smuzhiyun };
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun struct ocfs2_info_label {
115*4882a593Smuzhiyun 	struct ocfs2_info_request il_req;
116*4882a593Smuzhiyun 	__u8	il_label[OCFS2_MAX_VOL_LABEL_LEN];
117*4882a593Smuzhiyun } __attribute__ ((packed));
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun struct ocfs2_info_uuid {
120*4882a593Smuzhiyun 	struct ocfs2_info_request iu_req;
121*4882a593Smuzhiyun 	__u8	iu_uuid_str[OCFS2_TEXT_UUID_LEN + 1];
122*4882a593Smuzhiyun } __attribute__ ((packed));
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun struct ocfs2_info_fs_features {
125*4882a593Smuzhiyun 	struct ocfs2_info_request if_req;
126*4882a593Smuzhiyun 	__u32 if_compat_features;
127*4882a593Smuzhiyun 	__u32 if_incompat_features;
128*4882a593Smuzhiyun 	__u32 if_ro_compat_features;
129*4882a593Smuzhiyun 	__u32 if_pad;
130*4882a593Smuzhiyun };
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun struct ocfs2_info_journal_size {
133*4882a593Smuzhiyun 	struct ocfs2_info_request ij_req;
134*4882a593Smuzhiyun 	__u64 ij_journal_size;
135*4882a593Smuzhiyun };
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun struct ocfs2_info_freeinode {
138*4882a593Smuzhiyun 	struct ocfs2_info_request ifi_req;
139*4882a593Smuzhiyun 	struct ocfs2_info_local_freeinode {
140*4882a593Smuzhiyun 		__u64 lfi_total;
141*4882a593Smuzhiyun 		__u64 lfi_free;
142*4882a593Smuzhiyun 	} ifi_stat[OCFS2_MAX_SLOTS];
143*4882a593Smuzhiyun 	__u32 ifi_slotnum; /* out */
144*4882a593Smuzhiyun 	__u32 ifi_pad;
145*4882a593Smuzhiyun };
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun #define OCFS2_INFO_MAX_HIST     (32)
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun struct ocfs2_info_freefrag {
150*4882a593Smuzhiyun 	struct ocfs2_info_request iff_req;
151*4882a593Smuzhiyun 	struct ocfs2_info_freefrag_stats { /* (out) */
152*4882a593Smuzhiyun 		struct ocfs2_info_free_chunk_list {
153*4882a593Smuzhiyun 			__u32 fc_chunks[OCFS2_INFO_MAX_HIST];
154*4882a593Smuzhiyun 			__u32 fc_clusters[OCFS2_INFO_MAX_HIST];
155*4882a593Smuzhiyun 		} ffs_fc_hist;
156*4882a593Smuzhiyun 		__u32 ffs_clusters;
157*4882a593Smuzhiyun 		__u32 ffs_free_clusters;
158*4882a593Smuzhiyun 		__u32 ffs_free_chunks;
159*4882a593Smuzhiyun 		__u32 ffs_free_chunks_real;
160*4882a593Smuzhiyun 		__u32 ffs_min; /* Minimum free chunksize in clusters */
161*4882a593Smuzhiyun 		__u32 ffs_max;
162*4882a593Smuzhiyun 		__u32 ffs_avg;
163*4882a593Smuzhiyun 		__u32 ffs_pad;
164*4882a593Smuzhiyun 	} iff_ffs;
165*4882a593Smuzhiyun 	__u32 iff_chunksize; /* chunksize in clusters(in) */
166*4882a593Smuzhiyun 	__u32 iff_pad;
167*4882a593Smuzhiyun };
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun /* Codes for ocfs2_info_request */
170*4882a593Smuzhiyun enum ocfs2_info_type {
171*4882a593Smuzhiyun 	OCFS2_INFO_CLUSTERSIZE = 1,
172*4882a593Smuzhiyun 	OCFS2_INFO_BLOCKSIZE,
173*4882a593Smuzhiyun 	OCFS2_INFO_MAXSLOTS,
174*4882a593Smuzhiyun 	OCFS2_INFO_LABEL,
175*4882a593Smuzhiyun 	OCFS2_INFO_UUID,
176*4882a593Smuzhiyun 	OCFS2_INFO_FS_FEATURES,
177*4882a593Smuzhiyun 	OCFS2_INFO_JOURNAL_SIZE,
178*4882a593Smuzhiyun 	OCFS2_INFO_FREEINODE,
179*4882a593Smuzhiyun 	OCFS2_INFO_FREEFRAG,
180*4882a593Smuzhiyun 	OCFS2_INFO_NUM_TYPES
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun /* Flags for struct ocfs2_info_request */
184*4882a593Smuzhiyun /* Filled by the caller */
185*4882a593Smuzhiyun #define OCFS2_INFO_FL_NON_COHERENT	(0x00000001)	/* Cluster coherency not
186*4882a593Smuzhiyun 							   required. This is a hint.
187*4882a593Smuzhiyun 							   It is up to ocfs2 whether
188*4882a593Smuzhiyun 							   the request can be fulfilled
189*4882a593Smuzhiyun 							   without locking. */
190*4882a593Smuzhiyun /* Filled by ocfs2 */
191*4882a593Smuzhiyun #define OCFS2_INFO_FL_FILLED		(0x40000000)	/* Filesystem understood
192*4882a593Smuzhiyun 							   this request and
193*4882a593Smuzhiyun 							   filled in the answer */
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun #define OCFS2_INFO_FL_ERROR		(0x80000000)	/* Error happened during
196*4882a593Smuzhiyun 							   request handling. */
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun #define OCFS2_IOC_INFO		_IOR('o', 5, struct ocfs2_info)
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun struct ocfs2_move_extents {
201*4882a593Smuzhiyun /* All values are in bytes */
202*4882a593Smuzhiyun 	/* in */
203*4882a593Smuzhiyun 	__u64 me_start;		/* Virtual start in the file to move */
204*4882a593Smuzhiyun 	__u64 me_len;		/* Length of the extents to be moved */
205*4882a593Smuzhiyun 	__u64 me_goal;		/* Physical offset of the goal,
206*4882a593Smuzhiyun 				   it's in block unit */
207*4882a593Smuzhiyun 	__u64 me_threshold;	/* Maximum distance from goal or threshold
208*4882a593Smuzhiyun 				   for auto defragmentation */
209*4882a593Smuzhiyun 	__u64 me_flags;		/* Flags for the operation:
210*4882a593Smuzhiyun 				 * - auto defragmentation.
211*4882a593Smuzhiyun 				 * - refcount,xattr cases.
212*4882a593Smuzhiyun 				 */
213*4882a593Smuzhiyun 	/* out */
214*4882a593Smuzhiyun 	__u64 me_moved_len;	/* Moved/defraged length */
215*4882a593Smuzhiyun 	__u64 me_new_offset;	/* Resulting physical location */
216*4882a593Smuzhiyun 	__u32 me_reserved[2];	/* Reserved for futhure */
217*4882a593Smuzhiyun };
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun #define OCFS2_MOVE_EXT_FL_AUTO_DEFRAG	(0x00000001)	/* Kernel manages to
220*4882a593Smuzhiyun 							   claim new clusters
221*4882a593Smuzhiyun 							   as the goal place
222*4882a593Smuzhiyun 							   for extents moving */
223*4882a593Smuzhiyun #define OCFS2_MOVE_EXT_FL_PART_DEFRAG	(0x00000002)	/* Allow partial extent
224*4882a593Smuzhiyun 							   moving, is to make
225*4882a593Smuzhiyun 							   movement less likely
226*4882a593Smuzhiyun 							   to fail, may make fs
227*4882a593Smuzhiyun 							   even more fragmented */
228*4882a593Smuzhiyun #define OCFS2_MOVE_EXT_FL_COMPLETE	(0x00000004)	/* Move or defragmenation
229*4882a593Smuzhiyun 							   completely gets done.
230*4882a593Smuzhiyun 							 */
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun #define OCFS2_IOC_MOVE_EXT	_IOW('o', 6, struct ocfs2_move_extents)
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun #endif /* OCFS2_IOCTL_H */
235