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