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