linux/fs/xfs/xfs_fsops.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_shared.h"
  21#include "xfs_format.h"
  22#include "xfs_log_format.h"
  23#include "xfs_trans_resv.h"
  24#include "xfs_sb.h"
  25#include "xfs_mount.h"
  26#include "xfs_defer.h"
  27#include "xfs_da_format.h"
  28#include "xfs_da_btree.h"
  29#include "xfs_inode.h"
  30#include "xfs_trans.h"
  31#include "xfs_inode_item.h"
  32#include "xfs_error.h"
  33#include "xfs_btree.h"
  34#include "xfs_alloc_btree.h"
  35#include "xfs_alloc.h"
  36#include "xfs_rmap_btree.h"
  37#include "xfs_ialloc.h"
  38#include "xfs_fsops.h"
  39#include "xfs_itable.h"
  40#include "xfs_trans_space.h"
  41#include "xfs_rtalloc.h"
  42#include "xfs_trace.h"
  43#include "xfs_log.h"
  44#include "xfs_filestream.h"
  45#include "xfs_rmap.h"
  46#include "xfs_ag_resv.h"
  47
  48/*
  49 * File system operations
  50 */
  51
  52static struct xfs_buf *
  53xfs_growfs_get_hdr_buf(
  54        struct xfs_mount        *mp,
  55        xfs_daddr_t             blkno,
  56        size_t                  numblks,
  57        int                     flags,
  58        const struct xfs_buf_ops *ops)
  59{
  60        struct xfs_buf          *bp;
  61
  62        bp = xfs_buf_get_uncached(mp->m_ddev_targp, numblks, flags);
  63        if (!bp)
  64                return NULL;
  65
  66        xfs_buf_zero(bp, 0, BBTOB(bp->b_length));
  67        bp->b_bn = blkno;
  68        bp->b_maps[0].bm_bn = blkno;
  69        bp->b_ops = ops;
  70
  71        return bp;
  72}
  73
  74static int
  75xfs_growfs_data_private(
  76        xfs_mount_t             *mp,            /* mount point for filesystem */
  77        xfs_growfs_data_t       *in)            /* growfs data input struct */
  78{
  79        xfs_agf_t               *agf;
  80        struct xfs_agfl         *agfl;
  81        xfs_agi_t               *agi;
  82        xfs_agnumber_t          agno;
  83        xfs_extlen_t            agsize;
  84        xfs_extlen_t            tmpsize;
  85        xfs_alloc_rec_t         *arec;
  86        xfs_buf_t               *bp;
  87        int                     bucket;
  88        int                     dpct;
  89        int                     error, saved_error = 0;
  90        xfs_agnumber_t          nagcount;
  91        xfs_agnumber_t          nagimax = 0;
  92        xfs_rfsblock_t          nb, nb_mod;
  93        xfs_rfsblock_t          new;
  94        xfs_rfsblock_t          nfree;
  95        xfs_agnumber_t          oagcount;
  96        int                     pct;
  97        xfs_trans_t             *tp;
  98
  99        nb = in->newblocks;
 100        pct = in->imaxpct;
 101        if (nb < mp->m_sb.sb_dblocks || pct < 0 || pct > 100)
 102                return -EINVAL;
 103        if ((error = xfs_sb_validate_fsb_count(&mp->m_sb, nb)))
 104                return error;
 105        dpct = pct - mp->m_sb.sb_imax_pct;
 106        error = xfs_buf_read_uncached(mp->m_ddev_targp,
 107                                XFS_FSB_TO_BB(mp, nb) - XFS_FSS_TO_BB(mp, 1),
 108                                XFS_FSS_TO_BB(mp, 1), 0, &bp, NULL);
 109        if (error)
 110                return error;
 111        xfs_buf_relse(bp);
 112
 113        new = nb;       /* use new as a temporary here */
 114        nb_mod = do_div(new, mp->m_sb.sb_agblocks);
 115        nagcount = new + (nb_mod != 0);
 116        if (nb_mod && nb_mod < XFS_MIN_AG_BLOCKS) {
 117                nagcount--;
 118                nb = (xfs_rfsblock_t)nagcount * mp->m_sb.sb_agblocks;
 119                if (nb < mp->m_sb.sb_dblocks)
 120                        return -EINVAL;
 121        }
 122        new = nb - mp->m_sb.sb_dblocks;
 123        oagcount = mp->m_sb.sb_agcount;
 124
 125        /* allocate the new per-ag structures */
 126        if (nagcount > oagcount) {
 127                error = xfs_initialize_perag(mp, nagcount, &nagimax);
 128                if (error)
 129                        return error;
 130        }
 131
 132        error = xfs_trans_alloc(mp, &M_RES(mp)->tr_growdata,
 133                        XFS_GROWFS_SPACE_RES(mp), 0, XFS_TRANS_RESERVE, &tp);
 134        if (error)
 135                return error;
 136
 137        /*
 138         * Write new AG headers to disk. Non-transactional, but written
 139         * synchronously so they are completed prior to the growfs transaction
 140         * being logged.
 141         */
 142        nfree = 0;
 143        for (agno = nagcount - 1; agno >= oagcount; agno--, new -= agsize) {
 144                __be32  *agfl_bno;
 145
 146                /*
 147                 * AG freespace header block
 148                 */
 149                bp = xfs_growfs_get_hdr_buf(mp,
 150                                XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
 151                                XFS_FSS_TO_BB(mp, 1), 0,
 152                                &xfs_agf_buf_ops);
 153                if (!bp) {
 154                        error = -ENOMEM;
 155                        goto error0;
 156                }
 157
 158                agf = XFS_BUF_TO_AGF(bp);
 159                agf->agf_magicnum = cpu_to_be32(XFS_AGF_MAGIC);
 160                agf->agf_versionnum = cpu_to_be32(XFS_AGF_VERSION);
 161                agf->agf_seqno = cpu_to_be32(agno);
 162                if (agno == nagcount - 1)
 163                        agsize =
 164                                nb -
 165                                (agno * (xfs_rfsblock_t)mp->m_sb.sb_agblocks);
 166                else
 167                        agsize = mp->m_sb.sb_agblocks;
 168                agf->agf_length = cpu_to_be32(agsize);
 169                agf->agf_roots[XFS_BTNUM_BNOi] = cpu_to_be32(XFS_BNO_BLOCK(mp));
 170                agf->agf_roots[XFS_BTNUM_CNTi] = cpu_to_be32(XFS_CNT_BLOCK(mp));
 171                agf->agf_levels[XFS_BTNUM_BNOi] = cpu_to_be32(1);
 172                agf->agf_levels[XFS_BTNUM_CNTi] = cpu_to_be32(1);
 173                if (xfs_sb_version_hasrmapbt(&mp->m_sb)) {
 174                        agf->agf_roots[XFS_BTNUM_RMAPi] =
 175                                                cpu_to_be32(XFS_RMAP_BLOCK(mp));
 176                        agf->agf_levels[XFS_BTNUM_RMAPi] = cpu_to_be32(1);
 177                        agf->agf_rmap_blocks = cpu_to_be32(1);
 178                }
 179
 180                agf->agf_flfirst = cpu_to_be32(1);
 181                agf->agf_fllast = 0;
 182                agf->agf_flcount = 0;
 183                tmpsize = agsize - mp->m_ag_prealloc_blocks;
 184                agf->agf_freeblks = cpu_to_be32(tmpsize);
 185                agf->agf_longest = cpu_to_be32(tmpsize);
 186                if (xfs_sb_version_hascrc(&mp->m_sb))
 187                        uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid);
 188                if (xfs_sb_version_hasreflink(&mp->m_sb)) {
 189                        agf->agf_refcount_root = cpu_to_be32(
 190                                        xfs_refc_block(mp));
 191                        agf->agf_refcount_level = cpu_to_be32(1);
 192                        agf->agf_refcount_blocks = cpu_to_be32(1);
 193                }
 194
 195                error = xfs_bwrite(bp);
 196                xfs_buf_relse(bp);
 197                if (error)
 198                        goto error0;
 199
 200                /*
 201                 * AG freelist header block
 202                 */
 203                bp = xfs_growfs_get_hdr_buf(mp,
 204                                XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)),
 205                                XFS_FSS_TO_BB(mp, 1), 0,
 206                                &xfs_agfl_buf_ops);
 207                if (!bp) {
 208                        error = -ENOMEM;
 209                        goto error0;
 210                }
 211
 212                agfl = XFS_BUF_TO_AGFL(bp);
 213                if (xfs_sb_version_hascrc(&mp->m_sb)) {
 214                        agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC);
 215                        agfl->agfl_seqno = cpu_to_be32(agno);
 216                        uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_meta_uuid);
 217                }
 218
 219                agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, bp);
 220                for (bucket = 0; bucket < XFS_AGFL_SIZE(mp); bucket++)
 221                        agfl_bno[bucket] = cpu_to_be32(NULLAGBLOCK);
 222
 223                error = xfs_bwrite(bp);
 224                xfs_buf_relse(bp);
 225                if (error)
 226                        goto error0;
 227
 228                /*
 229                 * AG inode header block
 230                 */
 231                bp = xfs_growfs_get_hdr_buf(mp,
 232                                XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)),
 233                                XFS_FSS_TO_BB(mp, 1), 0,
 234                                &xfs_agi_buf_ops);
 235                if (!bp) {
 236                        error = -ENOMEM;
 237                        goto error0;
 238                }
 239
 240                agi = XFS_BUF_TO_AGI(bp);
 241                agi->agi_magicnum = cpu_to_be32(XFS_AGI_MAGIC);
 242                agi->agi_versionnum = cpu_to_be32(XFS_AGI_VERSION);
 243                agi->agi_seqno = cpu_to_be32(agno);
 244                agi->agi_length = cpu_to_be32(agsize);
 245                agi->agi_count = 0;
 246                agi->agi_root = cpu_to_be32(XFS_IBT_BLOCK(mp));
 247                agi->agi_level = cpu_to_be32(1);
 248                agi->agi_freecount = 0;
 249                agi->agi_newino = cpu_to_be32(NULLAGINO);
 250                agi->agi_dirino = cpu_to_be32(NULLAGINO);
 251                if (xfs_sb_version_hascrc(&mp->m_sb))
 252                        uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid);
 253                if (xfs_sb_version_hasfinobt(&mp->m_sb)) {
 254                        agi->agi_free_root = cpu_to_be32(XFS_FIBT_BLOCK(mp));
 255                        agi->agi_free_level = cpu_to_be32(1);
 256                }
 257                for (bucket = 0; bucket < XFS_AGI_UNLINKED_BUCKETS; bucket++)
 258                        agi->agi_unlinked[bucket] = cpu_to_be32(NULLAGINO);
 259
 260                error = xfs_bwrite(bp);
 261                xfs_buf_relse(bp);
 262                if (error)
 263                        goto error0;
 264
 265                /*
 266                 * BNO btree root block
 267                 */
 268                bp = xfs_growfs_get_hdr_buf(mp,
 269                                XFS_AGB_TO_DADDR(mp, agno, XFS_BNO_BLOCK(mp)),
 270                                BTOBB(mp->m_sb.sb_blocksize), 0,
 271                                &xfs_allocbt_buf_ops);
 272
 273                if (!bp) {
 274                        error = -ENOMEM;
 275                        goto error0;
 276                }
 277
 278                xfs_btree_init_block(mp, bp, XFS_BTNUM_BNO, 0, 1, agno, 0);
 279
 280                arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1);
 281                arec->ar_startblock = cpu_to_be32(mp->m_ag_prealloc_blocks);
 282                arec->ar_blockcount = cpu_to_be32(
 283                        agsize - be32_to_cpu(arec->ar_startblock));
 284
 285                error = xfs_bwrite(bp);
 286                xfs_buf_relse(bp);
 287                if (error)
 288                        goto error0;
 289
 290                /*
 291                 * CNT btree root block
 292                 */
 293                bp = xfs_growfs_get_hdr_buf(mp,
 294                                XFS_AGB_TO_DADDR(mp, agno, XFS_CNT_BLOCK(mp)),
 295                                BTOBB(mp->m_sb.sb_blocksize), 0,
 296                                &xfs_allocbt_buf_ops);
 297                if (!bp) {
 298                        error = -ENOMEM;
 299                        goto error0;
 300                }
 301
 302                xfs_btree_init_block(mp, bp, XFS_BTNUM_CNT, 0, 1, agno, 0);
 303
 304                arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1);
 305                arec->ar_startblock = cpu_to_be32(mp->m_ag_prealloc_blocks);
 306                arec->ar_blockcount = cpu_to_be32(
 307                        agsize - be32_to_cpu(arec->ar_startblock));
 308                nfree += be32_to_cpu(arec->ar_blockcount);
 309
 310                error = xfs_bwrite(bp);
 311                xfs_buf_relse(bp);
 312                if (error)
 313                        goto error0;
 314
 315                /* RMAP btree root block */
 316                if (xfs_sb_version_hasrmapbt(&mp->m_sb)) {
 317                        struct xfs_rmap_rec     *rrec;
 318                        struct xfs_btree_block  *block;
 319
 320                        bp = xfs_growfs_get_hdr_buf(mp,
 321                                XFS_AGB_TO_DADDR(mp, agno, XFS_RMAP_BLOCK(mp)),
 322                                BTOBB(mp->m_sb.sb_blocksize), 0,
 323                                &xfs_rmapbt_buf_ops);
 324                        if (!bp) {
 325                                error = -ENOMEM;
 326                                goto error0;
 327                        }
 328
 329                        xfs_btree_init_block(mp, bp, XFS_BTNUM_RMAP, 0, 0,
 330                                                agno, 0);
 331                        block = XFS_BUF_TO_BLOCK(bp);
 332
 333
 334                        /*
 335                         * mark the AG header regions as static metadata The BNO
 336                         * btree block is the first block after the headers, so
 337                         * it's location defines the size of region the static
 338                         * metadata consumes.
 339                         *
 340                         * Note: unlike mkfs, we never have to account for log
 341                         * space when growing the data regions
 342                         */
 343                        rrec = XFS_RMAP_REC_ADDR(block, 1);
 344                        rrec->rm_startblock = 0;
 345                        rrec->rm_blockcount = cpu_to_be32(XFS_BNO_BLOCK(mp));
 346                        rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_FS);
 347                        rrec->rm_offset = 0;
 348                        be16_add_cpu(&block->bb_numrecs, 1);
 349
 350                        /* account freespace btree root blocks */
 351                        rrec = XFS_RMAP_REC_ADDR(block, 2);
 352                        rrec->rm_startblock = cpu_to_be32(XFS_BNO_BLOCK(mp));
 353                        rrec->rm_blockcount = cpu_to_be32(2);
 354                        rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_AG);
 355                        rrec->rm_offset = 0;
 356                        be16_add_cpu(&block->bb_numrecs, 1);
 357
 358                        /* account inode btree root blocks */
 359                        rrec = XFS_RMAP_REC_ADDR(block, 3);
 360                        rrec->rm_startblock = cpu_to_be32(XFS_IBT_BLOCK(mp));
 361                        rrec->rm_blockcount = cpu_to_be32(XFS_RMAP_BLOCK(mp) -
 362                                                        XFS_IBT_BLOCK(mp));
 363                        rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_INOBT);
 364                        rrec->rm_offset = 0;
 365                        be16_add_cpu(&block->bb_numrecs, 1);
 366
 367                        /* account for rmap btree root */
 368                        rrec = XFS_RMAP_REC_ADDR(block, 4);
 369                        rrec->rm_startblock = cpu_to_be32(XFS_RMAP_BLOCK(mp));
 370                        rrec->rm_blockcount = cpu_to_be32(1);
 371                        rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_AG);
 372                        rrec->rm_offset = 0;
 373                        be16_add_cpu(&block->bb_numrecs, 1);
 374
 375                        /* account for refc btree root */
 376                        if (xfs_sb_version_hasreflink(&mp->m_sb)) {
 377                                rrec = XFS_RMAP_REC_ADDR(block, 5);
 378                                rrec->rm_startblock = cpu_to_be32(
 379                                                xfs_refc_block(mp));
 380                                rrec->rm_blockcount = cpu_to_be32(1);
 381                                rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_REFC);
 382                                rrec->rm_offset = 0;
 383                                be16_add_cpu(&block->bb_numrecs, 1);
 384                        }
 385
 386                        error = xfs_bwrite(bp);
 387                        xfs_buf_relse(bp);
 388                        if (error)
 389                                goto error0;
 390                }
 391
 392                /*
 393                 * INO btree root block
 394                 */
 395                bp = xfs_growfs_get_hdr_buf(mp,
 396                                XFS_AGB_TO_DADDR(mp, agno, XFS_IBT_BLOCK(mp)),
 397                                BTOBB(mp->m_sb.sb_blocksize), 0,
 398                                &xfs_inobt_buf_ops);
 399                if (!bp) {
 400                        error = -ENOMEM;
 401                        goto error0;
 402                }
 403
 404                xfs_btree_init_block(mp, bp, XFS_BTNUM_INO , 0, 0, agno, 0);
 405
 406                error = xfs_bwrite(bp);
 407                xfs_buf_relse(bp);
 408                if (error)
 409                        goto error0;
 410
 411                /*
 412                 * FINO btree root block
 413                 */
 414                if (xfs_sb_version_hasfinobt(&mp->m_sb)) {
 415                        bp = xfs_growfs_get_hdr_buf(mp,
 416                                XFS_AGB_TO_DADDR(mp, agno, XFS_FIBT_BLOCK(mp)),
 417                                BTOBB(mp->m_sb.sb_blocksize), 0,
 418                                &xfs_inobt_buf_ops);
 419                        if (!bp) {
 420                                error = -ENOMEM;
 421                                goto error0;
 422                        }
 423
 424                        xfs_btree_init_block(mp, bp, XFS_BTNUM_FINO,
 425                                                     0, 0, agno, 0);
 426
 427                        error = xfs_bwrite(bp);
 428                        xfs_buf_relse(bp);
 429                        if (error)
 430                                goto error0;
 431                }
 432
 433                /*
 434                 * refcount btree root block
 435                 */
 436                if (xfs_sb_version_hasreflink(&mp->m_sb)) {
 437                        bp = xfs_growfs_get_hdr_buf(mp,
 438                                XFS_AGB_TO_DADDR(mp, agno, xfs_refc_block(mp)),
 439                                BTOBB(mp->m_sb.sb_blocksize), 0,
 440                                &xfs_refcountbt_buf_ops);
 441                        if (!bp) {
 442                                error = -ENOMEM;
 443                                goto error0;
 444                        }
 445
 446                        xfs_btree_init_block(mp, bp, XFS_BTNUM_REFC,
 447                                             0, 0, agno, 0);
 448
 449                        error = xfs_bwrite(bp);
 450                        xfs_buf_relse(bp);
 451                        if (error)
 452                                goto error0;
 453                }
 454        }
 455        xfs_trans_agblocks_delta(tp, nfree);
 456        /*
 457         * There are new blocks in the old last a.g.
 458         */
 459        if (new) {
 460                struct xfs_owner_info   oinfo;
 461
 462                /*
 463                 * Change the agi length.
 464                 */
 465                error = xfs_ialloc_read_agi(mp, tp, agno, &bp);
 466                if (error) {
 467                        goto error0;
 468                }
 469                ASSERT(bp);
 470                agi = XFS_BUF_TO_AGI(bp);
 471                be32_add_cpu(&agi->agi_length, new);
 472                ASSERT(nagcount == oagcount ||
 473                       be32_to_cpu(agi->agi_length) == mp->m_sb.sb_agblocks);
 474                xfs_ialloc_log_agi(tp, bp, XFS_AGI_LENGTH);
 475                /*
 476                 * Change agf length.
 477                 */
 478                error = xfs_alloc_read_agf(mp, tp, agno, 0, &bp);
 479                if (error) {
 480                        goto error0;
 481                }
 482                ASSERT(bp);
 483                agf = XFS_BUF_TO_AGF(bp);
 484                be32_add_cpu(&agf->agf_length, new);
 485                ASSERT(be32_to_cpu(agf->agf_length) ==
 486                       be32_to_cpu(agi->agi_length));
 487
 488                xfs_alloc_log_agf(tp, bp, XFS_AGF_LENGTH);
 489
 490                /*
 491                 * Free the new space.
 492                 *
 493                 * XFS_RMAP_OWN_NULL is used here to tell the rmap btree that
 494                 * this doesn't actually exist in the rmap btree.
 495                 */
 496                xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_NULL);
 497                error = xfs_rmap_free(tp, bp, agno,
 498                                be32_to_cpu(agf->agf_length) - new,
 499                                new, &oinfo);
 500                if (error)
 501                        goto error0;
 502                error = xfs_free_extent(tp,
 503                                XFS_AGB_TO_FSB(mp, agno,
 504                                        be32_to_cpu(agf->agf_length) - new),
 505                                new, &oinfo, XFS_AG_RESV_NONE);
 506                if (error)
 507                        goto error0;
 508        }
 509
 510        /*
 511         * Update changed superblock fields transactionally. These are not
 512         * seen by the rest of the world until the transaction commit applies
 513         * them atomically to the superblock.
 514         */
 515        if (nagcount > oagcount)
 516                xfs_trans_mod_sb(tp, XFS_TRANS_SB_AGCOUNT, nagcount - oagcount);
 517        if (nb > mp->m_sb.sb_dblocks)
 518                xfs_trans_mod_sb(tp, XFS_TRANS_SB_DBLOCKS,
 519                                 nb - mp->m_sb.sb_dblocks);
 520        if (nfree)
 521                xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, nfree);
 522        if (dpct)
 523                xfs_trans_mod_sb(tp, XFS_TRANS_SB_IMAXPCT, dpct);
 524        xfs_trans_set_sync(tp);
 525        error = xfs_trans_commit(tp);
 526        if (error)
 527                return error;
 528
 529        /* New allocation groups fully initialized, so update mount struct */
 530        if (nagimax)
 531                mp->m_maxagi = nagimax;
 532        if (mp->m_sb.sb_imax_pct) {
 533                uint64_t icount = mp->m_sb.sb_dblocks * mp->m_sb.sb_imax_pct;
 534                do_div(icount, 100);
 535                mp->m_maxicount = icount << mp->m_sb.sb_inopblog;
 536        } else
 537                mp->m_maxicount = 0;
 538        xfs_set_low_space_thresholds(mp);
 539        mp->m_alloc_set_aside = xfs_alloc_set_aside(mp);
 540
 541        /*
 542         * If we expanded the last AG, free the per-AG reservation
 543         * so we can reinitialize it with the new size.
 544         */
 545        if (new) {
 546                struct xfs_perag        *pag;
 547
 548                pag = xfs_perag_get(mp, agno);
 549                error = xfs_ag_resv_free(pag);
 550                xfs_perag_put(pag);
 551                if (error)
 552                        goto out;
 553        }
 554
 555        /* Reserve AG metadata blocks. */
 556        error = xfs_fs_reserve_ag_blocks(mp);
 557        if (error && error != -ENOSPC)
 558                goto out;
 559
 560        /* update secondary superblocks. */
 561        for (agno = 1; agno < nagcount; agno++) {
 562                error = 0;
 563                /*
 564                 * new secondary superblocks need to be zeroed, not read from
 565                 * disk as the contents of the new area we are growing into is
 566                 * completely unknown.
 567                 */
 568                if (agno < oagcount) {
 569                        error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp,
 570                                  XFS_AGB_TO_DADDR(mp, agno, XFS_SB_BLOCK(mp)),
 571                                  XFS_FSS_TO_BB(mp, 1), 0, &bp,
 572                                  &xfs_sb_buf_ops);
 573                } else {
 574                        bp = xfs_trans_get_buf(NULL, mp->m_ddev_targp,
 575                                  XFS_AGB_TO_DADDR(mp, agno, XFS_SB_BLOCK(mp)),
 576                                  XFS_FSS_TO_BB(mp, 1), 0);
 577                        if (bp) {
 578                                bp->b_ops = &xfs_sb_buf_ops;
 579                                xfs_buf_zero(bp, 0, BBTOB(bp->b_length));
 580                        } else
 581                                error = -ENOMEM;
 582                }
 583
 584                /*
 585                 * If we get an error reading or writing alternate superblocks,
 586                 * continue.  xfs_repair chooses the "best" superblock based
 587                 * on most matches; if we break early, we'll leave more
 588                 * superblocks un-updated than updated, and xfs_repair may
 589                 * pick them over the properly-updated primary.
 590                 */
 591                if (error) {
 592                        xfs_warn(mp,
 593                "error %d reading secondary superblock for ag %d",
 594                                error, agno);
 595                        saved_error = error;
 596                        continue;
 597                }
 598                xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb);
 599
 600                error = xfs_bwrite(bp);
 601                xfs_buf_relse(bp);
 602                if (error) {
 603                        xfs_warn(mp,
 604                "write error %d updating secondary superblock for ag %d",
 605                                error, agno);
 606                        saved_error = error;
 607                        continue;
 608                }
 609        }
 610
 611 out:
 612        return saved_error ? saved_error : error;
 613
 614 error0:
 615        xfs_trans_cancel(tp);
 616        return error;
 617}
 618
 619static int
 620xfs_growfs_log_private(
 621        xfs_mount_t             *mp,    /* mount point for filesystem */
 622        xfs_growfs_log_t        *in)    /* growfs log input struct */
 623{
 624        xfs_extlen_t            nb;
 625
 626        nb = in->newblocks;
 627        if (nb < XFS_MIN_LOG_BLOCKS || nb < XFS_B_TO_FSB(mp, XFS_MIN_LOG_BYTES))
 628                return -EINVAL;
 629        if (nb == mp->m_sb.sb_logblocks &&
 630            in->isint == (mp->m_sb.sb_logstart != 0))
 631                return -EINVAL;
 632        /*
 633         * Moving the log is hard, need new interfaces to sync
 634         * the log first, hold off all activity while moving it.
 635         * Can have shorter or longer log in the same space,
 636         * or transform internal to external log or vice versa.
 637         */
 638        return -ENOSYS;
 639}
 640
 641/*
 642 * protected versions of growfs function acquire and release locks on the mount
 643 * point - exported through ioctls: XFS_IOC_FSGROWFSDATA, XFS_IOC_FSGROWFSLOG,
 644 * XFS_IOC_FSGROWFSRT
 645 */
 646
 647
 648int
 649xfs_growfs_data(
 650        xfs_mount_t             *mp,
 651        xfs_growfs_data_t       *in)
 652{
 653        int error;
 654
 655        if (!capable(CAP_SYS_ADMIN))
 656                return -EPERM;
 657        if (!mutex_trylock(&mp->m_growlock))
 658                return -EWOULDBLOCK;
 659        error = xfs_growfs_data_private(mp, in);
 660        /*
 661         * Increment the generation unconditionally, the error could be from
 662         * updating the secondary superblocks, in which case the new size
 663         * is live already.
 664         */
 665        mp->m_generation++;
 666        mutex_unlock(&mp->m_growlock);
 667        return error;
 668}
 669
 670int
 671xfs_growfs_log(
 672        xfs_mount_t             *mp,
 673        xfs_growfs_log_t        *in)
 674{
 675        int error;
 676
 677        if (!capable(CAP_SYS_ADMIN))
 678                return -EPERM;
 679        if (!mutex_trylock(&mp->m_growlock))
 680                return -EWOULDBLOCK;
 681        error = xfs_growfs_log_private(mp, in);
 682        mutex_unlock(&mp->m_growlock);
 683        return error;
 684}
 685
 686/*
 687 * exported through ioctl XFS_IOC_FSCOUNTS
 688 */
 689
 690int
 691xfs_fs_counts(
 692        xfs_mount_t             *mp,
 693        xfs_fsop_counts_t       *cnt)
 694{
 695        cnt->allocino = percpu_counter_read_positive(&mp->m_icount);
 696        cnt->freeino = percpu_counter_read_positive(&mp->m_ifree);
 697        cnt->freedata = percpu_counter_read_positive(&mp->m_fdblocks) -
 698                                                mp->m_alloc_set_aside;
 699
 700        spin_lock(&mp->m_sb_lock);
 701        cnt->freertx = mp->m_sb.sb_frextents;
 702        spin_unlock(&mp->m_sb_lock);
 703        return 0;
 704}
 705
 706/*
 707 * exported through ioctl XFS_IOC_SET_RESBLKS & XFS_IOC_GET_RESBLKS
 708 *
 709 * xfs_reserve_blocks is called to set m_resblks
 710 * in the in-core mount table. The number of unused reserved blocks
 711 * is kept in m_resblks_avail.
 712 *
 713 * Reserve the requested number of blocks if available. Otherwise return
 714 * as many as possible to satisfy the request. The actual number
 715 * reserved are returned in outval
 716 *
 717 * A null inval pointer indicates that only the current reserved blocks
 718 * available  should  be returned no settings are changed.
 719 */
 720
 721int
 722xfs_reserve_blocks(
 723        xfs_mount_t             *mp,
 724        uint64_t              *inval,
 725        xfs_fsop_resblks_t      *outval)
 726{
 727        int64_t                 lcounter, delta;
 728        int64_t                 fdblks_delta = 0;
 729        uint64_t                request;
 730        int64_t                 free;
 731        int                     error = 0;
 732
 733        /* If inval is null, report current values and return */
 734        if (inval == (uint64_t *)NULL) {
 735                if (!outval)
 736                        return -EINVAL;
 737                outval->resblks = mp->m_resblks;
 738                outval->resblks_avail = mp->m_resblks_avail;
 739                return 0;
 740        }
 741
 742        request = *inval;
 743
 744        /*
 745         * With per-cpu counters, this becomes an interesting problem. we need
 746         * to work out if we are freeing or allocation blocks first, then we can
 747         * do the modification as necessary.
 748         *
 749         * We do this under the m_sb_lock so that if we are near ENOSPC, we will
 750         * hold out any changes while we work out what to do. This means that
 751         * the amount of free space can change while we do this, so we need to
 752         * retry if we end up trying to reserve more space than is available.
 753         */
 754        spin_lock(&mp->m_sb_lock);
 755
 756        /*
 757         * If our previous reservation was larger than the current value,
 758         * then move any unused blocks back to the free pool. Modify the resblks
 759         * counters directly since we shouldn't have any problems unreserving
 760         * space.
 761         */
 762        if (mp->m_resblks > request) {
 763                lcounter = mp->m_resblks_avail - request;
 764                if (lcounter  > 0) {            /* release unused blocks */
 765                        fdblks_delta = lcounter;
 766                        mp->m_resblks_avail -= lcounter;
 767                }
 768                mp->m_resblks = request;
 769                if (fdblks_delta) {
 770                        spin_unlock(&mp->m_sb_lock);
 771                        error = xfs_mod_fdblocks(mp, fdblks_delta, 0);
 772                        spin_lock(&mp->m_sb_lock);
 773                }
 774
 775                goto out;
 776        }
 777
 778        /*
 779         * If the request is larger than the current reservation, reserve the
 780         * blocks before we update the reserve counters. Sample m_fdblocks and
 781         * perform a partial reservation if the request exceeds free space.
 782         */
 783        error = -ENOSPC;
 784        do {
 785                free = percpu_counter_sum(&mp->m_fdblocks) -
 786                                                mp->m_alloc_set_aside;
 787                if (!free)
 788                        break;
 789
 790                delta = request - mp->m_resblks;
 791                lcounter = free - delta;
 792                if (lcounter < 0)
 793                        /* We can't satisfy the request, just get what we can */
 794                        fdblks_delta = free;
 795                else
 796                        fdblks_delta = delta;
 797
 798                /*
 799                 * We'll either succeed in getting space from the free block
 800                 * count or we'll get an ENOSPC. If we get a ENOSPC, it means
 801                 * things changed while we were calculating fdblks_delta and so
 802                 * we should try again to see if there is anything left to
 803                 * reserve.
 804                 *
 805                 * Don't set the reserved flag here - we don't want to reserve
 806                 * the extra reserve blocks from the reserve.....
 807                 */
 808                spin_unlock(&mp->m_sb_lock);
 809                error = xfs_mod_fdblocks(mp, -fdblks_delta, 0);
 810                spin_lock(&mp->m_sb_lock);
 811        } while (error == -ENOSPC);
 812
 813        /*
 814         * Update the reserve counters if blocks have been successfully
 815         * allocated.
 816         */
 817        if (!error && fdblks_delta) {
 818                mp->m_resblks += fdblks_delta;
 819                mp->m_resblks_avail += fdblks_delta;
 820        }
 821
 822out:
 823        if (outval) {
 824                outval->resblks = mp->m_resblks;
 825                outval->resblks_avail = mp->m_resblks_avail;
 826        }
 827
 828        spin_unlock(&mp->m_sb_lock);
 829        return error;
 830}
 831
 832int
 833xfs_fs_goingdown(
 834        xfs_mount_t     *mp,
 835        uint32_t        inflags)
 836{
 837        switch (inflags) {
 838        case XFS_FSOP_GOING_FLAGS_DEFAULT: {
 839                struct super_block *sb = freeze_bdev(mp->m_super->s_bdev);
 840
 841                if (sb && !IS_ERR(sb)) {
 842                        xfs_force_shutdown(mp, SHUTDOWN_FORCE_UMOUNT);
 843                        thaw_bdev(sb->s_bdev, sb);
 844                }
 845
 846                break;
 847        }
 848        case XFS_FSOP_GOING_FLAGS_LOGFLUSH:
 849                xfs_force_shutdown(mp, SHUTDOWN_FORCE_UMOUNT);
 850                break;
 851        case XFS_FSOP_GOING_FLAGS_NOLOGFLUSH:
 852                xfs_force_shutdown(mp,
 853                                SHUTDOWN_FORCE_UMOUNT | SHUTDOWN_LOG_IO_ERROR);
 854                break;
 855        default:
 856                return -EINVAL;
 857        }
 858
 859        return 0;
 860}
 861
 862/*
 863 * Force a shutdown of the filesystem instantly while keeping the filesystem
 864 * consistent. We don't do an unmount here; just shutdown the shop, make sure
 865 * that absolutely nothing persistent happens to this filesystem after this
 866 * point.
 867 */
 868void
 869xfs_do_force_shutdown(
 870        xfs_mount_t     *mp,
 871        int             flags,
 872        char            *fname,
 873        int             lnnum)
 874{
 875        int             logerror;
 876
 877        logerror = flags & SHUTDOWN_LOG_IO_ERROR;
 878
 879        if (!(flags & SHUTDOWN_FORCE_UMOUNT)) {
 880                xfs_notice(mp,
 881        "%s(0x%x) called from line %d of file %s.  Return address = "PTR_FMT,
 882                        __func__, flags, lnnum, fname, __return_address);
 883        }
 884        /*
 885         * No need to duplicate efforts.
 886         */
 887        if (XFS_FORCED_SHUTDOWN(mp) && !logerror)
 888                return;
 889
 890        /*
 891         * This flags XFS_MOUNT_FS_SHUTDOWN, makes sure that we don't
 892         * queue up anybody new on the log reservations, and wakes up
 893         * everybody who's sleeping on log reservations to tell them
 894         * the bad news.
 895         */
 896        if (xfs_log_force_umount(mp, logerror))
 897                return;
 898
 899        if (flags & SHUTDOWN_CORRUPT_INCORE) {
 900                xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_CORRUPT,
 901    "Corruption of in-memory data detected.  Shutting down filesystem");
 902                if (XFS_ERRLEVEL_HIGH <= xfs_error_level)
 903                        xfs_stack_trace();
 904        } else if (!(flags & SHUTDOWN_FORCE_UMOUNT)) {
 905                if (logerror) {
 906                        xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_LOGERROR,
 907                "Log I/O Error Detected.  Shutting down filesystem");
 908                } else if (flags & SHUTDOWN_DEVICE_REQ) {
 909                        xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_IOERROR,
 910                "All device paths lost.  Shutting down filesystem");
 911                } else if (!(flags & SHUTDOWN_REMOTE_REQ)) {
 912                        xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_IOERROR,
 913                "I/O Error Detected. Shutting down filesystem");
 914                }
 915        }
 916        if (!(flags & SHUTDOWN_FORCE_UMOUNT)) {
 917                xfs_alert(mp,
 918        "Please umount the filesystem and rectify the problem(s)");
 919        }
 920}
 921
 922/*
 923 * Reserve free space for per-AG metadata.
 924 */
 925int
 926xfs_fs_reserve_ag_blocks(
 927        struct xfs_mount        *mp)
 928{
 929        xfs_agnumber_t          agno;
 930        struct xfs_perag        *pag;
 931        int                     error = 0;
 932        int                     err2;
 933
 934        for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
 935                pag = xfs_perag_get(mp, agno);
 936                err2 = xfs_ag_resv_init(pag);
 937                xfs_perag_put(pag);
 938                if (err2 && !error)
 939                        error = err2;
 940        }
 941
 942        if (error && error != -ENOSPC) {
 943                xfs_warn(mp,
 944        "Error %d reserving per-AG metadata reserve pool.", error);
 945                xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
 946        }
 947
 948        return error;
 949}
 950
 951/*
 952 * Free space reserved for per-AG metadata.
 953 */
 954int
 955xfs_fs_unreserve_ag_blocks(
 956        struct xfs_mount        *mp)
 957{
 958        xfs_agnumber_t          agno;
 959        struct xfs_perag        *pag;
 960        int                     error = 0;
 961        int                     err2;
 962
 963        for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
 964                pag = xfs_perag_get(mp, agno);
 965                err2 = xfs_ag_resv_free(pag);
 966                xfs_perag_put(pag);
 967                if (err2 && !error)
 968                        error = err2;
 969        }
 970
 971        if (error)
 972                xfs_warn(mp,
 973        "Error %d freeing per-AG metadata reserve pool.", error);
 974
 975        return error;
 976}
 977