linux/fs/xfs/xfs_trans.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
   3 * Copyright (C) 2010 Red Hat, Inc.
   4 * All Rights Reserved.
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public License as
   8 * published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it would be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License
  16 * along with this program; if not, write the Free Software Foundation,
  17 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  18 */
  19#include "xfs.h"
  20#include "xfs_fs.h"
  21#include "xfs_format.h"
  22#include "xfs_log.h"
  23#include "xfs_trans.h"
  24#include "xfs_sb.h"
  25#include "xfs_ag.h"
  26#include "xfs_mount.h"
  27#include "xfs_error.h"
  28#include "xfs_da_btree.h"
  29#include "xfs_bmap_btree.h"
  30#include "xfs_alloc_btree.h"
  31#include "xfs_ialloc_btree.h"
  32#include "xfs_dinode.h"
  33#include "xfs_inode.h"
  34#include "xfs_btree.h"
  35#include "xfs_ialloc.h"
  36#include "xfs_alloc.h"
  37#include "xfs_extent_busy.h"
  38#include "xfs_bmap.h"
  39#include "xfs_quota.h"
  40#include "xfs_qm.h"
  41#include "xfs_trans_priv.h"
  42#include "xfs_trans_space.h"
  43#include "xfs_inode_item.h"
  44#include "xfs_log_priv.h"
  45#include "xfs_buf_item.h"
  46#include "xfs_trace.h"
  47
  48kmem_zone_t     *xfs_trans_zone;
  49kmem_zone_t     *xfs_log_item_desc_zone;
  50
  51/*
  52 * Initialize the precomputed transaction reservation values
  53 * in the mount structure.
  54 */
  55void
  56xfs_trans_init(
  57        struct xfs_mount        *mp)
  58{
  59        xfs_trans_resv_calc(mp, M_RES(mp));
  60}
  61
  62/*
  63 * This routine is called to allocate a transaction structure.
  64 * The type parameter indicates the type of the transaction.  These
  65 * are enumerated in xfs_trans.h.
  66 *
  67 * Dynamically allocate the transaction structure from the transaction
  68 * zone, initialize it, and return it to the caller.
  69 */
  70xfs_trans_t *
  71xfs_trans_alloc(
  72        xfs_mount_t     *mp,
  73        uint            type)
  74{
  75        xfs_trans_t     *tp;
  76
  77        sb_start_intwrite(mp->m_super);
  78        tp = _xfs_trans_alloc(mp, type, KM_SLEEP);
  79        tp->t_flags |= XFS_TRANS_FREEZE_PROT;
  80        return tp;
  81}
  82
  83xfs_trans_t *
  84_xfs_trans_alloc(
  85        xfs_mount_t     *mp,
  86        uint            type,
  87        xfs_km_flags_t  memflags)
  88{
  89        xfs_trans_t     *tp;
  90
  91        WARN_ON(mp->m_super->s_writers.frozen == SB_FREEZE_COMPLETE);
  92        atomic_inc(&mp->m_active_trans);
  93
  94        tp = kmem_zone_zalloc(xfs_trans_zone, memflags);
  95        tp->t_magic = XFS_TRANS_HEADER_MAGIC;
  96        tp->t_type = type;
  97        tp->t_mountp = mp;
  98        INIT_LIST_HEAD(&tp->t_items);
  99        INIT_LIST_HEAD(&tp->t_busy);
 100        return tp;
 101}
 102
 103/*
 104 * Free the transaction structure.  If there is more clean up
 105 * to do when the structure is freed, add it here.
 106 */
 107STATIC void
 108xfs_trans_free(
 109        struct xfs_trans        *tp)
 110{
 111        xfs_extent_busy_sort(&tp->t_busy);
 112        xfs_extent_busy_clear(tp->t_mountp, &tp->t_busy, false);
 113
 114        atomic_dec(&tp->t_mountp->m_active_trans);
 115        if (tp->t_flags & XFS_TRANS_FREEZE_PROT)
 116                sb_end_intwrite(tp->t_mountp->m_super);
 117        xfs_trans_free_dqinfo(tp);
 118        kmem_zone_free(xfs_trans_zone, tp);
 119}
 120
 121/*
 122 * This is called to create a new transaction which will share the
 123 * permanent log reservation of the given transaction.  The remaining
 124 * unused block and rt extent reservations are also inherited.  This
 125 * implies that the original transaction is no longer allowed to allocate
 126 * blocks.  Locks and log items, however, are no inherited.  They must
 127 * be added to the new transaction explicitly.
 128 */
 129xfs_trans_t *
 130xfs_trans_dup(
 131        xfs_trans_t     *tp)
 132{
 133        xfs_trans_t     *ntp;
 134
 135        ntp = kmem_zone_zalloc(xfs_trans_zone, KM_SLEEP);
 136
 137        /*
 138         * Initialize the new transaction structure.
 139         */
 140        ntp->t_magic = XFS_TRANS_HEADER_MAGIC;
 141        ntp->t_type = tp->t_type;
 142        ntp->t_mountp = tp->t_mountp;
 143        INIT_LIST_HEAD(&ntp->t_items);
 144        INIT_LIST_HEAD(&ntp->t_busy);
 145
 146        ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
 147        ASSERT(tp->t_ticket != NULL);
 148
 149        ntp->t_flags = XFS_TRANS_PERM_LOG_RES |
 150                       (tp->t_flags & XFS_TRANS_RESERVE) |
 151                       (tp->t_flags & XFS_TRANS_FREEZE_PROT);
 152        /* We gave our writer reference to the new transaction */
 153        tp->t_flags &= ~XFS_TRANS_FREEZE_PROT;
 154        ntp->t_ticket = xfs_log_ticket_get(tp->t_ticket);
 155        ntp->t_blk_res = tp->t_blk_res - tp->t_blk_res_used;
 156        tp->t_blk_res = tp->t_blk_res_used;
 157        ntp->t_rtx_res = tp->t_rtx_res - tp->t_rtx_res_used;
 158        tp->t_rtx_res = tp->t_rtx_res_used;
 159        ntp->t_pflags = tp->t_pflags;
 160
 161        xfs_trans_dup_dqinfo(tp, ntp);
 162
 163        atomic_inc(&tp->t_mountp->m_active_trans);
 164        return ntp;
 165}
 166
 167/*
 168 * This is called to reserve free disk blocks and log space for the
 169 * given transaction.  This must be done before allocating any resources
 170 * within the transaction.
 171 *
 172 * This will return ENOSPC if there are not enough blocks available.
 173 * It will sleep waiting for available log space.
 174 * The only valid value for the flags parameter is XFS_RES_LOG_PERM, which
 175 * is used by long running transactions.  If any one of the reservations
 176 * fails then they will all be backed out.
 177 *
 178 * This does not do quota reservations. That typically is done by the
 179 * caller afterwards.
 180 */
 181int
 182xfs_trans_reserve(
 183        struct xfs_trans        *tp,
 184        struct xfs_trans_res    *resp,
 185        uint                    blocks,
 186        uint                    rtextents)
 187{
 188        int             error = 0;
 189        int             rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0;
 190
 191        /* Mark this thread as being in a transaction */
 192        current_set_flags_nested(&tp->t_pflags, PF_FSTRANS);
 193
 194        /*
 195         * Attempt to reserve the needed disk blocks by decrementing
 196         * the number needed from the number available.  This will
 197         * fail if the count would go below zero.
 198         */
 199        if (blocks > 0) {
 200                error = xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS,
 201                                          -((int64_t)blocks), rsvd);
 202                if (error != 0) {
 203                        current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS);
 204                        return (XFS_ERROR(ENOSPC));
 205                }
 206                tp->t_blk_res += blocks;
 207        }
 208
 209        /*
 210         * Reserve the log space needed for this transaction.
 211         */
 212        if (resp->tr_logres > 0) {
 213                bool    permanent = false;
 214
 215                ASSERT(tp->t_log_res == 0 ||
 216                       tp->t_log_res == resp->tr_logres);
 217                ASSERT(tp->t_log_count == 0 ||
 218                       tp->t_log_count == resp->tr_logcount);
 219
 220                if (resp->tr_logflags & XFS_TRANS_PERM_LOG_RES) {
 221                        tp->t_flags |= XFS_TRANS_PERM_LOG_RES;
 222                        permanent = true;
 223                } else {
 224                        ASSERT(tp->t_ticket == NULL);
 225                        ASSERT(!(tp->t_flags & XFS_TRANS_PERM_LOG_RES));
 226                }
 227
 228                if (tp->t_ticket != NULL) {
 229                        ASSERT(resp->tr_logflags & XFS_TRANS_PERM_LOG_RES);
 230                        error = xfs_log_regrant(tp->t_mountp, tp->t_ticket);
 231                } else {
 232                        error = xfs_log_reserve(tp->t_mountp,
 233                                                resp->tr_logres,
 234                                                resp->tr_logcount,
 235                                                &tp->t_ticket, XFS_TRANSACTION,
 236                                                permanent, tp->t_type);
 237                }
 238
 239                if (error)
 240                        goto undo_blocks;
 241
 242                tp->t_log_res = resp->tr_logres;
 243                tp->t_log_count = resp->tr_logcount;
 244        }
 245
 246        /*
 247         * Attempt to reserve the needed realtime extents by decrementing
 248         * the number needed from the number available.  This will
 249         * fail if the count would go below zero.
 250         */
 251        if (rtextents > 0) {
 252                error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FREXTENTS,
 253                                          -((int64_t)rtextents), rsvd);
 254                if (error) {
 255                        error = XFS_ERROR(ENOSPC);
 256                        goto undo_log;
 257                }
 258                tp->t_rtx_res += rtextents;
 259        }
 260
 261        return 0;
 262
 263        /*
 264         * Error cases jump to one of these labels to undo any
 265         * reservations which have already been performed.
 266         */
 267undo_log:
 268        if (resp->tr_logres > 0) {
 269                int             log_flags;
 270
 271                if (resp->tr_logflags & XFS_TRANS_PERM_LOG_RES) {
 272                        log_flags = XFS_LOG_REL_PERM_RESERV;
 273                } else {
 274                        log_flags = 0;
 275                }
 276                xfs_log_done(tp->t_mountp, tp->t_ticket, NULL, log_flags);
 277                tp->t_ticket = NULL;
 278                tp->t_log_res = 0;
 279                tp->t_flags &= ~XFS_TRANS_PERM_LOG_RES;
 280        }
 281
 282undo_blocks:
 283        if (blocks > 0) {
 284                xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS,
 285                                         (int64_t)blocks, rsvd);
 286                tp->t_blk_res = 0;
 287        }
 288
 289        current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS);
 290
 291        return error;
 292}
 293
 294/*
 295 * Record the indicated change to the given field for application
 296 * to the file system's superblock when the transaction commits.
 297 * For now, just store the change in the transaction structure.
 298 *
 299 * Mark the transaction structure to indicate that the superblock
 300 * needs to be updated before committing.
 301 *
 302 * Because we may not be keeping track of allocated/free inodes and
 303 * used filesystem blocks in the superblock, we do not mark the
 304 * superblock dirty in this transaction if we modify these fields.
 305 * We still need to update the transaction deltas so that they get
 306 * applied to the incore superblock, but we don't want them to
 307 * cause the superblock to get locked and logged if these are the
 308 * only fields in the superblock that the transaction modifies.
 309 */
 310void
 311xfs_trans_mod_sb(
 312        xfs_trans_t     *tp,
 313        uint            field,
 314        int64_t         delta)
 315{
 316        uint32_t        flags = (XFS_TRANS_DIRTY|XFS_TRANS_SB_DIRTY);
 317        xfs_mount_t     *mp = tp->t_mountp;
 318
 319        switch (field) {
 320        case XFS_TRANS_SB_ICOUNT:
 321                tp->t_icount_delta += delta;
 322                if (xfs_sb_version_haslazysbcount(&mp->m_sb))
 323                        flags &= ~XFS_TRANS_SB_DIRTY;
 324                break;
 325        case XFS_TRANS_SB_IFREE:
 326                tp->t_ifree_delta += delta;
 327                if (xfs_sb_version_haslazysbcount(&mp->m_sb))
 328                        flags &= ~XFS_TRANS_SB_DIRTY;
 329                break;
 330        case XFS_TRANS_SB_FDBLOCKS:
 331                /*
 332                 * Track the number of blocks allocated in the
 333                 * transaction.  Make sure it does not exceed the
 334                 * number reserved.
 335                 */
 336                if (delta < 0) {
 337                        tp->t_blk_res_used += (uint)-delta;
 338                        ASSERT(tp->t_blk_res_used <= tp->t_blk_res);
 339                }
 340                tp->t_fdblocks_delta += delta;
 341                if (xfs_sb_version_haslazysbcount(&mp->m_sb))
 342                        flags &= ~XFS_TRANS_SB_DIRTY;
 343                break;
 344        case XFS_TRANS_SB_RES_FDBLOCKS:
 345                /*
 346                 * The allocation has already been applied to the
 347                 * in-core superblock's counter.  This should only
 348                 * be applied to the on-disk superblock.
 349                 */
 350                ASSERT(delta < 0);
 351                tp->t_res_fdblocks_delta += delta;
 352                if (xfs_sb_version_haslazysbcount(&mp->m_sb))
 353                        flags &= ~XFS_TRANS_SB_DIRTY;
 354                break;
 355        case XFS_TRANS_SB_FREXTENTS:
 356                /*
 357                 * Track the number of blocks allocated in the
 358                 * transaction.  Make sure it does not exceed the
 359                 * number reserved.
 360                 */
 361                if (delta < 0) {
 362                        tp->t_rtx_res_used += (uint)-delta;
 363                        ASSERT(tp->t_rtx_res_used <= tp->t_rtx_res);
 364                }
 365                tp->t_frextents_delta += delta;
 366                break;
 367        case XFS_TRANS_SB_RES_FREXTENTS:
 368                /*
 369                 * The allocation has already been applied to the
 370                 * in-core superblock's counter.  This should only
 371                 * be applied to the on-disk superblock.
 372                 */
 373                ASSERT(delta < 0);
 374                tp->t_res_frextents_delta += delta;
 375                break;
 376        case XFS_TRANS_SB_DBLOCKS:
 377                ASSERT(delta > 0);
 378                tp->t_dblocks_delta += delta;
 379                break;
 380        case XFS_TRANS_SB_AGCOUNT:
 381                ASSERT(delta > 0);
 382                tp->t_agcount_delta += delta;
 383                break;
 384        case XFS_TRANS_SB_IMAXPCT:
 385                tp->t_imaxpct_delta += delta;
 386                break;
 387        case XFS_TRANS_SB_REXTSIZE:
 388                tp->t_rextsize_delta += delta;
 389                break;
 390        case XFS_TRANS_SB_RBMBLOCKS:
 391                tp->t_rbmblocks_delta += delta;
 392                break;
 393        case XFS_TRANS_SB_RBLOCKS:
 394                tp->t_rblocks_delta += delta;
 395                break;
 396        case XFS_TRANS_SB_REXTENTS:
 397                tp->t_rextents_delta += delta;
 398                break;
 399        case XFS_TRANS_SB_REXTSLOG:
 400                tp->t_rextslog_delta += delta;
 401                break;
 402        default:
 403                ASSERT(0);
 404                return;
 405        }
 406
 407        tp->t_flags |= flags;
 408}
 409
 410/*
 411 * xfs_trans_apply_sb_deltas() is called from the commit code
 412 * to bring the superblock buffer into the current transaction
 413 * and modify it as requested by earlier calls to xfs_trans_mod_sb().
 414 *
 415 * For now we just look at each field allowed to change and change
 416 * it if necessary.
 417 */
 418STATIC void
 419xfs_trans_apply_sb_deltas(
 420        xfs_trans_t     *tp)
 421{
 422        xfs_dsb_t       *sbp;
 423        xfs_buf_t       *bp;
 424        int             whole = 0;
 425
 426        bp = xfs_trans_getsb(tp, tp->t_mountp, 0);
 427        sbp = XFS_BUF_TO_SBP(bp);
 428
 429        /*
 430         * Check that superblock mods match the mods made to AGF counters.
 431         */
 432        ASSERT((tp->t_fdblocks_delta + tp->t_res_fdblocks_delta) ==
 433               (tp->t_ag_freeblks_delta + tp->t_ag_flist_delta +
 434                tp->t_ag_btree_delta));
 435
 436        /*
 437         * Only update the superblock counters if we are logging them
 438         */
 439        if (!xfs_sb_version_haslazysbcount(&(tp->t_mountp->m_sb))) {
 440                if (tp->t_icount_delta)
 441                        be64_add_cpu(&sbp->sb_icount, tp->t_icount_delta);
 442                if (tp->t_ifree_delta)
 443                        be64_add_cpu(&sbp->sb_ifree, tp->t_ifree_delta);
 444                if (tp->t_fdblocks_delta)
 445                        be64_add_cpu(&sbp->sb_fdblocks, tp->t_fdblocks_delta);
 446                if (tp->t_res_fdblocks_delta)
 447                        be64_add_cpu(&sbp->sb_fdblocks, tp->t_res_fdblocks_delta);
 448        }
 449
 450        if (tp->t_frextents_delta)
 451                be64_add_cpu(&sbp->sb_frextents, tp->t_frextents_delta);
 452        if (tp->t_res_frextents_delta)
 453                be64_add_cpu(&sbp->sb_frextents, tp->t_res_frextents_delta);
 454
 455        if (tp->t_dblocks_delta) {
 456                be64_add_cpu(&sbp->sb_dblocks, tp->t_dblocks_delta);
 457                whole = 1;
 458        }
 459        if (tp->t_agcount_delta) {
 460                be32_add_cpu(&sbp->sb_agcount, tp->t_agcount_delta);
 461                whole = 1;
 462        }
 463        if (tp->t_imaxpct_delta) {
 464                sbp->sb_imax_pct += tp->t_imaxpct_delta;
 465                whole = 1;
 466        }
 467        if (tp->t_rextsize_delta) {
 468                be32_add_cpu(&sbp->sb_rextsize, tp->t_rextsize_delta);
 469                whole = 1;
 470        }
 471        if (tp->t_rbmblocks_delta) {
 472                be32_add_cpu(&sbp->sb_rbmblocks, tp->t_rbmblocks_delta);
 473                whole = 1;
 474        }
 475        if (tp->t_rblocks_delta) {
 476                be64_add_cpu(&sbp->sb_rblocks, tp->t_rblocks_delta);
 477                whole = 1;
 478        }
 479        if (tp->t_rextents_delta) {
 480                be64_add_cpu(&sbp->sb_rextents, tp->t_rextents_delta);
 481                whole = 1;
 482        }
 483        if (tp->t_rextslog_delta) {
 484                sbp->sb_rextslog += tp->t_rextslog_delta;
 485                whole = 1;
 486        }
 487
 488        if (whole)
 489                /*
 490                 * Log the whole thing, the fields are noncontiguous.
 491                 */
 492                xfs_trans_log_buf(tp, bp, 0, sizeof(xfs_dsb_t) - 1);
 493        else
 494                /*
 495                 * Since all the modifiable fields are contiguous, we
 496                 * can get away with this.
 497                 */
 498                xfs_trans_log_buf(tp, bp, offsetof(xfs_dsb_t, sb_icount),
 499                                  offsetof(xfs_dsb_t, sb_frextents) +
 500                                  sizeof(sbp->sb_frextents) - 1);
 501}
 502
 503/*
 504 * xfs_trans_unreserve_and_mod_sb() is called to release unused reservations
 505 * and apply superblock counter changes to the in-core superblock.  The
 506 * t_res_fdblocks_delta and t_res_frextents_delta fields are explicitly NOT
 507 * applied to the in-core superblock.  The idea is that that has already been
 508 * done.
 509 *
 510 * This is done efficiently with a single call to xfs_mod_incore_sb_batch().
 511 * However, we have to ensure that we only modify each superblock field only
 512 * once because the application of the delta values may not be atomic. That can
 513 * lead to ENOSPC races occurring if we have two separate modifcations of the
 514 * free space counter to put back the entire reservation and then take away
 515 * what we used.
 516 *
 517 * If we are not logging superblock counters, then the inode allocated/free and
 518 * used block counts are not updated in the on disk superblock. In this case,
 519 * XFS_TRANS_SB_DIRTY will not be set when the transaction is updated but we
 520 * still need to update the incore superblock with the changes.
 521 */
 522void
 523xfs_trans_unreserve_and_mod_sb(
 524        xfs_trans_t     *tp)
 525{
 526        xfs_mod_sb_t    msb[9]; /* If you add cases, add entries */
 527        xfs_mod_sb_t    *msbp;
 528        xfs_mount_t     *mp = tp->t_mountp;
 529        /* REFERENCED */
 530        int             error;
 531        int             rsvd;
 532        int64_t         blkdelta = 0;
 533        int64_t         rtxdelta = 0;
 534        int64_t         idelta = 0;
 535        int64_t         ifreedelta = 0;
 536
 537        msbp = msb;
 538        rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0;
 539
 540        /* calculate deltas */
 541        if (tp->t_blk_res > 0)
 542                blkdelta = tp->t_blk_res;
 543        if ((tp->t_fdblocks_delta != 0) &&
 544            (xfs_sb_version_haslazysbcount(&mp->m_sb) ||
 545             (tp->t_flags & XFS_TRANS_SB_DIRTY)))
 546                blkdelta += tp->t_fdblocks_delta;
 547
 548        if (tp->t_rtx_res > 0)
 549                rtxdelta = tp->t_rtx_res;
 550        if ((tp->t_frextents_delta != 0) &&
 551            (tp->t_flags & XFS_TRANS_SB_DIRTY))
 552                rtxdelta += tp->t_frextents_delta;
 553
 554        if (xfs_sb_version_haslazysbcount(&mp->m_sb) ||
 555             (tp->t_flags & XFS_TRANS_SB_DIRTY)) {
 556                idelta = tp->t_icount_delta;
 557                ifreedelta = tp->t_ifree_delta;
 558        }
 559
 560        /* apply the per-cpu counters */
 561        if (blkdelta) {
 562                error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS,
 563                                                 blkdelta, rsvd);
 564                if (error)
 565                        goto out;
 566        }
 567
 568        if (idelta) {
 569                error = xfs_icsb_modify_counters(mp, XFS_SBS_ICOUNT,
 570                                                 idelta, rsvd);
 571                if (error)
 572                        goto out_undo_fdblocks;
 573        }
 574
 575        if (ifreedelta) {
 576                error = xfs_icsb_modify_counters(mp, XFS_SBS_IFREE,
 577                                                 ifreedelta, rsvd);
 578                if (error)
 579                        goto out_undo_icount;
 580        }
 581
 582        /* apply remaining deltas */
 583        if (rtxdelta != 0) {
 584                msbp->msb_field = XFS_SBS_FREXTENTS;
 585                msbp->msb_delta = rtxdelta;
 586                msbp++;
 587        }
 588
 589        if (tp->t_flags & XFS_TRANS_SB_DIRTY) {
 590                if (tp->t_dblocks_delta != 0) {
 591                        msbp->msb_field = XFS_SBS_DBLOCKS;
 592                        msbp->msb_delta = tp->t_dblocks_delta;
 593                        msbp++;
 594                }
 595                if (tp->t_agcount_delta != 0) {
 596                        msbp->msb_field = XFS_SBS_AGCOUNT;
 597                        msbp->msb_delta = tp->t_agcount_delta;
 598                        msbp++;
 599                }
 600                if (tp->t_imaxpct_delta != 0) {
 601                        msbp->msb_field = XFS_SBS_IMAX_PCT;
 602                        msbp->msb_delta = tp->t_imaxpct_delta;
 603                        msbp++;
 604                }
 605                if (tp->t_rextsize_delta != 0) {
 606                        msbp->msb_field = XFS_SBS_REXTSIZE;
 607                        msbp->msb_delta = tp->t_rextsize_delta;
 608                        msbp++;
 609                }
 610                if (tp->t_rbmblocks_delta != 0) {
 611                        msbp->msb_field = XFS_SBS_RBMBLOCKS;
 612                        msbp->msb_delta = tp->t_rbmblocks_delta;
 613                        msbp++;
 614                }
 615                if (tp->t_rblocks_delta != 0) {
 616                        msbp->msb_field = XFS_SBS_RBLOCKS;
 617                        msbp->msb_delta = tp->t_rblocks_delta;
 618                        msbp++;
 619                }
 620                if (tp->t_rextents_delta != 0) {
 621                        msbp->msb_field = XFS_SBS_REXTENTS;
 622                        msbp->msb_delta = tp->t_rextents_delta;
 623                        msbp++;
 624                }
 625                if (tp->t_rextslog_delta != 0) {
 626                        msbp->msb_field = XFS_SBS_REXTSLOG;
 627                        msbp->msb_delta = tp->t_rextslog_delta;
 628                        msbp++;
 629                }
 630        }
 631
 632        /*
 633         * If we need to change anything, do it.
 634         */
 635        if (msbp > msb) {
 636                error = xfs_mod_incore_sb_batch(tp->t_mountp, msb,
 637                        (uint)(msbp - msb), rsvd);
 638                if (error)
 639                        goto out_undo_ifreecount;
 640        }
 641
 642        return;
 643
 644out_undo_ifreecount:
 645        if (ifreedelta)
 646                xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, -ifreedelta, rsvd);
 647out_undo_icount:
 648        if (idelta)
 649                xfs_icsb_modify_counters(mp, XFS_SBS_ICOUNT, -idelta, rsvd);
 650out_undo_fdblocks:
 651        if (blkdelta)
 652                xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd);
 653out:
 654        ASSERT(error == 0);
 655        return;
 656}
 657
 658/*
 659 * Add the given log item to the transaction's list of log items.
 660 *
 661 * The log item will now point to its new descriptor with its li_desc field.
 662 */
 663void
 664xfs_trans_add_item(
 665        struct xfs_trans        *tp,
 666        struct xfs_log_item     *lip)
 667{
 668        struct xfs_log_item_desc *lidp;
 669
 670        ASSERT(lip->li_mountp == tp->t_mountp);
 671        ASSERT(lip->li_ailp == tp->t_mountp->m_ail);
 672
 673        lidp = kmem_zone_zalloc(xfs_log_item_desc_zone, KM_SLEEP | KM_NOFS);
 674
 675        lidp->lid_item = lip;
 676        lidp->lid_flags = 0;
 677        list_add_tail(&lidp->lid_trans, &tp->t_items);
 678
 679        lip->li_desc = lidp;
 680}
 681
 682STATIC void
 683xfs_trans_free_item_desc(
 684        struct xfs_log_item_desc *lidp)
 685{
 686        list_del_init(&lidp->lid_trans);
 687        kmem_zone_free(xfs_log_item_desc_zone, lidp);
 688}
 689
 690/*
 691 * Unlink and free the given descriptor.
 692 */
 693void
 694xfs_trans_del_item(
 695        struct xfs_log_item     *lip)
 696{
 697        xfs_trans_free_item_desc(lip->li_desc);
 698        lip->li_desc = NULL;
 699}
 700
 701/*
 702 * Unlock all of the items of a transaction and free all the descriptors
 703 * of that transaction.
 704 */
 705void
 706xfs_trans_free_items(
 707        struct xfs_trans        *tp,
 708        xfs_lsn_t               commit_lsn,
 709        int                     flags)
 710{
 711        struct xfs_log_item_desc *lidp, *next;
 712
 713        list_for_each_entry_safe(lidp, next, &tp->t_items, lid_trans) {
 714                struct xfs_log_item     *lip = lidp->lid_item;
 715
 716                lip->li_desc = NULL;
 717
 718                if (commit_lsn != NULLCOMMITLSN)
 719                        lip->li_ops->iop_committing(lip, commit_lsn);
 720                if (flags & XFS_TRANS_ABORT)
 721                        lip->li_flags |= XFS_LI_ABORTED;
 722                lip->li_ops->iop_unlock(lip);
 723
 724                xfs_trans_free_item_desc(lidp);
 725        }
 726}
 727
 728static inline void
 729xfs_log_item_batch_insert(
 730        struct xfs_ail          *ailp,
 731        struct xfs_ail_cursor   *cur,
 732        struct xfs_log_item     **log_items,
 733        int                     nr_items,
 734        xfs_lsn_t               commit_lsn)
 735{
 736        int     i;
 737
 738        spin_lock(&ailp->xa_lock);
 739        /* xfs_trans_ail_update_bulk drops ailp->xa_lock */
 740        xfs_trans_ail_update_bulk(ailp, cur, log_items, nr_items, commit_lsn);
 741
 742        for (i = 0; i < nr_items; i++) {
 743                struct xfs_log_item *lip = log_items[i];
 744
 745                lip->li_ops->iop_unpin(lip, 0);
 746        }
 747}
 748
 749/*
 750 * Bulk operation version of xfs_trans_committed that takes a log vector of
 751 * items to insert into the AIL. This uses bulk AIL insertion techniques to
 752 * minimise lock traffic.
 753 *
 754 * If we are called with the aborted flag set, it is because a log write during
 755 * a CIL checkpoint commit has failed. In this case, all the items in the
 756 * checkpoint have already gone through iop_commited and iop_unlock, which
 757 * means that checkpoint commit abort handling is treated exactly the same
 758 * as an iclog write error even though we haven't started any IO yet. Hence in
 759 * this case all we need to do is iop_committed processing, followed by an
 760 * iop_unpin(aborted) call.
 761 *
 762 * The AIL cursor is used to optimise the insert process. If commit_lsn is not
 763 * at the end of the AIL, the insert cursor avoids the need to walk
 764 * the AIL to find the insertion point on every xfs_log_item_batch_insert()
 765 * call. This saves a lot of needless list walking and is a net win, even
 766 * though it slightly increases that amount of AIL lock traffic to set it up
 767 * and tear it down.
 768 */
 769void
 770xfs_trans_committed_bulk(
 771        struct xfs_ail          *ailp,
 772        struct xfs_log_vec      *log_vector,
 773        xfs_lsn_t               commit_lsn,
 774        int                     aborted)
 775{
 776#define LOG_ITEM_BATCH_SIZE     32
 777        struct xfs_log_item     *log_items[LOG_ITEM_BATCH_SIZE];
 778        struct xfs_log_vec      *lv;
 779        struct xfs_ail_cursor   cur;
 780        int                     i = 0;
 781
 782        spin_lock(&ailp->xa_lock);
 783        xfs_trans_ail_cursor_last(ailp, &cur, commit_lsn);
 784        spin_unlock(&ailp->xa_lock);
 785
 786        /* unpin all the log items */
 787        for (lv = log_vector; lv; lv = lv->lv_next ) {
 788                struct xfs_log_item     *lip = lv->lv_item;
 789                xfs_lsn_t               item_lsn;
 790
 791                if (aborted)
 792                        lip->li_flags |= XFS_LI_ABORTED;
 793                item_lsn = lip->li_ops->iop_committed(lip, commit_lsn);
 794
 795                /* item_lsn of -1 means the item needs no further processing */
 796                if (XFS_LSN_CMP(item_lsn, (xfs_lsn_t)-1) == 0)
 797                        continue;
 798
 799                /*
 800                 * if we are aborting the operation, no point in inserting the
 801                 * object into the AIL as we are in a shutdown situation.
 802                 */
 803                if (aborted) {
 804                        ASSERT(XFS_FORCED_SHUTDOWN(ailp->xa_mount));
 805                        lip->li_ops->iop_unpin(lip, 1);
 806                        continue;
 807                }
 808
 809                if (item_lsn != commit_lsn) {
 810
 811                        /*
 812                         * Not a bulk update option due to unusual item_lsn.
 813                         * Push into AIL immediately, rechecking the lsn once
 814                         * we have the ail lock. Then unpin the item. This does
 815                         * not affect the AIL cursor the bulk insert path is
 816                         * using.
 817                         */
 818                        spin_lock(&ailp->xa_lock);
 819                        if (XFS_LSN_CMP(item_lsn, lip->li_lsn) > 0)
 820                                xfs_trans_ail_update(ailp, lip, item_lsn);
 821                        else
 822                                spin_unlock(&ailp->xa_lock);
 823                        lip->li_ops->iop_unpin(lip, 0);
 824                        continue;
 825                }
 826
 827                /* Item is a candidate for bulk AIL insert.  */
 828                log_items[i++] = lv->lv_item;
 829                if (i >= LOG_ITEM_BATCH_SIZE) {
 830                        xfs_log_item_batch_insert(ailp, &cur, log_items,
 831                                        LOG_ITEM_BATCH_SIZE, commit_lsn);
 832                        i = 0;
 833                }
 834        }
 835
 836        /* make sure we insert the remainder! */
 837        if (i)
 838                xfs_log_item_batch_insert(ailp, &cur, log_items, i, commit_lsn);
 839
 840        spin_lock(&ailp->xa_lock);
 841        xfs_trans_ail_cursor_done(ailp, &cur);
 842        spin_unlock(&ailp->xa_lock);
 843}
 844
 845/*
 846 * Commit the given transaction to the log.
 847 *
 848 * XFS disk error handling mechanism is not based on a typical
 849 * transaction abort mechanism. Logically after the filesystem
 850 * gets marked 'SHUTDOWN', we can't let any new transactions
 851 * be durable - ie. committed to disk - because some metadata might
 852 * be inconsistent. In such cases, this returns an error, and the
 853 * caller may assume that all locked objects joined to the transaction
 854 * have already been unlocked as if the commit had succeeded.
 855 * Do not reference the transaction structure after this call.
 856 */
 857int
 858xfs_trans_commit(
 859        struct xfs_trans        *tp,
 860        uint                    flags)
 861{
 862        struct xfs_mount        *mp = tp->t_mountp;
 863        xfs_lsn_t               commit_lsn = -1;
 864        int                     error = 0;
 865        int                     log_flags = 0;
 866        int                     sync = tp->t_flags & XFS_TRANS_SYNC;
 867
 868        /*
 869         * Determine whether this commit is releasing a permanent
 870         * log reservation or not.
 871         */
 872        if (flags & XFS_TRANS_RELEASE_LOG_RES) {
 873                ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
 874                log_flags = XFS_LOG_REL_PERM_RESERV;
 875        }
 876
 877        /*
 878         * If there is nothing to be logged by the transaction,
 879         * then unlock all of the items associated with the
 880         * transaction and free the transaction structure.
 881         * Also make sure to return any reserved blocks to
 882         * the free pool.
 883         */
 884        if (!(tp->t_flags & XFS_TRANS_DIRTY))
 885                goto out_unreserve;
 886
 887        if (XFS_FORCED_SHUTDOWN(mp)) {
 888                error = XFS_ERROR(EIO);
 889                goto out_unreserve;
 890        }
 891
 892        ASSERT(tp->t_ticket != NULL);
 893
 894        /*
 895         * If we need to update the superblock, then do it now.
 896         */
 897        if (tp->t_flags & XFS_TRANS_SB_DIRTY)
 898                xfs_trans_apply_sb_deltas(tp);
 899        xfs_trans_apply_dquot_deltas(tp);
 900
 901        error = xfs_log_commit_cil(mp, tp, &commit_lsn, flags);
 902        if (error == ENOMEM) {
 903                xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR);
 904                error = XFS_ERROR(EIO);
 905                goto out_unreserve;
 906        }
 907
 908        current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS);
 909        xfs_trans_free(tp);
 910
 911        /*
 912         * If the transaction needs to be synchronous, then force the
 913         * log out now and wait for it.
 914         */
 915        if (sync) {
 916                if (!error) {
 917                        error = _xfs_log_force_lsn(mp, commit_lsn,
 918                                      XFS_LOG_SYNC, NULL);
 919                }
 920                XFS_STATS_INC(xs_trans_sync);
 921        } else {
 922                XFS_STATS_INC(xs_trans_async);
 923        }
 924
 925        return error;
 926
 927out_unreserve:
 928        xfs_trans_unreserve_and_mod_sb(tp);
 929
 930        /*
 931         * It is indeed possible for the transaction to be not dirty but
 932         * the dqinfo portion to be.  All that means is that we have some
 933         * (non-persistent) quota reservations that need to be unreserved.
 934         */
 935        xfs_trans_unreserve_and_mod_dquots(tp);
 936        if (tp->t_ticket) {
 937                commit_lsn = xfs_log_done(mp, tp->t_ticket, NULL, log_flags);
 938                if (commit_lsn == -1 && !error)
 939                        error = XFS_ERROR(EIO);
 940        }
 941        current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS);
 942        xfs_trans_free_items(tp, NULLCOMMITLSN, error ? XFS_TRANS_ABORT : 0);
 943        xfs_trans_free(tp);
 944
 945        XFS_STATS_INC(xs_trans_empty);
 946        return error;
 947}
 948
 949/*
 950 * Unlock all of the transaction's items and free the transaction.
 951 * The transaction must not have modified any of its items, because
 952 * there is no way to restore them to their previous state.
 953 *
 954 * If the transaction has made a log reservation, make sure to release
 955 * it as well.
 956 */
 957void
 958xfs_trans_cancel(
 959        xfs_trans_t             *tp,
 960        int                     flags)
 961{
 962        int                     log_flags;
 963        xfs_mount_t             *mp = tp->t_mountp;
 964
 965        /*
 966         * See if the caller is being too lazy to figure out if
 967         * the transaction really needs an abort.
 968         */
 969        if ((flags & XFS_TRANS_ABORT) && !(tp->t_flags & XFS_TRANS_DIRTY))
 970                flags &= ~XFS_TRANS_ABORT;
 971        /*
 972         * See if the caller is relying on us to shut down the
 973         * filesystem.  This happens in paths where we detect
 974         * corruption and decide to give up.
 975         */
 976        if ((tp->t_flags & XFS_TRANS_DIRTY) && !XFS_FORCED_SHUTDOWN(mp)) {
 977                XFS_ERROR_REPORT("xfs_trans_cancel", XFS_ERRLEVEL_LOW, mp);
 978                xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
 979        }
 980#ifdef DEBUG
 981        if (!(flags & XFS_TRANS_ABORT) && !XFS_FORCED_SHUTDOWN(mp)) {
 982                struct xfs_log_item_desc *lidp;
 983
 984                list_for_each_entry(lidp, &tp->t_items, lid_trans)
 985                        ASSERT(!(lidp->lid_item->li_type == XFS_LI_EFD));
 986        }
 987#endif
 988        xfs_trans_unreserve_and_mod_sb(tp);
 989        xfs_trans_unreserve_and_mod_dquots(tp);
 990
 991        if (tp->t_ticket) {
 992                if (flags & XFS_TRANS_RELEASE_LOG_RES) {
 993                        ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
 994                        log_flags = XFS_LOG_REL_PERM_RESERV;
 995                } else {
 996                        log_flags = 0;
 997                }
 998                xfs_log_done(mp, tp->t_ticket, NULL, log_flags);
 999        }
1000
1001        /* mark this thread as no longer being in a transaction */
1002        current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS);
1003
1004        xfs_trans_free_items(tp, NULLCOMMITLSN, flags);
1005        xfs_trans_free(tp);
1006}
1007
1008/*
1009 * Roll from one trans in the sequence of PERMANENT transactions to
1010 * the next: permanent transactions are only flushed out when
1011 * committed with XFS_TRANS_RELEASE_LOG_RES, but we still want as soon
1012 * as possible to let chunks of it go to the log. So we commit the
1013 * chunk we've been working on and get a new transaction to continue.
1014 */
1015int
1016xfs_trans_roll(
1017        struct xfs_trans        **tpp,
1018        struct xfs_inode        *dp)
1019{
1020        struct xfs_trans        *trans;
1021        struct xfs_trans_res    tres;
1022        int                     error;
1023
1024        /*
1025         * Ensure that the inode is always logged.
1026         */
1027        trans = *tpp;
1028        xfs_trans_log_inode(trans, dp, XFS_ILOG_CORE);
1029
1030        /*
1031         * Copy the critical parameters from one trans to the next.
1032         */
1033        tres.tr_logres = trans->t_log_res;
1034        tres.tr_logcount = trans->t_log_count;
1035        *tpp = xfs_trans_dup(trans);
1036
1037        /*
1038         * Commit the current transaction.
1039         * If this commit failed, then it'd just unlock those items that
1040         * are not marked ihold. That also means that a filesystem shutdown
1041         * is in progress. The caller takes the responsibility to cancel
1042         * the duplicate transaction that gets returned.
1043         */
1044        error = xfs_trans_commit(trans, 0);
1045        if (error)
1046                return (error);
1047
1048        trans = *tpp;
1049
1050        /*
1051         * transaction commit worked ok so we can drop the extra ticket
1052         * reference that we gained in xfs_trans_dup()
1053         */
1054        xfs_log_ticket_put(trans->t_ticket);
1055
1056
1057        /*
1058         * Reserve space in the log for th next transaction.
1059         * This also pushes items in the "AIL", the list of logged items,
1060         * out to disk if they are taking up space at the tail of the log
1061         * that we want to use.  This requires that either nothing be locked
1062         * across this call, or that anything that is locked be logged in
1063         * the prior and the next transactions.
1064         */
1065        tres.tr_logflags = XFS_TRANS_PERM_LOG_RES;
1066        error = xfs_trans_reserve(trans, &tres, 0, 0);
1067        /*
1068         *  Ensure that the inode is in the new transaction and locked.
1069         */
1070        if (error)
1071                return error;
1072
1073        xfs_trans_ijoin(trans, dp, 0);
1074        return 0;
1075}
1076