linux/fs/xfs/xfs_icreate_item.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2008-2010, 2013 Dave Chinner
   3 * All Rights Reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it would be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write the Free Software Foundation,
  16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17 */
  18#include "xfs.h"
  19#include "xfs_fs.h"
  20#include "xfs_types.h"
  21#include "xfs_bit.h"
  22#include "xfs_log.h"
  23#include "xfs_inum.h"
  24#include "xfs_trans.h"
  25#include "xfs_buf_item.h"
  26#include "xfs_sb.h"
  27#include "xfs_ag.h"
  28#include "xfs_dir2.h"
  29#include "xfs_mount.h"
  30#include "xfs_trans_priv.h"
  31#include "xfs_bmap_btree.h"
  32#include "xfs_alloc_btree.h"
  33#include "xfs_ialloc_btree.h"
  34#include "xfs_attr_sf.h"
  35#include "xfs_dinode.h"
  36#include "xfs_inode.h"
  37#include "xfs_inode_item.h"
  38#include "xfs_btree.h"
  39#include "xfs_ialloc.h"
  40#include "xfs_error.h"
  41#include "xfs_icreate_item.h"
  42
  43kmem_zone_t     *xfs_icreate_zone;              /* inode create item zone */
  44
  45static inline struct xfs_icreate_item *ICR_ITEM(struct xfs_log_item *lip)
  46{
  47        return container_of(lip, struct xfs_icreate_item, ic_item);
  48}
  49
  50/*
  51 * This returns the number of iovecs needed to log the given inode item.
  52 *
  53 * We only need one iovec for the icreate log structure.
  54 */
  55STATIC uint
  56xfs_icreate_item_size(
  57        struct xfs_log_item     *lip)
  58{
  59        return 1;
  60}
  61
  62/*
  63 * This is called to fill in the vector of log iovecs for the
  64 * given inode create log item.
  65 */
  66STATIC void
  67xfs_icreate_item_format(
  68        struct xfs_log_item     *lip,
  69        struct xfs_log_iovec    *log_vector)
  70{
  71        struct xfs_icreate_item *icp = ICR_ITEM(lip);
  72
  73        log_vector->i_addr = (xfs_caddr_t)&icp->ic_format;
  74        log_vector->i_len  = sizeof(struct xfs_icreate_log);
  75        log_vector->i_type = XLOG_REG_TYPE_ICREATE;
  76}
  77
  78
  79/* Pinning has no meaning for the create item, so just return. */
  80STATIC void
  81xfs_icreate_item_pin(
  82        struct xfs_log_item     *lip)
  83{
  84}
  85
  86
  87/* pinning has no meaning for the create item, so just return. */
  88STATIC void
  89xfs_icreate_item_unpin(
  90        struct xfs_log_item     *lip,
  91        int                     remove)
  92{
  93}
  94
  95STATIC void
  96xfs_icreate_item_unlock(
  97        struct xfs_log_item     *lip)
  98{
  99        struct xfs_icreate_item *icp = ICR_ITEM(lip);
 100
 101        if (icp->ic_item.li_flags & XFS_LI_ABORTED)
 102                kmem_zone_free(xfs_icreate_zone, icp);
 103        return;
 104}
 105
 106/*
 107 * Because we have ordered buffers being tracked in the AIL for the inode
 108 * creation, we don't need the create item after this. Hence we can free
 109 * the log item and return -1 to tell the caller we're done with the item.
 110 */
 111STATIC xfs_lsn_t
 112xfs_icreate_item_committed(
 113        struct xfs_log_item     *lip,
 114        xfs_lsn_t               lsn)
 115{
 116        struct xfs_icreate_item *icp = ICR_ITEM(lip);
 117
 118        kmem_zone_free(xfs_icreate_zone, icp);
 119        return (xfs_lsn_t)-1;
 120}
 121
 122/* item can never get into the AIL */
 123STATIC uint
 124xfs_icreate_item_push(
 125        struct xfs_log_item     *lip,
 126        struct list_head        *buffer_list)
 127{
 128        ASSERT(0);
 129        return XFS_ITEM_SUCCESS;
 130}
 131
 132/* Ordered buffers do the dependency tracking here, so this does nothing. */
 133STATIC void
 134xfs_icreate_item_committing(
 135        struct xfs_log_item     *lip,
 136        xfs_lsn_t               lsn)
 137{
 138}
 139
 140/*
 141 * This is the ops vector shared by all buf log items.
 142 */
 143static struct xfs_item_ops xfs_icreate_item_ops = {
 144        .iop_size       = xfs_icreate_item_size,
 145        .iop_format     = xfs_icreate_item_format,
 146        .iop_pin        = xfs_icreate_item_pin,
 147        .iop_unpin      = xfs_icreate_item_unpin,
 148        .iop_push       = xfs_icreate_item_push,
 149        .iop_unlock     = xfs_icreate_item_unlock,
 150        .iop_committed  = xfs_icreate_item_committed,
 151        .iop_committing = xfs_icreate_item_committing,
 152};
 153
 154
 155/*
 156 * Initialize the inode log item for a newly allocated (in-core) inode.
 157 *
 158 * Inode extents can only reside within an AG. Hence specify the starting
 159 * block for the inode chunk by offset within an AG as well as the
 160 * length of the allocated extent.
 161 *
 162 * This joins the item to the transaction and marks it dirty so
 163 * that we don't need a separate call to do this, nor does the
 164 * caller need to know anything about the icreate item.
 165 */
 166void
 167xfs_icreate_log(
 168        struct xfs_trans        *tp,
 169        xfs_agnumber_t          agno,
 170        xfs_agblock_t           agbno,
 171        unsigned int            count,
 172        unsigned int            inode_size,
 173        xfs_agblock_t           length,
 174        unsigned int            generation)
 175{
 176        struct xfs_icreate_item *icp;
 177
 178        icp = kmem_zone_zalloc(xfs_icreate_zone, KM_SLEEP);
 179
 180        xfs_log_item_init(tp->t_mountp, &icp->ic_item, XFS_LI_ICREATE,
 181                          &xfs_icreate_item_ops);
 182
 183        icp->ic_format.icl_type = XFS_LI_ICREATE;
 184        icp->ic_format.icl_size = 1;    /* single vector */
 185        icp->ic_format.icl_ag = cpu_to_be32(agno);
 186        icp->ic_format.icl_agbno = cpu_to_be32(agbno);
 187        icp->ic_format.icl_count = cpu_to_be32(count);
 188        icp->ic_format.icl_isize = cpu_to_be32(inode_size);
 189        icp->ic_format.icl_length = cpu_to_be32(length);
 190        icp->ic_format.icl_gen = cpu_to_be32(generation);
 191
 192        xfs_trans_add_item(tp, &icp->ic_item);
 193        tp->t_flags |= XFS_TRANS_DIRTY;
 194        icp->ic_item.li_desc->lid_flags |= XFS_LID_DIRTY;
 195}
 196
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.