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