2  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
 
   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.
 
   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.
 
  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
 
  24 #include "xfs_trans.h"
 
  28 #include "xfs_alloc.h"
 
  29 #include "xfs_dmapi.h"
 
  30 #include "xfs_quota.h"
 
  31 #include "xfs_mount.h"
 
  32 #include "xfs_bmap_btree.h"
 
  33 #include "xfs_alloc_btree.h"
 
  34 #include "xfs_ialloc_btree.h"
 
  35 #include "xfs_dir2_sf.h"
 
  36 #include "xfs_attr_sf.h"
 
  37 #include "xfs_dinode.h"
 
  38 #include "xfs_inode.h"
 
  39 #include "xfs_btree.h"
 
  40 #include "xfs_ialloc.h"
 
  41 #include "xfs_itable.h"
 
  42 #include "xfs_rtalloc.h"
 
  43 #include "xfs_error.h"
 
  48 #include "xfs_buf_item.h"
 
  49 #include "xfs_trans_space.h"
 
  50 #include "xfs_utils.h"
 
  54  * The global quota manager. There is only one of these for the entire
 
  55  * system, _not_ one per file system. XQM keeps track of the overall
 
  56  * quota functionality, including maintaining the freelist and hash
 
  60 struct xfs_qm   *xfs_Gqm;
 
  63 kmem_zone_t     *qm_dqzone;
 
  64 kmem_zone_t     *qm_dqtrxzone;
 
  65 static kmem_shaker_t    xfs_qm_shaker;
 
  67 static cred_t   xfs_zerocr;
 
  68 static xfs_inode_t      xfs_zeroino;
 
  70 STATIC void     xfs_qm_list_init(xfs_dqlist_t *, char *, int);
 
  71 STATIC void     xfs_qm_list_destroy(xfs_dqlist_t *);
 
  73 STATIC void     xfs_qm_freelist_init(xfs_frlist_t *);
 
  74 STATIC void     xfs_qm_freelist_destroy(xfs_frlist_t *);
 
  75 STATIC int      xfs_qm_mplist_nowait(xfs_mount_t *);
 
  76 STATIC int      xfs_qm_dqhashlock_nowait(xfs_dquot_t *);
 
  78 STATIC int      xfs_qm_init_quotainos(xfs_mount_t *);
 
  79 STATIC int      xfs_qm_init_quotainfo(xfs_mount_t *);
 
  80 STATIC int      xfs_qm_shake(int, gfp_t);
 
  83 extern mutex_t  qcheck_lock;
 
  87 #define XQM_LIST_PRINT(l, NXT, title) \
 
  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);  } \
 
 101 #define XQM_LIST_PRINT(l, NXT, title) do { } while (0)
 
 105  * Initialize the XQM structure.
 
 106  * Note that there is not one quota manager per file system.
 
 108 STATIC struct xfs_qm *
 
 111         xfs_dqhash_t    *udqhash, *gdqhash;
 
 117          * Initialize the dquot hash tables.
 
 119         udqhash = kmem_zalloc_greedy(&hsize,
 
 120                                      XFS_QM_HASHSIZE_LOW, XFS_QM_HASHSIZE_HIGH,
 
 121                                      KM_SLEEP | KM_MAYFAIL | KM_LARGE);
 
 122         gdqhash = kmem_zalloc(hsize, KM_SLEEP | KM_LARGE);
 
 123         hsize /= sizeof(xfs_dqhash_t);
 
 126         xqm = kmem_zalloc(sizeof(xfs_qm_t), KM_SLEEP);
 
 127         xqm->qm_dqhashmask = hsize - 1;
 
 128         xqm->qm_usr_dqhtable = udqhash;
 
 129         xqm->qm_grp_dqhtable = gdqhash;
 
 130         ASSERT(xqm->qm_usr_dqhtable != NULL);
 
 131         ASSERT(xqm->qm_grp_dqhtable != NULL);
 
 133         for (i = 0; i < hsize; i++) {
 
 134                 xfs_qm_list_init(&(xqm->qm_usr_dqhtable[i]), "uxdqh", i);
 
 135                 xfs_qm_list_init(&(xqm->qm_grp_dqhtable[i]), "gxdqh", i);
 
 139          * Freelist of all dquots of all file systems
 
 141         xfs_qm_freelist_init(&(xqm->qm_dqfreelist));
 
 144          * dquot zone. we register our own low-memory callback.
 
 147                 xqm->qm_dqzone = kmem_zone_init(sizeof(xfs_dquot_t),
 
 149                 qm_dqzone = xqm->qm_dqzone;
 
 151                 xqm->qm_dqzone = qm_dqzone;
 
 153         xfs_qm_shaker = kmem_shake_register(xfs_qm_shake);
 
 156          * The t_dqinfo portion of transactions.
 
 159                 xqm->qm_dqtrxzone = kmem_zone_init(sizeof(xfs_dquot_acct_t),
 
 161                 qm_dqtrxzone = xqm->qm_dqtrxzone;
 
 163                 xqm->qm_dqtrxzone = qm_dqtrxzone;
 
 165         atomic_set(&xqm->qm_totaldquots, 0);
 
 166         xqm->qm_dqfree_ratio = XFS_QM_DQFREE_RATIO;
 
 169         mutex_init(&qcheck_lock);
 
 175  * Destroy the global quota manager when its reference count goes to zero.
 
 184         ASSERT(xqm->qm_nrefs == 0);
 
 185         kmem_shake_deregister(xfs_qm_shaker);
 
 186         hsize = xqm->qm_dqhashmask + 1;
 
 187         for (i = 0; i < hsize; i++) {
 
 188                 xfs_qm_list_destroy(&(xqm->qm_usr_dqhtable[i]));
 
 189                 xfs_qm_list_destroy(&(xqm->qm_grp_dqhtable[i]));
 
 191         kmem_free(xqm->qm_usr_dqhtable, hsize * sizeof(xfs_dqhash_t));
 
 192         kmem_free(xqm->qm_grp_dqhtable, hsize * sizeof(xfs_dqhash_t));
 
 193         xqm->qm_usr_dqhtable = NULL;
 
 194         xqm->qm_grp_dqhtable = NULL;
 
 195         xqm->qm_dqhashmask = 0;
 
 196         xfs_qm_freelist_destroy(&(xqm->qm_dqfreelist));
 
 198         mutex_destroy(&qcheck_lock);
 
 200         kmem_free(xqm, sizeof(xfs_qm_t));
 
 204  * Called at mount time to let XQM know that another file system is
 
 205  * starting quotas. This isn't crucial information as the individual mount
 
 206  * structures are pretty independent, but it helps the XQM keep a
 
 207  * global view of what's going on.
 
 211 xfs_qm_hold_quotafs_ref(
 
 212         struct xfs_mount *mp)
 
 215          * Need to lock the xfs_Gqm structure for things like this. For example,
 
 216          * the structure could disappear between the entry to this routine and
 
 217          * a HOLD operation if not locked.
 
 219         XFS_QM_LOCK(xfs_Gqm);
 
 222                 xfs_Gqm = xfs_Gqm_init();
 
 224          * We can keep a list of all filesystems with quotas mounted for
 
 225          * debugging and statistical purposes, but ...
 
 226          * Just take a reference and get out.
 
 228         XFS_QM_HOLD(xfs_Gqm);
 
 229         XFS_QM_UNLOCK(xfs_Gqm);
 
 236  * Release the reference that a filesystem took at mount time,
 
 237  * so that we know when we need to destroy the entire quota manager.
 
 241 xfs_qm_rele_quotafs_ref(
 
 242         struct xfs_mount *mp)
 
 244         xfs_dquot_t     *dqp, *nextdqp;
 
 247         ASSERT(xfs_Gqm->qm_nrefs > 0);
 
 250          * Go thru the freelist and destroy all inactive dquots.
 
 252         xfs_qm_freelist_lock(xfs_Gqm);
 
 254         for (dqp = xfs_Gqm->qm_dqfreelist.qh_next;
 
 255              dqp != (xfs_dquot_t *)&(xfs_Gqm->qm_dqfreelist); ) {
 
 257                 nextdqp = dqp->dq_flnext;
 
 258                 if (dqp->dq_flags & XFS_DQ_INACTIVE) {
 
 259                         ASSERT(dqp->q_mount == NULL);
 
 260                         ASSERT(! XFS_DQ_IS_DIRTY(dqp));
 
 261                         ASSERT(dqp->HL_PREVP == NULL);
 
 262                         ASSERT(dqp->MPL_PREVP == NULL);
 
 263                         XQM_FREELIST_REMOVE(dqp);
 
 265                         xfs_qm_dqdestroy(dqp);
 
 271         xfs_qm_freelist_unlock(xfs_Gqm);
 
 274          * Destroy the entire XQM. If somebody mounts with quotaon, this'll
 
 277         XFS_QM_LOCK(xfs_Gqm);
 
 278         XFS_QM_RELE(xfs_Gqm);
 
 279         if (xfs_Gqm->qm_nrefs == 0) {
 
 280                 xfs_qm_destroy(xfs_Gqm);
 
 283         XFS_QM_UNLOCK(xfs_Gqm);
 
 287  * This is called at mount time from xfs_mountfs to initialize the quotainfo
 
 288  * structure and start the global quota manager (xfs_Gqm) if it hasn't done
 
 289  * so already.  Note that the superblock has not been read in yet.
 
 292 xfs_qm_mount_quotainit(
 
 297          * User, projects or group quotas has to be on.
 
 299         ASSERT(flags & (XFSMNT_UQUOTA | XFSMNT_PQUOTA | XFSMNT_GQUOTA));
 
 302          * Initialize the flags in the mount structure. From this point
 
 303          * onwards we look at m_qflags to figure out if quotas's ON/OFF, etc.
 
 304          * Note that we enforce nothing if accounting is off.
 
 305          * ie.  XFSMNT_*QUOTA must be ON for XFSMNT_*QUOTAENF.
 
 306          * It isn't necessary to take the quotaoff lock to do this; this is
 
 309         if (flags & XFSMNT_UQUOTA) {
 
 310                 mp->m_qflags |= (XFS_UQUOTA_ACCT | XFS_UQUOTA_ACTIVE);
 
 311                 if (flags & XFSMNT_UQUOTAENF)
 
 312                         mp->m_qflags |= XFS_UQUOTA_ENFD;
 
 314         if (flags & XFSMNT_GQUOTA) {
 
 315                 mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE);
 
 316                 if (flags & XFSMNT_GQUOTAENF)
 
 317                         mp->m_qflags |= XFS_OQUOTA_ENFD;
 
 318         } else if (flags & XFSMNT_PQUOTA) {
 
 319                 mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE);
 
 320                 if (flags & XFSMNT_PQUOTAENF)
 
 321                         mp->m_qflags |= XFS_OQUOTA_ENFD;
 
 326  * Just destroy the quotainfo structure.
 
 329 xfs_qm_unmount_quotadestroy(
 
 333                 xfs_qm_destroy_quotainfo(mp);
 
 338  * This is called from xfs_mountfs to start quotas and initialize all
 
 339  * necessary data structures like quotainfo.  This is also responsible for
 
 340  * running a quotacheck as necessary.  We are guaranteed that the superblock
 
 341  * is consistently read in at this point.
 
 354          * If quotas on realtime volumes is not supported, we disable
 
 355          * quotas immediately.
 
 357         if (mp->m_sb.sb_rextents) {
 
 359                         "Cannot turn on quotas for realtime filesystem %s",
 
 365         ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 
 368          * Allocate the quotainfo structure inside the mount struct, and
 
 369          * create quotainode(s), and change/rev superblock if necessary.
 
 371         if ((error = xfs_qm_init_quotainfo(mp))) {
 
 373                  * We must turn off quotas.
 
 375                 ASSERT(mp->m_quotainfo == NULL);
 
 380          * If any of the quotas are not consistent, do a quotacheck.
 
 382         if (XFS_QM_NEED_QUOTACHECK(mp) &&
 
 383                 !(mfsi_flags & XFS_MFSI_NO_QUOTACHECK)) {
 
 384                 if ((error = xfs_qm_quotacheck(mp))) {
 
 385                         /* Quotacheck has failed and quotas have
 
 388                         return XFS_ERROR(error);
 
 394          * We actually don't have to acquire the SB_LOCK at all.
 
 395          * This can only be called from mount, and that's single threaded. XXX
 
 398         sbf = mp->m_sb.sb_qflags;
 
 399         mp->m_sb.sb_qflags = mp->m_qflags & XFS_MOUNT_QUOTA_ALL;
 
 400         XFS_SB_UNLOCK(mp, s);
 
 402         if (sbf != (mp->m_qflags & XFS_MOUNT_QUOTA_ALL)) {
 
 403                 if (xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS)) {
 
 405                          * We could only have been turning quotas off.
 
 406                          * We aren't in very good shape actually because
 
 407                          * the incore structures are convinced that quotas are
 
 408                          * off, but the on disk superblock doesn't know that !
 
 410                         ASSERT(!(XFS_IS_QUOTA_RUNNING(mp)));
 
 411                         xfs_fs_cmn_err(CE_ALERT, mp,
 
 412                                 "XFS mount_quotas: Superblock update failed!");
 
 417                 xfs_fs_cmn_err(CE_WARN, mp,
 
 418                         "Failed to initialize disk quotas.");
 
 420         return XFS_ERROR(error);
 
 424  * Called from the vfsops layer.
 
 427 xfs_qm_unmount_quotas(
 
 430         xfs_inode_t     *uqp, *gqp;
 
 434          * Release the dquots that root inode, et al might be holding,
 
 435          * before we flush quotas and blow away the quotainfo structure.
 
 437         ASSERT(mp->m_rootip);
 
 438         xfs_qm_dqdetach(mp->m_rootip);
 
 440                 xfs_qm_dqdetach(mp->m_rbmip);
 
 442                 xfs_qm_dqdetach(mp->m_rsumip);
 
 445          * Flush out the quota inodes.
 
 448         if (mp->m_quotainfo) {
 
 449                 if ((uqp = mp->m_quotainfo->qi_uquotaip) != NULL) {
 
 450                         xfs_ilock(uqp, XFS_ILOCK_EXCL);
 
 452                         error = xfs_iflush(uqp, XFS_IFLUSH_SYNC);
 
 453                         xfs_iunlock(uqp, XFS_ILOCK_EXCL);
 
 454                         if (unlikely(error == EFSCORRUPTED)) {
 
 455                                 XFS_ERROR_REPORT("xfs_qm_unmount_quotas(1)",
 
 456                                                  XFS_ERRLEVEL_LOW, mp);
 
 460                 if ((gqp = mp->m_quotainfo->qi_gquotaip) != NULL) {
 
 461                         xfs_ilock(gqp, XFS_ILOCK_EXCL);
 
 463                         error = xfs_iflush(gqp, XFS_IFLUSH_SYNC);
 
 464                         xfs_iunlock(gqp, XFS_ILOCK_EXCL);
 
 465                         if (unlikely(error == EFSCORRUPTED)) {
 
 466                                 XFS_ERROR_REPORT("xfs_qm_unmount_quotas(2)",
 
 467                                                  XFS_ERRLEVEL_LOW, mp);
 
 473                  XFS_PURGE_INODE(uqp);
 
 474                  mp->m_quotainfo->qi_uquotaip = NULL;
 
 477                 XFS_PURGE_INODE(gqp);
 
 478                 mp->m_quotainfo->qi_gquotaip = NULL;
 
 481         return XFS_ERROR(error);
 
 485  * Flush all dquots of the given file system to disk. The dquots are
 
 486  * _not_ purged from memory here, just their data written to disk.
 
 498         if (mp->m_quotainfo == NULL)
 
 502         xfs_qm_mplist_lock(mp);
 
 503         FOREACH_DQUOT_IN_MP(dqp, mp) {
 
 505                 if (! XFS_DQ_IS_DIRTY(dqp)) {
 
 509                 xfs_dqtrace_entry(dqp, "FLUSHALL: DQDIRTY");
 
 510                 /* XXX a sentinel would be better */
 
 511                 recl = XFS_QI_MPLRECLAIMS(mp);
 
 512                 if (! xfs_qm_dqflock_nowait(dqp)) {
 
 514                          * If we can't grab the flush lock then check
 
 515                          * to see if the dquot has been flushed delayed
 
 516                          * write.  If so, grab its buffer and send it
 
 517                          * out immediately.  We'll be able to acquire
 
 518                          * the flush lock when the I/O completes.
 
 520                         xfs_qm_dqflock_pushbuf_wait(dqp);
 
 523                  * Let go of the mplist lock. We don't want to hold it
 
 524                  * across a disk write.
 
 526                 xfs_qm_mplist_unlock(mp);
 
 527                 error = xfs_qm_dqflush(dqp, flags);
 
 532                 xfs_qm_mplist_lock(mp);
 
 533                 if (recl != XFS_QI_MPLRECLAIMS(mp)) {
 
 534                         xfs_qm_mplist_unlock(mp);
 
 535                         /* XXX restart limit */
 
 540         xfs_qm_mplist_unlock(mp);
 
 545  * Release the group dquot pointers the user dquots may be
 
 546  * carrying around as a hint. mplist is locked on entry and exit.
 
 549 xfs_qm_detach_gdquots(
 
 552         xfs_dquot_t     *dqp, *gdqp;
 
 556         ASSERT(XFS_QM_IS_MPLIST_LOCKED(mp));
 
 557         dqp = XFS_QI_MPLNEXT(mp);
 
 560                 if ((gdqp = dqp->q_gdquot)) {
 
 562                         dqp->q_gdquot = NULL;
 
 568                          * Can't hold the mplist lock across a dqput.
 
 569                          * XXXmust convert to marker based iterations here.
 
 571                         nrecl = XFS_QI_MPLRECLAIMS(mp);
 
 572                         xfs_qm_mplist_unlock(mp);
 
 575                         xfs_qm_mplist_lock(mp);
 
 576                         if (nrecl != XFS_QI_MPLRECLAIMS(mp))
 
 584  * Go through all the incore dquots of this file system and take them
 
 585  * off the mplist and hashlist, if the dquot type matches the dqtype
 
 586  * parameter. This is used when turning off quota accounting for
 
 587  * users and/or groups, as well as when the filesystem is unmounting.
 
 592         uint            flags) /* QUOTAOFF/UMOUNTING/UQUOTA/PQUOTA/GQUOTA */
 
 597         xfs_dquot_t     *nextdqp;
 
 600         if (mp->m_quotainfo == NULL)
 
 603         dqtype = (flags & XFS_QMOPT_UQUOTA) ? XFS_DQ_USER : 0;
 
 604         dqtype |= (flags & XFS_QMOPT_PQUOTA) ? XFS_DQ_PROJ : 0;
 
 605         dqtype |= (flags & XFS_QMOPT_GQUOTA) ? XFS_DQ_GROUP : 0;
 
 607         xfs_qm_mplist_lock(mp);
 
 610          * In the first pass through all incore dquots of this filesystem,
 
 611          * we release the group dquot pointers the user dquots may be
 
 612          * carrying around as a hint. We need to do this irrespective of
 
 613          * what's being turned off.
 
 615         xfs_qm_detach_gdquots(mp);
 
 619         ASSERT(XFS_QM_IS_MPLIST_LOCKED(mp));
 
 621          * Try to get rid of all of the unwanted dquots. The idea is to
 
 622          * get them off mplist and hashlist, but leave them on freelist.
 
 624         dqp = XFS_QI_MPLNEXT(mp);
 
 627                  * It's OK to look at the type without taking dqlock here.
 
 628                  * We're holding the mplist lock here, and that's needed for
 
 631                 if ((dqp->dq_flags & dqtype) == 0) {
 
 636                 if (! xfs_qm_dqhashlock_nowait(dqp)) {
 
 637                         nrecl = XFS_QI_MPLRECLAIMS(mp);
 
 638                         xfs_qm_mplist_unlock(mp);
 
 639                         XFS_DQ_HASH_LOCK(dqp->q_hash);
 
 640                         xfs_qm_mplist_lock(mp);
 
 643                          * XXXTheoretically, we can get into a very long
 
 644                          * ping pong game here.
 
 645                          * No one can be adding dquots to the mplist at
 
 646                          * this point, but somebody might be taking things off.
 
 648                         if (nrecl != XFS_QI_MPLRECLAIMS(mp)) {
 
 649                                 XFS_DQ_HASH_UNLOCK(dqp->q_hash);
 
 655                  * Take the dquot off the mplist and hashlist. It may remain on
 
 656                  * freelist in INACTIVE state.
 
 658                 nextdqp = dqp->MPL_NEXT;
 
 659                 nmisses += xfs_qm_dqpurge(dqp, flags);
 
 662         xfs_qm_mplist_unlock(mp);
 
 674          * Purge the dquot cache.
 
 675          * None of the dquots should really be busy at this point.
 
 677         if (mp->m_quotainfo) {
 
 678                 while ((ndquots = xfs_qm_dqpurge_int(mp, flags))) {
 
 692         xfs_dquot_t     *udqhint, /* hint */
 
 693         xfs_dquot_t     **IO_idqpp)
 
 698         ASSERT(XFS_ISLOCKED_INODE_EXCL(ip));
 
 701          * See if we already have it in the inode itself. IO_idqpp is
 
 702          * &i_udquot or &i_gdquot. This made the code look weird, but
 
 703          * made the logic a lot simpler.
 
 705         if ((dqp = *IO_idqpp)) {
 
 708                 xfs_dqtrace_entry(dqp, "DQATTACH: found in ip");
 
 713          * udqhint is the i_udquot field in inode, and is non-NULL only
 
 714          * when the type arg is group/project. Its purpose is to save a
 
 715          * lookup by dqid (xfs_qm_dqget) by caching a group dquot inside
 
 718         ASSERT(!udqhint || type == XFS_DQ_GROUP || type == XFS_DQ_PROJ);
 
 719         if (udqhint && !dolock)
 
 723          * No need to take dqlock to look at the id.
 
 724          * The ID can't change until it gets reclaimed, and it won't
 
 725          * be reclaimed as long as we have a ref from inode and we hold
 
 729             (dqp = udqhint->q_gdquot) &&
 
 730             (be32_to_cpu(dqp->q_core.d_id) == id)) {
 
 731                 ASSERT(XFS_DQ_IS_LOCKED(udqhint));
 
 734                 ASSERT(*IO_idqpp == NULL);
 
 738                         xfs_dqunlock(udqhint);
 
 743          * We can't hold a dquot lock when we call the dqget code.
 
 744          * We'll deadlock in no time, because of (not conforming to)
 
 745          * lock ordering - the inodelock comes before any dquot lock,
 
 746          * and we may drop and reacquire the ilock in xfs_qm_dqget().
 
 749                 xfs_dqunlock(udqhint);
 
 751          * Find the dquot from somewhere. This bumps the
 
 752          * reference count of dquot and returns it locked.
 
 753          * This can return ENOENT if dquot didn't exist on
 
 754          * disk and we didn't ask it to allocate;
 
 755          * ESRCH if quotas got turned off suddenly.
 
 757         if ((error = xfs_qm_dqget(ip->i_mount, ip, id, type,
 
 758                                  doalloc|XFS_QMOPT_DOWARN, &dqp))) {
 
 759                 if (udqhint && dolock)
 
 764         xfs_dqtrace_entry(dqp, "DQATTACH: found by dqget");
 
 766          * dqget may have dropped and re-acquired the ilock, but it guarantees
 
 767          * that the dquot returned is the one that should go in the inode.
 
 771         ASSERT(XFS_DQ_IS_LOCKED(dqp));
 
 781         ASSERT(XFS_DQ_IS_LOCKED(dqp));
 
 782         if (! xfs_qm_dqlock_nowait(udqhint)) {
 
 791                         ASSERT(XFS_DQ_IS_LOCKED(udqhint));
 
 795                         ASSERT(XFS_DQ_IS_LOCKED(dqp));
 
 803  * Given a udquot and gdquot, attach a ptr to the group dquot in the
 
 804  * udquot as a hint for future lookups. The idea sounds simple, but the
 
 805  * execution isn't, because the udquot might have a group dquot attached
 
 806  * already and getting rid of that gets us into lock ordering constraints.
 
 807  * The process is complicated more by the fact that the dquots may or may not
 
 808  * be locked on entry.
 
 811 xfs_qm_dqattach_grouphint(
 
 820                 ASSERT(XFS_DQ_IS_LOCKED(udq));
 
 821                 ASSERT(XFS_DQ_IS_LOCKED(gdq));
 
 827         if ((tmp = udq->q_gdquot)) {
 
 834                 udq->q_gdquot = NULL;
 
 836                  * We can't keep any dqlocks when calling dqrele,
 
 837                  * because the freelist lock comes before dqlocks.
 
 843                  * we took a hard reference once upon a time in dqget,
 
 844                  * so give it back when the udquot no longer points at it
 
 845                  * dqput() does the unlocking of the dquot.
 
 853                 ASSERT(XFS_DQ_IS_LOCKED(udq));
 
 859         ASSERT(XFS_DQ_IS_LOCKED(udq));
 
 860         ASSERT(XFS_DQ_IS_LOCKED(gdq));
 
 862          * Somebody could have attached a gdquot here,
 
 863          * when we dropped the uqlock. If so, just do nothing.
 
 865         if (udq->q_gdquot == NULL) {
 
 877  * Given a locked inode, attach dquot(s) to it, taking U/G/P-QUOTAON
 
 879  * If XFS_QMOPT_DQALLOC, the dquot(s) will be allocated if needed.
 
 880  * If XFS_QMOPT_DQLOCK, the dquot(s) will be returned locked. This option pretty
 
 881  * much made this code a complete mess, but it has been pretty useful.
 
 882  * If XFS_QMOPT_ILOCKED, then inode sent is already locked EXCL.
 
 883  * Inode may get unlocked and relocked in here, and the caller must deal with
 
 891         xfs_mount_t     *mp = ip->i_mount;
 
 895         if ((! XFS_IS_QUOTA_ON(mp)) ||
 
 896             (! XFS_NOT_DQATTACHED(mp, ip)) ||
 
 897             (ip->i_ino == mp->m_sb.sb_uquotino) ||
 
 898             (ip->i_ino == mp->m_sb.sb_gquotino))
 
 901         ASSERT((flags & XFS_QMOPT_ILOCKED) == 0 ||
 
 902                XFS_ISLOCKED_INODE_EXCL(ip));
 
 904         if (! (flags & XFS_QMOPT_ILOCKED))
 
 905                 xfs_ilock(ip, XFS_ILOCK_EXCL);
 
 907         if (XFS_IS_UQUOTA_ON(mp)) {
 
 908                 error = xfs_qm_dqattach_one(ip, ip->i_d.di_uid, XFS_DQ_USER,
 
 909                                                 flags & XFS_QMOPT_DQALLOC,
 
 910                                                 flags & XFS_QMOPT_DQLOCK,
 
 911                                                 NULL, &ip->i_udquot);
 
 916         ASSERT(XFS_ISLOCKED_INODE_EXCL(ip));
 
 917         if (XFS_IS_OQUOTA_ON(mp)) {
 
 918                 error = XFS_IS_GQUOTA_ON(mp) ?
 
 919                         xfs_qm_dqattach_one(ip, ip->i_d.di_gid, XFS_DQ_GROUP,
 
 920                                                 flags & XFS_QMOPT_DQALLOC,
 
 921                                                 flags & XFS_QMOPT_DQLOCK,
 
 922                                                 ip->i_udquot, &ip->i_gdquot) :
 
 923                         xfs_qm_dqattach_one(ip, ip->i_d.di_projid, XFS_DQ_PROJ,
 
 924                                                 flags & XFS_QMOPT_DQALLOC,
 
 925                                                 flags & XFS_QMOPT_DQLOCK,
 
 926                                                 ip->i_udquot, &ip->i_gdquot);
 
 928                  * Don't worry about the udquot that we may have
 
 929                  * attached above. It'll get detached, if not already.
 
 937          * Attach this group quota to the user quota as a hint.
 
 938          * This WON'T, in general, result in a thrash.
 
 941                 ASSERT(XFS_ISLOCKED_INODE_EXCL(ip));
 
 942                 ASSERT(ip->i_udquot);
 
 943                 ASSERT(ip->i_gdquot);
 
 946                  * We may or may not have the i_udquot locked at this point,
 
 947                  * but this check is OK since we don't depend on the i_gdquot to
 
 948                  * be accurate 100% all the time. It is just a hint, and this
 
 949                  * will succeed in general.
 
 951                 if (ip->i_udquot->q_gdquot == ip->i_gdquot)
 
 954                  * Attach i_gdquot to the gdquot hint inside the i_udquot.
 
 956                 xfs_qm_dqattach_grouphint(ip->i_udquot, ip->i_gdquot,
 
 957                                          flags & XFS_QMOPT_DQLOCK);
 
 965                         if (flags & XFS_QMOPT_DQLOCK)
 
 966                                 ASSERT(XFS_DQ_IS_LOCKED(ip->i_udquot));
 
 969                         if (flags & XFS_QMOPT_DQLOCK)
 
 970                                 ASSERT(XFS_DQ_IS_LOCKED(ip->i_gdquot));
 
 972                 if (XFS_IS_UQUOTA_ON(mp))
 
 973                         ASSERT(ip->i_udquot);
 
 974                 if (XFS_IS_OQUOTA_ON(mp))
 
 975                         ASSERT(ip->i_gdquot);
 
 979         if (! (flags & XFS_QMOPT_ILOCKED))
 
 980                 xfs_iunlock(ip, XFS_ILOCK_EXCL);
 
 984                 ASSERT(XFS_ISLOCKED_INODE_EXCL(ip));
 
 990  * Release dquots (and their references) if any.
 
 991  * The inode should be locked EXCL except when this's called by
 
 998         if (!(ip->i_udquot || ip->i_gdquot))
 
1001         ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_uquotino);
 
1002         ASSERT(ip->i_ino != ip->i_mount->m_sb.sb_gquotino);
 
1004                 xfs_dqtrace_entry_ino(ip->i_udquot, "DQDETTACH", ip);
 
1005                 xfs_qm_dqrele(ip->i_udquot);
 
1006                 ip->i_udquot = NULL;
 
1009                 xfs_dqtrace_entry_ino(ip->i_gdquot, "DQDETTACH", ip);
 
1010                 xfs_qm_dqrele(ip->i_gdquot);
 
1011                 ip->i_gdquot = NULL;
 
1016  * This is called by VFS_SYNC and flags arg determines the caller,
 
1017  * and its motives, as done in xfs_sync.
 
1019  * vfs_sync: SYNC_FSDATA|SYNC_ATTR|SYNC_BDFLUSH 0x31
 
1020  * syscall sync: SYNC_FSDATA|SYNC_ATTR|SYNC_DELWRI 0x25
 
1021  * umountroot : SYNC_WAIT | SYNC_CLOSE | SYNC_ATTR | SYNC_FSDATA
 
1037          * We won't block unless we are asked to.
 
1039         nowait = (boolean_t)(flags & SYNC_BDFLUSH || (flags & SYNC_WAIT) == 0);
 
1042         xfs_qm_mplist_lock(mp);
 
1044          * dqpurge_all() also takes the mplist lock and iterate thru all dquots
 
1045          * in quotaoff. However, if the QUOTA_ACTIVE bits are not cleared
 
1046          * when we have the mplist lock, we know that dquots will be consistent
 
1047          * as long as we have it locked.
 
1049         if (! XFS_IS_QUOTA_ON(mp)) {
 
1050                 xfs_qm_mplist_unlock(mp);
 
1053         FOREACH_DQUOT_IN_MP(dqp, mp) {
 
1055                  * If this is vfs_sync calling, then skip the dquots that
 
1056                  * don't 'seem' to be dirty. ie. don't acquire dqlock.
 
1057                  * This is very similar to what xfs_sync does with inodes.
 
1059                 if (flags & SYNC_BDFLUSH) {
 
1060                         if (! XFS_DQ_IS_DIRTY(dqp))
 
1066                          * Try to acquire the dquot lock. We are NOT out of
 
1067                          * lock order, but we just don't want to wait for this
 
1068                          * lock, unless somebody wanted us to.
 
1070                         if (! xfs_qm_dqlock_nowait(dqp))
 
1077                  * Now, find out for sure if this dquot is dirty or not.
 
1079                 if (! XFS_DQ_IS_DIRTY(dqp)) {
 
1084                 /* XXX a sentinel would be better */
 
1085                 recl = XFS_QI_MPLRECLAIMS(mp);
 
1086                 if (! xfs_qm_dqflock_nowait(dqp)) {
 
1092                          * If we can't grab the flush lock then if the caller
 
1093                          * really wanted us to give this our best shot, so
 
1094                          * see if we can give a push to the buffer before we wait
 
1095                          * on the flush lock. At this point, we know that
 
1096                          * even though the dquot is being flushed,
 
1097                          * it has (new) dirty data.
 
1099                         xfs_qm_dqflock_pushbuf_wait(dqp);
 
1102                  * Let go of the mplist lock. We don't want to hold it
 
1103                  * across a disk write
 
1105                 flush_flags = (nowait) ? XFS_QMOPT_DELWRI : XFS_QMOPT_SYNC;
 
1106                 xfs_qm_mplist_unlock(mp);
 
1107                 xfs_dqtrace_entry(dqp, "XQM_SYNC: DQFLUSH");
 
1108                 error = xfs_qm_dqflush(dqp, flush_flags);
 
1110                 if (error && XFS_FORCED_SHUTDOWN(mp))
 
1111                         return 0;       /* Need to prevent umount failure */
 
1115                 xfs_qm_mplist_lock(mp);
 
1116                 if (recl != XFS_QI_MPLRECLAIMS(mp)) {
 
1117                         if (++restarts >= XFS_QM_SYNC_MAX_RESTARTS)
 
1120                         xfs_qm_mplist_unlock(mp);
 
1125         xfs_qm_mplist_unlock(mp);
 
1131  * This initializes all the quota information that's kept in the
 
1135 xfs_qm_init_quotainfo(
 
1138         xfs_quotainfo_t *qinf;
 
1142         ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 
1145          * Tell XQM that we exist as soon as possible.
 
1147         if ((error = xfs_qm_hold_quotafs_ref(mp))) {
 
1151         qinf = mp->m_quotainfo = kmem_zalloc(sizeof(xfs_quotainfo_t), KM_SLEEP);
 
1154          * See if quotainodes are setup, and if not, allocate them,
 
1155          * and change the superblock accordingly.
 
1157         if ((error = xfs_qm_init_quotainos(mp))) {
 
1158                 kmem_free(qinf, sizeof(xfs_quotainfo_t));
 
1159                 mp->m_quotainfo = NULL;
 
1163         spinlock_init(&qinf->qi_pinlock, "xfs_qinf_pin");
 
1164         xfs_qm_list_init(&qinf->qi_dqlist, "mpdqlist", 0);
 
1165         qinf->qi_dqreclaims = 0;
 
1167         /* mutex used to serialize quotaoffs */
 
1168         mutex_init(&qinf->qi_quotaofflock);
 
1170         /* Precalc some constants */
 
1171         qinf->qi_dqchunklen = XFS_FSB_TO_BB(mp, XFS_DQUOT_CLUSTER_SIZE_FSB);
 
1172         ASSERT(qinf->qi_dqchunklen);
 
1173         qinf->qi_dqperchunk = BBTOB(qinf->qi_dqchunklen);
 
1174         do_div(qinf->qi_dqperchunk, sizeof(xfs_dqblk_t));
 
1176         mp->m_qflags |= (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_CHKD);
 
1179          * We try to get the limits from the superuser's limits fields.
 
1180          * This is quite hacky, but it is standard quota practice.
 
1181          * We look at the USR dquot with id == 0 first, but if user quotas
 
1182          * are not enabled we goto the GRP dquot with id == 0.
 
1183          * We don't really care to keep separate default limits for user
 
1184          * and group quotas, at least not at this point.
 
1186         error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)0,
 
1187                              XFS_IS_UQUOTA_RUNNING(mp) ? XFS_DQ_USER : 
 
1188                              (XFS_IS_GQUOTA_RUNNING(mp) ? XFS_DQ_GROUP :
 
1190                              XFS_QMOPT_DQSUSER|XFS_QMOPT_DOWARN,
 
1193                 xfs_disk_dquot_t        *ddqp = &dqp->q_core;
 
1196                  * The warnings and timers set the grace period given to
 
1197                  * a user or group before he or she can not perform any
 
1198                  * more writing. If it is zero, a default is used.
 
1200                 qinf->qi_btimelimit = ddqp->d_btimer ?
 
1201                         be32_to_cpu(ddqp->d_btimer) : XFS_QM_BTIMELIMIT;
 
1202                 qinf->qi_itimelimit = ddqp->d_itimer ?
 
1203                         be32_to_cpu(ddqp->d_itimer) : XFS_QM_ITIMELIMIT;
 
1204                 qinf->qi_rtbtimelimit = ddqp->d_rtbtimer ?
 
1205                         be32_to_cpu(ddqp->d_rtbtimer) : XFS_QM_RTBTIMELIMIT;
 
1206                 qinf->qi_bwarnlimit = ddqp->d_bwarns ?
 
1207                         be16_to_cpu(ddqp->d_bwarns) : XFS_QM_BWARNLIMIT;
 
1208                 qinf->qi_iwarnlimit = ddqp->d_iwarns ?
 
1209                         be16_to_cpu(ddqp->d_iwarns) : XFS_QM_IWARNLIMIT;
 
1210                 qinf->qi_rtbwarnlimit = ddqp->d_rtbwarns ?
 
1211                         be16_to_cpu(ddqp->d_rtbwarns) : XFS_QM_RTBWARNLIMIT;
 
1212                 qinf->qi_bhardlimit = be64_to_cpu(ddqp->d_blk_hardlimit);
 
1213                 qinf->qi_bsoftlimit = be64_to_cpu(ddqp->d_blk_softlimit);
 
1214                 qinf->qi_ihardlimit = be64_to_cpu(ddqp->d_ino_hardlimit);
 
1215                 qinf->qi_isoftlimit = be64_to_cpu(ddqp->d_ino_softlimit);
 
1216                 qinf->qi_rtbhardlimit = be64_to_cpu(ddqp->d_rtb_hardlimit);
 
1217                 qinf->qi_rtbsoftlimit = be64_to_cpu(ddqp->d_rtb_softlimit);
 
1220                  * We sent the XFS_QMOPT_DQSUSER flag to dqget because
 
1221                  * we don't want this dquot cached. We haven't done a
 
1222                  * quotacheck yet, and quotacheck doesn't like incore dquots.
 
1224                 xfs_qm_dqdestroy(dqp);
 
1226                 qinf->qi_btimelimit = XFS_QM_BTIMELIMIT;
 
1227                 qinf->qi_itimelimit = XFS_QM_ITIMELIMIT;
 
1228                 qinf->qi_rtbtimelimit = XFS_QM_RTBTIMELIMIT;
 
1229                 qinf->qi_bwarnlimit = XFS_QM_BWARNLIMIT;
 
1230                 qinf->qi_iwarnlimit = XFS_QM_IWARNLIMIT;
 
1231                 qinf->qi_rtbwarnlimit = XFS_QM_RTBWARNLIMIT;
 
1239  * Gets called when unmounting a filesystem or when all quotas get
 
1241  * This purges the quota inodes, destroys locks and frees itself.
 
1244 xfs_qm_destroy_quotainfo(
 
1247         xfs_quotainfo_t *qi;
 
1249         qi = mp->m_quotainfo;
 
1251         ASSERT(xfs_Gqm != NULL);
 
1254          * Release the reference that XQM kept, so that we know
 
1255          * when the XQM structure should be freed. We cannot assume
 
1256          * that xfs_Gqm is non-null after this point.
 
1258         xfs_qm_rele_quotafs_ref(mp);
 
1260         spinlock_destroy(&qi->qi_pinlock);
 
1261         xfs_qm_list_destroy(&qi->qi_dqlist);
 
1263         if (qi->qi_uquotaip) {
 
1264                 XFS_PURGE_INODE(qi->qi_uquotaip);
 
1265                 qi->qi_uquotaip = NULL; /* paranoia */
 
1267         if (qi->qi_gquotaip) {
 
1268                 XFS_PURGE_INODE(qi->qi_gquotaip);
 
1269                 qi->qi_gquotaip = NULL;
 
1271         mutex_destroy(&qi->qi_quotaofflock);
 
1272         kmem_free(qi, sizeof(xfs_quotainfo_t));
 
1273         mp->m_quotainfo = NULL;
 
1278 /* ------------------- PRIVATE STATIC FUNCTIONS ----------------------- */
 
1287         mutex_init(&list->qh_lock);
 
1288         list->qh_next = NULL;
 
1289         list->qh_version = 0;
 
1290         list->qh_nelems = 0;
 
1294 xfs_qm_list_destroy(
 
1297         mutex_destroy(&(list->qh_lock));
 
1302  * Stripped down version of dqattach. This doesn't attach, or even look at the
 
1303  * dquots attached to the inode. The rationale is that there won't be any
 
1304  * attached at the time this is called from quotacheck.
 
1307 xfs_qm_dqget_noattach(
 
1309         xfs_dquot_t     **O_udqpp,
 
1310         xfs_dquot_t     **O_gdqpp)
 
1314         xfs_dquot_t     *udqp, *gdqp;
 
1316         ASSERT(XFS_ISLOCKED_INODE_EXCL(ip));
 
1321         if (XFS_IS_UQUOTA_ON(mp)) {
 
1322                 ASSERT(ip->i_udquot == NULL);
 
1324                  * We want the dquot allocated if it doesn't exist.
 
1326                 if ((error = xfs_qm_dqget(mp, ip, ip->i_d.di_uid, XFS_DQ_USER,
 
1327                                          XFS_QMOPT_DQALLOC | XFS_QMOPT_DOWARN,
 
1330                          * Shouldn't be able to turn off quotas here.
 
1332                         ASSERT(error != ESRCH);
 
1333                         ASSERT(error != ENOENT);
 
1339         if (XFS_IS_OQUOTA_ON(mp)) {
 
1340                 ASSERT(ip->i_gdquot == NULL);
 
1343                 error = XFS_IS_GQUOTA_ON(mp) ?
 
1344                                 xfs_qm_dqget(mp, ip,
 
1345                                              ip->i_d.di_gid, XFS_DQ_GROUP,
 
1346                                              XFS_QMOPT_DQALLOC|XFS_QMOPT_DOWARN,
 
1348                                 xfs_qm_dqget(mp, ip,
 
1349                                              ip->i_d.di_projid, XFS_DQ_PROJ,
 
1350                                              XFS_QMOPT_DQALLOC|XFS_QMOPT_DOWARN,
 
1354                                 xfs_qm_dqrele(udqp);
 
1355                         ASSERT(error != ESRCH);
 
1356                         ASSERT(error != ENOENT);
 
1361                 /* Reacquire the locks in the right order */
 
1363                         if (! xfs_qm_dqlock_nowait(udqp)) {
 
1375         if (udqp) ASSERT(XFS_DQ_IS_LOCKED(udqp));
 
1376         if (gdqp) ASSERT(XFS_DQ_IS_LOCKED(gdqp));
 
1382  * Create an inode and return with a reference already taken, but unlocked
 
1383  * This is how we create quota inodes
 
1397         tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QINOCREATE);
 
1398         if ((error = xfs_trans_reserve(tp,
 
1399                                       XFS_QM_QINOCREATE_SPACE_RES(mp),
 
1400                                       XFS_CREATE_LOG_RES(mp), 0,
 
1401                                       XFS_TRANS_PERM_LOG_RES,
 
1402                                       XFS_CREATE_LOG_COUNT))) {
 
1403                 xfs_trans_cancel(tp, 0);
 
1407         if ((error = xfs_dir_ialloc(&tp, &xfs_zeroino, S_IFREG, 1, 0,
 
1408                                    &xfs_zerocr, 0, 1, ip, &committed))) {
 
1409                 xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES |
 
1415          * Keep an extra reference to this quota inode. This inode is
 
1416          * locked exclusively and joined to the transaction already.
 
1418         ASSERT(XFS_ISLOCKED_INODE_EXCL(*ip));
 
1419         VN_HOLD(XFS_ITOV((*ip)));
 
1422          * Make the changes in the superblock, and log those too.
 
1423          * sbfields arg may contain fields other than *QUOTINO;
 
1424          * VERSIONNUM for example.
 
1426         s = XFS_SB_LOCK(mp);
 
1427         if (flags & XFS_QMOPT_SBVERSION) {
 
1428 #if defined(DEBUG) && defined(XFS_LOUD_RECOVERY)
 
1429                 unsigned oldv = mp->m_sb.sb_versionnum;
 
1431                 ASSERT(!XFS_SB_VERSION_HASQUOTA(&mp->m_sb));
 
1432                 ASSERT((sbfields & (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO |
 
1433                                    XFS_SB_GQUOTINO | XFS_SB_QFLAGS)) ==
 
1434                        (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO |
 
1435                         XFS_SB_GQUOTINO | XFS_SB_QFLAGS));
 
1437                 XFS_SB_VERSION_ADDQUOTA(&mp->m_sb);
 
1438                 mp->m_sb.sb_uquotino = NULLFSINO;
 
1439                 mp->m_sb.sb_gquotino = NULLFSINO;
 
1441                 /* qflags will get updated _after_ quotacheck */
 
1442                 mp->m_sb.sb_qflags = 0;
 
1443 #if defined(DEBUG) && defined(XFS_LOUD_RECOVERY)
 
1445                         "Old superblock version %x, converting to %x.",
 
1446                         oldv, mp->m_sb.sb_versionnum);
 
1449         if (flags & XFS_QMOPT_UQUOTA)
 
1450                 mp->m_sb.sb_uquotino = (*ip)->i_ino;
 
1452                 mp->m_sb.sb_gquotino = (*ip)->i_ino;
 
1453         XFS_SB_UNLOCK(mp, s);
 
1454         xfs_mod_sb(tp, sbfields);
 
1456         if ((error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES,
 
1458                 xfs_fs_cmn_err(CE_ALERT, mp, "XFS qino_alloc failed!");
 
1466 xfs_qm_reset_dqcounts(
 
1472         xfs_disk_dquot_t        *ddq;
 
1475         xfs_buftrace("RESET DQUOTS", bp);
 
1477          * Reset all counters and timers. They'll be
 
1478          * started afresh by xfs_qm_quotacheck.
 
1481         j = XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB);
 
1482         do_div(j, sizeof(xfs_dqblk_t));
 
1483         ASSERT(XFS_QM_DQPERBLK(mp) == j);
 
1485         ddq = (xfs_disk_dquot_t *)XFS_BUF_PTR(bp);
 
1486         for (j = 0; j < XFS_QM_DQPERBLK(mp); j++) {
 
1488                  * Do a sanity check, and if needed, repair the dqblk. Don't
 
1489                  * output any warnings because it's perfectly possible to
 
1490                  * find uninitialised dquot blks. See comment in xfs_qm_dqcheck.
 
1492                 (void) xfs_qm_dqcheck(ddq, id+j, type, XFS_QMOPT_DQREPAIR,
 
1496                 ddq->d_rtbcount = 0;
 
1499                 ddq->d_rtbtimer = 0;
 
1502                 ddq->d_rtbwarns = 0;
 
1503                 ddq = (xfs_disk_dquot_t *) ((xfs_dqblk_t *)ddq + 1);
 
1514         xfs_filblks_t   blkcnt,
 
1525         incr = (blkcnt > XFS_QM_MAX_DQCLUSTER_LOGSZ) ?
 
1526                 XFS_QM_MAX_DQCLUSTER_LOGSZ : blkcnt;
 
1527         type = flags & XFS_QMOPT_UQUOTA ? XFS_DQ_USER :
 
1528                 (flags & XFS_QMOPT_PQUOTA ? XFS_DQ_PROJ : XFS_DQ_GROUP);
 
1532          * Blkcnt arg can be a very big number, and might even be
 
1533          * larger than the log itself. So, we have to break it up into
 
1534          * manageable-sized transactions.
 
1535          * Note that we don't start a permanent transaction here; we might
 
1536          * not be able to get a log reservation for the whole thing up front,
 
1537          * and we don't really care to either, because we just discard
 
1538          * everything if we were to crash in the middle of this loop.
 
1541                 error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp,
 
1542                               XFS_FSB_TO_DADDR(mp, bno),
 
1543                               (int)XFS_QI_DQCHUNKLEN(mp), 0, &bp);
 
1547                 (void) xfs_qm_reset_dqcounts(mp, bp, firstid, type);
 
1548                 xfs_bdwrite(mp, bp);
 
1550                  * goto the next block.
 
1553                 firstid += XFS_QM_DQPERBLK(mp);
 
1559  * Iterate over all allocated USR/GRP/PRJ dquots in the system, calling a
 
1560  * caller supplied function for every chunk of dquots that we find.
 
1568         xfs_bmbt_irec_t         *map;
 
1569         int                     i, nmaps;       /* number of map entries */
 
1570         int                     error;          /* return value */
 
1571         xfs_fileoff_t           lblkno;
 
1572         xfs_filblks_t           maxlblkcnt;
 
1574         xfs_fsblock_t           rablkno;
 
1575         xfs_filblks_t           rablkcnt;
 
1579          * This looks racy, but we can't keep an inode lock across a
 
1580          * trans_reserve. But, this gets called during quotacheck, and that
 
1581          * happens only at mount time which is single threaded.
 
1583         if (qip->i_d.di_nblocks == 0)
 
1586         map = kmem_alloc(XFS_DQITER_MAP_SIZE * sizeof(*map), KM_SLEEP);
 
1589         maxlblkcnt = XFS_B_TO_FSB(mp, (xfs_ufsize_t)XFS_MAXIOFFSET(mp));
 
1591                 nmaps = XFS_DQITER_MAP_SIZE;
 
1593                  * We aren't changing the inode itself. Just changing
 
1594                  * some of its data. No new blocks are added here, and
 
1595                  * the inode is never added to the transaction.
 
1597                 xfs_ilock(qip, XFS_ILOCK_SHARED);
 
1598                 error = xfs_bmapi(NULL, qip, lblkno,
 
1599                                   maxlblkcnt - lblkno,
 
1602                                   0, map, &nmaps, NULL, NULL);
 
1603                 xfs_iunlock(qip, XFS_ILOCK_SHARED);
 
1607                 ASSERT(nmaps <= XFS_DQITER_MAP_SIZE);
 
1608                 for (i = 0; i < nmaps; i++) {
 
1609                         ASSERT(map[i].br_startblock != DELAYSTARTBLOCK);
 
1610                         ASSERT(map[i].br_blockcount);
 
1613                         lblkno += map[i].br_blockcount;
 
1615                         if (map[i].br_startblock == HOLESTARTBLOCK)
 
1618                         firstid = (xfs_dqid_t) map[i].br_startoff *
 
1619                                 XFS_QM_DQPERBLK(mp);
 
1621                          * Do a read-ahead on the next extent.
 
1623                         if ((i+1 < nmaps) &&
 
1624                             (map[i+1].br_startblock != HOLESTARTBLOCK)) {
 
1625                                 rablkcnt =  map[i+1].br_blockcount;
 
1626                                 rablkno = map[i+1].br_startblock;
 
1627                                 while (rablkcnt--) {
 
1628                                         xfs_baread(mp->m_ddev_targp,
 
1629                                                XFS_FSB_TO_DADDR(mp, rablkno),
 
1630                                                (int)XFS_QI_DQCHUNKLEN(mp));
 
1635                          * Iterate thru all the blks in the extent and
 
1636                          * reset the counters of all the dquots inside them.
 
1638                         if ((error = xfs_qm_dqiter_bufs(mp,
 
1640                                                        map[i].br_startblock,
 
1641                                                        map[i].br_blockcount,
 
1649         } while (nmaps > 0);
 
1651         kmem_free(map, XFS_DQITER_MAP_SIZE * sizeof(*map));
 
1657  * Called by dqusage_adjust in doing a quotacheck.
 
1658  * Given the inode, and a dquot (either USR or GRP, doesn't matter),
 
1659  * this updates its incore copy as well as the buffer copy. This is
 
1660  * so that once the quotacheck is done, we can just log all the buffers,
 
1661  * as opposed to logging numerous updates to individual dquots.
 
1664 xfs_qm_quotacheck_dqadjust(
 
1669         ASSERT(XFS_DQ_IS_LOCKED(dqp));
 
1670         xfs_dqtrace_entry(dqp, "QCHECK DQADJUST");
 
1672          * Adjust the inode count and the block count to reflect this inode's
 
1675         be64_add(&dqp->q_core.d_icount, 1);
 
1676         dqp->q_res_icount++;
 
1678                 be64_add(&dqp->q_core.d_bcount, nblks);
 
1679                 dqp->q_res_bcount += nblks;
 
1682                 be64_add(&dqp->q_core.d_rtbcount, rtblks);
 
1683                 dqp->q_res_rtbcount += rtblks;
 
1687          * Set default limits, adjust timers (since we changed usages)
 
1689         if (! XFS_IS_SUSER_DQUOT(dqp)) {
 
1690                 xfs_qm_adjust_dqlimits(dqp->q_mount, &dqp->q_core);
 
1691                 xfs_qm_adjust_dqtimers(dqp->q_mount, &dqp->q_core);
 
1694         dqp->dq_flags |= XFS_DQ_DIRTY;
 
1700         xfs_qcnt_t      *O_rtblks)
 
1702         xfs_filblks_t   rtblks;                 /* total rt blks */
 
1703         xfs_extnum_t    idx;                    /* extent record index */
 
1704         xfs_ifork_t     *ifp;                   /* inode fork pointer */
 
1705         xfs_extnum_t    nextents;               /* number of extent entries */
 
1706         xfs_bmbt_rec_t  *ep;                    /* pointer to an extent entry */
 
1709         ASSERT(XFS_IS_REALTIME_INODE(ip));
 
1710         ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK);
 
1711         if (!(ifp->if_flags & XFS_IFEXTENTS)) {
 
1712                 if ((error = xfs_iread_extents(NULL, ip, XFS_DATA_FORK)))
 
1716         nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
 
1717         for (idx = 0; idx < nextents; idx++) {
 
1718                 ep = xfs_iext_get_ext(ifp, idx);
 
1719                 rtblks += xfs_bmbt_get_blockcount(ep);
 
1721         *O_rtblks = (xfs_qcnt_t)rtblks;
 
1726  * callback routine supplied to bulkstat(). Given an inumber, find its
 
1727  * dquots and update them to account for resources taken by that inode.
 
1731 xfs_qm_dqusage_adjust(
 
1732         xfs_mount_t     *mp,            /* mount point for filesystem */
 
1733         xfs_ino_t       ino,            /* inode number to get data for */
 
1734         void            __user *buffer, /* not used */
 
1735         int             ubsize,         /* not used */
 
1736         void            *private_data,  /* not used */
 
1737         xfs_daddr_t     bno,            /* starting block of inode cluster */
 
1738         int             *ubused,        /* not used */
 
1739         void            *dip,           /* on-disk inode pointer (not used) */
 
1740         int             *res)           /* result code value */
 
1743         xfs_dquot_t     *udqp, *gdqp;
 
1744         xfs_qcnt_t      nblks, rtblks;
 
1747         ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 
1750          * rootino must have its resources accounted for, not so with the quota
 
1753         if (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino) {
 
1754                 *res = BULKSTAT_RV_NOTHING;
 
1755                 return XFS_ERROR(EINVAL);
 
1759          * We don't _need_ to take the ilock EXCL. However, the xfs_qm_dqget
 
1760          * interface expects the inode to be exclusively locked because that's
 
1761          * the case in all other instances. It's OK that we do this because
 
1762          * quotacheck is done only at mount time.
 
1764         if ((error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip, bno))) {
 
1765                 *res = BULKSTAT_RV_NOTHING;
 
1769         if (ip->i_d.di_mode == 0) {
 
1770                 xfs_iput_new(ip, XFS_ILOCK_EXCL);
 
1771                 *res = BULKSTAT_RV_NOTHING;
 
1772                 return XFS_ERROR(ENOENT);
 
1776          * Obtain the locked dquots. In case of an error (eg. allocation
 
1777          * fails for ENOSPC), we return the negative of the error number
 
1778          * to bulkstat, so that it can get propagated to quotacheck() and
 
1779          * making us disable quotas for the file system.
 
1781         if ((error = xfs_qm_dqget_noattach(ip, &udqp, &gdqp))) {
 
1782                 xfs_iput(ip, XFS_ILOCK_EXCL);
 
1783                 *res = BULKSTAT_RV_GIVEUP;
 
1788         if (! XFS_IS_REALTIME_INODE(ip)) {
 
1789                 nblks = (xfs_qcnt_t)ip->i_d.di_nblocks;
 
1792                  * Walk thru the extent list and count the realtime blocks.
 
1794                 if ((error = xfs_qm_get_rtblks(ip, &rtblks))) {
 
1795                         xfs_iput(ip, XFS_ILOCK_EXCL);
 
1800                         *res = BULKSTAT_RV_GIVEUP;
 
1803                 nblks = (xfs_qcnt_t)ip->i_d.di_nblocks - rtblks;
 
1805         ASSERT(ip->i_delayed_blks == 0);
 
1808          * We can't release the inode while holding its dquot locks.
 
1809          * The inode can go into inactive and might try to acquire the dquotlocks.
 
1810          * So, just unlock here and do a vn_rele at the end.
 
1812         xfs_iunlock(ip, XFS_ILOCK_EXCL);
 
1815          * Add the (disk blocks and inode) resources occupied by this
 
1816          * inode to its dquots. We do this adjustment in the incore dquot,
 
1817          * and also copy the changes to its buffer.
 
1818          * We don't care about putting these changes in a transaction
 
1819          * envelope because if we crash in the middle of a 'quotacheck'
 
1820          * we have to start from the beginning anyway.
 
1821          * Once we're done, we'll log all the dquot bufs.
 
1823          * The *QUOTA_ON checks below may look pretty racy, but quotachecks
 
1824          * and quotaoffs don't race. (Quotachecks happen at mount time only).
 
1826         if (XFS_IS_UQUOTA_ON(mp)) {
 
1828                 xfs_qm_quotacheck_dqadjust(udqp, nblks, rtblks);
 
1831         if (XFS_IS_OQUOTA_ON(mp)) {
 
1833                 xfs_qm_quotacheck_dqadjust(gdqp, nblks, rtblks);
 
1837          * Now release the inode. This will send it to 'inactive', and
 
1838          * possibly even free blocks.
 
1840         VN_RELE(XFS_ITOV(ip));
 
1845         *res = BULKSTAT_RV_DIDONE;
 
1850  * Walk thru all the filesystem inodes and construct a consistent view
 
1851  * of the disk quota world. If the quotacheck fails, disable quotas.
 
1857         int             done, count, error;
 
1860         xfs_inode_t     *uip, *gip;
 
1868         ASSERT(XFS_QI_UQIP(mp) || XFS_QI_GQIP(mp));
 
1869         ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 
1872          * There should be no cached dquots. The (simplistic) quotacheck
 
1873          * algorithm doesn't like that.
 
1875         ASSERT(XFS_QI_MPLNDQUOTS(mp) == 0);
 
1877         cmn_err(CE_NOTE, "XFS quotacheck %s: Please wait.", mp->m_fsname);
 
1880          * First we go thru all the dquots on disk, USR and GRP/PRJ, and reset
 
1881          * their counters to zero. We need a clean slate.
 
1882          * We don't log our changes till later.
 
1884         if ((uip = XFS_QI_UQIP(mp))) {
 
1885                 if ((error = xfs_qm_dqiterate(mp, uip, XFS_QMOPT_UQUOTA)))
 
1887                 flags |= XFS_UQUOTA_CHKD;
 
1890         if ((gip = XFS_QI_GQIP(mp))) {
 
1891                 if ((error = xfs_qm_dqiterate(mp, gip, XFS_IS_GQUOTA_ON(mp) ?
 
1892                                         XFS_QMOPT_GQUOTA : XFS_QMOPT_PQUOTA)))
 
1894                 flags |= XFS_OQUOTA_CHKD;
 
1899                  * Iterate thru all the inodes in the file system,
 
1900                  * adjusting the corresponding dquot counters in core.
 
1902                 if ((error = xfs_bulkstat(mp, &lastino, &count,
 
1903                                      xfs_qm_dqusage_adjust, NULL,
 
1904                                      structsz, NULL, BULKSTAT_FG_IGET, &done)))
 
1910          * We can get this error if we couldn't do a dquot allocation inside
 
1911          * xfs_qm_dqusage_adjust (via bulkstat). We don't care about the
 
1912          * dirty dquots that might be cached, we just want to get rid of them
 
1913          * and turn quotaoff. The dquots won't be attached to any of the inodes
 
1914          * at this point (because we intentionally didn't in dqget_noattach).
 
1917                 xfs_qm_dqpurge_all(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_QUOTAOFF);
 
1921          * We've made all the changes that we need to make incore.
 
1922          * Now flush_them down to disk buffers.
 
1924         xfs_qm_dqflush_all(mp, XFS_QMOPT_DELWRI);
 
1927          * We didn't log anything, because if we crashed, we'll have to
 
1928          * start the quotacheck from scratch anyway. However, we must make
 
1929          * sure that our dquot changes are secure before we put the
 
1930          * quotacheck'd stamp on the superblock. So, here we do a synchronous
 
1933         XFS_bflush(mp->m_ddev_targp);
 
1936          * If one type of quotas is off, then it will lose its
 
1937          * quotachecked status, since we won't be doing accounting for
 
1938          * that type anymore.
 
1940         mp->m_qflags &= ~(XFS_OQUOTA_CHKD | XFS_UQUOTA_CHKD);
 
1941         mp->m_qflags |= flags;
 
1943         XQM_LIST_PRINT(&(XFS_QI_MPL_LIST(mp)), MPL_NEXT, "++++ Mp list +++");
 
1947                 cmn_err(CE_WARN, "XFS quotacheck %s: Unsuccessful (Error %d): "
 
1948                         "Disabling quotas.",
 
1949                         mp->m_fsname, error);
 
1951                  * We must turn off quotas.
 
1953                 ASSERT(mp->m_quotainfo != NULL);
 
1954                 ASSERT(xfs_Gqm != NULL);
 
1955                 xfs_qm_destroy_quotainfo(mp);
 
1956                 (void)xfs_mount_reset_sbqflags(mp);
 
1958                 cmn_err(CE_NOTE, "XFS quotacheck %s: Done.", mp->m_fsname);
 
1964  * This is called after the superblock has been read in and we're ready to
 
1965  * iget the quota inodes.
 
1968 xfs_qm_init_quotainos(
 
1971         xfs_inode_t     *uip, *gip;
 
1976         ASSERT(mp->m_quotainfo);
 
1982          * Get the uquota and gquota inodes
 
1984         if (XFS_SB_VERSION_HASQUOTA(&mp->m_sb)) {
 
1985                 if (XFS_IS_UQUOTA_ON(mp) &&
 
1986                     mp->m_sb.sb_uquotino != NULLFSINO) {
 
1987                         ASSERT(mp->m_sb.sb_uquotino > 0);
 
1988                         if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino,
 
1990                                 return XFS_ERROR(error);
 
1992                 if (XFS_IS_OQUOTA_ON(mp) &&
 
1993                     mp->m_sb.sb_gquotino != NULLFSINO) {
 
1994                         ASSERT(mp->m_sb.sb_gquotino > 0);
 
1995                         if ((error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino,
 
1998                                         VN_RELE(XFS_ITOV(uip));
 
1999                                 return XFS_ERROR(error);
 
2003                 flags |= XFS_QMOPT_SBVERSION;
 
2004                 sbflags |= (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO |
 
2005                             XFS_SB_GQUOTINO | XFS_SB_QFLAGS);
 
2009          * Create the two inodes, if they don't exist already. The changes
 
2010          * made above will get added to a transaction and logged in one of
 
2011          * the qino_alloc calls below.  If the device is readonly,
 
2012          * temporarily switch to read-write to do this.
 
2014         if (XFS_IS_UQUOTA_ON(mp) && uip == NULL) {
 
2015                 if ((error = xfs_qm_qino_alloc(mp, &uip,
 
2016                                               sbflags | XFS_SB_UQUOTINO,
 
2017                                               flags | XFS_QMOPT_UQUOTA)))
 
2018                         return XFS_ERROR(error);
 
2020                 flags &= ~XFS_QMOPT_SBVERSION;
 
2022         if (XFS_IS_OQUOTA_ON(mp) && gip == NULL) {
 
2023                 flags |= (XFS_IS_GQUOTA_ON(mp) ?
 
2024                                 XFS_QMOPT_GQUOTA : XFS_QMOPT_PQUOTA);
 
2025                 error = xfs_qm_qino_alloc(mp, &gip,
 
2026                                           sbflags | XFS_SB_GQUOTINO, flags);
 
2029                                 VN_RELE(XFS_ITOV(uip));
 
2031                         return XFS_ERROR(error);
 
2035         XFS_QI_UQIP(mp) = uip;
 
2036         XFS_QI_GQIP(mp) = gip;
 
2043  * Traverse the freelist of dquots and attempt to reclaim a maximum of
 
2044  * 'howmany' dquots. This operation races with dqlookup(), and attempts to
 
2045  * favor the lookup function ...
 
2046  * XXXsup merge this with qm_reclaim_one().
 
2049 xfs_qm_shake_freelist(
 
2054         xfs_dquot_t     *dqp, *nextdqp;
 
2066         cmn_err(CE_DEBUG, "Shake free 0x%x", howmany);
 
2068         /* lock order is : hashchainlock, freelistlock, mplistlock */
 
2070         xfs_qm_freelist_lock(xfs_Gqm);
 
2072         for (dqp = xfs_Gqm->qm_dqfreelist.qh_next;
 
2073              ((dqp != (xfs_dquot_t *) &xfs_Gqm->qm_dqfreelist) &&
 
2074               nreclaimed < howmany); ) {
 
2078                  * We are racing with dqlookup here. Naturally we don't
 
2079                  * want to reclaim a dquot that lookup wants.
 
2081                 if (dqp->dq_flags & XFS_DQ_WANT) {
 
2083                         xfs_qm_freelist_unlock(xfs_Gqm);
 
2084                         if (++restarts >= XFS_QM_RECLAIM_MAX_RESTARTS)
 
2086                         XQM_STATS_INC(xqmstats.xs_qm_dqwants);
 
2091                  * If the dquot is inactive, we are assured that it is
 
2092                  * not on the mplist or the hashlist, and that makes our
 
2095                 if (dqp->dq_flags & XFS_DQ_INACTIVE) {
 
2096                         ASSERT(dqp->q_mount == NULL);
 
2097                         ASSERT(! XFS_DQ_IS_DIRTY(dqp));
 
2098                         ASSERT(dqp->HL_PREVP == NULL);
 
2099                         ASSERT(dqp->MPL_PREVP == NULL);
 
2100                         XQM_STATS_INC(xqmstats.xs_qm_dqinact_reclaims);
 
2101                         nextdqp = dqp->dq_flnext;
 
2105                 ASSERT(dqp->MPL_PREVP);
 
2107                  * Try to grab the flush lock. If this dquot is in the process of
 
2108                  * getting flushed to disk, we don't want to reclaim it.
 
2110                 if (! xfs_qm_dqflock_nowait(dqp)) {
 
2112                         dqp = dqp->dq_flnext;
 
2117                  * We have the flush lock so we know that this is not in the
 
2118                  * process of being flushed. So, if this is dirty, flush it
 
2119                  * DELWRI so that we don't get a freelist infested with
 
2122                 if (XFS_DQ_IS_DIRTY(dqp)) {
 
2123                         xfs_dqtrace_entry(dqp, "DQSHAKE: DQDIRTY");
 
2125                          * We flush it delayed write, so don't bother
 
2126                          * releasing the mplock.
 
2128                         (void) xfs_qm_dqflush(dqp, XFS_QMOPT_DELWRI);
 
2129                         xfs_dqunlock(dqp); /* dqflush unlocks dqflock */
 
2130                         dqp = dqp->dq_flnext;
 
2134                  * We're trying to get the hashlock out of order. This races
 
2135                  * with dqlookup; so, we giveup and goto the next dquot if
 
2136                  * we couldn't get the hashlock. This way, we won't starve
 
2137                  * a dqlookup process that holds the hashlock that is
 
2138                  * waiting for the freelist lock.
 
2140                 if (! xfs_qm_dqhashlock_nowait(dqp)) {
 
2143                         dqp = dqp->dq_flnext;
 
2147                  * This races with dquot allocation code as well as dqflush_all
 
2148                  * and reclaim code. So, if we failed to grab the mplist lock,
 
2149                  * giveup everything and start over.
 
2153                 if (! xfs_qm_mplist_nowait(dqp->q_mount)) {
 
2154                         /* XXX put a sentinel so that we can come back here */
 
2157                         XFS_DQ_HASH_UNLOCK(hash);
 
2158                         xfs_qm_freelist_unlock(xfs_Gqm);
 
2159                         if (++restarts >= XFS_QM_RECLAIM_MAX_RESTARTS)
 
2163                 xfs_dqtrace_entry(dqp, "DQSHAKE: UNLINKING");
 
2165                 cmn_err(CE_DEBUG, "Shake 0x%p, ID 0x%x\n",
 
2166                         dqp, be32_to_cpu(dqp->q_core.d_id));
 
2168                 ASSERT(dqp->q_nrefs == 0);
 
2169                 nextdqp = dqp->dq_flnext;
 
2170                 XQM_MPLIST_REMOVE(&(XFS_QI_MPL_LIST(dqp->q_mount)), dqp);
 
2171                 XQM_HASHLIST_REMOVE(hash, dqp);
 
2173                 xfs_qm_mplist_unlock(dqp->q_mount);
 
2174                 XFS_DQ_HASH_UNLOCK(hash);
 
2177                 XQM_FREELIST_REMOVE(dqp);
 
2180                 XQM_STATS_INC(xqmstats.xs_qm_dqshake_reclaims);
 
2181                 xfs_qm_dqdestroy(dqp);
 
2184         xfs_qm_freelist_unlock(xfs_Gqm);
 
2190  * The kmem_shake interface is invoked when memory is running low.
 
2194 xfs_qm_shake(int nr_to_scan, gfp_t gfp_mask)
 
2196         int     ndqused, nfree, n;
 
2198         if (!kmem_shake_allow(gfp_mask))
 
2203         nfree = xfs_Gqm->qm_dqfreelist.qh_nelems; /* free dquots */
 
2204         /* incore dquots in all f/s's */
 
2205         ndqused = atomic_read(&xfs_Gqm->qm_totaldquots) - nfree;
 
2207         ASSERT(ndqused >= 0);
 
2209         if (nfree <= ndqused && nfree < ndquot)
 
2212         ndqused *= xfs_Gqm->qm_dqfree_ratio;    /* target # of free dquots */
 
2213         n = nfree - ndqused - ndquot;           /* # over target */
 
2215         return xfs_qm_shake_freelist(MAX(nfree, n));
 
2220  * Just pop the least recently used dquot off the freelist and
 
2221  * recycle it. The returned dquot is locked.
 
2223 STATIC xfs_dquot_t *
 
2224 xfs_qm_dqreclaim_one(void)
 
2226         xfs_dquot_t     *dqpout;
 
2235         /* lockorder: hashchainlock, freelistlock, mplistlock, dqlock, dqflock */
 
2237         xfs_qm_freelist_lock(xfs_Gqm);
 
2239         FOREACH_DQUOT_IN_FREELIST(dqp, &(xfs_Gqm->qm_dqfreelist)) {
 
2243                  * We are racing with dqlookup here. Naturally we don't
 
2244                  * want to reclaim a dquot that lookup wants. We release the
 
2245                  * freelist lock and start over, so that lookup will grab
 
2246                  * both the dquot and the freelistlock.
 
2248                 if (dqp->dq_flags & XFS_DQ_WANT) {
 
2249                         ASSERT(! (dqp->dq_flags & XFS_DQ_INACTIVE));
 
2250                         xfs_dqtrace_entry(dqp, "DQRECLAIM: DQWANT");
 
2252                         xfs_qm_freelist_unlock(xfs_Gqm);
 
2253                         if (++restarts >= XFS_QM_RECLAIM_MAX_RESTARTS)
 
2255                         XQM_STATS_INC(xqmstats.xs_qm_dqwants);
 
2260                  * If the dquot is inactive, we are assured that it is
 
2261                  * not on the mplist or the hashlist, and that makes our
 
2264                 if (dqp->dq_flags & XFS_DQ_INACTIVE) {
 
2265                         ASSERT(dqp->q_mount == NULL);
 
2266                         ASSERT(! XFS_DQ_IS_DIRTY(dqp));
 
2267                         ASSERT(dqp->HL_PREVP == NULL);
 
2268                         ASSERT(dqp->MPL_PREVP == NULL);
 
2269                         XQM_FREELIST_REMOVE(dqp);
 
2272                         XQM_STATS_INC(xqmstats.xs_qm_dqinact_reclaims);
 
2276                 ASSERT(dqp->q_hash);
 
2277                 ASSERT(dqp->MPL_PREVP);
 
2280                  * Try to grab the flush lock. If this dquot is in the process of
 
2281                  * getting flushed to disk, we don't want to reclaim it.
 
2283                 if (! xfs_qm_dqflock_nowait(dqp)) {
 
2289                  * We have the flush lock so we know that this is not in the
 
2290                  * process of being flushed. So, if this is dirty, flush it
 
2291                  * DELWRI so that we don't get a freelist infested with
 
2294                 if (XFS_DQ_IS_DIRTY(dqp)) {
 
2295                         xfs_dqtrace_entry(dqp, "DQRECLAIM: DQDIRTY");
 
2297                          * We flush it delayed write, so don't bother
 
2298                          * releasing the freelist lock.
 
2300                         (void) xfs_qm_dqflush(dqp, XFS_QMOPT_DELWRI);
 
2301                         xfs_dqunlock(dqp); /* dqflush unlocks dqflock */
 
2305                 if (! xfs_qm_mplist_nowait(dqp->q_mount)) {
 
2311                 if (! xfs_qm_dqhashlock_nowait(dqp))
 
2314                 ASSERT(dqp->q_nrefs == 0);
 
2315                 xfs_dqtrace_entry(dqp, "DQRECLAIM: UNLINKING");
 
2316                 XQM_MPLIST_REMOVE(&(XFS_QI_MPL_LIST(dqp->q_mount)), dqp);
 
2317                 XQM_HASHLIST_REMOVE(dqp->q_hash, dqp);
 
2318                 XQM_FREELIST_REMOVE(dqp);
 
2320                 XFS_DQ_HASH_UNLOCK(dqp->q_hash);
 
2322                 xfs_qm_mplist_unlock(dqp->q_mount);
 
2329         xfs_qm_freelist_unlock(xfs_Gqm);
 
2334 /*------------------------------------------------------------------*/
 
2337  * Return a new incore dquot. Depending on the number of
 
2338  * dquots in the system, we either allocate a new one on the kernel heap,
 
2339  * or reclaim a free one.
 
2340  * Return value is B_TRUE if we allocated a new dquot, B_FALSE if we managed
 
2341  * to reclaim an existing one from the freelist.
 
2344 xfs_qm_dqalloc_incore(
 
2345         xfs_dquot_t **O_dqpp)
 
2350          * Check against high water mark to see if we want to pop
 
2351          * a nincompoop dquot off the freelist.
 
2353         if (atomic_read(&xfs_Gqm->qm_totaldquots) >= ndquot) {
 
2355                  * Try to recycle a dquot from the freelist.
 
2357                 if ((dqp = xfs_qm_dqreclaim_one())) {
 
2358                         XQM_STATS_INC(xqmstats.xs_qm_dqreclaims);
 
2360                          * Just zero the core here. The rest will get
 
2361                          * reinitialized by caller. XXX we shouldn't even
 
2364                         memset(&dqp->q_core, 0, sizeof(dqp->q_core));
 
2368                 XQM_STATS_INC(xqmstats.xs_qm_dqreclaim_misses);
 
2372          * Allocate a brand new dquot on the kernel heap and return it
 
2373          * to the caller to initialize.
 
2375         ASSERT(xfs_Gqm->qm_dqzone != NULL);
 
2376         *O_dqpp = kmem_zone_zalloc(xfs_Gqm->qm_dqzone, KM_SLEEP);
 
2377         atomic_inc(&xfs_Gqm->qm_totaldquots);
 
2384  * Start a transaction and write the incore superblock changes to
 
2385  * disk. flags parameter indicates which fields have changed.
 
2388 xfs_qm_write_sb_changes(
 
2396         cmn_err(CE_NOTE, "Writing superblock quota changes :%s", mp->m_fsname);
 
2398         tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
 
2399         if ((error = xfs_trans_reserve(tp, 0,
 
2400                                       mp->m_sb.sb_sectsize + 128, 0,
 
2402                                       XFS_DEFAULT_LOG_COUNT))) {
 
2403                 xfs_trans_cancel(tp, 0);
 
2407         xfs_mod_sb(tp, flags);
 
2408         (void) xfs_trans_commit(tp, 0, NULL);
 
2414 /* --------------- utility functions for vnodeops ---------------- */
 
2418  * Given an inode, a uid and gid (from cred_t) make sure that we have
 
2419  * allocated relevant dquot(s) on disk, and that we won't exceed inode
 
2420  * quotas by creating this file.
 
2421  * This also attaches dquot(s) to the given inode after locking it,
 
2422  * and returns the dquots corresponding to the uid and/or gid.
 
2424  * in   : inode (unlocked)
 
2425  * out  : udquot, gdquot with references taken and unlocked
 
2435         xfs_dquot_t     **O_udqpp,
 
2436         xfs_dquot_t     **O_gdqpp)
 
2439         xfs_dquot_t     *uq, *gq;
 
2442         if (!XFS_IS_QUOTA_ON(mp))
 
2445         lockflags = XFS_ILOCK_EXCL;
 
2446         xfs_ilock(ip, lockflags);
 
2448         if ((flags & XFS_QMOPT_INHERIT) &&
 
2449             XFS_INHERIT_GID(ip, XFS_MTOVFS(mp)))
 
2450                 gid = ip->i_d.di_gid;
 
2453          * Attach the dquot(s) to this inode, doing a dquot allocation
 
2454          * if necessary. The dquot(s) will not be locked.
 
2456         if (XFS_NOT_DQATTACHED(mp, ip)) {
 
2457                 if ((error = xfs_qm_dqattach(ip, XFS_QMOPT_DQALLOC |
 
2458                                             XFS_QMOPT_ILOCKED))) {
 
2459                         xfs_iunlock(ip, lockflags);
 
2465         if ((flags & XFS_QMOPT_UQUOTA) && XFS_IS_UQUOTA_ON(mp)) {
 
2466                 if (ip->i_d.di_uid != uid) {
 
2468                          * What we need is the dquot that has this uid, and
 
2469                          * if we send the inode to dqget, the uid of the inode
 
2470                          * takes priority over what's sent in the uid argument.
 
2471                          * We must unlock inode here before calling dqget if
 
2472                          * we're not sending the inode, because otherwise
 
2473                          * we'll deadlock by doing trans_reserve while
 
2476                         xfs_iunlock(ip, lockflags);
 
2477                         if ((error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t) uid,
 
2482                                 ASSERT(error != ENOENT);
 
2486                          * Get the ilock in the right order.
 
2489                         lockflags = XFS_ILOCK_SHARED;
 
2490                         xfs_ilock(ip, lockflags);
 
2493                          * Take an extra reference, because we'll return
 
2496                         ASSERT(ip->i_udquot);
 
2503         if ((flags & XFS_QMOPT_GQUOTA) && XFS_IS_GQUOTA_ON(mp)) {
 
2504                 if (ip->i_d.di_gid != gid) {
 
2505                         xfs_iunlock(ip, lockflags);
 
2506                         if ((error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)gid,
 
2513                                 ASSERT(error != ENOENT);
 
2517                         lockflags = XFS_ILOCK_SHARED;
 
2518                         xfs_ilock(ip, lockflags);
 
2520                         ASSERT(ip->i_gdquot);
 
2526         } else if ((flags & XFS_QMOPT_PQUOTA) && XFS_IS_PQUOTA_ON(mp)) {
 
2527                 if (ip->i_d.di_projid != prid) {
 
2528                         xfs_iunlock(ip, lockflags);
 
2529                         if ((error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)prid,
 
2536                                 ASSERT(error != ENOENT);
 
2540                         lockflags = XFS_ILOCK_SHARED;
 
2541                         xfs_ilock(ip, lockflags);
 
2543                         ASSERT(ip->i_gdquot);
 
2551                 xfs_dqtrace_entry_ino(uq, "DQALLOC", ip);
 
2553         xfs_iunlock(ip, lockflags);
 
2566  * Actually transfer ownership, and do dquot modifications.
 
2567  * These were already reserved.
 
2573         xfs_dquot_t     **IO_olddq,
 
2576         xfs_dquot_t     *prevdq;
 
2577         uint            bfield = XFS_IS_REALTIME_INODE(ip) ?
 
2578                                  XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
 
2580         ASSERT(XFS_ISLOCKED_INODE_EXCL(ip));
 
2581         ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
 
2586         ASSERT(prevdq != newdq);
 
2588         xfs_trans_mod_dquot(tp, prevdq, bfield, -(ip->i_d.di_nblocks));
 
2589         xfs_trans_mod_dquot(tp, prevdq, XFS_TRANS_DQ_ICOUNT, -1);
 
2591         /* the sparkling new dquot */
 
2592         xfs_trans_mod_dquot(tp, newdq, bfield, ip->i_d.di_nblocks);
 
2593         xfs_trans_mod_dquot(tp, newdq, XFS_TRANS_DQ_ICOUNT, 1);
 
2596          * Take an extra reference, because the inode
 
2597          * is going to keep this dquot pointer even
 
2598          * after the trans_commit.
 
2602         xfs_dqunlock(newdq);
 
2609  * Quota reservations for setattr(AT_UID|AT_GID|AT_PROJID).
 
2612 xfs_qm_vop_chown_reserve(
 
2621         uint            delblks, blkflags, prjflags = 0;
 
2622         xfs_dquot_t     *unresudq, *unresgdq, *delblksudq, *delblksgdq;
 
2624         ASSERT(XFS_ISLOCKED_INODE(ip));
 
2626         ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 
2628         delblks = ip->i_delayed_blks;
 
2629         delblksudq = delblksgdq = unresudq = unresgdq = NULL;
 
2630         blkflags = XFS_IS_REALTIME_INODE(ip) ?
 
2631                         XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS;
 
2633         if (XFS_IS_UQUOTA_ON(mp) && udqp &&
 
2634             ip->i_d.di_uid != (uid_t)be32_to_cpu(udqp->q_core.d_id)) {
 
2637                  * If there are delayed allocation blocks, then we have to
 
2638                  * unreserve those from the old dquot, and add them to the
 
2642                         ASSERT(ip->i_udquot);
 
2643                         unresudq = ip->i_udquot;
 
2646         if (XFS_IS_OQUOTA_ON(ip->i_mount) && gdqp) {
 
2647                 if (XFS_IS_PQUOTA_ON(ip->i_mount) &&
 
2648                      ip->i_d.di_projid != be32_to_cpu(gdqp->q_core.d_id))
 
2649                         prjflags = XFS_QMOPT_ENOSPC;
 
2652                     (XFS_IS_GQUOTA_ON(ip->i_mount) &&
 
2653                      ip->i_d.di_gid != be32_to_cpu(gdqp->q_core.d_id))) {
 
2656                                 ASSERT(ip->i_gdquot);
 
2657                                 unresgdq = ip->i_gdquot;
 
2662         if ((error = xfs_trans_reserve_quota_bydquots(tp, ip->i_mount,
 
2663                                 delblksudq, delblksgdq, ip->i_d.di_nblocks, 1,
 
2664                                 flags | blkflags | prjflags)))
 
2668          * Do the delayed blks reservations/unreservations now. Since, these
 
2669          * are done without the help of a transaction, if a reservation fails
 
2670          * its previous reservations won't be automatically undone by trans
 
2671          * code. So, we have to do it manually here.
 
2675                  * Do the reservations first. Unreservation can't fail.
 
2677                 ASSERT(delblksudq || delblksgdq);
 
2678                 ASSERT(unresudq || unresgdq);
 
2679                 if ((error = xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount,
 
2680                                 delblksudq, delblksgdq, (xfs_qcnt_t)delblks, 0,
 
2681                                 flags | blkflags | prjflags)))
 
2683                 xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount,
 
2684                                 unresudq, unresgdq, -((xfs_qcnt_t)delblks), 0,
 
2692 xfs_qm_vop_rename_dqattach(
 
2693         xfs_inode_t     **i_tab)
 
2701         if (! XFS_IS_QUOTA_ON(ip->i_mount))
 
2704         if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
 
2705                 error = xfs_qm_dqattach(ip, 0);
 
2709         for (i = 1; (i < 4 && i_tab[i]); i++) {
 
2711                  * Watch out for duplicate entries in the table.
 
2713                 if ((ip = i_tab[i]) != i_tab[i-1]) {
 
2714                         if (XFS_NOT_DQATTACHED(ip->i_mount, ip)) {
 
2715                                 error = xfs_qm_dqattach(ip, 0);
 
2725 xfs_qm_vop_dqattach_and_dqmod_newinode(
 
2731         if (!XFS_IS_QUOTA_ON(tp->t_mountp))
 
2734         ASSERT(XFS_ISLOCKED_INODE_EXCL(ip));
 
2735         ASSERT(XFS_IS_QUOTA_RUNNING(tp->t_mountp));
 
2741                 ASSERT(ip->i_udquot == NULL);
 
2742                 ip->i_udquot = udqp;
 
2743                 ASSERT(XFS_IS_UQUOTA_ON(tp->t_mountp));
 
2744                 ASSERT(ip->i_d.di_uid == be32_to_cpu(udqp->q_core.d_id));
 
2745                 xfs_trans_mod_dquot(tp, udqp, XFS_TRANS_DQ_ICOUNT, 1);
 
2751                 ASSERT(ip->i_gdquot == NULL);
 
2752                 ip->i_gdquot = gdqp;
 
2753                 ASSERT(XFS_IS_OQUOTA_ON(tp->t_mountp));
 
2754                 ASSERT((XFS_IS_GQUOTA_ON(tp->t_mountp) ?
 
2755                         ip->i_d.di_gid : ip->i_d.di_projid) ==
 
2756                                 be32_to_cpu(gdqp->q_core.d_id));
 
2757                 xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1);
 
2761 /* ------------- list stuff -----------------*/
 
2763 xfs_qm_freelist_init(xfs_frlist_t *ql)
 
2765         ql->qh_next = ql->qh_prev = (xfs_dquot_t *) ql;
 
2766         mutex_init(&ql->qh_lock);
 
2772 xfs_qm_freelist_destroy(xfs_frlist_t *ql)
 
2774         xfs_dquot_t     *dqp, *nextdqp;
 
2776         mutex_lock(&ql->qh_lock);
 
2777         for (dqp = ql->qh_next;
 
2778              dqp != (xfs_dquot_t *)ql; ) {
 
2780                 nextdqp = dqp->dq_flnext;
 
2782                 cmn_err(CE_DEBUG, "FREELIST destroy 0x%p", dqp);
 
2784                 XQM_FREELIST_REMOVE(dqp);
 
2786                 xfs_qm_dqdestroy(dqp);
 
2789         mutex_unlock(&ql->qh_lock);
 
2790         mutex_destroy(&ql->qh_lock);
 
2792         ASSERT(ql->qh_nelems == 0);
 
2796 xfs_qm_freelist_insert(xfs_frlist_t *ql, xfs_dquot_t *dq)
 
2798         dq->dq_flnext = ql->qh_next;
 
2799         dq->dq_flprev = (xfs_dquot_t *)ql;
 
2801         dq->dq_flnext->dq_flprev = dq;
 
2802         xfs_Gqm->qm_dqfreelist.qh_nelems++;
 
2803         xfs_Gqm->qm_dqfreelist.qh_version++;
 
2807 xfs_qm_freelist_unlink(xfs_dquot_t *dq)
 
2809         xfs_dquot_t *next = dq->dq_flnext;
 
2810         xfs_dquot_t *prev = dq->dq_flprev;
 
2812         next->dq_flprev = prev;
 
2813         prev->dq_flnext = next;
 
2814         dq->dq_flnext = dq->dq_flprev = dq;
 
2815         xfs_Gqm->qm_dqfreelist.qh_nelems--;
 
2816         xfs_Gqm->qm_dqfreelist.qh_version++;
 
2820 xfs_qm_freelist_append(xfs_frlist_t *ql, xfs_dquot_t *dq)
 
2822         xfs_qm_freelist_insert((xfs_frlist_t *)ql->qh_prev, dq);
 
2826 xfs_qm_dqhashlock_nowait(
 
2831         locked = mutex_trylock(&((dqp)->q_hash->qh_lock));
 
2836 xfs_qm_freelist_lock_nowait(
 
2841         locked = mutex_trylock(&(xqm->qm_dqfreelist.qh_lock));
 
2846 xfs_qm_mplist_nowait(
 
2851         ASSERT(mp->m_quotainfo);
 
2852         locked = mutex_trylock(&(XFS_QI_MPLLOCK(mp)));