Blame view

fs/xfs/xfs_dquot.h 6.07 KB
0b61f8a40   Dave Chinner   xfs: convert to S...
1
  // SPDX-License-Identifier: GPL-2.0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
  /*
4ce3121f6   Nathan Scott   [XFS] Update lice...
3
4
   * Copyright (c) 2000-2005 Silicon Graphics, Inc.
   * All Rights Reserved.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   */
  #ifndef __XFS_DQUOT_H__
  #define __XFS_DQUOT_H__
  
  /*
   * Dquots are structures that hold quota information about a user or a group,
   * much like inodes are for files. In fact, dquots share many characteristics
   * with inodes. However, dquots can also be a centralized resource, relative
   * to a collection of inodes. In this respect, dquots share some characteristics
   * of the superblock.
   * XFS dquots exploit both those in its algorithms. They make every attempt
   * to not be a bottleneck when quotas are on and have minimal impact, if any,
   * when quotas are off.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
20
  struct xfs_mount;
  struct xfs_trans;
b13664511   Brian Foster   xfs: xfs_dquot pr...
21
22
23
24
25
26
  enum {
  	XFS_QLOWSP_1_PCNT = 0,
  	XFS_QLOWSP_3_PCNT,
  	XFS_QLOWSP_5_PCNT,
  	XFS_QLOWSP_MAX
  };
784e80f56   Darrick J. Wong   xfs: use a per-re...
27
28
29
  struct xfs_dquot_res {
  	/* Total resources allocated and reserved. */
  	xfs_qcnt_t		reserved;
d3537cf93   Darrick J. Wong   xfs: stop using q...
30

be37d40c1   Darrick J. Wong   xfs: stop using q...
31
32
  	/* Total resources allocated. */
  	xfs_qcnt_t		count;
d3537cf93   Darrick J. Wong   xfs: stop using q...
33
34
35
  	/* Absolute and preferred limits. */
  	xfs_qcnt_t		hardlimit;
  	xfs_qcnt_t		softlimit;
c8c45fb2f   Darrick J. Wong   xfs: stop using q...
36
37
  
  	/*
19dce7eae   Darrick J. Wong   xfs: stop using q...
38
39
40
41
42
43
44
  	 * For root dquots, this is the default grace period, in seconds.
  	 * Otherwise, this is when the quota grace period expires,
  	 * in seconds since the Unix epoch.
  	 */
  	time64_t		timer;
  
  	/*
c8c45fb2f   Darrick J. Wong   xfs: stop using q...
45
46
47
48
49
50
  	 * For root dquots, this is the maximum number of warnings that will
  	 * be issued for this quota type.  Otherwise, this is the number of
  	 * warnings issued against this quota.  Note that none of this is
  	 * implemented.
  	 */
  	xfs_qwarncnt_t		warnings;
784e80f56   Darrick J. Wong   xfs: use a per-re...
51
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
54
   * The incore dquot structure
   */
