294 lines · c
1/* SPDX-License-Identifier: LGPL-2.1+ WITH Linux-syscall-note */2/*3 * nilfs2_api.h - NILFS2 user space API4 *5 * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.6 *7 * This program is free software; you can redistribute it and/or modify8 * it under the terms of the GNU Lesser General Public License as published9 * by the Free Software Foundation; either version 2.1 of the License, or10 * (at your option) any later version.11 */12 13#ifndef _LINUX_NILFS2_API_H14#define _LINUX_NILFS2_API_H15 16#include <linux/types.h>17#include <linux/ioctl.h>18 19/**20 * struct nilfs_cpinfo - checkpoint information21 * @ci_flags: flags22 * @ci_pad: padding23 * @ci_cno: checkpoint number24 * @ci_create: creation timestamp25 * @ci_nblk_inc: number of blocks incremented by this checkpoint26 * @ci_inodes_count: inodes count27 * @ci_blocks_count: blocks count28 * @ci_next: next checkpoint number in snapshot list29 */30struct nilfs_cpinfo {31 __u32 ci_flags;32 __u32 ci_pad;33 __u64 ci_cno;34 __u64 ci_create;35 __u64 ci_nblk_inc;36 __u64 ci_inodes_count;37 __u64 ci_blocks_count;38 __u64 ci_next;39};40 41/* checkpoint flags */42enum {43 NILFS_CPINFO_SNAPSHOT,44 NILFS_CPINFO_INVALID,45 NILFS_CPINFO_SKETCH,46 NILFS_CPINFO_MINOR,47};48 49#define NILFS_CPINFO_FNS(flag, name) \50static inline int \51nilfs_cpinfo_##name(const struct nilfs_cpinfo *cpinfo) \52{ \53 return !!(cpinfo->ci_flags & (1UL << NILFS_CPINFO_##flag)); \54}55 56NILFS_CPINFO_FNS(SNAPSHOT, snapshot)57NILFS_CPINFO_FNS(INVALID, invalid)58NILFS_CPINFO_FNS(MINOR, minor)59 60/**61 * nilfs_suinfo - segment usage information62 * @sui_lastmod: timestamp of last modification63 * @sui_nblocks: number of written blocks in segment64 * @sui_flags: segment usage flags65 */66struct nilfs_suinfo {67 __u64 sui_lastmod;68 __u32 sui_nblocks;69 __u32 sui_flags;70};71 72/* segment usage flags */73enum {74 NILFS_SUINFO_ACTIVE,75 NILFS_SUINFO_DIRTY,76 NILFS_SUINFO_ERROR,77};78 79#define NILFS_SUINFO_FNS(flag, name) \80static inline int \81nilfs_suinfo_##name(const struct nilfs_suinfo *si) \82{ \83 return si->sui_flags & (1UL << NILFS_SUINFO_##flag); \84}85 86NILFS_SUINFO_FNS(ACTIVE, active)87NILFS_SUINFO_FNS(DIRTY, dirty)88NILFS_SUINFO_FNS(ERROR, error)89 90static inline int nilfs_suinfo_clean(const struct nilfs_suinfo *si)91{92 return !si->sui_flags;93}94 95/**96 * nilfs_suinfo_update - segment usage information update97 * @sup_segnum: segment number98 * @sup_flags: flags for which fields are active in sup_sui99 * @sup_reserved: reserved necessary for alignment100 * @sup_sui: segment usage information101 */102struct nilfs_suinfo_update {103 __u64 sup_segnum;104 __u32 sup_flags;105 __u32 sup_reserved;106 struct nilfs_suinfo sup_sui;107};108 109enum {110 NILFS_SUINFO_UPDATE_LASTMOD,111 NILFS_SUINFO_UPDATE_NBLOCKS,112 NILFS_SUINFO_UPDATE_FLAGS,113 __NR_NILFS_SUINFO_UPDATE_FIELDS,114};115 116#define NILFS_SUINFO_UPDATE_FNS(flag, name) \117static inline void \118nilfs_suinfo_update_set_##name(struct nilfs_suinfo_update *sup) \119{ \120 sup->sup_flags |= 1UL << NILFS_SUINFO_UPDATE_##flag; \121} \122static inline void \123nilfs_suinfo_update_clear_##name(struct nilfs_suinfo_update *sup) \124{ \125 sup->sup_flags &= ~(1UL << NILFS_SUINFO_UPDATE_##flag); \126} \127static inline int \128nilfs_suinfo_update_##name(const struct nilfs_suinfo_update *sup) \129{ \130 return !!(sup->sup_flags & (1UL << NILFS_SUINFO_UPDATE_##flag));\131}132 133NILFS_SUINFO_UPDATE_FNS(LASTMOD, lastmod)134NILFS_SUINFO_UPDATE_FNS(NBLOCKS, nblocks)135NILFS_SUINFO_UPDATE_FNS(FLAGS, flags)136 137enum {138 NILFS_CHECKPOINT,139 NILFS_SNAPSHOT,140};141 142/**143 * struct nilfs_cpmode - change checkpoint mode structure144 * @cm_cno: checkpoint number145 * @cm_mode: mode of checkpoint146 * @cm_pad: padding147 */148struct nilfs_cpmode {149 __u64 cm_cno;150 __u32 cm_mode;151 __u32 cm_pad;152};153 154/**155 * struct nilfs_argv - argument vector156 * @v_base: pointer on data array from userspace157 * @v_nmembs: number of members in data array158 * @v_size: size of data array in bytes159 * @v_flags: flags160 * @v_index: start number of target data items161 */162struct nilfs_argv {163 __u64 v_base;164 __u32 v_nmembs; /* number of members */165 __u16 v_size; /* size of members */166 __u16 v_flags;167 __u64 v_index;168};169 170/**171 * struct nilfs_period - period of checkpoint numbers172 * @p_start: start checkpoint number (inclusive)173 * @p_end: end checkpoint number (exclusive)174 */175struct nilfs_period {176 __u64 p_start;177 __u64 p_end;178};179 180/**181 * struct nilfs_cpstat - checkpoint statistics182 * @cs_cno: checkpoint number183 * @cs_ncps: number of checkpoints184 * @cs_nsss: number of snapshots185 */186struct nilfs_cpstat {187 __u64 cs_cno;188 __u64 cs_ncps;189 __u64 cs_nsss;190};191 192/**193 * struct nilfs_sustat - segment usage statistics194 * @ss_nsegs: number of segments195 * @ss_ncleansegs: number of clean segments196 * @ss_ndirtysegs: number of dirty segments197 * @ss_ctime: creation time of the last segment198 * @ss_nongc_ctime: creation time of the last segment not for GC199 * @ss_prot_seq: least sequence number of segments which must not be reclaimed200 */201struct nilfs_sustat {202 __u64 ss_nsegs;203 __u64 ss_ncleansegs;204 __u64 ss_ndirtysegs;205 __u64 ss_ctime;206 __u64 ss_nongc_ctime;207 __u64 ss_prot_seq;208};209 210/**211 * struct nilfs_vinfo - virtual block number information212 * @vi_vblocknr: virtual block number213 * @vi_start: start checkpoint number (inclusive)214 * @vi_end: end checkpoint number (exclusive)215 * @vi_blocknr: disk block number216 */217struct nilfs_vinfo {218 __u64 vi_vblocknr;219 __u64 vi_start;220 __u64 vi_end;221 __u64 vi_blocknr;222};223 224/**225 * struct nilfs_vdesc - descriptor of virtual block number226 * @vd_ino: inode number227 * @vd_cno: checkpoint number228 * @vd_vblocknr: virtual block number229 * @vd_period: period of checkpoint numbers230 * @vd_blocknr: disk block number231 * @vd_offset: logical block offset inside a file232 * @vd_flags: flags (data or node block)233 * @vd_pad: padding234 */235struct nilfs_vdesc {236 __u64 vd_ino;237 __u64 vd_cno;238 __u64 vd_vblocknr;239 struct nilfs_period vd_period;240 __u64 vd_blocknr;241 __u64 vd_offset;242 __u32 vd_flags;243 __u32 vd_pad;244};245 246/**247 * struct nilfs_bdesc - descriptor of disk block number248 * @bd_ino: inode number249 * @bd_oblocknr: disk block address (for skipping dead blocks)250 * @bd_blocknr: disk block address251 * @bd_offset: logical block offset inside a file252 * @bd_level: level in the b-tree organization253 * @bd_pad: padding254 */255struct nilfs_bdesc {256 __u64 bd_ino;257 __u64 bd_oblocknr;258 __u64 bd_blocknr;259 __u64 bd_offset;260 __u32 bd_level;261 __u32 bd_pad;262};263 264#define NILFS_IOCTL_IDENT 'n'265 266#define NILFS_IOCTL_CHANGE_CPMODE \267 _IOW(NILFS_IOCTL_IDENT, 0x80, struct nilfs_cpmode)268#define NILFS_IOCTL_DELETE_CHECKPOINT \269 _IOW(NILFS_IOCTL_IDENT, 0x81, __u64)270#define NILFS_IOCTL_GET_CPINFO \271 _IOR(NILFS_IOCTL_IDENT, 0x82, struct nilfs_argv)272#define NILFS_IOCTL_GET_CPSTAT \273 _IOR(NILFS_IOCTL_IDENT, 0x83, struct nilfs_cpstat)274#define NILFS_IOCTL_GET_SUINFO \275 _IOR(NILFS_IOCTL_IDENT, 0x84, struct nilfs_argv)276#define NILFS_IOCTL_GET_SUSTAT \277 _IOR(NILFS_IOCTL_IDENT, 0x85, struct nilfs_sustat)278#define NILFS_IOCTL_GET_VINFO \279 _IOWR(NILFS_IOCTL_IDENT, 0x86, struct nilfs_argv)280#define NILFS_IOCTL_GET_BDESCS \281 _IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv)282#define NILFS_IOCTL_CLEAN_SEGMENTS \283 _IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv[5])284#define NILFS_IOCTL_SYNC \285 _IOR(NILFS_IOCTL_IDENT, 0x8A, __u64)286#define NILFS_IOCTL_RESIZE \287 _IOW(NILFS_IOCTL_IDENT, 0x8B, __u64)288#define NILFS_IOCTL_SET_ALLOC_RANGE \289 _IOW(NILFS_IOCTL_IDENT, 0x8C, __u64[2])290#define NILFS_IOCTL_SET_SUINFO \291 _IOW(NILFS_IOCTL_IDENT, 0x8D, struct nilfs_argv)292 293#endif /* _LINUX_NILFS2_API_H */294