Merge tag 'powerpc-5.13-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[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  * Space reservation / allocation / free ioctls and argument structure
17  * are designed to be compatible with XFS.
18  *
19  * ALLOCSP* and FREESP* are not and will never be supported, but are
20  * included here for completeness.
21  */
22 struct ocfs2_space_resv {
23         __s16           l_type;
24         __s16           l_whence;
25         __s64           l_start;
26         __s64           l_len;          /* len == 0 means until end of file */
27         __s32           l_sysid;
28         __u32           l_pid;
29         __s32           l_pad[4];       /* reserve area                     */
30 };
31
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)
40
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 */
47         __u16 reserved1;
48         __u32 reserved2;
49 };
50
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)
54
55 /* Used to pass 2 file names to reflink. */
56 struct reflink_arguments {
57         __u64 old_path;
58         __u64 new_path;
59         __u64 preserve;
60 };
61 #define OCFS2_IOC_REFLINK       _IOW('o', 4, struct reflink_arguments)
62
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)
66
67 /* Magic number of all requests */
68 #define OCFS2_INFO_MAGIC                (0x4F32494E)
69
70 /*
71  * Always try to separate info request into small pieces to
72  * guarantee the backward&forward compatibility.
73  */
74 struct ocfs2_info {
75         __u64 oi_requests;      /* Array of __u64 pointers to requests */
76         __u32 oi_count;         /* Number of requests in info_requests */
77         __u32 oi_pad;
78 };
79
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 */
86 };
87
88 struct ocfs2_info_clustersize {
89         struct ocfs2_info_request ic_req;
90         __u32 ic_clustersize;
91         __u32 ic_pad;
92 };
93
94 struct ocfs2_info_blocksize {
95         struct ocfs2_info_request ib_req;
96         __u32 ib_blocksize;
97         __u32 ib_pad;
98 };
99
100 struct ocfs2_info_maxslots {
101         struct ocfs2_info_request im_req;
102         __u32 im_max_slots;
103         __u32 im_pad;
104 };
105
106 struct ocfs2_info_label {
107         struct ocfs2_info_request il_req;
108         __u8    il_label[OCFS2_MAX_VOL_LABEL_LEN];
109 } __attribute__ ((packed));
110
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));
115
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;
121         __u32 if_pad;
122 };
123
124 struct ocfs2_info_journal_size {
125         struct ocfs2_info_request ij_req;
126         __u64 ij_journal_size;
127 };
128
129 struct ocfs2_info_freeinode {
130         struct ocfs2_info_request ifi_req;
131         struct ocfs2_info_local_freeinode {
132                 __u64 lfi_total;
133                 __u64 lfi_free;
134         } ifi_stat[OCFS2_MAX_SLOTS];
135         __u32 ifi_slotnum; /* out */
136         __u32 ifi_pad;
137 };
138
139 #define OCFS2_INFO_MAX_HIST     (32)
140
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];
147                 } ffs_fc_hist;
148                 __u32 ffs_clusters;
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 */
153                 __u32 ffs_max;
154                 __u32 ffs_avg;
155                 __u32 ffs_pad;
156         } iff_ffs;
157         __u32 iff_chunksize; /* chunksize in clusters(in) */
158         __u32 iff_pad;
159 };
160
161 /* Codes for ocfs2_info_request */
162 enum ocfs2_info_type {
163         OCFS2_INFO_CLUSTERSIZE = 1,
164         OCFS2_INFO_BLOCKSIZE,
165         OCFS2_INFO_MAXSLOTS,
166         OCFS2_INFO_LABEL,
167         OCFS2_INFO_UUID,
168         OCFS2_INFO_FS_FEATURES,
169         OCFS2_INFO_JOURNAL_SIZE,
170         OCFS2_INFO_FREEINODE,
171         OCFS2_INFO_FREEFRAG,
172         OCFS2_INFO_NUM_TYPES
173 };
174
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
181                                                            without locking. */
182 /* Filled by ocfs2 */
183 #define OCFS2_INFO_FL_FILLED            (0x40000000)    /* Filesystem understood
184                                                            this request and
185                                                            filled in the answer */
186
187 #define OCFS2_INFO_FL_ERROR             (0x80000000)    /* Error happened during
188                                                            request handling. */
189
190 #define OCFS2_IOC_INFO          _IOR('o', 5, struct ocfs2_info)
191
192 struct ocfs2_move_extents {
193 /* All values are in bytes */
194         /* in */
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.
204                                  */
205         /* out */
206         __u64 me_moved_len;     /* Moved/defraged length */
207         __u64 me_new_offset;    /* Resulting physical location */
208         __u32 me_reserved[2];   /* Reserved for futhure */
209 };
210
211 #define OCFS2_MOVE_EXT_FL_AUTO_DEFRAG   (0x00000001)    /* Kernel manages to
212                                                            claim new clusters
213                                                            as the goal place
214                                                            for extents moving */
215 #define OCFS2_MOVE_EXT_FL_PART_DEFRAG   (0x00000002)    /* Allow partial extent
216                                                            moving, is to make
217                                                            movement less likely
218                                                            to fail, may make fs
219                                                            even more fragmented */
220 #define OCFS2_MOVE_EXT_FL_COMPLETE      (0x00000004)    /* Move or defragmenation
221                                                            completely gets done.
222                                                          */
223
224 #define OCFS2_IOC_MOVE_EXT      _IOW('o', 6, struct ocfs2_move_extents)
225
226 #endif /* OCFS2_IOCTL_H */