aefe69a45   Pavel Reichl   xfs: remove the x...
55
  struct xfs_dquot {
aefe69a45   Pavel Reichl   xfs: remove the x...
56
57
  	struct list_head	q_lru;
  	struct xfs_mount	*q_mount;
1a7ed2716   Darrick J. Wong   xfs: create xfs_d...
58
  	xfs_dqtype_t		q_type;
985a78fdd   Darrick J. Wong   xfs: rename dquot...
59
  	uint16_t		q_flags;
c51df7334   Darrick J. Wong   xfs: stop using q...
60
  	xfs_dqid_t		q_id;
aefe69a45   Pavel Reichl   xfs: remove the x...
61
  	uint			q_nrefs;
aefe69a45   Pavel Reichl   xfs: remove the x...
62
  	int			q_bufoffset;
c51df7334   Darrick J. Wong   xfs: stop using q...
63
  	xfs_daddr_t		q_blkno;
aefe69a45   Pavel Reichl   xfs: remove the x...
64
  	xfs_fileoff_t		q_fileoffset;
784e80f56   Darrick J. Wong   xfs: use a per-re...
65
66
67
  	struct xfs_dquot_res	q_blk;	/* regular blocks */
  	struct xfs_dquot_res	q_ino;	/* inodes */
  	struct xfs_dquot_res	q_rtb;	/* realtime blocks */
fd8b81dbb   Pavel Reichl   xfs: remove the x...
68
  	struct xfs_dq_logitem	q_logitem;
784e80f56   Darrick J. Wong   xfs: use a per-re...
69

aefe69a45   Pavel Reichl   xfs: remove the x...
70
71
72
73
74
75
76
77
  	xfs_qcnt_t		q_prealloc_lo_wmark;
  	xfs_qcnt_t		q_prealloc_hi_wmark;
  	int64_t			q_low_space[XFS_QLOWSP_MAX];
  	struct mutex		q_qlock;
  	struct completion	q_flush;
  	atomic_t		q_pincount;
  	struct wait_queue_head	q_pinwait;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78

5bb87a33b   Christoph Hellwig   xfs: lockdep anno...
79
  /*
af901ca18   AndrĂ© Goddard Rosa   tree-wide: fix as...
80
   * Lock hierarchy for q_qlock:
5bb87a33b   Christoph Hellwig   xfs: lockdep anno...
81
   *	XFS_QLOCK_NORMAL is the implicit default,
aefe69a45   Pavel Reichl   xfs: remove the x...
82
   *	XFS_QLOCK_NESTED is the dquot with the higher id in xfs_dqlock2
5bb87a33b   Christoph Hellwig   xfs: lockdep anno...
83
84
85
86
87
   */
  enum {
  	XFS_QLOCK_NORMAL = 0,
  	XFS_QLOCK_NESTED,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
  /*
aefe69a45   Pavel Reichl   xfs: remove the x...
89
   * Manage the q_flush completion queue embedded in the dquot. This completion
e1f49cf20   David Chinner   [XFS] replace dqu...
90
91
   * queue synchronizes processes attempting to flush the in-core dquot back to
   * disk.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
   */
aefe69a45   Pavel Reichl   xfs: remove the x...
93
  static inline void xfs_dqflock(struct xfs_dquot *dqp)
e1f49cf20   David Chinner   [XFS] replace dqu...
94
95
96
  {
  	wait_for_completion(&dqp->q_flush);
  }
aefe69a45   Pavel Reichl   xfs: remove the x...
97
  static inline bool xfs_dqflock_nowait(struct xfs_dquot *dqp)
e1f49cf20   David Chinner   [XFS] replace dqu...
98
99
100
  {
  	return try_wait_for_completion(&dqp->q_flush);
  }
aefe69a45   Pavel Reichl   xfs: remove the x...
101
  static inline void xfs_dqfunlock(struct xfs_dquot *dqp)
e1f49cf20   David Chinner   [XFS] replace dqu...
102
103
104
  {
  	complete(&dqp->q_flush);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105

800b484ec   Christoph Hellwig   xfs: cleanup dquo...
106
107
108
109
110
111
112
113
114
  static inline int xfs_dqlock_nowait(struct xfs_dquot *dqp)
  {
  	return mutex_trylock(&dqp->q_qlock);
  }
  
  static inline void xfs_dqlock(struct xfs_dquot *dqp)
  {
  	mutex_lock(&dqp->q_qlock);
  }
5b03ff1b2   Christoph Hellwig   xfs: remove xfs_t...
115
  static inline void xfs_dqunlock(struct xfs_dquot *dqp)
800b484ec   Christoph Hellwig   xfs: cleanup dquo...
116
117
118
  {
  	mutex_unlock(&dqp->q_qlock);
  }
00a342e49   Darrick J. Wong   xfs: remove the X...
119
120
121
  static inline int
  xfs_dquot_type(const struct xfs_dquot *dqp)
  {
1a7ed2716   Darrick J. Wong   xfs: create xfs_d...
122
  	return dqp->q_type & XFS_DQTYPE_REC_MASK;
00a342e49   Darrick J. Wong   xfs: remove the X...
123
  }
1a7ed2716   Darrick J. Wong   xfs: create xfs_d...
124
  static inline int xfs_this_quota_on(struct xfs_mount *mp, xfs_dqtype_t type)
6967b964c   Chandra Seetharaman   Define a new func...
125
  {
af1db8f12   Darrick J. Wong   xfs: remove unnec...
126
  	switch (type) {
8cd4901da   Darrick J. Wong   xfs: rename XFS_D...
127
  	case XFS_DQTYPE_USER:
6967b964c   Chandra Seetharaman   Define a new func...
128
  		return XFS_IS_UQUOTA_ON(mp);
8cd4901da   Darrick J. Wong   xfs: rename XFS_D...
129
  	case XFS_DQTYPE_GROUP:
92f8ff73f   Chandra Seetharaman   xfs: Add pquota f...
130
  		return XFS_IS_GQUOTA_ON(mp);
8cd4901da   Darrick J. Wong   xfs: rename XFS_D...
131
  	case XFS_DQTYPE_PROJ:
92f8ff73f   Chandra Seetharaman   xfs: Add pquota f...
132
  		return XFS_IS_PQUOTA_ON(mp);
6967b964c   Chandra Seetharaman   Define a new func...
133
134
135
136
  	default:
  		return 0;
  	}
  }
1a7ed2716   Darrick J. Wong   xfs: create xfs_d...
137
138
139
  static inline struct xfs_dquot *xfs_inode_dquot(
  	struct xfs_inode	*ip,
  	xfs_dqtype_t		type)
367314108   Chandra Seetharaman   Define a new func...
140
  {
af1db8f12   Darrick J. Wong   xfs: remove unnec...
141
  	switch (type) {
8cd4901da   Darrick J. Wong   xfs: rename XFS_D...
142
  	case XFS_DQTYPE_USER:
367314108   Chandra Seetharaman   Define a new func...
143
  		return ip->i_udquot;
8cd4901da   Darrick J. Wong   xfs: rename XFS_D...
144
  	case XFS_DQTYPE_GROUP:
367314108   Chandra Seetharaman   Define a new func...
145
  		return ip->i_gdquot;
8cd4901da   Darrick J. Wong   xfs: rename XFS_D...
146
  	case XFS_DQTYPE_PROJ:
92f8ff73f   Chandra Seetharaman   xfs: Add pquota f...
147
  		return ip->i_pdquot;
367314108   Chandra Seetharaman   Define a new func...
148
149
150
151
  	default:
  		return NULL;
  	}
  }
dbcbc7b90   Darrick J. Wong   xfs: refactor tes...
152
153
154
155
156
  /* Decide if the dquot's limits are actually being enforced. */
  static inline bool
  xfs_dquot_is_enforced(
  	const struct xfs_dquot	*dqp)
  {
0b04dd5d7   Darrick J. Wong   xfs: always use x...
157
  	switch (xfs_dquot_type(dqp)) {
dbcbc7b90   Darrick J. Wong   xfs: refactor tes...
158
159
160
161
162
163
164
165
166
167
  	case XFS_DQTYPE_USER:
  		return XFS_IS_UQUOTA_ENFORCED(dqp->q_mount);
  	case XFS_DQTYPE_GROUP:
  		return XFS_IS_GQUOTA_ENFORCED(dqp->q_mount);
  	case XFS_DQTYPE_PROJ:
  		return XFS_IS_PQUOTA_ENFORCED(dqp->q_mount);
  	}
  	ASSERT(0);
  	return false;
  }
dc06f398f   Brian Foster   xfs: run an eofbl...
168
169
170
171
172
173
174
  /*
   * Check whether a dquot is under low free space conditions. We assume the quota
   * is enabled and enforced.
   */
  static inline bool xfs_dquot_lowsp(struct xfs_dquot *dqp)
  {
  	int64_t freesp;
d3537cf93   Darrick J. Wong   xfs: stop using q...
175
  	freesp = dqp->q_blk.hardlimit - dqp->q_blk.reserved;
dc06f398f   Brian Foster   xfs: run an eofbl...
176
177
178
179
180
  	if (freesp < dqp->q_low_space[XFS_QLOWSP_1_PCNT])
  		return true;
  
  	return false;
  }
0b0fa1d1d   Darrick J. Wong   xfs: stop using q...
181
  void xfs_dquot_to_disk(struct xfs_disk_dquot *ddqp, struct xfs_dquot *dqp);
7201813bf   Christoph Hellwig   xfs: use mutex_is...
182
  #define XFS_DQ_IS_LOCKED(dqp)	(mutex_is_locked(&((dqp)->q_qlock)))
985a78fdd   Darrick J. Wong   xfs: rename dquot...
183
  #define XFS_DQ_IS_DIRTY(dqp)	((dqp)->q_flags & XFS_DQFLAG_DIRTY)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
184

aefe69a45   Pavel Reichl   xfs: remove the x...
185
186
187
  void		xfs_qm_dqdestroy(struct xfs_dquot *dqp);
  int		xfs_qm_dqflush(struct xfs_dquot *dqp, struct xfs_buf **bpp);
  void		xfs_qm_dqunpin_wait(struct xfs_dquot *dqp);
c8c753e19   Darrick J. Wong   xfs: remove unnec...
188
189
190
  void		xfs_qm_adjust_dqtimers(struct xfs_dquot *d);
  void		xfs_qm_adjust_dqlimits(struct xfs_dquot *d);
  xfs_dqid_t	xfs_qm_id_for_quotatype(struct xfs_inode *ip,
1a7ed2716   Darrick J. Wong   xfs: create xfs_d...
191
  				xfs_dqtype_t type);
aefe69a45   Pavel Reichl   xfs: remove the x...
192
  int		xfs_qm_dqget(struct xfs_mount *mp, xfs_dqid_t id,
1a7ed2716   Darrick J. Wong   xfs: create xfs_d...
193
194
195
196
  				xfs_dqtype_t type, bool can_alloc,
  				struct xfs_dquot **dqpp);
  int		xfs_qm_dqget_inode(struct xfs_inode *ip, xfs_dqtype_t type,
  				bool can_alloc, struct xfs_dquot **dqpp);
aefe69a45   Pavel Reichl   xfs: remove the x...
197
  int		xfs_qm_dqget_next(struct xfs_mount *mp, xfs_dqid_t id,
1a7ed2716   Darrick J. Wong   xfs: create xfs_d...
198
  				xfs_dqtype_t type, struct xfs_dquot **dqpp);
aefe69a45   Pavel Reichl   xfs: remove the x...
199
  int		xfs_qm_dqget_uncached(struct xfs_mount *mp,
1a7ed2716   Darrick J. Wong   xfs: create xfs_d...
200
201
  				xfs_dqid_t id, xfs_dqtype_t type,
  				struct xfs_dquot **dqpp);
aefe69a45   Pavel Reichl   xfs: remove the x...
202
  void		xfs_qm_dqput(struct xfs_dquot *dqp);
800b484ec   Christoph Hellwig   xfs: cleanup dquo...
203

aefe69a45   Pavel Reichl   xfs: remove the x...
204
  void		xfs_dqlock2(struct xfs_dquot *, struct xfs_dquot *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
205

aefe69a45   Pavel Reichl   xfs: remove the x...
206
  void		xfs_dquot_set_prealloc_limits(struct xfs_dquot *);
b13664511   Brian Foster   xfs: xfs_dquot pr...
207

78e55892d   Christoph Hellwig   xfs: add a xfs_dq...
208
209
210
211
212
213
214
  static inline struct xfs_dquot *xfs_qm_dqhold(struct xfs_dquot *dqp)
  {
  	xfs_dqlock(dqp);
  	dqp->q_nrefs++;
  	xfs_dqunlock(dqp);
  	return dqp;
  }
1a7ed2716   Darrick J. Wong   xfs: create xfs_d...
215
216
217
  typedef int (*xfs_qm_dqiterate_fn)(struct xfs_dquot *dq,
  		xfs_dqtype_t type, void *priv);
  int xfs_qm_dqiterate(struct xfs_mount *mp, xfs_dqtype_t type,
554ba9654   Darrick J. Wong   xfs: refactor dqu...
218
  		xfs_qm_dqiterate_fn iter_fn, void *priv);
11d8a9190   Darrick J. Wong   xfs: refactor quo...
219
  time64_t xfs_dquot_set_timeout(struct xfs_mount *mp, time64_t timeout);
ccc8e771a   Darrick J. Wong   xfs: refactor def...
220
  time64_t xfs_dquot_set_grace_period(time64_t grace);
11d8a9190   Darrick J. Wong   xfs: refactor quo...
221

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
222
  #endif /* __XFS_DQUOT_H__ */