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