linux/fs/xfs/xfs_trans.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
   3 * All Rights Reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it would be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write the Free Software Foundation,
  16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17 */
  18#ifndef __XFS_TRANS_H__
  19#define __XFS_TRANS_H__
  20
  21/* kernel only transaction subsystem defines */
  22
  23struct xfs_buf;
  24struct xfs_buftarg;
  25struct xfs_efd_log_item;
  26struct xfs_efi_log_item;
  27struct xfs_inode;
  28struct xfs_item_ops;
  29struct xfs_log_iovec;
  30struct xfs_log_item_desc;
  31struct xfs_mount;
  32struct xfs_trans;
  33struct xfs_trans_res;
  34struct xfs_dquot_acct;
  35struct xfs_busy_extent;
  36struct xfs_rud_log_item;
  37struct xfs_rui_log_item;
  38struct xfs_btree_cur;
  39struct xfs_cui_log_item;
  40struct xfs_cud_log_item;
  41struct xfs_defer_ops;
  42struct xfs_bui_log_item;
  43struct xfs_bud_log_item;
  44
  45typedef struct xfs_log_item {
  46        struct list_head                li_ail;         /* AIL pointers */
  47        xfs_lsn_t                       li_lsn;         /* last on-disk lsn */
  48        struct xfs_log_item_desc        *li_desc;       /* ptr to current desc*/
  49        struct xfs_mount                *li_mountp;     /* ptr to fs mount */
  50        struct xfs_ail                  *li_ailp;       /* ptr to AIL */
  51        uint                            li_type;        /* item type */
  52        uint                            li_flags;       /* misc flags */
  53        struct xfs_log_item             *li_bio_list;   /* buffer item list */
  54        void                            (*li_cb)(struct xfs_buf *,
  55                                                 struct xfs_log_item *);
  56                                                        /* buffer item iodone */
  57                                                        /* callback func */
  58        const struct xfs_item_ops       *li_ops;        /* function list */
  59
  60        /* delayed logging */
  61        struct list_head                li_cil;         /* CIL pointers */
  62        struct xfs_log_vec              *li_lv;         /* active log vector */
  63        struct xfs_log_vec              *li_lv_shadow;  /* standby vector */
  64        xfs_lsn_t                       li_seq;         /* CIL commit seq */
  65} xfs_log_item_t;
  66
  67#define XFS_LI_IN_AIL   0x1
  68#define XFS_LI_ABORTED  0x2
  69
  70#define XFS_LI_FLAGS \
  71        { XFS_LI_IN_AIL,        "IN_AIL" }, \
  72        { XFS_LI_ABORTED,       "ABORTED" }
  73
  74struct xfs_item_ops {
  75        void (*iop_size)(xfs_log_item_t *, int *, int *);
  76        void (*iop_format)(xfs_log_item_t *, struct xfs_log_vec *);
  77        void (*iop_pin)(xfs_log_item_t *);
  78        void (*iop_unpin)(xfs_log_item_t *, int remove);
  79        uint (*iop_push)(struct xfs_log_item *, struct list_head *);
  80        void (*iop_unlock)(xfs_log_item_t *);
  81        xfs_lsn_t (*iop_committed)(xfs_log_item_t *, xfs_lsn_t);
  82        void (*iop_committing)(xfs_log_item_t *, xfs_lsn_t);
  83};
  84
  85void    xfs_log_item_init(struct xfs_mount *mp, struct xfs_log_item *item,
  86                          int type, const struct xfs_item_ops *ops);
  87
  88/*
  89 * Return values for the iop_push() routines.
  90 */
  91#define XFS_ITEM_SUCCESS        0
  92#define XFS_ITEM_PINNED         1
  93#define XFS_ITEM_LOCKED         2
  94#define XFS_ITEM_FLUSHING       3
  95
  96
  97/*
  98 * This is the structure maintained for every active transaction.
  99 */
 100typedef struct xfs_trans {
 101        unsigned int            t_magic;        /* magic number */
 102        unsigned int            t_log_res;      /* amt of log space resvd */
 103        unsigned int            t_log_count;    /* count for perm log res */
 104        unsigned int            t_blk_res;      /* # of blocks resvd */
 105        unsigned int            t_blk_res_used; /* # of resvd blocks used */
 106        unsigned int            t_rtx_res;      /* # of rt extents resvd */
 107        unsigned int            t_rtx_res_used; /* # of resvd rt extents used */
 108        struct xlog_ticket      *t_ticket;      /* log mgr ticket */
 109        xfs_lsn_t               t_lsn;          /* log seq num of start of
 110                                                 * transaction. */
 111        xfs_lsn_t               t_commit_lsn;   /* log seq num of end of
 112                                                 * transaction. */
 113        struct xfs_mount        *t_mountp;      /* ptr to fs mount struct */
 114        struct xfs_dquot_acct   *t_dqinfo;      /* acctg info for dquots */
 115        unsigned int            t_flags;        /* misc flags */
 116        int64_t                 t_icount_delta; /* superblock icount change */
 117        int64_t                 t_ifree_delta;  /* superblock ifree change */
 118        int64_t                 t_fdblocks_delta; /* superblock fdblocks chg */
 119        int64_t                 t_res_fdblocks_delta; /* on-disk only chg */
 120        int64_t                 t_frextents_delta;/* superblock freextents chg*/
 121        int64_t                 t_res_frextents_delta; /* on-disk only chg */
 122#if defined(DEBUG) || defined(XFS_WARN)
 123        int64_t                 t_ag_freeblks_delta; /* debugging counter */
 124        int64_t                 t_ag_flist_delta; /* debugging counter */
 125        int64_t                 t_ag_btree_delta; /* debugging counter */
 126#endif
 127        int64_t                 t_dblocks_delta;/* superblock dblocks change */
 128        int64_t                 t_agcount_delta;/* superblock agcount change */
 129        int64_t                 t_imaxpct_delta;/* superblock imaxpct change */
 130        int64_t                 t_rextsize_delta;/* superblock rextsize chg */
 131        int64_t                 t_rbmblocks_delta;/* superblock rbmblocks chg */
 132        int64_t                 t_rblocks_delta;/* superblock rblocks change */
 133        int64_t                 t_rextents_delta;/* superblocks rextents chg */
 134        int64_t                 t_rextslog_delta;/* superblocks rextslog chg */
 135        struct list_head        t_items;        /* log item descriptors */
 136        struct list_head        t_busy;         /* list of busy extents */
 137        unsigned long           t_pflags;       /* saved process flags state */
 138} xfs_trans_t;
 139
 140/*
 141 * XFS transaction mechanism exported interfaces that are
 142 * actually macros.
 143 */
 144#define xfs_trans_set_sync(tp)          ((tp)->t_flags |= XFS_TRANS_SYNC)
 145
 146#if defined(DEBUG) || defined(XFS_WARN)
 147#define xfs_trans_agblocks_delta(tp, d) ((tp)->t_ag_freeblks_delta += (int64_t)d)
 148#define xfs_trans_agflist_delta(tp, d)  ((tp)->t_ag_flist_delta += (int64_t)d)
 149#define xfs_trans_agbtree_delta(tp, d)  ((tp)->t_ag_btree_delta += (int64_t)d)
 150#else
 151#define xfs_trans_agblocks_delta(tp, d)
 152#define xfs_trans_agflist_delta(tp, d)
 153#define xfs_trans_agbtree_delta(tp, d)
 154#endif
 155
 156/*
 157 * XFS transaction mechanism exported interfaces.
 158 */
 159int             xfs_trans_alloc(struct xfs_mount *mp, struct xfs_trans_res *resp,
 160                        uint blocks, uint rtextents, uint flags,
 161                        struct xfs_trans **tpp);
 162void            xfs_trans_mod_sb(xfs_trans_t *, uint, int64_t);
 163
 164struct xfs_buf  *xfs_trans_get_buf_map(struct xfs_trans *tp,
 165                                       struct xfs_buftarg *target,
 166                                       struct xfs_buf_map *map, int nmaps,
 167                                       uint flags);
 168
 169static inline struct xfs_buf *
 170xfs_trans_get_buf(
 171        struct xfs_trans        *tp,
 172        struct xfs_buftarg      *target,
 173        xfs_daddr_t             blkno,
 174        int                     numblks,
 175        uint                    flags)
 176{
 177        DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
 178        return xfs_trans_get_buf_map(tp, target, &map, 1, flags);
 179}
 180
 181int             xfs_trans_read_buf_map(struct xfs_mount *mp,
 182                                       struct xfs_trans *tp,
 183                                       struct xfs_buftarg *target,
 184                                       struct xfs_buf_map *map, int nmaps,
 185                                       xfs_buf_flags_t flags,
 186                                       struct xfs_buf **bpp,
 187                                       const struct xfs_buf_ops *ops);
 188
 189static inline int
 190xfs_trans_read_buf(
 191        struct xfs_mount        *mp,
 192        struct xfs_trans        *tp,
 193        struct xfs_buftarg      *target,
 194        xfs_daddr_t             blkno,
 195        int                     numblks,
 196        xfs_buf_flags_t         flags,
 197        struct xfs_buf          **bpp,
 198        const struct xfs_buf_ops *ops)
 199{
 200        DEFINE_SINGLE_BUF_MAP(map, blkno, numblks);
 201        return xfs_trans_read_buf_map(mp, tp, target, &map, 1,
 202                                      flags, bpp, ops);
 203}
 204
 205struct xfs_buf  *xfs_trans_getsb(xfs_trans_t *, struct xfs_mount *, int);
 206
 207void            xfs_trans_brelse(xfs_trans_t *, struct xfs_buf *);
 208void            xfs_trans_bjoin(xfs_trans_t *, struct xfs_buf *);
 209void            xfs_trans_bhold(xfs_trans_t *, struct xfs_buf *);
 210void            xfs_trans_bhold_release(xfs_trans_t *, struct xfs_buf *);
 211void            xfs_trans_binval(xfs_trans_t *, struct xfs_buf *);
 212void            xfs_trans_inode_buf(xfs_trans_t *, struct xfs_buf *);
 213void            xfs_trans_stale_inode_buf(xfs_trans_t *, struct xfs_buf *);
 214void            xfs_trans_ordered_buf(xfs_trans_t *, struct xfs_buf *);
 215void            xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint);
 216void            xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *);
 217void            xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int);
 218void            xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint);
 219void            xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint);
 220void            xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint);
 221
 222void            xfs_extent_free_init_defer_op(void);
 223struct xfs_efd_log_item *xfs_trans_get_efd(struct xfs_trans *,
 224                                  struct xfs_efi_log_item *,
 225                                  uint);
 226int             xfs_trans_free_extent(struct xfs_trans *,
 227                                      struct xfs_efd_log_item *, xfs_fsblock_t,
 228                                      xfs_extlen_t, struct xfs_owner_info *);
 229int             xfs_trans_commit(struct xfs_trans *);
 230int             __xfs_trans_roll(struct xfs_trans **, struct xfs_inode *, int *);
 231int             xfs_trans_roll(struct xfs_trans **, struct xfs_inode *);
 232void            xfs_trans_cancel(xfs_trans_t *);
 233int             xfs_trans_ail_init(struct xfs_mount *);
 234void            xfs_trans_ail_destroy(struct xfs_mount *);
 235
 236void            xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *,
 237                                       enum xfs_blft);
 238void            xfs_trans_buf_copy_type(struct xfs_buf *dst_bp,
 239                                        struct xfs_buf *src_bp);
 240
 241extern kmem_zone_t      *xfs_trans_zone;
 242extern kmem_zone_t      *xfs_log_item_desc_zone;
 243
 244/* rmap updates */
 245enum xfs_rmap_intent_type;
 246
 247void xfs_rmap_update_init_defer_op(void);
 248struct xfs_rud_log_item *xfs_trans_get_rud(struct xfs_trans *tp,
 249                struct xfs_rui_log_item *ruip);
 250int xfs_trans_log_finish_rmap_update(struct xfs_trans *tp,
 251                struct xfs_rud_log_item *rudp, enum xfs_rmap_intent_type type,
 252                __uint64_t owner, int whichfork, xfs_fileoff_t startoff,
 253                xfs_fsblock_t startblock, xfs_filblks_t blockcount,
 254                xfs_exntst_t state, struct xfs_btree_cur **pcur);
 255
 256/* refcount updates */
 257enum xfs_refcount_intent_type;
 258
 259void xfs_refcount_update_init_defer_op(void);
 260struct xfs_cud_log_item *xfs_trans_get_cud(struct xfs_trans *tp,
 261                struct xfs_cui_log_item *cuip);
 262int xfs_trans_log_finish_refcount_update(struct xfs_trans *tp,
 263                struct xfs_cud_log_item *cudp, struct xfs_defer_ops *dfops,
 264                enum xfs_refcount_intent_type type, xfs_fsblock_t startblock,
 265                xfs_extlen_t blockcount, xfs_fsblock_t *new_fsb,
 266                xfs_extlen_t *new_len, struct xfs_btree_cur **pcur);
 267
 268/* mapping updates */
 269enum xfs_bmap_intent_type;
 270
 271void xfs_bmap_update_init_defer_op(void);
 272struct xfs_bud_log_item *xfs_trans_get_bud(struct xfs_trans *tp,
 273                struct xfs_bui_log_item *buip);
 274int xfs_trans_log_finish_bmap_update(struct xfs_trans *tp,
 275                struct xfs_bud_log_item *rudp, struct xfs_defer_ops *dfops,
 276                enum xfs_bmap_intent_type type, struct xfs_inode *ip,
 277                int whichfork, xfs_fileoff_t startoff, xfs_fsblock_t startblock,
 278                xfs_filblks_t blockcount, xfs_exntst_t state);
 279
 280#endif  /* __XFS_TRANS_H__ */
 281