2005-04-17 02:20:36 +04:00
/*
2005-11-02 06:58:39 +03:00
* Copyright ( c ) 2000 , 2005 Silicon Graphics , Inc .
* All Rights Reserved .
2005-04-17 02:20:36 +04:00
*
2005-11-02 06:58:39 +03:00
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
2005-04-17 02:20:36 +04:00
* published by the Free Software Foundation .
*
2005-11-02 06:58:39 +03:00
* 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 .
2005-04-17 02:20:36 +04:00
*
2005-11-02 06:58:39 +03:00
* 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
2005-04-17 02:20:36 +04:00
*/
# ifndef __XFS_EXTFREE_ITEM_H__
# define __XFS_EXTFREE_ITEM_H__
struct xfs_mount ;
struct kmem_zone ;
typedef struct xfs_extent {
xfs_dfsbno_t ext_start ;
xfs_extlen_t ext_len ;
} xfs_extent_t ;
2006-06-09 08:55:38 +04:00
/*
* Since an xfs_extent_t has types ( start : 64 , len : 32 )
* there are different alignments on 32 bit and 64 bit kernels .
* So we provide the different variants for use by a
* conversion routine .
*/
typedef struct xfs_extent_32 {
2006-09-28 04:55:43 +04:00
__uint64_t ext_start ;
__uint32_t ext_len ;
2006-06-09 08:55:38 +04:00
} __attribute__ ( ( packed ) ) xfs_extent_32_t ;
typedef struct xfs_extent_64 {
2006-09-28 04:55:43 +04:00
__uint64_t ext_start ;
__uint32_t ext_len ;
2006-06-09 08:55:38 +04:00
__uint32_t ext_pad ;
} xfs_extent_64_t ;
2005-04-17 02:20:36 +04:00
/*
* This is the structure used to lay out an efi log item in the
* log . The efi_extents field is a variable size array whose
* size is given by efi_nextents .
*/
typedef struct xfs_efi_log_format {
2006-09-28 04:55:43 +04:00
__uint16_t efi_type ; /* efi log item type */
__uint16_t efi_size ; /* size of this item */
__uint32_t efi_nextents ; /* # extents to free */
2005-04-17 02:20:36 +04:00
__uint64_t efi_id ; /* efi identifier */
xfs_extent_t efi_extents [ 1 ] ; /* array of extents to free */
} xfs_efi_log_format_t ;
2006-06-09 08:55:38 +04:00
typedef struct xfs_efi_log_format_32 {
2006-09-28 04:55:43 +04:00
__uint16_t efi_type ; /* efi log item type */
__uint16_t efi_size ; /* size of this item */
__uint32_t efi_nextents ; /* # extents to free */
2006-06-09 08:55:38 +04:00
__uint64_t efi_id ; /* efi identifier */
xfs_extent_32_t efi_extents [ 1 ] ; /* array of extents to free */
} __attribute__ ( ( packed ) ) xfs_efi_log_format_32_t ;
typedef struct xfs_efi_log_format_64 {
2006-09-28 04:55:43 +04:00
__uint16_t efi_type ; /* efi log item type */
__uint16_t efi_size ; /* size of this item */
__uint32_t efi_nextents ; /* # extents to free */
2006-06-09 08:55:38 +04:00
__uint64_t efi_id ; /* efi identifier */
xfs_extent_64_t efi_extents [ 1 ] ; /* array of extents to free */
} xfs_efi_log_format_64_t ;
2005-04-17 02:20:36 +04:00
/*
* This is the structure used to lay out an efd log item in the
* log . The efd_extents array is a variable size array whose
* size is given by efd_nextents ;
*/
typedef struct xfs_efd_log_format {
2006-09-28 04:55:43 +04:00
__uint16_t efd_type ; /* efd log item type */
__uint16_t efd_size ; /* size of this item */
__uint32_t efd_nextents ; /* # of extents freed */
2005-04-17 02:20:36 +04:00
__uint64_t efd_efi_id ; /* id of corresponding efi */
xfs_extent_t efd_extents [ 1 ] ; /* array of extents freed */
} xfs_efd_log_format_t ;
2006-06-09 08:55:38 +04:00
typedef struct xfs_efd_log_format_32 {
2006-09-28 04:55:43 +04:00
__uint16_t efd_type ; /* efd log item type */
__uint16_t efd_size ; /* size of this item */
__uint32_t efd_nextents ; /* # of extents freed */
2006-06-09 08:55:38 +04:00
__uint64_t efd_efi_id ; /* id of corresponding efi */
xfs_extent_32_t efd_extents [ 1 ] ; /* array of extents freed */
} __attribute__ ( ( packed ) ) xfs_efd_log_format_32_t ;
typedef struct xfs_efd_log_format_64 {
2006-09-28 04:55:43 +04:00
__uint16_t efd_type ; /* efd log item type */
__uint16_t efd_size ; /* size of this item */
__uint32_t efd_nextents ; /* # of extents freed */
2006-06-09 08:55:38 +04:00
__uint64_t efd_efi_id ; /* id of corresponding efi */
xfs_extent_64_t efd_extents [ 1 ] ; /* array of extents freed */
} xfs_efd_log_format_64_t ;
2005-04-17 02:20:36 +04:00
# ifdef __KERNEL__
/*
* Max number of extents in fast allocation path .
*/
# define XFS_EFI_MAX_FAST_EXTENTS 16
/*
* Define EFI flags .
*/
# define XFS_EFI_RECOVERED 0x1
# define XFS_EFI_COMMITTED 0x2
# define XFS_EFI_CANCELED 0x4
/*
* This is the " extent free intention " log item . It is used
* to log the fact that some extents need to be free . It is
* used in conjunction with the " extent free done " log item
* described below .
*/
typedef struct xfs_efi_log_item {
xfs_log_item_t efi_item ;
uint efi_flags ; /* misc flags */
uint efi_next_extent ;
xfs_efi_log_format_t efi_format ;
} xfs_efi_log_item_t ;
/*
* This is the " extent free done " log item . It is used to log
* the fact that some extents earlier mentioned in an efi item
* have been freed .
*/
typedef struct xfs_efd_log_item {
xfs_log_item_t efd_item ;
xfs_efi_log_item_t * efd_efip ;
uint efd_next_extent ;
xfs_efd_log_format_t efd_format ;
} xfs_efd_log_item_t ;
/*
* Max number of extents in fast allocation path .
*/
# define XFS_EFD_MAX_FAST_EXTENTS 16
extern struct kmem_zone * xfs_efi_zone ;
extern struct kmem_zone * xfs_efd_zone ;
xfs_efi_log_item_t * xfs_efi_init ( struct xfs_mount * , uint ) ;
xfs_efd_log_item_t * xfs_efd_init ( struct xfs_mount * , xfs_efi_log_item_t * ,
uint ) ;
2006-06-09 08:55:38 +04:00
int xfs_efi_copy_format ( xfs_log_iovec_t * buf ,
xfs_efi_log_format_t * dst_efi_fmt ) ;
2005-06-21 09:41:19 +04:00
void xfs_efi_item_free ( xfs_efi_log_item_t * ) ;
2005-04-17 02:20:36 +04:00
# endif /* __KERNEL__ */
# endif /* __XFS_EXTFREE_ITEM_H__ */