xfs: convert the dquot free list to use list heads
[pandora-kernel.git] / fs / xfs / quota / xfs_qm.c
1 /*
2  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
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
7  * published by the Free Software Foundation.
8  *
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.
13  *
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
17  */
18 #include "xfs.h"
19 #include "xfs_fs.h"
20 #include "xfs_bit.h"
21 #include "xfs_log.h"
22 #include "xfs_inum.h"
23 #include "xfs_trans.h"
24 #include "xfs_sb.h"
25 #include "xfs_ag.h"
26 #include "xfs_dir2.h"
27 #include "xfs_alloc.h"
28 #include "xfs_dmapi.h"
29 #include "xfs_quota.h"
30 #include "xfs_mount.h"
31 #include "xfs_bmap_btree.h"
32 #include "xfs_alloc_btree.h"
33 #include "xfs_ialloc_btree.h"
34 #include "xfs_dir2_sf.h"
35 #include "xfs_attr_sf.h"
36 #include "xfs_dinode.h"
37 #include "xfs_inode.h"
38 #include "xfs_btree.h"
39 #include "xfs_ialloc.h"
40 #include "xfs_itable.h"
41 #include "xfs_rtalloc.h"
42 #include "xfs_error.h"
43 #include "xfs_bmap.h"
44 #include "xfs_rw.h"
45 #include "xfs_attr.h"
46 #include "xfs_buf_item.h"
47 #include "xfs_trans_space.h"
48 #include "xfs_utils.h"
49 #include "xfs_qm.h"
50 #include "xfs_trace.h"
51
52 /*
53  * The global quota manager. There is only one of these for the entire
54  * system, _not_ one per file system. XQM keeps track of the overall
55  * quota functionality, including maintaining the freelist and hash
56  * tables of dquots.
57  */
58 struct mutex    xfs_Gqm_lock;
59 struct xfs_qm   *xfs_Gqm;
60 uint            ndquot;
61
62 kmem_zone_t     *qm_dqzone;
63 kmem_zone_t     *qm_dqtrxzone;
64
65 static cred_t   xfs_zerocr;
66
67 STATIC void     xfs_qm_list_init(xfs_dqlist_t *, char *, int);
68 STATIC void     xfs_qm_list_destroy(xfs_dqlist_t *);
69
70 STATIC int      xfs_qm_init_quotainos(xfs_mount_t *);
71 STATIC int      xfs_qm_init_quotainfo(xfs_mount_t *);
72 STATIC int      xfs_qm_shake(int, gfp_t);
73
74 static struct shrinker xfs_qm_shaker = {
75         .shrink = xfs_qm_shake,
76         .seeks = DEFAULT_SEEKS,
77 };
78
79 #ifdef DEBUG
80 extern struct mutex     qcheck_lock;
81 #endif
82
83 #ifdef QUOTADEBUG
84 static void
85 xfs_qm_dquot_list_print(
86         struct xfs_mount *mp)
87 {
88         xfs_dquot_t     *dqp;
89         int             i = 0;
90
91         list_for_each_entry(dqp, &mp->m_quotainfo->qi_dqlist_lock, qi_mplist) {
92                 cmn_err(CE_DEBUG, "   %d. \"%d (%s)\"   "
93                                   "bcnt = %lld, icnt = %lld, refs = %d",
94                         i++, be32_to_cpu(dqp->q_core.d_id),
95                         DQFLAGTO_TYPESTR(dqp),
96                         (long long)be64_to_cpu(dqp->q_core.d_bcount),
97                         (long long)be64_to_cpu(dqp->q_core.d_icount),
98                         dqp->q_nrefs);
99         }
100 }
101 #else
102 static void xfs_qm_dquot_list_print(struct xfs_mount *mp) { }
103 #endif
104
105 /*
106  * Initialize the XQM structure.
107  * Note that there is not one quota manager per file system.
108  */
109 STATIC struct xfs_qm *
110 xfs_Gqm_init(void)
111 {
112         xfs_dqhash_t    *udqhash, *gdqhash;
113         xfs_qm_t        *xqm;
114         size_t          hsize;
115         uint            i;
116
117         /*
118          * Initialize the dquot hash tables.
119          */
120         udqhash = kmem_zalloc_greedy(&hsize,
121                                      XFS_QM_HASHSIZE_LOW * sizeof(xfs_dqhash_t),
122                                      XFS_QM_HASHSIZE_HIGH * sizeof(xfs_dqhash_t));
123         if (!udqhash)
124                 goto out;
125
126         gdqhash = kmem_zalloc_large(hsize);
127         if (!gdqhash)
128                 goto out_free_udqhash;
129
130         hsize /= sizeof(xfs_dqhash_t);
131         ndquot = hsize << 8;
132
133         xqm = kmem_zalloc(sizeof(xfs_qm_t), KM_SLEEP);
134         xqm->qm_dqhashmask = hsize - 1;
135         xqm->qm_usr_dqhtable = udqhash;
136         xqm->qm_grp_dqhtable = gdqhash;
137         ASSERT(xqm->qm_usr_dqhtable != NULL);
138         ASSERT(xqm->qm_grp_dqhtable != NULL);
139
140         for (i = 0; i < hsize; i++) {
141                 xfs_qm_list_init(&(xqm->qm_usr_dqhtable[i]), "uxdqh", i);
142                 xfs_qm_list_init(&(xqm->qm_grp_dqhtable[i]), "gxdqh", i);
143         }
144
145         /*
146          * Freelist of all dquots of all file systems
147          */
148         INIT_LIST_HEAD(&xqm->qm_dqfrlist);
149         xqm->qm_dqfrlist_cnt = 0;
150         mutex_init(&xqm->qm_dqfrlist_lock);
151
152         /*
153          * dquot zone. we register our own low-memory callback.
154          */
155         if (!qm_dqzone) {
156                 xqm->qm_dqzone = kmem_zone_init(sizeof(xfs_dquot_t),
157                                                 "xfs_dquots");
158                 qm_dqzone = xqm->qm_dqzone;
159         } else
160                 xqm->qm_dqzone = qm_dqzone;
161
162         register_shrinker(&xfs_qm_shaker);
163
164         /*
165          * The t_dqinfo portion of transactions.
166          */
167         if (!qm_dqtrxzone) {
168                 xqm->qm_dqtrxzone = kmem_zone_init(sizeof(xfs_dquot_acct_t),
169                                                    "xfs_dqtrx");
170                 qm_dqtrxzone = xqm->qm_dqtrxzone;
171         } else
172                 xqm->qm_dqtrxzone = qm_dqtrxzone;
173
174         atomic_set(&xqm->qm_totaldquots, 0);
175         xqm->qm_dqfree_ratio = XFS_QM_DQFREE_RATIO;
176         xqm->qm_nrefs = 0;
177 #ifdef DEBUG
178         mutex_init(&qcheck_lock);
179 #endif
180         return xqm;
181
182  out_free_udqhash:
183         kmem_free_large(udqhash);
184  out:
185         return NULL;
186 }
187
188 /*
189  * Destroy the global quota manager when its reference count goes to zero.
190  */
191 STATIC void
192 xfs_qm_destroy(
193         struct xfs_qm   *xqm)
194 {
195         struct xfs_dquot *dqp, *n;
196         int             hsize, i;
197
198         ASSERT(xqm != NULL);
199         ASSERT(xqm->qm_nrefs == 0);
200         unregister_shrinker(&xfs_qm_shaker);
201         hsize = xqm->qm_dqhashmask + 1;
202         for (i = 0; i < hsize; i++) {
203                 xfs_qm_list_destroy(&(xqm->qm_usr_dqhtable[i]));
204                 xfs_qm_list_destroy(&(xqm->qm_grp_dqhtable[i]));
205         }
206         kmem_free_large(xqm->qm_usr_dqhtable);
207         kmem_free_large(xqm->qm_grp_dqhtable);
208         xqm->qm_usr_dqhtable = NULL;
209         xqm->qm_grp_dqhtable = NULL;
210         xqm->qm_dqhashmask = 0;
211
212         /* frlist cleanup */
213         mutex_lock(&xqm->qm_dqfrlist_lock);
214         list_for_each_entry_safe(dqp, n, &xqm->qm_dqfrlist, q_freelist) {
215                 xfs_dqlock(dqp);
216 #ifdef QUOTADEBUG
217                 cmn_err(CE_DEBUG, "FREELIST destroy 0x%p", dqp);
218 #endif
219                 list_del_init(&dqp->q_freelist);
220                 xfs_Gqm->qm_dqfrlist_cnt--;
221                 xfs_dqunlock(dqp);
222                 xfs_qm_dqdestroy(dqp);
223         }
224         mutex_unlock(&xqm->qm_dqfrlist_lock);
225         mutex_destroy(&xqm->qm_dqfrlist_lock);
226 #ifdef DEBUG
227         mutex_destroy(&qcheck_lock);
228 #endif
229         kmem_free(xqm);
230 }
231
232 /*
233  * Called at mount time to let XQM know that another file system is
234  * starting quotas. This isn't crucial information as the individual mount
235  * structures are pretty independent, but it helps the XQM keep a
236  * global view of what's going on.
237  */
238 /* ARGSUSED */
239 STATIC int
240 xfs_qm_hold_quotafs_ref(
241         struct xfs_mount *mp)
242 {
243         /*
244          * Need to lock the xfs_Gqm structure for things like this. For example,
245          * the structure could disappear between the entry to this routine and
246          * a HOLD operation if not locked.
247          */
248         mutex_lock(&xfs_Gqm_lock);
249
250         if (!xfs_Gqm) {
251                 xfs_Gqm = xfs_Gqm_init();
252                 if (!xfs_Gqm)
253                         return ENOMEM;
254         }
255
256         /*
257          * We can keep a list of all filesystems with quotas mounted for
258          * debugging and statistical purposes, but ...
259          * Just take a reference and get out.
260          */
261         xfs_Gqm->qm_nrefs++;
262         mutex_unlock(&xfs_Gqm_lock);
263
264         return 0;
265 }
266
267
268 /*
269  * Release the reference that a filesystem took at mount time,
270  * so that we know when we need to destroy the entire quota manager.
271  */
272 /* ARGSUSED */
273 STATIC void
274 xfs_qm_rele_quotafs_ref(
275         struct xfs_mount *mp)
276 {
277         xfs_dquot_t     *dqp, *n;
278
279         ASSERT(xfs_Gqm);
280         ASSERT(xfs_Gqm->qm_nrefs > 0);
281
282         /*
283          * Go thru the freelist and destroy all inactive dquots.
284          */
285         mutex_lock(&xfs_Gqm->qm_dqfrlist_lock);
286
287         list_for_each_entry_safe(dqp, n, &xfs_Gqm->qm_dqfrlist, q_freelist) {
288                 xfs_dqlock(dqp);
289                 if (dqp->dq_flags & XFS_DQ_INACTIVE) {
290                         ASSERT(dqp->q_mount == NULL);
291                         ASSERT(! XFS_DQ_IS_DIRTY(dqp));
292                         ASSERT(list_empty(&dqp->q_hashlist));
293                         ASSERT(list_empty(&dqp->q_mplist));
294                         list_del_init(&dqp->q_freelist);
295                         xfs_Gqm->qm_dqfrlist_cnt--;
296                         xfs_dqunlock(dqp);
297                         xfs_qm_dqdestroy(dqp);
298                 } else {
299                         xfs_dqunlock(dqp);
300                 }
301         }
302         mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock);
303
304         /*
305          * Destroy the entire XQM. If somebody mounts with quotaon, this'll
306          * be restarted.
307          */
308         mutex_lock(&xfs_Gqm_lock);
309         if (--xfs_Gqm->qm_nrefs == 0) {
310                 xfs_qm_destroy(xfs_Gqm);
311                 xfs_Gqm = NULL;
312         }
313         mutex_unlock(&xfs_Gqm_lock);
314 }
315
316 /*
317  * Just destroy the quotainfo structure.
318  */
319 void
320 xfs_qm_unmount(
321         struct xfs_mount        *mp)
322 {
323         if (mp->m_quotainfo) {
324                 xfs_qm_dqpurge_all(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING);
325                 xfs_qm_destroy_quotainfo(mp);
326         }
327 }
328
329
330 /*
331  * This is called from xfs_mountfs to start quotas and initialize all
332  * necessary data structures like quotainfo.  This is also responsible for
333  * running a quotacheck as necessary.  We are guaranteed that the superblock
334  * is consistently read in at this point.
335  *
336  * If we fail here, the mount will continue with quota turned off. We don't
337  * need to inidicate success or failure at all.
338  */
339 void
340 xfs_qm_mount_quotas(
341         xfs_mount_t     *mp)
342 {
343         int             error = 0;
344         uint            sbf;
345
346         /*
347          * If quotas on realtime volumes is not supported, we disable
348          * quotas immediately.
349          */
350         if (mp->m_sb.sb_rextents) {
351                 cmn_err(CE_NOTE,
352                         "Cannot turn on quotas for realtime filesystem %s",
353                         mp->m_fsname);
354                 mp->m_qflags = 0;
355                 goto write_changes;
356         }
357
358         ASSERT(XFS_IS_QUOTA_RUNNING(mp));
359
360         /*
361          * Allocate the quotainfo structure inside the mount struct, and
362          * create quotainode(s), and change/rev superblock if necessary.
363          */
364         error = xfs_qm_init_quotainfo(mp);
365         if (error) {
366                 /*
367                  * We must turn off quotas.
368                  */
369                 ASSERT(mp->m_quotainfo == NULL);
370                 mp->m_qflags = 0;
371                 goto write_changes;
372         }
373         /*
374          * If any of the quotas are not consistent, do a quotacheck.
375          */
376         if (XFS_QM_NEED_QUOTACHECK(mp)) {
377                 error = xfs_qm_quotacheck(mp);
378                 if (error) {
379                         /* Quotacheck failed and disabled quotas. */
380                         return;
381                 }
382         }
383         /* 
384          * If one type of quotas is off, then it will lose its
385          * quotachecked status, since we won't be doing accounting for
386          * that type anymore.
387          */
388         if (!XFS_IS_UQUOTA_ON(mp))
389                 mp->m_qflags &= ~XFS_UQUOTA_CHKD;
390         if (!(XFS_IS_GQUOTA_ON(mp) || XFS_IS_PQUOTA_ON(mp)))
391                 mp->m_qflags &= ~XFS_OQUOTA_CHKD;
392
393  write_changes:
394         /*
395          * We actually don't have to acquire the m_sb_lock at all.
396          * This can only be called from mount, and that's single threaded. XXX
397          */
398         spin_lock(&mp->m_sb_lock);
399         sbf = mp->m_sb.sb_qflags;
400         mp->m_sb.sb_qflags = mp->m_qflags & XFS_MOUNT_QUOTA_ALL;
401         spin_unlock(&mp->m_sb_lock);
402
403         if (sbf != (mp->m_qflags & XFS_MOUNT_QUOTA_ALL)) {
404                 if (xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS)) {
405                         /*
406                          * We could only have been turning quotas off.
407                          * We aren't in very good shape actually because
408                          * the incore structures are convinced that quotas are
409                          * off, but the on disk superblock doesn't know that !
410                          */
411                         ASSERT(!(XFS_IS_QUOTA_RUNNING(mp)));
412                         xfs_fs_cmn_err(CE_ALERT, mp,
413                                 "XFS mount_quotas: Superblock update failed!");
414                 }
415         }
416
417         if (error) {
418                 xfs_fs_cmn_err(CE_WARN, mp,
419                         "Failed to initialize disk quotas.");
420                 return;
421         }
422
423 #ifdef QUOTADEBUG
424         if (XFS_IS_QUOTA_ON(mp))
425                 xfs_qm_internalqcheck(mp);
426 #endif
427 }
428
429 /*
430  * Called from the vfsops layer.
431  */
432 void
433 xfs_qm_unmount_quotas(
434         xfs_mount_t     *mp)
435 {
436         /*
437          * Release the dquots that root inode, et al might be holding,
438          * before we flush quotas and blow away the quotainfo structure.
439          */
440         ASSERT(mp->m_rootip);
441         xfs_qm_dqdetach(mp->m_rootip);
442         if (mp->m_rbmip)
443                 xfs_qm_dqdetach(mp->m_rbmip);
444         if (mp->m_rsumip)
445                 xfs_qm_dqdetach(mp->m_rsumip);
446
447         /*
448          * Release the quota inodes.
449          */
450         if (mp->m_quotainfo) {
451                 if (mp->m_quotainfo->qi_uquotaip) {
452                         IRELE(mp->m_quotainfo->qi_uquotaip);
453                         mp->m_quotainfo->qi_uquotaip = NULL;
454                 }
455                 if (mp->m_quotainfo->qi_gquotaip) {
456                         IRELE(mp->m_quotainfo->qi_gquotaip);
457                         mp->m_quotainfo->qi_gquotaip = NULL;
458                 }
459         }
460 }
461
462 /*
463  * Flush all dquots of the given file system to disk. The dquots are
464  * _not_ purged from memory here, just their data written to disk.
465  */
466 STATIC int
467 xfs_qm_dqflush_all(
468         xfs_mount_t     *mp,
469         int             sync_mode)
470 {
471         int             recl;
472         xfs_dquot_t     *dqp;
473         int             niters;
474         int             error;
475
476         if (mp->m_quotainfo == NULL)
477                 return 0;
478         niters = 0;
479 again:
480         mutex_lock(&mp->m_quotainfo->qi_dqlist_lock);
481         list_for_each_entry(dqp, &mp->m_quotainfo->qi_dqlist, q_mplist) {
482                 xfs_dqlock(dqp);
483                 if (! XFS_DQ_IS_DIRTY(dqp)) {
484                         xfs_dqunlock(dqp);
485                         continue;
486                 }
487
488                 /* XXX a sentinel would be better */
489                 recl = mp->m_quotainfo->qi_dqreclaims;
490                 if (!xfs_dqflock_nowait(dqp)) {
491                         /*
492                          * If we can't grab the flush lock then check
493                          * to see if the dquot has been flushed delayed
494                          * write.  If so, grab its buffer and send it
495                          * out immediately.  We'll be able to acquire
496                          * the flush lock when the I/O completes.
497                          */
498                         xfs_qm_dqflock_pushbuf_wait(dqp);
499                 }
500                 /*
501                  * Let go of the mplist lock. We don't want to hold it
502                  * across a disk write.
503                  */
504                 mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock);
505                 error = xfs_qm_dqflush(dqp, sync_mode);
506                 xfs_dqunlock(dqp);
507                 if (error)
508                         return error;
509
510                 mutex_lock(&mp->m_quotainfo->qi_dqlist_lock);
511                 if (recl != mp->m_quotainfo->qi_dqreclaims) {
512                         mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock);
513                         /* XXX restart limit */
514                         goto again;
515                 }
516         }
517
518         mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock);
519         /* return ! busy */
520         return 0;
521 }
522 /*
523  * Release the group dquot pointers the user dquots may be
524  * carrying around as a hint. mplist is locked on entry and exit.
525  */
526 STATIC void
527 xfs_qm_detach_gdquots(
528         xfs_mount_t     *mp)
529 {
530         xfs_dquot_t     *dqp, *gdqp;
531         int             nrecl;
532
533  again:
534         ASSERT(mutex_is_locked(&mp->m_quotainfo->qi_dqlist_lock));
535         list_for_each_entry(dqp, &mp->m_quotainfo->qi_dqlist, q_mplist) {
536                 xfs_dqlock(dqp);
537                 if ((gdqp = dqp->q_gdquot)) {
538                         xfs_dqlock(gdqp);
539                         dqp->q_gdquot = NULL;
540                 }
541                 xfs_dqunlock(dqp);
542
543                 if (gdqp) {
544                         /*
545                          * Can't hold the mplist lock across a dqput.
546                          * XXXmust convert to marker based iterations here.
547                          */
548                         nrecl = mp->m_quotainfo->qi_dqreclaims;
549                         mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock);
550                         xfs_qm_dqput(gdqp);
551
552                         mutex_lock(&mp->m_quotainfo->qi_dqlist_lock);
553                         if (nrecl != mp->m_quotainfo->qi_dqreclaims)
554                                 goto again;
555                 }
556         }
557 }
558
559 /*
560  * Go through all the incore dquots of this file system and take them
561  * off the mplist and hashlist, if the dquot type matches the dqtype
562  * parameter. This is used when turning off quota accounting for
563  * users and/or groups, as well as when the filesystem is unmounting.
564  */
565 STATIC int
566 xfs_qm_dqpurge_int(
567         xfs_mount_t     *mp,
568         uint            flags) /* QUOTAOFF/UMOUNTING/UQUOTA/PQUOTA/GQUOTA */
569 {
570         xfs_dquot_t     *dqp, *n;
571         uint            dqtype;
572         int             nrecl;
573         int             nmisses;
574
575         if (mp->m_quotainfo == NULL)
576                 return 0;
577
578         dqtype = (flags & XFS_QMOPT_UQUOTA) ? XFS_DQ_USER : 0;
579         dqtype |= (flags & XFS_QMOPT_PQUOTA) ? XFS_DQ_PROJ : 0;
580         dqtype |= (flags & XFS_QMOPT_GQUOTA) ? XFS_DQ_GROUP : 0;
581
582         mutex_lock(&mp->m_quotainfo->qi_dqlist_lock);
583
584         /*
585          * In the first pass through all incore dquots of this filesystem,
586          * we release the group dquot pointers the user dquots may be
587          * carrying around as a hint. We need to do this irrespective of
588          * what's being turned off.
589          */
590         xfs_qm_detach_gdquots(mp);
591
592       again:
593         nmisses = 0;
594         ASSERT(mutex_is_locked(&mp->m_quotainfo->qi_dqlist_lock));
595         /*
596          * Try to get rid of all of the unwanted dquots. The idea is to
597          * get them off mplist and hashlist, but leave them on freelist.
598          */
599         list_for_each_entry_safe(dqp, n, &mp->m_quotainfo->qi_dqlist, q_mplist) {
600                 /*
601                  * It's OK to look at the type without taking dqlock here.
602                  * We're holding the mplist lock here, and that's needed for
603                  * a dqreclaim.
604                  */
605                 if ((dqp->dq_flags & dqtype) == 0)
606                         continue;
607
608                 if (!mutex_trylock(&dqp->q_hash->qh_lock)) {
609                         nrecl = mp->m_quotainfo->qi_dqreclaims;
610                         mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock);
611                         mutex_lock(&dqp->q_hash->qh_lock);
612                         mutex_lock(&mp->m_quotainfo->qi_dqlist_lock);
613
614                         /*
615                          * XXXTheoretically, we can get into a very long
616                          * ping pong game here.
617                          * No one can be adding dquots to the mplist at
618                          * this point, but somebody might be taking things off.
619                          */
620                         if (nrecl != mp->m_quotainfo->qi_dqreclaims) {
621                                 mutex_unlock(&dqp->q_hash->qh_lock);
622                                 goto again;
623                         }
624                 }
625
626                 /*
627                  * Take the dquot off the mplist and hashlist. It may remain on
628                  * freelist in INACTIVE state.
629                  */
630                 nmisses += xfs_qm_dqpurge(dqp);
631         }
632         mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock);
633         return nmisses;
634 }
635
636 int
637 xfs_qm_dqpurge_all(
638         xfs_mount_t     *mp,
639         uint            flags)
640 {
641         int             ndquots;
642
643         /*
644          * Purge the dquot cache.
645          * None of the dquots should really be busy at this point.
646          */
647         if (mp->m_quotainfo) {
648                 while ((ndquots = xfs_qm_dqpurge_int(mp, flags))) {
649                         delay(ndquots * 10);
650                 }
651         }
652         return 0;
653 }
654
655 STATIC int
656 xfs_qm_dqattach_one(
657         xfs_inode_t     *ip,
658         xfs_dqid_t      id,
659         uint            type,
660         uint            doalloc,
661         xfs_dquot_t     *udqhint, /* hint */
662         xfs_dquot_t     **IO_idqpp)
663 {
664         xfs_dquot_t     *dqp;
665         int             error;
666
667         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
668         error = 0;
669
670         /*
671          * See if we already have it in the inode itself. IO_idqpp is
672          * &i_udquot or &i_gdquot. This made the code look weird, but
673          * made the logic a lot simpler.
674          */
675         dqp = *IO_idqpp;
676         if (dqp) {
677                 trace_xfs_dqattach_found(dqp);
678                 return 0;
679         }
680
681         /*
682          * udqhint is the i_udquot field in inode, and is non-NULL only
683          * when the type arg is group/project. Its purpose is to save a
684          * lookup by dqid (xfs_qm_dqget) by caching a group dquot inside
685          * the user dquot.
686          */
687         if (udqhint) {
688                 ASSERT(type == XFS_DQ_GROUP || type == XFS_DQ_PROJ);
689                 xfs_dqlock(udqhint);
690
691                 /*
692                  * No need to take dqlock to look at the id.
693                  *
694                  * The ID can't change until it gets reclaimed, and it won't
695                  * be reclaimed as long as we have a ref from inode and we
696                  * hold the ilock.
697                  */
698                 dqp = udqhint->q_gdquot;
699                 if (dqp && be32_to_cpu(dqp->q_core.d_id) == id) {
700                         xfs_dqlock(dqp);
701                         XFS_DQHOLD(dqp);
702                         ASSERT(*IO_idqpp == NULL);
703                         *IO_idqpp = dqp;
704
705                         xfs_dqunlock(dqp);
706                         xfs_dqunlock(udqhint);
707                         return 0;
708                 }
709
710                 /*
711                  * We can't hold a dquot lock when we call the dqget code.
712                  * We'll deadlock in no time, because of (not conforming to)
713                  * lock ordering - the inodelock comes before any dquot lock,
714                  * and we may drop and reacquire the ilock in xfs_qm_dqget().
715                  */
716                 xfs_dqunlock(udqhint);
717         }
718
719         /*
720          * Find the dquot from somewhere. This bumps the
721          * reference count of dquot and returns it locked.
722          * This can return ENOENT if dquot didn't exist on
723          * disk and we didn't ask it to allocate;
724          * ESRCH if quotas got turned off suddenly.
725          */
726         error = xfs_qm_dqget(ip->i_mount, ip, id, type, XFS_QMOPT_DOWARN, &dqp);
727         if (error)
728                 return error;
729
730         trace_xfs_dqattach_get(dqp);
731
732         /*
733          * dqget may have dropped and re-acquired the ilock, but it guarantees
734          * that the dquot returned is the one that should go in the inode.
735          */
736         *IO_idqpp = dqp;
737         xfs_dqunlock(dqp);
738         return 0;
739 }
740
741
742 /*
743  * Given a udquot and gdquot, attach a ptr to the group dquot in the
744  * udquot as a hint for future lookups. The idea sounds simple, but the
745  * execution isn't, because the udquot might have a group dquot attached
746  * already and getting rid of that gets us into lock ordering constraints.
747  * The process is complicated more by the fact that the dquots may or may not
748  * be locked on entry.
749  */
750 STATIC void
751 xfs_qm_dqattach_grouphint(
752         xfs_dquot_t     *udq,
753         xfs_dquot_t     *gdq)
754 {
755         xfs_dquot_t     *tmp;
756
757         xfs_dqlock(udq);
758
759         if ((tmp = udq->q_gdquot)) {
760                 if (tmp == gdq) {
761                         xfs_dqunlock(udq);
762                         return;
763                 }
764
765                 udq->q_gdquot = NULL;
766                 /*
767                  * We can't keep any dqlocks when calling dqrele,
768                  * because the freelist lock comes before dqlocks.
769                  */
770                 xfs_dqunlock(udq);
771                 /*
772                  * we took a hard reference once upon a time in dqget,
773                  * so give it back when the udquot no longer points at it
774                  * dqput() does the unlocking of the dquot.
775                  */
776                 xfs_qm_dqrele(tmp);
777
778                 xfs_dqlock(udq);
779                 xfs_dqlock(gdq);
780
781         } else {
782                 ASSERT(XFS_DQ_IS_LOCKED(udq));
783                 xfs_dqlock(gdq);
784         }
785
786         ASSERT(XFS_DQ_IS_LOCKED(udq));
787         ASSERT(XFS_DQ_IS_LOCKED(gdq));
788         /*
789          * Somebody could have attached a gdquot here,
790          * when we dropped the uqlock. If so, just do nothing.
791          */
792         if (udq->q_gdquot == NULL) {
793                 XFS_DQHOLD(gdq);
794                 udq->q_gdquot = gdq;
795         }
796
797         xfs_dqunlock(gdq);
798         xfs_dqunlock(udq);
799 }
800
801
802 /*
803  * Given a locked inode, attach dquot(s) to it, taking U/G/P-QUOTAON
804  * into account.
805  * If XFS_QMOPT_DQALLOC, the dquot(s) will be allocated if needed.
806  * Inode may get unlocked and relocked in here, and the caller must deal with
807  * the consequences.
808  */
809 int
810 xfs_qm_dqattach_locked(
811         xfs_inode_t     *ip,
812         uint            flags)
813 {
814         xfs_mount_t     *mp = ip->i_mount;
815         uint            nquotas = 0;
816         int             error = 0;
817
818         if (!XFS_IS_QUOTA_RUNNING(mp) ||
819             !XFS_IS_QUOTA_ON(mp) ||
820             !XFS_NOT_DQATTACHED(mp, ip) ||
821             ip->i_ino == mp->m_sb.sb_uquotino ||
822             ip->i_ino == mp->m_sb.sb_gquotino)
823                 return 0;
824
825         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
826
827         if (XFS_IS_UQUOTA_ON(mp)) {
828                 error = xfs_qm_dqattach_one(ip, ip->i_d.di_uid, XFS_DQ_USER,
829                                                 flags & XFS_QMOPT_DQALLOC,
830                                                 NULL, &ip->i_udquot);
831                 if (error)
832                         goto done;
833                 nquotas++;
834         }
835
836         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
837         if (XFS_IS_OQUOTA_ON(mp)) {
838                 error = XFS_IS_GQUOTA_ON(mp) ?
839                         xfs_qm_dqattach_one(ip, ip->i_d.di_gid, XFS_DQ_GROUP,
840                                                 flags & XFS_QMOPT_DQALLOC,
841                                                 ip->i_udquot, &ip->i_gdquot) :
842                         xfs_qm_dqattach_one(ip, ip->i_d.di_projid, XFS_DQ_PROJ,
843                                                 flags & XFS_QMOPT_DQALLOC,
844                                                 ip->i_udquot, &ip->i_gdquot);
845                 /*
846                  * Don't worry about the udquot that we may have
847                  * attached above. It'll get detached, if not already.
848                  */
849                 if (error)
850                         goto done;
851                 nquotas++;
852         }
853
854         /*
855          * Attach this group quota to the user quota as a hint.
856          * This WON'T, in general, result in a thrash.
857          */
858         if (nquotas == 2) {
859                 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
860                 ASSERT(ip->i_udquot);
861                 ASSERT(ip->i_gdquot);
862
863                 /*
864                  * We may or may not have the i_udquot locked at this point,
865                  * but this check is OK since we don't depend on the i_gdquot to
866                  * be accurate 100% all the time. It is just a hint, and this
867                  * will succeed in general.
868                  */
869                 if (ip->i_udquot->q_gdquot == ip->i_gdquot)
870                         goto done;
871                 /*
872                  * Attach i_gdquot to the gdquot hint inside the i_udquot.
873                  */
874                 xfs_qm_dqattach_grouphint(ip->i_udquot, ip->i_gdquot);
875         }
876
877  done:
878 #ifdef QUOTADEBUG
879         if (! error) {
880                 if (XFS_IS_UQUOTA_ON(mp))
881                         ASSERT(ip->i_udquot);
882                 if (XFS_IS_OQUOTA_ON(mp))
883                         ASSERT(ip->i_gdquot);
884         }
885         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
886 #endif
887         return error;
888 }
889
890 int
891 xfs_qm_dqattach(
892         struct xfs_inode        *ip,
893         uint                    flags)
894 {
895         int                     error;
896
897         xfs_ilock(ip, XFS_ILOCK_EXCL);
898         error = xfs_qm_dqattach_locked(ip, flags);
899         xfs_iunlock(ip, XFS_ILOCK_EXCL);
900
901         return error;
902 }
903
904 /*
905  * Release dquots (and their references) if any.
906  * The inode should be locked EXCL except when this's called by
907  * xfs_ireclaim.
908  */
909 void
910 xfs_qm_dqdetach(
911         xfs_inode_t     *ip)
912 {
913         if (!(ip->i_udquot || ip->i_gdquot))
914                 return;
915
916         trace_xfs_dquot_dqdetach(ip);
917
918         ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_uquotino);
919         ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_gquotino);
920         if (ip->i_udquot) {
921                 xfs_qm_dqrele(ip->i_udquot);
922                 ip->i_udquot = NULL;
923         }
924         if (ip->i_gdquot) {
925                 xfs_qm_dqrele(ip->i_gdquot);
926                 ip->i_gdquot = NULL;
927         }
928 }
929
930 int
931 xfs_qm_sync(
932         xfs_mount_t     *mp,
933         int             flags)
934 {
935         int             recl, restarts;
936         xfs_dquot_t     *dqp;
937         int             error;
938
939         if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
940                 return 0;
941
942         restarts = 0;
943
944   again:
945         mutex_lock(&mp->m_quotainfo->qi_dqlist_lock);
946         /*
947          * dqpurge_all() also takes the mplist lock and iterate thru all dquots
948          * in quotaoff. However, if the QUOTA_ACTIVE bits are not cleared
949          * when we have the mplist lock, we know that dquots will be consistent
950          * as long as we have it locked.
951          */
952         if (!XFS_IS_QUOTA_ON(mp)) {
953                 mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock);
954                 return 0;
955         }
956         ASSERT(mutex_is_locked(&mp->m_quotainfo->qi_dqlist_lock));
957         list_for_each_entry(dqp, &mp->m_quotainfo->qi_dqlist, q_mplist) {
958                 /*
959                  * If this is vfs_sync calling, then skip the dquots that
960                  * don't 'seem' to be dirty. ie. don't acquire dqlock.
961                  * This is very similar to what xfs_sync does with inodes.
962                  */
963                 if (flags & SYNC_TRYLOCK) {
964                         if (!XFS_DQ_IS_DIRTY(dqp))
965                                 continue;
966                         if (!xfs_qm_dqlock_nowait(dqp))
967                                 continue;
968                 } else {
969                         xfs_dqlock(dqp);
970                 }
971
972                 /*
973                  * Now, find out for sure if this dquot is dirty or not.
974                  */
975                 if (! XFS_DQ_IS_DIRTY(dqp)) {
976                         xfs_dqunlock(dqp);
977                         continue;
978                 }
979
980                 /* XXX a sentinel would be better */
981                 recl = mp->m_quotainfo->qi_dqreclaims;
982                 if (!xfs_dqflock_nowait(dqp)) {
983                         if (flags & SYNC_TRYLOCK) {
984                                 xfs_dqunlock(dqp);
985                                 continue;
986                         }
987                         /*
988                          * If we can't grab the flush lock then if the caller
989                          * really wanted us to give this our best shot, so
990                          * see if we can give a push to the buffer before we wait
991                          * on the flush lock. At this point, we know that
992                          * even though the dquot is being flushed,
993                          * it has (new) dirty data.
994                          */
995                         xfs_qm_dqflock_pushbuf_wait(dqp);
996                 }
997                 /*
998                  * Let go of the mplist lock. We don't want to hold it
999                  * across a disk write
1000                  */
1001                 mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock);
1002                 error = xfs_qm_dqflush(dqp, flags);
1003                 xfs_dqunlock(dqp);
1004                 if (error && XFS_FORCED_SHUTDOWN(mp))
1005                         return 0;       /* Need to prevent umount failure */
1006                 else if (error)
1007                         return error;
1008
1009                 mutex_lock(&mp->m_quotainfo->qi_dqlist_lock);
1010                 if (recl != mp->m_quotainfo->qi_dqreclaims) {
1011                         if (++restarts >= XFS_QM_SYNC_MAX_RESTARTS)
1012                                 break;
1013
1014                         mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock);
1015                         goto again;
1016                 }
1017         }
1018
1019         mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock);
1020         return 0;
1021 }
1022
1023 /*
1024  * The hash chains and the mplist use the same xfs_dqhash structure as
1025  * their list head, but we can take the mplist qh_lock and one of the
1026  * hash qh_locks at the same time without any problem as they aren't
1027  * related.
1028  */
1029 static struct lock_class_key xfs_quota_mplist_class;
1030
1031 /*
1032  * This initializes all the quota information that's kept in the
1033  * mount structure
1034  */
1035 STATIC int
1036 xfs_qm_init_quotainfo(
1037         xfs_mount_t     *mp)
1038 {
1039         xfs_quotainfo_t *qinf;
1040         int             error;
1041         xfs_dquot_t     *dqp;
1042
1043         ASSERT(XFS_IS_QUOTA_RUNNING(mp));
1044
1045         /*
1046          * Tell XQM that we exist as soon as possible.
1047          */
1048         if ((error = xfs_qm_hold_quotafs_ref(mp))) {
1049                 return error;
1050         }
1051
1052         qinf = mp->m_quotainfo = kmem_zalloc(sizeof(xfs_quotainfo_t), KM_SLEEP);
1053
1054         /*
1055          * See if quotainodes are setup, and if not, allocate them,
1056          * and change the superblock accordingly.
1057          */
1058         if ((error = xfs_qm_init_quotainos(mp))) {
1059                 kmem_free(qinf);
1060                 mp->m_quotainfo = NULL;
1061                 return error;
1062         }
1063
1064         INIT_LIST_HEAD(&qinf->qi_dqlist);
1065         mutex_init(&qinf->qi_dqlist_lock);
1066         lockdep_set_class(&qinf->qi_dqlist_lock, &xfs_quota_mplist_class);
1067
1068         qinf->qi_dqreclaims = 0;
1069
1070         /* mutex used to serialize quotaoffs */
1071         mutex_init(&qinf->qi_quotaofflock);
1072
1073         /* Precalc some constants */
1074         qinf->qi_dqchunklen = XFS_FSB_TO_BB(mp, XFS_DQUOT_CLUSTER_SIZE_FSB);
1075         ASSERT(qinf->qi_dqchunklen);
1076         qinf->qi_dqperchunk = BBTOB(qinf->qi_dqchunklen);
1077         do_div(qinf->qi_dqperchunk, sizeof(xfs_dqblk_t));
1078
1079         mp->m_qflags |= (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_CHKD);
1080
1081         /*
1082          * We try to get the limits from the superuser's limits fields.
1083          * This is quite hacky, but it is standard quota practice.
1084          * We look at the USR dquot with id == 0 first, but if user quotas
1085          * are not enabled we goto the GRP dquot with id == 0.
1086          * We don't really care to keep separate default limits for user
1087          * and group quotas, at least not at this point.
1088          */
1089         error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)0,
1090                              XFS_IS_UQUOTA_RUNNING(mp) ? XFS_DQ_USER : 
1091                              (XFS_IS_GQUOTA_RUNNING(mp) ? XFS_DQ_GROUP :
1092                                 XFS_DQ_PROJ),
1093                              XFS_QMOPT_DQSUSER|XFS_QMOPT_DOWARN,
1094                              &dqp);
1095         if (! error) {
1096                 xfs_disk_dquot_t        *ddqp = &dqp->q_core;
1097
1098                 /*
1099                  * The warnings and timers set the grace period given to
1100                  * a user or group before he or she can not perform any
1101                  * more writing. If it is zero, a default is used.
1102                  */
1103                 qinf->qi_btimelimit = ddqp->d_btimer ?
1104                         be32_to_cpu(ddqp->d_btimer) : XFS_QM_BTIMELIMIT;
1105                 qinf->qi_itimelimit = ddqp->d_itimer ?
1106                         be32_to_cpu(ddqp->d_itimer) : XFS_QM_ITIMELIMIT;
1107                 qinf->qi_rtbtimelimit = ddqp->d_rtbtimer ?
1108                         be32_to_cpu(ddqp->d_rtbtimer) : XFS_QM_RTBTIMELIMIT;
1109                 qinf->qi_bwarnlimit = ddqp->d_bwarns ?
1110                         be16_to_cpu(ddqp->d_bwarns) : XFS_QM_BWARNLIMIT;
1111                 qinf->qi_iwarnlimit = ddqp->d_iwarns ?
1112                         be16_to_cpu(ddqp->d_iwarns) : XFS_QM_IWARNLIMIT;
1113                 qinf->qi_rtbwarnlimit = ddqp->d_rtbwarns ?
1114                         be16_to_cpu(ddqp->d_rtbwarns) : XFS_QM_RTBWARNLIMIT;
1115                 qinf->qi_bhardlimit = be64_to_cpu(ddqp->d_blk_hardlimit);
1116                 qinf->qi_bsoftlimit = be64_to_cpu(ddqp->d_blk_softlimit);
1117                 qinf->qi_ihardlimit = be64_to_cpu(ddqp->d_ino_hardlimit);
1118                 qinf->qi_isoftlimit = be64_to_cpu(ddqp->d_ino_softlimit);
1119                 qinf->qi_rtbhardlimit = be64_to_cpu(ddqp->d_rtb_hardlimit);
1120                 qinf->qi_rtbsoftlimit = be64_to_cpu(ddqp->d_rtb_softlimit);
1121  
1122                 /*
1123                  * We sent the XFS_QMOPT_DQSUSER flag to dqget because
1124                  * we don't want this dquot cached. We haven't done a
1125                  * quotacheck yet, and quotacheck doesn't like incore dquots.
1126                  */
1127                 xfs_qm_dqdestroy(dqp);
1128         } else {
1129                 qinf->qi_btimelimit = XFS_QM_BTIMELIMIT;
1130                 qinf->qi_itimelimit = XFS_QM_ITIMELIMIT;
1131                 qinf->qi_rtbtimelimit = XFS_QM_RTBTIMELIMIT;
1132                 qinf->qi_bwarnlimit = XFS_QM_BWARNLIMIT;
1133                 qinf->qi_iwarnlimit = XFS_QM_IWARNLIMIT;
1134                 qinf->qi_rtbwarnlimit = XFS_QM_RTBWARNLIMIT;
1135         }
1136
1137         return 0;
1138 }
1139
1140
1141 /*
1142  * Gets called when unmounting a filesystem or when all quotas get
1143  * turned off.
1144  * This purges the quota inodes, destroys locks and frees itself.
1145  */
1146 void
1147 xfs_qm_destroy_quotainfo(
1148         xfs_mount_t     *mp)
1149 {
1150         xfs_quotainfo_t *qi;
1151
1152         qi = mp->m_quotainfo;
1153         ASSERT(qi != NULL);
1154         ASSERT(xfs_Gqm != NULL);
1155
1156         /*
1157          * Release the reference that XQM kept, so that we know
1158          * when the XQM structure should be freed. We cannot assume
1159          * that xfs_Gqm is non-null after this point.
1160          */
1161         xfs_qm_rele_quotafs_ref(mp);
1162
1163         ASSERT(list_empty(&qi->qi_dqlist));
1164         mutex_destroy(&qi->qi_dqlist_lock);
1165
1166         if (qi->qi_uquotaip) {
1167                 IRELE(qi->qi_uquotaip);
1168                 qi->qi_uquotaip = NULL; /* paranoia */
1169         }
1170         if (qi->qi_gquotaip) {
1171                 IRELE(qi->qi_gquotaip);
1172                 qi->qi_gquotaip = NULL;
1173         }
1174         mutex_destroy(&qi->qi_quotaofflock);
1175         kmem_free(qi);
1176         mp->m_quotainfo = NULL;
1177 }
1178
1179
1180
1181 /* ------------------- PRIVATE STATIC FUNCTIONS ----------------------- */
1182
1183 /* ARGSUSED */
1184 STATIC void
1185 xfs_qm_list_init(
1186         xfs_dqlist_t    *list,
1187         char            *str,
1188         int             n)
1189 {
1190         mutex_init(&list->qh_lock);
1191         INIT_LIST_HEAD(&list->qh_list);
1192         list->qh_version = 0;
1193         list->qh_nelems = 0;
1194 }
1195
1196 STATIC void
1197 xfs_qm_list_destroy(
1198         xfs_dqlist_t    *list)
1199 {
1200         mutex_destroy(&(list->qh_lock));
1201 }
1202
1203
1204 /*
1205  * Stripped down version of dqattach. This doesn't attach, or even look at the
1206  * dquots attached to the inode. The rationale is that there won't be any
1207  * attached at the time this is called from quotacheck.
1208  */
1209 STATIC int
1210 xfs_qm_dqget_noattach(
1211         xfs_inode_t     *ip,
1212         xfs_dquot_t     **O_udqpp,
1213         xfs_dquot_t     **O_gdqpp)
1214 {
1215         int             error;
1216         xfs_mount_t     *mp;
1217         xfs_dquot_t     *udqp, *gdqp;
1218
1219         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
1220         mp = ip->i_mount;
1221         udqp = NULL;
1222         gdqp = NULL;
1223
1224         if (XFS_IS_UQUOTA_ON(mp)) {
1225                 ASSERT(ip->i_udquot == NULL);
1226                 /*
1227                  * We want the dquot allocated if it doesn't exist.
1228                  */
1229                 if ((error = xfs_qm_dqget(mp, ip, ip->i_d.di_uid, XFS_DQ_USER,
1230                                          XFS_QMOPT_DQALLOC | XFS_QMOPT_DOWARN,
1231                                          &udqp))) {
1232                         /*
1233                          * Shouldn't be able to turn off quotas here.
1234                          */
1235                         ASSERT(error != ESRCH);
1236                         ASSERT(error != ENOENT);
1237                         return error;
1238                 }
1239                 ASSERT(udqp);
1240         }
1241
1242         if (XFS_IS_OQUOTA_ON(mp)) {
1243                 ASSERT(ip->i_gdquot == NULL);
1244                 if (udqp)
1245                         xfs_dqunlock(udqp);
1246                 error = XFS_IS_GQUOTA_ON(mp) ?
1247                                 xfs_qm_dqget(mp, ip,
1248                                              ip->i_d.di_gid, XFS_DQ_GROUP,
1249                                              XFS_QMOPT_DQALLOC|XFS_QMOPT_DOWARN,
1250                                              &gdqp) :
1251                                 xfs_qm_dqget(mp, ip,
1252                                              ip->i_d.di_projid, XFS_DQ_PROJ,
1253                                              XFS_QMOPT_DQALLOC|XFS_QMOPT_DOWARN,
1254                                              &gdqp);
1255                 if (error) {
1256                         if (udqp)
1257                                 xfs_qm_dqrele(udqp);
1258                         ASSERT(error != ESRCH);
1259                         ASSERT(error != ENOENT);
1260                         return error;
1261                 }
1262                 ASSERT(gdqp);
1263
1264                 /* Reacquire the locks in the right order */
1265                 if (udqp) {
1266                         if (! xfs_qm_dqlock_nowait(udqp)) {
1267                                 xfs_dqunlock(gdqp);
1268                                 xfs_dqlock(udqp);
1269                                 xfs_dqlock(gdqp);
1270                         }
1271                 }
1272         }
1273
1274         *O_udqpp = udqp;
1275         *O_gdqpp = gdqp;
1276
1277 #ifdef QUOTADEBUG
1278         if (udqp) ASSERT(XFS_DQ_IS_LOCKED(udqp));
1279         if (gdqp) ASSERT(XFS_DQ_IS_LOCKED(gdqp));
1280 #endif
1281         return 0;
1282 }
1283
1284 /*
1285  * Create an inode and return with a reference already taken, but unlocked
1286  * This is how we create quota inodes
1287  */
1288 STATIC int
1289 xfs_qm_qino_alloc(
1290         xfs_mount_t     *mp,
1291         xfs_inode_t     **ip,
1292         __int64_t       sbfields,
1293         uint            flags)
1294 {
1295         xfs_trans_t     *tp;
1296         int             error;
1297         int             committed;
1298
1299         tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QINOCREATE);
1300         if ((error = xfs_trans_reserve(tp,
1301                                       XFS_QM_QINOCREATE_SPACE_RES(mp),
1302                                       XFS_CREATE_LOG_RES(mp), 0,
1303                                       XFS_TRANS_PERM_LOG_RES,
1304                                       XFS_CREATE_LOG_COUNT))) {
1305                 xfs_trans_cancel(tp, 0);
1306                 return error;
1307         }
1308
1309         if ((error = xfs_dir_ialloc(&tp, NULL, S_IFREG, 1, 0,
1310                                    &xfs_zerocr, 0, 1, ip, &committed))) {
1311                 xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES |
1312                                  XFS_TRANS_ABORT);
1313                 return error;
1314         }
1315
1316         /*
1317          * Keep an extra reference to this quota inode. This inode is
1318          * locked exclusively and joined to the transaction already.
1319          */
1320         ASSERT(xfs_isilocked(*ip, XFS_ILOCK_EXCL));
1321         IHOLD(*ip);
1322
1323         /*
1324          * Make the changes in the superblock, and log those too.
1325          * sbfields arg may contain fields other than *QUOTINO;
1326          * VERSIONNUM for example.
1327          */
1328         spin_lock(&mp->m_sb_lock);
1329         if (flags & XFS_QMOPT_SBVERSION) {
1330 #if defined(DEBUG) && defined(XFS_LOUD_RECOVERY)
1331                 unsigned oldv = mp->m_sb.sb_versionnum;
1332 #endif
1333                 ASSERT(!xfs_sb_version_hasquota(&mp->m_sb));
1334                 ASSERT((sbfields & (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO |
1335                                    XFS_SB_GQUOTINO | XFS_SB_QFLAGS)) ==
1336                        (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO |
1337                         XFS_SB_GQUOTINO | XFS_SB_QFLAGS));
1338
1339                 xfs_sb_version_addquota(&mp->m_sb);
1340                 mp->m_sb.sb_uquotino = NULLFSINO;
1341                 mp->m_sb.sb_gquotino = NULLFSINO;
1342
1343                 /* qflags will get updated _after_ quotacheck */
1344                 mp->m_sb.sb_qflags = 0;
1345 #if defined(DEBUG) && defined(XFS_LOUD_RECOVERY)
1346                 cmn_err(CE_NOTE,
1347                         "Old superblock version %x, converting to %x.",
1348                         oldv, mp->m_sb.sb_versionnum);
1349 #endif
1350         }
1351         if (flags & XFS_QMOPT_UQUOTA)
1352                 mp->m_sb.sb_uquotino = (*ip)->i_ino;
1353         else
1354                 mp->m_sb.sb_gquotino = (*ip)->i_ino;
1355         spin_unlock(&mp->m_sb_lock);
1356         xfs_mod_sb(tp, sbfields);
1357
1358         if ((error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES))) {
1359                 xfs_fs_cmn_err(CE_ALERT, mp, "XFS qino_alloc failed!");
1360                 return error;
1361         }
1362         return 0;
1363 }
1364
1365
1366 STATIC void
1367 xfs_qm_reset_dqcounts(
1368         xfs_mount_t     *mp,
1369         xfs_buf_t       *bp,
1370         xfs_dqid_t      id,
1371         uint            type)
1372 {
1373         xfs_disk_dquot_t        *ddq;
1374         int                     j;
1375
1376         trace_xfs_reset_dqcounts(bp, _RET_IP_);
1377
1378         /*
1379          * Reset all counters and timers. They'll be
1380          * started afresh by xfs_qm_quotacheck.
1381          */
1382 #ifdef DEBUG
1383         j = XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB);
1384         do_div(j, sizeof(xfs_dqblk_t));
1385         ASSERT(XFS_QM_DQPERBLK(mp) == j);
1386 #endif
1387         ddq = (xfs_disk_dquot_t *)XFS_BUF_PTR(bp);
1388         for (j = 0; j < XFS_QM_DQPERBLK(mp); j++) {
1389                 /*
1390                  * Do a sanity check, and if needed, repair the dqblk. Don't
1391                  * output any warnings because it's perfectly possible to
1392                  * find uninitialised dquot blks. See comment in xfs_qm_dqcheck.
1393                  */
1394                 (void) xfs_qm_dqcheck(ddq, id+j, type, XFS_QMOPT_DQREPAIR,
1395                                       "xfs_quotacheck");
1396                 ddq->d_bcount = 0;
1397                 ddq->d_icount = 0;
1398                 ddq->d_rtbcount = 0;
1399                 ddq->d_btimer = 0;
1400                 ddq->d_itimer = 0;
1401                 ddq->d_rtbtimer = 0;
1402                 ddq->d_bwarns = 0;
1403                 ddq->d_iwarns = 0;
1404                 ddq->d_rtbwarns = 0;
1405                 ddq = (xfs_disk_dquot_t *) ((xfs_dqblk_t *)ddq + 1);
1406         }
1407 }
1408
1409 STATIC int
1410 xfs_qm_dqiter_bufs(
1411         xfs_mount_t     *mp,
1412         xfs_dqid_t      firstid,
1413         xfs_fsblock_t   bno,
1414         xfs_filblks_t   blkcnt,
1415         uint            flags)
1416 {
1417         xfs_buf_t       *bp;
1418         int             error;
1419         int             notcommitted;
1420         int             incr;
1421         int             type;
1422
1423         ASSERT(blkcnt > 0);
1424         notcommitted = 0;
1425         incr = (blkcnt > XFS_QM_MAX_DQCLUSTER_LOGSZ) ?
1426                 XFS_QM_MAX_DQCLUSTER_LOGSZ : blkcnt;
1427         type = flags & XFS_QMOPT_UQUOTA ? XFS_DQ_USER :
1428                 (flags & XFS_QMOPT_PQUOTA ? XFS_DQ_PROJ : XFS_DQ_GROUP);
1429         error = 0;
1430
1431         /*
1432          * Blkcnt arg can be a very big number, and might even be
1433          * larger than the log itself. So, we have to break it up into
1434          * manageable-sized transactions.
1435          * Note that we don't start a permanent transaction here; we might
1436          * not be able to get a log reservation for the whole thing up front,
1437          * and we don't really care to either, because we just discard
1438          * everything if we were to crash in the middle of this loop.
1439          */
1440         while (blkcnt--) {
1441                 error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp,
1442                               XFS_FSB_TO_DADDR(mp, bno),
1443                               (int)XFS_QI_DQCHUNKLEN(mp), 0, &bp);
1444                 if (error)
1445                         break;
1446
1447                 xfs_qm_reset_dqcounts(mp, bp, firstid, type);
1448                 xfs_bdwrite(mp, bp);
1449                 /*
1450                  * goto the next block.
1451                  */
1452                 bno++;
1453                 firstid += XFS_QM_DQPERBLK(mp);
1454         }
1455         return error;
1456 }
1457
1458 /*
1459  * Iterate over all allocated USR/GRP/PRJ dquots in the system, calling a
1460  * caller supplied function for every chunk of dquots that we find.
1461  */
1462 STATIC int
1463 xfs_qm_dqiterate(
1464         xfs_mount_t     *mp,
1465         xfs_inode_t     *qip,
1466         uint            flags)
1467 {
1468         xfs_bmbt_irec_t         *map;
1469         int                     i, nmaps;       /* number of map entries */
1470         int                     error;          /* return value */
1471         xfs_fileoff_t           lblkno;
1472         xfs_filblks_t           maxlblkcnt;
1473         xfs_dqid_t              firstid;
1474         xfs_fsblock_t           rablkno;
1475         xfs_filblks_t           rablkcnt;
1476
1477         error = 0;
1478         /*
1479          * This looks racy, but we can't keep an inode lock across a
1480          * trans_reserve. But, this gets called during quotacheck, and that
1481          * happens only at mount time which is single threaded.
1482          */
1483         if (qip->i_d.di_nblocks == 0)
1484                 return 0;
1485
1486         map = kmem_alloc(XFS_DQITER_MAP_SIZE * sizeof(*map), KM_SLEEP);
1487
1488         lblkno = 0;
1489         maxlblkcnt = XFS_B_TO_FSB(mp, (xfs_ufsize_t)XFS_MAXIOFFSET(mp));
1490         do {
1491                 nmaps = XFS_DQITER_MAP_SIZE;
1492                 /*
1493                  * We aren't changing the inode itself. Just changing
1494                  * some of its data. No new blocks are added here, and
1495                  * the inode is never added to the transaction.
1496                  */
1497                 xfs_ilock(qip, XFS_ILOCK_SHARED);
1498                 error = xfs_bmapi(NULL, qip, lblkno,
1499                                   maxlblkcnt - lblkno,
1500                                   XFS_BMAPI_METADATA,
1501                                   NULL,
1502                                   0, map, &nmaps, NULL, NULL);
1503                 xfs_iunlock(qip, XFS_ILOCK_SHARED);
1504                 if (error)
1505                         break;
1506
1507                 ASSERT(nmaps <= XFS_DQITER_MAP_SIZE);
1508                 for (i = 0; i < nmaps; i++) {
1509                         ASSERT(map[i].br_startblock != DELAYSTARTBLOCK);
1510                         ASSERT(map[i].br_blockcount);
1511
1512
1513                         lblkno += map[i].br_blockcount;
1514
1515                         if (map[i].br_startblock == HOLESTARTBLOCK)
1516                                 continue;
1517
1518                         firstid = (xfs_dqid_t) map[i].br_startoff *
1519                                 XFS_QM_DQPERBLK(mp);
1520                         /*
1521                          * Do a read-ahead on the next extent.
1522                          */
1523                         if ((i+1 < nmaps) &&
1524                             (map[i+1].br_startblock != HOLESTARTBLOCK)) {
1525                                 rablkcnt =  map[i+1].br_blockcount;
1526                                 rablkno = map[i+1].br_startblock;
1527                                 while (rablkcnt--) {
1528                                         xfs_baread(mp->m_ddev_targp,
1529                                                XFS_FSB_TO_DADDR(mp, rablkno),
1530                                                (int)XFS_QI_DQCHUNKLEN(mp));
1531                                         rablkno++;
1532                                 }
1533                         }
1534                         /*
1535                          * Iterate thru all the blks in the extent and
1536                          * reset the counters of all the dquots inside them.
1537                          */
1538                         if ((error = xfs_qm_dqiter_bufs(mp,
1539                                                        firstid,
1540                                                        map[i].br_startblock,
1541                                                        map[i].br_blockcount,
1542                                                        flags))) {
1543                                 break;
1544                         }
1545                 }
1546
1547                 if (error)
1548                         break;
1549         } while (nmaps > 0);
1550
1551         kmem_free(map);
1552
1553         return error;
1554 }
1555
1556 /*
1557  * Called by dqusage_adjust in doing a quotacheck.
1558  * Given the inode, and a dquot (either USR or GRP, doesn't matter),
1559  * this updates its incore copy as well as the buffer copy. This is
1560  * so that once the quotacheck is done, we can just log all the buffers,
1561  * as opposed to logging numerous updates to individual dquots.
1562  */
1563 STATIC void
1564 xfs_qm_quotacheck_dqadjust(
1565         xfs_dquot_t             *dqp,
1566         xfs_qcnt_t              nblks,
1567         xfs_qcnt_t              rtblks)
1568 {
1569         ASSERT(XFS_DQ_IS_LOCKED(dqp));
1570
1571         trace_xfs_dqadjust(dqp);
1572
1573         /*
1574          * Adjust the inode count and the block count to reflect this inode's
1575          * resource usage.
1576          */
1577         be64_add_cpu(&dqp->q_core.d_icount, 1);
1578         dqp->q_res_icount++;
1579         if (nblks) {
1580                 be64_add_cpu(&dqp->q_core.d_bcount, nblks);
1581                 dqp->q_res_bcount += nblks;
1582         }
1583         if (rtblks) {
1584                 be64_add_cpu(&dqp->q_core.d_rtbcount, rtblks);
1585                 dqp->q_res_rtbcount += rtblks;
1586         }
1587
1588         /*
1589          * Set default limits, adjust timers (since we changed usages)
1590          */
1591         if (! XFS_IS_SUSER_DQUOT(dqp)) {
1592                 xfs_qm_adjust_dqlimits(dqp->q_mount, &dqp->q_core);
1593                 xfs_qm_adjust_dqtimers(dqp->q_mount, &dqp->q_core);
1594         }
1595
1596         dqp->dq_flags |= XFS_DQ_DIRTY;
1597 }
1598
1599 STATIC int
1600 xfs_qm_get_rtblks(
1601         xfs_inode_t     *ip,
1602         xfs_qcnt_t      *O_rtblks)
1603 {
1604         xfs_filblks_t   rtblks;                 /* total rt blks */
1605         xfs_extnum_t    idx;                    /* extent record index */
1606         xfs_ifork_t     *ifp;                   /* inode fork pointer */
1607         xfs_extnum_t    nextents;               /* number of extent entries */
1608         int             error;
1609
1610         ASSERT(XFS_IS_REALTIME_INODE(ip));
1611         ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK);
1612         if (!(ifp->if_flags & XFS_IFEXTENTS)) {
1613                 if ((error = xfs_iread_extents(NULL, ip, XFS_DATA_FORK)))
1614                         return error;
1615         }
1616         rtblks = 0;
1617         nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
1618         for (idx = 0; idx < nextents; idx++)
1619                 rtblks += xfs_bmbt_get_blockcount(xfs_iext_get_ext(ifp, idx));
1620         *O_rtblks = (xfs_qcnt_t)rtblks;
1621         return 0;
1622 }
1623
1624 /*
1625  * callback routine supplied to bulkstat(). Given an inumber, find its
1626  * dquots and update them to account for resources taken by that inode.
1627  */
1628 /* ARGSUSED */
1629 STATIC int
1630 xfs_qm_dqusage_adjust(
1631         xfs_mount_t     *mp,            /* mount point for filesystem */
1632         xfs_ino_t       ino,            /* inode number to get data for */
1633         void            __user *buffer, /* not used */
1634         int             ubsize,         /* not used */
1635         void            *private_data,  /* not used */
1636         xfs_daddr_t     bno,            /* starting block of inode cluster */
1637         int             *ubused,        /* not used */
1638         void            *dip,           /* on-disk inode pointer (not used) */
1639         int             *res)           /* result code value */
1640 {
1641         xfs_inode_t     *ip;
1642         xfs_dquot_t     *udqp, *gdqp;
1643         xfs_qcnt_t      nblks, rtblks;
1644         int             error;
1645
1646         ASSERT(XFS_IS_QUOTA_RUNNING(mp));
1647
1648         /*
1649          * rootino must have its resources accounted for, not so with the quota
1650          * inodes.
1651          */
1652         if (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino) {
1653                 *res = BULKSTAT_RV_NOTHING;
1654                 return XFS_ERROR(EINVAL);
1655         }
1656
1657         /*
1658          * We don't _need_ to take the ilock EXCL. However, the xfs_qm_dqget
1659          * interface expects the inode to be exclusively locked because that's
1660          * the case in all other instances. It's OK that we do this because
1661          * quotacheck is done only at mount time.
1662          */
1663         if ((error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip, bno))) {
1664                 *res = BULKSTAT_RV_NOTHING;
1665                 return error;
1666         }
1667
1668         /*
1669          * Obtain the locked dquots. In case of an error (eg. allocation
1670          * fails for ENOSPC), we return the negative of the error number
1671          * to bulkstat, so that it can get propagated to quotacheck() and
1672          * making us disable quotas for the file system.
1673          */
1674         if ((error = xfs_qm_dqget_noattach(ip, &udqp, &gdqp))) {
1675                 xfs_iput(ip, XFS_ILOCK_EXCL);
1676                 *res = BULKSTAT_RV_GIVEUP;
1677                 return error;
1678         }
1679
1680         rtblks = 0;
1681         if (! XFS_IS_REALTIME_INODE(ip)) {
1682                 nblks = (xfs_qcnt_t)ip->i_d.di_nblocks;
1683         } else {
1684                 /*
1685                  * Walk thru the extent list and count the realtime blocks.
1686                  */
1687                 if ((error = xfs_qm_get_rtblks(ip, &rtblks))) {
1688                         xfs_iput(ip, XFS_ILOCK_EXCL);
1689                         if (udqp)
1690                                 xfs_qm_dqput(udqp);
1691                         if (gdqp)
1692                                 xfs_qm_dqput(gdqp);
1693                         *res = BULKSTAT_RV_GIVEUP;
1694                         return error;
1695                 }
1696                 nblks = (xfs_qcnt_t)ip->i_d.di_nblocks - rtblks;
1697         }
1698         ASSERT(ip->i_delayed_blks == 0);
1699
1700         /*
1701          * We can't release the inode while holding its dquot locks.
1702          * The inode can go into inactive and might try to acquire the dquotlocks.
1703          * So, just unlock here and do a vn_rele at the end.
1704          */
1705         xfs_iunlock(ip, XFS_ILOCK_EXCL);
1706
1707         /*
1708          * Add the (disk blocks and inode) resources occupied by this
1709          * inode to its dquots. We do this adjustment in the incore dquot,
1710          * and also copy the changes to its buffer.
1711          * We don't care about putting these changes in a transaction
1712          * envelope because if we crash in the middle of a 'quotacheck'
1713          * we have to start from the beginning anyway.
1714          * Once we're done, we'll log all the dquot bufs.
1715          *
1716          * The *QUOTA_ON checks below may look pretty racy, but quotachecks
1717          * and quotaoffs don't race. (Quotachecks happen at mount time only).
1718          */
1719         if (XFS_IS_UQUOTA_ON(mp)) {
1720                 ASSERT(udqp);
1721                 xfs_qm_quotacheck_dqadjust(udqp, nblks, rtblks);
1722                 xfs_qm_dqput(udqp);
1723         }
1724         if (XFS_IS_OQUOTA_ON(mp)) {
1725                 ASSERT(gdqp);
1726                 xfs_qm_quotacheck_dqadjust(gdqp, nblks, rtblks);
1727                 xfs_qm_dqput(gdqp);
1728         }
1729         /*
1730          * Now release the inode. This will send it to 'inactive', and
1731          * possibly even free blocks.
1732          */
1733         IRELE(ip);
1734
1735         /*
1736          * Goto next inode.
1737          */
1738         *res = BULKSTAT_RV_DIDONE;
1739         return 0;
1740 }
1741
1742 /*
1743  * Walk thru all the filesystem inodes and construct a consistent view
1744  * of the disk quota world. If the quotacheck fails, disable quotas.
1745  */
1746 int
1747 xfs_qm_quotacheck(
1748         xfs_mount_t     *mp)
1749 {
1750         int             done, count, error;
1751         xfs_ino_t       lastino;
1752         size_t          structsz;
1753         xfs_inode_t     *uip, *gip;
1754         uint            flags;
1755
1756         count = INT_MAX;
1757         structsz = 1;
1758         lastino = 0;
1759         flags = 0;
1760
1761         ASSERT(XFS_QI_UQIP(mp) || XFS_QI_GQIP(mp));
1762         ASSERT(XFS_IS_QUOTA_RUNNING(mp));
1763
1764         /*
1765          * There should be no cached dquots. The (simplistic) quotacheck
1766          * algorithm doesn't like that.
1767          */
1768         ASSERT(list_empty(&mp->m_quotainfo->qi_dqlist));
1769
1770         cmn_err(CE_NOTE, "XFS quotacheck %s: Please wait.", mp->m_fsname);
1771
1772         /*
1773          * First we go thru all the dquots on disk, USR and GRP/PRJ, and reset
1774          * their counters to zero. We need a clean slate.
1775          * We don't log our changes till later.
1776          */
1777         if ((uip = XFS_QI_UQIP(mp))) {
1778                 if ((error = xfs_qm_dqiterate(mp, uip, XFS_QMOPT_UQUOTA)))
1779                         goto error_return;
1780                 flags |= XFS_UQUOTA_CHKD;
1781         }
1782
1783         if ((gip = XFS_QI_GQIP(mp))) {
1784                 if ((error = xfs_qm_dqiterate(mp, gip, XFS_IS_GQUOTA_ON(mp) ?
1785                                         XFS_QMOPT_GQUOTA : XFS_QMOPT_PQUOTA)))
1786                         goto error_return;
1787                 flags |= XFS_OQUOTA_CHKD;
1788         }
1789
1790         do {
1791                 /*
1792                  * Iterate thru all the inodes in the file system,
1793                  * adjusting the corresponding dquot counters in core.
1794                  */
1795                 if ((error = xfs_bulkstat(mp, &lastino, &count,
1796                                      xfs_qm_dqusage_adjust, NULL,
1797                                      structsz, NULL, BULKSTAT_FG_IGET, &done)))
1798                         break;
1799
1800         } while (! done);
1801
1802         /*
1803          * We've made all the changes that we need to make incore.
1804          * Flush them down to disk buffers if everything was updated
1805          * successfully.
1806          */
1807         if (!error)
1808                 error = xfs_qm_dqflush_all(mp, 0);
1809
1810         /*
1811          * We can get this error if we couldn't do a dquot allocation inside
1812          * xfs_qm_dqusage_adjust (via bulkstat). We don't care about the
1813          * dirty dquots that might be cached, we just want to get rid of them
1814          * and turn quotaoff. The dquots won't be attached to any of the inodes
1815          * at this point (because we intentionally didn't in dqget_noattach).
1816          */
1817         if (error) {
1818                 xfs_qm_dqpurge_all(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_QUOTAOFF);
1819                 goto error_return;
1820         }
1821
1822         /*
1823          * We didn't log anything, because if we crashed, we'll have to
1824          * start the quotacheck from scratch anyway. However, we must make
1825          * sure that our dquot changes are secure before we put the
1826          * quotacheck'd stamp on the superblock. So, here we do a synchronous
1827          * flush.
1828          */
1829         XFS_bflush(mp->m_ddev_targp);
1830
1831         /*
1832          * If one type of quotas is off, then it will lose its
1833          * quotachecked status, since we won't be doing accounting for
1834          * that type anymore.
1835          */
1836         mp->m_qflags &= ~(XFS_OQUOTA_CHKD | XFS_UQUOTA_CHKD);
1837         mp->m_qflags |= flags;
1838
1839         xfs_qm_dquot_list_print(mp);
1840
1841  error_return:
1842         if (error) {
1843                 cmn_err(CE_WARN, "XFS quotacheck %s: Unsuccessful (Error %d): "
1844                         "Disabling quotas.",
1845                         mp->m_fsname, error);
1846                 /*
1847                  * We must turn off quotas.
1848                  */
1849                 ASSERT(mp->m_quotainfo != NULL);
1850                 ASSERT(xfs_Gqm != NULL);
1851                 xfs_qm_destroy_quotainfo(mp);
1852                 if (xfs_mount_reset_sbqflags(mp)) {
1853                         cmn_err(CE_WARN, "XFS quotacheck %s: "
1854                                 "Failed to reset quota flags.", mp->m_fsname);
1855                 }
1856         } else {
1857                 cmn_err(CE_NOTE, "XFS quotacheck %s: Done.", mp->m_fsname);
1858         }
1859         return (error);
1860 }
1861
1862 /*
1863  * This is called after the superblock has been read in and we're ready to
1864  * iget the quota inodes.
1865  */
1866 STATIC int
1867 xfs_qm_init_quotainos(
1868         xfs_mount_t     *mp)
1869 {
1870         xfs_inode_t     *uip, *gip;
1871         int             error;
1872         __int64_t       sbflags;
1873         uint            flags;
1874
1875         ASSERT(mp->m_quotainfo);
1876         uip = gip = NULL;
1877         sbflags = 0;
1878         flags = 0;
1879
1880         /*
1881          * Get the uquota and gquota inodes
1882          */
1883         if (xfs_sb_version_hasquota(&mp->m_sb)) {
1884                 if (XFS_IS_UQUOTA_ON(mp) &&
1885                     mp->m_sb.sb_uquotino != NULLFSINO) {
1886                         ASSERT(mp->m_sb.sb_uquotino > 0);
1887                         if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino,
1888                                              0, 0, &uip, 0)))
1889                                 return XFS_ERROR(error);
1890                 }
1891                 if (XFS_IS_OQUOTA_ON(mp) &&
1892                     mp->m_sb.sb_gquotino != NULLFSINO) {
1893                         ASSERT(mp->m_sb.sb_gquotino > 0);
1894                         if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino,
1895                                              0, 0, &gip, 0))) {
1896                                 if (uip)
1897                                         IRELE(uip);
1898                                 return XFS_ERROR(error);
1899                         }
1900                 }
1901         } else {
1902                 flags |= XFS_QMOPT_SBVERSION;
1903                 sbflags |= (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO |
1904                             XFS_SB_GQUOTINO | XFS_SB_QFLAGS);
1905         }
1906
1907         /*
1908          * Create the two inodes, if they don't exist already. The changes
1909          * made above will get added to a transaction and logged in one of
1910          * the qino_alloc calls below.  If the device is readonly,
1911          * temporarily switch to read-write to do this.
1912          */
1913         if (XFS_IS_UQUOTA_ON(mp) && uip == NULL) {
1914                 if ((error = xfs_qm_qino_alloc(mp, &uip,
1915                                               sbflags | XFS_SB_UQUOTINO,
1916                                               flags | XFS_QMOPT_UQUOTA)))
1917                         return XFS_ERROR(error);
1918
1919                 flags &= ~XFS_QMOPT_SBVERSION;
1920         }
1921         if (XFS_IS_OQUOTA_ON(mp) && gip == NULL) {
1922                 flags |= (XFS_IS_GQUOTA_ON(mp) ?
1923                                 XFS_QMOPT_GQUOTA : XFS_QMOPT_PQUOTA);
1924                 error = xfs_qm_qino_alloc(mp, &gip,
1925                                           sbflags | XFS_SB_GQUOTINO, flags);
1926                 if (error) {
1927                         if (uip)
1928                                 IRELE(uip);
1929
1930                         return XFS_ERROR(error);
1931                 }
1932         }
1933
1934         XFS_QI_UQIP(mp) = uip;
1935         XFS_QI_GQIP(mp) = gip;
1936
1937         return 0;
1938 }
1939
1940
1941
1942 /*
1943  * Just pop the least recently used dquot off the freelist and
1944  * recycle it. The returned dquot is locked.
1945  */
1946 STATIC xfs_dquot_t *
1947 xfs_qm_dqreclaim_one(void)
1948 {
1949         xfs_dquot_t     *dqpout;
1950         xfs_dquot_t     *dqp;
1951         int             restarts;
1952
1953         restarts = 0;
1954         dqpout = NULL;
1955
1956         /* lockorder: hashchainlock, freelistlock, mplistlock, dqlock, dqflock */
1957 startagain:
1958         mutex_lock(&xfs_Gqm->qm_dqfrlist_lock);
1959
1960         list_for_each_entry(dqp, &xfs_Gqm->qm_dqfrlist, q_freelist) {
1961                 struct xfs_mount *mp = dqp->q_mount;
1962                 xfs_dqlock(dqp);
1963
1964                 /*
1965                  * We are racing with dqlookup here. Naturally we don't
1966                  * want to reclaim a dquot that lookup wants. We release the
1967                  * freelist lock and start over, so that lookup will grab
1968                  * both the dquot and the freelistlock.
1969                  */
1970                 if (dqp->dq_flags & XFS_DQ_WANT) {
1971                         ASSERT(! (dqp->dq_flags & XFS_DQ_INACTIVE));
1972
1973                         trace_xfs_dqreclaim_want(dqp);
1974
1975                         xfs_dqunlock(dqp);
1976                         mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock);
1977                         if (++restarts >= XFS_QM_RECLAIM_MAX_RESTARTS)
1978                                 return NULL;
1979                         XQM_STATS_INC(xqmstats.xs_qm_dqwants);
1980                         goto startagain;
1981                 }
1982
1983                 /*
1984                  * If the dquot is inactive, we are assured that it is
1985                  * not on the mplist or the hashlist, and that makes our
1986                  * life easier.
1987                  */
1988                 if (dqp->dq_flags & XFS_DQ_INACTIVE) {
1989                         ASSERT(mp == NULL);
1990                         ASSERT(! XFS_DQ_IS_DIRTY(dqp));
1991                         ASSERT(list_empty(&dqp->q_hashlist));
1992                         ASSERT(list_empty(&dqp->q_mplist));
1993                         list_del_init(&dqp->q_freelist);
1994                         xfs_Gqm->qm_dqfrlist_cnt--;
1995                         xfs_dqunlock(dqp);
1996                         dqpout = dqp;
1997                         XQM_STATS_INC(xqmstats.xs_qm_dqinact_reclaims);
1998                         break;
1999                 }
2000
2001                 ASSERT(dqp->q_hash);
2002                 ASSERT(!list_empty(&dqp->q_mplist));
2003
2004                 /*
2005                  * Try to grab the flush lock. If this dquot is in the process of
2006                  * getting flushed to disk, we don't want to reclaim it.
2007                  */
2008                 if (!xfs_dqflock_nowait(dqp)) {
2009                         xfs_dqunlock(dqp);
2010                         continue;
2011                 }
2012
2013                 /*
2014                  * We have the flush lock so we know that this is not in the
2015                  * process of being flushed. So, if this is dirty, flush it
2016                  * DELWRI so that we don't get a freelist infested with
2017                  * dirty dquots.
2018                  */
2019                 if (XFS_DQ_IS_DIRTY(dqp)) {
2020                         int     error;
2021
2022                         trace_xfs_dqreclaim_dirty(dqp);
2023
2024                         /*
2025                          * We flush it delayed write, so don't bother
2026                          * releasing the freelist lock.
2027                          */
2028                         error = xfs_qm_dqflush(dqp, 0);
2029                         if (error) {
2030                                 xfs_fs_cmn_err(CE_WARN, mp,
2031                         "xfs_qm_dqreclaim: dquot %p flush failed", dqp);
2032                         }
2033                         xfs_dqunlock(dqp); /* dqflush unlocks dqflock */
2034                         continue;
2035                 }
2036
2037                 /*
2038                  * We're trying to get the hashlock out of order. This races
2039                  * with dqlookup; so, we giveup and goto the next dquot if
2040                  * we couldn't get the hashlock. This way, we won't starve
2041                  * a dqlookup process that holds the hashlock that is
2042                  * waiting for the freelist lock.
2043                  */
2044                 if (!mutex_trylock(&dqp->q_hash->qh_lock)) {
2045                         restarts++;
2046                         goto dqfunlock;
2047                 }
2048
2049                 /*
2050                  * This races with dquot allocation code as well as dqflush_all
2051                  * and reclaim code. So, if we failed to grab the mplist lock,
2052                  * giveup everything and start over.
2053                  */
2054                 if (!mutex_trylock(&mp->m_quotainfo->qi_dqlist_lock)) {
2055                         restarts++;
2056                         mutex_unlock(&dqp->q_hash->qh_lock);
2057                         xfs_dqfunlock(dqp);
2058                         xfs_dqunlock(dqp);
2059                         mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock);
2060                         if (restarts++ >= XFS_QM_RECLAIM_MAX_RESTARTS)
2061                                 return NULL;
2062                         goto startagain;
2063                 }
2064
2065                 ASSERT(dqp->q_nrefs == 0);
2066                 list_del_init(&dqp->q_mplist);
2067                 mp->m_quotainfo->qi_dquots--;
2068                 mp->m_quotainfo->qi_dqreclaims++;
2069                 list_del_init(&dqp->q_hashlist);
2070                 dqp->q_hash->qh_version++;
2071                 list_del_init(&dqp->q_freelist);
2072                 xfs_Gqm->qm_dqfrlist_cnt--;
2073                 dqpout = dqp;
2074                 mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock);
2075                 mutex_unlock(&dqp->q_hash->qh_lock);
2076 dqfunlock:
2077                 xfs_dqfunlock(dqp);
2078                 xfs_dqunlock(dqp);
2079                 if (dqpout)
2080                         break;
2081                 if (restarts >= XFS_QM_RECLAIM_MAX_RESTARTS)
2082                         return NULL;
2083         }
2084         mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock);
2085         return dqpout;
2086 }
2087
2088 /*
2089  * Traverse the freelist of dquots and attempt to reclaim a maximum of
2090  * 'howmany' dquots. This operation races with dqlookup(), and attempts to
2091  * favor the lookup function ...
2092  */
2093 STATIC int
2094 xfs_qm_shake_freelist(
2095         int     howmany)
2096 {
2097         int             nreclaimed = 0;
2098         xfs_dquot_t     *dqp;
2099
2100         if (howmany <= 0)
2101                 return 0;
2102
2103         while (nreclaimed < howmany) {
2104                 dqp = xfs_qm_dqreclaim_one();
2105                 if (!dqp)
2106                         return nreclaimed;
2107                 xfs_qm_dqdestroy(dqp);
2108                 nreclaimed++;
2109         }
2110         return nreclaimed;
2111 }
2112
2113 /*
2114  * The kmem_shake interface is invoked when memory is running low.
2115  */
2116 /* ARGSUSED */
2117 STATIC int
2118 xfs_qm_shake(int nr_to_scan, gfp_t gfp_mask)
2119 {
2120         int     ndqused, nfree, n;
2121
2122         if (!kmem_shake_allow(gfp_mask))
2123                 return 0;
2124         if (!xfs_Gqm)
2125                 return 0;
2126
2127         nfree = xfs_Gqm->qm_dqfrlist_cnt; /* free dquots */
2128         /* incore dquots in all f/s's */
2129         ndqused = atomic_read(&xfs_Gqm->qm_totaldquots) - nfree;
2130
2131         ASSERT(ndqused >= 0);
2132
2133         if (nfree <= ndqused && nfree < ndquot)
2134                 return 0;
2135
2136         ndqused *= xfs_Gqm->qm_dqfree_ratio;    /* target # of free dquots */
2137         n = nfree - ndqused - ndquot;           /* # over target */
2138
2139         return xfs_qm_shake_freelist(MAX(nfree, n));
2140 }
2141
2142
2143 /*------------------------------------------------------------------*/
2144
2145 /*
2146  * Return a new incore dquot. Depending on the number of
2147  * dquots in the system, we either allocate a new one on the kernel heap,
2148  * or reclaim a free one.
2149  * Return value is B_TRUE if we allocated a new dquot, B_FALSE if we managed
2150  * to reclaim an existing one from the freelist.
2151  */
2152 boolean_t
2153 xfs_qm_dqalloc_incore(
2154         xfs_dquot_t **O_dqpp)
2155 {
2156         xfs_dquot_t     *dqp;
2157
2158         /*
2159          * Check against high water mark to see if we want to pop
2160          * a nincompoop dquot off the freelist.
2161          */
2162         if (atomic_read(&xfs_Gqm->qm_totaldquots) >= ndquot) {
2163                 /*
2164                  * Try to recycle a dquot from the freelist.
2165                  */
2166                 if ((dqp = xfs_qm_dqreclaim_one())) {
2167                         XQM_STATS_INC(xqmstats.xs_qm_dqreclaims);
2168                         /*
2169                          * Just zero the core here. The rest will get
2170                          * reinitialized by caller. XXX we shouldn't even
2171                          * do this zero ...
2172                          */
2173                         memset(&dqp->q_core, 0, sizeof(dqp->q_core));
2174                         *O_dqpp = dqp;
2175                         return B_FALSE;
2176                 }
2177                 XQM_STATS_INC(xqmstats.xs_qm_dqreclaim_misses);
2178         }
2179
2180         /*
2181          * Allocate a brand new dquot on the kernel heap and return it
2182          * to the caller to initialize.
2183          */
2184         ASSERT(xfs_Gqm->qm_dqzone != NULL);
2185         *O_dqpp = kmem_zone_zalloc(xfs_Gqm->qm_dqzone, KM_SLEEP);
2186         atomic_inc(&xfs_Gqm->qm_totaldquots);
2187
2188         return B_TRUE;
2189 }
2190
2191
2192 /*
2193  * Start a transaction and write the incore superblock changes to
2194  * disk. flags parameter indicates which fields have changed.
2195  */
2196 int
2197 xfs_qm_write_sb_changes(
2198         xfs_mount_t     *mp,
2199         __int64_t       flags)
2200 {
2201         xfs_trans_t     *tp;
2202         int             error;
2203
2204 #ifdef QUOTADEBUG
2205         cmn_err(CE_NOTE, "Writing superblock quota changes :%s", mp->m_fsname);
2206 #endif
2207         tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
2208         if ((error = xfs_trans_reserve(tp, 0,
2209                                       mp->m_sb.sb_sectsize + 128, 0,
2210                                       0,
2211                                       XFS_DEFAULT_LOG_COUNT))) {
2212                 xfs_trans_cancel(tp, 0);
2213                 return error;
2214         }
2215
2216         xfs_mod_sb(tp, flags);
2217         error = xfs_trans_commit(tp, 0);
2218
2219         return error;
2220 }
2221
2222
2223 /* --------------- utility functions for vnodeops ---------------- */
2224
2225
2226 /*
2227  * Given an inode, a uid and gid (from cred_t) make sure that we have
2228  * allocated relevant dquot(s) on disk, and that we won't exceed inode
2229  * quotas by creating this file.
2230  * This also attaches dquot(s) to the given inode after locking it,
2231  * and returns the dquots corresponding to the uid and/or gid.
2232  *
2233  * in   : inode (unlocked)
2234  * out  : udquot, gdquot with references taken and unlocked
2235  */
2236 int
2237 xfs_qm_vop_dqalloc(
2238         struct xfs_inode        *ip,
2239         uid_t                   uid,
2240         gid_t                   gid,
2241         prid_t                  prid,
2242         uint                    flags,
2243         struct xfs_dquot        **O_udqpp,
2244         struct xfs_dquot        **O_gdqpp)
2245 {
2246         struct xfs_mount        *mp = ip->i_mount;
2247         struct xfs_dquot        *uq, *gq;
2248         int                     error;
2249         uint                    lockflags;
2250
2251         if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
2252                 return 0;
2253
2254         lockflags = XFS_ILOCK_EXCL;
2255         xfs_ilock(ip, lockflags);
2256
2257         if ((flags & XFS_QMOPT_INHERIT) && XFS_INHERIT_GID(ip))
2258                 gid = ip->i_d.di_gid;
2259
2260         /*
2261          * Attach the dquot(s) to this inode, doing a dquot allocation
2262          * if necessary. The dquot(s) will not be locked.
2263          */
2264         if (XFS_NOT_DQATTACHED(mp, ip)) {
2265                 error = xfs_qm_dqattach_locked(ip, XFS_QMOPT_DQALLOC);
2266                 if (error) {
2267                         xfs_iunlock(ip, lockflags);
2268                         return error;
2269                 }
2270         }
2271
2272         uq = gq = NULL;
2273         if ((flags & XFS_QMOPT_UQUOTA) && XFS_IS_UQUOTA_ON(mp)) {
2274                 if (ip->i_d.di_uid != uid) {
2275                         /*
2276                          * What we need is the dquot that has this uid, and
2277                          * if we send the inode to dqget, the uid of the inode
2278                          * takes priority over what's sent in the uid argument.
2279                          * We must unlock inode here before calling dqget if
2280                          * we're not sending the inode, because otherwise
2281                          * we'll deadlock by doing trans_reserve while
2282                          * holding ilock.
2283                          */
2284                         xfs_iunlock(ip, lockflags);
2285                         if ((error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t) uid,
2286                                                  XFS_DQ_USER,
2287                                                  XFS_QMOPT_DQALLOC |
2288                                                  XFS_QMOPT_DOWARN,
2289                                                  &uq))) {
2290                                 ASSERT(error != ENOENT);
2291                                 return error;
2292                         }
2293                         /*
2294                          * Get the ilock in the right order.
2295                          */
2296                         xfs_dqunlock(uq);
2297                         lockflags = XFS_ILOCK_SHARED;
2298                         xfs_ilock(ip, lockflags);
2299                 } else {
2300                         /*
2301                          * Take an extra reference, because we'll return
2302                          * this to caller
2303                          */
2304                         ASSERT(ip->i_udquot);
2305                         uq = ip->i_udquot;
2306                         xfs_dqlock(uq);
2307                         XFS_DQHOLD(uq);
2308                         xfs_dqunlock(uq);
2309                 }
2310         }
2311         if ((flags & XFS_QMOPT_GQUOTA) && XFS_IS_GQUOTA_ON(mp)) {
2312                 if (ip->i_d.di_gid != gid) {
2313                         xfs_iunlock(ip, lockflags);
2314                         if ((error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)gid,
2315                                                  XFS_DQ_GROUP,
2316                                                  XFS_QMOPT_DQALLOC |
2317                                                  XFS_QMOPT_DOWARN,
2318                                                  &gq))) {
2319                                 if (uq)
2320                                         xfs_qm_dqrele(uq);
2321                                 ASSERT(error != ENOENT);
2322                                 return error;
2323                         }
2324                         xfs_dqunlock(gq);
2325                         lockflags = XFS_ILOCK_SHARED;
2326                         xfs_ilock(ip, lockflags);
2327                 } else {
2328                         ASSERT(ip->i_gdquot);
2329                         gq = ip->i_gdquot;
2330                         xfs_dqlock(gq);
2331                         XFS_DQHOLD(gq);
2332                         xfs_dqunlock(gq);
2333                 }
2334         } else if ((flags & XFS_QMOPT_PQUOTA) && XFS_IS_PQUOTA_ON(mp)) {
2335                 if (ip->i_d.di_projid != prid) {
2336                         xfs_iunlock(ip, lockflags);
2337                         if ((error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)prid,
2338                                                  XFS_DQ_PROJ,
2339                                                  XFS_QMOPT_DQALLOC |
2340                                                  XFS_QMOPT_DOWARN,
2341                                                  &gq))) {
2342                                 if (uq)
2343                                         xfs_qm_dqrele(uq);
2344                                 ASSERT(error != ENOENT);
2345                                 return (error);
2346                         }
2347                         xfs_dqunlock(gq);
2348                         lockflags = XFS_ILOCK_SHARED;
2349                         xfs_ilock(ip, lockflags);
2350                 } else {
2351                         ASSERT(ip->i_gdquot);
2352                         gq = ip->i_gdquot;
2353                         xfs_dqlock(gq);
2354                         XFS_DQHOLD(gq);
2355                         xfs_dqunlock(gq);
2356                 }
2357         }
2358         if (uq)
2359                 trace_xfs_dquot_dqalloc(ip);
2360
2361         xfs_iunlock(ip, lockflags);
2362         if (O_udqpp)
2363                 *O_udqpp = uq;
2364         else if (uq)
2365                 xfs_qm_dqrele(uq);
2366         if (O_gdqpp)
2367                 *O_gdqpp = gq;
2368         else if (gq)
2369                 xfs_qm_dqrele(gq);
2370         return 0;
2371 }
2372
2373 /*
2374  * Actually transfer ownership, and do dquot modifications.
2375  * These were already reserved.
2376  */
2377 xfs_dquot_t *
2378 xfs_qm_vop_chown(
2379         xfs_trans_t     *tp,
2380         xfs_inode_t     *ip,
2381         xfs_dquot_t     **IO_olddq,
2382         xfs_dquot_t     *newdq)
2383 {
2384         xfs_dquot_t     *prevdq;
2385         uint            bfield = XFS_IS_REALTIME_INODE(ip) ?
2386                                  XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
2387
2388
2389         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
2390         ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
2391
2392         /* old dquot */
2393         prevdq = *IO_olddq;
2394         ASSERT(prevdq);
2395         ASSERT(prevdq != newdq);
2396
2397         xfs_trans_mod_dquot(tp, prevdq, bfield, -(ip->i_d.di_nblocks));
2398         xfs_trans_mod_dquot(tp, prevdq, XFS_TRANS_DQ_ICOUNT, -1);
2399
2400         /* the sparkling new dquot */
2401         xfs_trans_mod_dquot(tp, newdq, bfield, ip->i_d.di_nblocks);
2402         xfs_trans_mod_dquot(tp, newdq, XFS_TRANS_DQ_ICOUNT, 1);
2403
2404         /*
2405          * Take an extra reference, because the inode
2406          * is going to keep this dquot pointer even
2407          * after the trans_commit.
2408          */
2409         xfs_dqlock(newdq);
2410         XFS_DQHOLD(newdq);
2411         xfs_dqunlock(newdq);
2412         *IO_olddq = newdq;
2413
2414         return prevdq;
2415 }
2416
2417 /*
2418  * Quota reservations for setattr(AT_UID|AT_GID|AT_PROJID).
2419  */
2420 int
2421 xfs_qm_vop_chown_reserve(
2422         xfs_trans_t     *tp,
2423         xfs_inode_t     *ip,
2424         xfs_dquot_t     *udqp,
2425         xfs_dquot_t     *gdqp,
2426         uint            flags)
2427 {
2428         xfs_mount_t     *mp = ip->i_mount;
2429         uint            delblks, blkflags, prjflags = 0;
2430         xfs_dquot_t     *unresudq, *unresgdq, *delblksudq, *delblksgdq;
2431         int             error;
2432
2433
2434         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
2435         ASSERT(XFS_IS_QUOTA_RUNNING(mp));
2436
2437         delblks = ip->i_delayed_blks;
2438         delblksudq = delblksgdq = unresudq = unresgdq = NULL;
2439         blkflags = XFS_IS_REALTIME_INODE(ip) ?
2440                         XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS;
2441
2442         if (XFS_IS_UQUOTA_ON(mp) && udqp &&
2443             ip->i_d.di_uid != (uid_t)be32_to_cpu(udqp->q_core.d_id)) {
2444                 delblksudq = udqp;
2445                 /*
2446                  * If there are delayed allocation blocks, then we have to
2447                  * unreserve those from the old dquot, and add them to the
2448                  * new dquot.
2449                  */
2450                 if (delblks) {
2451                         ASSERT(ip->i_udquot);
2452                         unresudq = ip->i_udquot;
2453                 }
2454         }
2455         if (XFS_IS_OQUOTA_ON(ip->i_mount) && gdqp) {
2456                 if (XFS_IS_PQUOTA_ON(ip->i_mount) &&
2457                      ip->i_d.di_projid != be32_to_cpu(gdqp->q_core.d_id))
2458                         prjflags = XFS_QMOPT_ENOSPC;
2459
2460                 if (prjflags ||
2461                     (XFS_IS_GQUOTA_ON(ip->i_mount) &&
2462                      ip->i_d.di_gid != be32_to_cpu(gdqp->q_core.d_id))) {
2463                         delblksgdq = gdqp;
2464                         if (delblks) {
2465                                 ASSERT(ip->i_gdquot);
2466                                 unresgdq = ip->i_gdquot;
2467                         }
2468                 }
2469         }
2470
2471         if ((error = xfs_trans_reserve_quota_bydquots(tp, ip->i_mount,
2472                                 delblksudq, delblksgdq, ip->i_d.di_nblocks, 1,
2473                                 flags | blkflags | prjflags)))
2474                 return (error);
2475
2476         /*
2477          * Do the delayed blks reservations/unreservations now. Since, these
2478          * are done without the help of a transaction, if a reservation fails
2479          * its previous reservations won't be automatically undone by trans
2480          * code. So, we have to do it manually here.
2481          */
2482         if (delblks) {
2483                 /*
2484                  * Do the reservations first. Unreservation can't fail.
2485                  */
2486                 ASSERT(delblksudq || delblksgdq);
2487                 ASSERT(unresudq || unresgdq);
2488                 if ((error = xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount,
2489                                 delblksudq, delblksgdq, (xfs_qcnt_t)delblks, 0,
2490                                 flags | blkflags | prjflags)))
2491                         return (error);
2492                 xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount,
2493                                 unresudq, unresgdq, -((xfs_qcnt_t)delblks), 0,
2494                                 blkflags);
2495         }
2496
2497         return (0);
2498 }
2499
2500 int
2501 xfs_qm_vop_rename_dqattach(
2502         struct xfs_inode        **i_tab)
2503 {
2504         struct xfs_mount        *mp = i_tab[0]->i_mount;
2505         int                     i;
2506
2507         if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
2508                 return 0;
2509
2510         for (i = 0; (i < 4 && i_tab[i]); i++) {
2511                 struct xfs_inode        *ip = i_tab[i];
2512                 int                     error;
2513
2514                 /*
2515                  * Watch out for duplicate entries in the table.
2516                  */
2517                 if (i == 0 || ip != i_tab[i-1]) {
2518                         if (XFS_NOT_DQATTACHED(mp, ip)) {
2519                                 error = xfs_qm_dqattach(ip, 0);
2520                                 if (error)
2521                                         return error;
2522                         }
2523                 }
2524         }
2525         return 0;
2526 }
2527
2528 void
2529 xfs_qm_vop_create_dqattach(
2530         struct xfs_trans        *tp,
2531         struct xfs_inode        *ip,
2532         struct xfs_dquot        *udqp,
2533         struct xfs_dquot        *gdqp)
2534 {
2535         struct xfs_mount        *mp = tp->t_mountp;
2536
2537         if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
2538                 return;
2539
2540         ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
2541         ASSERT(XFS_IS_QUOTA_RUNNING(mp));
2542
2543         if (udqp) {
2544                 xfs_dqlock(udqp);
2545                 XFS_DQHOLD(udqp);
2546                 xfs_dqunlock(udqp);
2547                 ASSERT(ip->i_udquot == NULL);
2548                 ip->i_udquot = udqp;
2549                 ASSERT(XFS_IS_UQUOTA_ON(mp));
2550                 ASSERT(ip->i_d.di_uid == be32_to_cpu(udqp->q_core.d_id));
2551                 xfs_trans_mod_dquot(tp, udqp, XFS_TRANS_DQ_ICOUNT, 1);
2552         }
2553         if (gdqp) {
2554                 xfs_dqlock(gdqp);
2555                 XFS_DQHOLD(gdqp);
2556                 xfs_dqunlock(gdqp);
2557                 ASSERT(ip->i_gdquot == NULL);
2558                 ip->i_gdquot = gdqp;
2559                 ASSERT(XFS_IS_OQUOTA_ON(mp));
2560                 ASSERT((XFS_IS_GQUOTA_ON(mp) ?
2561                         ip->i_d.di_gid : ip->i_d.di_projid) ==
2562                                 be32_to_cpu(gdqp->q_core.d_id));
2563                 xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1);
2564         }
2565 }
2566