Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
7b718769 NS |
2 | * Copyright (c) 2000-2005 Silicon Graphics, Inc. |
3 | * All Rights Reserved. | |
1da177e4 | 4 | * |
7b718769 NS |
5 | * This program is free software; you can redistribute it and/or |
6 | * modify it under the terms of the GNU General Public License as | |
1da177e4 LT |
7 | * published by the Free Software Foundation. |
8 | * | |
7b718769 NS |
9 | * This program is distributed in the hope that it would be useful, |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | * GNU General Public License for more details. | |
1da177e4 | 13 | * |
7b718769 NS |
14 | * You should have received a copy of the GNU General Public License |
15 | * along with this program; if not, write the Free Software Foundation, | |
16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
1da177e4 LT |
17 | */ |
18 | #ifndef __XFS_QUOTA_H__ | |
19 | #define __XFS_QUOTA_H__ | |
20 | ||
76456fc2 | 21 | #include "xfs_quota_defs.h" |
fcafb71b | 22 | |
1da177e4 | 23 | /* |
76456fc2 | 24 | * Kernel only quota definitions and functions |
1da177e4 | 25 | */ |
c8ad20ff | 26 | |
76456fc2 | 27 | struct xfs_trans; |
1da177e4 | 28 | |
1da177e4 LT |
29 | /* |
30 | * This check is done typically without holding the inode lock; | |
c41564b5 | 31 | * that may seem racy, but it is harmless in the context that it is used. |
1da177e4 LT |
32 | * The inode cannot go inactive as long a reference is kept, and |
33 | * therefore if dquot(s) were attached, they'll stay consistent. | |
34 | * If, for example, the ownership of the inode changes while | |
35 | * we didn't have the inode locked, the appropriate dquot(s) will be | |
36 | * attached atomically. | |
37 | */ | |
92f8ff73 CS |
38 | #define XFS_NOT_DQATTACHED(mp, ip) \ |
39 | ((XFS_IS_UQUOTA_ON(mp) && (ip)->i_udquot == NULL) || \ | |
40 | (XFS_IS_GQUOTA_ON(mp) && (ip)->i_gdquot == NULL) || \ | |
41 | (XFS_IS_PQUOTA_ON(mp) && (ip)->i_pdquot == NULL)) | |
1da177e4 | 42 | |
c8ad20ff NS |
43 | #define XFS_QM_NEED_QUOTACHECK(mp) \ |
44 | ((XFS_IS_UQUOTA_ON(mp) && \ | |
45 | (mp->m_sb.sb_qflags & XFS_UQUOTA_CHKD) == 0) || \ | |
46 | (XFS_IS_GQUOTA_ON(mp) && \ | |
83e782e1 | 47 | (mp->m_sb.sb_qflags & XFS_GQUOTA_CHKD) == 0) || \ |
c8ad20ff | 48 | (XFS_IS_PQUOTA_ON(mp) && \ |
83e782e1 | 49 | (mp->m_sb.sb_qflags & XFS_PQUOTA_CHKD) == 0)) |
1da177e4 | 50 | |
c8ad20ff | 51 | #define XFS_MOUNT_QUOTA_ALL (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\ |
83e782e1 CS |
52 | XFS_UQUOTA_CHKD|XFS_GQUOTA_ACCT|\ |
53 | XFS_GQUOTA_ENFD|XFS_GQUOTA_CHKD|\ | |
54 | XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD|\ | |
55 | XFS_PQUOTA_CHKD) | |
1da177e4 LT |
56 | |
57 | ||
58 | /* | |
59 | * The structure kept inside the xfs_trans_t keep track of dquot changes | |
60 | * within a transaction and apply them later. | |
61 | */ | |
62 | typedef struct xfs_dqtrx { | |
63 | struct xfs_dquot *qt_dquot; /* the dquot this refers to */ | |
64 | ulong qt_blk_res; /* blks reserved on a dquot */ | |
65 | ulong qt_blk_res_used; /* blks used from the reservation */ | |
66 | ulong qt_ino_res; /* inode reserved on a dquot */ | |
67 | ulong qt_ino_res_used; /* inodes used from the reservation */ | |
68 | long qt_bcount_delta; /* dquot blk count changes */ | |
69 | long qt_delbcnt_delta; /* delayed dquot blk count changes */ | |
70 | long qt_icount_delta; /* dquot inode count changes */ | |
71 | ulong qt_rtblk_res; /* # blks reserved on a dquot */ | |
72 | ulong qt_rtblk_res_used;/* # blks used from reservation */ | |
73 | long qt_rtbcount_delta;/* dquot realtime blk changes */ | |
74 | long qt_delrtb_delta; /* delayed RT blk count changes */ | |
75 | } xfs_dqtrx_t; | |
76 | ||
7d095257 CH |
77 | #ifdef CONFIG_XFS_QUOTA |
78 | extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *); | |
79 | extern void xfs_trans_free_dqinfo(struct xfs_trans *); | |
80 | extern void xfs_trans_mod_dquot_byino(struct xfs_trans *, struct xfs_inode *, | |
81 | uint, long); | |
82 | extern void xfs_trans_apply_dquot_deltas(struct xfs_trans *); | |
83 | extern void xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *); | |
84 | extern int xfs_trans_reserve_quota_nblks(struct xfs_trans *, | |
85 | struct xfs_inode *, long, long, uint); | |
86 | extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *, | |
87 | struct xfs_mount *, struct xfs_dquot *, | |
92f8ff73 | 88 | struct xfs_dquot *, struct xfs_dquot *, long, long, uint); |
7d095257 CH |
89 | |
90 | extern int xfs_qm_vop_dqalloc(struct xfs_inode *, uid_t, gid_t, prid_t, uint, | |
92f8ff73 | 91 | struct xfs_dquot **, struct xfs_dquot **, struct xfs_dquot **); |
7d095257 | 92 | extern void xfs_qm_vop_create_dqattach(struct xfs_trans *, struct xfs_inode *, |
92f8ff73 | 93 | struct xfs_dquot *, struct xfs_dquot *, struct xfs_dquot *); |
7d095257 CH |
94 | extern int xfs_qm_vop_rename_dqattach(struct xfs_inode **); |
95 | extern struct xfs_dquot *xfs_qm_vop_chown(struct xfs_trans *, | |
96 | struct xfs_inode *, struct xfs_dquot **, struct xfs_dquot *); | |
97 | extern int xfs_qm_vop_chown_reserve(struct xfs_trans *, struct xfs_inode *, | |
92f8ff73 CS |
98 | struct xfs_dquot *, struct xfs_dquot *, |
99 | struct xfs_dquot *, uint); | |
7d095257 CH |
100 | extern int xfs_qm_dqattach(struct xfs_inode *, uint); |
101 | extern int xfs_qm_dqattach_locked(struct xfs_inode *, uint); | |
102 | extern void xfs_qm_dqdetach(struct xfs_inode *); | |
103 | extern void xfs_qm_dqrele(struct xfs_dquot *); | |
104 | extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *); | |
7d095257 CH |
105 | extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *); |
106 | extern void xfs_qm_mount_quotas(struct xfs_mount *); | |
107 | extern void xfs_qm_unmount(struct xfs_mount *); | |
108 | extern void xfs_qm_unmount_quotas(struct xfs_mount *); | |
109 | ||
110 | #else | |
493b87e5 CH |
111 | static inline int |
112 | xfs_qm_vop_dqalloc(struct xfs_inode *ip, uid_t uid, gid_t gid, prid_t prid, | |
92f8ff73 CS |
113 | uint flags, struct xfs_dquot **udqp, struct xfs_dquot **gdqp, |
114 | struct xfs_dquot **pdqp) | |
493b87e5 CH |
115 | { |
116 | *udqp = NULL; | |
117 | *gdqp = NULL; | |
92f8ff73 | 118 | *pdqp = NULL; |
493b87e5 CH |
119 | return 0; |
120 | } | |
7d095257 CH |
121 | #define xfs_trans_dup_dqinfo(tp, tp2) |
122 | #define xfs_trans_free_dqinfo(tp) | |
123 | #define xfs_trans_mod_dquot_byino(tp, ip, fields, delta) | |
124 | #define xfs_trans_apply_dquot_deltas(tp) | |
125 | #define xfs_trans_unreserve_and_mod_dquots(tp) | |
5d2bf8a5 CH |
126 | static inline int xfs_trans_reserve_quota_nblks(struct xfs_trans *tp, |
127 | struct xfs_inode *ip, long nblks, long ninos, uint flags) | |
128 | { | |
129 | return 0; | |
130 | } | |
131 | static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp, | |
132 | struct xfs_mount *mp, struct xfs_dquot *udqp, | |
92f8ff73 CS |
133 | struct xfs_dquot *gdqp, struct xfs_dquot *pdqp, |
134 | long nblks, long nions, uint flags) | |
5d2bf8a5 CH |
135 | { |
136 | return 0; | |
137 | } | |
92f8ff73 | 138 | #define xfs_qm_vop_create_dqattach(tp, ip, u, g, p) |
7d095257 CH |
139 | #define xfs_qm_vop_rename_dqattach(it) (0) |
140 | #define xfs_qm_vop_chown(tp, ip, old, new) (NULL) | |
92f8ff73 | 141 | #define xfs_qm_vop_chown_reserve(tp, ip, u, g, p, fl) (0) |
7d095257 CH |
142 | #define xfs_qm_dqattach(ip, fl) (0) |
143 | #define xfs_qm_dqattach_locked(ip, fl) (0) | |
144 | #define xfs_qm_dqdetach(ip) | |
145 | #define xfs_qm_dqrele(d) | |
146 | #define xfs_qm_statvfs(ip, s) | |
7d095257 CH |
147 | #define xfs_qm_newmount(mp, a, b) (0) |
148 | #define xfs_qm_mount_quotas(mp) | |
149 | #define xfs_qm_unmount(mp) | |
5d2bf8a5 | 150 | #define xfs_qm_unmount_quotas(mp) |
7d095257 CH |
151 | #endif /* CONFIG_XFS_QUOTA */ |
152 | ||
153 | #define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \ | |
154 | xfs_trans_reserve_quota_nblks(tp, ip, -(nblks), -(ninos), flags) | |
92f8ff73 CS |
155 | #define xfs_trans_reserve_quota(tp, mp, ud, gd, pd, nb, ni, f) \ |
156 | xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, pd, nb, ni, \ | |
1da177e4 LT |
157 | f | XFS_QMOPT_RES_REGBLKS) |
158 | ||
a0fa2b67 DC |
159 | extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *, |
160 | xfs_dqid_t, uint, uint, char *); | |
4cd4a034 | 161 | extern int xfs_mount_reset_sbqflags(struct xfs_mount *); |
1da177e4 | 162 | |
3fe58f30 CH |
163 | extern const struct xfs_buf_ops xfs_dquot_buf_ops; |
164 | ||
1da177e4 | 165 | #endif /* __XFS_QUOTA_H__ */ |