• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2000-2003 Silicon Graphics, Inc.
4  * All Rights Reserved.
5  */
6 #include "xfs.h"
7 #include "xfs_fs.h"
8 #include "xfs_format.h"
9 #include "xfs_log_format.h"
10 #include "xfs_shared.h"
11 #include "xfs_trans_resv.h"
12 #include "xfs_bit.h"
13 #include "xfs_mount.h"
14 #include "xfs_defer.h"
15 #include "xfs_inode.h"
16 #include "xfs_bmap.h"
17 #include "xfs_quota.h"
18 #include "xfs_trans.h"
19 #include "xfs_buf_item.h"
20 #include "xfs_trans_space.h"
21 #include "xfs_trans_priv.h"
22 #include "xfs_qm.h"
23 #include "xfs_trace.h"
24 #include "xfs_log.h"
25 #include "xfs_bmap_btree.h"
26 
27 /*
28  * Lock order:
29  *
30  * ip->i_lock
31  *   qi->qi_tree_lock
32  *     dquot->q_qlock (xfs_dqlock() and friends)
33  *       dquot->q_flush (xfs_dqflock() and friends)
34  *       qi->qi_lru_lock
35  *
36  * If two dquots need to be locked the order is user before group/project,
37  * otherwise by the lowest id first, see xfs_dqlock2.
38  */
39 
40 struct kmem_zone		*xfs_qm_dqtrxzone;
41 static struct kmem_zone		*xfs_qm_dqzone;
42 
43 static struct lock_class_key xfs_dquot_group_class;
44 static struct lock_class_key xfs_dquot_project_class;
45 
46 /*
47  * This is called to free all the memory associated with a dquot
48  */
49 void
xfs_qm_dqdestroy(struct xfs_dquot * dqp)50 xfs_qm_dqdestroy(
51 	struct xfs_dquot	*dqp)
52 {
53 	ASSERT(list_empty(&dqp->q_lru));
54 
55 	kmem_free(dqp->q_logitem.qli_item.li_lv_shadow);
56 	mutex_destroy(&dqp->q_qlock);
57 
58 	XFS_STATS_DEC(dqp->q_mount, xs_qm_dquot);
59 	kmem_zone_free(xfs_qm_dqzone, dqp);
60 }
61 
62 /*
63  * If default limits are in force, push them into the dquot now.
64  * We overwrite the dquot limits only if they are zero and this
65  * is not the root dquot.
66  */
67 void
xfs_qm_adjust_dqlimits(struct xfs_mount * mp,struct xfs_dquot * dq)68 xfs_qm_adjust_dqlimits(
69 	struct xfs_mount	*mp,
70 	struct xfs_dquot	*dq)
71 {
72 	struct xfs_quotainfo	*q = mp->m_quotainfo;
73 	struct xfs_disk_dquot	*d = &dq->q_core;
74 	struct xfs_def_quota	*defq;
75 	int			prealloc = 0;
76 
77 	ASSERT(d->d_id);
78 	defq = xfs_get_defquota(dq, q);
79 
80 	if (defq->bsoftlimit && !d->d_blk_softlimit) {
81 		d->d_blk_softlimit = cpu_to_be64(defq->bsoftlimit);
82 		prealloc = 1;
83 	}
84 	if (defq->bhardlimit && !d->d_blk_hardlimit) {
85 		d->d_blk_hardlimit = cpu_to_be64(defq->bhardlimit);
86 		prealloc = 1;
87 	}
88 	if (defq->isoftlimit && !d->d_ino_softlimit)
89 		d->d_ino_softlimit = cpu_to_be64(defq->isoftlimit);
90 	if (defq->ihardlimit && !d->d_ino_hardlimit)
91 		d->d_ino_hardlimit = cpu_to_be64(defq->ihardlimit);
92 	if (defq->rtbsoftlimit && !d->d_rtb_softlimit)
93 		d->d_rtb_softlimit = cpu_to_be64(defq->rtbsoftlimit);
94 	if (defq->rtbhardlimit && !d->d_rtb_hardlimit)
95 		d->d_rtb_hardlimit = cpu_to_be64(defq->rtbhardlimit);
96 
97 	if (prealloc)
98 		xfs_dquot_set_prealloc_limits(dq);
99 }
100 
101 /*
102  * Check the limits and timers of a dquot and start or reset timers
103  * if necessary.
104  * This gets called even when quota enforcement is OFF, which makes our
105  * life a little less complicated. (We just don't reject any quota
106  * reservations in that case, when enforcement is off).
107  * We also return 0 as the values of the timers in Q_GETQUOTA calls, when
108  * enforcement's off.
109  * In contrast, warnings are a little different in that they don't
110  * 'automatically' get started when limits get exceeded.  They do
111  * get reset to zero, however, when we find the count to be under
112  * the soft limit (they are only ever set non-zero via userspace).
113  */
114 void
xfs_qm_adjust_dqtimers(struct xfs_mount * mp,struct xfs_disk_dquot * d)115 xfs_qm_adjust_dqtimers(
116 	struct xfs_mount	*mp,
117 	struct xfs_disk_dquot	*d)
118 {
119 	ASSERT(d->d_id);
120 
121 #ifdef DEBUG
122 	if (d->d_blk_hardlimit)
123 		ASSERT(be64_to_cpu(d->d_blk_softlimit) <=
124 		       be64_to_cpu(d->d_blk_hardlimit));
125 	if (d->d_ino_hardlimit)
126 		ASSERT(be64_to_cpu(d->d_ino_softlimit) <=
127 		       be64_to_cpu(d->d_ino_hardlimit));
128 	if (d->d_rtb_hardlimit)
129 		ASSERT(be64_to_cpu(d->d_rtb_softlimit) <=
130 		       be64_to_cpu(d->d_rtb_hardlimit));
131 #endif
132 
133 	if (!d->d_btimer) {
134 		if ((d->d_blk_softlimit &&
135 		     (be64_to_cpu(d->d_bcount) >
136 		      be64_to_cpu(d->d_blk_softlimit))) ||
137 		    (d->d_blk_hardlimit &&
138 		     (be64_to_cpu(d->d_bcount) >
139 		      be64_to_cpu(d->d_blk_hardlimit)))) {
140 			d->d_btimer = cpu_to_be32(get_seconds() +
141 					mp->m_quotainfo->qi_btimelimit);
142 		} else {
143 			d->d_bwarns = 0;
144 		}
145 	} else {
146 		if ((!d->d_blk_softlimit ||
147 		     (be64_to_cpu(d->d_bcount) <=
148 		      be64_to_cpu(d->d_blk_softlimit))) &&
149 		    (!d->d_blk_hardlimit ||
150 		    (be64_to_cpu(d->d_bcount) <=
151 		     be64_to_cpu(d->d_blk_hardlimit)))) {
152 			d->d_btimer = 0;
153 		}
154 	}
155 
156 	if (!d->d_itimer) {
157 		if ((d->d_ino_softlimit &&
158 		     (be64_to_cpu(d->d_icount) >
159 		      be64_to_cpu(d->d_ino_softlimit))) ||
160 		    (d->d_ino_hardlimit &&
161 		     (be64_to_cpu(d->d_icount) >
162 		      be64_to_cpu(d->d_ino_hardlimit)))) {
163 			d->d_itimer = cpu_to_be32(get_seconds() +
164 					mp->m_quotainfo->qi_itimelimit);
165 		} else {
166 			d->d_iwarns = 0;
167 		}
168 	} else {
169 		if ((!d->d_ino_softlimit ||
170 		     (be64_to_cpu(d->d_icount) <=
171 		      be64_to_cpu(d->d_ino_softlimit)))  &&
172 		    (!d->d_ino_hardlimit ||
173 		     (be64_to_cpu(d->d_icount) <=
174 		      be64_to_cpu(d->d_ino_hardlimit)))) {
175 			d->d_itimer = 0;
176 		}
177 	}
178 
179 	if (!d->d_rtbtimer) {
180 		if ((d->d_rtb_softlimit &&
181 		     (be64_to_cpu(d->d_rtbcount) >
182 		      be64_to_cpu(d->d_rtb_softlimit))) ||
183 		    (d->d_rtb_hardlimit &&
184 		     (be64_to_cpu(d->d_rtbcount) >
185 		      be64_to_cpu(d->d_rtb_hardlimit)))) {
186 			d->d_rtbtimer = cpu_to_be32(get_seconds() +
187 					mp->m_quotainfo->qi_rtbtimelimit);
188 		} else {
189 			d->d_rtbwarns = 0;
190 		}
191 	} else {
192 		if ((!d->d_rtb_softlimit ||
193 		     (be64_to_cpu(d->d_rtbcount) <=
194 		      be64_to_cpu(d->d_rtb_softlimit))) &&
195 		    (!d->d_rtb_hardlimit ||
196 		     (be64_to_cpu(d->d_rtbcount) <=
197 		      be64_to_cpu(d->d_rtb_hardlimit)))) {
198 			d->d_rtbtimer = 0;
199 		}
200 	}
201 }
202 
203 /*
204  * initialize a buffer full of dquots and log the whole thing
205  */
206 STATIC void
xfs_qm_init_dquot_blk(struct xfs_trans * tp,struct xfs_mount * mp,xfs_dqid_t id,uint type,struct xfs_buf * bp)207 xfs_qm_init_dquot_blk(
208 	struct xfs_trans	*tp,
209 	struct xfs_mount	*mp,
210 	xfs_dqid_t		id,
211 	uint			type,
212 	struct xfs_buf		*bp)
213 {
214 	struct xfs_quotainfo	*q = mp->m_quotainfo;
215 	struct xfs_dqblk	*d;
216 	xfs_dqid_t		curid;
217 	unsigned int		qflag;
218 	unsigned int		blftype;
219 	int			i;
220 
221 	ASSERT(tp);
222 	ASSERT(xfs_buf_islocked(bp));
223 
224 	d = bp->b_addr;
225 
226 	/*
227 	 * ID of the first dquot in the block - id's are zero based.
228 	 */
229 	curid = id - (id % q->qi_dqperchunk);
230 	memset(d, 0, BBTOB(q->qi_dqchunklen));
231 	for (i = 0; i < q->qi_dqperchunk; i++, d++, curid++) {
232 		d->dd_diskdq.d_magic = cpu_to_be16(XFS_DQUOT_MAGIC);
233 		d->dd_diskdq.d_version = XFS_DQUOT_VERSION;
234 		d->dd_diskdq.d_id = cpu_to_be32(curid);
235 		d->dd_diskdq.d_flags = type;
236 		if (xfs_sb_version_hascrc(&mp->m_sb)) {
237 			uuid_copy(&d->dd_uuid, &mp->m_sb.sb_meta_uuid);
238 			xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk),
239 					 XFS_DQUOT_CRC_OFF);
240 		}
241 	}
242 
243 	if (type & XFS_DQ_USER) {
244 		qflag = XFS_UQUOTA_CHKD;
245 		blftype = XFS_BLF_UDQUOT_BUF;
246 	} else if (type & XFS_DQ_PROJ) {
247 		qflag = XFS_PQUOTA_CHKD;
248 		blftype = XFS_BLF_PDQUOT_BUF;
249 	} else {
250 		qflag = XFS_GQUOTA_CHKD;
251 		blftype = XFS_BLF_GDQUOT_BUF;
252 	}
253 
254 	xfs_trans_dquot_buf(tp, bp, blftype);
255 
256 	/*
257 	 * quotacheck uses delayed writes to update all the dquots on disk in an
258 	 * efficient manner instead of logging the individual dquot changes as
259 	 * they are made. However if we log the buffer allocated here and crash
260 	 * after quotacheck while the logged initialisation is still in the
261 	 * active region of the log, log recovery can replay the dquot buffer
262 	 * initialisation over the top of the checked dquots and corrupt quota
263 	 * accounting.
264 	 *
265 	 * To avoid this problem, quotacheck cannot log the initialised buffer.
266 	 * We must still dirty the buffer and write it back before the
267 	 * allocation transaction clears the log. Therefore, mark the buffer as
268 	 * ordered instead of logging it directly. This is safe for quotacheck
269 	 * because it detects and repairs allocated but initialized dquot blocks
270 	 * in the quota inodes.
271 	 */
272 	if (!(mp->m_qflags & qflag))
273 		xfs_trans_ordered_buf(tp, bp);
274 	else
275 		xfs_trans_log_buf(tp, bp, 0, BBTOB(q->qi_dqchunklen) - 1);
276 }
277 
278 /*
279  * Initialize the dynamic speculative preallocation thresholds. The lo/hi
280  * watermarks correspond to the soft and hard limits by default. If a soft limit
281  * is not specified, we use 95% of the hard limit.
282  */
283 void
xfs_dquot_set_prealloc_limits(struct xfs_dquot * dqp)284 xfs_dquot_set_prealloc_limits(struct xfs_dquot *dqp)
285 {
286 	uint64_t space;
287 
288 	dqp->q_prealloc_hi_wmark = be64_to_cpu(dqp->q_core.d_blk_hardlimit);
289 	dqp->q_prealloc_lo_wmark = be64_to_cpu(dqp->q_core.d_blk_softlimit);
290 	if (!dqp->q_prealloc_lo_wmark) {
291 		dqp->q_prealloc_lo_wmark = dqp->q_prealloc_hi_wmark;
292 		do_div(dqp->q_prealloc_lo_wmark, 100);
293 		dqp->q_prealloc_lo_wmark *= 95;
294 	}
295 
296 	space = dqp->q_prealloc_hi_wmark;
297 
298 	do_div(space, 100);
299 	dqp->q_low_space[XFS_QLOWSP_1_PCNT] = space;
300 	dqp->q_low_space[XFS_QLOWSP_3_PCNT] = space * 3;
301 	dqp->q_low_space[XFS_QLOWSP_5_PCNT] = space * 5;
302 }
303 
304 /*
305  * Ensure that the given in-core dquot has a buffer on disk backing it, and
306  * return the buffer locked and held. This is called when the bmapi finds a
307  * hole.
308  */
309 STATIC int
xfs_dquot_disk_alloc(struct xfs_trans ** tpp,struct xfs_dquot * dqp,struct xfs_buf ** bpp)310 xfs_dquot_disk_alloc(
311 	struct xfs_trans	**tpp,
312 	struct xfs_dquot	*dqp,
313 	struct xfs_buf		**bpp)
314 {
315 	struct xfs_bmbt_irec	map;
316 	struct xfs_trans	*tp = *tpp;
317 	struct xfs_mount	*mp = tp->t_mountp;
318 	struct xfs_buf		*bp;
319 	struct xfs_inode	*quotip = xfs_quota_inode(mp, dqp->dq_flags);
320 	int			nmaps = 1;
321 	int			error;
322 
323 	trace_xfs_dqalloc(dqp);
324 
325 	xfs_ilock(quotip, XFS_ILOCK_EXCL);
326 	if (!xfs_this_quota_on(dqp->q_mount, dqp->dq_flags)) {
327 		/*
328 		 * Return if this type of quotas is turned off while we didn't
329 		 * have an inode lock
330 		 */
331 		xfs_iunlock(quotip, XFS_ILOCK_EXCL);
332 		return -ESRCH;
333 	}
334 
335 	/* Create the block mapping. */
336 	xfs_trans_ijoin(tp, quotip, XFS_ILOCK_EXCL);
337 	error = xfs_bmapi_write(tp, quotip, dqp->q_fileoffset,
338 			XFS_DQUOT_CLUSTER_SIZE_FSB, XFS_BMAPI_METADATA,
339 			XFS_QM_DQALLOC_SPACE_RES(mp), &map, &nmaps);
340 	if (error)
341 		return error;
342 	ASSERT(map.br_blockcount == XFS_DQUOT_CLUSTER_SIZE_FSB);
343 	ASSERT(nmaps == 1);
344 	ASSERT((map.br_startblock != DELAYSTARTBLOCK) &&
345 	       (map.br_startblock != HOLESTARTBLOCK));
346 
347 	/*
348 	 * Keep track of the blkno to save a lookup later
349 	 */
350 	dqp->q_blkno = XFS_FSB_TO_DADDR(mp, map.br_startblock);
351 
352 	/* now we can just get the buffer (there's nothing to read yet) */
353 	bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, dqp->q_blkno,
354 			mp->m_quotainfo->qi_dqchunklen, 0);
355 	if (!bp)
356 		return -ENOMEM;
357 	bp->b_ops = &xfs_dquot_buf_ops;
358 
359 	/*
360 	 * Make a chunk of dquots out of this buffer and log
361 	 * the entire thing.
362 	 */
363 	xfs_qm_init_dquot_blk(tp, mp, be32_to_cpu(dqp->q_core.d_id),
364 			      dqp->dq_flags & XFS_DQ_ALLTYPES, bp);
365 	xfs_buf_set_ref(bp, XFS_DQUOT_REF);
366 
367 	/*
368 	 * Hold the buffer and join it to the dfops so that we'll still own
369 	 * the buffer when we return to the caller.  The buffer disposal on
370 	 * error must be paid attention to very carefully, as it has been
371 	 * broken since commit efa092f3d4c6 "[XFS] Fixes a bug in the quota
372 	 * code when allocating a new dquot record" in 2005, and the later
373 	 * conversion to xfs_defer_ops in commit 310a75a3c6c747 failed to keep
374 	 * the buffer locked across the _defer_finish call.  We can now do
375 	 * this correctly with xfs_defer_bjoin.
376 	 *
377 	 * Above, we allocated a disk block for the dquot information and used
378 	 * get_buf to initialize the dquot. If the _defer_finish fails, the old
379 	 * transaction is gone but the new buffer is not joined or held to any
380 	 * transaction, so we must _buf_relse it.
381 	 *
382 	 * If everything succeeds, the caller of this function is returned a
383 	 * buffer that is locked and held to the transaction.  The caller
384 	 * is responsible for unlocking any buffer passed back, either
385 	 * manually or by committing the transaction.  On error, the buffer is
386 	 * released and not passed back.
387 	 */
388 	xfs_trans_bhold(tp, bp);
389 	error = xfs_defer_finish(tpp);
390 	if (error) {
391 		xfs_trans_bhold_release(*tpp, bp);
392 		xfs_trans_brelse(*tpp, bp);
393 		return error;
394 	}
395 	*bpp = bp;
396 	return 0;
397 }
398 
399 /*
400  * Read in the in-core dquot's on-disk metadata and return the buffer.
401  * Returns ENOENT to signal a hole.
402  */
403 STATIC int
xfs_dquot_disk_read(struct xfs_mount * mp,struct xfs_dquot * dqp,struct xfs_buf ** bpp)404 xfs_dquot_disk_read(
405 	struct xfs_mount	*mp,
406 	struct xfs_dquot	*dqp,
407 	struct xfs_buf		**bpp)
408 {
409 	struct xfs_bmbt_irec	map;
410 	struct xfs_buf		*bp;
411 	struct xfs_inode	*quotip = xfs_quota_inode(mp, dqp->dq_flags);
412 	uint			lock_mode;
413 	int			nmaps = 1;
414 	int			error;
415 
416 	lock_mode = xfs_ilock_data_map_shared(quotip);
417 	if (!xfs_this_quota_on(mp, dqp->dq_flags)) {
418 		/*
419 		 * Return if this type of quotas is turned off while we
420 		 * didn't have the quota inode lock.
421 		 */
422 		xfs_iunlock(quotip, lock_mode);
423 		return -ESRCH;
424 	}
425 
426 	/*
427 	 * Find the block map; no allocations yet
428 	 */
429 	error = xfs_bmapi_read(quotip, dqp->q_fileoffset,
430 			XFS_DQUOT_CLUSTER_SIZE_FSB, &map, &nmaps, 0);
431 	xfs_iunlock(quotip, lock_mode);
432 	if (error)
433 		return error;
434 
435 	ASSERT(nmaps == 1);
436 	ASSERT(map.br_blockcount >= 1);
437 	ASSERT(map.br_startblock != DELAYSTARTBLOCK);
438 	if (map.br_startblock == HOLESTARTBLOCK)
439 		return -ENOENT;
440 
441 	trace_xfs_dqtobp_read(dqp);
442 
443 	/*
444 	 * store the blkno etc so that we don't have to do the
445 	 * mapping all the time
446 	 */
447 	dqp->q_blkno = XFS_FSB_TO_DADDR(mp, map.br_startblock);
448 
449 	error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dqp->q_blkno,
450 			mp->m_quotainfo->qi_dqchunklen, 0, &bp,
451 			&xfs_dquot_buf_ops);
452 	if (error) {
453 		ASSERT(bp == NULL);
454 		return error;
455 	}
456 
457 	ASSERT(xfs_buf_islocked(bp));
458 	xfs_buf_set_ref(bp, XFS_DQUOT_REF);
459 	*bpp = bp;
460 
461 	return 0;
462 }
463 
464 /* Allocate and initialize everything we need for an incore dquot. */
465 STATIC struct xfs_dquot *
xfs_dquot_alloc(struct xfs_mount * mp,xfs_dqid_t id,uint type)466 xfs_dquot_alloc(
467 	struct xfs_mount	*mp,
468 	xfs_dqid_t		id,
469 	uint			type)
470 {
471 	struct xfs_dquot	*dqp;
472 
473 	dqp = kmem_zone_zalloc(xfs_qm_dqzone, 0);
474 
475 	dqp->dq_flags = type;
476 	dqp->q_core.d_id = cpu_to_be32(id);
477 	dqp->q_mount = mp;
478 	INIT_LIST_HEAD(&dqp->q_lru);
479 	mutex_init(&dqp->q_qlock);
480 	init_waitqueue_head(&dqp->q_pinwait);
481 	dqp->q_fileoffset = (xfs_fileoff_t)id / mp->m_quotainfo->qi_dqperchunk;
482 	/*
483 	 * Offset of dquot in the (fixed sized) dquot chunk.
484 	 */
485 	dqp->q_bufoffset = (id % mp->m_quotainfo->qi_dqperchunk) *
486 			sizeof(xfs_dqblk_t);
487 
488 	/*
489 	 * Because we want to use a counting completion, complete
490 	 * the flush completion once to allow a single access to
491 	 * the flush completion without blocking.
492 	 */
493 	init_completion(&dqp->q_flush);
494 	complete(&dqp->q_flush);
495 
496 	/*
497 	 * Make sure group quotas have a different lock class than user
498 	 * quotas.
499 	 */
500 	switch (type) {
501 	case XFS_DQ_USER:
502 		/* uses the default lock class */
503 		break;
504 	case XFS_DQ_GROUP:
505 		lockdep_set_class(&dqp->q_qlock, &xfs_dquot_group_class);
506 		break;
507 	case XFS_DQ_PROJ:
508 		lockdep_set_class(&dqp->q_qlock, &xfs_dquot_project_class);
509 		break;
510 	default:
511 		ASSERT(0);
512 		break;
513 	}
514 
515 	xfs_qm_dquot_logitem_init(dqp);
516 
517 	XFS_STATS_INC(mp, xs_qm_dquot);
518 	return dqp;
519 }
520 
521 /* Copy the in-core quota fields in from the on-disk buffer. */
522 STATIC void
xfs_dquot_from_disk(struct xfs_dquot * dqp,struct xfs_buf * bp)523 xfs_dquot_from_disk(
524 	struct xfs_dquot	*dqp,
525 	struct xfs_buf		*bp)
526 {
527 	struct xfs_disk_dquot	*ddqp = bp->b_addr + dqp->q_bufoffset;
528 
529 	/* copy everything from disk dquot to the incore dquot */
530 	memcpy(&dqp->q_core, ddqp, sizeof(struct xfs_disk_dquot));
531 
532 	/*
533 	 * Reservation counters are defined as reservation plus current usage
534 	 * to avoid having to add every time.
535 	 */
536 	dqp->q_res_bcount = be64_to_cpu(ddqp->d_bcount);
537 	dqp->q_res_icount = be64_to_cpu(ddqp->d_icount);
538 	dqp->q_res_rtbcount = be64_to_cpu(ddqp->d_rtbcount);
539 
540 	/* initialize the dquot speculative prealloc thresholds */
541 	xfs_dquot_set_prealloc_limits(dqp);
542 }
543 
544 /* Allocate and initialize the dquot buffer for this in-core dquot. */
545 static int
xfs_qm_dqread_alloc(struct xfs_mount * mp,struct xfs_dquot * dqp,struct xfs_buf ** bpp)546 xfs_qm_dqread_alloc(
547 	struct xfs_mount	*mp,
548 	struct xfs_dquot	*dqp,
549 	struct xfs_buf		**bpp)
550 {
551 	struct xfs_trans	*tp;
552 	int			error;
553 
554 	error = xfs_trans_alloc(mp, &M_RES(mp)->tr_qm_dqalloc,
555 			XFS_QM_DQALLOC_SPACE_RES(mp), 0, 0, &tp);
556 	if (error)
557 		goto err;
558 
559 	error = xfs_dquot_disk_alloc(&tp, dqp, bpp);
560 	if (error)
561 		goto err_cancel;
562 
563 	error = xfs_trans_commit(tp);
564 	if (error) {
565 		/*
566 		 * Buffer was held to the transaction, so we have to unlock it
567 		 * manually here because we're not passing it back.
568 		 */
569 		xfs_buf_relse(*bpp);
570 		*bpp = NULL;
571 		goto err;
572 	}
573 	return 0;
574 
575 err_cancel:
576 	xfs_trans_cancel(tp);
577 err:
578 	return error;
579 }
580 
581 /*
582  * Read in the ondisk dquot using dqtobp() then copy it to an incore version,
583  * and release the buffer immediately.  If @can_alloc is true, fill any
584  * holes in the on-disk metadata.
585  */
586 static int
xfs_qm_dqread(struct xfs_mount * mp,xfs_dqid_t id,uint type,bool can_alloc,struct xfs_dquot ** dqpp)587 xfs_qm_dqread(
588 	struct xfs_mount	*mp,
589 	xfs_dqid_t		id,
590 	uint			type,
591 	bool			can_alloc,
592 	struct xfs_dquot	**dqpp)
593 {
594 	struct xfs_dquot	*dqp;
595 	struct xfs_buf		*bp;
596 	int			error;
597 
598 	dqp = xfs_dquot_alloc(mp, id, type);
599 	trace_xfs_dqread(dqp);
600 
601 	/* Try to read the buffer, allocating if necessary. */
602 	error = xfs_dquot_disk_read(mp, dqp, &bp);
603 	if (error == -ENOENT && can_alloc)
604 		error = xfs_qm_dqread_alloc(mp, dqp, &bp);
605 	if (error)
606 		goto err;
607 
608 	/*
609 	 * At this point we should have a clean locked buffer.  Copy the data
610 	 * to the incore dquot and release the buffer since the incore dquot
611 	 * has its own locking protocol so we needn't tie up the buffer any
612 	 * further.
613 	 */
614 	ASSERT(xfs_buf_islocked(bp));
615 	xfs_dquot_from_disk(dqp, bp);
616 
617 	xfs_buf_relse(bp);
618 	*dqpp = dqp;
619 	return error;
620 
621 err:
622 	trace_xfs_dqread_fail(dqp);
623 	xfs_qm_dqdestroy(dqp);
624 	*dqpp = NULL;
625 	return error;
626 }
627 
628 /*
629  * Advance to the next id in the current chunk, or if at the
630  * end of the chunk, skip ahead to first id in next allocated chunk
631  * using the SEEK_DATA interface.
632  */
633 static int
xfs_dq_get_next_id(struct xfs_mount * mp,uint type,xfs_dqid_t * id)634 xfs_dq_get_next_id(
635 	struct xfs_mount	*mp,
636 	uint			type,
637 	xfs_dqid_t		*id)
638 {
639 	struct xfs_inode	*quotip = xfs_quota_inode(mp, type);
640 	xfs_dqid_t		next_id = *id + 1; /* simple advance */
641 	uint			lock_flags;
642 	struct xfs_bmbt_irec	got;
643 	struct xfs_iext_cursor	cur;
644 	xfs_fsblock_t		start;
645 	int			error = 0;
646 
647 	/* If we'd wrap past the max ID, stop */
648 	if (next_id < *id)
649 		return -ENOENT;
650 
651 	/* If new ID is within the current chunk, advancing it sufficed */
652 	if (next_id % mp->m_quotainfo->qi_dqperchunk) {
653 		*id = next_id;
654 		return 0;
655 	}
656 
657 	/* Nope, next_id is now past the current chunk, so find the next one */
658 	start = (xfs_fsblock_t)next_id / mp->m_quotainfo->qi_dqperchunk;
659 
660 	lock_flags = xfs_ilock_data_map_shared(quotip);
661 	if (!(quotip->i_df.if_flags & XFS_IFEXTENTS)) {
662 		error = xfs_iread_extents(NULL, quotip, XFS_DATA_FORK);
663 		if (error)
664 			return error;
665 	}
666 
667 	if (xfs_iext_lookup_extent(quotip, &quotip->i_df, start, &cur, &got)) {
668 		/* contiguous chunk, bump startoff for the id calculation */
669 		if (got.br_startoff < start)
670 			got.br_startoff = start;
671 		*id = got.br_startoff * mp->m_quotainfo->qi_dqperchunk;
672 	} else {
673 		error = -ENOENT;
674 	}
675 
676 	xfs_iunlock(quotip, lock_flags);
677 
678 	return error;
679 }
680 
681 /*
682  * Look up the dquot in the in-core cache.  If found, the dquot is returned
683  * locked and ready to go.
684  */
685 static struct xfs_dquot *
xfs_qm_dqget_cache_lookup(struct xfs_mount * mp,struct xfs_quotainfo * qi,struct radix_tree_root * tree,xfs_dqid_t id)686 xfs_qm_dqget_cache_lookup(
687 	struct xfs_mount	*mp,
688 	struct xfs_quotainfo	*qi,
689 	struct radix_tree_root	*tree,
690 	xfs_dqid_t		id)
691 {
692 	struct xfs_dquot	*dqp;
693 
694 restart:
695 	mutex_lock(&qi->qi_tree_lock);
696 	dqp = radix_tree_lookup(tree, id);
697 	if (!dqp) {
698 		mutex_unlock(&qi->qi_tree_lock);
699 		XFS_STATS_INC(mp, xs_qm_dqcachemisses);
700 		return NULL;
701 	}
702 
703 	xfs_dqlock(dqp);
704 	if (dqp->dq_flags & XFS_DQ_FREEING) {
705 		xfs_dqunlock(dqp);
706 		mutex_unlock(&qi->qi_tree_lock);
707 		trace_xfs_dqget_freeing(dqp);
708 		delay(1);
709 		goto restart;
710 	}
711 
712 	dqp->q_nrefs++;
713 	mutex_unlock(&qi->qi_tree_lock);
714 
715 	trace_xfs_dqget_hit(dqp);
716 	XFS_STATS_INC(mp, xs_qm_dqcachehits);
717 	return dqp;
718 }
719 
720 /*
721  * Try to insert a new dquot into the in-core cache.  If an error occurs the
722  * caller should throw away the dquot and start over.  Otherwise, the dquot
723  * is returned locked (and held by the cache) as if there had been a cache
724  * hit.
725  */
726 static int
xfs_qm_dqget_cache_insert(struct xfs_mount * mp,struct xfs_quotainfo * qi,struct radix_tree_root * tree,xfs_dqid_t id,struct xfs_dquot * dqp)727 xfs_qm_dqget_cache_insert(
728 	struct xfs_mount	*mp,
729 	struct xfs_quotainfo	*qi,
730 	struct radix_tree_root	*tree,
731 	xfs_dqid_t		id,
732 	struct xfs_dquot	*dqp)
733 {
734 	int			error;
735 
736 	mutex_lock(&qi->qi_tree_lock);
737 	error = radix_tree_insert(tree, id, dqp);
738 	if (unlikely(error)) {
739 		/* Duplicate found!  Caller must try again. */
740 		WARN_ON(error != -EEXIST);
741 		mutex_unlock(&qi->qi_tree_lock);
742 		trace_xfs_dqget_dup(dqp);
743 		return error;
744 	}
745 
746 	/* Return a locked dquot to the caller, with a reference taken. */
747 	xfs_dqlock(dqp);
748 	dqp->q_nrefs = 1;
749 
750 	qi->qi_dquots++;
751 	mutex_unlock(&qi->qi_tree_lock);
752 
753 	return 0;
754 }
755 
756 /* Check our input parameters. */
757 static int
xfs_qm_dqget_checks(struct xfs_mount * mp,uint type)758 xfs_qm_dqget_checks(
759 	struct xfs_mount	*mp,
760 	uint			type)
761 {
762 	if (WARN_ON_ONCE(!XFS_IS_QUOTA_RUNNING(mp)))
763 		return -ESRCH;
764 
765 	switch (type) {
766 	case XFS_DQ_USER:
767 		if (!XFS_IS_UQUOTA_ON(mp))
768 			return -ESRCH;
769 		return 0;
770 	case XFS_DQ_GROUP:
771 		if (!XFS_IS_GQUOTA_ON(mp))
772 			return -ESRCH;
773 		return 0;
774 	case XFS_DQ_PROJ:
775 		if (!XFS_IS_PQUOTA_ON(mp))
776 			return -ESRCH;
777 		return 0;
778 	default:
779 		WARN_ON_ONCE(0);
780 		return -EINVAL;
781 	}
782 }
783 
784 /*
785  * Given the file system, id, and type (UDQUOT/GDQUOT), return a a locked
786  * dquot, doing an allocation (if requested) as needed.
787  */
788 int
xfs_qm_dqget(struct xfs_mount * mp,xfs_dqid_t id,uint type,bool can_alloc,struct xfs_dquot ** O_dqpp)789 xfs_qm_dqget(
790 	struct xfs_mount	*mp,
791 	xfs_dqid_t		id,
792 	uint			type,
793 	bool			can_alloc,
794 	struct xfs_dquot	**O_dqpp)
795 {
796 	struct xfs_quotainfo	*qi = mp->m_quotainfo;
797 	struct radix_tree_root	*tree = xfs_dquot_tree(qi, type);
798 	struct xfs_dquot	*dqp;
799 	int			error;
800 
801 	error = xfs_qm_dqget_checks(mp, type);
802 	if (error)
803 		return error;
804 
805 restart:
806 	dqp = xfs_qm_dqget_cache_lookup(mp, qi, tree, id);
807 	if (dqp) {
808 		*O_dqpp = dqp;
809 		return 0;
810 	}
811 
812 	error = xfs_qm_dqread(mp, id, type, can_alloc, &dqp);
813 	if (error)
814 		return error;
815 
816 	error = xfs_qm_dqget_cache_insert(mp, qi, tree, id, dqp);
817 	if (error) {
818 		/*
819 		 * Duplicate found. Just throw away the new dquot and start
820 		 * over.
821 		 */
822 		xfs_qm_dqdestroy(dqp);
823 		XFS_STATS_INC(mp, xs_qm_dquot_dups);
824 		goto restart;
825 	}
826 
827 	trace_xfs_dqget_miss(dqp);
828 	*O_dqpp = dqp;
829 	return 0;
830 }
831 
832 /*
833  * Given a dquot id and type, read and initialize a dquot from the on-disk
834  * metadata.  This function is only for use during quota initialization so
835  * it ignores the dquot cache assuming that the dquot shrinker isn't set up.
836  * The caller is responsible for _qm_dqdestroy'ing the returned dquot.
837  */
838 int
xfs_qm_dqget_uncached(struct xfs_mount * mp,xfs_dqid_t id,uint type,struct xfs_dquot ** dqpp)839 xfs_qm_dqget_uncached(
840 	struct xfs_mount	*mp,
841 	xfs_dqid_t		id,
842 	uint			type,
843 	struct xfs_dquot	**dqpp)
844 {
845 	int			error;
846 
847 	error = xfs_qm_dqget_checks(mp, type);
848 	if (error)
849 		return error;
850 
851 	return xfs_qm_dqread(mp, id, type, 0, dqpp);
852 }
853 
854 /* Return the quota id for a given inode and type. */
855 xfs_dqid_t
xfs_qm_id_for_quotatype(struct xfs_inode * ip,uint type)856 xfs_qm_id_for_quotatype(
857 	struct xfs_inode	*ip,
858 	uint			type)
859 {
860 	switch (type) {
861 	case XFS_DQ_USER:
862 		return i_uid_read(VFS_I(ip));
863 	case XFS_DQ_GROUP:
864 		return i_gid_read(VFS_I(ip));
865 	case XFS_DQ_PROJ:
866 		return ip->i_d.di_projid;
867 	}
868 	ASSERT(0);
869 	return 0;
870 }
871 
872 /*
873  * Return the dquot for a given inode and type.  If @can_alloc is true, then
874  * allocate blocks if needed.  The inode's ILOCK must be held and it must not
875  * have already had an inode attached.
876  */
877 int
xfs_qm_dqget_inode(struct xfs_inode * ip,uint type,bool can_alloc,struct xfs_dquot ** O_dqpp)878 xfs_qm_dqget_inode(
879 	struct xfs_inode	*ip,
880 	uint			type,
881 	bool			can_alloc,
882 	struct xfs_dquot	**O_dqpp)
883 {
884 	struct xfs_mount	*mp = ip->i_mount;
885 	struct xfs_quotainfo	*qi = mp->m_quotainfo;
886 	struct radix_tree_root	*tree = xfs_dquot_tree(qi, type);
887 	struct xfs_dquot	*dqp;
888 	xfs_dqid_t		id;
889 	int			error;
890 
891 	error = xfs_qm_dqget_checks(mp, type);
892 	if (error)
893 		return error;
894 
895 	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
896 	ASSERT(xfs_inode_dquot(ip, type) == NULL);
897 
898 	id = xfs_qm_id_for_quotatype(ip, type);
899 
900 restart:
901 	dqp = xfs_qm_dqget_cache_lookup(mp, qi, tree, id);
902 	if (dqp) {
903 		*O_dqpp = dqp;
904 		return 0;
905 	}
906 
907 	/*
908 	 * Dquot cache miss. We don't want to keep the inode lock across
909 	 * a (potential) disk read. Also we don't want to deal with the lock
910 	 * ordering between quotainode and this inode. OTOH, dropping the inode
911 	 * lock here means dealing with a chown that can happen before
912 	 * we re-acquire the lock.
913 	 */
914 	xfs_iunlock(ip, XFS_ILOCK_EXCL);
915 	error = xfs_qm_dqread(mp, id, type, can_alloc, &dqp);
916 	xfs_ilock(ip, XFS_ILOCK_EXCL);
917 	if (error)
918 		return error;
919 
920 	/*
921 	 * A dquot could be attached to this inode by now, since we had
922 	 * dropped the ilock.
923 	 */
924 	if (xfs_this_quota_on(mp, type)) {
925 		struct xfs_dquot	*dqp1;
926 
927 		dqp1 = xfs_inode_dquot(ip, type);
928 		if (dqp1) {
929 			xfs_qm_dqdestroy(dqp);
930 			dqp = dqp1;
931 			xfs_dqlock(dqp);
932 			goto dqret;
933 		}
934 	} else {
935 		/* inode stays locked on return */
936 		xfs_qm_dqdestroy(dqp);
937 		return -ESRCH;
938 	}
939 
940 	error = xfs_qm_dqget_cache_insert(mp, qi, tree, id, dqp);
941 	if (error) {
942 		/*
943 		 * Duplicate found. Just throw away the new dquot and start
944 		 * over.
945 		 */
946 		xfs_qm_dqdestroy(dqp);
947 		XFS_STATS_INC(mp, xs_qm_dquot_dups);
948 		goto restart;
949 	}
950 
951 dqret:
952 	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
953 	trace_xfs_dqget_miss(dqp);
954 	*O_dqpp = dqp;
955 	return 0;
956 }
957 
958 /*
959  * Starting at @id and progressing upwards, look for an initialized incore
960  * dquot, lock it, and return it.
961  */
962 int
xfs_qm_dqget_next(struct xfs_mount * mp,xfs_dqid_t id,uint type,struct xfs_dquot ** dqpp)963 xfs_qm_dqget_next(
964 	struct xfs_mount	*mp,
965 	xfs_dqid_t		id,
966 	uint			type,
967 	struct xfs_dquot	**dqpp)
968 {
969 	struct xfs_dquot	*dqp;
970 	int			error = 0;
971 
972 	*dqpp = NULL;
973 	for (; !error; error = xfs_dq_get_next_id(mp, type, &id)) {
974 		error = xfs_qm_dqget(mp, id, type, false, &dqp);
975 		if (error == -ENOENT)
976 			continue;
977 		else if (error != 0)
978 			break;
979 
980 		if (!XFS_IS_DQUOT_UNINITIALIZED(dqp)) {
981 			*dqpp = dqp;
982 			return 0;
983 		}
984 
985 		xfs_qm_dqput(dqp);
986 	}
987 
988 	return error;
989 }
990 
991 /*
992  * Release a reference to the dquot (decrement ref-count) and unlock it.
993  *
994  * If there is a group quota attached to this dquot, carefully release that
995  * too without tripping over deadlocks'n'stuff.
996  */
997 void
xfs_qm_dqput(struct xfs_dquot * dqp)998 xfs_qm_dqput(
999 	struct xfs_dquot	*dqp)
1000 {
1001 	ASSERT(dqp->q_nrefs > 0);
1002 	ASSERT(XFS_DQ_IS_LOCKED(dqp));
1003 
1004 	trace_xfs_dqput(dqp);
1005 
1006 	if (--dqp->q_nrefs == 0) {
1007 		struct xfs_quotainfo	*qi = dqp->q_mount->m_quotainfo;
1008 		trace_xfs_dqput_free(dqp);
1009 
1010 		if (list_lru_add(&qi->qi_lru, &dqp->q_lru))
1011 			XFS_STATS_INC(dqp->q_mount, xs_qm_dquot_unused);
1012 	}
1013 	xfs_dqunlock(dqp);
1014 }
1015 
1016 /*
1017  * Release a dquot. Flush it if dirty, then dqput() it.
1018  * dquot must not be locked.
1019  */
1020 void
xfs_qm_dqrele(struct xfs_dquot * dqp)1021 xfs_qm_dqrele(
1022 	struct xfs_dquot	*dqp)
1023 {
1024 	if (!dqp)
1025 		return;
1026 
1027 	trace_xfs_dqrele(dqp);
1028 
1029 	xfs_dqlock(dqp);
1030 	/*
1031 	 * We don't care to flush it if the dquot is dirty here.
1032 	 * That will create stutters that we want to avoid.
1033 	 * Instead we do a delayed write when we try to reclaim
1034 	 * a dirty dquot. Also xfs_sync will take part of the burden...
1035 	 */
1036 	xfs_qm_dqput(dqp);
1037 }
1038 
1039 /*
1040  * This is the dquot flushing I/O completion routine.  It is called
1041  * from interrupt level when the buffer containing the dquot is
1042  * flushed to disk.  It is responsible for removing the dquot logitem
1043  * from the AIL if it has not been re-logged, and unlocking the dquot's
1044  * flush lock. This behavior is very similar to that of inodes..
1045  */
1046 STATIC void
xfs_qm_dqflush_done(struct xfs_buf * bp,struct xfs_log_item * lip)1047 xfs_qm_dqflush_done(
1048 	struct xfs_buf		*bp,
1049 	struct xfs_log_item	*lip)
1050 {
1051 	struct xfs_dq_logitem	*qip = (struct xfs_dq_logitem *)lip;
1052 	struct xfs_dquot	*dqp = qip->qli_dquot;
1053 	struct xfs_ail		*ailp = lip->li_ailp;
1054 
1055 	/*
1056 	 * We only want to pull the item from the AIL if its
1057 	 * location in the log has not changed since we started the flush.
1058 	 * Thus, we only bother if the dquot's lsn has
1059 	 * not changed. First we check the lsn outside the lock
1060 	 * since it's cheaper, and then we recheck while
1061 	 * holding the lock before removing the dquot from the AIL.
1062 	 */
1063 	if (test_bit(XFS_LI_IN_AIL, &lip->li_flags) &&
1064 	    ((lip->li_lsn == qip->qli_flush_lsn) ||
1065 	     test_bit(XFS_LI_FAILED, &lip->li_flags))) {
1066 
1067 		/* xfs_trans_ail_delete() drops the AIL lock. */
1068 		spin_lock(&ailp->ail_lock);
1069 		if (lip->li_lsn == qip->qli_flush_lsn) {
1070 			xfs_trans_ail_delete(ailp, lip, SHUTDOWN_CORRUPT_INCORE);
1071 		} else {
1072 			/*
1073 			 * Clear the failed state since we are about to drop the
1074 			 * flush lock
1075 			 */
1076 			xfs_clear_li_failed(lip);
1077 			spin_unlock(&ailp->ail_lock);
1078 		}
1079 	}
1080 
1081 	/*
1082 	 * Release the dq's flush lock since we're done with it.
1083 	 */
1084 	xfs_dqfunlock(dqp);
1085 }
1086 
1087 /*
1088  * Write a modified dquot to disk.
1089  * The dquot must be locked and the flush lock too taken by caller.
1090  * The flush lock will not be unlocked until the dquot reaches the disk,
1091  * but the dquot is free to be unlocked and modified by the caller
1092  * in the interim. Dquot is still locked on return. This behavior is
1093  * identical to that of inodes.
1094  */
1095 int
xfs_qm_dqflush(struct xfs_dquot * dqp,struct xfs_buf ** bpp)1096 xfs_qm_dqflush(
1097 	struct xfs_dquot	*dqp,
1098 	struct xfs_buf		**bpp)
1099 {
1100 	struct xfs_mount	*mp = dqp->q_mount;
1101 	struct xfs_buf		*bp;
1102 	struct xfs_dqblk	*dqb;
1103 	struct xfs_disk_dquot	*ddqp;
1104 	xfs_failaddr_t		fa;
1105 	int			error;
1106 
1107 	ASSERT(XFS_DQ_IS_LOCKED(dqp));
1108 	ASSERT(!completion_done(&dqp->q_flush));
1109 
1110 	trace_xfs_dqflush(dqp);
1111 
1112 	*bpp = NULL;
1113 
1114 	xfs_qm_dqunpin_wait(dqp);
1115 
1116 	/*
1117 	 * This may have been unpinned because the filesystem is shutting
1118 	 * down forcibly. If that's the case we must not write this dquot
1119 	 * to disk, because the log record didn't make it to disk.
1120 	 *
1121 	 * We also have to remove the log item from the AIL in this case,
1122 	 * as we wait for an emptry AIL as part of the unmount process.
1123 	 */
1124 	if (XFS_FORCED_SHUTDOWN(mp)) {
1125 		struct xfs_log_item	*lip = &dqp->q_logitem.qli_item;
1126 		dqp->dq_flags &= ~XFS_DQ_DIRTY;
1127 
1128 		xfs_trans_ail_remove(lip, SHUTDOWN_CORRUPT_INCORE);
1129 
1130 		error = -EIO;
1131 		goto out_unlock;
1132 	}
1133 
1134 	/*
1135 	 * Get the buffer containing the on-disk dquot
1136 	 */
1137 	error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dqp->q_blkno,
1138 				   mp->m_quotainfo->qi_dqchunklen, XBF_TRYLOCK,
1139 				   &bp, &xfs_dquot_buf_ops);
1140 	if (error)
1141 		goto out_unlock;
1142 
1143 	/*
1144 	 * Calculate the location of the dquot inside the buffer.
1145 	 */
1146 	dqb = bp->b_addr + dqp->q_bufoffset;
1147 	ddqp = &dqb->dd_diskdq;
1148 
1149 	/* sanity check the in-core structure before we flush */
1150 	fa = xfs_dquot_verify(mp, &dqp->q_core, be32_to_cpu(dqp->q_core.d_id),
1151 			      0);
1152 	if (fa) {
1153 		xfs_alert(mp, "corrupt dquot ID 0x%x in memory at %pS",
1154 				be32_to_cpu(dqp->q_core.d_id), fa);
1155 		xfs_buf_relse(bp);
1156 		xfs_dqfunlock(dqp);
1157 		xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
1158 		return -EFSCORRUPTED;
1159 	}
1160 
1161 	/* This is the only portion of data that needs to persist */
1162 	memcpy(ddqp, &dqp->q_core, sizeof(struct xfs_disk_dquot));
1163 
1164 	/*
1165 	 * Clear the dirty field and remember the flush lsn for later use.
1166 	 */
1167 	dqp->dq_flags &= ~XFS_DQ_DIRTY;
1168 
1169 	xfs_trans_ail_copy_lsn(mp->m_ail, &dqp->q_logitem.qli_flush_lsn,
1170 					&dqp->q_logitem.qli_item.li_lsn);
1171 
1172 	/*
1173 	 * copy the lsn into the on-disk dquot now while we have the in memory
1174 	 * dquot here. This can't be done later in the write verifier as we
1175 	 * can't get access to the log item at that point in time.
1176 	 *
1177 	 * We also calculate the CRC here so that the on-disk dquot in the
1178 	 * buffer always has a valid CRC. This ensures there is no possibility
1179 	 * of a dquot without an up-to-date CRC getting to disk.
1180 	 */
1181 	if (xfs_sb_version_hascrc(&mp->m_sb)) {
1182 		dqb->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn);
1183 		xfs_update_cksum((char *)dqb, sizeof(struct xfs_dqblk),
1184 				 XFS_DQUOT_CRC_OFF);
1185 	}
1186 
1187 	/*
1188 	 * Attach an iodone routine so that we can remove this dquot from the
1189 	 * AIL and release the flush lock once the dquot is synced to disk.
1190 	 */
1191 	xfs_buf_attach_iodone(bp, xfs_qm_dqflush_done,
1192 				  &dqp->q_logitem.qli_item);
1193 
1194 	/*
1195 	 * If the buffer is pinned then push on the log so we won't
1196 	 * get stuck waiting in the write for too long.
1197 	 */
1198 	if (xfs_buf_ispinned(bp)) {
1199 		trace_xfs_dqflush_force(dqp);
1200 		xfs_log_force(mp, 0);
1201 	}
1202 
1203 	trace_xfs_dqflush_done(dqp);
1204 	*bpp = bp;
1205 	return 0;
1206 
1207 out_unlock:
1208 	xfs_dqfunlock(dqp);
1209 	return error;
1210 }
1211 
1212 /*
1213  * Lock two xfs_dquot structures.
1214  *
1215  * To avoid deadlocks we always lock the quota structure with
1216  * the lowerd id first.
1217  */
1218 void
xfs_dqlock2(struct xfs_dquot * d1,struct xfs_dquot * d2)1219 xfs_dqlock2(
1220 	struct xfs_dquot	*d1,
1221 	struct xfs_dquot	*d2)
1222 {
1223 	if (d1 && d2) {
1224 		ASSERT(d1 != d2);
1225 		if (be32_to_cpu(d1->q_core.d_id) >
1226 		    be32_to_cpu(d2->q_core.d_id)) {
1227 			mutex_lock(&d2->q_qlock);
1228 			mutex_lock_nested(&d1->q_qlock, XFS_QLOCK_NESTED);
1229 		} else {
1230 			mutex_lock(&d1->q_qlock);
1231 			mutex_lock_nested(&d2->q_qlock, XFS_QLOCK_NESTED);
1232 		}
1233 	} else if (d1) {
1234 		mutex_lock(&d1->q_qlock);
1235 	} else if (d2) {
1236 		mutex_lock(&d2->q_qlock);
1237 	}
1238 }
1239 
1240 int __init
xfs_qm_init(void)1241 xfs_qm_init(void)
1242 {
1243 	xfs_qm_dqzone =
1244 		kmem_zone_init(sizeof(struct xfs_dquot), "xfs_dquot");
1245 	if (!xfs_qm_dqzone)
1246 		goto out;
1247 
1248 	xfs_qm_dqtrxzone =
1249 		kmem_zone_init(sizeof(struct xfs_dquot_acct), "xfs_dqtrx");
1250 	if (!xfs_qm_dqtrxzone)
1251 		goto out_free_dqzone;
1252 
1253 	return 0;
1254 
1255 out_free_dqzone:
1256 	kmem_zone_destroy(xfs_qm_dqzone);
1257 out:
1258 	return -ENOMEM;
1259 }
1260 
1261 void
xfs_qm_exit(void)1262 xfs_qm_exit(void)
1263 {
1264 	kmem_zone_destroy(xfs_qm_dqtrxzone);
1265 	kmem_zone_destroy(xfs_qm_dqzone);
1266 }
1267 
1268 /*
1269  * Iterate every dquot of a particular type.  The caller must ensure that the
1270  * particular quota type is active.  iter_fn can return negative error codes,
1271  * or -ECANCELED to indicate that it wants to stop iterating.
1272  */
1273 int
xfs_qm_dqiterate(struct xfs_mount * mp,uint dqtype,xfs_qm_dqiterate_fn iter_fn,void * priv)1274 xfs_qm_dqiterate(
1275 	struct xfs_mount	*mp,
1276 	uint			dqtype,
1277 	xfs_qm_dqiterate_fn	iter_fn,
1278 	void			*priv)
1279 {
1280 	struct xfs_dquot	*dq;
1281 	xfs_dqid_t		id = 0;
1282 	int			error;
1283 
1284 	do {
1285 		error = xfs_qm_dqget_next(mp, id, dqtype, &dq);
1286 		if (error == -ENOENT)
1287 			return 0;
1288 		if (error)
1289 			return error;
1290 
1291 		error = iter_fn(dq, dqtype, priv);
1292 		id = be32_to_cpu(dq->q_core.d_id);
1293 		xfs_qm_dqput(dq);
1294 		id++;
1295 	} while (error == 0 && id != 0);
1296 
1297 	return error;
1298 }
1299