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