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