linux/fs/xfs/xfs_attr_inactive.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
   3 * Copyright (c) 2013 Red Hat, Inc.
   4 * All Rights Reserved.
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public License as
   8 * published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it would be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License
  16 * along with this program; if not, write the Free Software Foundation,
  17 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  18 */
  19#include "xfs.h"
  20#include "xfs_fs.h"
  21#include "xfs_shared.h"
  22#include "xfs_format.h"
  23#include "xfs_log_format.h"
  24#include "xfs_trans_resv.h"
  25#include "xfs_bit.h"
  26#include "xfs_sb.h"
  27#include "xfs_ag.h"
  28#include "xfs_mount.h"
  29#include "xfs_da_format.h"
  30#include "xfs_da_btree.h"
  31#include "xfs_inode.h"
  32#include "xfs_alloc.h"
  33#include "xfs_attr_remote.h"
  34#include "xfs_trans.h"
  35#include "xfs_inode_item.h"
  36#include "xfs_bmap.h"
  37#include "xfs_attr.h"
  38#include "xfs_attr_leaf.h"
  39#include "xfs_error.h"
  40#include "xfs_quota.h"
  41#include "xfs_trace.h"
  42#include "xfs_dinode.h"
  43#include "xfs_dir2.h"
  44
  45/*
  46 * Look at all the extents for this logical region,
  47 * invalidate any buffers that are incore/in transactions.
  48 */
  49STATIC int
  50xfs_attr3_leaf_freextent(
  51        struct xfs_trans        **trans,
  52        struct xfs_inode        *dp,
  53        xfs_dablk_t             blkno,
  54        int                     blkcnt)
  55{
  56        struct xfs_bmbt_irec    map;
  57        struct xfs_buf          *bp;
  58        xfs_dablk_t             tblkno;
  59        xfs_daddr_t             dblkno;
  60        int                     tblkcnt;
  61        int                     dblkcnt;
  62        int                     nmap;
  63        int                     error;
  64
  65        /*
  66         * Roll through the "value", invalidating the attribute value's
  67         * blocks.
  68         */
  69        tblkno = blkno;
  70        tblkcnt = blkcnt;
  71        while (tblkcnt > 0) {
  72                /*
  73                 * Try to remember where we decided to put the value.
  74                 */
  75                nmap = 1;
  76                error = xfs_bmapi_read(dp, (xfs_fileoff_t)tblkno, tblkcnt,
  77                                       &map, &nmap, XFS_BMAPI_ATTRFORK);
  78                if (error) {
  79                        return(error);
  80                }
  81                ASSERT(nmap == 1);
  82                ASSERT(map.br_startblock != DELAYSTARTBLOCK);
  83
  84                /*
  85                 * If it's a hole, these are already unmapped
  86                 * so there's nothing to invalidate.
  87                 */
  88                if (map.br_startblock != HOLESTARTBLOCK) {
  89
  90                        dblkno = XFS_FSB_TO_DADDR(dp->i_mount,
  91                                                  map.br_startblock);
  92                        dblkcnt = XFS_FSB_TO_BB(dp->i_mount,
  93                                                map.br_blockcount);
  94                        bp = xfs_trans_get_buf(*trans,
  95                                        dp->i_mount->m_ddev_targp,
  96                                        dblkno, dblkcnt, 0);
  97                        if (!bp)
  98                                return ENOMEM;
  99                        xfs_trans_binval(*trans, bp);
 100                        /*
 101                         * Roll to next transaction.
 102                         */
 103                        error = xfs_trans_roll(trans, dp);
 104                        if (error)
 105                                return (error);
 106                }
 107
 108                tblkno += map.br_blockcount;
 109                tblkcnt -= map.br_blockcount;
 110        }
 111
 112        return(0);
 113}
 114
 115/*
 116 * Invalidate all of the "remote" value regions pointed to by a particular
 117 * leaf block.
 118 * Note that we must release the lock on the buffer so that we are not
 119 * caught holding something that the logging code wants to flush to disk.
 120 */
 121STATIC int
 122xfs_attr3_leaf_inactive(
 123        struct xfs_trans        **trans,
 124        struct xfs_inode        *dp,
 125        struct xfs_buf          *bp)
 126{
 127        struct xfs_attr_leafblock *leaf;
 128        struct xfs_attr3_icleaf_hdr ichdr;
 129        struct xfs_attr_leaf_entry *entry;
 130        struct xfs_attr_leaf_name_remote *name_rmt;
 131        struct xfs_attr_inactive_list *list;
 132        struct xfs_attr_inactive_list *lp;
 133        int                     error;
 134        int                     count;
 135        int                     size;
 136        int                     tmp;
 137        int                     i;
 138
 139        leaf = bp->b_addr;
 140        xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf);
 141
 142        /*
 143         * Count the number of "remote" value extents.
 144         */
 145        count = 0;
 146        entry = xfs_attr3_leaf_entryp(leaf);
 147        for (i = 0; i < ichdr.count; entry++, i++) {
 148                if (be16_to_cpu(entry->nameidx) &&
 149                    ((entry->flags & XFS_ATTR_LOCAL) == 0)) {
 150                        name_rmt = xfs_attr3_leaf_name_remote(leaf, i);
 151                        if (name_rmt->valueblk)
 152                                count++;
 153                }
 154        }
 155
 156        /*
 157         * If there are no "remote" values, we're done.
 158         */
 159        if (count == 0) {
 160                xfs_trans_brelse(*trans, bp);
 161                return 0;
 162        }
 163
 164        /*
 165         * Allocate storage for a list of all the "remote" value extents.
 166         */
 167        size = count * sizeof(xfs_attr_inactive_list_t);
 168        list = kmem_alloc(size, KM_SLEEP);
 169
 170        /*
 171         * Identify each of the "remote" value extents.
 172         */
 173        lp = list;
 174        entry = xfs_attr3_leaf_entryp(leaf);
 175        for (i = 0; i < ichdr.count; entry++, i++) {
 176                if (be16_to_cpu(entry->nameidx) &&
 177                    ((entry->flags & XFS_ATTR_LOCAL) == 0)) {
 178                        name_rmt = xfs_attr3_leaf_name_remote(leaf, i);
 179                        if (name_rmt->valueblk) {
 180                                lp->valueblk = be32_to_cpu(name_rmt->valueblk);
 181                                lp->valuelen = xfs_attr3_rmt_blocks(dp->i_mount,
 182                                                    be32_to_cpu(name_rmt->valuelen));
 183                                lp++;
 184                        }
 185                }
 186        }
 187        xfs_trans_brelse(*trans, bp);   /* unlock for trans. in freextent() */
 188
 189        /*
 190         * Invalidate each of the "remote" value extents.
 191         */
 192        error = 0;
 193        for (lp = list, i = 0; i < count; i++, lp++) {
 194                tmp = xfs_attr3_leaf_freextent(trans, dp,
 195                                lp->valueblk, lp->valuelen);
 196
 197                if (error == 0)
 198                        error = tmp;    /* save only the 1st errno */
 199        }
 200
 201        kmem_free(list);
 202        return error;
 203}
 204
 205/*
 206 * Recurse (gasp!) through the attribute nodes until we find leaves.
 207 * We're doing a depth-first traversal in order to invalidate everything.
 208 */
 209STATIC int
 210xfs_attr3_node_inactive(
 211        struct xfs_trans **trans,
 212        struct xfs_inode *dp,
 213        struct xfs_buf  *bp,
 214        int             level)
 215{
 216        xfs_da_blkinfo_t *info;
 217        xfs_da_intnode_t *node;
 218        xfs_dablk_t child_fsb;
 219        xfs_daddr_t parent_blkno, child_blkno;
 220        int error, i;
 221        struct xfs_buf *child_bp;
 222        struct xfs_da_node_entry *btree;
 223        struct xfs_da3_icnode_hdr ichdr;
 224
 225        /*
 226         * Since this code is recursive (gasp!) we must protect ourselves.
 227         */
 228        if (level > XFS_DA_NODE_MAXDEPTH) {
 229                xfs_trans_brelse(*trans, bp);   /* no locks for later trans */
 230                return XFS_ERROR(EIO);
 231        }
 232
 233        node = bp->b_addr;
 234        dp->d_ops->node_hdr_from_disk(&ichdr, node);
 235        parent_blkno = bp->b_bn;
 236        if (!ichdr.count) {
 237                xfs_trans_brelse(*trans, bp);
 238                return 0;
 239        }
 240        btree = dp->d_ops->node_tree_p(node);
 241        child_fsb = be32_to_cpu(btree[0].before);
 242        xfs_trans_brelse(*trans, bp);   /* no locks for later trans */
 243
 244        /*
 245         * If this is the node level just above the leaves, simply loop
 246         * over the leaves removing all of them.  If this is higher up
 247         * in the tree, recurse downward.
 248         */
 249        for (i = 0; i < ichdr.count; i++) {
 250                /*
 251                 * Read the subsidiary block to see what we have to work with.
 252                 * Don't do this in a transaction.  This is a depth-first
 253                 * traversal of the tree so we may deal with many blocks
 254                 * before we come back to this one.
 255                 */
 256                error = xfs_da3_node_read(*trans, dp, child_fsb, -2, &child_bp,
 257                                                XFS_ATTR_FORK);
 258                if (error)
 259                        return(error);
 260                if (child_bp) {
 261                                                /* save for re-read later */
 262                        child_blkno = XFS_BUF_ADDR(child_bp);
 263
 264                        /*
 265                         * Invalidate the subtree, however we have to.
 266                         */
 267                        info = child_bp->b_addr;
 268                        switch (info->magic) {
 269                        case cpu_to_be16(XFS_DA_NODE_MAGIC):
 270                        case cpu_to_be16(XFS_DA3_NODE_MAGIC):
 271                                error = xfs_attr3_node_inactive(trans, dp,
 272                                                        child_bp, level + 1);
 273                                break;
 274                        case cpu_to_be16(XFS_ATTR_LEAF_MAGIC):
 275                        case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC):
 276                                error = xfs_attr3_leaf_inactive(trans, dp,
 277                                                        child_bp);
 278                                break;
 279                        default:
 280                                error = XFS_ERROR(EIO);
 281                                xfs_trans_brelse(*trans, child_bp);
 282                                break;
 283                        }
 284                        if (error)
 285                                return error;
 286
 287                        /*
 288                         * Remove the subsidiary block from the cache
 289                         * and from the log.
 290                         */
 291                        error = xfs_da_get_buf(*trans, dp, 0, child_blkno,
 292                                &child_bp, XFS_ATTR_FORK);
 293                        if (error)
 294                                return error;
 295                        xfs_trans_binval(*trans, child_bp);
 296                }
 297
 298                /*
 299                 * If we're not done, re-read the parent to get the next
 300                 * child block number.
 301                 */
 302                if (i + 1 < ichdr.count) {
 303                        error = xfs_da3_node_read(*trans, dp, 0, parent_blkno,
 304                                                 &bp, XFS_ATTR_FORK);
 305                        if (error)
 306                                return error;
 307                        child_fsb = be32_to_cpu(btree[i + 1].before);
 308                        xfs_trans_brelse(*trans, bp);
 309                }
 310                /*
 311                 * Atomically commit the whole invalidate stuff.
 312                 */
 313                error = xfs_trans_roll(trans, dp);
 314                if (error)
 315                        return  error;
 316        }
 317
 318        return 0;
 319}
 320
 321/*
 322 * Indiscriminately delete the entire attribute fork
 323 *
 324 * Recurse (gasp!) through the attribute nodes until we find leaves.
 325 * We're doing a depth-first traversal in order to invalidate everything.
 326 */
 327int
 328xfs_attr3_root_inactive(
 329        struct xfs_trans        **trans,
 330        struct xfs_inode        *dp)
 331{
 332        struct xfs_da_blkinfo   *info;
 333        struct xfs_buf          *bp;
 334        xfs_daddr_t             blkno;
 335        int                     error;
 336
 337        /*
 338         * Read block 0 to see what we have to work with.
 339         * We only get here if we have extents, since we remove
 340         * the extents in reverse order the extent containing
 341         * block 0 must still be there.
 342         */
 343        error = xfs_da3_node_read(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK);
 344        if (error)
 345                return error;
 346        blkno = bp->b_bn;
 347
 348        /*
 349         * Invalidate the tree, even if the "tree" is only a single leaf block.
 350         * This is a depth-first traversal!
 351         */
 352        info = bp->b_addr;
 353        switch (info->magic) {
 354        case cpu_to_be16(XFS_DA_NODE_MAGIC):
 355        case cpu_to_be16(XFS_DA3_NODE_MAGIC):
 356                error = xfs_attr3_node_inactive(trans, dp, bp, 1);
 357                break;
 358        case cpu_to_be16(XFS_ATTR_LEAF_MAGIC):
 359        case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC):
 360                error = xfs_attr3_leaf_inactive(trans, dp, bp);
 361                break;
 362        default:
 363                error = XFS_ERROR(EIO);
 364                xfs_trans_brelse(*trans, bp);
 365                break;
 366        }
 367        if (error)
 368                return error;
 369
 370        /*
 371         * Invalidate the incore copy of the root block.
 372         */
 373        error = xfs_da_get_buf(*trans, dp, 0, blkno, &bp, XFS_ATTR_FORK);
 374        if (error)
 375                return error;
 376        xfs_trans_binval(*trans, bp);   /* remove from cache */
 377        /*
 378         * Commit the invalidate and start the next transaction.
 379         */
 380        error = xfs_trans_roll(trans, dp);
 381
 382        return error;
 383}
 384
 385int
 386xfs_attr_inactive(xfs_inode_t *dp)
 387{
 388        xfs_trans_t *trans;
 389        xfs_mount_t *mp;
 390        int error;
 391
 392        mp = dp->i_mount;
 393        ASSERT(! XFS_NOT_DQATTACHED(mp, dp));
 394
 395        xfs_ilock(dp, XFS_ILOCK_SHARED);
 396        if (!xfs_inode_hasattr(dp) ||
 397            dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) {
 398                xfs_iunlock(dp, XFS_ILOCK_SHARED);
 399                return 0;
 400        }
 401        xfs_iunlock(dp, XFS_ILOCK_SHARED);
 402
 403        /*
 404         * Start our first transaction of the day.
 405         *
 406         * All future transactions during this code must be "chained" off
 407         * this one via the trans_dup() call.  All transactions will contain
 408         * the inode, and the inode will always be marked with trans_ihold().
 409         * Since the inode will be locked in all transactions, we must log
 410         * the inode in every transaction to let it float upward through
 411         * the log.
 412         */
 413        trans = xfs_trans_alloc(mp, XFS_TRANS_ATTRINVAL);
 414        error = xfs_trans_reserve(trans, &M_RES(mp)->tr_attrinval, 0, 0);
 415        if (error) {
 416                xfs_trans_cancel(trans, 0);
 417                return(error);
 418        }
 419        xfs_ilock(dp, XFS_ILOCK_EXCL);
 420
 421        /*
 422         * No need to make quota reservations here. We expect to release some
 423         * blocks, not allocate, in the common case.
 424         */
 425        xfs_trans_ijoin(trans, dp, 0);
 426
 427        /*
 428         * Decide on what work routines to call based on the inode size.
 429         */
 430        if (!xfs_inode_hasattr(dp) ||
 431            dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) {
 432                error = 0;
 433                goto out;
 434        }
 435        error = xfs_attr3_root_inactive(&trans, dp);
 436        if (error)
 437                goto out;
 438
 439        error = xfs_itruncate_extents(&trans, dp, XFS_ATTR_FORK, 0);
 440        if (error)
 441                goto out;
 442
 443        error = xfs_trans_commit(trans, XFS_TRANS_RELEASE_LOG_RES);
 444        xfs_iunlock(dp, XFS_ILOCK_EXCL);
 445
 446        return(error);
 447
 448out:
 449        xfs_trans_cancel(trans, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT);
 450        xfs_iunlock(dp, XFS_ILOCK_EXCL);
 451        return(error);
 452}
 453