linux/fs/xfs/xfs_inode.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2006 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 <linux/log2.h>
  19
  20#include "xfs.h"
  21#include "xfs_fs.h"
  22#include "xfs_types.h"
  23#include "xfs_log.h"
  24#include "xfs_inum.h"
  25#include "xfs_trans.h"
  26#include "xfs_trans_priv.h"
  27#include "xfs_sb.h"
  28#include "xfs_ag.h"
  29#include "xfs_mount.h"
  30#include "xfs_bmap_btree.h"
  31#include "xfs_alloc_btree.h"
  32#include "xfs_ialloc_btree.h"
  33#include "xfs_attr_sf.h"
  34#include "xfs_dinode.h"
  35#include "xfs_inode.h"
  36#include "xfs_buf_item.h"
  37#include "xfs_inode_item.h"
  38#include "xfs_btree.h"
  39#include "xfs_alloc.h"
  40#include "xfs_ialloc.h"
  41#include "xfs_bmap.h"
  42#include "xfs_error.h"
  43#include "xfs_utils.h"
  44#include "xfs_quota.h"
  45#include "xfs_filestream.h"
  46#include "xfs_vnodeops.h"
  47#include "xfs_cksum.h"
  48#include "xfs_trace.h"
  49#include "xfs_icache.h"
  50
  51kmem_zone_t *xfs_ifork_zone;
  52kmem_zone_t *xfs_inode_zone;
  53
  54/*
  55 * Used in xfs_itruncate_extents().  This is the maximum number of extents
  56 * freed from a file in a single transaction.
  57 */
  58#define XFS_ITRUNC_MAX_EXTENTS  2
  59
  60STATIC int xfs_iflush_int(xfs_inode_t *, xfs_buf_t *);
  61STATIC int xfs_iformat_local(xfs_inode_t *, xfs_dinode_t *, int, int);
  62STATIC int xfs_iformat_extents(xfs_inode_t *, xfs_dinode_t *, int);
  63STATIC int xfs_iformat_btree(xfs_inode_t *, xfs_dinode_t *, int);
  64
  65/*
  66 * helper function to extract extent size hint from inode
  67 */
  68xfs_extlen_t
  69xfs_get_extsz_hint(
  70        struct xfs_inode        *ip)
  71{
  72        if ((ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE) && ip->i_d.di_extsize)
  73                return ip->i_d.di_extsize;
  74        if (XFS_IS_REALTIME_INODE(ip))
  75                return ip->i_mount->m_sb.sb_rextsize;
  76        return 0;
  77}
  78
  79/*
  80 * This is a wrapper routine around the xfs_ilock() routine used to centralize
  81 * some grungy code.  It is used in places that wish to lock the inode solely
  82 * for reading the extents.  The reason these places can't just call
  83 * xfs_ilock(SHARED) is that the inode lock also guards to bringing in of the
  84 * extents from disk for a file in b-tree format.  If the inode is in b-tree
  85 * format, then we need to lock the inode exclusively until the extents are read
  86 * in.  Locking it exclusively all the time would limit our parallelism
  87 * unnecessarily, though.  What we do instead is check to see if the extents
  88 * have been read in yet, and only lock the inode exclusively if they have not.
  89 *
  90 * The function returns a value which should be given to the corresponding
  91 * xfs_iunlock_map_shared().  This value is the mode in which the lock was
  92 * actually taken.
  93 */
  94uint
  95xfs_ilock_map_shared(
  96        xfs_inode_t     *ip)
  97{
  98        uint    lock_mode;
  99
 100        if ((ip->i_d.di_format == XFS_DINODE_FMT_BTREE) &&
 101            ((ip->i_df.if_flags & XFS_IFEXTENTS) == 0)) {
 102                lock_mode = XFS_ILOCK_EXCL;
 103        } else {
 104                lock_mode = XFS_ILOCK_SHARED;
 105        }
 106
 107        xfs_ilock(ip, lock_mode);
 108
 109        return lock_mode;
 110}
 111
 112/*
 113 * This is simply the unlock routine to go with xfs_ilock_map_shared().
 114 * All it does is call xfs_iunlock() with the given lock_mode.
 115 */
 116void
 117xfs_iunlock_map_shared(
 118        xfs_inode_t     *ip,
 119        unsigned int    lock_mode)
 120{
 121        xfs_iunlock(ip, lock_mode);
 122}
 123
 124/*
 125 * The xfs inode contains 2 locks: a multi-reader lock called the
 126 * i_iolock and a multi-reader lock called the i_lock.  This routine
 127 * allows either or both of the locks to be obtained.
 128 *
 129 * The 2 locks should always be ordered so that the IO lock is
 130 * obtained first in order to prevent deadlock.
 131 *
 132 * ip -- the inode being locked
 133 * lock_flags -- this parameter indicates the inode's locks
 134 *       to be locked.  It can be:
 135 *              XFS_IOLOCK_SHARED,
 136 *              XFS_IOLOCK_EXCL,
 137 *              XFS_ILOCK_SHARED,
 138 *              XFS_ILOCK_EXCL,
 139 *              XFS_IOLOCK_SHARED | XFS_ILOCK_SHARED,
 140 *              XFS_IOLOCK_SHARED | XFS_ILOCK_EXCL,
 141 *              XFS_IOLOCK_EXCL | XFS_ILOCK_SHARED,
 142 *              XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL
 143 */
 144void
 145xfs_ilock(
 146        xfs_inode_t             *ip,
 147        uint                    lock_flags)
 148{
 149        trace_xfs_ilock(ip, lock_flags, _RET_IP_);
 150
 151        /*
 152         * You can't set both SHARED and EXCL for the same lock,
 153         * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED,
 154         * and XFS_ILOCK_EXCL are valid values to set in lock_flags.
 155         */
 156        ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) !=
 157               (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL));
 158        ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) !=
 159               (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
 160        ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0);
 161
 162        if (lock_flags & XFS_IOLOCK_EXCL)
 163                mrupdate_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags));
 164        else if (lock_flags & XFS_IOLOCK_SHARED)
 165                mraccess_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags));
 166
 167        if (lock_flags & XFS_ILOCK_EXCL)
 168                mrupdate_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags));
 169        else if (lock_flags & XFS_ILOCK_SHARED)
 170                mraccess_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags));
 171}
 172
 173/*
 174 * This is just like xfs_ilock(), except that the caller
 175 * is guaranteed not to sleep.  It returns 1 if it gets
 176 * the requested locks and 0 otherwise.  If the IO lock is
 177 * obtained but the inode lock cannot be, then the IO lock
 178 * is dropped before returning.
 179 *
 180 * ip -- the inode being locked
 181 * lock_flags -- this parameter indicates the inode's locks to be
 182 *       to be locked.  See the comment for xfs_ilock() for a list
 183 *       of valid values.
 184 */
 185int
 186xfs_ilock_nowait(
 187        xfs_inode_t             *ip,
 188        uint                    lock_flags)
 189{
 190        trace_xfs_ilock_nowait(ip, lock_flags, _RET_IP_);
 191
 192        /*
 193         * You can't set both SHARED and EXCL for the same lock,
 194         * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED,
 195         * and XFS_ILOCK_EXCL are valid values to set in lock_flags.
 196         */
 197        ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) !=
 198               (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL));
 199        ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) !=
 200               (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
 201        ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0);
 202
 203        if (lock_flags & XFS_IOLOCK_EXCL) {
 204                if (!mrtryupdate(&ip->i_iolock))
 205                        goto out;
 206        } else if (lock_flags & XFS_IOLOCK_SHARED) {
 207                if (!mrtryaccess(&ip->i_iolock))
 208                        goto out;
 209        }
 210        if (lock_flags & XFS_ILOCK_EXCL) {
 211                if (!mrtryupdate(&ip->i_lock))
 212                        goto out_undo_iolock;
 213        } else if (lock_flags & XFS_ILOCK_SHARED) {
 214                if (!mrtryaccess(&ip->i_lock))
 215                        goto out_undo_iolock;
 216        }
 217        return 1;
 218
 219 out_undo_iolock:
 220        if (lock_flags & XFS_IOLOCK_EXCL)
 221                mrunlock_excl(&ip->i_iolock);
 222        else if (lock_flags & XFS_IOLOCK_SHARED)
 223                mrunlock_shared(&ip->i_iolock);
 224 out:
 225        return 0;
 226}
 227
 228/*
 229 * xfs_iunlock() is used to drop the inode locks acquired with
 230 * xfs_ilock() and xfs_ilock_nowait().  The caller must pass
 231 * in the flags given to xfs_ilock() or xfs_ilock_nowait() so
 232 * that we know which locks to drop.
 233 *
 234 * ip -- the inode being unlocked
 235 * lock_flags -- this parameter indicates the inode's locks to be
 236 *       to be unlocked.  See the comment for xfs_ilock() for a list
 237 *       of valid values for this parameter.
 238 *
 239 */
 240void
 241xfs_iunlock(
 242        xfs_inode_t             *ip,
 243        uint                    lock_flags)
 244{
 245        /*
 246         * You can't set both SHARED and EXCL for the same lock,
 247         * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED,
 248         * and XFS_ILOCK_EXCL are valid values to set in lock_flags.
 249         */
 250        ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) !=
 251               (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL));
 252        ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) !=
 253               (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL));
 254        ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0);
 255        ASSERT(lock_flags != 0);
 256
 257        if (lock_flags & XFS_IOLOCK_EXCL)
 258                mrunlock_excl(&ip->i_iolock);
 259        else if (lock_flags & XFS_IOLOCK_SHARED)
 260                mrunlock_shared(&ip->i_iolock);
 261
 262        if (lock_flags & XFS_ILOCK_EXCL)
 263                mrunlock_excl(&ip->i_lock);
 264        else if (lock_flags & XFS_ILOCK_SHARED)
 265                mrunlock_shared(&ip->i_lock);
 266
 267        trace_xfs_iunlock(ip, lock_flags, _RET_IP_);
 268}
 269
 270/*
 271 * give up write locks.  the i/o lock cannot be held nested
 272 * if it is being demoted.
 273 */
 274void
 275xfs_ilock_demote(
 276        xfs_inode_t             *ip,
 277        uint                    lock_flags)
 278{
 279        ASSERT(lock_flags & (XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL));
 280        ASSERT((lock_flags & ~(XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)) == 0);
 281
 282        if (lock_flags & XFS_ILOCK_EXCL)
 283                mrdemote(&ip->i_lock);
 284        if (lock_flags & XFS_IOLOCK_EXCL)
 285                mrdemote(&ip->i_iolock);
 286
 287        trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_);
 288}
 289
 290#if defined(DEBUG) || defined(XFS_WARN)
 291int
 292xfs_isilocked(
 293        xfs_inode_t             *ip,
 294        uint                    lock_flags)
 295{
 296        if (lock_flags & (XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)) {
 297                if (!(lock_flags & XFS_ILOCK_SHARED))
 298                        return !!ip->i_lock.mr_writer;
 299                return rwsem_is_locked(&ip->i_lock.mr_lock);
 300        }
 301
 302        if (lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) {
 303                if (!(lock_flags & XFS_IOLOCK_SHARED))
 304                        return !!ip->i_iolock.mr_writer;
 305                return rwsem_is_locked(&ip->i_iolock.mr_lock);
 306        }
 307
 308        ASSERT(0);
 309        return 0;
 310}
 311#endif
 312
 313void
 314__xfs_iflock(
 315        struct xfs_inode        *ip)
 316{
 317        wait_queue_head_t *wq = bit_waitqueue(&ip->i_flags, __XFS_IFLOCK_BIT);
 318        DEFINE_WAIT_BIT(wait, &ip->i_flags, __XFS_IFLOCK_BIT);
 319
 320        do {
 321                prepare_to_wait_exclusive(wq, &wait.wait, TASK_UNINTERRUPTIBLE);
 322                if (xfs_isiflocked(ip))
 323                        io_schedule();
 324        } while (!xfs_iflock_nowait(ip));
 325
 326        finish_wait(wq, &wait.wait);
 327}
 328
 329#ifdef DEBUG
 330/*
 331 * Make sure that the extents in the given memory buffer
 332 * are valid.
 333 */
 334STATIC void
 335xfs_validate_extents(
 336        xfs_ifork_t             *ifp,
 337        int                     nrecs,
 338        xfs_exntfmt_t           fmt)
 339{
 340        xfs_bmbt_irec_t         irec;
 341        xfs_bmbt_rec_host_t     rec;
 342        int                     i;
 343
 344        for (i = 0; i < nrecs; i++) {
 345                xfs_bmbt_rec_host_t *ep = xfs_iext_get_ext(ifp, i);
 346                rec.l0 = get_unaligned(&ep->l0);
 347                rec.l1 = get_unaligned(&ep->l1);
 348                xfs_bmbt_get_all(&rec, &irec);
 349                if (fmt == XFS_EXTFMT_NOSTATE)
 350                        ASSERT(irec.br_state == XFS_EXT_NORM);
 351        }
 352}
 353#else /* DEBUG */
 354#define xfs_validate_extents(ifp, nrecs, fmt)
 355#endif /* DEBUG */
 356
 357/*
 358 * Check that none of the inode's in the buffer have a next
 359 * unlinked field of 0.
 360 */
 361#if defined(DEBUG)
 362void
 363xfs_inobp_check(
 364        xfs_mount_t     *mp,
 365        xfs_buf_t       *bp)
 366{
 367        int             i;
 368        int             j;
 369        xfs_dinode_t    *dip;
 370
 371        j = mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog;
 372
 373        for (i = 0; i < j; i++) {
 374                dip = (xfs_dinode_t *)xfs_buf_offset(bp,
 375                                        i * mp->m_sb.sb_inodesize);
 376                if (!dip->di_next_unlinked)  {
 377                        xfs_alert(mp,
 378        "Detected bogus zero next_unlinked field in incore inode buffer 0x%p.",
 379                                bp);
 380                        ASSERT(dip->di_next_unlinked);
 381                }
 382        }
 383}
 384#endif
 385
 386static void
 387xfs_inode_buf_verify(
 388        struct xfs_buf  *bp)
 389{
 390        struct xfs_mount *mp = bp->b_target->bt_mount;
 391        int             i;
 392        int             ni;
 393
 394        /*
 395         * Validate the magic number and version of every inode in the buffer
 396         */
 397        ni = XFS_BB_TO_FSB(mp, bp->b_length) * mp->m_sb.sb_inopblock;
 398        for (i = 0; i < ni; i++) {
 399                int             di_ok;
 400                xfs_dinode_t    *dip;
 401
 402                dip = (struct xfs_dinode *)xfs_buf_offset(bp,
 403                                        (i << mp->m_sb.sb_inodelog));
 404                di_ok = dip->di_magic == cpu_to_be16(XFS_DINODE_MAGIC) &&
 405                            XFS_DINODE_GOOD_VERSION(dip->di_version);
 406                if (unlikely(XFS_TEST_ERROR(!di_ok, mp,
 407                                                XFS_ERRTAG_ITOBP_INOTOBP,
 408                                                XFS_RANDOM_ITOBP_INOTOBP))) {
 409                        xfs_buf_ioerror(bp, EFSCORRUPTED);
 410                        XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_HIGH,
 411                                             mp, dip);
 412#ifdef DEBUG
 413                        xfs_emerg(mp,
 414                                "bad inode magic/vsn daddr %lld #%d (magic=%x)",
 415                                (unsigned long long)bp->b_bn, i,
 416                                be16_to_cpu(dip->di_magic));
 417                        ASSERT(0);
 418#endif
 419                }
 420        }
 421        xfs_inobp_check(mp, bp);
 422}
 423
 424
 425static void
 426xfs_inode_buf_read_verify(
 427        struct xfs_buf  *bp)
 428{
 429        xfs_inode_buf_verify(bp);
 430}
 431
 432static void
 433xfs_inode_buf_write_verify(
 434        struct xfs_buf  *bp)
 435{
 436        xfs_inode_buf_verify(bp);
 437}
 438
 439const struct xfs_buf_ops xfs_inode_buf_ops = {
 440        .verify_read = xfs_inode_buf_read_verify,
 441        .verify_write = xfs_inode_buf_write_verify,
 442};
 443
 444
 445/*
 446 * This routine is called to map an inode to the buffer containing the on-disk
 447 * version of the inode.  It returns a pointer to the buffer containing the
 448 * on-disk inode in the bpp parameter, and in the dipp parameter it returns a
 449 * pointer to the on-disk inode within that buffer.
 450 *
 451 * If a non-zero error is returned, then the contents of bpp and dipp are
 452 * undefined.
 453 */
 454int
 455xfs_imap_to_bp(
 456        struct xfs_mount        *mp,
 457        struct xfs_trans        *tp,
 458        struct xfs_imap         *imap,
 459        struct xfs_dinode       **dipp,
 460        struct xfs_buf          **bpp,
 461        uint                    buf_flags,
 462        uint                    iget_flags)
 463{
 464        struct xfs_buf          *bp;
 465        int                     error;
 466
 467        buf_flags |= XBF_UNMAPPED;
 468        error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno,
 469                                   (int)imap->im_len, buf_flags, &bp,
 470                                   &xfs_inode_buf_ops);
 471        if (error) {
 472                if (error == EAGAIN) {
 473                        ASSERT(buf_flags & XBF_TRYLOCK);
 474                        return error;
 475                }
 476
 477                if (error == EFSCORRUPTED &&
 478                    (iget_flags & XFS_IGET_UNTRUSTED))
 479                        return XFS_ERROR(EINVAL);
 480
 481                xfs_warn(mp, "%s: xfs_trans_read_buf() returned error %d.",
 482                        __func__, error);
 483                return error;
 484        }
 485
 486        *bpp = bp;
 487        *dipp = (struct xfs_dinode *)xfs_buf_offset(bp, imap->im_boffset);
 488        return 0;
 489}
 490
 491/*
 492 * Move inode type and inode format specific information from the
 493 * on-disk inode to the in-core inode.  For fifos, devs, and sockets
 494 * this means set if_rdev to the proper value.  For files, directories,
 495 * and symlinks this means to bring in the in-line data or extent
 496 * pointers.  For a file in B-tree format, only the root is immediately
 497 * brought in-core.  The rest will be in-lined in if_extents when it
 498 * is first referenced (see xfs_iread_extents()).
 499 */
 500STATIC int
 501xfs_iformat(
 502        xfs_inode_t             *ip,
 503        xfs_dinode_t            *dip)
 504{
 505        xfs_attr_shortform_t    *atp;
 506        int                     size;
 507        int                     error = 0;
 508        xfs_fsize_t             di_size;
 509
 510        if (unlikely(be32_to_cpu(dip->di_nextents) +
 511                     be16_to_cpu(dip->di_anextents) >
 512                     be64_to_cpu(dip->di_nblocks))) {
 513                xfs_warn(ip->i_mount,
 514                        "corrupt dinode %Lu, extent total = %d, nblocks = %Lu.",
 515                        (unsigned long long)ip->i_ino,
 516                        (int)(be32_to_cpu(dip->di_nextents) +
 517                              be16_to_cpu(dip->di_anextents)),
 518                        (unsigned long long)
 519                                be64_to_cpu(dip->di_nblocks));
 520                XFS_CORRUPTION_ERROR("xfs_iformat(1)", XFS_ERRLEVEL_LOW,
 521                                     ip->i_mount, dip);
 522                return XFS_ERROR(EFSCORRUPTED);
 523        }
 524
 525        if (unlikely(dip->di_forkoff > ip->i_mount->m_sb.sb_inodesize)) {
 526                xfs_warn(ip->i_mount, "corrupt dinode %Lu, forkoff = 0x%x.",
 527                        (unsigned long long)ip->i_ino,
 528                        dip->di_forkoff);
 529                XFS_CORRUPTION_ERROR("xfs_iformat(2)", XFS_ERRLEVEL_LOW,
 530                                     ip->i_mount, dip);
 531                return XFS_ERROR(EFSCORRUPTED);
 532        }
 533
 534        if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) &&
 535                     !ip->i_mount->m_rtdev_targp)) {
 536                xfs_warn(ip->i_mount,
 537                        "corrupt dinode %Lu, has realtime flag set.",
 538                        ip->i_ino);
 539                XFS_CORRUPTION_ERROR("xfs_iformat(realtime)",
 540                                     XFS_ERRLEVEL_LOW, ip->i_mount, dip);
 541                return XFS_ERROR(EFSCORRUPTED);
 542        }
 543
 544        switch (ip->i_d.di_mode & S_IFMT) {
 545        case S_IFIFO:
 546        case S_IFCHR:
 547        case S_IFBLK:
 548        case S_IFSOCK:
 549                if (unlikely(dip->di_format != XFS_DINODE_FMT_DEV)) {
 550                        XFS_CORRUPTION_ERROR("xfs_iformat(3)", XFS_ERRLEVEL_LOW,
 551                                              ip->i_mount, dip);
 552                        return XFS_ERROR(EFSCORRUPTED);
 553                }
 554                ip->i_d.di_size = 0;
 555                ip->i_df.if_u2.if_rdev = xfs_dinode_get_rdev(dip);
 556                break;
 557
 558        case S_IFREG:
 559        case S_IFLNK:
 560        case S_IFDIR:
 561                switch (dip->di_format) {
 562                case XFS_DINODE_FMT_LOCAL:
 563                        /*
 564                         * no local regular files yet
 565                         */
 566                        if (unlikely(S_ISREG(be16_to_cpu(dip->di_mode)))) {
 567                                xfs_warn(ip->i_mount,
 568                        "corrupt inode %Lu (local format for regular file).",
 569                                        (unsigned long long) ip->i_ino);
 570                                XFS_CORRUPTION_ERROR("xfs_iformat(4)",
 571                                                     XFS_ERRLEVEL_LOW,
 572                                                     ip->i_mount, dip);
 573                                return XFS_ERROR(EFSCORRUPTED);
 574                        }
 575
 576                        di_size = be64_to_cpu(dip->di_size);
 577                        if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) {
 578                                xfs_warn(ip->i_mount,
 579                        "corrupt inode %Lu (bad size %Ld for local inode).",
 580                                        (unsigned long long) ip->i_ino,
 581                                        (long long) di_size);
 582                                XFS_CORRUPTION_ERROR("xfs_iformat(5)",
 583                                                     XFS_ERRLEVEL_LOW,
 584                                                     ip->i_mount, dip);
 585                                return XFS_ERROR(EFSCORRUPTED);
 586                        }
 587
 588                        size = (int)di_size;
 589                        error = xfs_iformat_local(ip, dip, XFS_DATA_FORK, size);
 590                        break;
 591                case XFS_DINODE_FMT_EXTENTS:
 592                        error = xfs_iformat_extents(ip, dip, XFS_DATA_FORK);
 593                        break;
 594                case XFS_DINODE_FMT_BTREE:
 595                        error = xfs_iformat_btree(ip, dip, XFS_DATA_FORK);
 596                        break;
 597                default:
 598                        XFS_ERROR_REPORT("xfs_iformat(6)", XFS_ERRLEVEL_LOW,
 599                                         ip->i_mount);
 600                        return XFS_ERROR(EFSCORRUPTED);
 601                }
 602                break;
 603
 604        default:
 605                XFS_ERROR_REPORT("xfs_iformat(7)", XFS_ERRLEVEL_LOW, ip->i_mount);
 606                return XFS_ERROR(EFSCORRUPTED);
 607        }
 608        if (error) {
 609                return error;
 610        }
 611        if (!XFS_DFORK_Q(dip))
 612                return 0;
 613
 614        ASSERT(ip->i_afp == NULL);
 615        ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP | KM_NOFS);
 616
 617        switch (dip->di_aformat) {
 618        case XFS_DINODE_FMT_LOCAL:
 619                atp = (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip);
 620                size = be16_to_cpu(atp->hdr.totsize);
 621
 622                if (unlikely(size < sizeof(struct xfs_attr_sf_hdr))) {
 623                        xfs_warn(ip->i_mount,
 624                                "corrupt inode %Lu (bad attr fork size %Ld).",
 625                                (unsigned long long) ip->i_ino,
 626                                (long long) size);
 627                        XFS_CORRUPTION_ERROR("xfs_iformat(8)",
 628                                             XFS_ERRLEVEL_LOW,
 629                                             ip->i_mount, dip);
 630                        return XFS_ERROR(EFSCORRUPTED);
 631                }
 632
 633                error = xfs_iformat_local(ip, dip, XFS_ATTR_FORK, size);
 634                break;
 635        case XFS_DINODE_FMT_EXTENTS:
 636                error = xfs_iformat_extents(ip, dip, XFS_ATTR_FORK);
 637                break;
 638        case XFS_DINODE_FMT_BTREE:
 639                error = xfs_iformat_btree(ip, dip, XFS_ATTR_FORK);
 640                break;
 641        default:
 642                error = XFS_ERROR(EFSCORRUPTED);
 643                break;
 644        }
 645        if (error) {
 646                kmem_zone_free(xfs_ifork_zone, ip->i_afp);
 647                ip->i_afp = NULL;
 648                xfs_idestroy_fork(ip, XFS_DATA_FORK);
 649        }
 650        return error;
 651}
 652
 653/*
 654 * The file is in-lined in the on-disk inode.
 655 * If it fits into if_inline_data, then copy
 656 * it there, otherwise allocate a buffer for it
 657 * and copy the data there.  Either way, set
 658 * if_data to point at the data.
 659 * If we allocate a buffer for the data, make
 660 * sure that its size is a multiple of 4 and
 661 * record the real size in i_real_bytes.
 662 */
 663STATIC int
 664xfs_iformat_local(
 665        xfs_inode_t     *ip,
 666        xfs_dinode_t    *dip,
 667        int             whichfork,
 668        int             size)
 669{
 670        xfs_ifork_t     *ifp;
 671        int             real_size;
 672
 673        /*
 674         * If the size is unreasonable, then something
 675         * is wrong and we just bail out rather than crash in
 676         * kmem_alloc() or memcpy() below.
 677         */
 678        if (unlikely(size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) {
 679                xfs_warn(ip->i_mount,
 680        "corrupt inode %Lu (bad size %d for local fork, size = %d).",
 681                        (unsigned long long) ip->i_ino, size,
 682                        XFS_DFORK_SIZE(dip, ip->i_mount, whichfork));
 683                XFS_CORRUPTION_ERROR("xfs_iformat_local", XFS_ERRLEVEL_LOW,
 684                                     ip->i_mount, dip);
 685                return XFS_ERROR(EFSCORRUPTED);
 686        }
 687        ifp = XFS_IFORK_PTR(ip, whichfork);
 688        real_size = 0;
 689        if (size == 0)
 690                ifp->if_u1.if_data = NULL;
 691        else if (size <= sizeof(ifp->if_u2.if_inline_data))
 692                ifp->if_u1.if_data = ifp->if_u2.if_inline_data;
 693        else {
 694                real_size = roundup(size, 4);
 695                ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP | KM_NOFS);
 696        }
 697        ifp->if_bytes = size;
 698        ifp->if_real_bytes = real_size;
 699        if (size)
 700                memcpy(ifp->if_u1.if_data, XFS_DFORK_PTR(dip, whichfork), size);
 701        ifp->if_flags &= ~XFS_IFEXTENTS;
 702        ifp->if_flags |= XFS_IFINLINE;
 703        return 0;
 704}
 705
 706/*
 707 * The file consists of a set of extents all
 708 * of which fit into the on-disk inode.
 709 * If there are few enough extents to fit into
 710 * the if_inline_ext, then copy them there.
 711 * Otherwise allocate a buffer for them and copy
 712 * them into it.  Either way, set if_extents
 713 * to point at the extents.
 714 */
 715STATIC int
 716xfs_iformat_extents(
 717        xfs_inode_t     *ip,
 718        xfs_dinode_t    *dip,
 719        int             whichfork)
 720{
 721        xfs_bmbt_rec_t  *dp;
 722        xfs_ifork_t     *ifp;
 723        int             nex;
 724        int             size;
 725        int             i;
 726
 727        ifp = XFS_IFORK_PTR(ip, whichfork);
 728        nex = XFS_DFORK_NEXTENTS(dip, whichfork);
 729        size = nex * (uint)sizeof(xfs_bmbt_rec_t);
 730
 731        /*
 732         * If the number of extents is unreasonable, then something
 733         * is wrong and we just bail out rather than crash in
 734         * kmem_alloc() or memcpy() below.
 735         */
 736        if (unlikely(size < 0 || size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) {
 737                xfs_warn(ip->i_mount, "corrupt inode %Lu ((a)extents = %d).",
 738                        (unsigned long long) ip->i_ino, nex);
 739                XFS_CORRUPTION_ERROR("xfs_iformat_extents(1)", XFS_ERRLEVEL_LOW,
 740                                     ip->i_mount, dip);
 741                return XFS_ERROR(EFSCORRUPTED);
 742        }
 743
 744        ifp->if_real_bytes = 0;
 745        if (nex == 0)
 746                ifp->if_u1.if_extents = NULL;
 747        else if (nex <= XFS_INLINE_EXTS)
 748                ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext;
 749        else
 750                xfs_iext_add(ifp, 0, nex);
 751
 752        ifp->if_bytes = size;
 753        if (size) {
 754                dp = (xfs_bmbt_rec_t *) XFS_DFORK_PTR(dip, whichfork);
 755                xfs_validate_extents(ifp, nex, XFS_EXTFMT_INODE(ip));
 756                for (i = 0; i < nex; i++, dp++) {
 757                        xfs_bmbt_rec_host_t *ep = xfs_iext_get_ext(ifp, i);
 758                        ep->l0 = get_unaligned_be64(&dp->l0);
 759                        ep->l1 = get_unaligned_be64(&dp->l1);
 760                }
 761                XFS_BMAP_TRACE_EXLIST(ip, nex, whichfork);
 762                if (whichfork != XFS_DATA_FORK ||
 763                        XFS_EXTFMT_INODE(ip) == XFS_EXTFMT_NOSTATE)
 764                                if (unlikely(xfs_check_nostate_extents(
 765                                    ifp, 0, nex))) {
 766                                        XFS_ERROR_REPORT("xfs_iformat_extents(2)",
 767                                                         XFS_ERRLEVEL_LOW,
 768                                                         ip->i_mount);
 769                                        return XFS_ERROR(EFSCORRUPTED);
 770                                }
 771        }
 772        ifp->if_flags |= XFS_IFEXTENTS;
 773        return 0;
 774}
 775
 776/*
 777 * The file has too many extents to fit into
 778 * the inode, so they are in B-tree format.
 779 * Allocate a buffer for the root of the B-tree
 780 * and copy the root into it.  The i_extents
 781 * field will remain NULL until all of the
 782 * extents are read in (when they are needed).
 783 */
 784STATIC int
 785xfs_iformat_btree(
 786        xfs_inode_t             *ip,
 787        xfs_dinode_t            *dip,
 788        int                     whichfork)
 789{
 790        struct xfs_mount        *mp = ip->i_mount;
 791        xfs_bmdr_block_t        *dfp;
 792        xfs_ifork_t             *ifp;
 793        /* REFERENCED */
 794        int                     nrecs;
 795        int                     size;
 796
 797        ifp = XFS_IFORK_PTR(ip, whichfork);
 798        dfp = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork);
 799        size = XFS_BMAP_BROOT_SPACE(mp, dfp);
 800        nrecs = be16_to_cpu(dfp->bb_numrecs);
 801
 802        /*
 803         * blow out if -- fork has less extents than can fit in
 804         * fork (fork shouldn't be a btree format), root btree
 805         * block has more records than can fit into the fork,
 806         * or the number of extents is greater than the number of
 807         * blocks.
 808         */
 809        if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <=
 810                                        XFS_IFORK_MAXEXT(ip, whichfork) ||
 811                     XFS_BMDR_SPACE_CALC(nrecs) >
 812                                        XFS_DFORK_SIZE(dip, mp, whichfork) ||
 813                     XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) {
 814                xfs_warn(mp, "corrupt inode %Lu (btree).",
 815                                        (unsigned long long) ip->i_ino);
 816                XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW,
 817                                         mp, dip);
 818                return XFS_ERROR(EFSCORRUPTED);
 819        }
 820
 821        ifp->if_broot_bytes = size;
 822        ifp->if_broot = kmem_alloc(size, KM_SLEEP | KM_NOFS);
 823        ASSERT(ifp->if_broot != NULL);
 824        /*
 825         * Copy and convert from the on-disk structure
 826         * to the in-memory structure.
 827         */
 828        xfs_bmdr_to_bmbt(ip, dfp, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork),
 829                         ifp->if_broot, size);
 830        ifp->if_flags &= ~XFS_IFEXTENTS;
 831        ifp->if_flags |= XFS_IFBROOT;
 832
 833        return 0;
 834}
 835
 836STATIC void
 837xfs_dinode_from_disk(
 838        xfs_icdinode_t          *to,
 839        xfs_dinode_t            *from)
 840{
 841        to->di_magic = be16_to_cpu(from->di_magic);
 842        to->di_mode = be16_to_cpu(from->di_mode);
 843        to->di_version = from ->di_version;
 844        to->di_format = from->di_format;
 845        to->di_onlink = be16_to_cpu(from->di_onlink);
 846        to->di_uid = be32_to_cpu(from->di_uid);
 847        to->di_gid = be32_to_cpu(from->di_gid);
 848        to->di_nlink = be32_to_cpu(from->di_nlink);
 849        to->di_projid_lo = be16_to_cpu(from->di_projid_lo);
 850        to->di_projid_hi = be16_to_cpu(from->di_projid_hi);
 851        memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
 852        to->di_flushiter = be16_to_cpu(from->di_flushiter);
 853        to->di_atime.t_sec = be32_to_cpu(from->di_atime.t_sec);
 854        to->di_atime.t_nsec = be32_to_cpu(from->di_atime.t_nsec);
 855        to->di_mtime.t_sec = be32_to_cpu(from->di_mtime.t_sec);
 856        to->di_mtime.t_nsec = be32_to_cpu(from->di_mtime.t_nsec);
 857        to->di_ctime.t_sec = be32_to_cpu(from->di_ctime.t_sec);
 858        to->di_ctime.t_nsec = be32_to_cpu(from->di_ctime.t_nsec);
 859        to->di_size = be64_to_cpu(from->di_size);
 860        to->di_nblocks = be64_to_cpu(from->di_nblocks);
 861        to->di_extsize = be32_to_cpu(from->di_extsize);
 862        to->di_nextents = be32_to_cpu(from->di_nextents);
 863        to->di_anextents = be16_to_cpu(from->di_anextents);
 864        to->di_forkoff = from->di_forkoff;
 865        to->di_aformat  = from->di_aformat;
 866        to->di_dmevmask = be32_to_cpu(from->di_dmevmask);
 867        to->di_dmstate  = be16_to_cpu(from->di_dmstate);
 868        to->di_flags    = be16_to_cpu(from->di_flags);
 869        to->di_gen      = be32_to_cpu(from->di_gen);
 870
 871        if (to->di_version == 3) {
 872                to->di_changecount = be64_to_cpu(from->di_changecount);
 873                to->di_crtime.t_sec = be32_to_cpu(from->di_crtime.t_sec);
 874                to->di_crtime.t_nsec = be32_to_cpu(from->di_crtime.t_nsec);
 875                to->di_flags2 = be64_to_cpu(from->di_flags2);
 876                to->di_ino = be64_to_cpu(from->di_ino);
 877                to->di_lsn = be64_to_cpu(from->di_lsn);
 878                memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2));
 879                uuid_copy(&to->di_uuid, &from->di_uuid);
 880        }
 881}
 882
 883void
 884xfs_dinode_to_disk(
 885        xfs_dinode_t            *to,
 886        xfs_icdinode_t          *from)
 887{
 888        to->di_magic = cpu_to_be16(from->di_magic);
 889        to->di_mode = cpu_to_be16(from->di_mode);
 890        to->di_version = from ->di_version;
 891        to->di_format = from->di_format;
 892        to->di_onlink = cpu_to_be16(from->di_onlink);
 893        to->di_uid = cpu_to_be32(from->di_uid);
 894        to->di_gid = cpu_to_be32(from->di_gid);
 895        to->di_nlink = cpu_to_be32(from->di_nlink);
 896        to->di_projid_lo = cpu_to_be16(from->di_projid_lo);
 897        to->di_projid_hi = cpu_to_be16(from->di_projid_hi);
 898        memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
 899        to->di_atime.t_sec = cpu_to_be32(from->di_atime.t_sec);
 900        to->di_atime.t_nsec = cpu_to_be32(from->di_atime.t_nsec);
 901        to->di_mtime.t_sec = cpu_to_be32(from->di_mtime.t_sec);
 902        to->di_mtime.t_nsec = cpu_to_be32(from->di_mtime.t_nsec);
 903        to->di_ctime.t_sec = cpu_to_be32(from->di_ctime.t_sec);
 904        to->di_ctime.t_nsec = cpu_to_be32(from->di_ctime.t_nsec);
 905        to->di_size = cpu_to_be64(from->di_size);
 906        to->di_nblocks = cpu_to_be64(from->di_nblocks);
 907        to->di_extsize = cpu_to_be32(from->di_extsize);
 908        to->di_nextents = cpu_to_be32(from->di_nextents);
 909        to->di_anextents = cpu_to_be16(from->di_anextents);
 910        to->di_forkoff = from->di_forkoff;
 911        to->di_aformat = from->di_aformat;
 912        to->di_dmevmask = cpu_to_be32(from->di_dmevmask);
 913        to->di_dmstate = cpu_to_be16(from->di_dmstate);
 914        to->di_flags = cpu_to_be16(from->di_flags);
 915        to->di_gen = cpu_to_be32(from->di_gen);
 916
 917        if (from->di_version == 3) {
 918                to->di_changecount = cpu_to_be64(from->di_changecount);
 919                to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec);
 920                to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec);
 921                to->di_flags2 = cpu_to_be64(from->di_flags2);
 922                to->di_ino = cpu_to_be64(from->di_ino);
 923                to->di_lsn = cpu_to_be64(from->di_lsn);
 924                memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2));
 925                uuid_copy(&to->di_uuid, &from->di_uuid);
 926                to->di_flushiter = 0;
 927        } else {
 928                to->di_flushiter = cpu_to_be16(from->di_flushiter);
 929        }
 930}
 931
 932STATIC uint
 933_xfs_dic2xflags(
 934        __uint16_t              di_flags)
 935{
 936        uint                    flags = 0;
 937
 938        if (di_flags & XFS_DIFLAG_ANY) {
 939                if (di_flags & XFS_DIFLAG_REALTIME)
 940                        flags |= XFS_XFLAG_REALTIME;
 941                if (di_flags & XFS_DIFLAG_PREALLOC)
 942                        flags |= XFS_XFLAG_PREALLOC;
 943                if (di_flags & XFS_DIFLAG_IMMUTABLE)
 944                        flags |= XFS_XFLAG_IMMUTABLE;
 945                if (di_flags & XFS_DIFLAG_APPEND)
 946                        flags |= XFS_XFLAG_APPEND;
 947                if (di_flags & XFS_DIFLAG_SYNC)
 948                        flags |= XFS_XFLAG_SYNC;
 949                if (di_flags & XFS_DIFLAG_NOATIME)
 950                        flags |= XFS_XFLAG_NOATIME;
 951                if (di_flags & XFS_DIFLAG_NODUMP)
 952                        flags |= XFS_XFLAG_NODUMP;
 953                if (di_flags & XFS_DIFLAG_RTINHERIT)
 954                        flags |= XFS_XFLAG_RTINHERIT;
 955                if (di_flags & XFS_DIFLAG_PROJINHERIT)
 956                        flags |= XFS_XFLAG_PROJINHERIT;
 957                if (di_flags & XFS_DIFLAG_NOSYMLINKS)
 958                        flags |= XFS_XFLAG_NOSYMLINKS;
 959                if (di_flags & XFS_DIFLAG_EXTSIZE)
 960                        flags |= XFS_XFLAG_EXTSIZE;
 961                if (di_flags & XFS_DIFLAG_EXTSZINHERIT)
 962                        flags |= XFS_XFLAG_EXTSZINHERIT;
 963                if (di_flags & XFS_DIFLAG_NODEFRAG)
 964                        flags |= XFS_XFLAG_NODEFRAG;
 965                if (di_flags & XFS_DIFLAG_FILESTREAM)
 966                        flags |= XFS_XFLAG_FILESTREAM;
 967        }
 968
 969        return flags;
 970}
 971
 972uint
 973xfs_ip2xflags(
 974        xfs_inode_t             *ip)
 975{
 976        xfs_icdinode_t          *dic = &ip->i_d;
 977
 978        return _xfs_dic2xflags(dic->di_flags) |
 979                                (XFS_IFORK_Q(ip) ? XFS_XFLAG_HASATTR : 0);
 980}
 981
 982uint
 983xfs_dic2xflags(
 984        xfs_dinode_t            *dip)
 985{
 986        return _xfs_dic2xflags(be16_to_cpu(dip->di_flags)) |
 987                                (XFS_DFORK_Q(dip) ? XFS_XFLAG_HASATTR : 0);
 988}
 989
 990static bool
 991xfs_dinode_verify(
 992        struct xfs_mount        *mp,
 993        struct xfs_inode        *ip,
 994        struct xfs_dinode       *dip)
 995{
 996        if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC))
 997                return false;
 998
 999        /* only version 3 or greater inodes are extensively verified here */
