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 | |
1da177e4 LT |
51 | /* |
52 | * The structure kept inside the xfs_trans_t keep track of dquot changes | |
53 | * within a transaction and apply them later. | |
54 | */ | |
55 | typedef struct xfs_dqtrx { | |
56 | struct xfs_dquot *qt_dquot; /* the dquot this refers to */ | |
57 | ulong qt_blk_res; /* blks reserved on a dquot */ | |
1da177e4 LT |
58 | ulong qt_ino_res; /* inode reserved on a dquot */ |
59 | ulong qt_ino_res_used; /* inodes used from the reservation */ | |
60 | long qt_bcount_delta; /* dquot blk count changes */ | |
61 | long qt_delbcnt_delta; /* delayed dquot blk count changes */ | |
62 | long qt_icount_delta; /* dquot inode count changes */ | |
63 | ulong qt_rtblk_res; /* # blks reserved on a dquot */ | |
64 | ulong qt_rtblk_res_used;/* # blks used from reservation */ | |
65 | long qt_rtbcount_delta;/* dquot realtime blk changes */ | |
66 | long qt_delrtb_delta; /* delayed RT blk count changes */ | |
67 | } xfs_dqtrx_t; | |
68 | ||
7d095257 CH |
69 | #ifdef CONFIG_XFS_QUOTA |
70 | extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *); | |
71 | extern void xfs_trans_free_dqinfo(struct xfs_trans *); | |
72 | extern void xfs_trans_mod_dquot_byino(struct xfs_trans *, struct xfs_inode *, | |
73 | uint, long); | |
74 | extern void xfs_trans_apply_dquot_deltas(struct xfs_trans *); | |
75 | extern void xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *); | |
76 | extern int xfs_trans_reserve_quota_nblks(struct xfs_trans *, | |
77 | struct xfs_inode *, long, long, uint); | |
78 | extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *, | |
79 | struct xfs_mount *, struct xfs_dquot *, | |
92f8ff73 | 80 | struct xfs_dquot *, struct xfs_dquot *, long, long, uint); |
7d095257 | 81 | |
7aab1b28 DE |
82 | extern int xfs_qm_vop_dqalloc(struct xfs_inode *, xfs_dqid_t, xfs_dqid_t, |
83 | prid_t, uint, struct xfs_dquot **, struct xfs_dquot **, | |
84 | struct xfs_dquot **); | |
7d095257 | 85 | extern void xfs_qm_vop_create_dqattach(struct xfs_trans *, struct xfs_inode *, |
92f8ff73 | 86 | struct xfs_dquot *, struct xfs_dquot *, struct xfs_dquot *); |
7d095257 CH |
87 | extern int xfs_qm_vop_rename_dqattach(struct xfs_inode **); |
88 | extern struct xfs_dquot *xfs_qm_vop_chown(struct xfs_trans *, | |
89 | struct xfs_inode *, struct xfs_dquot **, struct xfs_dquot *); | |
90 | extern int xfs_qm_vop_chown_reserve(struct xfs_trans *, struct xfs_inode *, | |
92f8ff73 CS |
91 | struct xfs_dquot *, struct xfs_dquot *, |
92 | struct xfs_dquot *, uint); | |
7d095257 CH |
93 | extern int xfs_qm_dqattach(struct xfs_inode *, uint); |
94 | extern int xfs_qm_dqattach_locked(struct xfs_inode *, uint); | |
95 | extern void xfs_qm_dqdetach(struct xfs_inode *); | |
96 | extern void xfs_qm_dqrele(struct xfs_dquot *); | |
97 | extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *); | |
7d095257 CH |
98 | extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *); |
99 | extern void xfs_qm_mount_quotas(struct xfs_mount *); | |
100 | extern void xfs_qm_unmount(struct xfs_mount *); | |
101 | extern void xfs_qm_unmount_quotas(struct xfs_mount *); | |
102 | ||
103 | #else | |
493b87e5 | 104 | static inline int |
7aab1b28 DE |
105 | xfs_qm_vop_dqalloc(struct xfs_inode *ip, xfs_dqid_t uid, xfs_dqid_t gid, |
106 | prid_t prid, uint flags, struct xfs_dquot **udqp, | |
107 | struct xfs_dquot **gdqp, struct xfs_dquot **pdqp) | |
493b87e5 CH |
108 | { |
109 | *udqp = NULL; | |
110 | *gdqp = NULL; | |
92f8ff73 | 111 | *pdqp = NULL; |
493b87e5 CH |
112 | return 0; |
113 | } | |
7d095257 CH |
114 | #define xfs_trans_dup_dqinfo(tp, tp2) |
115 | #define xfs_trans_free_dqinfo(tp) | |
116 | #define xfs_trans_mod_dquot_byino(tp, ip, fields, delta) | |
117 | #define xfs_trans_apply_dquot_deltas(tp) | |
118 | #define xfs_trans_unreserve_and_mod_dquots(tp) | |
5d2bf8a5 CH |
119 | static inline int xfs_trans_reserve_quota_nblks(struct xfs_trans *tp, |
120 | struct xfs_inode *ip, long nblks, long ninos, uint flags) | |
121 | { | |
122 | return 0; | |
123 | } | |
124 | static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp, | |
125 | struct xfs_mount *mp, struct xfs_dquot *udqp, | |
92f8ff73 CS |
126 | struct xfs_dquot *gdqp, struct xfs_dquot *pdqp, |
127 | long nblks, long nions, uint flags) | |
5d2bf8a5 CH |
128 | { |
129 | return 0; | |
130 | } | |
92f8ff73 | 131 | #define xfs_qm_vop_create_dqattach(tp, ip, u, g, p) |
7d095257 CH |
132 | #define xfs_qm_vop_rename_dqattach(it) (0) |
133 | #define xfs_qm_vop_chown(tp, ip, old, new) (NULL) | |
92f8ff73 | 134 | #define xfs_qm_vop_chown_reserve(tp, ip, u, g, p, fl) (0) |
7d095257 CH |
135 | #define xfs_qm_dqattach(ip, fl) (0) |
136 | #define xfs_qm_dqattach_locked(ip, fl) (0) | |
137 | #define xfs_qm_dqdetach(ip) | |
138 | #define xfs_qm_dqrele(d) | |
139 | #define xfs_qm_statvfs(ip, s) | |
7d095257 CH |
140 | #define xfs_qm_newmount(mp, a, b) (0) |
141 | #define xfs_qm_mount_quotas(mp) | |
142 | #define xfs_qm_unmount(mp) | |
5d2bf8a5 | 143 | #define xfs_qm_unmount_quotas(mp) |
7d095257 CH |
144 | #endif /* CONFIG_XFS_QUOTA */ |
145 | ||
146 | #define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \ | |
147 | xfs_trans_reserve_quota_nblks(tp, ip, -(nblks), -(ninos), flags) | |
92f8ff73 CS |
148 | #define xfs_trans_reserve_quota(tp, mp, ud, gd, pd, nb, ni, f) \ |
149 | xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, pd, nb, ni, \ | |
1da177e4 LT |
150 | f | XFS_QMOPT_RES_REGBLKS) |
151 | ||
4cd4a034 | 152 | extern int xfs_mount_reset_sbqflags(struct xfs_mount *); |
1da177e4 | 153 | |
1da177e4 | 154 | #endif /* __XFS_QUOTA_H__ */ |