Merge tag 'rtc-6.7' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux
[linux-block.git] / include / linux / quotaops.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
1da177e4
LT
2/*
3 * Definitions for diskquota-operations. When diskquota is configured these
4 * macros expand to the right source-code.
5 *
6 * Author: Marco van Wieringen <mvw@planets.elm.net>
1da177e4
LT
7 */
8#ifndef _LINUX_QUOTAOPS_
9#define _LINUX_QUOTAOPS_
10
1da177e4
LT
11#include <linux/fs.h>
12
56246f9a
ES
13#define DQUOT_SPACE_WARN 0x1
14#define DQUOT_SPACE_RESERVE 0x2
0e05842b 15#define DQUOT_SPACE_NOFAIL 0x4
56246f9a 16
03b06343
JK
17static inline struct quota_info *sb_dqopt(struct super_block *sb)
18{
19 return &sb->s_dquot;
20}
74abb989 21
12755627 22/* i_mutex must being held */
f861646a 23static inline bool is_quota_modification(struct mnt_idmap *idmap,
71e7b535 24 struct inode *inode, struct iattr *ia)
12755627 25{
35faf310 26 return ((ia->ia_valid & ATTR_SIZE) ||
0dbe12f2
CB
27 i_uid_needs_update(idmap, ia, inode) ||
28 i_gid_needs_update(idmap, ia, inode));
12755627
DM
29}
30
1da177e4
LT
31#if defined(CONFIG_QUOTA)
32
fb5ffb0e
JZ
33#define quota_error(sb, fmt, args...) \
34 __quota_error((sb), __func__, fmt , ## args)
35
b9075fa9 36extern __printf(3, 4)
055adcbd
JP
37void __quota_error(struct super_block *sb, const char *func,
38 const char *fmt, ...);
fb5ffb0e 39
1da177e4
LT
40/*
41 * declaration of quota_function calls in kernel.
42 */
6184fc0b 43int dquot_initialize(struct inode *inode);
b8cb5a54 44bool dquot_initialize_needed(struct inode *inode);
9f754758 45void dquot_drop(struct inode *inode);
aca645a6 46struct dquot *dqget(struct super_block *sb, struct kqid qid);
9f985cb6
JK
47static inline struct dquot *dqgrab(struct dquot *dquot)
48{
49 /* Make sure someone else has active reference to dquot */
50 WARN_ON_ONCE(!atomic_read(&dquot->dq_count));
51 WARN_ON_ONCE(!test_bit(DQ_ACTIVE_B, &dquot->dq_flags));
52 atomic_inc(&dquot->dq_count);
53 return dquot;
54}
df4bb5d1
DM
55
56static inline bool dquot_is_busy(struct dquot *dquot)
57{
58 if (test_bit(DQ_MOD_B, &dquot->dq_flags))
59 return true;
869b6ea1 60 if (atomic_read(&dquot->dq_count) > 0)
df4bb5d1
DM
61 return true;
62 return false;
63}
64
3d9ea253 65void dqput(struct dquot *dquot);
12c77527
JK
66int dquot_scan_active(struct super_block *sb,
67 int (*fn)(struct dquot *dquot, unsigned long priv),
68 unsigned long priv);
7d9056ba
JK
69struct dquot *dquot_alloc(struct super_block *sb, int type);
70void dquot_destroy(struct dquot *dquot);
b85f4b87 71
56246f9a
ES
72int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags);
73void __dquot_free_space(struct inode *inode, qsize_t number, int flags);
b85f4b87 74
6bab3596 75int dquot_alloc_inode(struct inode *inode);
740d9dcd 76
5dd4056d 77int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
6bab3596 78void dquot_free_inode(struct inode *inode);
1c8924eb 79void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number);
b85f4b87 80
0f0dd62f
CH
81int dquot_disable(struct super_block *sb, int type, unsigned int flags);
82/* Suspend quotas on remount RO */
83static inline int dquot_suspend(struct super_block *sb, int type)
84{
85 return dquot_disable(sb, type, DQUOT_SUSPENDED);
86}
87int dquot_resume(struct super_block *sb, int type);
88
b85f4b87
JK
89int dquot_commit(struct dquot *dquot);
90int dquot_acquire(struct dquot *dquot);
91int dquot_release(struct dquot *dquot);
92int dquot_commit_info(struct super_block *sb, int type);
be6257b2 93int dquot_get_next_id(struct super_block *sb, struct kqid *qid);
b85f4b87
JK
94int dquot_mark_dquot_dirty(struct dquot *dquot);
95
907f4554
CH
96int dquot_file_open(struct inode *inode, struct file *file);
97
c7d3d283
JK
98int dquot_load_quota_sb(struct super_block *sb, int type, int format_id,
99 unsigned int flags);
dc19432a 100int dquot_load_quota_inode(struct inode *inode, int type, int format_id,
f55abc0f 101 unsigned int flags);
f00c9e44 102int dquot_quota_on(struct super_block *sb, int type, int format_id,
8c54ca9c 103 const struct path *path);
287a8095 104int dquot_quota_on_mount(struct super_block *sb, char *qf_name,
b85f4b87 105 int format_id, int type);
287a8095 106int dquot_quota_off(struct super_block *sb, int type);
ceed1723
JK
107int dquot_writeback_dquots(struct super_block *sb, int type);
108int dquot_quota_sync(struct super_block *sb, int type);
0a240339 109int dquot_get_state(struct super_block *sb, struct qc_state *state);
5eacb2ac 110int dquot_set_dqinfo(struct super_block *sb, int type, struct qc_info *ii);
74a8a103 111int dquot_get_dqblk(struct super_block *sb, struct kqid id,
14bf61ff 112 struct qc_dqblk *di);
be6257b2
JK
113int dquot_get_next_dqblk(struct super_block *sb, struct kqid *id,
114 struct qc_dqblk *di);
74a8a103 115int dquot_set_dqblk(struct super_block *sb, struct kqid id,
14bf61ff 116 struct qc_dqblk *di);
b85f4b87 117
bc8e5f07 118int __dquot_transfer(struct inode *inode, struct dquot **transfer_to);
f861646a 119int dquot_transfer(struct mnt_idmap *idmap, struct inode *inode,
71e7b535 120 struct iattr *iattr);
1da177e4 121
03b06343
JK
122static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
123{
124 return sb_dqopt(sb)->info + type;
125}
74abb989
JK
126
127/*
128 * Functions for checking status of quota
129 */
130
ad1e6e8d 131static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)
03b06343 132{
f55abc0f
JK
133 return sb_dqopt(sb)->flags &
134 dquot_state_flag(DQUOT_USAGE_ENABLED, type);
03b06343 135}
74abb989 136
ad1e6e8d 137static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)
03b06343 138{
f55abc0f
JK
139 return sb_dqopt(sb)->flags &
140 dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
03b06343 141}
74abb989 142
ad1e6e8d 143static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
03b06343 144{
f55abc0f
JK
145 return sb_dqopt(sb)->flags &
146 dquot_state_flag(DQUOT_SUSPENDED, type);
03b06343 147}
74abb989 148
ad1e6e8d 149static inline unsigned sb_any_quota_suspended(struct super_block *sb)
03b06343 150{
78197024 151 return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_SUSPENDED);
03b06343 152}
74abb989 153
f55abc0f 154/* Does kernel know about any quota information for given sb + type? */
ad1e6e8d 155static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
f55abc0f
JK
156{
157 /* Currently if anything is on, then quota usage is on as well */
158 return sb_has_quota_usage_enabled(sb, type);
159}
160
ad1e6e8d 161static inline unsigned sb_any_quota_loaded(struct super_block *sb)
f55abc0f 162{
78197024 163 return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_USAGE_ENABLED);
f55abc0f
JK
164}
165
ad1e6e8d 166static inline bool sb_has_quota_active(struct super_block *sb, int type)
f55abc0f
JK
167{
168 return sb_has_quota_loaded(sb, type) &&
169 !sb_has_quota_suspended(sb, type);
170}
171
1da177e4
LT
172/*
173 * Operations supported for diskquotas.
174 */
61e225dc 175extern const struct dquot_operations dquot_operations;
3e2af67e 176extern const struct quotactl_ops dquot_quotactl_sysfile_ops;
0ff5af83 177
1da177e4
LT
178#else
179
f55abc0f 180static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
03b06343
JK
181{
182 return 0;
183}
184
f55abc0f 185static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
03b06343
JK
186{
187 return 0;
188}
189
190static inline int sb_has_quota_suspended(struct super_block *sb, int type)
191{
192 return 0;
193}
194
195static inline int sb_any_quota_suspended(struct super_block *sb)
196{
197 return 0;
198}
74abb989 199
f55abc0f
JK
200/* Does kernel know about any quota information for given sb + type? */
201static inline int sb_has_quota_loaded(struct super_block *sb, int type)
202{
203 return 0;
204}
205
206static inline int sb_any_quota_loaded(struct super_block *sb)
207{
208 return 0;
209}
210
211static inline int sb_has_quota_active(struct super_block *sb, int type)
212{
213 return 0;
214}
215
6184fc0b 216static inline int dquot_initialize(struct inode *inode)
50f8c370 217{
6184fc0b 218 return 0;
50f8c370
AM
219}
220
b8cb5a54
TE
221static inline bool dquot_initialize_needed(struct inode *inode)
222{
223 return false;
224}
225
9f754758 226static inline void dquot_drop(struct inode *inode)
50f8c370
AM
227{
228}
229
6bab3596 230static inline int dquot_alloc_inode(struct inode *inode)
50f8c370
AM
231{
232 return 0;
233}
234
6bab3596 235static inline void dquot_free_inode(struct inode *inode)
50f8c370
AM
236{
237}
238
f861646a 239static inline int dquot_transfer(struct mnt_idmap *idmap,
71e7b535 240 struct inode *inode, struct iattr *iattr)
50f8c370
AM
241{
242 return 0;
243}
244
5dd4056d 245static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
56246f9a 246 int flags)
1da177e4 247{
56246f9a 248 if (!(flags & DQUOT_SPACE_RESERVE))
5dd4056d 249 inode_add_bytes(inode, number);
1da177e4
LT
250 return 0;
251}
252
5dd4056d 253static inline void __dquot_free_space(struct inode *inode, qsize_t number,
56246f9a 254 int flags)
1da177e4 255{
56246f9a 256 if (!(flags & DQUOT_SPACE_RESERVE))
5dd4056d 257 inode_sub_bytes(inode, number);
1da177e4
LT
258}
259
5dd4056d 260static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
1da177e4 261{
5dd4056d 262 inode_add_bytes(inode, number);
1da177e4
LT
263 return 0;
264}
265
1c8924eb
JK
266static inline int dquot_reclaim_space_nodirty(struct inode *inode,
267 qsize_t number)
268{
269 inode_sub_bytes(inode, number);
270 return 0;
271}
272
0f0dd62f
CH
273static inline int dquot_disable(struct super_block *sb, int type,
274 unsigned int flags)
275{
276 return 0;
277}
278
279static inline int dquot_suspend(struct super_block *sb, int type)
280{
281 return 0;
282}
283
284static inline int dquot_resume(struct super_block *sb, int type)
285{
286 return 0;
1da177e4
LT
287}
288
871a2931
CH
289#define dquot_file_open generic_file_open
290
ceed1723
JK
291static inline int dquot_writeback_dquots(struct super_block *sb, int type)
292{
293 return 0;
294}
295
5dd4056d
CH
296#endif /* CONFIG_QUOTA */
297
298static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
1da177e4 299{
56246f9a 300 return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN);
1da177e4
LT
301}
302
0e05842b
ES
303static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr)
304{
305 __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL);
43d2932d 306 mark_inode_dirty_sync(inode);
1da177e4
LT
307}
308
5dd4056d 309static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
f18df228 310{
5dd4056d
CH
311 int ret;
312
313 ret = dquot_alloc_space_nodirty(inode, nr);
d530148a
SL
314 if (!ret) {
315 /*
316 * Mark inode fully dirty. Since we are allocating blocks, inode
317 * would become fully dirty soon anyway and it reportedly
250df6ed 318 * reduces lock contention.
d530148a
SL
319 */
320 mark_inode_dirty(inode);
321 }
5dd4056d 322 return ret;
f18df228
MC
323}
324
5dd4056d 325static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
740d9dcd 326{
5dd4056d 327 return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
740d9dcd
MC
328}
329
0e05842b
ES
330static inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr)
331{
332 dquot_alloc_space_nofail(inode, nr << inode->i_blkbits);
333}
334
5dd4056d 335static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
740d9dcd 336{
5dd4056d 337 return dquot_alloc_space(inode, nr << inode->i_blkbits);
740d9dcd
MC
338}
339
5dd4056d 340static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
1da177e4 341{
56246f9a 342 return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0);
1da177e4
LT
343}
344
5dd4056d 345static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
1da177e4 346{
5dd4056d 347 int ret;
1da177e4 348
5dd4056d
CH
349 ret = dquot_prealloc_block_nodirty(inode, nr);
350 if (!ret)
43d2932d 351 mark_inode_dirty_sync(inode);
5dd4056d 352 return ret;
03f6e92b
JK
353}
354
5dd4056d 355static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
03f6e92b 356{
56246f9a
ES
357 return __dquot_alloc_space(inode, nr << inode->i_blkbits,
358 DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE);
03f6e92b
JK
359}
360
5dd4056d 361static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
03f6e92b 362{
5dd4056d 363 int ret;
03f6e92b 364
5dd4056d
CH
365 ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
366 if (!ret)
43d2932d 367 mark_inode_dirty_sync(inode);
5dd4056d 368 return ret;
03f6e92b
JK
369}
370
1c8924eb
JK
371static inline void dquot_reclaim_block(struct inode *inode, qsize_t nr)
372{
373 dquot_reclaim_space_nodirty(inode, nr << inode->i_blkbits);
374 mark_inode_dirty_sync(inode);
375}
376
5dd4056d 377static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
f18df228 378{
5dd4056d 379 __dquot_free_space(inode, nr, 0);
f18df228
MC
380}
381
5dd4056d 382static inline void dquot_free_space(struct inode *inode, qsize_t nr)
740d9dcd 383{
5dd4056d 384 dquot_free_space_nodirty(inode, nr);
43d2932d 385 mark_inode_dirty_sync(inode);
740d9dcd
MC
386}
387
5dd4056d 388static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
740d9dcd 389{
5dd4056d 390 dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
740d9dcd
MC
391}
392
5dd4056d 393static inline void dquot_free_block(struct inode *inode, qsize_t nr)
03f6e92b 394{
5dd4056d 395 dquot_free_space(inode, nr << inode->i_blkbits);
03f6e92b
JK
396}
397
5dd4056d
CH
398static inline void dquot_release_reservation_block(struct inode *inode,
399 qsize_t nr)
03f6e92b 400{
56246f9a 401 __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE);
03f6e92b 402}
1da177e4 403
d3b86324
JK
404unsigned int qtype_enforce_flag(int type);
405
1da177e4 406#endif /* _LINUX_QUOTAOPS_ */