1000        if (dip->di_version < 3)
1001                return true;
1002
1003        if (!xfs_sb_version_hascrc(&mp->m_sb))
1004                return false;
1005        if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize,
1006                              offsetof(struct xfs_dinode, di_crc)))
1007                return false;
1008        if (be64_to_cpu(dip->di_ino) != ip->i_ino)
1009                return false;
1010        if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_uuid))
1011                return false;
1012        return true;
1013}
1014
1015void
1016xfs_dinode_calc_crc(
1017        struct xfs_mount        *mp,
1018        struct xfs_dinode       *dip)
1019{
1020        __uint32_t              crc;
1021
1022        if (dip->di_version < 3)
1023                return;
1024
1025        ASSERT(xfs_sb_version_hascrc(&mp->m_sb));
1026        crc = xfs_start_cksum((char *)dip, mp->m_sb.sb_inodesize,
1027                              offsetof(struct xfs_dinode, di_crc));
1028        dip->di_crc = xfs_end_cksum(crc);
1029}
1030
1031/*
1032 * Read the disk inode attributes into the in-core inode structure.
1033 *
1034 * For version 5 superblocks, if we are initialising a new inode and we are not
1035 * utilising the XFS_MOUNT_IKEEP inode cluster mode, we can simple build the new
1036 * inode core with a random generation number. If we are keeping inodes around,
1037 * we need to read the inode cluster to get the existing generation number off
1038 * disk. Further, if we are using version 4 superblocks (i.e. v1/v2 inode
1039 * format) then log recovery is dependent on the di_flushiter field being
1040 * initialised from the current on-disk value and hence we must also read the
1041 * inode off disk.
1042 */
1043int
1044xfs_iread(
1045        xfs_mount_t     *mp,
1046        xfs_trans_t     *tp,
1047        xfs_inode_t     *ip,
1048        uint            iget_flags)
1049{
1050        xfs_buf_t       *bp;
1051        xfs_dinode_t    *dip;
1052        int             error;
1053
1054        /*
1055         * Fill in the location information in the in-core inode.
1056         */
1057        error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags);
1058        if (error)
1059                return error;
1060
1061        /* shortcut IO on inode allocation if possible */
1062        if ((iget_flags & XFS_IGET_CREATE) &&
1063            xfs_sb_version_hascrc(&mp->m_sb) &&
1064            !(mp->m_flags & XFS_MOUNT_IKEEP)) {
1065                /* initialise the on-disk inode core */
1066                memset(&ip->i_d, 0, sizeof(ip->i_d));
1067                ip->i_d.di_magic = XFS_DINODE_MAGIC;
1068                ip->i_d.di_gen = prandom_u32();
1069                if (xfs_sb_version_hascrc(&mp->m_sb)) {
1070                        ip->i_d.di_version = 3;
1071                        ip->i_d.di_ino = ip->i_ino;
1072                        uuid_copy(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid);
1073                } else
1074                        ip->i_d.di_version = 2;
1075                return 0;
1076        }
1077
1078        /*
1079         * Get pointers to the on-disk inode and the buffer containing it.
1080         */
1081        error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &bp, 0, iget_flags);
1082        if (error)
1083                return error;
1084
1085        /* even unallocated inodes are verified */
1086        if (!xfs_dinode_verify(mp, ip, dip)) {
1087                xfs_alert(mp, "%s: validation failed for inode %lld failed",
1088                                __func__, ip->i_ino);
1089
1090                XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, dip);
1091                error = XFS_ERROR(EFSCORRUPTED);
1092                goto out_brelse;
1093        }
1094
1095        /*
1096         * If the on-disk inode is already linked to a directory
1097         * entry, copy all of the inode into the in-core inode.
1098         * xfs_iformat() handles copying in the inode format
1099         * specific information.
1100         * Otherwise, just get the truly permanent information.
1101         */
1102        if (dip->di_mode) {
1103                xfs_dinode_from_disk(&ip->i_d, dip);
1104                error = xfs_iformat(ip, dip);
1105                if (error)  {
1106#ifdef DEBUG
1107                        xfs_alert(mp, "%s: xfs_iformat() returned error %d",
1108                                __func__, error);
1109#endif /* DEBUG */
1110                        goto out_brelse;
1111                }
1112        } else {
1113                /*
1114                 * Partial initialisation of the in-core inode. Just the bits
1115                 * that xfs_ialloc won't overwrite or relies on being correct.
1116                 */
1117                ip->i_d.di_magic = be16_to_cpu(dip->di_magic);
1118                ip->i_d.di_version = dip->di_version;
1119                ip->i_d.di_gen = be32_to_cpu(dip->di_gen);
1120                ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter);
1121
1122                if (dip->di_version == 3) {
1123                        ip->i_d.di_ino = be64_to_cpu(dip->di_ino);
1124                        uuid_copy(&ip->i_d.di_uuid, &dip->di_uuid);
1125                }
1126
1127                /*
1128                 * Make sure to pull in the mode here as well in
1129                 * case the inode is released without being used.
1130                 * This ensures that xfs_inactive() will see that
1131                 * the inode is already free and not try to mess
1132                 * with the uninitialized part of it.
1133                 */
1134                ip->i_d.di_mode = 0;
1135        }
1136
1137        /*
1138         * The inode format changed when we moved the link count and
1139         * made it 32 bits long.  If this is an old format inode,
1140         * convert it in memory to look like a new one.  If it gets
1141         * flushed to disk we will convert back before flushing or
1142         * logging it.  We zero out the new projid field and the old link
1143         * count field.  We'll handle clearing the pad field (the remains
1144         * of the old uuid field) when we actually convert the inode to
1145         * the new format. We don't change the version number so that we
1146         * can distinguish this from a real new format inode.
1147         */
1148        if (ip->i_d.di_version == 1) {
1149                ip->i_d.di_nlink = ip->i_d.di_onlink;
1150                ip->i_d.di_onlink = 0;
1151                xfs_set_projid(ip, 0);
1152        }
1153
1154        ip->i_delayed_blks = 0;
1155
1156        /*
1157         * Mark the buffer containing the inode as something to keep
1158         * around for a while.  This helps to keep recently accessed
1159         * meta-data in-core longer.
1160         */
1161        xfs_buf_set_ref(bp, XFS_INO_REF);
1162
1163        /*
1164         * Use xfs_trans_brelse() to release the buffer containing the on-disk
1165         * inode, because it was acquired with xfs_trans_read_buf() in
1166         * xfs_imap_to_bp() above.  If tp is NULL, this is just a normal
1167         * brelse().  If we're within a transaction, then xfs_trans_brelse()
1168         * will only release the buffer if it is not dirty within the
1169         * transaction.  It will be OK to release the buffer in this case,
1170         * because inodes on disk are never destroyed and we will be locking the
1171         * new in-core inode before putting it in the cache where other
1172         * processes can find it.  Thus we don't have to worry about the inode
1173         * being changed just because we released the buffer.
1174         */
1175 out_brelse:
1176        xfs_trans_brelse(tp, bp);
1177        return error;
1178}
1179
1180/*
1181 * Read in extents from a btree-format inode.
1182 * Allocate and fill in if_extents.  Real work is done in xfs_bmap.c.
1183 */
1184int
1185xfs_iread_extents(
1186        xfs_trans_t     *tp,
1187        xfs_inode_t     *ip,
1188        int             whichfork)
1189{
1190        int             error;
1191        xfs_ifork_t     *ifp;
1192        xfs_extnum_t    nextents;
1193
1194        if (unlikely(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)) {
1195                XFS_ERROR_REPORT("xfs_iread_extents", XFS_ERRLEVEL_LOW,
1196                                 ip->i_mount);
1197                return XFS_ERROR(EFSCORRUPTED);
1198        }
1199        nextents = XFS_IFORK_NEXTENTS(ip, whichfork);
1200        ifp = XFS_IFORK_PTR(ip, whichfork);
1201
1202        /*
1203         * We know that the size is valid (it's checked in iformat_btree)
1204         */
1205        ifp->if_bytes = ifp->if_real_bytes = 0;
1206        ifp->if_flags |= XFS_IFEXTENTS;
1207        xfs_iext_add(ifp, 0, nextents);
1208        error = xfs_bmap_read_extents(tp, ip, whichfork);
1209        if (error) {
1210                xfs_iext_destroy(ifp);
1211                ifp->if_flags &= ~XFS_IFEXTENTS;
1212                return error;
1213        }
1214        xfs_validate_extents(ifp, nextents, XFS_EXTFMT_INODE(ip));
1215        return 0;
1216}
1217
1218/*
1219 * Allocate an inode on disk and return a copy of its in-core version.
1220 * The in-core inode is locked exclusively.  Set mode, nlink, and rdev
1221 * appropriately within the inode.  The uid and gid for the inode are
1222 * set according to the contents of the given cred structure.
1223 *
1224 * Use xfs_dialloc() to allocate the on-disk inode. If xfs_dialloc()
1225 * has a free inode available, call xfs_iget() to obtain the in-core
1226 * version of the allocated inode.  Finally, fill in the inode and
1227 * log its initial contents.  In this case, ialloc_context would be
1228 * set to NULL.
1229 *
1230 * If xfs_dialloc() does not have an available inode, it will replenish
1231 * its supply by doing an allocation. Since we can only do one
1232 * allocation within a transaction without deadlocks, we must commit
1233 * the current transaction before returning the inode itself.
1234 * In this case, therefore, we will set ialloc_context and return.
1235 * The caller should then commit the current transaction, start a new
1236 * transaction, and call xfs_ialloc() again to actually get the inode.
1237 *
1238 * To ensure that some other process does not grab the inode that
1239 * was allocated during the first call to xfs_ialloc(), this routine
1240 * also returns the [locked] bp pointing to the head of the freelist
1241 * as ialloc_context.  The caller should hold this buffer across
1242 * the commit and pass it back into this routine on the second call.
1243 *
1244 * If we are allocating quota inodes, we do not have a parent inode
1245 * to attach to or associate with (i.e. pip == NULL) because they
1246 * are not linked into the directory structure - they are attached
1247 * directly to the superblock - and so have no parent.
1248 */
1249int
1250xfs_ialloc(
1251        xfs_trans_t     *tp,
1252        xfs_inode_t     *pip,
1253        umode_t         mode,
1254        xfs_nlink_t     nlink,
1255        xfs_dev_t       rdev,
1256        prid_t          prid,
1257        int             okalloc,
1258        xfs_buf_t       **ialloc_context,
1259        xfs_inode_t     **ipp)
1260{
1261        struct xfs_mount *mp = tp->t_mountp;
1262        xfs_ino_t       ino;
1263        xfs_inode_t     *ip;
1264        uint            flags;
1265        int             error;
1266        timespec_t      tv;
1267        int             filestreams = 0;
1268
1269        /*
1270         * Call the space management code to pick
1271         * the on-disk inode to be allocated.
1272         */
1273        error = xfs_dialloc(tp, pip ? pip->i_ino : 0, mode, okalloc,
1274                            ialloc_context, &ino);
1275        if (error)
1276                return error;
1277        if (*ialloc_context || ino == NULLFSINO) {
1278                *ipp = NULL;
1279                return 0;
1280        }
1281        ASSERT(*ialloc_context == NULL);
1282
1283        /*
1284         * Get the in-core inode with the lock held exclusively.
1285         * This is because we're setting fields here we need
1286         * to prevent others from looking at until we're done.
1287         */
1288        error = xfs_iget(mp, tp, ino, XFS_IGET_CREATE,
1289                         XFS_ILOCK_EXCL, &ip);
1290        if (error)
1291                return error;
1292        ASSERT(ip != NULL);
1293
1294        ip->i_d.di_mode = mode;
1295        ip->i_d.di_onlink = 0;
1296        ip->i_d.di_nlink = nlink;
1297        ASSERT(ip->i_d.di_nlink == nlink);
1298        ip->i_d.di_uid = current_fsuid();
1299        ip->i_d.di_gid = current_fsgid();
1300        xfs_set_projid(ip, prid);
1301        memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
1302
1303        /*
1304         * If the superblock version is up to where we support new format
1305         * inodes and this is currently an old format inode, then change
1306         * the inode version number now.  This way we only do the conversion
1307         * here rather than here and in the flush/logging code.
1308         */
1309        if (xfs_sb_version_hasnlink(&mp->m_sb) &&
1310            ip->i_d.di_version == 1) {
1311                ip->i_d.di_version = 2;
1312                /*
1313                 * We've already zeroed the old link count, the projid field,
1314                 * and the pad field.
1315                 */
1316        }
1317
1318        /*
1319         * Project ids won't be stored on disk if we are using a version 1 inode.
1320         */
1321        if ((prid != 0) && (ip->i_d.di_version == 1))
1322                xfs_bump_ino_vers2(tp, ip);
1323
1324        if (pip && XFS_INHERIT_GID(pip)) {
1325                ip->i_d.di_gid = pip->i_d.di_gid;
1326                if ((pip->i_d.di_mode & S_ISGID) && S_ISDIR(mode)) {
1327                        ip->i_d.di_mode |= S_ISGID;
1328                }
1329        }
1330
1331        /*
1332         * If the group ID of the new file does not match the effective group
1333         * ID or one of the supplementary group IDs, the S_ISGID bit is cleared
1334         * (and only if the irix_sgid_inherit compatibility variable is set).
1335         */
1336        if ((irix_sgid_inherit) &&
1337            (ip->i_d.di_mode & S_ISGID) &&
1338            (!in_group_p((gid_t)ip->i_d.di_gid))) {
1339                ip->i_d.di_mode &= ~S_ISGID;
1340        }
1341
1342        ip->i_d.di_size = 0;
1343        ip->i_d.di_nextents = 0;
1344        ASSERT(ip->i_d.di_nblocks == 0);
1345
1346        nanotime(&tv);
1347        ip->i_d.di_mtime.t_sec = (__int32_t)tv.tv_sec;
1348        ip->i_d.di_mtime.t_nsec = (__int32_t)tv.tv_nsec;
1349        ip->i_d.di_atime = ip->i_d.di_mtime;
1350        ip->i_d.di_ctime = ip->i_d.di_mtime;
1351
1352        /*
1353         * di_gen will have been taken care of in xfs_iread.
1354         */
1355        ip->i_d.di_extsize = 0;
1356        ip->i_d.di_dmevmask = 0;
1357        ip->i_d.di_dmstate = 0;
1358        ip->i_d.di_flags = 0;
1359
1360        if (ip->i_d.di_version == 3) {
1361                ASSERT(ip->i_d.di_ino == ino);
1362                ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid));
1363                ip->i_d.di_crc = 0;
1364                ip->i_d.di_changecount = 1;
1365                ip->i_d.di_lsn = 0;
1366                ip->i_d.di_flags2 = 0;
1367                memset(&(ip->i_d.di_pad2[0]), 0, sizeof(ip->i_d.di_pad2));
1368                ip->i_d.di_crtime = ip->i_d.di_mtime;
1369        }
1370
1371
1372        flags = XFS_ILOG_CORE;
1373        switch (mode & S_IFMT) {
1374        case S_IFIFO:
1375        case S_IFCHR:
1376        case S_IFBLK:
1377        case S_IFSOCK:
1378                ip->i_d.di_format = XFS_DINODE_FMT_DEV;
1379                ip->i_df.if_u2.if_rdev = rdev;
1380                ip->i_df.if_flags = 0;
1381                flags |= XFS_ILOG_DEV;
1382                break;
1383        case S_IFREG:
1384                /*
1385                 * we can't set up filestreams until after the VFS inode
1386                 * is set up properly.
1387                 */
1388                if (pip && xfs_inode_is_filestream(pip))
1389                        filestreams = 1;
1390                /* fall through */
1391        case S_IFDIR:
1392                if (pip && (pip->i_d.di_flags & XFS_DIFLAG_ANY)) {
1393                        uint    di_flags = 0;
1394
1395                        if (S_ISDIR(mode)) {
1396                                if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT)
1397                                        di_flags |= XFS_DIFLAG_RTINHERIT;
1398                                if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
1399                                        di_flags |= XFS_DIFLAG_EXTSZINHERIT;
1400                                        ip->i_d.di_extsize = pip->i_d.di_extsize;
1401                                }
1402                        } else if (S_ISREG(mode)) {
1403                                if (pip->i_d.di_flags & XFS_DIFLAG_RTINHERIT)
1404                                        di_flags |= XFS_DIFLAG_REALTIME;
1405                                if (pip->i_d.di_flags & XFS_DIFLAG_EXTSZINHERIT) {
1406                                        di_flags |= XFS_DIFLAG_EXTSIZE;
1407                                        ip->i_d.di_extsize = pip->i_d.di_extsize;
1408                                }
1409                        }
1410                        if ((pip->i_d.di_flags & XFS_DIFLAG_NOATIME) &&
1411                            xfs_inherit_noatime)
1412                                di_flags |= XFS_DIFLAG_NOATIME;
1413                        if ((pip->i_d.di_flags & XFS_DIFLAG_NODUMP) &&
1414                            xfs_inherit_nodump)
1415                                di_flags |= XFS_DIFLAG_NODUMP;
1416                        if ((pip->i_d.di_flags & XFS_DIFLAG_SYNC) &&
1417                            xfs_inherit_sync)
1418                                di_flags |= XFS_DIFLAG_SYNC;
1419                        if ((pip->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) &&
1420                            xfs_inherit_nosymlinks)
1421                                di_flags |= XFS_DIFLAG_NOSYMLINKS;
1422                        if (pip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT)
1423                                di_flags |= XFS_DIFLAG_PROJINHERIT;
1424                        if ((pip->i_d.di_flags & XFS_DIFLAG_NODEFRAG) &&
1425                            xfs_inherit_nodefrag)
1426                                di_flags |= XFS_DIFLAG_NODEFRAG;
1427                        if (pip->i_d.di_flags & XFS_DIFLAG_FILESTREAM)
1428                                di_flags |= XFS_DIFLAG_FILESTREAM;
1429                        ip->i_d.di_flags |= di_flags;
1430                }
1431                /* FALLTHROUGH */
1432        case S_IFLNK:
1433                ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS;
1434                ip->i_df.if_flags = XFS_IFEXTENTS;
1435                ip->i_df.if_bytes = ip->i_df.if_real_bytes = 0;
1436                ip->i_df.if_u1.if_extents = NULL;
1437                break;
1438        default:
1439                ASSERT(0);
1440        }
1441        /*
1442         * Attribute fork settings for new inode.
1443         */
1444        ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
1445        ip->i_d.di_anextents = 0;
1446
1447        /*
1448         * Log the new values stuffed into the inode.
1449         */
1450        xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
1451        xfs_trans_log_inode(tp, ip, flags);
1452
1453        /* now that we have an i_mode we can setup inode ops and unlock */
1454        xfs_setup_inode(ip);
1455
1456        /* now we have set up the vfs inode we can associate the filestream */
1457        if (filestreams) {
1458                error = xfs_filestream_associate(pip, ip);
1459                if (error < 0)
1460                        return -error;
1461                if (!error)
1462                        xfs_iflags_set(ip, XFS_IFILESTREAM);
1463        }
1464
1465        *ipp = ip;
1466        return 0;
1467}
1468
1469/*
1470 * Free up the underlying blocks past new_size.  The new size must be smaller
1471 * than the current size.  This routine can be used both for the attribute and
1472 * data fork, and does not modify the inode size, which is left to the caller.
1473 *
1474 * The transaction passed to this routine must have made a permanent log
1475 * reservation of at least XFS_ITRUNCATE_LOG_RES.  This routine may commit the
1476 * given transaction and start new ones, so make sure everything involved in
1477 * the transaction is tidy before calling here.  Some transaction will be
1478 * returned to the caller to be committed.  The incoming transaction must
1479 * already include the inode, and both inode locks must be held exclusively.
1480 * The inode must also be "held" within the transaction.  On return the inode
1481 * will be "held" within the returned transaction.  This routine does NOT
1482 * require any disk space to be reserved for it within the transaction.
1483 *
1484 * If we get an error, we must return with the inode locked and linked into the
1485 * current transaction. This keeps things simple for the higher level code,
1486 * because it always knows that the inode is locked and held in the transaction
1487 * that returns to it whether errors occur or not.  We don't mark the inode
1488 * dirty on error so that transactions can be easily aborted if possible.
1489 */
1490int
1491xfs_itruncate_extents(
1492        struct xfs_trans        **tpp,
1493        struct xfs_inode        *ip,
1494        int                     whichfork,
1495        xfs_fsize_t             new_size)
1496{
1497        struct xfs_mount        *mp = ip->i_mount;
1498        struct xfs_trans        *tp = *tpp;
1499        struct xfs_trans        *ntp;
1500        xfs_bmap_free_t         free_list;
1501        xfs_fsblock_t           first_block;
1502        xfs_fileoff_t           first_unmap_block;
1503        xfs_fileoff_t           last_block;
1504        xfs_filblks_t           unmap_len;
1505        int                     committed;
1506        int                     error = 0;
1507        int                     done = 0;
1508
1509        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
1510        ASSERT(!atomic_read(&VFS_I(ip)->i_count) ||
1511               xfs_isilocked(ip, XFS_IOLOCK_EXCL));
1512        ASSERT(new_size <= XFS_ISIZE(ip));
1513        ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
1514        ASSERT(ip->i_itemp != NULL);
1515        ASSERT(ip->i_itemp->ili_lock_flags == 0);
1516        ASSERT(!XFS_NOT_DQATTACHED(mp, ip));
1517
1518        trace_xfs_itruncate_extents_start(ip, new_size);
1519
1520        /*
1521         * Since it is possible for space to become allocated beyond
1522         * the end of the file (in a crash where the space is allocated
1523         * but the inode size is not yet updated), simply remove any
1524         * blocks which show up between the new EOF and the maximum
1525         * possible file size.  If the first block to be removed is
1526         * beyond the maximum file size (ie it is the same as last_block),
1527         * then there is nothing to do.
1528         */
1529        first_unmap_block = XFS_B_TO_FSB(mp, (xfs_ufsize_t)new_size);
1530        last_block = XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes);
1531        if (first_unmap_block == last_block)
1532                return 0;
1533
1534        ASSERT(first_unmap_block < last_block);
1535        unmap_len = last_block - first_unmap_block + 1;
1536        while (!done) {
1537                xfs_bmap_init(&free_list, &first_block);
1538                error = xfs_bunmapi(tp, ip,
1539                                    first_unmap_block, unmap_len,
1540                                    xfs_bmapi_aflag(whichfork),
1541                                    XFS_ITRUNC_MAX_EXTENTS,
1542                                    &first_block, &free_list,
1543                                    &done);
1544                if (error)
1545                        goto out_bmap_cancel;
1546
1547                /*
1548                 * Duplicate the transaction that has the permanent
1549                 * reservation and commit the old transaction.
1550                 */
1551                error = xfs_bmap_finish(&tp, &free_list, &committed);
1552                if (committed)
1553                        xfs_trans_ijoin(tp, ip, 0);
1554                if (error)
1555                        goto out_bmap_cancel;
1556
1557                if (committed) {
1558                        /*
1559                         * Mark the inode dirty so it will be logged and
1560                         * moved forward in the log as part of every commit.
1561                         */
1562                        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1563                }
1564
1565                ntp = xfs_trans_dup(tp);
1566                error = xfs_trans_commit(tp, 0);
1567                tp = ntp;
1568
1569                xfs_trans_ijoin(tp, ip, 0);
1570
1571                if (error)
1572                        goto out;
1573
1574                /*
1575                 * Transaction commit worked ok so we can drop the extra ticket
1576                 * reference that we gained in xfs_trans_dup()
1577                 */
1578                xfs_log_ticket_put(tp->t_ticket);
1579                error = xfs_trans_reserve(tp, 0,
1580                                        XFS_ITRUNCATE_LOG_RES(mp), 0,
1581                                        XFS_TRANS_PERM_LOG_RES,
1582                                        XFS_ITRUNCATE_LOG_COUNT);
1583                if (error)
1584                        goto out;
1585        }
1586
1587        /*
1588         * Always re-log the inode so that our permanent transaction can keep
1589         * on rolling it forward in the log.
1590         */
1591        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
1592
1593        trace_xfs_itruncate_extents_end(ip, new_size);
1594
1595out:
1596        *tpp = tp;
1597        return error;
1598out_bmap_cancel:
1599        /*
1600         * If the bunmapi call encounters an error, return to the caller where
1601         * the transaction can be properly aborted.  We just need to make sure
1602         * we're not holding any resources that we were not when we came in.
1603         */
1604        xfs_bmap_cancel(&free_list);
1605        goto out;
1606}
1607
1608/*
1609 * This is called when the inode's link count goes to 0.
1610 * We place the on-disk inode on a list in the AGI.  It
1611 * will be pulled from this list when the inode is freed.
1612 */
1613int
1614xfs_iunlink(
1615        xfs_trans_t     *tp,
1616        xfs_inode_t     *ip)
1617{
1618        xfs_mount_t     *mp;
1619        xfs_agi_t       *agi;
1620        xfs_dinode_t    *dip;
1621        xfs_buf_t       *agibp;
1622        xfs_buf_t       *ibp;
1623        xfs_agino_t     agino;
1624        short           bucket_index;
1625        int             offset;
1626        int             error;
1627
1628        ASSERT(ip->i_d.di_nlink == 0);
1629        ASSERT(ip->i_d.di_mode != 0);
1630
1631        mp = tp->t_mountp;
1632
1633        /*
1634         * Get the agi buffer first.  It ensures lock ordering
1635         * on the list.
1636         */
1637        error = xfs_read_agi(mp, tp, XFS_INO_TO_AGNO(mp, ip->i_ino), &agibp);
1638        if (error)
1639                return error;
1640        agi = XFS_BUF_TO_AGI(agibp);
1641
1642        /*
1643         * Get the index into the agi hash table for the
1644         * list this inode will go on.
1645         */
1646        agino = XFS_INO_TO_AGINO(mp, ip->i_ino);
1647        ASSERT(agino != 0);
1648        bucket_index = agino % XFS_AGI_UNLINKED_BUCKETS;
1649        ASSERT(agi->agi_unlinked[bucket_index]);
1650        ASSERT(be32_to_cpu(agi->agi_unlinked[bucket_index]) != agino);
1651
1652        if (agi->agi_unlinked[bucket_index] != cpu_to_be32(NULLAGINO)) {
1653                /*
1654                 * There is already another inode in the bucket we need
1655                 * to add ourselves to.  Add us at the front of the list.
1656                 * Here we put the head pointer into our next pointer,
1657                 * and then we fall through to point the head at us.
1658                 */
1659                error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &ibp,
1660                                       0, 0);
1661                if (error)
1662                        return error;
1663
1664                ASSERT(dip->di_next_unlinked == cpu_to_be32(NULLAGINO));
1665                dip->di_next_unlinked = agi->agi_unlinked[bucket_index];
1666                offset = ip->i_imap.im_boffset +
1667                        offsetof(xfs_dinode_t, di_next_unlinked);
1668
1669                /* need to recalc the inode CRC if appropriate */
1670                xfs_dinode_calc_crc(mp, dip);
1671
1672                xfs_trans_inode_buf(tp, ibp);
1673                xfs_trans_log_buf(tp, ibp, offset,
1674                                  (offset + sizeof(xfs_agino_t) - 1));
1675                xfs_inobp_check(mp, ibp);
1676        }
1677
1678        /*
1679         * Point the bucket head pointer at the inode being inserted.
1680         */
1681        ASSERT(agino != 0);
1682        agi->agi_unlinked[bucket_index] = cpu_to_be32(agino);
1683        offset = offsetof(xfs_agi_t, agi_unlinked) +
1684                (sizeof(xfs_agino_t) * bucket_index);
1685        xfs_trans_log_buf(tp, agibp, offset,
1686                          (offset + sizeof(xfs_agino_t) - 1));
1687        return 0;
1688}
1689
1690/*
1691 * Pull the on-disk inode from the AGI unlinked list.
1692 */
1693STATIC int
1694xfs_iunlink_remove(
1695        xfs_trans_t     *tp,
1696        xfs_inode_t     *ip)
1697{
1698        xfs_ino_t       next_ino;
1699        xfs_mount_t     *mp;
1700        xfs_agi_t       *agi;
1701        xfs_dinode_t    *dip;
1702        xfs_buf_t       *agibp;
1703        xfs_buf_t       *ibp;
1704        xfs_agnumber_t  agno;
1705        xfs_agino_t     agino;
1706        xfs_agino_t     next_agino;
1707        xfs_buf_t       *last_ibp;
1708        xfs_dinode_t    *last_dip = NULL;
1709        short           bucket_index;
1710        int             offset, last_offset = 0;
1711        int             error;
1712
1713        mp = tp->t_mountp;
1714        agno = XFS_INO_TO_AGNO(mp, ip->i_ino);
1715
1716        /*
1717         * Get the agi buffer first.  It ensures lock ordering
1718         * on the list.
1719         */
1720        error = xfs_read_agi(mp, tp, agno, &agibp);
1721        if (error)
1722                return error;
1723
1724        agi = XFS_BUF_TO_AGI(agibp);
1725
1726        /*
1727         * Get the index into the agi hash table for the
1728         * list this inode will go on.
1729         */
1730        agino = XFS_INO_TO_AGINO(mp, ip->i_ino);
1731        ASSERT(agino != 0);
1732        bucket_index = agino % XFS_AGI_UNLINKED_BUCKETS;
1733        ASSERT(agi->agi_unlinked[bucket_index] != cpu_to_be32(NULLAGINO));
1734        ASSERT(agi->agi_unlinked[bucket_index]);
1735
1736        if (be32_to_cpu(agi->agi_unlinked[bucket_index]) == agino) {
1737                /*
1738                 * We're at the head of the list.  Get the inode's on-disk
1739                 * buffer to see if there is anyone after us on the list.
1740                 * Only modify our next pointer if it is not already NULLAGINO.
1741                 * This saves us the overhead of dealing with the buffer when
1742                 * there is no need to change it.
1743                 */
1744                error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &ibp,
1745                                       0, 0);
1746                if (error) {
1747                        xfs_warn(mp, "%s: xfs_imap_to_bp returned error %d.",
1748                                __func__, error);
1749                        return error;
1750                }
1751                next_agino = be32_to_cpu(dip->di_next_unlinked);
1752                ASSERT(next_agino != 0);
1753                if (next_agino != NULLAGINO) {
1754                        dip->di_next_unlinked = cpu_to_be32(NULLAGINO);
1755                        offset = ip->i_imap.im_boffset +
1756                                offsetof(xfs_dinode_t, di_next_unlinked);
1757
1758                        /* need to recalc the inode CRC if appropriate */
1759                        xfs_dinode_calc_crc(mp, dip);
1760
1761                        xfs_trans_inode_buf(tp, ibp);
1762                        xfs_trans_log_buf(tp, ibp, offset,
1763                                          (offset + sizeof(xfs_agino_t) - 1));
1764                        xfs_inobp_check(mp, ibp);
1765                } else {
1766                        xfs_trans_brelse(tp, ibp);
1767                }
1768                /*
1769                 * Point the bucket head pointer at the next inode.
1770                 */
1771                ASSERT(next_agino != 0);
1772                ASSERT(next_agino != agino);
1773                agi->agi_unlinked[bucket_index] = cpu_to_be32(next_agino);
1774                offset = offsetof(xfs_agi_t, agi_unlinked) +
1775                        (sizeof(xfs_agino_t) * bucket_index);
1776                xfs_trans_log_buf(tp, agibp, offset,
1777                                  (offset + sizeof(xfs_agino_t) - 1));
1778        } else {
1779                /*
1780                 * We need to search the list for the inode being freed.
1781                 */
1782                next_agino = be32_to_cpu(agi->agi_unlinked[bucket_index]);
1783                last_ibp = NULL;
1784                while (next_agino != agino) {
1785                        struct xfs_imap imap;
1786
1787                        if (last_ibp)
1788                                xfs_trans_brelse(tp, last_ibp);
1789
1790                        imap.im_blkno = 0;
1791                        next_ino = XFS_AGINO_TO_INO(mp, agno, next_agino);
1792
1793                        error = xfs_imap(mp, tp, next_ino, &imap, 0);
1794                        if (error) {
1795                                xfs_warn(mp,
1796        "%s: xfs_imap returned error %d.",
1797                                         __func__, error);
1798                                return error;
1799                        }
1800
1801                        error = xfs_imap_to_bp(mp, tp, &imap, &last_dip,
1802                                               &last_ibp, 0, 0);
1803                        if (error) {
1804                                xfs_warn(mp,
1805        "%s: xfs_imap_to_bp returned error %d.",
1806                                        __func__, error);
1807                                return error;
1808                        }
1809
1810                        last_offset = imap.im_boffset;
1811                        next_agino = be32_to_cpu(last_dip->di_next_unlinked);
1812                        ASSERT(next_agino != NULLAGINO);
1813                        ASSERT(next_agino != 0);
1814                }
1815
1816                /*
1817                 * Now last_ibp points to the buffer previous to us on the
1818                 * unlinked list.  Pull us from the list.
1819                 */
1820                error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &ibp,
1821                                       0, 0);
1822                if (error) {
1823                        xfs_warn(mp, "%s: xfs_imap_to_bp(2) returned error %d.",
1824                                __func__, error);
1825                        return error;
1826                }
1827                next_agino = be32_to_cpu(dip->di_next_unlinked);
1828                ASSERT(next_agino != 0);
1829                ASSERT(next_agino != agino);
1830                if (next_agino != NULLAGINO) {
1831                        dip->di_next_unlinked = cpu_to_be32(NULLAGINO);
1832                        offset = ip->i_imap.im_boffset +
1833                                offsetof(xfs_dinode_t, di_next_unlinked);
1834
1835                        /* need to recalc the inode CRC if appropriate */
1836                        xfs_dinode_calc_crc(mp, dip);
1837
1838                        xfs_trans_inode_buf(tp, ibp);
1839                        xfs_trans_log_buf(tp, ibp, offset,
1840                                          (offset + sizeof(xfs_agino_t) - 1));
1841                        xfs_inobp_check(mp, ibp);
1842                } else {
1843                        xfs_trans_brelse(tp, ibp);
1844                }
1845                /*
1846                 * Point the previous inode on the list to the next inode.
1847                 */
1848                last_dip->di_next_unlinked = cpu_to_be32(next_agino);
1849                ASSERT(next_agino != 0);
1850                offset = last_offset + offsetof(xfs_dinode_t, di_next_unlinked);
1851
1852                /* need to recalc the inode CRC if appropriate */
1853                xfs_dinode_calc_crc(mp, last_dip);
1854
1855                xfs_trans_inode_buf(tp, last_ibp);
1856                xfs_trans_log_buf(tp, last_ibp, offset,
1857                                  (offset + sizeof(xfs_agino_t) - 1));
1858                xfs_inobp_check(mp, last_ibp);
1859        }
1860        return 0;
1861}
1862
1863/*
1864 * A big issue when freeing the inode cluster is is that we _cannot_ skip any
1865 * inodes that are in memory - they all must be marked stale and attached to
1866 * the cluster buffer.
1867 */
1868STATIC int
1869xfs_ifree_cluster(
1870        xfs_inode_t     *free_ip,
1871        xfs_trans_t     *tp,
1872        xfs_ino_t       inum)
1873{
1874        xfs_mount_t             *mp = free_ip->i_mount;
1875        int                     blks_per_cluster;
1876        int                     nbufs;
1877        int                     ninodes;
1878        int                     i, j;
1879        xfs_daddr_t             blkno;
1880        xfs_buf_t               *bp;
1881        xfs_inode_t             *ip;
1882        xfs_inode_log_item_t    *iip;
1883        xfs_log_item_t          *lip;
1884        struct xfs_perag        *pag;
1885
1886        pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, inum));
1887        if (mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp)) {
1888                blks_per_cluster = 1;
1889                ninodes = mp->m_sb.sb_inopblock;
1890                nbufs = XFS_IALLOC_BLOCKS(mp);
1891        } else {
1892                blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) /
1893                                        mp->m_sb.sb_blocksize;
1894                ninodes = blks_per_cluster * mp->m_sb.sb_inopblock;
1895                nbufs = XFS_IALLOC_BLOCKS(mp) / blks_per_cluster;
1896        }
1897
1898        for (j = 0; j < nbufs; j++, inum += ninodes) {
1899                blkno = XFS_AGB_TO_DADDR(mp, XFS_INO_TO_AGNO(mp, inum),
1900                                         XFS_INO_TO_AGBNO(mp, inum));
1901
1902                /*
1903                 * We obtain and lock the backing buffer first in the process
1904                 * here, as we have to ensure that any dirty inode that we
1905                 * can't get the flush lock on is attached to the buffer.
1906                 * If we scan the in-memory inodes first, then buffer IO can
1907                 * complete before we get a lock on it, and hence we may fail
1908                 * to mark all the active inodes on the buffer stale.
1909                 */
1910                bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, blkno,
1911                                        mp->m_bsize * blks_per_cluster,
1912                                        XBF_UNMAPPED);
1913
1914                if (!bp)
1915                        return ENOMEM;
1916
1917                /*
1918                 * This buffer may not have been correctly initialised as we
1919                 * didn't read it from disk. That's not important because we are
1920                 * only using to mark the buffer as stale in the log, and to
1921                 * attach stale cached inodes on it. That means it will never be
1922                 * dispatched for IO. If it is, we want to know about it, and we
1923                 * want it to fail. We can acheive this by adding a write
1924                 * verifier to the buffer.
1925                 */
1926                 bp->b_ops = &xfs_inode_buf_ops;
1927
1928                /*
1929                 * Walk the inodes already attached to the buffer and mark them
1930                 * stale. These will all have the flush locks held, so an
1931                 * in-memory inode walk can't lock them. By marking them all
1932                 * stale first, we will not attempt to lock them in the loop
1933                 * below as the XFS_ISTALE flag will be set.
1934                 */
1935                lip = bp->b_fspriv;
1936                while (lip) {
1937                        if (lip->li_type == XFS_LI_INODE) {
1938                                iip = (xfs_inode_log_item_t *)lip;
1939                                ASSERT(iip->ili_logged == 1);
1940                                lip->li_cb = xfs_istale_done;
1941                                xfs_trans_ail_copy_lsn(mp->m_ail,
1942                                                        &iip->ili_flush_lsn,
1943                                                        &iip->ili_item.li_lsn);
1944                                xfs_iflags_set(iip->ili_inode, XFS_ISTALE);
1945                        }
1946                        lip = lip->li_bio_list;
1947                }
1948
1949
1950                /*
1951                 * For each inode in memory attempt to add it to the inode
1952                 * buffer and set it up for being staled on buffer IO
1953                 * completion.  This is safe as we've locked out tail pushing
1954                 * and flushing by locking the buffer.
1955                 *
1956                 * We have already marked every inode that was part of a
1957                 * transaction stale above, which means there is no point in
1958                 * even trying to lock them.
1959                 */
1960                for (i = 0; i < ninodes; i++) {
1961retry:
1962                        rcu_read_lock();
1963                        ip = radix_tree_lookup(&pag->pag_ici_root,
1964                                        XFS_INO_TO_AGINO(mp, (inum + i)));
1965
1966                        /* Inode not in memory, nothing to do */
1967                        if (!ip) {
1968                                rcu_read_unlock();
1969                                continue;
1970                        }
1971
1972                        /*
1973                         * because this is an RCU protected lookup, we could
1974                         * find a recently freed or even reallocated inode
1975                         * during the lookup. We need to check under the
1976                         * i_flags_lock for a valid inode here. Skip it if it
1977                         * is not valid, the wrong inode or stale.
1978                         */
1979                        spin_lock(&ip->i_flags_lock);
1980                        if (ip->i_ino != inum + i ||
1981                            __xfs_iflags_test(ip, XFS_ISTALE)) {
1982                                spin_unlock(&ip->i_flags_lock);
1983                                rcu_read_unlock();
1984                                continue;
1985                        }
1986                        spin_unlock(&ip->i_flags_lock);
1987
1988                        /*
1989                         * Don't try to lock/unlock the current inode, but we
1990                         * _cannot_ skip the other inodes that we did not find
1991                         * in the list attached to the buffer and are not
1992                         * already marked stale. If we can't lock it, back off
1993                         * and retry.
1994                         */
1995                        if (ip != free_ip &&
1996                            !xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) {
1997                                rcu_read_unlock();
1998                                delay(1);
1999                                goto retry;
2000                        }
2001                        rcu_read_unlock();
2002
2003                        xfs_iflock(ip);
2004                        xfs_iflags_set(ip, XFS_ISTALE);
2005
2006                        /*
2007                         * we don't need to attach clean inodes or those only
2008                         * with unlogged changes (which we throw away, anyway).
2009                         */
2010                        iip = ip->i_itemp;
2011                        if (!iip || xfs_inode_clean(ip)) {
2012                                ASSERT(ip != free_ip);
2013                                xfs_ifunlock(ip);
2014                                xfs_iunlock(ip, XFS_ILOCK_EXCL);
2015                                continue;
2016                        }
2017
2018                        iip->ili_last_fields = iip->ili_fields;
2019                        iip->ili_fields = 0;
2020                        iip->ili_logged = 1;
2021                        xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn,
2022                                                &iip->ili_item.li_lsn);
2023
2024                        xfs_buf_attach_iodone(bp, xfs_istale_done,
2025                                                  &iip->ili_item);
2026
2027                        if (ip != free_ip)
2028                                xfs_iunlock(ip, XFS_ILOCK_EXCL);
2029                }
2030
2031                xfs_trans_stale_inode_buf(tp, bp);
2032                xfs_trans_binval(tp, bp);
2033        }
2034
2035        xfs_perag_put(pag);
2036        return 0;
2037}
2038
2039/*
2040 * This is called to return an inode to the inode free list.
2041 * The inode should already be truncated to 0 length and have
2042 * no pages associated with it.  This routine also assumes that
2043 * the inode is already a part of the transaction.
2044 *
2045 * The on-disk copy of the inode will have been added to the list
2046 * of unlinked inodes in the AGI. We need to remove the inode from
2047 * that list atomically with respect to freeing it here.
2048 */
2049int
2050xfs_ifree(
2051        xfs_trans_t     *tp,
2052        xfs_inode_t     *ip,
2053        xfs_bmap_free_t *flist)
2054{
2055        int                     error;
2056        int                     delete;
2057        xfs_ino_t               first_ino;
2058
2059        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
2060        ASSERT(ip->i_d.di_nlink == 0);
2061        ASSERT(ip->i_d.di_nextents == 0);
2062        ASSERT(ip->i_d.di_anextents == 0);
2063        ASSERT(ip->i_d.di_size == 0 || !S_ISREG(ip->i_d.di_mode));
2064        ASSERT(ip->i_d.di_nblocks == 0);
2065
2066        /*
2067         * Pull the on-disk inode from the AGI unlinked list.
2068         */
2069        error = xfs_iunlink_remove(tp, ip);
2070        if (error)
2071                return error;
2072
2073        error = xfs_difree(tp, ip->i_ino, flist, &delete, &first_ino);
2074        if (error)
2075                return error;
2076
2077        ip->i_d.di_mode = 0;            /* mark incore inode as free */
2078        ip->i_d.di_flags = 0;
2079        ip->i_d.di_dmevmask = 0;
2080        ip->i_d.di_forkoff = 0;         /* mark the attr fork not in use */
2081        ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS;
2082        ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
2083        /*
2084         * Bump the generation count so no one will be confused
2085         * by reincarnations of this inode.
2086         */
2087        ip->i_d.di_gen++;
2088        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
2089
2090        if (delete)
2091                error = xfs_ifree_cluster(ip, tp, first_ino);
2092
2093        return error;
2094}
2095
2096/*
2097 * Reallocate the space for if_broot based on the number of records
2098 * being added or deleted as indicated in rec_diff.  Move the records
2099 * and pointers in if_broot to fit the new size.  When shrinking this
2100 * will eliminate holes between the records and pointers created by
2101 * the caller.  When growing this will create holes to be filled in
2102 * by the caller.
2103 *
2104 * The caller must not request to add more records than would fit in
2105 * the on-disk inode root.  If the if_broot is currently NULL, then
2106 * if we adding records one will be allocated.  The caller must also
2107 * not request that the number of records go below zero, although
2108 * it can go to zero.
2109 *
2110 * ip -- the inode whose if_broot area is changing
2111 * ext_diff -- the change in the number of records, positive or negative,
2112 *       requested for the if_broot array.
2113 */
2114void
2115xfs_iroot_realloc(
2116        xfs_inode_t             *ip,
2117        int                     rec_diff,
2118        int                     whichfork)
2119{
2120        struct xfs_mount        *mp = ip->i_mount;
2121        int                     cur_max;
2122        xfs_ifork_t             *ifp;
2123        struct xfs_btree_block  *new_broot;
2124        int                     new_max;
2125        size_t                  new_size;
2126        char                    *np;
2127        char                    *op;
2128
2129        /*
2130         * Handle the degenerate case quietly.
2131         */
2132        if (rec_diff == 0) {
2133                return;
2134        }
2135
2136        ifp = XFS_IFORK_PTR(ip, whichfork);
2137        if (rec_diff > 0) {
2138                /*
2139                 * If there wasn't any memory allocated before, just
2140                 * allocate it now and get out.
2141                 */
2142                if (ifp->if_broot_bytes == 0) {
2143                        new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, rec_diff);
2144                        ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS);
2145                        ifp->if_broot_bytes = (int)new_size;
2146                        return;
2147                }
2148
2149                /*
2150                 * If there is already an existing if_broot, then we need
2151                 * to realloc() it and shift the pointers to their new
2152                 * location.  The records don't change location because
2153                 * they are kept butted up against the btree block header.
2154                 */
2155                cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0);
2156                new_max = cur_max + rec_diff;
2157                new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max);
2158                ifp->if_broot = kmem_realloc(ifp->if_broot, new_size,
2159                                XFS_BMAP_BROOT_SPACE_CALC(mp, cur_max),
2160                                KM_SLEEP | KM_NOFS);
2161                op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1,
2162                                                     ifp->if_broot_bytes);
2163                np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1,
2164                                                     (int)new_size);
2165                ifp->if_broot_bytes = (int)new_size;
2166                ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <=
2167                        XFS_IFORK_SIZE(ip, whichfork));
2168                memmove(np, op, cur_max * (uint)sizeof(xfs_dfsbno_t));
2169                return;
2170        }
2171
2172        /*
2173         * rec_diff is less than 0.  In this case, we are shrinking the
2174         * if_broot buffer.  It must already exist.  If we go to zero
2175         * records, just get rid of the root and clear the status bit.
2176         */
2177        ASSERT((ifp->if_broot != NULL) && (ifp->if_broot_bytes > 0));
2178        cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0);
2179        new_max = cur_max + rec_diff;
2180        ASSERT(new_max >= 0);
2181        if (new_max > 0)
2182                new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max);
2183        else
2184                new_size = 0;
2185        if (new_size > 0) {
2186                new_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS);
2187                /*
2188                 * First copy over the btree block header.
2189                 */
2190                memcpy(new_broot, ifp->if_broot,
2191                        XFS_BMBT_BLOCK_LEN(ip->i_mount));
2192        } else {
2193                new_broot = NULL;
2194                ifp->if_flags &= ~XFS_IFBROOT;
2195        }
2196
2197        /*
2198         * Only copy the records and pointers if there are any.
2199         */
2200        if (new_max > 0) {
2201                /*
2202                 * First copy the records.
2203                 */
2204                op = (char *)XFS_BMBT_REC_ADDR(mp, ifp->if_broot, 1);
2205                np = (char *)XFS_BMBT_REC_ADDR(mp, new_broot, 1);
2206                memcpy(np, op, new_max * (uint)sizeof(xfs_bmbt_rec_t));
2207
2208                /*
2209                 * Then copy the pointers.
2210                 */
2211                op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1,
2212                                                     ifp->if_broot_bytes);
2213                np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, new_broot, 1,
2214                                                     (int)new_size);
2215                memcpy(np, op, new_max * (uint)sizeof(xfs_dfsbno_t));
2216        }
2217        kmem_free(ifp->if_broot);
2218        ifp->if_broot = new_broot;
2219        ifp->if_broot_bytes = (int)new_size;
2220        if (ifp->if_broot)
2221                ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <=
2222                        XFS_IFORK_SIZE(ip, whichfork));
2223        return;
2224}
2225
2226
2227/*
2228 * This is called when the amount of space needed for if_data
2229 * is increased or decreased.  The change in size is indicated by
2230 * the number of bytes that need to be added or deleted in the
2231 * byte_diff parameter.
2232 *
2233 * If the amount of space needed has decreased below the size of the
2234 * inline buffer, then switch to using the inline buffer.  Otherwise,
2235 * use kmem_realloc() or kmem_alloc() to adjust the size of the buffer
2236 * to what is needed.
2237 *
2238 * ip -- the inode whose if_data area is changing
2239 * byte_diff -- the change in the number of bytes, positive or negative,
2240 *       requested for the if_data array.
2241 */
2242void
2243xfs_idata_realloc(
2244        xfs_inode_t     *ip,
2245        int             byte_diff,
2246        int             whichfork)
2247{
2248        xfs_ifork_t     *ifp;
2249        int             new_size;
2250        int             real_size;
2251
2252        if (byte_diff == 0) {
2253                return;
2254        }
2255
2256        ifp = XFS_IFORK_PTR(ip, whichfork);
2257        new_size = (int)ifp->if_bytes + byte_diff;
2258        ASSERT(new_size >= 0);
2259
2260        if (new_size == 0) {
2261                if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) {
2262                        kmem_free(ifp->if_u1.if_data);
2263                }
2264                ifp->if_u1.if_data = NULL;
2265                real_size = 0;
2266        } else if (new_size <= sizeof(ifp->if_u2.if_inline_data)) {
2267                /*
2268                 * If the valid extents/data can fit in if_inline_ext/data,
2269                 * copy them from the malloc'd vector and free it.
2270                 */
2271                if (ifp->if_u1.if_data == NULL) {
2272                        ifp->if_u1.if_data = ifp->if_u2.if_inline_data;
2273                } else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) {
2274                        ASSERT(ifp->if_real_bytes != 0);
2275                        memcpy(ifp->if_u2.if_inline_data, ifp->if_u1.if_data,
2276                              new_size);
2277                        kmem_free(ifp->if_u1.if_data);
2278                        ifp->if_u1.if_data = ifp->if_u2.if_inline_data;
2279                }
2280                real_size = 0;
2281        } else {
2282                /*
2283                 * Stuck with malloc/realloc.
2284                 * For inline data, the underlying buffer must be
2285                 * a multiple of 4 bytes in size so that it can be
2286                 * logged and stay on word boundaries.  We enforce
2287                 * that here.
2288                 */
2289                real_size = roundup(new_size, 4);
2290                if (ifp->if_u1.if_data == NULL) {
2291                        ASSERT(ifp->if_real_bytes == 0);
2292                        ifp->if_u1.if_data = kmem_alloc(real_size,
2293                                                        KM_SLEEP | KM_NOFS);
2294                } else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) {
2295                        /*
2296                         * Only do the realloc if the underlying size
2297                         * is really changing.
2298                         */
2299                        if (ifp->if_real_bytes != real_size) {
2300                                ifp->if_u1.if_data =
2301                                        kmem_realloc(ifp->if_u1.if_data,
2302                                                        real_size,
2303                                                        ifp->if_real_bytes,
2304                                                        KM_SLEEP | KM_NOFS);
2305                        }
2306                } else {
2307                        ASSERT(ifp->if_real_bytes == 0);
2308                        ifp->if_u1.if_data = kmem_alloc(real_size,
2309                                                        KM_SLEEP | KM_NOFS);
2310                        memcpy(ifp->if_u1.if_data, ifp->if_u2.if_inline_data,
2311                                ifp->if_bytes);
2312                }
2313        }
2314        ifp->if_real_bytes = real_size;
2315        ifp->if_bytes = new_size;
2316        ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork));
2317}
2318
2319void
2320xfs_idestroy_fork(
2321        xfs_inode_t     *ip,
2322        int             whichfork)
2323{
2324        xfs_ifork_t     *ifp;
2325
2326        ifp = XFS_IFORK_PTR(ip, whichfork);
2327        if (ifp->if_broot != NULL) {
2328                kmem_free(ifp->if_broot);
2329                ifp->if_broot = NULL;
2330        }
2331
2332        /*
2333         * If the format is local, then we can't have an extents
2334         * array so just look for an inline data array.  If we're
2335         * not local then we may or may not have an extents list,
2336         * so check and free it up if we do.
2337         */
2338        if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL) {
2339                if ((ifp->if_u1.if_data != ifp->if_u2.if_inline_data) &&
2340                    (ifp->if_u1.if_data != NULL)) {
2341                        ASSERT(ifp->if_real_bytes != 0);
2342                        kmem_free(ifp->if_u1.if_data);
2343                        ifp->if_u1.if_data = NULL;
2344                        ifp->if_real_bytes = 0;
2345                }
2346        } else if ((ifp->if_flags & XFS_IFEXTENTS) &&
2347                   ((ifp->if_flags & XFS_IFEXTIREC) ||
2348                    ((ifp->if_u1.if_extents != NULL) &&
2349                     (ifp->if_u1.if_extents != ifp->if_u2.if_inline_ext)))) {
2350                ASSERT(ifp->if_real_bytes != 0);
2351                xfs_iext_destroy(ifp);
2352        }
2353        ASSERT(ifp->if_u1.if_extents == NULL ||
2354               ifp->if_u1.if_extents == ifp->if_u2.if_inline_ext);
2355        ASSERT(ifp->if_real_bytes == 0);
2356        if (whichfork == XFS_ATTR_FORK) {
2357                kmem_zone_free(xfs_ifork_zone, ip->i_afp);
2358                ip->i_afp = NULL;
2359        }
2360}
2361
2362/*
2363 * This is called to unpin an inode.  The caller must have the inode locked
2364 * in at least shared mode so that the buffer cannot be subsequently pinned
2365 * once someone is waiting for it to be unpinned.
2366 */
2367static void
2368xfs_iunpin(
2369        struct xfs_inode        *ip)
2370{
2371        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
2372
2373        trace_xfs_inode_unpin_nowait(ip, _RET_IP_);
2374
2375        /* Give the log a push to start the unpinning I/O */
2376        xfs_log_force_lsn(ip->i_mount, ip->i_itemp->ili_last_lsn, 0);
2377
2378}
2379
2380static void
2381__xfs_iunpin_wait(
2382        struct xfs_inode        *ip)
2383{
2384        wait_queue_head_t *wq = bit_waitqueue(&ip->i_flags, __XFS_IPINNED_BIT);
2385        DEFINE_WAIT_BIT(wait, &ip->i_flags, __XFS_IPINNED_BIT);
2386
2387        xfs_iunpin(ip);
2388
2389        do {
2390                prepare_to_wait(wq, &wait.wait, TASK_UNINTERRUPTIBLE);
2391                if (xfs_ipincount(ip))
2392                        io_schedule();
2393        } while (xfs_ipincount(ip));
2394        finish_wait(wq, &wait.wait);
2395}
2396
2397void
2398xfs_iunpin_wait(
2399        struct xfs_inode        *ip)
2400{
2401        if (xfs_ipincount(ip))
2402                __xfs_iunpin_wait(ip);
2403}
2404
2405/*
2406 * xfs_iextents_copy()
2407 *
2408 * This is called to copy the REAL extents (as opposed to the delayed
2409 * allocation extents) from the inode into the given buffer.  It
2410 * returns the number of bytes copied into the buffer.
2411 *
2412 * If there are no delayed allocation extents, then we can just
2413 * memcpy() the extents into the buffer.  Otherwise, we need to
2414 * examine each extent in turn and skip those which are delayed.
2415 */
2416int
2417xfs_iextents_copy(
2418        xfs_inode_t             *ip,
2419        xfs_bmbt_rec_t          *dp,
2420        int                     whichfork)
2421{
2422        int                     copied;
2423        int                     i;
2424        xfs_ifork_t             *ifp;
2425        int                     nrecs;
2426        xfs_fsblock_t           start_block;
2427
2428        ifp = XFS_IFORK_PTR(ip, whichfork);
2429        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
2430        ASSERT(ifp->if_bytes > 0);
2431
2432        nrecs = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
2433        XFS_BMAP_TRACE_EXLIST(ip, nrecs, whichfork);
2434        ASSERT(nrecs > 0);
2435
2436        /*
2437         * There are some delayed allocation extents in the
2438         * inode, so copy the extents one at a time and skip
2439         * the delayed ones.  There must be at least one
2440         * non-delayed extent.
2441         */
2442        copied = 0;
2443        for (i = 0; i < nrecs; i++) {
2444                xfs_bmbt_rec_host_t *ep = xfs_iext_get_ext(ifp, i);
2445                start_block = xfs_bmbt_get_startblock(ep);
2446                if (isnullstartblock(start_block)) {
2447                        /*
2448                         * It's a delayed allocation extent, so skip it.
2449                         */
2450                        continue;
2451                }
2452
2453                /* Translate to on disk format */
2454                put_unaligned(cpu_to_be64(ep->l0), &dp->l0);
2455                put_unaligned(cpu_to_be64(ep->l1), &dp->l1);
2456                dp++;
2457                copied++;
2458        }
2459        ASSERT(copied != 0);
2460        xfs_validate_extents(ifp, copied, XFS_EXTFMT_INODE(ip));
2461
2462        return (copied * (uint)sizeof(xfs_bmbt_rec_t));
2463}
2464
2465/*
2466 * Each of the following cases stores data into the same region
2467 * of the on-disk inode, so only one of them can be valid at
2468 * any given time. While it is possible to have conflicting formats
2469 * and log flags, e.g. having XFS_ILOG_?DATA set when the fork is
2470 * in EXTENTS format, this can only happen when the fork has
2471 * changed formats after being modified but before being flushed.
2472 * In these cases, the format always takes precedence, because the
2473 * format indicates the current state of the fork.
2474 */
2475/*ARGSUSED*/
2476STATIC void
2477xfs_iflush_fork(
2478        xfs_inode_t             *ip,
2479        xfs_dinode_t            *dip,
2480        xfs_inode_log_item_t    *iip,
2481        int                     whichfork,
2482        xfs_buf_t               *bp)
2483{
2484        char                    *cp;
2485        xfs_ifork_t             *ifp;
2486        xfs_mount_t             *mp;
2487        static const short      brootflag[2] =
2488                { XFS_ILOG_DBROOT, XFS_ILOG_ABROOT };
2489        static const short      dataflag[2] =
2490                { XFS_ILOG_DDATA, XFS_ILOG_ADATA };
2491        static const short      extflag[2] =
2492                { XFS_ILOG_DEXT, XFS_ILOG_AEXT };
2493
2494        if (!iip)
2495                return;
2496        ifp = XFS_IFORK_PTR(ip, whichfork);
2497        /*
2498         * This can happen if we gave up in iformat in an error path,
2499         * for the attribute fork.
2500         */
2501        if (!ifp) {
2502                ASSERT(whichfork == XFS_ATTR_FORK);
2503                return;
2504        }
2505        cp = XFS_DFORK_PTR(dip, whichfork);
2506        mp = ip->i_mount;
2507        switch (XFS_IFORK_FORMAT(ip, whichfork)) {
2508        case XFS_DINODE_FMT_LOCAL:
2509                if ((iip->ili_fields & dataflag[whichfork]) &&
2510                    (ifp->if_bytes > 0)) {
2511                        ASSERT(ifp->if_u1.if_data != NULL);
2512                        ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork));
2513                        memcpy(cp, ifp->if_u1.if_data, ifp->if_bytes);
2514                }
2515                break;
2516
2517        case XFS_DINODE_FMT_EXTENTS:
2518                ASSERT((ifp->if_flags & XFS_IFEXTENTS) ||
2519                       !(iip->ili_fields & extflag[whichfork]));
2520                if ((iip->ili_fields & extflag[whichfork]) &&
2521                    (ifp->if_bytes > 0)) {
2522                        ASSERT(xfs_iext_get_ext(ifp, 0));
2523                        ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) > 0);
2524                        (void)xfs_iextents_copy(ip, (xfs_bmbt_rec_t *)cp,
2525                                whichfork);
2526                }
2527                break;
2528
2529        case XFS_DINODE_FMT_BTREE:
2530                if ((iip->ili_fields & brootflag[whichfork]) &&
2531                    (ifp->if_broot_bytes > 0)) {
2532                        ASSERT(ifp->if_broot != NULL);
2533                        ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <=
2534                                XFS_IFORK_SIZE(ip, whichfork));
2535                        xfs_bmbt_to_bmdr(mp, ifp->if_broot, ifp->if_broot_bytes,
2536                                (xfs_bmdr_block_t *)cp,
2537                                XFS_DFORK_SIZE(dip, mp, whichfork));
2538                }
2539                break;
2540
2541        case XFS_DINODE_FMT_DEV:
2542                if (iip->ili_fields & XFS_ILOG_DEV) {
2543                        ASSERT(whichfork == XFS_DATA_FORK);
2544                        xfs_dinode_put_rdev(dip, ip->i_df.if_u2.if_rdev);
2545                }
2546                break;
2547
2548        case XFS_DINODE_FMT_UUID:
2549                if (iip->ili_fields & XFS_ILOG_UUID) {
2550                        ASSERT(whichfork == XFS_DATA_FORK);
2551                        memcpy(XFS_DFORK_DPTR(dip),
2552                               &ip->i_df.if_u2.if_uuid,
2553                               sizeof(uuid_t));
2554                }
2555                break;
2556
2557        default:
2558                ASSERT(0);
2559                break;
2560        }
2561}
2562
2563STATIC int
2564xfs_iflush_cluster(
2565        xfs_inode_t     *ip,
2566        xfs_buf_t       *bp)
2567{
2568        xfs_mount_t             *mp = ip->i_mount;
2569        struct xfs_perag        *pag;
2570        unsigned long           first_index, mask;
2571        unsigned long           inodes_per_cluster;
2572        int                     ilist_size;
2573        xfs_inode_t             **ilist;
2574        xfs_inode_t             *iq;
2575        int                     nr_found;
2576        int                     clcount = 0;
2577        int                     bufwasdelwri;
2578        int                     i;
2579
2580        pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino));
2581
2582        inodes_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog;
2583        ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *);
2584        ilist = kmem_alloc(ilist_size, KM_MAYFAIL|KM_NOFS);
2585        if (!ilist)
2586                goto out_put;
2587
2588        mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1);
2589        first_index = XFS_INO_TO_AGINO(mp, ip->i_ino) & mask;
2590        rcu_read_lock();
2591        /* really need a gang lookup range call here */
2592        nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void**)ilist,
2593                                        first_index, inodes_per_cluster);
2594        if (nr_found == 0)
2595                goto out_free;
2596
2597        for (i = 0; i < nr_found; i++) {
2598                iq = ilist[i];
2599                if (iq == ip)
2600                        continue;
2601
2602                /*
2603                 * because this is an RCU protected lookup, we could find a
2604                 * recently freed or even reallocated inode during the lookup.
2605                 * We need to check under the i_flags_lock for a valid inode
2606                 * here. Skip it if it is not valid or the wrong inode.
2607                 */
2608                spin_lock(&ip->i_flags_lock);
2609                if (!ip->i_ino ||
2610                    (XFS_INO_TO_AGINO(mp, iq->i_ino) & mask) != first_index) {
2611                        spin_unlock(&ip->i_flags_lock);
2612                        continue;
2613                }
2614                spin_unlock(&ip->i_flags_lock);
2615
2616                /*
2617                 * Do an un-protected check to see if the inode is dirty and
2618                 * is a candidate for flushing.  These checks will be repeated
2619                 * later after the appropriate locks are acquired.
2620                 */
2621                if (xfs_inode_clean(iq) && xfs_ipincount(iq) == 0)
2622                        continue;
2623
2624                /*
2625                 * Try to get locks.  If any are unavailable or it is pinned,
2626                 * then this inode cannot be flushed and is skipped.
2627                 */
2628
2629                if (!xfs_ilock_nowait(iq, XFS_ILOCK_SHARED))
2630                        continue;
2631                if (!xfs_iflock_nowait(iq)) {
2632                        xfs_iunlock(iq, XFS_ILOCK_SHARED);
2633                        continue;
2634                }
2635                if (xfs_ipincount(iq)) {
2636                        xfs_ifunlock(iq);
2637                        xfs_iunlock(iq, XFS_ILOCK_SHARED);
2638                        continue;
2639                }
2640
2641                /*
2642                 * arriving here means that this inode can be flushed.  First
2643                 * re-check that it's dirty before flushing.
2644                 */
2645                if (!xfs_inode_clean(iq)) {
2646                        int     error;
2647                        error = xfs_iflush_int(iq, bp);
2648                        if (error) {
2649                                xfs_iunlock(iq, XFS_ILOCK_SHARED);
2650                                goto cluster_corrupt_out;
2651                        }
2652                        clcount++;
2653                } else {
2654                        xfs_ifunlock(iq);
2655                }
2656                xfs_iunlock(iq, XFS_ILOCK_SHARED);
2657        }
2658
2659        if (clcount) {
2660                XFS_STATS_INC(xs_icluster_flushcnt);
2661                XFS_STATS_ADD(xs_icluster_flushinode, clcount);
2662        }
2663
2664out_free:
2665        rcu_read_unlock();
2666        kmem_free(ilist);
2667out_put:
2668        xfs_perag_put(pag);
2669        return 0;
2670
2671
2672cluster_corrupt_out:
2673        /*
2674         * Corruption detected in the clustering loop.  Invalidate the
2675         * inode buffer and shut down the filesystem.
2676         */
2677        rcu_read_unlock();
2678        /*
2679         * Clean up the buffer.  If it was delwri, just release it --
2680         * brelse can handle it with no problems.  If not, shut down the
2681         * filesystem before releasing the buffer.
2682         */
2683        bufwasdelwri = (bp->b_flags & _XBF_DELWRI_Q);
2684        if (bufwasdelwri)
2685                xfs_buf_relse(bp);
2686
2687        xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
2688
2689        if (!bufwasdelwri) {
2690                /*
2691                 * Just like incore_relse: if we have b_iodone functions,
2692                 * mark the buffer as an error and call them.  Otherwise
2693                 * mark it as stale and brelse.
2694                 */
2695                if (bp->b_iodone) {
2696                        XFS_BUF_UNDONE(bp);
2697                        xfs_buf_stale(bp);
2698                        xfs_buf_ioerror(bp, EIO);
2699                        xfs_buf_ioend(bp, 0);
2700                } else {
2701                        xfs_buf_stale(bp);
2702                        xfs_buf_relse(bp);
2703                }
2704        }
2705
2706        /*
2707         * Unlocks the flush lock
2708         */
2709        xfs_iflush_abort(iq, false);
2710        kmem_free(ilist);
2711        xfs_perag_put(pag);
2712        return XFS_ERROR(EFSCORRUPTED);
2713}
2714
2715/*
2716 * Flush dirty inode metadata into the backing buffer.
2717 *
2718 * The caller must have the inode lock and the inode flush lock held.  The
2719 * inode lock will still be held upon return to the caller, and the inode
2720 * flush lock will be released after the inode has reached the disk.
2721 *
2722 * The caller must write out the buffer returned in *bpp and release it.
2723 */
2724int
2725xfs_iflush(
2726        struct xfs_inode        *ip,
2727        struct xfs_buf          **bpp)
2728{
2729        struct xfs_mount        *mp = ip->i_mount;
2730        struct xfs_buf          *bp;
2731        struct xfs_dinode       *dip;
2732        int                     error;
2733
2734        XFS_STATS_INC(xs_iflush_count);
2735
2736        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
2737        ASSERT(xfs_isiflocked(ip));
2738        ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE ||
2739               ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK));
2740
2741        *bpp = NULL;
2742
2743        xfs_iunpin_wait(ip);
2744
2745        /*
2746         * For stale inodes we cannot rely on the backing buffer remaining
2747         * stale in cache for the remaining life of the stale inode and so
2748         * xfs_imap_to_bp() below may give us a buffer that no longer contains
2749         * inodes below. We have to check this after ensuring the inode is
2750         * unpinned so that it is safe to reclaim the stale inode after the
2751         * flush call.
2752         */
2753        if (xfs_iflags_test(ip, XFS_ISTALE)) {
2754                xfs_ifunlock(ip);
2755                return 0;
2756        }
2757
2758        /*
2759         * This may have been unpinned because the filesystem is shutting
2760         * down forcibly. If that's the case we must not write this inode
2761         * to disk, because the log record didn't make it to disk.
2762         *
2763         * We also have to remove the log item from the AIL in this case,
2764         * as we wait for an empty AIL as part of the unmount process.
2765         */
2766        if (XFS_FORCED_SHUTDOWN(mp)) {
2767                error = XFS_ERROR(EIO);
2768                goto abort_out;
2769        }
2770
2771        /*
2772         * Get the buffer containing the on-disk inode.
2773         */
2774        error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &bp, XBF_TRYLOCK,
2775                               0);
2776        if (error || !bp) {
2777                xfs_ifunlock(ip);
2778                return error;
2779        }
2780
2781        /*
2782         * First flush out the inode that xfs_iflush was called with.
2783         */
2784        error = xfs_iflush_int(ip, bp);
2785        if (error)
2786                goto corrupt_out;
2787
2788        /*
2789         * If the buffer is pinned then push on the log now so we won't
2790         * get stuck waiting in the write for too long.
2791         */
2792        if (xfs_buf_ispinned(bp))
2793                xfs_log_force(mp, 0);
2794
2795        /*
2796         * inode clustering:
2797         * see if other inodes can be gathered into this write
2798         */
2799        error = xfs_iflush_cluster(ip, bp);
2800        if (error)
2801                goto cluster_corrupt_out;
2802
2803        *bpp = bp;
2804        return 0;
2805
2806corrupt_out:
2807        xfs_buf_relse(bp);
2808        xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
2809cluster_corrupt_out:
2810        error = XFS_ERROR(EFSCORRUPTED);
2811abort_out:
2812        /*
2813         * Unlocks the flush lock
2814         */
2815        xfs_iflush_abort(ip, false);
2816        return error;
2817}
2818
2819
2820STATIC int
2821xfs_iflush_int(
2822        struct xfs_inode        *ip,
2823        struct xfs_buf          *bp)
2824{
2825        struct xfs_inode_log_item *iip = ip->i_itemp;
2826        struct xfs_dinode       *dip;
2827        struct xfs_mount        *mp = ip->i_mount;
2828
2829        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
2830        ASSERT(xfs_isiflocked(ip));
2831        ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE ||
2832               ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK));
2833        ASSERT(iip != NULL && iip->ili_fields != 0);
2834
2835        /* set *dip = inode's place in the buffer */
2836        dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset);
2837
2838        if (XFS_TEST_ERROR(dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC),
2839                               mp, XFS_ERRTAG_IFLUSH_1, XFS_RANDOM_IFLUSH_1)) {
2840                xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
2841                        "%s: Bad inode %Lu magic number 0x%x, ptr 0x%p",
2842                        __func__, ip->i_ino, be16_to_cpu(dip->di_magic), dip);
2843                goto corrupt_out;
2844        }
2845        if (XFS_TEST_ERROR(ip->i_d.di_magic != XFS_DINODE_MAGIC,
2846                                mp, XFS_ERRTAG_IFLUSH_2, XFS_RANDOM_IFLUSH_2)) {
2847                xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
2848                        "%s: Bad inode %Lu, ptr 0x%p, magic number 0x%x",
2849                        __func__, ip->i_ino, ip, ip->i_d.di_magic);
2850                goto corrupt_out;
2851        }
2852        if (S_ISREG(ip->i_d.di_mode)) {
2853                if (XFS_TEST_ERROR(
2854                    (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
2855                    (ip->i_d.di_format != XFS_DINODE_FMT_BTREE),
2856                    mp, XFS_ERRTAG_IFLUSH_3, XFS_RANDOM_IFLUSH_3)) {
2857                        xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
2858                                "%s: Bad regular inode %Lu, ptr 0x%p",
2859                                __func__, ip->i_ino, ip);
2860                        goto corrupt_out;
2861                }
2862        } else if (S_ISDIR(ip->i_d.di_mode)) {
2863                if (XFS_TEST_ERROR(
2864                    (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
2865                    (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) &&
2866                    (ip->i_d.di_format != XFS_DINODE_FMT_LOCAL),
2867                    mp, XFS_ERRTAG_IFLUSH_4, XFS_RANDOM_IFLUSH_4)) {
2868                        xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
2869                                "%s: Bad directory inode %Lu, ptr 0x%p",
2870                                __func__, ip->i_ino, ip);
2871                        goto corrupt_out;
2872                }
2873        }
2874        if (XFS_TEST_ERROR(ip->i_d.di_nextents + ip->i_d.di_anextents >
2875                                ip->i_d.di_nblocks, mp, XFS_ERRTAG_IFLUSH_5,
2876                                XFS_RANDOM_IFLUSH_5)) {
2877                xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
2878                        "%s: detected corrupt incore inode %Lu, "
2879                        "total extents = %d, nblocks = %Ld, ptr 0x%p",
2880                        __func__, ip->i_ino,
2881                        ip->i_d.di_nextents + ip->i_d.di_anextents,
2882                        ip->i_d.di_nblocks, ip);
2883                goto corrupt_out;
2884        }
2885        if (XFS_TEST_ERROR(ip->i_d.di_forkoff > mp->m_sb.sb_inodesize,
2886                                mp, XFS_ERRTAG_IFLUSH_6, XFS_RANDOM_IFLUSH_6)) {
2887                xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
2888                        "%s: bad inode %Lu, forkoff 0x%x, ptr 0x%p",
2889                        __func__, ip->i_ino, ip->i_d.di_forkoff, ip);
2890                goto corrupt_out;
2891        }
2892
2893        /*
2894         * Inode item log recovery for v1/v2 inodes are dependent on the
2895         * di_flushiter count for correct sequencing. We bump the flush
2896         * iteration count so we can detect flushes which postdate a log record
2897         * during recovery. This is redundant as we now log every change and
2898         * hence this can't happen but we need to still do it to ensure
2899         * backwards compatibility with old kernels that predate logging all
2900         * inode changes.
2901         */
2902        if (ip->i_d.di_version < 3)
2903                ip->i_d.di_flushiter++;
2904
2905        /*
2906         * Copy the dirty parts of the inode into the on-disk
2907         * inode.  We always copy out the core of the inode,
2908         * because if the inode is dirty at all the core must
2909         * be.
2910         */
2911        xfs_dinode_to_disk(dip, &ip->i_d);
2912
2913        /* Wrap, we never let the log put out DI_MAX_FLUSH */
2914        if (ip->i_d.di_flushiter == DI_MAX_FLUSH)
2915                ip->i_d.di_flushiter = 0;
2916
2917        /*
2918         * If this is really an old format inode and the superblock version
2919         * has not been updated to support only new format inodes, then
2920         * convert back to the old inode format.  If the superblock version
2921         * has been updated, then make the conversion permanent.
2922         */
2923        ASSERT(ip->i_d.di_version == 1 || xfs_sb_version_hasnlink(&mp->m_sb));
2924        if (ip->i_d.di_version == 1) {
2925                if (!xfs_sb_version_hasnlink(&mp->m_sb)) {
2926                        /*
2927                         * Convert it back.
2928                         */
2929                        ASSERT(ip->i_d.di_nlink <= XFS_MAXLINK_1);
2930                        dip->di_onlink = cpu_to_be16(ip->i_d.di_nlink);
2931                } else {
2932                        /*
2933                         * The superblock version has already been bumped,
2934                         * so just make the conversion to the new inode
2935                         * format permanent.
2936                         */
2937                        ip->i_d.di_version = 2;
2938                        dip->di_version = 2;
2939                        ip->i_d.di_onlink = 0;
2940                        dip->di_onlink = 0;
2941                        memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
2942                        memset(&(dip->di_pad[0]), 0,
2943                              sizeof(dip->di_pad));
2944                        ASSERT(xfs_get_projid(ip) == 0);
2945                }
2946        }
2947
2948        xfs_iflush_fork(ip, dip, iip, XFS_DATA_FORK, bp);
2949        if (XFS_IFORK_Q(ip))
2950                xfs_iflush_fork(ip, dip, iip, XFS_ATTR_FORK, bp);
2951        xfs_inobp_check(mp, bp);
2952
2953        /*
2954         * We've recorded everything logged in the inode, so we'd like to clear
2955         * the ili_fields bits so we don't log and flush things unnecessarily.
2956         * However, we can't stop logging all this information until the data
2957         * we've copied into the disk buffer is written to disk.  If we did we
2958         * might overwrite the copy of the inode in the log with all the data
2959         * after re-logging only part of it, and in the face of a crash we
2960         * wouldn't have all the data we need to recover.
2961         *
2962         * What we do is move the bits to the ili_last_fields field.  When
2963         * logging the inode, these bits are moved back to the ili_fields field.
2964         * In the xfs_iflush_done() routine we clear ili_last_fields, since we
2965         * know that the information those bits represent is permanently on
2966         * disk.  As long as the flush completes before the inode is logged
2967         * again, then both ili_fields and ili_last_fields will be cleared.
2968         *
2969         * We can play with the ili_fields bits here, because the inode lock
2970         * must be held exclusively in order to set bits there and the flush
2971         * lock protects the ili_last_fields bits.  Set ili_logged so the flush
2972         * done routine can tell whether or not to look in the AIL.  Also, store
2973         * the current LSN of the inode so that we can tell whether the item has
2974         * moved in the AIL from xfs_iflush_done().  In order to read the lsn we
2975         * need the AIL lock, because it is a 64 bit value that cannot be read
2976         * atomically.
2977         */
2978        iip->ili_last_fields = iip->ili_fields;
2979        iip->ili_fields = 0;
2980        iip->ili_logged = 1;
2981
2982        xfs_trans_ail_copy_lsn(mp->m_ail, &iip->ili_flush_lsn,
2983                                &iip->ili_item.li_lsn);
2984
2985        /*
2986         * Attach the function xfs_iflush_done to the inode's
2987         * buffer.  This will remove the inode from the AIL
2988         * and unlock the inode's flush lock when the inode is
2989         * completely written to disk.
2990         */
2991        xfs_buf_attach_iodone(bp, xfs_iflush_done, &iip->ili_item);
2992
2993        /* update the lsn in the on disk inode if required */
2994        if (ip->i_d.di_version == 3)
2995                dip->di_lsn = cpu_to_be64(iip->ili_item.li_lsn);
2996
2997        /* generate the checksum. */
2998        xfs_dinode_calc_crc(mp, dip);
2999
3000        ASSERT(bp->b_fspriv != NULL);
3001        ASSERT(bp->b_iodone != NULL);
3002        return 0;
3003
3004corrupt_out:
3005        return XFS_ERROR(EFSCORRUPTED);
3006}
3007
3008/*
3009 * Return a pointer to the extent record at file index idx.
3010 */
3011xfs_bmbt_rec_host_t *
3012xfs_iext_get_ext(
3013        xfs_ifork_t     *ifp,           /* inode fork pointer */
3014        xfs_extnum_t    idx)            /* index of target extent */
3015{
3016        ASSERT(idx >= 0);
3017        ASSERT(idx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t));
3018
3019        if ((ifp->if_flags & XFS_IFEXTIREC) && (idx == 0)) {
3020                return ifp->if_u1.if_ext_irec->er_extbuf;
3021        } else if (ifp->if_flags & XFS_IFEXTIREC) {
3022                xfs_ext_irec_t  *erp;           /* irec pointer */
3023                int             erp_idx = 0;    /* irec index */
3024                xfs_extnum_t    page_idx = idx; /* ext index in target list */
3025
3026                erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 0);
3027                return &erp->er_extbuf[page_idx];
3028        } else if (ifp->if_bytes) {
3029                return &ifp->if_u1.if_extents[idx];
3030        } else {
3031                return NULL;
3032        }
3033}
3034
3035/*
3036 * Insert new item(s) into the extent records for incore inode
3037 * fork 'ifp'.  'count' new items are inserted at index 'idx'.
3038 */
3039void
3040xfs_iext_insert(
3041        xfs_inode_t     *ip,            /* incore inode pointer */
3042        xfs_extnum_t    idx,            /* starting index of new items */
3043        xfs_extnum_t    count,          /* number of inserted items */
3044        xfs_bmbt_irec_t *new,           /* items to insert */
3045        int             state)          /* type of extent conversion */
3046{
3047        xfs_ifork_t     *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df;
3048        xfs_extnum_t    i;              /* extent record index */
3049
3050        trace_xfs_iext_insert(ip, idx, new, state, _RET_IP_);
3051
3052        ASSERT(ifp->if_flags & XFS_IFEXTENTS);
3053        xfs_iext_add(ifp, idx, count);
3054        for (i = idx; i < idx + count; i++, new++)
3055                xfs_bmbt_set_all(xfs_iext_get_ext(ifp, i), new);
3056}
3057
3058/*
3059 * This is called when the amount of space required for incore file
3060 * extents needs to be increased. The ext_diff parameter stores the
3061 * number of new extents being added and the idx parameter contains
3062 * the extent index where the new extents will be added. If the new
3063 * extents are being appended, then we just need to (re)allocate and
3064 * initialize the space. Otherwise, if the new extents are being
3065 * inserted into the middle of the existing entries, a bit more work
3066 * is required to make room for the new extents to be inserted. The
3067 * caller is responsible for filling in the new extent entries upon
3068 * return.
3069 */
3070void
3071xfs_iext_add(
3072        xfs_ifork_t     *ifp,           /* inode fork pointer */
3073        xfs_extnum_t    idx,            /* index to begin adding exts */
3074        int             ext_diff)       /* number of extents to add */
3075{
3076        int             byte_diff;      /* new bytes being added */
3077        int             new_size;       /* size of extents after adding */
3078        xfs_extnum_t    nextents;       /* number of extents in file */
3079
3080        nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
3081        ASSERT((idx >= 0) && (idx <= nextents));
3082        byte_diff = ext_diff * sizeof(xfs_bmbt_rec_t);
3083        new_size = ifp->if_bytes + byte_diff;
3084        /*
3085         * If the new number of extents (nextents + ext_diff)
3086         * fits inside the inode, then continue to use the inline
3087         * extent buffer.
3088         */
3089        if (nextents + ext_diff <= XFS_INLINE_EXTS) {
3090                if (idx < nextents) {
3091                        memmove(&ifp->if_u2.if_inline_ext[idx + ext_diff],
3092                                &ifp->if_u2.if_inline_ext[idx],
3093                                (nextents - idx) * sizeof(xfs_bmbt_rec_t));
3094                        memset(&ifp->if_u2.if_inline_ext[idx], 0, byte_diff);
3095                }
3096                ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext;
3097                ifp->if_real_bytes = 0;
3098        }
3099        /*
3100         * Otherwise use a linear (direct) extent list.
3101         * If the extents are currently inside the inode,
3102         * xfs_iext_realloc_direct will switch us from
3103         * inline to direct extent allocation mode.
3104         */
3105        else if (nextents + ext_diff <= XFS_LINEAR_EXTS) {
3106                xfs_iext_realloc_direct(ifp, new_size);
3107                if (idx < nextents) {
3108                        memmove(&ifp->if_u1.if_extents[idx + ext_diff],
3109                                &ifp->if_u1.if_extents[idx],
3110                                (nextents - idx) * sizeof(xfs_bmbt_rec_t));
3111                        memset(&ifp->if_u1.if_extents[idx], 0, byte_diff);
3112                }
3113        }
3114        /* Indirection array */
3115        else {
3116                xfs_ext_irec_t  *erp;
3117                int             erp_idx = 0;
3118                int             page_idx = idx;
3119
3120                ASSERT(nextents + ext_diff > XFS_LINEAR_EXTS);
3121                if (ifp->if_flags & XFS_IFEXTIREC) {
3122                        erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 1);
3123                } else {
3124                        xfs_iext_irec_init(ifp);
3125                        ASSERT(ifp->if_flags & XFS_IFEXTIREC);
3126                        erp = ifp->if_u1.if_ext_irec;
3127                }
3128                /* Extents fit in target extent page */
3129                if (erp && erp->er_extcount + ext_diff <= XFS_LINEAR_EXTS) {
3130                        if (page_idx < erp->er_extcount) {
3131                                memmove(&erp->er_extbuf[page_idx + ext_diff],
3132                                        &erp->er_extbuf[page_idx],
3133                                        (erp->er_extcount - page_idx) *
3134                                        sizeof(xfs_bmbt_rec_t));
3135                                memset(&erp->er_extbuf[page_idx], 0, byte_diff);
3136                        }
3137                        erp->er_extcount += ext_diff;
3138                        xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, ext_diff);
3139                }
3140                /* Insert a new extent page */
3141                else if (erp) {
3142                        xfs_iext_add_indirect_multi(ifp,
3143                                erp_idx, page_idx, ext_diff);
3144                }
3145                /*
3146                 * If extent(s) are being appended to the last page in
3147                 * the indirection array and the new extent(s) don't fit
3148                 * in the page, then erp is NULL and erp_idx is set to
3149                 * the next index needed in the indirection array.
3150                 */
3151                else {
3152                        int     count = ext_diff;
3153
3154                        while (count) {
3155                                erp = xfs_iext_irec_new(ifp, erp_idx);
3156                                erp->er_extcount = count;
3157                                count -= MIN(count, (int)XFS_LINEAR_EXTS);
3158                                if (count) {
3159                                        erp_idx++;
3160                                }
3161                        }
3162                }
3163        }
3164        ifp->if_bytes = new_size;
3165}
3166
3167/*
3168 * This is called when incore extents are being added to the indirection
3169 * array and the new extents do not fit in the target extent list. The
3170 * erp_idx parameter contains the irec index for the target extent list
3171 * in the indirection array, and the idx parameter contains the extent
3172 * index within the list. The number of extents being added is stored
3173 * in the count parameter.
3174 *
3175 *    |-------|   |-------|
3176 *    |       |   |       |    idx - number of extents before idx
3177 *    |  idx  |   | count |
3178 *    |       |   |       |    count - number of extents being inserted at idx
3179 *    |-------|   |-------|
3180 *    | count |   | nex2  |    nex2 - number of extents after idx + count
3181 *    |-------|   |-------|
3182 */
3183void
3184xfs_iext_add_indirect_multi(
3185        xfs_ifork_t     *ifp,                   /* inode fork pointer */
3186        int             erp_idx,                /* target extent irec index */
3187        xfs_extnum_t    idx,                    /* index within target list */
3188        int             count)                  /* new extents being added */
3189{
3190        int             byte_diff;              /* new bytes being added */
3191        xfs_ext_irec_t  *erp;                   /* pointer to irec entry */
3192        xfs_extnum_t    ext_diff;               /* number of extents to add */
3193        xfs_extnum_t    ext_cnt;                /* new extents still needed */
3194        xfs_extnum_t    nex2;                   /* extents after idx + count */
3195        xfs_bmbt_rec_t  *nex2_ep = NULL;        /* temp list for nex2 extents */
3196        int             nlists;                 /* number of irec's (lists) */
3197
3198        ASSERT(ifp->if_flags & XFS_IFEXTIREC);
3199        erp = &ifp->if_u1.if_ext_irec[erp_idx];
3200        nex2 = erp->er_extcount - idx;
3201        nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
3202
3203        /*
3204         * Save second part of target extent list
3205         * (all extents past */
3206        if (nex2) {
3207                byte_diff = nex2 * sizeof(xfs_bmbt_rec_t);
3208                nex2_ep = (xfs_bmbt_rec_t *) kmem_alloc(byte_diff, KM_NOFS);
3209                memmove(nex2_ep, &erp->er_extbuf[idx], byte_diff);
3210                erp->er_extcount -= nex2;
3211                xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, -nex2);
3212                memset(&erp->er_extbuf[idx], 0, byte_diff);
3213        }
3214
3215        /*
3216         * Add the new extents to the end of the target
3217         * list, then allocate new irec record(s) and
3218         * extent buffer(s) as needed to store the rest
3219         * of the new extents.
3220         */
3221        ext_cnt = count;
3222        ext_diff = MIN(ext_cnt, (int)XFS_LINEAR_EXTS - erp->er_extcount);
3223        if (ext_diff) {
3224                erp->er_extcount += ext_diff;
3225                xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, ext_diff);
3226                ext_cnt -= ext_diff;
3227        }
3228        while (ext_cnt) {
3229                erp_idx++;
3230                erp = xfs_iext_irec_new(ifp, erp_idx);
3231                ext_diff = MIN(ext_cnt, (int)XFS_LINEAR_EXTS);
3232                erp->er_extcount = ext_diff;
3233                xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, ext_diff);
3234                ext_cnt -= ext_diff;
3235        }
3236
3237        /* Add nex2 extents back to indirection array */
3238        if (nex2) {
3239                xfs_extnum_t    ext_avail;
3240                int             i;
3241
3242                byte_diff = nex2 * sizeof(xfs_bmbt_rec_t);
3243                ext_avail = XFS_LINEAR_EXTS - erp->er_extcount;
3244                i = 0;
3245                /*
3246                 * If nex2 extents fit in the current page, append
3247                 * nex2_ep after the new extents.
3248                 */
3249                if (nex2 <= ext_avail) {
3250                        i = erp->er_extcount;
3251                }
3252                /*
3253                 * Otherwise, check if space is available in the
3254                 * next page.
3255                 */
3256                else if ((erp_idx < nlists - 1) &&
3257                         (nex2 <= (ext_avail = XFS_LINEAR_EXTS -
3258                          ifp->if_u1.if_ext_irec[erp_idx+1].er_extcount))) {
3259                        erp_idx++;
3260                        erp++;
3261                        /* Create a hole for nex2 extents */
3262                        memmove(&erp->er_extbuf[nex2], erp->er_extbuf,
3263                                erp->er_extcount * sizeof(xfs_bmbt_rec_t));
3264                }
3265                /*
3266                 * Final choice, create a new extent page for
3267                 * nex2 extents.
3268                 */
3269                else {
3270                        erp_idx++;
3271                        erp = xfs_iext_irec_new(ifp, erp_idx);
3272                }
3273                memmove(&erp->er_extbuf[i], nex2_ep, byte_diff);
3274                kmem_free(nex2_ep);
3275                erp->er_extcount += nex2;
3276                xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, nex2);
3277        }
3278}
3279
3280/*
3281 * This is called when the amount of space required for incore file
3282 * extents needs to be decreased. The ext_diff parameter stores the
3283 * number of extents to be removed and the idx parameter contains
3284 * the extent index where the extents will be removed from.
3285 *
3286 * If the amount of space needed has decreased below the linear
3287 * limit, XFS_IEXT_BUFSZ, then switch to using the contiguous
3288 * extent array.  Otherwise, use kmem_realloc() to adjust the
3289 * size to what is needed.
3290 */
3291void
3292xfs_iext_remove(
3293        xfs_inode_t     *ip,            /* incore inode pointer */
3294        xfs_extnum_t    idx,            /* index to begin removing exts */
3295        int             ext_diff,       /* number of extents to remove */
3296        int             state)          /* type of extent conversion */
3297{
3298        xfs_ifork_t     *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df;
3299        xfs_extnum_t    nextents;       /* number of extents in file */
3300        int             new_size;       /* size of extents after removal */
3301
3302        trace_xfs_iext_remove(ip, idx, state, _RET_IP_);
3303
3304        ASSERT(ext_diff > 0);
3305        nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
3306        new_size = (nextents - ext_diff) * sizeof(xfs_bmbt_rec_t);
3307
3308        if (new_size == 0) {
3309                xfs_iext_destroy(ifp);
3310        } else if (ifp->if_flags & XFS_IFEXTIREC) {
3311                xfs_iext_remove_indirect(ifp, idx, ext_diff);
3312        } else if (ifp->if_real_bytes) {
3313                xfs_iext_remove_direct(ifp, idx, ext_diff);
3314        } else {
3315                xfs_iext_remove_inline(ifp, idx, ext_diff);
3316        }
3317        ifp->if_bytes = new_size;
3318}
3319
3320/*
3321 * This removes ext_diff extents from the inline buffer, beginning
3322 * at extent index idx.
3323 */
3324void
3325xfs_iext_remove_inline(
3326        xfs_ifork_t     *ifp,           /* inode fork pointer */
3327        xfs_extnum_t    idx,            /* index to begin removing exts */
3328        int             ext_diff)       /* number of extents to remove */
3329{
3330        int             nextents;       /* number of extents in file */
3331
3332        ASSERT(!(ifp->if_flags & XFS_IFEXTIREC));
3333        ASSERT(idx < XFS_INLINE_EXTS);
3334        nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
3335        ASSERT(((nextents - ext_diff) > 0) &&
3336                (nextents - ext_diff) < XFS_INLINE_EXTS);
3337
3338        if (idx + ext_diff < nextents) {
3339                memmove(&ifp->if_u2.if_inline_ext[idx],
3340                        &ifp->if_u2.if_inline_ext[idx + ext_diff],
3341                        (nextents - (idx + ext_diff)) *
3342                         sizeof(xfs_bmbt_rec_t));
3343                memset(&ifp->if_u2.if_inline_ext[nextents - ext_diff],
3344                        0, ext_diff * sizeof(xfs_bmbt_rec_t));
3345        } else {
3346                memset(&ifp->if_u2.if_inline_ext[idx], 0,
3347                        ext_diff * sizeof(xfs_bmbt_rec_t));
3348        }
3349}
3350
3351/*
3352 * This removes ext_diff extents from a linear (direct) extent list,
3353 * beginning at extent index idx. If the extents are being removed
3354 * from the end of the list (ie. truncate) then we just need to re-
3355 * allocate the list to remove the extra space. Otherwise, if the
3356 * extents are being removed from the middle of the existing extent
3357 * entries, then we first need to move the extent records beginning
3358 * at idx + ext_diff up in the list to overwrite the records being
3359 * removed, then remove the extra space via kmem_realloc.
3360 */
3361void
3362xfs_iext_remove_direct(
3363        xfs_ifork_t     *ifp,           /* inode fork pointer */
3364        xfs_extnum_t    idx,            /* index to begin removing exts */
3365        int             ext_diff)       /* number of extents to remove */
3366{
3367        xfs_extnum_t    nextents;       /* number of extents in file */
3368        int             new_size;       /* size of extents after removal */
3369
3370        ASSERT(!(ifp->if_flags & XFS_IFEXTIREC));
3371        new_size = ifp->if_bytes -
3372                (ext_diff * sizeof(xfs_bmbt_rec_t));
3373        nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
3374
3375        if (new_size == 0) {
3376                xfs_iext_destroy(ifp);
3377                return;
3378        }
3379        /* Move extents up in the list (if needed) */
3380        if (idx + ext_diff < nextents) {
3381                memmove(&ifp->if_u1.if_extents[idx],
3382                        &ifp->if_u1.if_extents[idx + ext_diff],
3383                        (nextents - (idx + ext_diff)) *
3384                         sizeof(xfs_bmbt_rec_t));
3385        }
3386        memset(&ifp->if_u1.if_extents[nextents - ext_diff],
3387                0, ext_diff * sizeof(xfs_bmbt_rec_t));
3388        /*
3389         * Reallocate the direct extent list. If the extents
3390         * will fit inside the inode then xfs_iext_realloc_direct
3391         * will switch from direct to inline extent allocation
3392         * mode for us.
3393         */
3394        xfs_iext_realloc_direct(ifp, new_size);
3395        ifp->if_bytes = new_size;
3396}
3397
3398/*
3399 * This is called when incore extents are being removed from the
3400 * indirection array and the extents being removed span multiple extent
3401 * buffers. The idx parameter contains the file extent index where we
3402 * want to begin removing extents, and the count parameter contains
3403 * how many extents need to be removed.
3404 *
3405 *    |-------|   |-------|
3406 *    | nex1  |   |       |    nex1 - number of extents before idx
3407 *    |-------|   | count |
3408 *    |       |   |       |    count - number of extents being removed at idx
3409 *    | count |   |-------|
3410 *    |       |   | nex2  |    nex2 - number of extents after idx + count
3411 *    |-------|   |-------|
3412 */
3413void
3414xfs_iext_remove_indirect(
3415        xfs_ifork_t     *ifp,           /* inode fork pointer */
3416        xfs_extnum_t    idx,            /* index to begin removing extents */
3417        int             count)          /* number of extents to remove */
3418{
3419        xfs_ext_irec_t  *erp;           /* indirection array pointer */
3420        int             erp_idx = 0;    /* indirection array index */
3421        xfs_extnum_t    ext_cnt;        /* extents left to remove */
3422        xfs_extnum_t    ext_diff;       /* extents to remove in current list */
3423        xfs_extnum_t    nex1;           /* number of extents before idx */
3424        xfs_extnum_t    nex2;           /* extents after idx + count */
3425        int             page_idx = idx; /* index in target extent list */
3426
3427        ASSERT(ifp->if_flags & XFS_IFEXTIREC);
3428        erp = xfs_iext_idx_to_irec(ifp,  &page_idx, &erp_idx, 0);
3429        ASSERT(erp != NULL);
3430        nex1 = page_idx;
3431        ext_cnt = count;
3432        while (ext_cnt) {
3433                nex2 = MAX((erp->er_extcount - (nex1 + ext_cnt)), 0);
3434                ext_diff = MIN(ext_cnt, (erp->er_extcount - nex1));
3435                /*
3436                 * Check for deletion of entire list;
3437                 * xfs_iext_irec_remove() updates extent offsets.
3438                 */
3439                if (ext_diff == erp->er_extcount) {
3440                        xfs_iext_irec_remove(ifp, erp_idx);
3441                        ext_cnt -= ext_diff;
3442                        nex1 = 0;
3443                        if (ext_cnt) {
3444                                ASSERT(erp_idx < ifp->if_real_bytes /
3445                                        XFS_IEXT_BUFSZ);
3446                                erp = &ifp->if_u1.if_ext_irec[erp_idx];
3447                                nex1 = 0;
3448                                continue;
3449                        } else {
3450                                break;
3451                        }
3452                }
3453                /* Move extents up (if needed) */
3454                if (nex2) {
3455                        memmove(&erp->er_extbuf[nex1],
3456                                &erp->er_extbuf[nex1 + ext_diff],
3457                                nex2 * sizeof(xfs_bmbt_rec_t));
3458                }
3459                /* Zero out rest of page */
3460                memset(&erp->er_extbuf[nex1 + nex2], 0, (XFS_IEXT_BUFSZ -
3461                        ((nex1 + nex2) * sizeof(xfs_bmbt_rec_t))));
3462                /* Update remaining counters */
3463                erp->er_extcount -= ext_diff;
3464                xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, -ext_diff);
3465                ext_cnt -= ext_diff;
3466                nex1 = 0;
3467                erp_idx++;
3468                erp++;
3469        }
3470        ifp->if_bytes -= count * sizeof(xfs_bmbt_rec_t);
3471        xfs_iext_irec_compact(ifp);
3472}
3473
3474/*
3475 * Create, destroy, or resize a linear (direct) block of extents.
3476 */
3477void
3478xfs_iext_realloc_direct(
3479        xfs_ifork_t     *ifp,           /* inode fork pointer */
3480        int             new_size)       /* new size of extents */
3481{
3482        int             rnew_size;      /* real new size of extents */
3483
3484        rnew_size = new_size;
3485
3486        ASSERT(!(ifp->if_flags & XFS_IFEXTIREC) ||
3487                ((new_size >= 0) && (new_size <= XFS_IEXT_BUFSZ) &&
3488                 (new_size != ifp->if_real_bytes)));
3489
3490        /* Free extent records */
3491        if (new_size == 0) {
3492                xfs_iext_destroy(ifp);
3493        }
3494        /* Resize direct extent list and zero any new bytes */
3495        else if (ifp->if_real_bytes) {
3496                /* Check if extents will fit inside the inode */
3497                if (new_size <= XFS_INLINE_EXTS * sizeof(xfs_bmbt_rec_t)) {
3498                        xfs_iext_direct_to_inline(ifp, new_size /
3499                                (uint)sizeof(xfs_bmbt_rec_t));
3500                        ifp->if_bytes = new_size;
3501                        return;
3502                }
3503                if (!is_power_of_2(new_size)){
3504                        rnew_size = roundup_pow_of_two(new_size);
3505                }
3506                if (rnew_size != ifp->if_real_bytes) {
3507                        ifp->if_u1.if_extents =
3508                                kmem_realloc(ifp->if_u1.if_extents,
3509                                                rnew_size,
3510                                                ifp->if_real_bytes, KM_NOFS);
3511                }
3512                if (rnew_size > ifp->if_real_bytes) {
3513                        memset(&ifp->if_u1.if_extents[ifp->if_bytes /
3514                                (uint)sizeof(xfs_bmbt_rec_t)], 0,
3515                                rnew_size - ifp->if_real_bytes);
3516                }
3517        }
3518        /*
3519         * Switch from the inline extent buffer to a direct
3520         * extent list. Be sure to include the inline extent
3521         * bytes in new_size.
3522         */
3523        else {
3524                new_size += ifp->if_bytes;
3525                if (!is_power_of_2(new_size)) {
3526                        rnew_size = roundup_pow_of_two(new_size);
3527                }
3528                xfs_iext_inline_to_direct(ifp, rnew_size);
3529        }
3530        ifp->if_real_bytes = rnew_size;
3531        ifp->if_bytes = new_size;
3532}
3533
3534/*
3535 * Switch from linear (direct) extent records to inline buffer.
3536 */
3537void
3538xfs_iext_direct_to_inline(
3539        xfs_ifork_t     *ifp,           /* inode fork pointer */
3540        xfs_extnum_t    nextents)       /* number of extents in file */
3541{
3542        ASSERT(ifp->if_flags & XFS_IFEXTENTS);
3543        ASSERT(nextents <= XFS_INLINE_EXTS);
3544        /*
3545         * The inline buffer was zeroed when we switched
3546         * from inline to direct extent allocation mode,
3547         * so we don't need to clear it here.
3548         */
3549        memcpy(ifp->if_u2.if_inline_ext, ifp->if_u1.if_extents,
3550                nextents * sizeof(xfs_bmbt_rec_t));
3551        kmem_free(ifp->if_u1.if_extents);
3552        ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext;
3553        ifp->if_real_bytes = 0;
3554}
3555
3556/*
3557 * Switch from inline buffer to linear (direct) extent records.
3558 * new_size should already be rounded up to the next power of 2
3559 * by the caller (when appropriate), so use new_size as it is.
3560 * However, since new_size may be rounded up, we can't update
3561 * if_bytes here. It is the caller's responsibility to update
3562 * if_bytes upon return.
3563 */
3564void
3565xfs_iext_inline_to_direct(
3566        xfs_ifork_t     *ifp,           /* inode fork pointer */
3567        int             new_size)       /* number of extents in file */
3568{
3569        ifp->if_u1.if_extents = kmem_alloc(new_size, KM_NOFS);
3570        memset(ifp->if_u1.if_extents, 0, new_size);
3571        if (ifp->if_bytes) {
3572                memcpy(ifp->if_u1.if_extents, ifp->if_u2.if_inline_ext,
3573                        ifp->if_bytes);
3574                memset(ifp->if_u2.if_inline_ext, 0, XFS_INLINE_EXTS *
3575                        sizeof(xfs_bmbt_rec_t));
3576        }
3577        ifp->if_real_bytes = new_size;
3578}
3579
3580/*
3581 * Resize an extent indirection array to new_size bytes.
3582 */
3583STATIC void
3584xfs_iext_realloc_indirect(
3585        xfs_ifork_t     *ifp,           /* inode fork pointer */
3586        int             new_size)       /* new indirection array size */
3587{
3588        int             nlists;         /* number of irec's (ex lists) */
3589        int             size;           /* current indirection array size */
3590
3591        ASSERT(ifp->if_flags & XFS_IFEXTIREC);
3592        nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
3593        size = nlists * sizeof(xfs_ext_irec_t);
3594        ASSERT(ifp->if_real_bytes);
3595        ASSERT((new_size >= 0) && (new_size != size));
3596        if (new_size == 0) {
3597                xfs_iext_destroy(ifp);
3598        } else {
3599                ifp->if_u1.if_ext_irec = (xfs_ext_irec_t *)
3600                        kmem_realloc(ifp->if_u1.if_ext_irec,
3601                                new_size, size, KM_NOFS);
3602        }
3603}
3604
3605/*
3606 * Switch from indirection array to linear (direct) extent allocations.
3607 */
3608STATIC void
3609xfs_iext_indirect_to_direct(
3610         xfs_ifork_t    *ifp)           /* inode fork pointer */
3611{
3612        xfs_bmbt_rec_host_t *ep;        /* extent record pointer */
3613        xfs_extnum_t    nextents;       /* number of extents in file */
3614        int             size;           /* size of file extents */
3615
3616        ASSERT(ifp->if_flags & XFS_IFEXTIREC);
3617        nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
3618        ASSERT(nextents <= XFS_LINEAR_EXTS);
3619        size = nextents * sizeof(xfs_bmbt_rec_t);
3620
3621        xfs_iext_irec_compact_pages(ifp);
3622        ASSERT(ifp->if_real_bytes == XFS_IEXT_BUFSZ);
3623
3624        ep = ifp->if_u1.if_ext_irec->er_extbuf;
3625        kmem_free(ifp->if_u1.if_ext_irec);
3626        ifp->if_flags &= ~XFS_IFEXTIREC;
3627        ifp->if_u1.if_extents = ep;
3628        ifp->if_bytes = size;
3629        if (nextents < XFS_LINEAR_EXTS) {
3630                xfs_iext_realloc_direct(ifp, size);
3631        }
3632}
3633
3634/*
3635 * Free incore file extents.
3636 */
3637void
3638xfs_iext_destroy(
3639        xfs_ifork_t     *ifp)           /* inode fork pointer */
3640{
3641        if (ifp->if_flags & XFS_IFEXTIREC) {
3642                int     erp_idx;
3643                int     nlists;
3644
3645                nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
3646                for (erp_idx = nlists - 1; erp_idx >= 0 ; erp_idx--) {
3647                        xfs_iext_irec_remove(ifp, erp_idx);
3648                }
3649                ifp->if_flags &= ~XFS_IFEXTIREC;
3650        } else if (ifp->if_real_bytes) {
3651                kmem_free(ifp->if_u1.if_extents);
3652        } else if (ifp->if_bytes) {
3653                memset(ifp->if_u2.if_inline_ext, 0, XFS_INLINE_EXTS *
3654                        sizeof(xfs_bmbt_rec_t));
3655        }
3656        ifp->if_u1.if_extents = NULL;
3657        ifp->if_real_bytes = 0;
3658        ifp->if_bytes = 0;
3659}
3660
3661/*
3662 * Return a pointer to the extent record for file system block bno.
3663 */
3664xfs_bmbt_rec_host_t *                   /* pointer to found extent record */
3665xfs_iext_bno_to_ext(
3666        xfs_ifork_t     *ifp,           /* inode fork pointer */
3667        xfs_fileoff_t   bno,            /* block number to search for */
3668        xfs_extnum_t    *idxp)          /* index of target extent */
3669{
3670        xfs_bmbt_rec_host_t *base;      /* pointer to first extent */
3671        xfs_filblks_t   blockcount = 0; /* number of blocks in extent */
3672        xfs_bmbt_rec_host_t *ep = NULL; /* pointer to target extent */
3673        xfs_ext_irec_t  *erp = NULL;    /* indirection array pointer */
3674        int             high;           /* upper boundary in search */
3675        xfs_extnum_t    idx = 0;        /* index of target extent */
3676        int             low;            /* lower boundary in search */
3677        xfs_extnum_t    nextents;       /* number of file extents */
3678        xfs_fileoff_t   startoff = 0;   /* start offset of extent */
3679
3680        nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
3681        if (nextents == 0) {
3682                *idxp = 0;
3683                return NULL;
3684        }
3685        low = 0;
3686        if (ifp->if_flags & XFS_IFEXTIREC) {
3687                /* Find target extent list */
3688                int     erp_idx = 0;
3689                erp = xfs_iext_bno_to_irec(ifp, bno, &erp_idx);
3690                base = erp->er_extbuf;
3691                high = erp->er_extcount - 1;
3692        } else {
3693                base = ifp->if_u1.if_extents;
3694                high = nextents - 1;
3695        }
3696        /* Binary search extent records */
3697        while (low <= high) {
3698                idx = (low + high) >> 1;
3699                ep = base + idx;
3700                startoff = xfs_bmbt_get_startoff(ep);
3701                blockcount = xfs_bmbt_get_blockcount(ep);
3702                if (bno < startoff) {
3703                        high = idx - 1;
3704                } else if (bno >= startoff + blockcount) {
3705                        low = idx + 1;
3706                } else {
3707                        /* Convert back to file-based extent index */
3708                        if (ifp->if_flags & XFS_IFEXTIREC) {
3709                                idx += erp->er_extoff;
3710                        }
3711                        *idxp = idx;
3712                        return ep;
3713                }
3714        }
3715        /* Convert back to file-based extent index */
3716        if (ifp->if_flags & XFS_IFEXTIREC) {
3717                idx += erp->er_extoff;
3718        }
3719        if (bno >= startoff + blockcount) {
3720                if (++idx == nextents) {
3721                        ep = NULL;
3722                } else {
3723                        ep = xfs_iext_get_ext(ifp, idx);
3724                }
3725        }
3726        *idxp = idx;
3727        return ep;
3728}
3729
3730/*
3731 * Return a pointer to the indirection array entry containing the
3732 * extent record for filesystem block bno. Store the index of the
3733 * target irec in *erp_idxp.
3734 */
3735xfs_ext_irec_t *                        /* pointer to found extent record */
3736xfs_iext_bno_to_irec(
3737        xfs_ifork_t     *ifp,           /* inode fork pointer */
3738        xfs_fileoff_t   bno,            /* block number to search for */
3739        int             *erp_idxp)      /* irec index of target ext list */
3740{
3741        xfs_ext_irec_t  *erp = NULL;    /* indirection array pointer */
3742        xfs_ext_irec_t  *erp_next;      /* next indirection array entry */
3743        int             erp_idx;        /* indirection array index */
3744        int             nlists;         /* number of extent irec's (lists) */
3745        int             high;           /* binary search upper limit */
3746        int             low;            /* binary search lower limit */
3747
3748        ASSERT(ifp->if_flags & XFS_IFEXTIREC);
3749        nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
3750        erp_idx = 0;
3751        low = 0;
3752        high = nlists - 1;
3753        while (low <= high) {
3754                erp_idx = (low + high) >> 1;
3755                erp = &ifp->if_u1.if_ext_irec[erp_idx];
3756                erp_next = erp_idx < nlists - 1 ? erp + 1 : NULL;
3757                if (bno < xfs_bmbt_get_startoff(erp->er_extbuf)) {
3758                        high = erp_idx - 1;
3759                } else if (erp_next && bno >=
3760                           xfs_bmbt_get_startoff(erp_next->er_extbuf)) {
3761                        low = erp_idx + 1;
3762                } else {
3763                        break;
3764                }
3765        }
3766        *erp_idxp = erp_idx;
3767        return erp;
3768}
3769
3770/*
3771 * Return a pointer to the indirection array entry containing the
3772 * extent record at file extent index *idxp. Store the index of the
3773 * target irec in *erp_idxp and store the page index of the target
3774 * extent record in *idxp.
3775 */
3776xfs_ext_irec_t *
3777xfs_iext_idx_to_irec(
3778        xfs_ifork_t     *ifp,           /* inode fork pointer */
3779        xfs_extnum_t    *idxp,          /* extent index (file -> page) */
3780        int             *erp_idxp,      /* pointer to target irec */
3781        int             realloc)        /* new bytes were just added */
3782{
3783        xfs_ext_irec_t  *prev;          /* pointer to previous irec */
3784        xfs_ext_irec_t  *erp = NULL;    /* pointer to current irec */
3785        int             erp_idx;        /* indirection array index */
3786        int             nlists;         /* number of irec's (ex lists) */
3787        int             high;           /* binary search upper limit */
3788        int             low;            /* binary search lower limit */
3789        xfs_extnum_t    page_idx = *idxp; /* extent index in target list */
3790
3791        ASSERT(ifp->if_flags & XFS_IFEXTIREC);
3792        ASSERT(page_idx >= 0);
3793        ASSERT(page_idx <= ifp->if_bytes / sizeof(xfs_bmbt_rec_t));
3794        ASSERT(page_idx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t) || realloc);
3795
3796        nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
3797        erp_idx = 0;
3798        low = 0;
3799        high = nlists - 1;
3800
3801        /* Binary search extent irec's */
3802        while (low <= high) {
3803                erp_idx = (low + high) >> 1;
3804                erp = &ifp->if_u1.if_ext_irec[erp_idx];
3805                prev = erp_idx > 0 ? erp - 1 : NULL;
3806                if (page_idx < erp->er_extoff || (page_idx == erp->er_extoff &&
3807                     realloc && prev && prev->er_extcount < XFS_LINEAR_EXTS)) {
3808                        high = erp_idx - 1;
3809                } else if (page_idx > erp->er_extoff + erp->er_extcount ||
3810                           (page_idx == erp->er_extoff + erp->er_extcount &&
3811                            !realloc)) {
3812                        low = erp_idx + 1;
3813                } else if (page_idx == erp->er_extoff + erp->er_extcount &&
3814                           erp->er_extcount == XFS_LINEAR_EXTS) {
3815                        ASSERT(realloc);
3816                        page_idx = 0;
3817                        erp_idx++;
3818                        erp = erp_idx < nlists ? erp + 1 : NULL;
3819                        break;
3820                } else {
3821                        page_idx -= erp->er_extoff;
3822                        break;
3823                }
3824        }
3825        *idxp = page_idx;
3826        *erp_idxp = erp_idx;
3827        return(erp);
3828}
3829
3830/*
3831 * Allocate and initialize an indirection array once the space needed
3832 * for incore extents increases above XFS_IEXT_BUFSZ.
3833 */
3834void
3835xfs_iext_irec_init(
3836        xfs_ifork_t     *ifp)           /* inode fork pointer */
3837{
3838        xfs_ext_irec_t  *erp;           /* indirection array pointer */
3839        xfs_extnum_t    nextents;       /* number of extents in file */
3840
3841        ASSERT(!(ifp->if_flags & XFS_IFEXTIREC));
3842        nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
3843        ASSERT(nextents <= XFS_LINEAR_EXTS);
3844
3845        erp = kmem_alloc(sizeof(xfs_ext_irec_t), KM_NOFS);
3846
3847        if (nextents == 0) {
3848                ifp->if_u1.if_extents = kmem_alloc(XFS_IEXT_BUFSZ, KM_NOFS);
3849        } else if (!ifp->if_real_bytes) {
3850                xfs_iext_inline_to_direct(ifp, XFS_IEXT_BUFSZ);
3851        } else if (ifp->if_real_bytes < XFS_IEXT_BUFSZ) {
3852                xfs_iext_realloc_direct(ifp, XFS_IEXT_BUFSZ);
3853        }
3854        erp->er_extbuf = ifp->if_u1.if_extents;
3855        erp->er_extcount = nextents;
3856        erp->er_extoff = 0;
3857
3858        ifp->if_flags |= XFS_IFEXTIREC;
3859        ifp->if_real_bytes = XFS_IEXT_BUFSZ;
3860        ifp->if_bytes = nextents * sizeof(xfs_bmbt_rec_t);
3861        ifp->if_u1.if_ext_irec = erp;
3862
3863        return;
3864}
3865
3866/*
3867 * Allocate and initialize a new entry in the indirection array.
3868 */
3869xfs_ext_irec_t *
3870xfs_iext_irec_new(
3871        xfs_ifork_t     *ifp,           /* inode fork pointer */
3872        int             erp_idx)        /* index for new irec */
3873{
3874        xfs_ext_irec_t  *erp;           /* indirection array pointer */
3875        int             i;              /* loop counter */
3876        int             nlists;         /* number of irec's (ex lists) */
3877
3878        ASSERT(ifp->if_flags & XFS_IFEXTIREC);
3879        nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
3880
3881        /* Resize indirection array */
3882        xfs_iext_realloc_indirect(ifp, ++nlists *
3883                                  sizeof(xfs_ext_irec_t));
3884        /*
3885         * Move records down in the array so the
3886         * new page can use erp_idx.
3887         */
3888        erp = ifp->if_u1.if_ext_irec;
3889        for (i = nlists - 1; i > erp_idx; i--) {
3890                memmove(&erp[i], &erp[i-1], sizeof(xfs_ext_irec_t));
3891        }
3892        ASSERT(i == erp_idx);
3893
3894        /* Initialize new extent record */
3895        erp = ifp->if_u1.if_ext_irec;
3896        erp[erp_idx].er_extbuf = kmem_alloc(XFS_IEXT_BUFSZ, KM_NOFS);
3897        ifp->if_real_bytes = nlists * XFS_IEXT_BUFSZ;
3898        memset(erp[erp_idx].er_extbuf, 0, XFS_IEXT_BUFSZ);
3899        erp[erp_idx].er_extcount = 0;
3900        erp[erp_idx].er_extoff = erp_idx > 0 ?
3901                erp[erp_idx-1].er_extoff + erp[erp_idx-1].er_extcount : 0;
3902        return (&erp[erp_idx]);
3903}
3904
3905/*
3906 * Remove a record from the indirection array.
3907 */
3908void
3909xfs_iext_irec_remove(
3910        xfs_ifork_t     *ifp,           /* inode fork pointer */
3911        int             erp_idx)        /* irec index to remove */
3912{
3913        xfs_ext_irec_t  *erp;           /* indirection array pointer */
3914        int             i;              /* loop counter */
3915        int             nlists;         /* number of irec's (ex lists) */
3916
3917        ASSERT(ifp->if_flags & XFS_IFEXTIREC);
3918        nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
3919        erp = &ifp->if_u1.if_ext_irec[erp_idx];
3920        if (erp->er_extbuf) {
3921                xfs_iext_irec_update_extoffs(ifp, erp_idx + 1,
3922                        -erp->er_extcount);
3923                kmem_free(erp->er_extbuf);
3924        }
3925        /* Compact extent records */
3926        erp = ifp->if_u1.if_ext_irec;
3927        for (i = erp_idx; i < nlists - 1; i++) {
3928                memmove(&erp[i], &erp[i+1], sizeof(xfs_ext_irec_t));
3929        }
3930        /*
3931         * Manually free the last extent record from the indirection
3932         * array.  A call to xfs_iext_realloc_indirect() with a size
3933         * of zero would result in a call to xfs_iext_destroy() which
3934         * would in turn call this function again, creating a nasty
3935         * infinite loop.
3936         */
3937        if (--nlists) {
3938                xfs_iext_realloc_indirect(ifp,
3939                        nlists * sizeof(xfs_ext_irec_t));
3940        } else {
3941                kmem_free(ifp->if_u1.if_ext_irec);
3942        }
3943        ifp->if_real_bytes = nlists * XFS_IEXT_BUFSZ;
3944}
3945
3946/*
3947 * This is called to clean up large amounts of unused memory allocated
3948 * by the indirection array.  Before compacting anything though, verify
3949 * that the indirection array is still needed and switch back to the
3950 * linear extent list (or even the inline buffer) if possible.  The
3951 * compaction policy is as follows:
3952 *
3953 *    Full Compaction: Extents fit into a single page (or inline buffer)
3954 * Partial Compaction: Extents occupy less than 50% of allocated space
3955 *      No Compaction: Extents occupy at least 50% of allocated space
3956 */
3957void
3958xfs_iext_irec_compact(
3959        xfs_ifork_t     *ifp)           /* inode fork pointer */
3960{
3961        xfs_extnum_t    nextents;       /* number of extents in file */
3962        int             nlists;         /* number of irec's (ex lists) */
3963
3964        ASSERT(ifp->if_flags & XFS_IFEXTIREC);
3965        nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
3966        nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
3967
3968        if (nextents == 0) {
3969                xfs_iext_destroy(ifp);
3970        } else if (nextents <= XFS_INLINE_EXTS) {
3971                xfs_iext_indirect_to_direct(ifp);
3972                xfs_iext_direct_to_inline(ifp, nextents);
3973        } else if (nextents <= XFS_LINEAR_EXTS) {
3974                xfs_iext_indirect_to_direct(ifp);
3975        } else if (nextents < (nlists * XFS_LINEAR_EXTS) >> 1) {
3976                xfs_iext_irec_compact_pages(ifp);
3977        }
3978}
3979
3980/*
3981 * Combine extents from neighboring extent pages.
3982 */
3983void
3984xfs_iext_irec_compact_pages(
3985        xfs_ifork_t     *ifp)           /* inode fork pointer */
3986{
3987        xfs_ext_irec_t  *erp, *erp_next;/* pointers to irec entries */
3988        int             erp_idx = 0;    /* indirection array index */
3989        int             nlists;         /* number of irec's (ex lists) */
3990
3991        ASSERT(ifp->if_flags & XFS_IFEXTIREC);
3992        nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
3993        while (erp_idx < nlists - 1) {
3994                erp = &ifp->if_u1.if_ext_irec[erp_idx];
3995                erp_next = erp + 1;
3996                if (erp_next->er_extcount <=
3997                    (XFS_LINEAR_EXTS - erp->er_extcount)) {
3998                        memcpy(&erp->er_extbuf[erp->er_extcount],
3999                                erp_next->er_extbuf, erp_next->er_extcount *
4000                                sizeof(xfs_bmbt_rec_t));
4001                        erp->er_extcount += erp_next->er_extcount;
4002                        /*
4003                         * Free page before removing extent record
4004                         * so er_extoffs don't get modified in
4005                         * xfs_iext_irec_remove.
4006                         */
4007                        kmem_free(erp_next->er_extbuf);
4008                        erp_next->er_extbuf = NULL;
4009                        xfs_iext_irec_remove(ifp, erp_idx + 1);
4010                        nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4011                } else {
4012                        erp_idx++;
4013                }
4014        }
4015}
4016
4017/*
4018 * This is called to update the er_extoff field in the indirection
4019 * array when extents have been added or removed from one of the
4020 * extent lists. erp_idx contains the irec index to begin updating
4021 * at and ext_diff contains the number of extents that were added
4022 * or removed.
4023 */
4024void
4025xfs_iext_irec_update_extoffs(
4026        xfs_ifork_t     *ifp,           /* inode fork pointer */
4027        int             erp_idx,        /* irec index to update */
4028        int             ext_diff)       /* number of new extents */
4029{
4030        int             i;              /* loop counter */
4031        int             nlists;         /* number of irec's (ex lists */
4032
4033        ASSERT(ifp->if_flags & XFS_IFEXTIREC);
4034        nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ;
4035        for (i = erp_idx; i < nlists; i++) {
4036                ifp->if_u1.if_ext_irec[i].er_extoff += ext_diff;
4037        }
4038}
4039
4040/*
4041 * Test whether it is appropriate to check an inode for and free post EOF
4042 * blocks. The 'force' parameter determines whether we should also consider
4043 * regular files that are marked preallocated or append-only.
4044 */
4045bool
4046xfs_can_free_eofblocks(struct xfs_inode *ip, bool force)
4047{
4048        /* prealloc/delalloc exists only on regular files */
4049        if (!S_ISREG(ip->i_d.di_mode))
4050                return false;
4051
4052        /*
4053         * Zero sized files with no cached pages and delalloc blocks will not
4054         * have speculative prealloc/delalloc blocks to remove.
4055         */
4056        if (VFS_I(ip)->i_size == 0 &&
4057            VN_CACHED(VFS_I(ip)) == 0 &&
4058            ip->i_delayed_blks == 0)
4059                return false;
4060
4061        /* If we haven't read in the extent list, then don't do it now. */
4062        if (!(ip->i_df.if_flags & XFS_IFEXTENTS))
4063                return false;
4064
4065        /*
4066         * Do not free real preallocated or append-only files unless the file
4067         * has delalloc blocks and we are forced to remove them.
4068         */
4069        if (ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND))
4070                if (!force || ip->i_delayed_blks == 0)
4071                        return false;
4072
4073        return true;
4074}
4075
4076
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.