1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
4*4882a593Smuzhiyun * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #ifndef __QUOTA_DOT_H__
8*4882a593Smuzhiyun #define __QUOTA_DOT_H__
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include <linux/list_lru.h>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun struct gfs2_inode;
13*4882a593Smuzhiyun struct gfs2_sbd;
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #define NO_UID_QUOTA_CHANGE INVALID_UID
16*4882a593Smuzhiyun #define NO_GID_QUOTA_CHANGE INVALID_GID
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun extern int gfs2_qa_get(struct gfs2_inode *ip);
19*4882a593Smuzhiyun extern void gfs2_qa_put(struct gfs2_inode *ip);
20*4882a593Smuzhiyun extern int gfs2_quota_hold(struct gfs2_inode *ip, kuid_t uid, kgid_t gid);
21*4882a593Smuzhiyun extern void gfs2_quota_unhold(struct gfs2_inode *ip);
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun extern int gfs2_quota_lock(struct gfs2_inode *ip, kuid_t uid, kgid_t gid);
24*4882a593Smuzhiyun extern void gfs2_quota_unlock(struct gfs2_inode *ip);
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun extern int gfs2_quota_check(struct gfs2_inode *ip, kuid_t uid, kgid_t gid,
27*4882a593Smuzhiyun struct gfs2_alloc_parms *ap);
28*4882a593Smuzhiyun extern void gfs2_quota_change(struct gfs2_inode *ip, s64 change,
29*4882a593Smuzhiyun kuid_t uid, kgid_t gid);
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun extern int gfs2_quota_sync(struct super_block *sb, int type);
32*4882a593Smuzhiyun extern int gfs2_quota_refresh(struct gfs2_sbd *sdp, struct kqid qid);
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun extern int gfs2_quota_init(struct gfs2_sbd *sdp);
35*4882a593Smuzhiyun extern void gfs2_quota_cleanup(struct gfs2_sbd *sdp);
36*4882a593Smuzhiyun extern int gfs2_quotad(void *data);
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun extern void gfs2_wake_up_statfs(struct gfs2_sbd *sdp);
39*4882a593Smuzhiyun
gfs2_quota_lock_check(struct gfs2_inode * ip,struct gfs2_alloc_parms * ap)40*4882a593Smuzhiyun static inline int gfs2_quota_lock_check(struct gfs2_inode *ip,
41*4882a593Smuzhiyun struct gfs2_alloc_parms *ap)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
44*4882a593Smuzhiyun int ret;
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun ap->allowed = UINT_MAX; /* Assume we are permitted a whole lot */
47*4882a593Smuzhiyun if (capable(CAP_SYS_RESOURCE) ||
48*4882a593Smuzhiyun sdp->sd_args.ar_quota == GFS2_QUOTA_OFF)
49*4882a593Smuzhiyun return 0;
50*4882a593Smuzhiyun ret = gfs2_quota_lock(ip, NO_UID_QUOTA_CHANGE, NO_GID_QUOTA_CHANGE);
51*4882a593Smuzhiyun if (ret)
52*4882a593Smuzhiyun return ret;
53*4882a593Smuzhiyun if (sdp->sd_args.ar_quota != GFS2_QUOTA_ON)
54*4882a593Smuzhiyun return 0;
55*4882a593Smuzhiyun ret = gfs2_quota_check(ip, ip->i_inode.i_uid, ip->i_inode.i_gid, ap);
56*4882a593Smuzhiyun if (ret)
57*4882a593Smuzhiyun gfs2_quota_unlock(ip);
58*4882a593Smuzhiyun return ret;
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun extern const struct quotactl_ops gfs2_quotactl_ops;
62*4882a593Smuzhiyun extern struct shrinker gfs2_qd_shrinker;
63*4882a593Smuzhiyun extern struct list_lru gfs2_qd_lru;
64*4882a593Smuzhiyun extern void __init gfs2_quota_hash_init(void);
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun #endif /* __QUOTA_DOT_H__ */
67