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