This source file includes following definitions.
- xfs_dqflock
- xfs_dqflock_nowait
- xfs_dqfunlock
- xfs_dqlock_nowait
- xfs_dqlock
- xfs_dqunlock
- xfs_this_quota_on
- xfs_inode_dquot
- xfs_dquot_lowsp
- xfs_qm_dqhold
1
2
3
4
5
6 #ifndef __XFS_DQUOT_H__
7 #define __XFS_DQUOT_H__
8
9
10
11
12
13
14
15
16
17
18
19
20 struct xfs_mount;
21 struct xfs_trans;
22
23 enum {
24 XFS_QLOWSP_1_PCNT = 0,
25 XFS_QLOWSP_3_PCNT,
26 XFS_QLOWSP_5_PCNT,
27 XFS_QLOWSP_MAX
28 };
29
30
31
32
33 typedef struct xfs_dquot {
34 uint dq_flags;
35 struct list_head q_lru;
36 struct xfs_mount*q_mount;
37 uint q_nrefs;
38 xfs_daddr_t q_blkno;
39 int q_bufoffset;
40 xfs_fileoff_t q_fileoffset;
41
42 xfs_disk_dquot_t q_core;
43 xfs_dq_logitem_t q_logitem;
44 xfs_qcnt_t q_res_bcount;
45 xfs_qcnt_t q_res_icount;
46 xfs_qcnt_t q_res_rtbcount;
47 xfs_qcnt_t q_prealloc_lo_wmark;
48 xfs_qcnt_t q_prealloc_hi_wmark;
49 int64_t q_low_space[XFS_QLOWSP_MAX];
50 struct mutex q_qlock;
51 struct completion q_flush;
52 atomic_t q_pincount;
53 wait_queue_head_t q_pinwait;
54 } xfs_dquot_t;
55
56
57
58
59
60
61 enum {
62 XFS_QLOCK_NORMAL = 0,
63 XFS_QLOCK_NESTED,
64 };
65
66
67
68
69
70
71 static inline void xfs_dqflock(xfs_dquot_t *dqp)
72 {
73 wait_for_completion(&dqp->q_flush);
74 }
75
76 static inline bool xfs_dqflock_nowait(xfs_dquot_t *dqp)
77 {
78 return try_wait_for_completion(&dqp->q_flush);
79 }
80
81 static inline void xfs_dqfunlock(xfs_dquot_t *dqp)
82 {
83 complete(&dqp->q_flush);
84 }
85
86 static inline int xfs_dqlock_nowait(struct xfs_dquot *dqp)
87 {
88 return mutex_trylock(&dqp->q_qlock);
89 }
90
91 static inline void xfs_dqlock(struct xfs_dquot *dqp)
92 {
93 mutex_lock(&dqp->q_qlock);
94 }
95
96 static inline void xfs_dqunlock(struct xfs_dquot *dqp)
97 {
98 mutex_unlock(&dqp->q_qlock);
99 }
100
101 static inline int xfs_this_quota_on(struct xfs_mount *mp, int type)
102 {
103 switch (type & XFS_DQ_ALLTYPES) {
104 case XFS_DQ_USER:
105 return XFS_IS_UQUOTA_ON(mp);
106 case XFS_DQ_GROUP:
107 return XFS_IS_GQUOTA_ON(mp);
108 case XFS_DQ_PROJ:
109 return XFS_IS_PQUOTA_ON(mp);
110 default:
111 return 0;
112 }
113 }
114
115 static inline xfs_dquot_t *xfs_inode_dquot(struct xfs_inode *ip, int type)
116 {
117 switch (type & XFS_DQ_ALLTYPES) {
118 case XFS_DQ_USER:
119 return ip->i_udquot;
120 case XFS_DQ_GROUP:
121 return ip->i_gdquot;
122 case XFS_DQ_PROJ:
123 return ip->i_pdquot;
124 default:
125 return NULL;
126 }
127 }
128
129
130
131
132
133 static inline bool xfs_dquot_lowsp(struct xfs_dquot *dqp)
134 {
135 int64_t freesp;
136
137 freesp = be64_to_cpu(dqp->q_core.d_blk_hardlimit) - dqp->q_res_bcount;
138 if (freesp < dqp->q_low_space[XFS_QLOWSP_1_PCNT])
139 return true;
140
141 return false;
142 }
143
144 #define XFS_DQ_IS_LOCKED(dqp) (mutex_is_locked(&((dqp)->q_qlock)))
145 #define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY)
146 #define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER)
147 #define XFS_QM_ISPDQ(dqp) ((dqp)->dq_flags & XFS_DQ_PROJ)
148 #define XFS_QM_ISGDQ(dqp) ((dqp)->dq_flags & XFS_DQ_GROUP)
149
150 extern void xfs_qm_dqdestroy(xfs_dquot_t *);
151 extern int xfs_qm_dqflush(struct xfs_dquot *, struct xfs_buf **);
152 extern void xfs_qm_dqunpin_wait(xfs_dquot_t *);
153 extern void xfs_qm_adjust_dqtimers(xfs_mount_t *,
154 xfs_disk_dquot_t *);
155 extern void xfs_qm_adjust_dqlimits(struct xfs_mount *,
156 struct xfs_dquot *);
157 extern xfs_dqid_t xfs_qm_id_for_quotatype(struct xfs_inode *ip,
158 uint type);
159 extern int xfs_qm_dqget(struct xfs_mount *mp, xfs_dqid_t id,
160 uint type, bool can_alloc,
161 struct xfs_dquot **dqpp);
162 extern int xfs_qm_dqget_inode(struct xfs_inode *ip, uint type,
163 bool can_alloc,
164 struct xfs_dquot **dqpp);
165 extern int xfs_qm_dqget_next(struct xfs_mount *mp, xfs_dqid_t id,
166 uint type, struct xfs_dquot **dqpp);
167 extern int xfs_qm_dqget_uncached(struct xfs_mount *mp,
168 xfs_dqid_t id, uint type,
169 struct xfs_dquot **dqpp);
170 extern void xfs_qm_dqput(xfs_dquot_t *);
171
172 extern void xfs_dqlock2(struct xfs_dquot *, struct xfs_dquot *);
173
174 extern void xfs_dquot_set_prealloc_limits(struct xfs_dquot *);
175
176 static inline struct xfs_dquot *xfs_qm_dqhold(struct xfs_dquot *dqp)
177 {
178 xfs_dqlock(dqp);
179 dqp->q_nrefs++;
180 xfs_dqunlock(dqp);
181 return dqp;
182 }
183
184 typedef int (*xfs_qm_dqiterate_fn)(struct xfs_dquot *dq, uint dqtype,
185 void *priv);
186 int xfs_qm_dqiterate(struct xfs_mount *mp, uint dqtype,
187 xfs_qm_dqiterate_fn iter_fn, void *priv);
188
189 #endif