linux/fs/xfs/xfs_qm.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
   3 * All Rights Reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it would be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write the Free Software Foundation,
  16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17 */
  18#include "xfs.h"
  19#include "xfs_fs.h"
  20#include "xfs_format.h"
  21#include "xfs_bit.h"
  22#include "xfs_log.h"
  23#include "xfs_trans.h"
  24#include "xfs_sb.h"
  25#include "xfs_ag.h"
  26#include "xfs_alloc.h"
  27#include "xfs_quota.h"
  28#include "xfs_mount.h"
  29#include "xfs_bmap_btree.h"
  30#include "xfs_ialloc_btree.h"
  31#include "xfs_dinode.h"
  32#include "xfs_inode.h"
  33#include "xfs_ialloc.h"
  34#include "xfs_itable.h"
  35#include "xfs_rtalloc.h"
  36#include "xfs_error.h"
  37#include "xfs_bmap.h"
  38#include "xfs_attr.h"
  39#include "xfs_buf_item.h"
  40#include "xfs_trans_space.h"
  41#include "xfs_qm.h"
  42#include "xfs_trace.h"
  43#include "xfs_icache.h"
  44#include "xfs_cksum.h"
  45
  46/*
  47 * The global quota manager. There is only one of these for the entire
  48 * system, _not_ one per file system. XQM keeps track of the overall
  49 * quota functionality, including maintaining the freelist and hash
  50 * tables of dquots.
  51 */
  52STATIC int      xfs_qm_init_quotainos(xfs_mount_t *);
  53STATIC int      xfs_qm_init_quotainfo(xfs_mount_t *);
  54
  55
  56STATIC void     xfs_qm_dqfree_one(struct xfs_dquot *dqp);
  57/*
  58 * We use the batch lookup interface to iterate over the dquots as it
  59 * currently is the only interface into the radix tree code that allows
  60 * fuzzy lookups instead of exact matches.  Holding the lock over multiple
  61 * operations is fine as all callers are used either during mount/umount
  62 * or quotaoff.
  63 */
  64#define XFS_DQ_LOOKUP_BATCH     32
  65
  66STATIC int
  67xfs_qm_dquot_walk(
  68        struct xfs_mount        *mp,
  69        int                     type,
  70        int                     (*execute)(struct xfs_dquot *dqp, void *data),
  71        void                    *data)
  72{
  73        struct xfs_quotainfo    *qi = mp->m_quotainfo;
  74        struct radix_tree_root  *tree = xfs_dquot_tree(qi, type);
  75        uint32_t                next_index;
  76        int                     last_error = 0;
  77        int                     skipped;
  78        int                     nr_found;
  79
  80restart:
  81        skipped = 0;
  82        next_index = 0;
  83        nr_found = 0;
  84
  85        while (1) {
  86                struct xfs_dquot *batch[XFS_DQ_LOOKUP_BATCH];
  87                int             error = 0;
  88                int             i;
  89
  90                mutex_lock(&qi->qi_tree_lock);
  91                nr_found = radix_tree_gang_lookup(tree, (void **)batch,
  92                                        next_index, XFS_DQ_LOOKUP_BATCH);
  93                if (!nr_found) {
  94                        mutex_unlock(&qi->qi_tree_lock);
  95                        break;
  96                }
  97
  98                for (i = 0; i < nr_found; i++) {
  99                        struct xfs_dquot *dqp = batch[i];
 100
 101                        next_index = be32_to_cpu(dqp->q_core.d_id) + 1;
 102
 103                        error = execute(batch[i], data);
 104                        if (error == EAGAIN) {
 105                                skipped++;
 106                                continue;
 107                        }
 108                        if (error && last_error != EFSCORRUPTED)
 109                                last_error = error;
 110                }
 111
 112                mutex_unlock(&qi->qi_tree_lock);
 113
 114                /* bail out if the filesystem is corrupted.  */
 115                if (last_error == EFSCORRUPTED) {
 116                        skipped = 0;
 117                        break;
 118                }
 119        }
 120
 121        if (skipped) {
 122                delay(1);
 123                goto restart;
 124        }
 125
 126        return last_error;
 127}
 128
 129
 130/*
 131 * Purge a dquot from all tracking data structures and free it.
 132 */
 133STATIC int
 134xfs_qm_dqpurge(
 135        struct xfs_dquot        *dqp,
 136        void                    *data)
 137{
 138        struct xfs_mount        *mp = dqp->q_mount;
 139        struct xfs_quotainfo    *qi = mp->m_quotainfo;
 140        struct xfs_dquot        *gdqp = NULL;
 141        struct xfs_dquot        *pdqp = NULL;
 142
 143        xfs_dqlock(dqp);
 144        if ((dqp->dq_flags & XFS_DQ_FREEING) || dqp->q_nrefs != 0) {
 145                xfs_dqunlock(dqp);
 146                return EAGAIN;
 147        }
 148
 149        /*
 150         * If this quota has a hint attached, prepare for releasing it now.
 151         */
 152        gdqp = dqp->q_gdquot;
 153        if (gdqp) {
 154                xfs_dqlock(gdqp);
 155                dqp->q_gdquot = NULL;
 156        }
 157
 158        pdqp = dqp->q_pdquot;
 159        if (pdqp) {
 160                xfs_dqlock(pdqp);
 161                dqp->q_pdquot = NULL;
 162        }
 163
 164        dqp->dq_flags |= XFS_DQ_FREEING;
 165
 166        xfs_dqflock(dqp);
 167
 168        /*
 169         * If we are turning this type of quotas off, we don't care
 170         * about the dirty metadata sitting in this dquot. OTOH, if
 171         * we're unmounting, we do care, so we flush it and wait.
 172         */
 173        if (XFS_DQ_IS_DIRTY(dqp)) {
 174                struct xfs_buf  *bp = NULL;
 175                int             error;
 176
 177                /*
 178                 * We don't care about getting disk errors here. We need
 179                 * to purge this dquot anyway, so we go ahead regardless.
 180                 */
 181                error = xfs_qm_dqflush(dqp, &bp);
 182                if (error) {
 183                        xfs_warn(mp, "%s: dquot %p flush failed",
 184                                __func__, dqp);
 185                } else {
 186                        error = xfs_bwrite(bp);
 187                        xfs_buf_relse(bp);
 188                }
 189                xfs_dqflock(dqp);
 190        }
 191
 192        ASSERT(atomic_read(&dqp->q_pincount) == 0);
 193        ASSERT(XFS_FORCED_SHUTDOWN(mp) ||
 194               !(dqp->q_logitem.qli_item.li_flags & XFS_LI_IN_AIL));
 195
 196        xfs_dqfunlock(dqp);
 197        xfs_dqunlock(dqp);
 198
 199        radix_tree_delete(xfs_dquot_tree(qi, dqp->q_core.d_flags),
 200                          be32_to_cpu(dqp->q_core.d_id));
 201        qi->qi_dquots--;
 202
 203        /*
 204         * We move dquots to the freelist as soon as their reference count
 205         * hits zero, so it really should be on the freelist here.
 206         */
 207        ASSERT(!list_empty(&dqp->q_lru));
 208        list_lru_del(&qi->qi_lru, &dqp->q_lru);
 209        XFS_STATS_DEC(xs_qm_dquot_unused);
 210
 211        xfs_qm_dqdestroy(dqp);
 212
 213        if (gdqp)
 214                xfs_qm_dqput(gdqp);
 215        if (pdqp)
 216                xfs_qm_dqput(pdqp);
 217        return 0;
 218}
 219
 220/*
 221 * Purge the dquot cache.
 222 */
 223void
 224xfs_qm_dqpurge_all(
 225        struct xfs_mount        *mp,
 226        uint                    flags)
 227{
 228        if (flags & XFS_QMOPT_UQUOTA)
 229                xfs_qm_dquot_walk(mp, XFS_DQ_USER, xfs_qm_dqpurge, NULL);
 230        if (flags & XFS_QMOPT_GQUOTA)
 231                xfs_qm_dquot_walk(mp, XFS_DQ_GROUP, xfs_qm_dqpurge, NULL);
 232        if (flags & XFS_QMOPT_PQUOTA)
 233                xfs_qm_dquot_walk(mp, XFS_DQ_PROJ, xfs_qm_dqpurge, NULL);
 234}
 235
 236/*
 237 * Just destroy the quotainfo structure.
 238 */
 239void
 240xfs_qm_unmount(
 241        struct xfs_mount        *mp)
 242{
 243        if (mp->m_quotainfo) {
 244                xfs_qm_dqpurge_all(mp, XFS_QMOPT_QUOTALL);
 245                xfs_qm_destroy_quotainfo(mp);
 246        }
 247}
 248
 249
 250/*
 251 * This is called from xfs_mountfs to start quotas and initialize all
 252 * necessary data structures like quotainfo.  This is also responsible for
 253 * running a quotacheck as necessary.  We are guaranteed that the superblock
 254 * is consistently read in at this point.
 255 *
 256 * If we fail here, the mount will continue with quota turned off. We don't
 257 * need to inidicate success or failure at all.
 258 */
 259void
 260xfs_qm_mount_quotas(
 261        xfs_mount_t     *mp)
 262{
 263        int             error = 0;
 264        uint            sbf;
 265
 266        /*
 267         * If quotas on realtime volumes is not supported, we disable
 268         * quotas immediately.
 269         */
 270        if (mp->m_sb.sb_rextents) {
 271                xfs_notice(mp, "Cannot turn on quotas for realtime filesystem");
 272                mp->m_qflags = 0;
 273                goto write_changes;
 274        }
 275
 276        ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 277
 278        /*
 279         * Allocate the quotainfo structure inside the mount struct, and
 280         * create quotainode(s), and change/rev superblock if necessary.
 281         */
 282        error = xfs_qm_init_quotainfo(mp);
 283        if (error) {
 284                /*
 285                 * We must turn off quotas.
 286                 */
 287                ASSERT(mp->m_quotainfo == NULL);
 288                mp->m_qflags = 0;
 289                goto write_changes;
 290        }
 291        /*
 292         * If any of the quotas are not consistent, do a quotacheck.
 293         */
 294        if (XFS_QM_NEED_QUOTACHECK(mp)) {
 295                error = xfs_qm_quotacheck(mp);
 296                if (error) {
 297                        /* Quotacheck failed and disabled quotas. */
 298                        return;
 299                }
 300        }
 301        /* 
 302         * If one type of quotas is off, then it will lose its
 303         * quotachecked status, since we won't be doing accounting for
 304         * that type anymore.
 305         */
 306        if (!XFS_IS_UQUOTA_ON(mp))
 307                mp->m_qflags &= ~XFS_UQUOTA_CHKD;
 308        if (!XFS_IS_GQUOTA_ON(mp))
 309                mp->m_qflags &= ~XFS_GQUOTA_CHKD;
 310        if (!XFS_IS_PQUOTA_ON(mp))
 311                mp->m_qflags &= ~XFS_PQUOTA_CHKD;
 312
 313 write_changes:
 314        /*
 315         * We actually don't have to acquire the m_sb_lock at all.
 316         * This can only be called from mount, and that's single threaded. XXX
 317         */
 318        spin_lock(&mp->m_sb_lock);
 319        sbf = mp->m_sb.sb_qflags;
 320        mp->m_sb.sb_qflags = mp->m_qflags & XFS_MOUNT_QUOTA_ALL;
 321        spin_unlock(&mp->m_sb_lock);
 322
 323        if (sbf != (mp->m_qflags & XFS_MOUNT_QUOTA_ALL)) {
 324                if (xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS)) {
 325                        /*
 326                         * We could only have been turning quotas off.
 327                         * We aren't in very good shape actually because
 328                         * the incore structures are convinced that quotas are
 329                         * off, but the on disk superblock doesn't know that !
 330                         */
 331                        ASSERT(!(XFS_IS_QUOTA_RUNNING(mp)));
 332                        xfs_alert(mp, "%s: Superblock update failed!",
 333                                __func__);
 334                }
 335        }
 336
 337        if (error) {
 338                xfs_warn(mp, "Failed to initialize disk quotas.");
 339                return;
 340        }
 341}
 342
 343/*
 344 * Called from the vfsops layer.
 345 */
 346void
 347xfs_qm_unmount_quotas(
 348        xfs_mount_t     *mp)
 349{
 350        /*
 351         * Release the dquots that root inode, et al might be holding,
 352         * before we flush quotas and blow away the quotainfo structure.
 353         */
 354        ASSERT(mp->m_rootip);
 355        xfs_qm_dqdetach(mp->m_rootip);
 356        if (mp->m_rbmip)
 357                xfs_qm_dqdetach(mp->m_rbmip);
 358        if (mp->m_rsumip)
 359                xfs_qm_dqdetach(mp->m_rsumip);
 360
 361        /*
 362         * Release the quota inodes.
 363         */
 364        if (mp->m_quotainfo) {
 365                if (mp->m_quotainfo->qi_uquotaip) {
 366                        IRELE(mp->m_quotainfo->qi_uquotaip);
 367                        mp->m_quotainfo->qi_uquotaip = NULL;
 368                }
 369                if (mp->m_quotainfo->qi_gquotaip) {
 370                        IRELE(mp->m_quotainfo->qi_gquotaip);
 371                        mp->m_quotainfo->qi_gquotaip = NULL;
 372                }
 373                if (mp->m_quotainfo->qi_pquotaip) {
 374                        IRELE(mp->m_quotainfo->qi_pquotaip);
 375                        mp->m_quotainfo->qi_pquotaip = NULL;
 376                }
 377        }
 378}
 379
 380STATIC int
 381xfs_qm_dqattach_one(
 382        xfs_inode_t     *ip,
 383        xfs_dqid_t      id,
 384        uint            type,
 385        uint            doalloc,
 386        xfs_dquot_t     *udqhint, /* hint */
 387        xfs_dquot_t     **IO_idqpp)
 388{
 389        xfs_dquot_t     *dqp;
 390        int             error;
 391
 392        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 393        error = 0;
 394
 395        /*
 396         * See if we already have it in the inode itself. IO_idqpp is
 397         * &i_udquot or &i_gdquot. This made the code look weird, but
 398         * made the logic a lot simpler.
 399         */
 400        dqp = *IO_idqpp;
 401        if (dqp) {
 402                trace_xfs_dqattach_found(dqp);
 403                return 0;
 404        }
 405
 406        /*
 407         * udqhint is the i_udquot field in inode, and is non-NULL only
 408         * when the type arg is group/project. Its purpose is to save a
 409         * lookup by dqid (xfs_qm_dqget) by caching a group dquot inside
 410         * the user dquot.
 411         */
 412        if (udqhint) {
 413                ASSERT(type == XFS_DQ_GROUP || type == XFS_DQ_PROJ);
 414                xfs_dqlock(udqhint);
 415
 416                /*
 417                 * No need to take dqlock to look at the id.
 418                 *
 419                 * The ID can't change until it gets reclaimed, and it won't
 420                 * be reclaimed as long as we have a ref from inode and we
 421                 * hold the ilock.
 422                 */
 423                if (type == XFS_DQ_GROUP)
 424                        dqp = udqhint->q_gdquot;
 425                else
 426                        dqp = udqhint->q_pdquot;
 427                if (dqp && be32_to_cpu(dqp->q_core.d_id) == id) {
 428                        ASSERT(*IO_idqpp == NULL);
 429
 430                        *IO_idqpp = xfs_qm_dqhold(dqp);
 431                        xfs_dqunlock(udqhint);
 432                        return 0;
 433                }
 434
 435                /*
 436                 * We can't hold a dquot lock when we call the dqget code.
 437                 * We'll deadlock in no time, because of (not conforming to)
 438                 * lock ordering - the inodelock comes before any dquot lock,
 439                 * and we may drop and reacquire the ilock in xfs_qm_dqget().
 440                 */
 441                xfs_dqunlock(udqhint);
 442        }
 443
 444        /*
 445         * Find the dquot from somewhere. This bumps the
 446         * reference count of dquot and returns it locked.
 447         * This can return ENOENT if dquot didn't exist on
 448         * disk and we didn't ask it to allocate;
 449         * ESRCH if quotas got turned off suddenly.
 450         */
 451        error = xfs_qm_dqget(ip->i_mount, ip, id, type,
 452                             doalloc | XFS_QMOPT_DOWARN, &dqp);
 453        if (error)
 454                return error;
 455
 456        trace_xfs_dqattach_get(dqp);
 457
 458        /*
 459         * dqget may have dropped and re-acquired the ilock, but it guarantees
 460         * that the dquot returned is the one that should go in the inode.
 461         */
 462        *IO_idqpp = dqp;
 463        xfs_dqunlock(dqp);
 464        return 0;
 465}
 466
 467
 468/*
 469 * Given a udquot and group/project type, attach the group/project
 470 * dquot pointer to the udquot as a hint for future lookups.
 471 */
 472STATIC void
 473xfs_qm_dqattach_hint(
 474        struct xfs_inode        *ip,
 475        int                     type)
 476{
 477        struct xfs_dquot **dqhintp;
 478        struct xfs_dquot *dqp;
 479        struct xfs_dquot *udq = ip->i_udquot;
 480
 481        ASSERT(type == XFS_DQ_GROUP || type == XFS_DQ_PROJ);
 482
 483        xfs_dqlock(udq);
 484
 485        if (type == XFS_DQ_GROUP) {
 486                dqp = ip->i_gdquot;
 487                dqhintp = &udq->q_gdquot;
 488        } else {
 489                dqp = ip->i_pdquot;
 490                dqhintp = &udq->q_pdquot;
 491        }
 492
 493        if (*dqhintp) {
 494                struct xfs_dquot *tmp;
 495
 496                if (*dqhintp == dqp)
 497                        goto done;
 498
 499                tmp = *dqhintp;
 500                *dqhintp = NULL;
 501                xfs_qm_dqrele(tmp);
 502        }
 503
 504        *dqhintp = xfs_qm_dqhold(dqp);
 505done:
 506        xfs_dqunlock(udq);
 507}
 508
 509static bool
 510xfs_qm_need_dqattach(
 511        struct xfs_inode        *ip)
 512{
 513        struct xfs_mount        *mp = ip->i_mount;
 514
 515        if (!XFS_IS_QUOTA_RUNNING(mp))
 516                return false;
 517        if (!XFS_IS_QUOTA_ON(mp))
 518                return false;
 519        if (!XFS_NOT_DQATTACHED(mp, ip))
 520                return false;
 521        if (xfs_is_quota_inode(&mp->m_sb, ip->i_ino))
 522                return false;
 523        return true;
 524}
 525
 526/*
 527 * Given a locked inode, attach dquot(s) to it, taking U/G/P-QUOTAON
 528 * into account.
 529 * If XFS_QMOPT_DQALLOC, the dquot(s) will be allocated if needed.
 530 * Inode may get unlocked and relocked in here, and the caller must deal with
 531 * the consequences.
 532 */
 533int
 534xfs_qm_dqattach_locked(
 535        xfs_inode_t     *ip,
 536        uint            flags)
 537{
 538        xfs_mount_t     *mp = ip->i_mount;
 539        uint            nquotas = 0;
 540        int             error = 0;
 541
 542        if (!xfs_qm_need_dqattach(ip))
 543                return 0;
 544
 545        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 546
 547        if (XFS_IS_UQUOTA_ON(mp)) {
 548                error = xfs_qm_dqattach_one(ip, ip->i_d.di_uid, XFS_DQ_USER,
 549                                                flags & XFS_QMOPT_DQALLOC,
 550                                                NULL, &ip->i_udquot);
 551                if (error)
 552                        goto done;
 553                nquotas++;
 554        }
 555
 556        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 557        if (XFS_IS_GQUOTA_ON(mp)) {
 558                error = xfs_qm_dqattach_one(ip, ip->i_d.di_gid, XFS_DQ_GROUP,
 559                                                flags & XFS_QMOPT_DQALLOC,
 560                                                ip->i_udquot, &ip->i_gdquot);
 561                /*
 562                 * Don't worry about the udquot that we may have
 563                 * attached above. It'll get detached, if not already.
 564                 */
 565                if (error)
 566                        goto done;
 567                nquotas++;
 568        }
 569
 570        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 571        if (XFS_IS_PQUOTA_ON(mp)) {
 572                error = xfs_qm_dqattach_one(ip, xfs_get_projid(ip), XFS_DQ_PROJ,
 573                                                flags & XFS_QMOPT_DQALLOC,
 574                                                ip->i_udquot, &ip->i_pdquot);
 575                /*
 576                 * Don't worry about the udquot that we may have
 577                 * attached above. It'll get detached, if not already.
 578                 */
 579                if (error)
 580                        goto done;
 581                nquotas++;
 582        }
 583
 584        /*
 585         * Attach this group/project quota to the user quota as a hint.
 586         * This WON'T, in general, result in a thrash.
 587         */
 588        if (nquotas > 1 && ip->i_udquot) {
 589                ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 590                ASSERT(ip->i_gdquot || !XFS_IS_GQUOTA_ON(mp));
 591                ASSERT(ip->i_pdquot || !XFS_IS_PQUOTA_ON(mp));
 592
 593                /*
 594                 * We do not have i_udquot locked at this point, but this check
 595                 * is OK since we don't depend on the i_gdquot to be accurate
 596                 * 100% all the time. It is just a hint, and this will
 597                 * succeed in general.
 598                 */
 599                if (ip->i_udquot->q_gdquot != ip->i_gdquot)
 600                        xfs_qm_dqattach_hint(ip, XFS_DQ_GROUP);
 601
 602                if (ip->i_udquot->q_pdquot != ip->i_pdquot)
 603                        xfs_qm_dqattach_hint(ip, XFS_DQ_PROJ);
 604        }
 605
 606 done:
 607#ifdef DEBUG
 608        if (!error) {
 609                if (XFS_IS_UQUOTA_ON(mp))
 610                        ASSERT(ip->i_udquot);
 611                if (XFS_IS_GQUOTA_ON(mp))
 612                        ASSERT(ip->i_gdquot);
 613                if (XFS_IS_PQUOTA_ON(mp))
 614                        ASSERT(ip->i_pdquot);
 615        }
 616        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 617#endif
 618        return error;
 619}
 620
 621int
 622xfs_qm_dqattach(
 623        struct xfs_inode        *ip,
 624        uint                    flags)
 625{
 626        int                     error;
 627
 628        if (!xfs_qm_need_dqattach(ip))
 629                return 0;
 630
 631        xfs_ilock(ip, XFS_ILOCK_EXCL);
 632        error = xfs_qm_dqattach_locked(ip, flags);
 633        xfs_iunlock(ip, XFS_ILOCK_EXCL);
 634
 635        return error;
 636}
 637
 638/*
 639 * Release dquots (and their references) if any.
 640 * The inode should be locked EXCL except when this's called by
 641 * xfs_ireclaim.
 642 */
 643void
 644xfs_qm_dqdetach(
 645        xfs_inode_t     *ip)
 646{
 647        if (!(ip->i_udquot || ip->i_gdquot || ip->i_pdquot))
 648                return;
 649
 650        trace_xfs_dquot_dqdetach(ip);
 651
 652        ASSERT(!xfs_is_quota_inode(&ip->i_mount->m_sb, ip->i_ino));
 653        if (ip->i_udquot) {
 654                xfs_qm_dqrele(ip->i_udquot);
 655                ip->i_udquot = NULL;
 656        }
 657        if (ip->i_gdquot) {
 658                xfs_qm_dqrele(ip->i_gdquot);
 659                ip->i_gdquot = NULL;
 660        }
 661        if (ip->i_pdquot) {
 662                xfs_qm_dqrele(ip->i_pdquot);
 663                ip->i_pdquot = NULL;
 664        }
 665}
 666
 667int
 668xfs_qm_calc_dquots_per_chunk(
 669        struct xfs_mount        *mp,
 670        unsigned int            nbblks) /* basic block units */
 671{
 672        unsigned int    ndquots;
 673
 674        ASSERT(nbblks > 0);
 675        ndquots = BBTOB(nbblks);
 676        do_div(ndquots, sizeof(xfs_dqblk_t));
 677
 678        return ndquots;
 679}
 680
 681struct xfs_qm_isolate {
 682        struct list_head        buffers;
 683        struct list_head        dispose;
 684};
 685
 686static enum lru_status
 687xfs_qm_dquot_isolate(
 688        struct list_head        *item,
 689        spinlock_t              *lru_lock,
 690        void                    *arg)
 691{
 692        struct xfs_dquot        *dqp = container_of(item,
 693                                                struct xfs_dquot, q_lru);
 694        struct xfs_qm_isolate   *isol = arg;
 695
 696        if (!xfs_dqlock_nowait(dqp))
 697                goto out_miss_busy;
 698
 699        /*
 700         * This dquot has acquired a reference in the meantime remove it from
 701         * the freelist and try again.
 702         */
 703        if (dqp->q_nrefs) {
 704                xfs_dqunlock(dqp);
 705                XFS_STATS_INC(xs_qm_dqwants);
 706
 707                trace_xfs_dqreclaim_want(dqp);
 708                list_del_init(&dqp->q_lru);
 709                XFS_STATS_DEC(xs_qm_dquot_unused);
 710                return LRU_REMOVED;
 711        }
 712
 713        /*
 714         * If the dquot is dirty, flush it. If it's already being flushed, just
 715         * skip it so there is time for the IO to complete before we try to
 716         * reclaim it again on the next LRU pass.
 717         */
 718        if (!xfs_dqflock_nowait(dqp)) {
 719                xfs_dqunlock(dqp);
 720                goto out_miss_busy;
 721        }
 722
 723        if (XFS_DQ_IS_DIRTY(dqp)) {
 724                struct xfs_buf  *bp = NULL;
 725                int             error;
 726
 727                trace_xfs_dqreclaim_dirty(dqp);
 728
 729                /* we have to drop the LRU lock to flush the dquot */
 730                spin_unlock(lru_lock);
 731
 732                error = xfs_qm_dqflush(dqp, &bp);
 733                if (error) {
 734                        xfs_warn(dqp->q_mount, "%s: dquot %p flush failed",
 735                                 __func__, dqp);
 736                        goto out_unlock_dirty;
 737                }
 738
 739                xfs_buf_delwri_queue(bp, &isol->buffers);
 740                xfs_buf_relse(bp);
 741                goto out_unlock_dirty;
 742        }
 743        xfs_dqfunlock(dqp);
 744
 745        /*
 746         * Prevent lookups now that we are past the point of no return.
 747         */
 748        dqp->dq_flags |= XFS_DQ_FREEING;
 749        xfs_dqunlock(dqp);
 750
 751        ASSERT(dqp->q_nrefs == 0);
 752        list_move_tail(&dqp->q_lru, &isol->dispose);
 753        XFS_STATS_DEC(xs_qm_dquot_unused);
 754        trace_xfs_dqreclaim_done(dqp);
 755        XFS_STATS_INC(xs_qm_dqreclaims);
 756        return LRU_REMOVED;
 757
 758out_miss_busy:
 759        trace_xfs_dqreclaim_busy(dqp);
 760        XFS_STATS_INC(xs_qm_dqreclaim_misses);
 761        return LRU_SKIP;
 762
 763out_unlock_dirty:
 764        trace_xfs_dqreclaim_busy(dqp);
 765        XFS_STATS_INC(xs_qm_dqreclaim_misses);
 766        xfs_dqunlock(dqp);
 767        spin_lock(lru_lock);
 768        return LRU_RETRY;
 769}
 770
 771static unsigned long
 772xfs_qm_shrink_scan(
 773        struct shrinker         *shrink,
 774        struct shrink_control   *sc)
 775{
 776        struct xfs_quotainfo    *qi = container_of(shrink,
 777                                        struct xfs_quotainfo, qi_shrinker);
 778        struct xfs_qm_isolate   isol;
 779        unsigned long           freed;
 780        int                     error;
 781        unsigned long           nr_to_scan = sc->nr_to_scan;
 782
 783        if ((sc->gfp_mask & (__GFP_FS|__GFP_WAIT)) != (__GFP_FS|__GFP_WAIT))
 784                return 0;
 785
 786        INIT_LIST_HEAD(&isol.buffers);
 787        INIT_LIST_HEAD(&isol.dispose);
 788
 789        freed = list_lru_walk_node(&qi->qi_lru, sc->nid, xfs_qm_dquot_isolate, &isol,
 790                                        &nr_to_scan);
 791
 792        error = xfs_buf_delwri_submit(&isol.buffers);
 793        if (error)
 794                xfs_warn(NULL, "%s: dquot reclaim failed", __func__);
 795
 796        while (!list_empty(&isol.dispose)) {
 797                struct xfs_dquot        *dqp;
 798
 799                dqp = list_first_entry(&isol.dispose, struct xfs_dquot, q_lru);
 800                list_del_init(&dqp->q_lru);
 801                xfs_qm_dqfree_one(dqp);
 802        }
 803
 804        return freed;
 805}
 806
 807static unsigned long
 808xfs_qm_shrink_count(
 809        struct shrinker         *shrink,
 810        struct shrink_control   *sc)
 811{
 812        struct xfs_quotainfo    *qi = container_of(shrink,
 813                                        struct xfs_quotainfo, qi_shrinker);
 814
 815        return list_lru_count_node(&qi->qi_lru, sc->nid);
 816}
 817
 818/*
 819 * This initializes all the quota information that's kept in the
 820 * mount structure
 821 */
 822STATIC int
 823xfs_qm_init_quotainfo(
 824        xfs_mount_t     *mp)
 825{
 826        xfs_quotainfo_t *qinf;
 827        int             error;
 828        xfs_dquot_t     *dqp;
 829
 830        ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 831
 832        qinf = mp->m_quotainfo = kmem_zalloc(sizeof(xfs_quotainfo_t), KM_SLEEP);
 833
 834        if ((error = list_lru_init(&qinf->qi_lru))) {
 835                kmem_free(qinf);
 836                mp->m_quotainfo = NULL;
 837                return error;
 838        }
 839
 840        /*
 841         * See if quotainodes are setup, and if not, allocate them,
 842         * and change the superblock accordingly.
 843         */
 844        if ((error = xfs_qm_init_quotainos(mp))) {
 845                list_lru_destroy(&qinf->qi_lru);
 846                kmem_free(qinf);
 847                mp->m_quotainfo = NULL;
 848                return error;
 849        }
 850
 851        INIT_RADIX_TREE(&qinf->qi_uquota_tree, GFP_NOFS);
 852        INIT_RADIX_TREE(&qinf->qi_gquota_tree, GFP_NOFS);
 853        INIT_RADIX_TREE(&qinf->qi_pquota_tree, GFP_NOFS);
 854        mutex_init(&qinf->qi_tree_lock);
 855
 856        /* mutex used to serialize quotaoffs */
 857        mutex_init(&qinf->qi_quotaofflock);
 858
 859        /* Precalc some constants */
 860        qinf->qi_dqchunklen = XFS_FSB_TO_BB(mp, XFS_DQUOT_CLUSTER_SIZE_FSB);
 861        qinf->qi_dqperchunk = xfs_qm_calc_dquots_per_chunk(mp,
 862                                                        qinf->qi_dqchunklen);
 863
 864        mp->m_qflags |= (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_CHKD);
 865
 866        /*
 867         * We try to get the limits from the superuser's limits fields.
 868         * This is quite hacky, but it is standard quota practice.
 869         *
 870         * We look at the USR dquot with id == 0 first, but if user quotas
 871         * are not enabled we goto the GRP dquot with id == 0.
 872         * We don't really care to keep separate default limits for user
 873         * and group quotas, at least not at this point.
 874         *
 875         * Since we may not have done a quotacheck by this point, just read
 876         * the dquot without attaching it to any hashtables or lists.
 877         */
 878        error = xfs_qm_dqread(mp, 0,
 879                        XFS_IS_UQUOTA_RUNNING(mp) ? XFS_DQ_USER :
 880                         (XFS_IS_GQUOTA_RUNNING(mp) ? XFS_DQ_GROUP :
 881                          XFS_DQ_PROJ),
 882                        XFS_QMOPT_DOWARN, &dqp);
 883        if (!error) {
 884                xfs_disk_dquot_t        *ddqp = &dqp->q_core;
 885
 886                /*
 887                 * The warnings and timers set the grace period given to
 888                 * a user or group before he or she can not perform any
 889                 * more writing. If it is zero, a default is used.
 890                 */
 891                qinf->qi_btimelimit = ddqp->d_btimer ?
 892                        be32_to_cpu(ddqp->d_btimer) : XFS_QM_BTIMELIMIT;
 893                qinf->qi_itimelimit = ddqp->d_itimer ?
 894                        be32_to_cpu(ddqp->d_itimer) : XFS_QM_ITIMELIMIT;
 895                qinf->qi_rtbtimelimit = ddqp->d_rtbtimer ?
 896                        be32_to_cpu(ddqp->d_rtbtimer) : XFS_QM_RTBTIMELIMIT;
 897                qinf->qi_bwarnlimit = ddqp->d_bwarns ?
 898                        be16_to_cpu(ddqp->d_bwarns) : XFS_QM_BWARNLIMIT;
 899                qinf->qi_iwarnlimit = ddqp->d_iwarns ?
 900                        be16_to_cpu(ddqp->d_iwarns) : XFS_QM_IWARNLIMIT;
 901                qinf->qi_rtbwarnlimit = ddqp->d_rtbwarns ?
 902                        be16_to_cpu(ddqp->d_rtbwarns) : XFS_QM_RTBWARNLIMIT;
 903                qinf->qi_bhardlimit = be64_to_cpu(ddqp->d_blk_hardlimit);
 904                qinf->qi_bsoftlimit = be64_to_cpu(ddqp->d_blk_softlimit);
 905                qinf->qi_ihardlimit = be64_to_cpu(ddqp->d_ino_hardlimit);
 906                qinf->qi_isoftlimit = be64_to_cpu(ddqp->d_ino_softlimit);
 907                qinf->qi_rtbhardlimit = be64_to_cpu(ddqp->d_rtb_hardlimit);
 908                qinf->qi_rtbsoftlimit = be64_to_cpu(ddqp->d_rtb_softlimit);
 909 
 910                xfs_qm_dqdestroy(dqp);
 911        } else {
 912                qinf->qi_btimelimit = XFS_QM_BTIMELIMIT;
 913                qinf->qi_itimelimit = XFS_QM_ITIMELIMIT;
 914                qinf->qi_rtbtimelimit = XFS_QM_RTBTIMELIMIT;
 915                qinf->qi_bwarnlimit = XFS_QM_BWARNLIMIT;
 916                qinf->qi_iwarnlimit = XFS_QM_IWARNLIMIT;
 917                qinf->qi_rtbwarnlimit = XFS_QM_RTBWARNLIMIT;
 918        }
 919
 920        qinf->qi_shrinker.count_objects = xfs_qm_shrink_count;
 921        qinf->qi_shrinker.scan_objects = xfs_qm_shrink_scan;
 922        qinf->qi_shrinker.seeks = DEFAULT_SEEKS;
 923        qinf->qi_shrinker.flags = SHRINKER_NUMA_AWARE;
 924        register_shrinker(&qinf->qi_shrinker);
 925        return 0;
 926}
 927
 928
 929/*
 930 * Gets called when unmounting a filesystem or when all quotas get
 931 * turned off.
 932 * This purges the quota inodes, destroys locks and frees itself.
 933 */
 934void
 935xfs_qm_destroy_quotainfo(
 936        xfs_mount_t     *mp)
 937{
 938        xfs_quotainfo_t *qi;
 939
 940        qi = mp->m_quotainfo;
 941        ASSERT(qi != NULL);
 942
 943        unregister_shrinker(&qi->qi_shrinker);
 944        list_lru_destroy(&qi->qi_lru);
 945
 946        if (qi->qi_uquotaip) {
 947                IRELE(qi->qi_uquotaip);
 948                qi->qi_uquotaip = NULL; /* paranoia */
 949        }
 950        if (qi->qi_gquotaip) {
 951                IRELE(qi->qi_gquotaip);
 952                qi->qi_gquotaip = NULL;
 953        }
 954        if (qi->qi_pquotaip) {
 955                IRELE(qi->qi_pquotaip);
 956                qi->qi_pquotaip = NULL;
 957        }
 958        mutex_destroy(&qi->qi_quotaofflock);
 959        kmem_free(qi);
 960        mp->m_quotainfo = NULL;
 961}
 962
 963/*
 964 * Create an inode and return with a reference already taken, but unlocked
 965 * This is how we create quota inodes
 966 */
 967STATIC int
 968xfs_qm_qino_alloc(
 969        xfs_mount_t     *mp,
 970        xfs_inode_t     **ip,
 971        __int64_t       sbfields,
 972        uint            flags)
 973{
 974        xfs_trans_t     *tp;
 975        int             error;
 976        int             committed;
 977
 978        *ip = NULL;
 979        /*
 980         * With superblock that doesn't have separate pquotino, we
 981         * share an inode between gquota and pquota. If the on-disk
 982         * superblock has GQUOTA and the filesystem is now mounted
 983         * with PQUOTA, just use sb_gquotino for sb_pquotino and
 984         * vice-versa.
 985         */
 986        if (!xfs_sb_version_has_pquotino(&mp->m_sb) &&
 987                        (flags & (XFS_QMOPT_PQUOTA|XFS_QMOPT_GQUOTA))) {
 988                xfs_ino_t ino = NULLFSINO;
 989
 990                if ((flags & XFS_QMOPT_PQUOTA) &&
 991                             (mp->m_sb.sb_gquotino != NULLFSINO)) {
 992                        ino = mp->m_sb.sb_gquotino;
 993                        ASSERT(mp->m_sb.sb_pquotino == NULLFSINO);
 994                } else if ((flags & XFS_QMOPT_GQUOTA) &&
 995                             (mp->m_sb.sb_pquotino != NULLFSINO)) {
 996                        ino = mp->m_sb.sb_pquotino;
 997                        ASSERT(mp->m_sb.sb_gquotino == NULLFSINO);
 998                }
 999                if (ino != NULLFSINO) {
1000                        error = xfs_iget(mp, NULL, ino, 0, 0, ip);
1001                        if (error)
1002                                return error;
1003                        mp->m_sb.sb_gquotino = NULLFSINO;
1004                        mp->m_sb.sb_pquotino = NULLFSINO;
1005                }
1006        }
1007
1008        tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QINOCREATE);
1009        error = xfs_trans_reserve(tp, &M_RES(mp)->tr_create,
1010                                  XFS_QM_QINOCREATE_SPACE_RES(mp), 0);
1011        if (error) {
1012                xfs_trans_cancel(tp, 0);
1013                return error;
1014        }
1015
1016        if (!*ip) {
1017                error = xfs_dir_ialloc(&tp, NULL, S_IFREG, 1, 0, 0, 1, ip,
1018                                                                &committed);
1019                if (error) {
1020                        xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES |
1021                                         XFS_TRANS_ABORT);
1022                        return error;
1023                }
1024        }
1025
1026        /*
1027         * Make the changes in the superblock, and log those too.
1028         * sbfields arg may contain fields other than *QUOTINO;
1029         * VERSIONNUM for example.
1030         */
1031        spin_lock(&mp->m_sb_lock);
1032        if (flags & XFS_QMOPT_SBVERSION) {
1033                ASSERT(!xfs_sb_version_hasquota(&mp->m_sb));
1034                ASSERT((sbfields & (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO |
1035                        XFS_SB_GQUOTINO | XFS_SB_PQUOTINO | XFS_SB_QFLAGS)) ==
1036                                (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO |
1037                                 XFS_SB_GQUOTINO | XFS_SB_PQUOTINO |
1038                                 XFS_SB_QFLAGS));
1039
1040                xfs_sb_version_addquota(&mp->m_sb);
1041                mp->m_sb.sb_uquotino = NULLFSINO;
1042                mp->m_sb.sb_gquotino = NULLFSINO;
1043                mp->m_sb.sb_pquotino = NULLFSINO;
1044
1045                /* qflags will get updated fully _after_ quotacheck */
1046                mp->m_sb.sb_qflags = mp->m_qflags & XFS_ALL_QUOTA_ACCT;
1047        }
1048        if (flags & XFS_QMOPT_UQUOTA)
1049                mp->m_sb.sb_uquotino = (*ip)->i_ino;
1050        else if (flags & XFS_QMOPT_GQUOTA)
1051                mp->m_sb.sb_gquotino = (*ip)->i_ino;
1052        else
1053                mp->m_sb.sb_pquotino = (*ip)->i_ino;
1054        spin_unlock(&mp->m_sb_lock);
1055        xfs_mod_sb(tp, sbfields);
1056
1057        if ((error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES))) {
1058                xfs_alert(mp, "%s failed (error %d)!", __func__, error);
1059                return error;
1060        }
1061        return 0;
1062}
1063
1064
1065STATIC void
1066xfs_qm_reset_dqcounts(
1067        xfs_mount_t     *mp,
1068        xfs_buf_t       *bp,
1069        xfs_dqid_t      id,
1070        uint            type)
1071{
1072        struct xfs_dqblk        *dqb;
1073        int                     j;
1074
1075        trace_xfs_reset_dqcounts(bp, _RET_IP_);
1076
1077        /*
1078         * Reset all counters and timers. They'll be
1079         * started afresh by xfs_qm_quotacheck.
1080         */
1081#ifdef DEBUG
1082        j = XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB);
1083        do_div(j, sizeof(xfs_dqblk_t));
1084        ASSERT(mp->m_quotainfo->qi_dqperchunk == j);
1085#endif
1086        dqb = bp->b_addr;
1087        for (j = 0; j < mp->m_quotainfo->qi_dqperchunk; j++) {
1088                struct xfs_disk_dquot   *ddq;
1089
1090                ddq = (struct xfs_disk_dquot *)&dqb[j];
1091
1092                /*
1093                 * Do a sanity check, and if needed, repair the dqblk. Don't
1094                 * output any warnings because it's perfectly possible to
1095                 * find uninitialised dquot blks. See comment in xfs_qm_dqcheck.
1096                 */
1097                (void) xfs_qm_dqcheck(mp, ddq, id+j, type, XFS_QMOPT_DQREPAIR,
1098                                      "xfs_quotacheck");
1099                ddq->d_bcount = 0;
1100                ddq->d_icount = 0;
1101                ddq->d_rtbcount = 0;
1102                ddq->d_btimer = 0;
1103                ddq->d_itimer = 0;
1104                ddq->d_rtbtimer = 0;
1105                ddq->d_bwarns = 0;
1106                ddq->d_iwarns = 0;
1107                ddq->d_rtbwarns = 0;
1108
1109                if (xfs_sb_version_hascrc(&mp->m_sb)) {
1110                        xfs_update_cksum((char *)&dqb[j],
1111                                         sizeof(struct xfs_dqblk),
1112                                         XFS_DQUOT_CRC_OFF);
1113                }
1114        }
1115}
1116
1117STATIC int
1118xfs_qm_dqiter_bufs(
1119        struct xfs_mount        *mp,
1120        xfs_dqid_t              firstid,
1121        xfs_fsblock_t           bno,
1122        xfs_filblks_t           blkcnt,
1123        uint                    flags,
1124        struct list_head        *buffer_list)
1125{
1126        struct xfs_buf          *bp;
1127        int                     error;
1128        int                     type;
1129
1130        ASSERT(blkcnt > 0);
1131        type = flags & XFS_QMOPT_UQUOTA ? XFS_DQ_USER :
1132                (flags & XFS_QMOPT_PQUOTA ? XFS_DQ_PROJ : XFS_DQ_GROUP);
1133        error = 0;
1134
1135        /*
1136         * Blkcnt arg can be a very big number, and might even be
1137         * larger than the log itself. So, we have to break it up into
1138         * manageable-sized transactions.
1139         * Note that we don't start a permanent transaction here; we might
1140         * not be able to get a log reservation for the whole thing up front,
1141         * and we don't really care to either, because we just discard
1142         * everything if we were to crash in the middle of this loop.
1143         */
1144        while (blkcnt--) {
1145                error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp,
1146                              XFS_FSB_TO_DADDR(mp, bno),
1147                              mp->m_quotainfo->qi_dqchunklen, 0, &bp,
1148                              &xfs_dquot_buf_ops);
1149
1150                /*
1151                 * CRC and validation errors will return a EFSCORRUPTED here. If
1152                 * this occurs, re-read without CRC validation so that we can
1153                 * repair the damage via xfs_qm_reset_dqcounts(). This process
1154                 * will leave a trace in the log indicating corruption has
1155                 * been detected.
1156                 */
1157                if (error == EFSCORRUPTED) {
1158                        error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp,
1159                                      XFS_FSB_TO_DADDR(mp, bno),
1160                                      mp->m_quotainfo->qi_dqchunklen, 0, &bp,
1161                                      NULL);
1162                }
1163
1164                if (error)
1165                        break;
1166
1167                xfs_qm_reset_dqcounts(mp, bp, firstid, type);
1168                xfs_buf_delwri_queue(bp, buffer_list);
1169                xfs_buf_relse(bp);
1170
1171                /* goto the next block. */
1172                bno++;
1173                firstid += mp->m_quotainfo->qi_dqperchunk;
1174        }
1175
1176        return error;
1177}
1178
1179/*
1180 * Iterate over all allocated USR/GRP/PRJ dquots in the system, calling a
1181 * caller supplied function for every chunk of dquots that we find.
1182 */
1183STATIC int
1184xfs_qm_dqiterate(
1185        struct xfs_mount        *mp,
1186        struct xfs_inode        *qip,
1187        uint                    flags,
1188        struct list_head        *buffer_list)
1189{
1190        struct xfs_bmbt_irec    *map;
1191        int                     i, nmaps;       /* number of map entries */
1192        int                     error;          /* return value */
1193        xfs_fileoff_t           lblkno;
1194        xfs_filblks_t           maxlblkcnt;
1195        xfs_dqid_t              firstid;
1196        xfs_fsblock_t           rablkno;
1197        xfs_filblks_t           rablkcnt;
1198
1199        error = 0;
1200        /*
1201         * This looks racy, but we can't keep an inode lock across a
1202         * trans_reserve. But, this gets called during quotacheck, and that
1203         * happens only at mount time which is single threaded.
1204         */
1205        if (qip->i_d.di_nblocks == 0)
1206                return 0;
1207
1208        map = kmem_alloc(XFS_DQITER_MAP_SIZE * sizeof(*map), KM_SLEEP);
1209
1210        lblkno = 0;
1211        maxlblkcnt = XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes);
1212        do {
1213                nmaps = XFS_DQITER_MAP_SIZE;
1214                /*
1215                 * We aren't changing the inode itself. Just changing
1216                 * some of its data. No new blocks are added here, and
1217                 * the inode is never added to the transaction.
1218                 */
1219                xfs_ilock(qip, XFS_ILOCK_SHARED);
1220                error = xfs_bmapi_read(qip, lblkno, maxlblkcnt - lblkno,
1221                                       map, &nmaps, 0);
1222                xfs_iunlock(qip, XFS_ILOCK_SHARED);
1223                if (error)
1224                        break;
1225
1226                ASSERT(nmaps <= XFS_DQITER_MAP_SIZE);
1227                for (i = 0; i < nmaps; i++) {
1228                        ASSERT(map[i].br_startblock != DELAYSTARTBLOCK);
1229                        ASSERT(map[i].br_blockcount);
1230
1231
1232                        lblkno += map[i].br_blockcount;
1233
1234                        if (map[i].br_startblock == HOLESTARTBLOCK)
1235                                continue;
1236
1237                        firstid = (xfs_dqid_t) map[i].br_startoff *
1238                                mp->m_quotainfo->qi_dqperchunk;
1239                        /*
1240                         * Do a read-ahead on the next extent.
1241                         */
1242                        if ((i+1 < nmaps) &&
1243                            (map[i+1].br_startblock != HOLESTARTBLOCK)) {
1244                                rablkcnt =  map[i+1].br_blockcount;
1245                                rablkno = map[i+1].br_startblock;
1246                                while (rablkcnt--) {
1247                                        xfs_buf_readahead(mp->m_ddev_targp,
1248                                               XFS_FSB_TO_DADDR(mp, rablkno),
1249                                               mp->m_quotainfo->qi_dqchunklen,
1250                                               NULL);
1251                                        rablkno++;
1252                                }
1253                        }
1254                        /*
1255                         * Iterate thru all the blks in the extent and
1256                         * reset the counters of all the dquots inside them.
1257                         */
1258                        error = xfs_qm_dqiter_bufs(mp, firstid,
1259                                                   map[i].br_startblock,
1260                                                   map[i].br_blockcount,
1261                                                   flags, buffer_list);
1262                        if (error)
1263                                goto out;
1264                }
1265        } while (nmaps > 0);
1266
1267out:
1268        kmem_free(map);
1269        return error;
1270}
1271
1272/*
1273 * Called by dqusage_adjust in doing a quotacheck.
1274 *
1275 * Given the inode, and a dquot id this updates both the incore dqout as well
1276 * as the buffer copy. This is so that once the quotacheck is done, we can
1277 * just log all the buffers, as opposed to logging numerous updates to
1278 * individual dquots.
1279 */
1280STATIC int
1281xfs_qm_quotacheck_dqadjust(
1282        struct xfs_inode        *ip,
1283        xfs_dqid_t              id,
1284        uint                    type,
1285        xfs_qcnt_t              nblks,
1286        xfs_qcnt_t              rtblks)
1287{
1288        struct xfs_mount        *mp = ip->i_mount;
1289        struct xfs_dquot        *dqp;
1290        int                     error;
1291
1292        error = xfs_qm_dqget(mp, ip, id, type,
1293                             XFS_QMOPT_DQALLOC | XFS_QMOPT_DOWARN, &dqp);
1294        if (error) {
1295                /*
1296                 * Shouldn't be able to turn off quotas here.
1297                 */
1298                ASSERT(error != ESRCH);
1299                ASSERT(error != ENOENT);
1300                return error;
1301        }
1302
1303        trace_xfs_dqadjust(dqp);
1304
1305        /*
1306         * Adjust the inode count and the block count to reflect this inode's
1307         * resource usage.
1308         */
1309        be64_add_cpu(&dqp->q_core.d_icount, 1);
1310        dqp->q_res_icount++;
1311        if (nblks) {
1312                be64_add_cpu(&dqp->q_core.d_bcount, nblks);
1313                dqp->q_res_bcount += nblks;
1314        }
1315        if (rtblks) {
1316                be64_add_cpu(&dqp->q_core.d_rtbcount, rtblks);
1317                dqp->q_res_rtbcount += rtblks;
1318        }
1319
1320        /*
1321         * Set default limits, adjust timers (since we changed usages)
1322         *
1323         * There are no timers for the default values set in the root dquot.
1324         */
1325        if (dqp->q_core.d_id) {
1326                xfs_qm_adjust_dqlimits(mp, dqp);
1327                xfs_qm_adjust_dqtimers(mp, &dqp->q_core);
1328        }
1329
1330        dqp->dq_flags |= XFS_DQ_DIRTY;
1331        xfs_qm_dqput(dqp);
1332        return 0;
1333}
1334
1335STATIC int
1336xfs_qm_get_rtblks(
1337        xfs_inode_t     *ip,
1338        xfs_qcnt_t      *O_rtblks)
1339{
1340        xfs_filblks_t   rtblks;                 /* total rt blks */
1341        xfs_extnum_t    idx;                    /* extent record index */
1342        xfs_ifork_t     *ifp;                   /* inode fork pointer */
1343        xfs_extnum_t    nextents;               /* number of extent entries */
1344        int             error;
1345
1346        ASSERT(XFS_IS_REALTIME_INODE(ip));
1347        ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK);
1348        if (!(ifp->if_flags & XFS_IFEXTENTS)) {
1349                if ((error = xfs_iread_extents(NULL, ip, XFS_DATA_FORK)))
1350                        return error;
1351        }
1352        rtblks = 0;
1353        nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
1354        for (idx = 0; idx < nextents; idx++)
1355                rtblks += xfs_bmbt_get_blockcount(xfs_iext_get_ext(ifp, idx));
1356        *O_rtblks = (xfs_qcnt_t)rtblks;
1357        return 0;
1358}
1359
1360/*
1361 * callback routine supplied to bulkstat(). Given an inumber, find its
1362 * dquots and update them to account for resources taken by that inode.
1363 */
1364/* ARGSUSED */
1365STATIC int
1366xfs_qm_dqusage_adjust(
1367        xfs_mount_t     *mp,            /* mount point for filesystem */
1368        xfs_ino_t       ino,            /* inode number to get data for */
1369        void            __user *buffer, /* not used */
1370        int             ubsize,         /* not used */
1371        int             *ubused,        /* not used */
1372        int             *res)           /* result code value */
1373{
1374        xfs_inode_t     *ip;
1375        xfs_qcnt_t      nblks, rtblks = 0;
1376        int             error;
1377
1378        ASSERT(XFS_IS_QUOTA_RUNNING(mp));
1379
1380        /*
1381         * rootino must have its resources accounted for, not so with the quota
1382         * inodes.
1383         */
1384        if (xfs_is_quota_inode(&mp->m_sb, ino)) {
1385                *res = BULKSTAT_RV_NOTHING;
1386                return XFS_ERROR(EINVAL);
1387        }
1388
1389        /*
1390         * We don't _need_ to take the ilock EXCL. However, the xfs_qm_dqget
1391         * interface expects the inode to be exclusively locked because that's
1392         * the case in all other instances. It's OK that we do this because
1393         * quotacheck is done only at mount time.
1394         */
1395        error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip);
1396        if (error) {
1397                *res = BULKSTAT_RV_NOTHING;
1398                return error;
1399        }
1400
1401        ASSERT(ip->i_delayed_blks == 0);
1402
1403        if (XFS_IS_REALTIME_INODE(ip)) {
1404                /*
1405                 * Walk thru the extent list and count the realtime blocks.
1406                 */
1407                error = xfs_qm_get_rtblks(ip, &rtblks);
1408                if (error)
1409                        goto error0;
1410        }
1411
1412        nblks = (xfs_qcnt_t)ip->i_d.di_nblocks - rtblks;
1413
1414        /*
1415         * Add the (disk blocks and inode) resources occupied by this
1416         * inode to its dquots. We do this adjustment in the incore dquot,
1417         * and also copy the changes to its buffer.
1418         * We don't care about putting these changes in a transaction
1419         * envelope because if we crash in the middle of a 'quotacheck'
1420         * we have to start from the beginning anyway.
1421         * Once we're done, we'll log all the dquot bufs.
1422         *
1423         * The *QUOTA_ON checks below may look pretty racy, but quotachecks
1424         * and quotaoffs don't race. (Quotachecks happen at mount time only).
1425         */
1426        if (XFS_IS_UQUOTA_ON(mp)) {
1427                error = xfs_qm_quotacheck_dqadjust(ip, ip->i_d.di_uid,
1428                                                   XFS_DQ_USER, nblks, rtblks);
1429                if (error)
1430                        goto error0;
1431        }
1432
1433        if (XFS_IS_GQUOTA_ON(mp)) {
1434                error = xfs_qm_quotacheck_dqadjust(ip, ip->i_d.di_gid,
1435                                                   XFS_DQ_GROUP, nblks, rtblks);
1436                if (error)
1437                        goto error0;
1438        }
1439
1440        if (XFS_IS_PQUOTA_ON(mp)) {
1441                error = xfs_qm_quotacheck_dqadjust(ip, xfs_get_projid(ip),
1442                                                   XFS_DQ_PROJ, nblks, rtblks);
1443                if (error)
1444                        goto error0;
1445        }
1446
1447        xfs_iunlock(ip, XFS_ILOCK_EXCL);
1448        IRELE(ip);
1449        *res = BULKSTAT_RV_DIDONE;
1450        return 0;
1451
1452error0:
1453        xfs_iunlock(ip, XFS_ILOCK_EXCL);
1454        IRELE(ip);
1455        *res = BULKSTAT_RV_GIVEUP;
1456        return error;
1457}
1458
1459STATIC int
1460xfs_qm_flush_one(
1461        struct xfs_dquot        *dqp,
1462        void                    *data)
1463{
1464        struct list_head        *buffer_list = data;
1465        struct xfs_buf          *bp = NULL;
1466        int                     error = 0;
1467
1468        xfs_dqlock(dqp);
1469        if (dqp->dq_flags & XFS_DQ_FREEING)
1470                goto out_unlock;
1471        if (!XFS_DQ_IS_DIRTY(dqp))
1472                goto out_unlock;
1473
1474        xfs_dqflock(dqp);
1475        error = xfs_qm_dqflush(dqp, &bp);
1476        if (error)
1477                goto out_unlock;
1478
1479        xfs_buf_delwri_queue(bp, buffer_list);
1480        xfs_buf_relse(bp);
1481out_unlock:
1482        xfs_dqunlock(dqp);
1483        return error;
1484}
1485
1486/*
1487 * Walk thru all the filesystem inodes and construct a consistent view
1488 * of the disk quota world. If the quotacheck fails, disable quotas.
1489 */
1490int
1491xfs_qm_quotacheck(
1492        xfs_mount_t     *mp)
1493{
1494        int                     done, count, error, error2;
1495        xfs_ino_t               lastino;
1496        size_t                  structsz;
1497        uint                    flags;
1498        LIST_HEAD               (buffer_list);
1499        struct xfs_inode        *uip = mp->m_quotainfo->qi_uquotaip;
1500        struct xfs_inode        *gip = mp->m_quotainfo->qi_gquotaip;
1501        struct xfs_inode        *pip = mp->m_quotainfo->qi_pquotaip;
1502
1503        count = INT_MAX;
1504        structsz = 1;
1505        lastino = 0;
1506        flags = 0;
1507
1508        ASSERT(uip || gip || pip);
1509        ASSERT(XFS_IS_QUOTA_RUNNING(mp));
1510
1511        xfs_notice(mp, "Quotacheck needed: Please wait.");
1512
1513        /*
1514         * First we go thru all the dquots on disk, USR and GRP/PRJ, and reset
1515         * their counters to zero. We need a clean slate.
1516         * We don't log our changes till later.
1517         */
1518        if (uip) {
1519                error = xfs_qm_dqiterate(mp, uip, XFS_QMOPT_UQUOTA,
1520                                         &buffer_list);
1521                if (error)
1522                        goto error_return;
1523                flags |= XFS_UQUOTA_CHKD;
1524        }
1525
1526        if (gip) {
1527                error = xfs_qm_dqiterate(mp, gip, XFS_QMOPT_GQUOTA,
1528                                         &buffer_list);
1529                if (error)
1530                        goto error_return;
1531                flags |= XFS_GQUOTA_CHKD;
1532        }
1533
1534        if (pip) {
1535                error = xfs_qm_dqiterate(mp, pip, XFS_QMOPT_PQUOTA,
1536                                         &buffer_list);
1537                if (error)
1538                        goto error_return;
1539                flags |= XFS_PQUOTA_CHKD;
1540        }
1541
1542        do {
1543                /*
1544                 * Iterate thru all the inodes in the file system,
1545                 * adjusting the corresponding dquot counters in core.
1546                 */
1547                error = xfs_bulkstat(mp, &lastino, &count,
1548                                     xfs_qm_dqusage_adjust,
1549                                     structsz, NULL, &done);
1550                if (error)
1551                        break;
1552
1553        } while (!done);
1554
1555        /*
1556         * We've made all the changes that we need to make incore.  Flush them
1557         * down to disk buffers if everything was updated successfully.
1558         */
1559        if (XFS_IS_UQUOTA_ON(mp)) {
1560                error = xfs_qm_dquot_walk(mp, XFS_DQ_USER, xfs_qm_flush_one,
1561                                          &buffer_list);
1562        }
1563        if (XFS_IS_GQUOTA_ON(mp)) {
1564                error2 = xfs_qm_dquot_walk(mp, XFS_DQ_GROUP, xfs_qm_flush_one,
1565                                           &buffer_list);
1566                if (!error)
1567                        error = error2;
1568        }
1569        if (XFS_IS_PQUOTA_ON(mp)) {
1570                error2 = xfs_qm_dquot_walk(mp, XFS_DQ_PROJ, xfs_qm_flush_one,
1571                                           &buffer_list);
1572                if (!error)
1573                        error = error2;
1574        }
1575
1576        error2 = xfs_buf_delwri_submit(&buffer_list);
1577        if (!error)
1578                error = error2;
1579
1580        /*
1581         * We can get this error if we couldn't do a dquot allocation inside
1582         * xfs_qm_dqusage_adjust (via bulkstat). We don't care about the
1583         * dirty dquots that might be cached, we just want to get rid of them
1584         * and turn quotaoff. The dquots won't be attached to any of the inodes
1585         * at this point (because we intentionally didn't in dqget_noattach).
1586         */
1587        if (error) {
1588                xfs_qm_dqpurge_all(mp, XFS_QMOPT_QUOTALL);
1589                goto error_return;
1590        }
1591
1592        /*
1593         * If one type of quotas is off, then it will lose its
1594         * quotachecked status, since we won't be doing accounting for
1595         * that type anymore.
1596         */
1597        mp->m_qflags &= ~XFS_ALL_QUOTA_CHKD;
1598        mp->m_qflags |= flags;
1599
1600 error_return:
1601        while (!list_empty(&buffer_list)) {
1602                struct xfs_buf *bp =
1603                        list_first_entry(&buffer_list, struct xfs_buf, b_list);
1604                list_del_init(&bp->b_list);
1605                xfs_buf_relse(bp);
1606        }
1607
1608        if (error) {
1609                xfs_warn(mp,
1610        "Quotacheck: Unsuccessful (Error %d): Disabling quotas.",
1611                        error);
1612                /*
1613                 * We must turn off quotas.
1614                 */
1615                ASSERT(mp->m_quotainfo != NULL);
1616                xfs_qm_destroy_quotainfo(mp);
1617                if (xfs_mount_reset_sbqflags(mp)) {
1618                        xfs_warn(mp,
1619                                "Quotacheck: Failed to reset quota flags.");
1620                }
1621        } else
1622                xfs_notice(mp, "Quotacheck: Done.");
1623        return (error);
1624}
1625
1626/*
1627 * This is called after the superblock has been read in and we're ready to
1628 * iget the quota inodes.
1629 */
1630STATIC int
1631xfs_qm_init_quotainos(
1632        xfs_mount_t     *mp)
1633{
1634        struct xfs_inode        *uip = NULL;
1635        struct xfs_inode        *gip = NULL;
1636        struct xfs_inode        *pip = NULL;
1637        int                     error;
1638        __int64_t               sbflags = 0;
1639        uint                    flags = 0;
1640
1641        ASSERT(mp->m_quotainfo);
1642
1643        /*
1644         * Get the uquota and gquota inodes
1645         */
1646        if (xfs_sb_version_hasquota(&mp->m_sb)) {
1647                if (XFS_IS_UQUOTA_ON(mp) &&
1648                    mp->m_sb.sb_uquotino != NULLFSINO) {
1649                        ASSERT(mp->m_sb.sb_uquotino > 0);
1650                        error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino,
1651                                             0, 0, &uip);
1652                        if (error)
1653                                return XFS_ERROR(error);
1654                }
1655                if (XFS_IS_GQUOTA_ON(mp) &&
1656                    mp->m_sb.sb_gquotino != NULLFSINO) {
1657                        ASSERT(mp->m_sb.sb_gquotino > 0);
1658                        error = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino,
1659                                             0, 0, &gip);
1660                        if (error)
1661                                goto error_rele;
1662                }
1663                if (XFS_IS_PQUOTA_ON(mp) &&
1664                    mp->m_sb.sb_pquotino != NULLFSINO) {
1665                        ASSERT(mp->m_sb.sb_pquotino > 0);
1666                        error = xfs_iget(mp, NULL, mp->m_sb.sb_pquotino,
1667                                             0, 0, &pip);
1668                        if (error)
1669                                goto error_rele;
1670                }
1671        } else {
1672                flags |= XFS_QMOPT_SBVERSION;
1673                sbflags |= (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO |
1674                            XFS_SB_GQUOTINO | XFS_SB_PQUOTINO |
1675                            XFS_SB_QFLAGS);
1676        }
1677
1678        /*
1679         * Create the three inodes, if they don't exist already. The changes
1680         * made above will get added to a transaction and logged in one of
1681         * the qino_alloc calls below.  If the device is readonly,
1682         * temporarily switch to read-write to do this.
1683         */
1684        if (XFS_IS_UQUOTA_ON(mp) && uip == NULL) {
1685                error = xfs_qm_qino_alloc(mp, &uip,
1686                                              sbflags | XFS_SB_UQUOTINO,
1687                                              flags | XFS_QMOPT_UQUOTA);
1688                if (error)
1689                        goto error_rele;
1690
1691                flags &= ~XFS_QMOPT_SBVERSION;
1692        }
1693        if (XFS_IS_GQUOTA_ON(mp) && gip == NULL) {
1694                error = xfs_qm_qino_alloc(mp, &gip,
1695                                          sbflags | XFS_SB_GQUOTINO,
1696                                          flags | XFS_QMOPT_GQUOTA);
1697                if (error)
1698                        goto error_rele;
1699
1700                flags &= ~XFS_QMOPT_SBVERSION;
1701        }
1702        if (XFS_IS_PQUOTA_ON(mp) && pip == NULL) {
1703                error = xfs_qm_qino_alloc(mp, &pip,
1704                                          sbflags | XFS_SB_PQUOTINO,
1705                                          flags | XFS_QMOPT_PQUOTA);
1706                if (error)
1707                        goto error_rele;
1708        }
1709
1710        mp->m_quotainfo->qi_uquotaip = uip;
1711        mp->m_quotainfo->qi_gquotaip = gip;
1712        mp->m_quotainfo->qi_pquotaip = pip;
1713
1714        return 0;
1715
1716error_rele:
1717        if (uip)
1718                IRELE(uip);
1719        if (gip)
1720                IRELE(gip);
1721        if (pip)
1722                IRELE(pip);
1723        return XFS_ERROR(error);
1724}
1725
1726STATIC void
1727xfs_qm_dqfree_one(
1728        struct xfs_dquot        *dqp)
1729{
1730        struct xfs_mount        *mp = dqp->q_mount;
1731        struct xfs_quotainfo    *qi = mp->m_quotainfo;
1732
1733        mutex_lock(&qi->qi_tree_lock);
1734        radix_tree_delete(xfs_dquot_tree(qi, dqp->q_core.d_flags),
1735                          be32_to_cpu(dqp->q_core.d_id));
1736
1737        qi->qi_dquots--;
1738        mutex_unlock(&qi->qi_tree_lock);
1739
1740        xfs_qm_dqdestroy(dqp);
1741}
1742
1743/*
1744 * Start a transaction and write the incore superblock changes to
1745 * disk. flags parameter indicates which fields have changed.
1746 */
1747int
1748xfs_qm_write_sb_changes(
1749        xfs_mount_t     *mp,
1750        __int64_t       flags)
1751{
1752        xfs_trans_t     *tp;
1753        int             error;
1754
1755        tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
1756        error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_sbchange, 0, 0);
1757        if (error) {
1758                xfs_trans_cancel(tp, 0);
1759                return error;
1760        }
1761
1762        xfs_mod_sb(tp, flags);
1763        error = xfs_trans_commit(tp, 0);
1764
1765        return error;
1766}
1767
1768
1769/* --------------- utility functions for vnodeops ---------------- */
1770
1771
1772/*
1773 * Given an inode, a uid, gid and prid make sure that we have
1774 * allocated relevant dquot(s) on disk, and that we won't exceed inode
1775 * quotas by creating this file.
1776 * This also attaches dquot(s) to the given inode after locking it,
1777 * and returns the dquots corresponding to the uid and/or gid.
1778 *
1779 * in   : inode (unlocked)
1780 * out  : udquot, gdquot with references taken and unlocked
1781 */
1782int
1783xfs_qm_vop_dqalloc(
1784        struct xfs_inode        *ip,
1785        xfs_dqid_t              uid,
1786        xfs_dqid_t              gid,
1787        prid_t                  prid,
1788        uint                    flags,
1789        struct xfs_dquot        **O_udqpp,
1790        struct xfs_dquot        **O_gdqpp,
1791        struct xfs_dquot        **O_pdqpp)
1792{
1793        struct xfs_mount        *mp = ip->i_mount;
1794        struct xfs_dquot        *uq = NULL;
1795        struct xfs_dquot        *gq = NULL;
1796        struct xfs_dquot        *pq = NULL;
1797        int                     error;
1798        uint                    lockflags;
1799
1800        if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
1801                return 0;
1802
1803        lockflags = XFS_ILOCK_EXCL;
1804        xfs_ilock(ip, lockflags);
1805
1806        if ((flags & XFS_QMOPT_INHERIT) && XFS_INHERIT_GID(ip))
1807                gid = ip->i_d.di_gid;
1808
1809        /*
1810         * Attach the dquot(s) to this inode, doing a dquot allocation
1811         * if necessary. The dquot(s) will not be locked.
1812         */
1813        if (XFS_NOT_DQATTACHED(mp, ip)) {
1814                error = xfs_qm_dqattach_locked(ip, XFS_QMOPT_DQALLOC);
1815                if (error) {
1816                        xfs_iunlock(ip, lockflags);
1817                        return error;
1818                }
1819        }
1820
1821        if ((flags & XFS_QMOPT_UQUOTA) && XFS_IS_UQUOTA_ON(mp)) {
1822                if (ip->i_d.di_uid != uid) {
1823                        /*
1824                         * What we need is the dquot that has this uid, and
1825                         * if we send the inode to dqget, the uid of the inode
1826                         * takes priority over what's sent in the uid argument.
1827                         * We must unlock inode here before calling dqget if
1828                         * we're not sending the inode, because otherwise
1829                         * we'll deadlock by doing trans_reserve while
1830                         * holding ilock.
1831                         */
1832                        xfs_iunlock(ip, lockflags);
1833                        error = xfs_qm_dqget(mp, NULL, uid,
1834                                                 XFS_DQ_USER,
1835                                                 XFS_QMOPT_DQALLOC |
1836                                                 XFS_QMOPT_DOWARN,
1837                                                 &uq);
1838                        if (error) {
1839                                ASSERT(error != ENOENT);
1840                                return error;
1841                        }
1842                        /*
1843                         * Get the ilock in the right order.
1844                         */
1845                        xfs_dqunlock(uq);
1846                        lockflags = XFS_ILOCK_SHARED;
1847                        xfs_ilock(ip, lockflags);
1848                } else {
1849                        /*
1850                         * Take an extra reference, because we'll return
1851                         * this to caller
1852                         */
1853                        ASSERT(ip->i_udquot);
1854                        uq = xfs_qm_dqhold(ip->i_udquot);
1855                }
1856        }
1857        if ((flags & XFS_QMOPT_GQUOTA) && XFS_IS_GQUOTA_ON(mp)) {
1858                if (ip->i_d.di_gid != gid) {
1859                        xfs_iunlock(ip, lockflags);
1860                        error = xfs_qm_dqget(mp, NULL, gid,
1861                                                 XFS_DQ_GROUP,
1862                                                 XFS_QMOPT_DQALLOC |
1863                                                 XFS_QMOPT_DOWARN,
1864                                                 &gq);
1865                        if (error) {
1866                                ASSERT(error != ENOENT);
1867                                goto error_rele;
1868                        }
1869                        xfs_dqunlock(gq);
1870                        lockflags = XFS_ILOCK_SHARED;
1871                        xfs_ilock(ip, lockflags);
1872                } else {
1873                        ASSERT(ip->i_gdquot);
1874                        gq = xfs_qm_dqhold(ip->i_gdquot);
1875                }
1876        }
1877        if ((flags & XFS_QMOPT_PQUOTA) && XFS_IS_PQUOTA_ON(mp)) {
1878                if (xfs_get_projid(ip) != prid) {
1879                        xfs_iunlock(ip, lockflags);
1880                        error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)prid,
1881                                                 XFS_DQ_PROJ,
1882                                                 XFS_QMOPT_DQALLOC |
1883                                                 XFS_QMOPT_DOWARN,
1884                                                 &pq);
1885                        if (error) {
1886                                ASSERT(error != ENOENT);
1887                                goto error_rele;
1888                        }
1889                        xfs_dqunlock(pq);
1890                        lockflags = XFS_ILOCK_SHARED;
1891                        xfs_ilock(ip, lockflags);
1892                } else {
1893                        ASSERT(ip->i_pdquot);
1894                        pq = xfs_qm_dqhold(ip->i_pdquot);
1895                }
1896        }
1897        if (uq)
1898                trace_xfs_dquot_dqalloc(ip);
1899
1900        xfs_iunlock(ip, lockflags);
1901        if (O_udqpp)
1902                *O_udqpp = uq;
1903        else if (uq)
1904                xfs_qm_dqrele(uq);
1905        if (O_gdqpp)
1906                *O_gdqpp = gq;
1907        else if (gq)
1908                xfs_qm_dqrele(gq);
1909        if (O_pdqpp)
1910                *O_pdqpp = pq;
1911        else if (pq)
1912                xfs_qm_dqrele(pq);
1913        return 0;
1914
1915error_rele:
1916        if (gq)
1917                xfs_qm_dqrele(gq);
1918        if (uq)
1919                xfs_qm_dqrele(uq);
1920        return error;
1921}
1922
1923/*
1924 * Actually transfer ownership, and do dquot modifications.
1925 * These were already reserved.
1926 */
1927xfs_dquot_t *
1928xfs_qm_vop_chown(
1929        xfs_trans_t     *tp,
1930        xfs_inode_t     *ip,
1931        xfs_dquot_t     **IO_olddq,
1932        xfs_dquot_t     *newdq)
1933{
1934        xfs_dquot_t     *prevdq;
1935        uint            bfield = XFS_IS_REALTIME_INODE(ip) ?
1936                                 XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT;
1937
1938
1939        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
1940        ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
1941
1942        /* old dquot */
1943        prevdq = *IO_olddq;
1944        ASSERT(prevdq);
1945        ASSERT(prevdq != newdq);
1946
1947        xfs_trans_mod_dquot(tp, prevdq, bfield, -(ip->i_d.di_nblocks));
1948        xfs_trans_mod_dquot(tp, prevdq, XFS_TRANS_DQ_ICOUNT, -1);
1949
1950        /* the sparkling new dquot */
1951        xfs_trans_mod_dquot(tp, newdq, bfield, ip->i_d.di_nblocks);
1952        xfs_trans_mod_dquot(tp, newdq, XFS_TRANS_DQ_ICOUNT, 1);
1953
1954        /*
1955         * Take an extra reference, because the inode is going to keep
1956         * this dquot pointer even after the trans_commit.
1957         */
1958        *IO_olddq = xfs_qm_dqhold(newdq);
1959
1960        return prevdq;
1961}
1962
1963/*
1964 * Quota reservations for setattr(AT_UID|AT_GID|AT_PROJID).
1965 */
1966int
1967xfs_qm_vop_chown_reserve(
1968        struct xfs_trans        *tp,
1969        struct xfs_inode        *ip,
1970        struct xfs_dquot        *udqp,
1971        struct xfs_dquot        *gdqp,
1972        struct xfs_dquot        *pdqp,
1973        uint                    flags)
1974{
1975        struct xfs_mount        *mp = ip->i_mount;
1976        uint                    delblks, blkflags, prjflags = 0;
1977        struct xfs_dquot        *udq_unres = NULL;
1978        struct xfs_dquot        *gdq_unres = NULL;
1979        struct xfs_dquot        *pdq_unres = NULL;
1980        struct xfs_dquot        *udq_delblks = NULL;
1981        struct xfs_dquot        *gdq_delblks = NULL;
1982        struct xfs_dquot        *pdq_delblks = NULL;
1983        int                     error;
1984
1985
1986        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
1987        ASSERT(XFS_IS_QUOTA_RUNNING(mp));
1988
1989        delblks = ip->i_delayed_blks;
1990        blkflags = XFS_IS_REALTIME_INODE(ip) ?
1991                        XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS;
1992
1993        if (XFS_IS_UQUOTA_ON(mp) && udqp &&
1994            ip->i_d.di_uid != be32_to_cpu(udqp->q_core.d_id)) {
1995                udq_delblks = udqp;
1996                /*
1997                 * If there are delayed allocation blocks, then we have to
1998                 * unreserve those from the old dquot, and add them to the
1999                 * new dquot.
2000                 */
2001                if (delblks) {
2002                        ASSERT(ip->i_udquot);
2003                        udq_unres = ip->i_udquot;
2004                }
2005        }
2006        if (XFS_IS_GQUOTA_ON(ip->i_mount) && gdqp &&
2007            ip->i_d.di_gid != be32_to_cpu(gdqp->q_core.d_id)) {
2008                gdq_delblks = gdqp;
2009                if (delblks) {
2010                        ASSERT(ip->i_gdquot);
2011                        gdq_unres = ip->i_gdquot;
2012                }
2013        }
2014
2015        if (XFS_IS_PQUOTA_ON(ip->i_mount) && pdqp &&
2016            xfs_get_projid(ip) != be32_to_cpu(pdqp->q_core.d_id)) {
2017                prjflags = XFS_QMOPT_ENOSPC;
2018                pdq_delblks = pdqp;
2019                if (delblks) {
2020                        ASSERT(ip->i_pdquot);
2021                        pdq_unres = ip->i_pdquot;
2022                }
2023        }
2024
2025        error = xfs_trans_reserve_quota_bydquots(tp, ip->i_mount,
2026                                udq_delblks, gdq_delblks, pdq_delblks,
2027                                ip->i_d.di_nblocks, 1,
2028                                flags | blkflags | prjflags);
2029        if (error)
2030                return error;
2031
2032        /*
2033         * Do the delayed blks reservations/unreservations now. Since, these
2034         * are done without the help of a transaction, if a reservation fails
2035         * its previous reservations won't be automatically undone by trans
2036         * code. So, we have to do it manually here.
2037         */
2038        if (delblks) {
2039                /*
2040                 * Do the reservations first. Unreservation can't fail.
2041                 */
2042                ASSERT(udq_delblks || gdq_delblks || pdq_delblks);
2043                ASSERT(udq_unres || gdq_unres || pdq_unres);
2044                error = xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount,
2045                            udq_delblks, gdq_delblks, pdq_delblks,
2046                            (xfs_qcnt_t)delblks, 0,
2047                            flags | blkflags | prjflags);
2048                if (error)
2049                        return error;
2050                xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount,
2051                                udq_unres, gdq_unres, pdq_unres,
2052                                -((xfs_qcnt_t)delblks), 0, blkflags);
2053        }
2054
2055        return (0);
2056}
2057
2058int
2059xfs_qm_vop_rename_dqattach(
2060        struct xfs_inode        **i_tab)
2061{
2062        struct xfs_mount        *mp = i_tab[0]->i_mount;
2063        int                     i;
2064
2065        if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
2066                return 0;
2067
2068        for (i = 0; (i < 4 && i_tab[i]); i++) {
2069                struct xfs_inode        *ip = i_tab[i];
2070                int                     error;
2071
2072                /*
2073                 * Watch out for duplicate entries in the table.
2074                 */
2075                if (i == 0 || ip != i_tab[i-1]) {
2076                        if (XFS_NOT_DQATTACHED(mp, ip)) {
2077                                error = xfs_qm_dqattach(ip, 0);
2078                                if (error)
2079                                        return error;
2080                        }
2081                }
2082        }
2083        return 0;
2084}
2085
2086void
2087xfs_qm_vop_create_dqattach(
2088        struct xfs_trans        *tp,
2089        struct xfs_inode        *ip,
2090        struct xfs_dquot        *udqp,
2091        struct xfs_dquot        *gdqp,
2092        struct xfs_dquot        *pdqp)
2093{
2094        struct xfs_mount        *mp = tp->t_mountp;
2095
2096        if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
2097                return;
2098
2099        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
2100        ASSERT(XFS_IS_QUOTA_RUNNING(mp));
2101
2102        if (udqp) {
2103                ASSERT(ip->i_udquot == NULL);
2104                ASSERT(XFS_IS_UQUOTA_ON(mp));
2105                ASSERT(ip->i_d.di_uid == be32_to_cpu(udqp->q_core.d_id));
2106
2107                ip->i_udquot = xfs_qm_dqhold(udqp);
2108                xfs_trans_mod_dquot(tp, udqp, XFS_TRANS_DQ_ICOUNT, 1);
2109        }
2110        if (gdqp) {
2111                ASSERT(ip->i_gdquot == NULL);
2112                ASSERT(XFS_IS_GQUOTA_ON(mp));
2113                ASSERT(ip->i_d.di_gid == be32_to_cpu(gdqp->q_core.d_id));
2114                ip->i_gdquot = xfs_qm_dqhold(gdqp);
2115                xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1);
2116        }
2117        if (pdqp) {
2118                ASSERT(ip->i_pdquot == NULL);
2119                ASSERT(XFS_IS_PQUOTA_ON(mp));
2120                ASSERT(xfs_get_projid(ip) == be32_to_cpu(pdqp->q_core.d_id));
2121
2122                ip->i_pdquot = xfs_qm_dqhold(pdqp);
2123                xfs_trans_mod_dquot(tp, pdqp, XFS_TRANS_DQ_ICOUNT, 1);
2124        }
2125}
2126
2127