linux/fs/xfs/xfs_log.h
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
   4 * All Rights Reserved.
   5 */
   6#ifndef __XFS_LOG_H__
   7#define __XFS_LOG_H__
   8
   9struct xfs_log_vec {
  10        struct xfs_log_vec      *lv_next;       /* next lv in build list */
  11        int                     lv_niovecs;     /* number of iovecs in lv */
  12        struct xfs_log_iovec    *lv_iovecp;     /* iovec array */
  13        struct xfs_log_item     *lv_item;       /* owner */
  14        char                    *lv_buf;        /* formatted buffer */
  15        int                     lv_bytes;       /* accounted space in buffer */
  16        int                     lv_buf_len;     /* aligned size of buffer */
  17        int                     lv_size;        /* size of allocated lv */
  18};
  19
  20#define XFS_LOG_VEC_ORDERED     (-1)
  21
  22static inline void *
  23xlog_prepare_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp,
  24                uint type)
  25{
  26        struct xfs_log_iovec *vec = *vecp;
  27
  28        if (vec) {
  29                ASSERT(vec - lv->lv_iovecp < lv->lv_niovecs);
  30                vec++;
  31        } else {
  32                vec = &lv->lv_iovecp[0];
  33        }
  34
  35        vec->i_type = type;
  36        vec->i_addr = lv->lv_buf + lv->lv_buf_len;
  37
  38        ASSERT(IS_ALIGNED((unsigned long)vec->i_addr, sizeof(uint64_t)));
  39
  40        *vecp = vec;
  41        return vec->i_addr;
  42}
  43
  44/*
  45 * We need to make sure the next buffer is naturally aligned for the biggest
  46 * basic data type we put into it.  We already accounted for this padding when
  47 * sizing the buffer.
  48 *
  49 * However, this padding does not get written into the log, and hence we have to
  50 * track the space used by the log vectors separately to prevent log space hangs
  51 * due to inaccurate accounting (i.e. a leak) of the used log space through the
  52 * CIL context ticket.
  53 */
  54static inline void
  55xlog_finish_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec *vec, int len)
  56{
  57        lv->lv_buf_len += round_up(len, sizeof(uint64_t));
  58        lv->lv_bytes += len;
  59        vec->i_len = len;
  60}
  61
  62static inline void *
  63xlog_copy_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp,
  64                uint type, void *data, int len)
  65{
  66        void *buf;
  67
  68        buf = xlog_prepare_iovec(lv, vecp, type);
  69        memcpy(buf, data, len);
  70        xlog_finish_iovec(lv, *vecp, len);
  71        return buf;
  72}
  73
  74/*
  75 * Structure used to pass callback function and the function's argument
  76 * to the log manager.
  77 */
  78typedef struct xfs_log_callback {
  79        struct xfs_log_callback *cb_next;
  80        void                    (*cb_func)(void *, int);
  81        void                    *cb_arg;
  82} xfs_log_callback_t;
  83
  84/*
  85 * By comparing each component, we don't have to worry about extra
  86 * endian issues in treating two 32 bit numbers as one 64 bit number
  87 */
  88static inline xfs_lsn_t _lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2)
  89{
  90        if (CYCLE_LSN(lsn1) != CYCLE_LSN(lsn2))
  91                return (CYCLE_LSN(lsn1)<CYCLE_LSN(lsn2))? -999 : 999;
  92
  93        if (BLOCK_LSN(lsn1) != BLOCK_LSN(lsn2))
  94                return (BLOCK_LSN(lsn1)<BLOCK_LSN(lsn2))? -999 : 999;
  95
  96        return 0;
  97}
  98
  99#define XFS_LSN_CMP(x,y) _lsn_cmp(x,y)
 100
 101/*
 102 * Flags to xfs_log_force()
 103 *
 104 *      XFS_LOG_SYNC:   Synchronous force in-core log to disk
 105 */
 106#define XFS_LOG_SYNC            0x1
 107
 108/* Log manager interfaces */
 109struct xfs_mount;
 110struct xlog_in_core;
 111struct xlog_ticket;
 112struct xfs_log_item;
 113struct xfs_item_ops;
 114struct xfs_trans;
 115
 116xfs_lsn_t xfs_log_done(struct xfs_mount *mp,
 117                       struct xlog_ticket *ticket,
 118                       struct xlog_in_core **iclog,
 119                       bool regrant);
 120int       xfs_log_force(struct xfs_mount *mp, uint flags);
 121int       xfs_log_force_lsn(struct xfs_mount *mp, xfs_lsn_t lsn, uint flags,
 122                int *log_forced);
 123int       xfs_log_mount(struct xfs_mount        *mp,
 124                        struct xfs_buftarg      *log_target,
 125                        xfs_daddr_t             start_block,
 126                        int                     num_bblocks);
 127int       xfs_log_mount_finish(struct xfs_mount *mp);
 128int     xfs_log_mount_cancel(struct xfs_mount *);
 129xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp);
 130xfs_lsn_t xlog_assign_tail_lsn_locked(struct xfs_mount *mp);
 131void      xfs_log_space_wake(struct xfs_mount *mp);
 132int       xfs_log_notify(struct xlog_in_core    *iclog,
 133                         struct xfs_log_callback *callback_entry);
 134int       xfs_log_release_iclog(struct xfs_mount *mp,
 135                         struct xlog_in_core     *iclog);
 136int       xfs_log_reserve(struct xfs_mount *mp,
 137                          int              length,
 138                          int              count,
 139                          struct xlog_ticket **ticket,
 140                          uint8_t                  clientid,
 141                          bool             permanent);
 142int       xfs_log_regrant(struct xfs_mount *mp, struct xlog_ticket *tic);
 143void      xfs_log_unmount(struct xfs_mount *mp);
 144int       xfs_log_force_umount(struct xfs_mount *mp, int logerror);
 145
 146struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket);
 147void      xfs_log_ticket_put(struct xlog_ticket *ticket);
 148
 149void    xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp,
 150                                xfs_lsn_t *commit_lsn, bool regrant);
 151bool    xfs_log_item_in_current_chkpt(struct xfs_log_item *lip);
 152
 153void    xfs_log_work_queue(struct xfs_mount *mp);
 154void    xfs_log_quiesce(struct xfs_mount *mp);
 155bool    xfs_log_check_lsn(struct xfs_mount *, xfs_lsn_t);
 156bool    xfs_log_in_recovery(struct xfs_mount *);
 157
 158#endif  /* __XFS_LOG_H__ */
 159