Android-cuttlefish cvd tool
quotaio.h
Go to the documentation of this file.
1
18#ifndef GUARD_QUOTAIO_H
19#define GUARD_QUOTAIO_H
20
21#include <limits.h>
22#include <sys/types.h>
23#include <sys/stat.h>
24
25#include "dict.h"
26#include "f2fs_fs.h"
27#include "f2fs.h"
28#include "node.h"
29#include "fsck.h"
30
31#include "dqblk_v2.h"
32
33typedef int64_t qsize_t; /* Type in which we store size limitations */
34typedef int32_t f2fs_ino_t;
35typedef int errcode_t;
36
42};
43
44#if MAXQUOTAS > 32
45#error "cannot have more than 32 quota types to fit in qtype_bits"
46#endif
47
53};
54
55extern int cur_qtype;
56extern u32 qf_last_blkofs[];
57extern enum qf_szchk_type_t qf_szchk_type[];
58extern u64 qf_maxsize[];
59
60#define QUOTA_USR_BIT (1 << USRQUOTA)
61#define QUOTA_GRP_BIT (1 << GRPQUOTA)
62#define QUOTA_PRJ_BIT (1 << PRJQUOTA)
63#define QUOTA_ALL_BIT (QUOTA_USR_BIT | QUOTA_GRP_BIT | QUOTA_PRJ_BIT)
64
65typedef struct quota_ctx *quota_ctx_t;
66
67struct quota_ctx {
72};
73
74/*
75 * Definitions of magics and versions of current quota files
76 */
77#define INITQMAGICS {\
78 0xd9c01f11, /* USRQUOTA */\
79 0xd9c01927, /* GRPQUOTA */\
80 0xd9c03f14 /* PRJQUOTA */\
81}
82
83/* Size of blocks in which are counted size limits in generic utility parts */
84#define QUOTABLOCK_BITS 10
85#define QUOTABLOCK_SIZE (1 << QUOTABLOCK_BITS)
86#define toqb(x) (((x) + QUOTABLOCK_SIZE - 1) >> QUOTABLOCK_BITS)
87
88/* Quota format type IDs */
89#define QFMT_VFS_OLD 1
90#define QFMT_VFS_V0 2
91#define QFMT_VFS_V1 4
92
93/*
94 * The following constants define the default amount of time given a user
95 * before the soft limits are treated as hard limits (usually resulting
96 * in an allocation failure). The timer is started when the user crosses
97 * their soft limit, it is reset when they go below their soft limit.
98 */
99#define MAX_IQ_TIME 604800 /* (7*24*60*60) 1 week */
100#define MAX_DQ_TIME 604800 /* (7*24*60*60) 1 week */
101
102#define IOFL_INFODIRTY 0x01 /* Did info change? */
103
104struct quotafile_ops;
105
106/* Generic information about quotafile */
108 time_t dqi_bgrace; /* Block grace time for given quotafile */
109 time_t dqi_igrace; /* Inode grace time for given quotafile */
110 union {
112 } u; /* Format specific info about quotafile */
113};
114
118 int64_t filesize;
119};
120
121/* Structure for one opened quota file */
123 enum quota_type qh_type; /* Type of quotafile */
124 int qh_fmt; /* Quotafile format */
126 int qh_io_flags; /* IO flags for file */
128 unsigned int (*read)(struct quota_file *qf, long offset,
129 void *buf, unsigned int size);
130 unsigned int (*write)(struct quota_file *qf, long offset,
131 void *buf, unsigned int size);
132 struct quotafile_ops *qh_ops; /* Operations on quotafile */
133 struct util_dqinfo qh_info; /* Generic quotafile info */
134};
135
136/* Utility quota block */
144 time_t dqb_btime;
145 time_t dqb_itime;
146 union {
148 } u; /* Format specific dquot information */
149};
150
151/* Structure for one loaded quota */
152struct dquot {
153 struct dquot *dq_next; /* Pointer to next dquot in the list */
154 qid_t dq_id; /* ID dquot belongs to */
155 int dq_flags; /* Some flags for utils */
156 struct quota_handle *dq_h; /* Handle of quotafile for this dquot */
157 struct util_dqblk dq_dqb; /* Parsed data of dquot */
158};
159
160#define DQF_SEEN 0x0001
161
162/* Structure of quotafile operations */
164 /* Check whether quotafile is in our format */
165 int (*check_file) (struct quota_handle *h, int type);
166 /* Open quotafile */
167 int (*init_io) (struct quota_handle *h, enum quota_type qtype);
168 /* Create new quotafile */
169 int (*new_io) (struct quota_handle *h);
170 /* Write all changes and close quotafile */
171 int (*end_io) (struct quota_handle *h);
172 /* Write info about quotafile */
173 int (*write_info) (struct quota_handle *h);
174 /* Read dquot into memory */
175 struct dquot *(*read_dquot) (struct quota_handle *h, qid_t id);
176 /* Write given dquot to disk */
177 int (*commit_dquot) (struct dquot *dquot);
178 /* Scan quotafile and call callback on every structure */
179 int (*scan_dquots) (struct quota_handle *h,
180 int (*process_dquot) (struct dquot *dquot,
181 void *data),
182 void *data);
183 /* Function to print format specific file information */
184 int (*report) (struct quota_handle *h, int verbose);
185};
186
187#ifdef __CHECKER__
188# ifndef __bitwise
189# define __bitwise __attribute__((bitwise))
190# endif
191#define __force __attribute__((force))
192#else
193# ifndef __bitwise
194# define __bitwise
195# endif
196#define __force
197#endif
198
199/* Open existing quotafile of given type (and verify its format) on given
200 * filesystem. */
202 enum quota_type qtype, int flags);
203
204/* Create new quotafile of specified format on given filesystem */
206 enum quota_type qtype);
207
208/* Close quotafile */
210 int update_filesize);
211
212/* Get empty quota structure */
213struct dquot *get_empty_dquot(void);
214const char *quota_type2name(enum quota_type qtype);
215void update_grace_times(struct dquot *q);
216
217/* In mkquota.c */
219void quota_data_inodes(quota_ctx_t qctx, struct f2fs_inode *inode, int adjust);
220void quota_data_add(quota_ctx_t qctx, struct f2fs_inode *inode, qsize_t space);
221void quota_data_sub(quota_ctx_t qctx, struct f2fs_inode *inode, qsize_t space);
222errcode_t quota_write_inode(struct f2fs_sb_info *sbi, enum quota_type qtype);
224 struct f2fs_inode* inode);
227 enum quota_type qtype, int *usage_inconsistent,
228 int preserve_limits);
229
230static inline errcode_t quota_get_mem(unsigned long size, void *ptr)
231{
232 void *pp;
233
234 pp = malloc(size);
235 if (!pp)
236 return -1;
237 memcpy(ptr, &pp, sizeof (pp));
238 return 0;
239}
240
241static inline errcode_t quota_get_memzero(unsigned long size, void *ptr)
242{
243 void *pp;
244
245 pp = malloc(size);
246 if (!pp)
247 return -1;
248 memset(pp, 0, size);
249 memcpy(ptr, &pp, sizeof(pp));
250 return 0;
251}
252
253static inline errcode_t quota_free_mem(void *ptr)
254{
255 void *p;
256
257 memcpy(&p, ptr, sizeof(p));
258 free(p);
259 p = 0;
260 memcpy(ptr, &p, sizeof(p));
261 return 0;
262}
263
264#endif /* GUARD_QUOTAIO_H */
#define data
Definition: dict.c:56
unsigned int u32
Definition: ext4_utils.h:68
unsigned long long u64
Definition: ext4_utils.h:63
__le32 ino
Definition: f2fs_fs.h:1
uint32_t size
Definition: io.h:2
uint32_t id
Definition: file_sync_protocol.h:0
void * memcpy(void *dest, const void *src, size_t n)
Definition: mem_overrides.cpp:8
uint8_t type
Definition: pairing_connection.h:0
errcode_t quota_file_open(struct f2fs_sb_info *sbi, struct quota_handle *h, enum quota_type qtype, int flags)
Definition: quotaio.c:106
void quota_add_inode_usage(quota_ctx_t qctx, f2fs_ino_t ino, struct f2fs_inode *inode)
Definition: mkquota.c:291
int errcode_t
Definition: quotaio.h:35
errcode_t quota_init_context(struct f2fs_sb_info *sbi)
Definition: mkquota.c:146
static errcode_t quota_get_mem(unsigned long size, void *ptr)
Definition: quotaio.h:230
const char * quota_type2name(enum quota_type qtype)
Definition: quotaio.c:48
static errcode_t quota_free_mem(void *ptr)
Definition: quotaio.h:253
errcode_t quota_compare_and_update(struct f2fs_sb_info *sbi, enum quota_type qtype, int *usage_inconsistent, int preserve_limits)
Definition: mkquota.c:362
u64 qf_maxsize[]
Definition: quotaio.c:43
void update_grace_times(struct dquot *q)
Definition: quotaio.c:58
struct dquot * get_empty_dquot(void)
Definition: quotaio.c:221
int cur_qtype
Definition: quotaio.c:37
errcode_t quota_file_create(struct f2fs_sb_info *sbi, struct quota_handle *h, enum quota_type qtype)
Definition: quotaio.c:166
enum qf_szchk_type_t qf_szchk_type[]
Definition: quotaio.c:39
static errcode_t quota_get_memzero(unsigned long size, void *ptr)
Definition: quotaio.h:241
void quota_data_sub(quota_ctx_t qctx, struct f2fs_inode *inode, qsize_t space)
Definition: mkquota.c:250
void quota_release_context(quota_ctx_t *qctx)
Definition: mkquota.c:182
void quota_data_inodes(quota_ctx_t qctx, struct f2fs_inode *inode, int adjust)
Definition: mkquota.c:271
void quota_data_add(quota_ctx_t qctx, struct f2fs_inode *inode, qsize_t space)
Definition: mkquota.c:228
int64_t qsize_t
Definition: quotaio.h:33
errcode_t quota_file_close(struct f2fs_sb_info *sbi, struct quota_handle *h, int update_filesize)
Definition: quotaio.c:197
errcode_t quota_write_inode(struct f2fs_sb_info *sbi, enum quota_type qtype)
Definition: mkquota.c:66
int32_t f2fs_ino_t
Definition: quotaio.h:34
struct quota_ctx * quota_ctx_t
Definition: quotaio.h:65
qf_szchk_type_t
Definition: quotaio.h:48
@ QF_SZCHK_NONE
Definition: quotaio.h:49
@ QF_SZCHK_ERR
Definition: quotaio.h:50
@ QF_SZCHK_INLINE
Definition: quotaio.h:51
@ QF_SZCHK_REGFILE
Definition: quotaio.h:52
u32 qf_last_blkofs[]
Definition: quotaio.c:38
quota_type
Definition: quotaio.h:37
@ USRQUOTA
Definition: quotaio.h:38
@ PRJQUOTA
Definition: quotaio.h:40
@ MAXQUOTAS
Definition: quotaio.h:41
@ GRPQUOTA
Definition: quotaio.h:39
__u32 qid_t
Definition: quotaio_tree.h:16
Definition: dict.h:63
Definition: quotaio.h:152
qid_t dq_id
Definition: quotaio.h:154
struct util_dqblk dq_dqb
Definition: quotaio.h:157
int dq_flags
Definition: quotaio.h:155
struct dquot * dq_next
Definition: quotaio.h:153
struct quota_handle * dq_h
Definition: quotaio.h:156
Definition: f2fs_fs.h:1034
Definition: f2fs.h:251
Definition: quotaio.h:67
struct f2fs_sb_info * sbi
Definition: quotaio.h:68
struct dict_t * quota_dict[MAXQUOTAS]
Definition: quotaio.h:69
struct dict_t linked_inode_dict
Definition: quotaio.h:71
Definition: quotaio.h:115
f2fs_ino_t ino
Definition: quotaio.h:117
int64_t filesize
Definition: quotaio.h:118
struct f2fs_sb_info * sbi
Definition: quotaio.h:116
Definition: quotaio.h:122
enum quota_type qh_type
Definition: quotaio.h:123
struct quotafile_ops * qh_ops
Definition: quotaio.h:132
int qh_fmt
Definition: quotaio.h:124
int qh_file_flags
Definition: quotaio.h:125
unsigned int(* read)(struct quota_file *qf, long offset, void *buf, unsigned int size)
Definition: quotaio.h:128
unsigned int(* write)(struct quota_file *qf, long offset, void *buf, unsigned int size)
Definition: quotaio.h:130
struct quota_file qh_qf
Definition: quotaio.h:127
struct util_dqinfo qh_info
Definition: quotaio.h:133
int qh_io_flags
Definition: quotaio.h:126
Definition: quotaio.h:163
int(* commit_dquot)(struct dquot *dquot)
Definition: quotaio.h:177
int(* new_io)(struct quota_handle *h)
Definition: quotaio.h:169
int(* end_io)(struct quota_handle *h)
Definition: quotaio.h:171
int(* init_io)(struct quota_handle *h, enum quota_type qtype)
Definition: quotaio.h:167
int(* check_file)(struct quota_handle *h, int type)
Definition: quotaio.h:165
int(* report)(struct quota_handle *h, int verbose)
Definition: quotaio.h:184
int(* write_info)(struct quota_handle *h)
Definition: quotaio.h:173
int(* scan_dquots)(struct quota_handle *h, int(*process_dquot)(struct dquot *dquot, void *data), void *data)
Definition: quotaio.h:179
Definition: quotaio.h:137
time_t dqb_btime
Definition: quotaio.h:144
qsize_t dqb_curinodes
Definition: quotaio.h:140
union util_dqblk::@97 u
qsize_t dqb_ihardlimit
Definition: quotaio.h:138
qsize_t dqb_isoftlimit
Definition: quotaio.h:139
qsize_t dqb_bsoftlimit
Definition: quotaio.h:142
time_t dqb_itime
Definition: quotaio.h:145
qsize_t dqb_curspace
Definition: quotaio.h:143
qsize_t dqb_bhardlimit
Definition: quotaio.h:141
struct v2_mem_dqblk v2_mdqb
Definition: quotaio.h:147
Definition: quotaio.h:107
struct v2_mem_dqinfo v2_mdqi
Definition: quotaio.h:111
time_t dqi_igrace
Definition: quotaio.h:109
union util_dqinfo::@96 u
time_t dqi_bgrace
Definition: quotaio.h:108
Definition: dqblk_v2.h:22
Definition: dqblk_v2.h:13
void verbose(const char *fmt,...)
Definition: util.cpp:69