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        xfs_lsn_t               t_lsn;          /* log seq num of start of
 109                                                 * transaction. */
 110        xfs_lsn_t               t_commit_lsn;   /* log seq num of end of
 111                                                 * transaction. */
 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 *);
 215void            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(xfs_trans_t *, struct xfs_buf *, uint, uint);
 221void            xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint);
 222
 223void            xfs_extent_free_init_defer_op(void);
 224struct xfs_efd_log_item *xfs_trans_get_efd(struct xfs_trans *,
 225                                  struct xfs_efi_log_item *,
 226                                  uint);
 227int             xfs_trans_free_extent(struct xfs_trans *,
 228                                      struct xfs_efd_log_item *, xfs_fsblock_t,
 229                                      xfs_extlen_t, struct xfs_owner_info *);
 230int             xfs_trans_commit(struct xfs_trans *);
 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