mirror of
https://github.com/torvalds/linux.git
synced 2024-11-05 11:32:04 +00:00
955833cf2a
The ticket ID is needed to uniquely identify transactions when doing busy extent matching. Delayed logging changes the lifecycle of busy extents with respect to the transaction structure lifecycle. Hence we can no longer use the transaction structure as a means of determining the owner of the busy extent as it may be freed and reused while the busy extent is still active. This commit provides the infrastructure to access the xlog_tid_t held in the ticket from a transaction handle. This avoids the need for callers to peek into the transaction and log structures to find this out. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Alex Elder <aelder@sgi.com>
202 lines
5.6 KiB
C
202 lines
5.6 KiB
C
/*
|
|
* Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
|
|
* All Rights Reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it would be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
#ifndef __XFS_LOG_H__
|
|
#define __XFS_LOG_H__
|
|
|
|
/* get lsn fields */
|
|
#define CYCLE_LSN(lsn) ((uint)((lsn)>>32))
|
|
#define BLOCK_LSN(lsn) ((uint)(lsn))
|
|
|
|
/* this is used in a spot where we might otherwise double-endian-flip */
|
|
#define CYCLE_LSN_DISK(lsn) (((__be32 *)&(lsn))[0])
|
|
|
|
#ifdef __KERNEL__
|
|
/*
|
|
* By comparing each component, we don't have to worry about extra
|
|
* endian issues in treating two 32 bit numbers as one 64 bit number
|
|
*/
|
|
static inline xfs_lsn_t _lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2)
|
|
{
|
|
if (CYCLE_LSN(lsn1) != CYCLE_LSN(lsn2))
|
|
return (CYCLE_LSN(lsn1)<CYCLE_LSN(lsn2))? -999 : 999;
|
|
|
|
if (BLOCK_LSN(lsn1) != BLOCK_LSN(lsn2))
|
|
return (BLOCK_LSN(lsn1)<BLOCK_LSN(lsn2))? -999 : 999;
|
|
|
|
return 0;
|
|
}
|
|
|
|
#define XFS_LSN_CMP(x,y) _lsn_cmp(x,y)
|
|
|
|
/*
|
|
* Macros, structures, prototypes for interface to the log manager.
|
|
*/
|
|
|
|
/*
|
|
* Flags to xfs_log_done()
|
|
*/
|
|
#define XFS_LOG_REL_PERM_RESERV 0x1
|
|
|
|
/*
|
|
* Flags to xfs_log_reserve()
|
|
*
|
|
* XFS_LOG_SLEEP: If space is not available, sleep (default)
|
|
* XFS_LOG_NOSLEEP: If space is not available, return error
|
|
* XFS_LOG_PERM_RESERV: Permanent reservation. When writes are
|
|
* performed against this type of reservation, the reservation
|
|
* is not decreased. Long running transactions should use this.
|
|
*/
|
|
#define XFS_LOG_SLEEP 0x0
|
|
#define XFS_LOG_NOSLEEP 0x1
|
|
#define XFS_LOG_PERM_RESERV 0x2
|
|
|
|
/*
|
|
* Flags to xfs_log_force()
|
|
*
|
|
* XFS_LOG_SYNC: Synchronous force in-core log to disk
|
|
*/
|
|
#define XFS_LOG_SYNC 0x1
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
|
|
/* Log Clients */
|
|
#define XFS_TRANSACTION 0x69
|
|
#define XFS_VOLUME 0x2
|
|
#define XFS_LOG 0xaa
|
|
|
|
|
|
/* Region types for iovec's i_type */
|
|
#define XLOG_REG_TYPE_BFORMAT 1
|
|
#define XLOG_REG_TYPE_BCHUNK 2
|
|
#define XLOG_REG_TYPE_EFI_FORMAT 3
|
|
#define XLOG_REG_TYPE_EFD_FORMAT 4
|
|
#define XLOG_REG_TYPE_IFORMAT 5
|
|
#define XLOG_REG_TYPE_ICORE 6
|
|
#define XLOG_REG_TYPE_IEXT 7
|
|
#define XLOG_REG_TYPE_IBROOT 8
|
|
#define XLOG_REG_TYPE_ILOCAL 9
|
|
#define XLOG_REG_TYPE_IATTR_EXT 10
|
|
#define XLOG_REG_TYPE_IATTR_BROOT 11
|
|
#define XLOG_REG_TYPE_IATTR_LOCAL 12
|
|
#define XLOG_REG_TYPE_QFORMAT 13
|
|
#define XLOG_REG_TYPE_DQUOT 14
|
|
#define XLOG_REG_TYPE_QUOTAOFF 15
|
|
#define XLOG_REG_TYPE_LRHEADER 16
|
|
#define XLOG_REG_TYPE_UNMOUNT 17
|
|
#define XLOG_REG_TYPE_COMMIT 18
|
|
#define XLOG_REG_TYPE_TRANSHDR 19
|
|
#define XLOG_REG_TYPE_MAX 19
|
|
|
|
typedef struct xfs_log_iovec {
|
|
xfs_caddr_t i_addr; /* beginning address of region */
|
|
int i_len; /* length in bytes of region */
|
|
uint i_type; /* type of region */
|
|
} xfs_log_iovec_t;
|
|
|
|
struct xfs_log_vec {
|
|
struct xfs_log_vec *lv_next; /* next lv in build list */
|
|
int lv_niovecs; /* number of iovecs in lv */
|
|
struct xfs_log_iovec *lv_iovecp; /* iovec array */
|
|
};
|
|
|
|
/*
|
|
* Structure used to pass callback function and the function's argument
|
|
* to the log manager.
|
|
*/
|
|
typedef struct xfs_log_callback {
|
|
struct xfs_log_callback *cb_next;
|
|
void (*cb_func)(void *, int);
|
|
void *cb_arg;
|
|
} xfs_log_callback_t;
|
|
|
|
|
|
#ifdef __KERNEL__
|
|
/* Log manager interfaces */
|
|
struct xfs_mount;
|
|
struct xlog_in_core;
|
|
struct xlog_ticket;
|
|
struct xfs_log_item;
|
|
struct xfs_item_ops;
|
|
struct xfs_trans;
|
|
|
|
void xfs_log_item_init(struct xfs_mount *mp,
|
|
struct xfs_log_item *item,
|
|
int type,
|
|
struct xfs_item_ops *ops);
|
|
|
|
xfs_lsn_t xfs_log_done(struct xfs_mount *mp,
|
|
struct xlog_ticket *ticket,
|
|
struct xlog_in_core **iclog,
|
|
uint flags);
|
|
int _xfs_log_force(struct xfs_mount *mp,
|
|
uint flags,
|
|
int *log_forced);
|
|
void xfs_log_force(struct xfs_mount *mp,
|
|
uint flags);
|
|
int _xfs_log_force_lsn(struct xfs_mount *mp,
|
|
xfs_lsn_t lsn,
|
|
uint flags,
|
|
int *log_forced);
|
|
void xfs_log_force_lsn(struct xfs_mount *mp,
|
|
xfs_lsn_t lsn,
|
|
uint flags);
|
|
int xfs_log_mount(struct xfs_mount *mp,
|
|
struct xfs_buftarg *log_target,
|
|
xfs_daddr_t start_block,
|
|
int num_bblocks);
|
|
int xfs_log_mount_finish(struct xfs_mount *mp);
|
|
void xfs_log_move_tail(struct xfs_mount *mp,
|
|
xfs_lsn_t tail_lsn);
|
|
int xfs_log_notify(struct xfs_mount *mp,
|
|
struct xlog_in_core *iclog,
|
|
xfs_log_callback_t *callback_entry);
|
|
int xfs_log_release_iclog(struct xfs_mount *mp,
|
|
struct xlog_in_core *iclog);
|
|
int xfs_log_reserve(struct xfs_mount *mp,
|
|
int length,
|
|
int count,
|
|
struct xlog_ticket **ticket,
|
|
__uint8_t clientid,
|
|
uint flags,
|
|
uint t_type);
|
|
int xfs_log_write(struct xfs_mount *mp,
|
|
xfs_log_iovec_t region[],
|
|
int nentries,
|
|
struct xlog_ticket *ticket,
|
|
xfs_lsn_t *start_lsn);
|
|
int xfs_log_unmount_write(struct xfs_mount *mp);
|
|
void xfs_log_unmount(struct xfs_mount *mp);
|
|
int xfs_log_force_umount(struct xfs_mount *mp, int logerror);
|
|
int xfs_log_need_covered(struct xfs_mount *mp);
|
|
|
|
void xlog_iodone(struct xfs_buf *);
|
|
|
|
struct xlog_ticket * xfs_log_ticket_get(struct xlog_ticket *ticket);
|
|
void xfs_log_ticket_put(struct xlog_ticket *ticket);
|
|
|
|
xlog_tid_t xfs_log_get_trans_ident(struct xfs_trans *tp);
|
|
|
|
#endif
|
|
|
|
|
|
extern int xlog_debug; /* set to 1 to enable real log */
|
|
|
|
|
|
#endif /* __XFS_LOG_H__ */
|