File: [Development] / xfs-cmds / xfsprogs / include / libxfs.h (download)
Revision 1.53, Tue Aug 8 15:32:10 2006 UTC (11 years, 2 months ago) by nathans.longdrop.melbourne.sgi.com
Branch: MAIN
Changes since 1.52: +3 -1
lines
Allow tools to use direct IO on Linux when reading from the device, if teh device supports it, and if the tools is OK with that (most are). Mainly for xfs_repair speedups, now that libxfs caches metadata buffers internally.
Merge of master-melb:xfs-cmds:26728a by kenmcd.
|
/*
* Copyright (c) 2000-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 __LIBXFS_H__
#define __LIBXFS_H__
#define XFS_BIG_INUMS 1
#define XFS_BIG_BLKNOS 1
#include <xfs/platform_defs.h>
#include <pthread.h>
#include <xfs/list.h>
#include <xfs/cache.h>
#include <xfs/xfs_fs.h>
#include <xfs/xfs_types.h>
#include <xfs/xfs_arch.h>
#include <xfs/xfs_bit.h>
#include <xfs/xfs_inum.h>
#include <xfs/xfs_sb.h>
#include <xfs/xfs_ag.h>
#include <xfs/xfs_dir2.h>
#include <xfs/xfs_mount.h>
#include <xfs/xfs_da_btree.h>
#include <xfs/xfs_bmap_btree.h>
#include <xfs/xfs_alloc_btree.h>
#include <xfs/xfs_ialloc_btree.h>
#include <xfs/xfs_dir_sf.h>
#include <xfs/xfs_dir2_sf.h>
#include <xfs/xfs_attr_sf.h>
#include <xfs/xfs_dinode.h>
#include <xfs/xfs_inode.h>
#include <xfs/xfs_buf_item.h>
#include <xfs/xfs_inode_item.h>
#include <xfs/xfs_alloc.h>
#include <xfs/xfs_btree.h>
#include <xfs/xfs_bmap.h>
#ifndef XFS_SUPER_MAGIC
#define XFS_SUPER_MAGIC 0x58465342
#endif
#define xfs_isset(a,i) ((a)[(i)/(sizeof((a))*NBBY)] & (1<<((i)%(sizeof((a))*NBBY))))
/*
* Argument structure for libxfs_init().
*/
typedef struct {
/* input parameters */
char *volname; /* pathname of volume */
char *dname; /* pathname of data "subvolume" */
char *logname; /* pathname of log "subvolume" */
char *rtname; /* pathname of realtime "subvolume" */
int isreadonly; /* filesystem is only read in applic */
int isdirect; /* we can attempt to use direct I/O */
int disfile; /* data "subvolume" is a regular file */ int dcreat; /* try to create data subvolume */
int lisfile; /* log "subvolume" is a regular file */
int lcreat; /* try to create log subvolume */
int risfile; /* realtime "subvolume" is a reg file */ int rcreat; /* try to create realtime subvolume */
char *notvolmsg; /* format string for not XLV message */
int notvolok; /* set if not XLV => try data */
int setblksize; /* attempt to set device blksize */
/* output results */
dev_t ddev; /* device for data subvolume */
dev_t logdev; /* device for log subvolume */
dev_t rtdev; /* device for realtime subvolume */
long long dsize; /* size of data subvolume (BBs) */
long long logBBsize; /* size of log subvolume (BBs) */
/* (blocks allocated for use as
* log is stored in mount structure) */
long long logBBstart; /* start block of log subvolume (BBs) */
long long rtsize; /* size of realtime subvolume (BBs) */
int dbsize; /* data subvolume device blksize */
int lbsize; /* log subvolume device blksize */
int rtbsize; /* realtime subvolume device blksize */
int dfd; /* data subvolume file descriptor */
int logfd; /* log subvolume file descriptor */
int rtfd; /* realtime subvolume file descriptor */
} libxfs_init_t;
#define LIBXFS_EXIT_ON_FAILURE 0x0001 /* exit the program if a call fails */
#define LIBXFS_ISREADONLY 0x0002 /* disallow all mounted filesystems */
#define LIBXFS_ISINACTIVE 0x0004 /* allow mounted only if mounted ro */
#define LIBXFS_DANGEROUSLY 0x0008 /* repairing a device mounted ro */
#define LIBXFS_EXCLUSIVELY 0x0010 /* disallow other accesses (O_EXCL) */
#define LIBXFS_DIRECT 0x0020 /* can use direct I/O, not buffered */
extern char *progname;
extern int libxfs_init (libxfs_init_t *);
extern void libxfs_destroy (void);
extern int libxfs_device_to_fd (dev_t);
extern dev_t libxfs_device_open (char *, int, int, int);
extern void libxfs_device_zero (dev_t, xfs_daddr_t, uint);
extern void libxfs_device_close (dev_t);
extern int libxfs_device_alignment (void);
extern void libxfs_report(FILE *);
/* check or write log footer: specify device, log size in blocks & uuid */
typedef xfs_caddr_t (libxfs_get_block_t)(xfs_caddr_t, int, void *);
extern int libxfs_log_clear (dev_t, xfs_daddr_t, uint, uuid_t *,
int, int, int);
extern int libxfs_log_header (xfs_caddr_t, uuid_t *, int, int, int,
libxfs_get_block_t *, void *);
/*
* Define a user-level mount structure with all we need
* in order to make use of the numerous XFS_* macros.
*/
struct xfs_inode;
typedef struct xfs_mount {
xfs_sb_t m_sb; /* copy of fs superblock */
char *m_fsname; /* filesystem name */
int m_bsize; /* fs logical block size */
xfs_agnumber_t m_agfrotor; /* last ag where space found */
xfs_agnumber_t m_agirotor; /* last ag dir inode alloced */
xfs_agnumber_t m_maxagi; /* highest inode alloc group */
uint m_rsumlevels; /* rt summary levels */
uint m_rsumsize; /* size of rt summary, bytes */
struct xfs_inode *m_rbmip; /* pointer to bitmap inode */
struct xfs_inode *m_rsumip; /* pointer to summary inode */
struct xfs_inode *m_rootip; /* pointer to root directory */
dev_t m_dev;
dev_t m_logdev;
dev_t m_rtdev;
__uint8_t m_dircook_elog; /* log d-cookie entry bits */
__uint8_t m_blkbit_log; /* blocklog + NBBY */
__uint8_t m_blkbb_log; /* blocklog - BBSHIFT */
__uint8_t m_sectbb_log; /* sectorlog - BBSHIFT */
__uint8_t m_agno_log; /* log #ag's */
__uint8_t m_agino_log; /* #bits for agino in inum */
__uint16_t m_inode_cluster_size;/* min inode buf size */
uint m_blockmask; /* sb_blocksize-1 */
uint m_blockwsize; /* sb_blocksize in words */
uint m_blockwmask; /* blockwsize-1 */
uint m_alloc_mxr[2]; /* XFS_ALLOC_BLOCK_MAXRECS */
uint m_alloc_mnr[2]; /* XFS_ALLOC_BLOCK_MINRECS */
uint m_bmap_dmxr[2]; /* XFS_BMAP_BLOCK_DMAXRECS */
uint m_bmap_dmnr[2]; /* XFS_BMAP_BLOCK_DMINRECS */
uint m_inobt_mxr[2]; /* XFS_INOBT_BLOCK_MAXRECS */
uint m_inobt_mnr[2]; /* XFS_INOBT_BLOCK_MINRECS */
uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */
uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */
uint m_in_maxlevels; /* XFS_IN_MAXLEVELS */
xfs_perag_t *m_perag; /* per-ag accounting info */
uint m_flags; /* global mount flags */
uint m_qflags; /* quota status flags */
uint m_attroffset; /* inode attribute offset */
uint m_dir_node_ents; /* #entries in a dir danode */
uint m_attr_node_ents; /* #entries in attr danode */
int m_ialloc_inos; /* inodes in inode allocation */
int m_ialloc_blks; /* blocks in inode allocation */
int m_litino; /* size of inode union area */
int m_inoalign_mask;/* mask sb_inoalignmt if used */
xfs_trans_reservations_t m_reservations;/* precomputed res values */
__uint64_t m_maxicount; /* maximum inode count */
int m_dalign; /* stripe unit */
int m_swidth; /* stripe width */
int m_sinoalign; /* stripe unit inode alignmnt */
int m_attr_magicpct;/* 37% of the blocksize */
int m_dir_magicpct; /* 37% of the dir blocksize */
__uint8_t m_dirversion; /* 1 or 2 */
int m_dirblksize; /* directory block sz--bytes */
int m_dirblkfsbs; /* directory block sz--fsbs */
xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */
xfs_dablk_t m_dirleafblk; /* blockno of dir non-data v2 */
xfs_dablk_t m_dirfreeblk; /* blockno of dirfreeindex v2 */
} xfs_mount_t;
#define XFS_DIR_IS_V1(mp) ((mp)->m_dirversion == 1)
#define XFS_DIR_IS_V2(mp) ((mp)->m_dirversion == 2)
#define LIBXFS_MOUNT_ROOTINOS 0x0001
#define LIBXFS_MOUNT_DEBUGGER 0x0002
#define LIBXFS_MOUNT_32BITINODES 0x0004
#define LIBXFS_MOUNT_32BITINOOPT 0x0008
#define LIBXFS_MOUNT_COMPAT_ATTR 0x0010
#define LIBXFS_IHASHSIZE(sbp) (1<<16) /* tweak based on icount? */
#define LIBXFS_BHASHSIZE(sbp) (1<<16) /* ditto, on blocks used? */
extern xfs_mount_t *libxfs_mount (xfs_mount_t *, xfs_sb_t *,
dev_t, dev_t, dev_t, int);
extern void libxfs_mount_common (xfs_mount_t *, xfs_sb_t *);
extern xfs_agnumber_t libxfs_initialize_perag (xfs_mount_t *, xfs_agnumber_t);
extern void libxfs_umount (xfs_mount_t *);
extern int libxfs_rtmount_init (xfs_mount_t *);
extern void libxfs_rtmount_destroy (xfs_mount_t *);
extern void libxfs_alloc_compute_maxlevels (xfs_mount_t *);
extern void libxfs_bmap_compute_maxlevels (xfs_mount_t *, int);
extern void libxfs_ialloc_compute_maxlevels (xfs_mount_t *);
extern void libxfs_trans_init (xfs_mount_t *);
/*
* Simple I/O interface
*/
typedef struct xfs_buf {
struct cache_node b_node;
unsigned int b_flags;
xfs_daddr_t b_blkno;
unsigned b_bcount;
dev_t b_dev;
void *b_fsprivate;
void *b_fsprivate2;
void *b_fsprivate3;
char *b_addr;
} xfs_buf_t;
enum xfs_buf_flags_t { /* b_flags bits */
LIBXFS_B_EXIT = 0x0001, /* ==LIBXFS_EXIT_ON_FAILURE */
LIBXFS_B_DIRTY = 0x0002, /* buffer has been modified */
LIBXFS_B_STALE = 0x0004, /* buffer marked as invalid */
LIBXFS_B_UPTODATE = 0x0008 /* buffer is sync'd to disk */
};
#define XFS_BUF_PTR(bp) ((bp)->b_addr)
#define xfs_buf_offset(bp, offset) (XFS_BUF_PTR(bp) + (offset))
#define XFS_BUF_ADDR(bp) ((bp)->b_blkno)
#define XFS_BUF_SIZE(bp) ((bp)->b_bcount)
#define XFS_BUF_COUNT(bp) ((bp)->b_bcount)
#define XFS_BUF_TARGET(bp) ((bp)->b_dev)
#define XFS_BUF_SET_PTR(bp,p,cnt) ((bp)->b_addr = (char *)(p)); \
XFS_BUF_SETCOUNT(bp,cnt)
#define XFS_BUF_SET_ADDR(bp,blk) ((bp)->b_blkno = (blk))
#define XFS_BUF_SETCOUNT(bp,cnt) ((bp)->b_bcount = (cnt))
#define XFS_BUF_FSPRIVATE(bp,type) ((type)(bp)->b_fsprivate)
#define XFS_BUF_SET_FSPRIVATE(bp,val) (bp)->b_fsprivate = (void *)(val)
#define XFS_BUF_FSPRIVATE2(bp,type) ((type)(bp)->b_fsprivate2)
#define XFS_BUF_SET_FSPRIVATE2(bp,val) (bp)->b_fsprivate2 = (void *)(val)
#define XFS_BUF_FSPRIVATE3(bp,type) ((type)(bp)->b_fsprivate3)
#define XFS_BUF_SET_FSPRIVATE3(bp,val) (bp)->b_fsprivate3 = (void *)(val)
extern xfs_buf_t *libxfs_getsb (xfs_mount_t *, int);
extern xfs_buf_t *libxfs_readbuf (dev_t, xfs_daddr_t, int, int);
extern int libxfs_readbufr (dev_t, xfs_daddr_t, xfs_buf_t *, int, int);
extern int libxfs_writebuf (xfs_buf_t *, int);
extern int libxfs_writebufr (xfs_buf_t *);
extern int libxfs_writebuf_int (xfs_buf_t *, int);
/* Buffer Cache Interfaces */
extern struct cache *libxfs_bcache;
extern struct cache_operations libxfs_bcache_operations;
extern void libxfs_bcache_purge (void);
extern void libxfs_bcache_flush (void);
extern xfs_buf_t *libxfs_getbuf (dev_t, xfs_daddr_t, int);
extern void libxfs_putbuf (xfs_buf_t *);
extern void libxfs_purgebuf (xfs_buf_t *);
extern int libxfs_bhash_size;
extern int libxfs_ihash_size;
#define LIBXFS_BREAD 0x1
#define LIBXFS_BWRITE 0x2
#define LIBXFS_BZERO 0x4
extern void libxfs_iomove (xfs_buf_t *, uint, int, void *, int);
/*
* Transaction interface
*/
typedef struct xfs_log_item {
struct xfs_log_item_desc *li_desc; /* ptr to current desc*/
struct xfs_mount *li_mountp; /* ptr to fs mount */
uint li_type; /* item type */
} xfs_log_item_t;
typedef struct xfs_inode_log_item {
xfs_log_item_t ili_item; /* common portion */
struct xfs_inode *ili_inode; /* inode pointer */
unsigned short ili_flags; /* misc flags */
unsigned int ili_last_fields; /* fields when flushed*/
xfs_inode_log_format_t ili_format; /* logged structure */
} xfs_inode_log_item_t;
typedef struct xfs_buf_log_item {
xfs_log_item_t bli_item; /* common item structure */
struct xfs_buf *bli_buf; /* real buffer pointer */
unsigned int bli_flags; /* misc flags */
unsigned int bli_recur; /* recursion count */
xfs_buf_log_format_t bli_format; /* in-log header */
} xfs_buf_log_item_t;
#include <xfs/xfs_trans.h>
typedef struct xfs_trans {
unsigned int t_type; /* transaction type */
unsigned int t_log_res; /* amt of log space resvd */
unsigned int t_log_count; /* count for perm log res */
xfs_mount_t *t_mountp; /* ptr to fs mount struct */
unsigned int t_flags; /* misc flags */
long t_icount_delta; /* superblock icount change */
long t_ifree_delta; /* superblock ifree change */
long t_fdblocks_delta; /* superblock fdblocks chg */
long t_frextents_delta; /* superblock freextents chg */
unsigned int t_items_free; /* log item descs free */
xfs_log_item_chunk_t t_items; /* first log item desc chunk */
} xfs_trans_t;
extern xfs_trans_t *libxfs_trans_alloc (xfs_mount_t *, int);
extern xfs_trans_t *libxfs_trans_dup (xfs_trans_t *);
extern int libxfs_trans_reserve (xfs_trans_t *, uint,uint,uint,uint,uint);
extern int libxfs_trans_commit (xfs_trans_t *, uint, xfs_lsn_t *);
extern void libxfs_trans_cancel (xfs_trans_t *, int);
extern void libxfs_mod_sb (xfs_trans_t *, __int64_t);
extern xfs_buf_t *libxfs_trans_getsb (xfs_trans_t *, xfs_mount_t *, int);
extern int libxfs_trans_iget (xfs_mount_t *, xfs_trans_t *, xfs_ino_t,
uint, uint, struct xfs_inode **);
extern void libxfs_trans_iput(xfs_trans_t *, struct xfs_inode *, uint);
extern void libxfs_trans_ijoin (xfs_trans_t *, struct xfs_inode *, uint);
extern void libxfs_trans_ihold (xfs_trans_t *, struct xfs_inode *);
extern void libxfs_trans_log_inode (xfs_trans_t *, struct xfs_inode *,
uint);
extern void libxfs_trans_brelse (xfs_trans_t *, struct xfs_buf *);
extern void libxfs_trans_binval (xfs_trans_t *, struct xfs_buf *);
extern void libxfs_trans_bjoin (xfs_trans_t *, struct xfs_buf *);
extern void libxfs_trans_bhold (xfs_trans_t *, struct xfs_buf *);
extern void libxfs_trans_log_buf (xfs_trans_t *, struct xfs_buf *,
uint, uint);
extern xfs_buf_t *libxfs_trans_get_buf (xfs_trans_t *, dev_t,
xfs_daddr_t, int, uint);
extern int libxfs_trans_read_buf (xfs_mount_t *, xfs_trans_t *, dev_t,
xfs_daddr_t, int, uint, struct xfs_buf **);
/*
* Simple memory interface
*/
typedef struct xfs_zone {
int zone_unitsize; /* Size in bytes of zone unit */
char *zone_name; /* tag name */
int allocated; /* debug: How many currently allocated */
} xfs_zone_t;
extern xfs_zone_t *libxfs_zone_init (int, char *);
extern void *libxfs_zone_zalloc (xfs_zone_t *);
extern void libxfs_zone_free (xfs_zone_t *, void *);
extern void *libxfs_malloc (size_t);
extern void libxfs_free (void *);
extern void *libxfs_realloc (void *, size_t);
/*
* Inode interface
*/
typedef struct xfs_inode {
struct cache_node i_node;
xfs_mount_t *i_mount; /* fs mount struct ptr */
xfs_ino_t i_ino; /* inode number (agno/agino) */
xfs_daddr_t i_blkno; /* blkno of inode buffer */
dev_t i_dev; /* dev for this inode */
ushort i_len; /* len of inode buffer */
ushort i_boffset; /* off of inode in buffer */
xfs_ifork_t *i_afp; /* attribute fork pointer */
xfs_ifork_t i_df; /* data fork */
xfs_trans_t *i_transp; /* ptr to owning transaction */
xfs_inode_log_item_t *i_itemp; /* logging information */
unsigned int i_delayed_blks; /* count of delay alloc blks */
xfs_dinode_core_t i_d; /* most of ondisk inode */
} xfs_inode_t;
#define LIBXFS_ATTR_ROOT 0x0002 /* use attrs in root namespace */
#define LIBXFS_ATTR_SECURE 0x0008 /* use attrs in security namespace */
#define LIBXFS_ATTR_CREATE 0x0010 /* create, but fail if attr exists */
#define LIBXFS_ATTR_REPLACE 0x0020 /* set, but fail if attr not exists */
typedef struct cred {
uid_t cr_uid;
gid_t cr_gid;
} cred_t;
extern int libxfs_inode_alloc (xfs_trans_t **, xfs_inode_t *, mode_t,
nlink_t, xfs_dev_t, struct cred *,
struct fsxattr *, xfs_inode_t **);
extern void libxfs_trans_inode_alloc_buf (xfs_trans_t *, xfs_buf_t *);
extern void libxfs_idata_realloc (xfs_inode_t *, int, int);
extern void libxfs_idestroy_fork (xfs_inode_t *, int);
extern int libxfs_iformat (xfs_inode_t *, xfs_dinode_t *);
extern void libxfs_ichgtime (xfs_inode_t *, int);
extern int libxfs_iflush_int (xfs_inode_t *, xfs_buf_t *);
extern int libxfs_itobp (xfs_mount_t *, xfs_trans_t *, xfs_inode_t *,
xfs_dinode_t **, xfs_buf_t **, xfs_daddr_t);
extern int libxfs_iread (xfs_mount_t *, xfs_trans_t *, xfs_ino_t,
xfs_inode_t *, xfs_daddr_t);
/* Inode Cache Interfaces */
extern struct cache *libxfs_icache;
extern struct cache_operations libxfs_icache_operations;
extern void libxfs_icache_purge (void);
extern int libxfs_iget (xfs_mount_t *, xfs_trans_t *, xfs_ino_t,
uint, xfs_inode_t **, xfs_daddr_t);
extern void libxfs_iput (xfs_inode_t *, uint);
/*
* Directory interface
*/
#include <xfs/xfs_dir_leaf.h>
#include <xfs/xfs_dir2_data.h>
#include <xfs/xfs_dir2_leaf.h>
#include <xfs/xfs_dir2_block.h>
#include <xfs/xfs_dir2_node.h>
extern void libxfs_dir_mount (xfs_mount_t *);
extern void libxfs_dir2_mount (xfs_mount_t *);
extern int libxfs_dir_init (xfs_trans_t *, xfs_inode_t *, xfs_inode_t *);
extern int libxfs_dir2_init (xfs_trans_t *, xfs_inode_t *, xfs_inode_t *);
extern int libxfs_dir_createname (xfs_trans_t *, xfs_inode_t *, char *,
int, xfs_ino_t, xfs_fsblock_t *,
xfs_bmap_free_t *, xfs_extlen_t);
extern int libxfs_dir2_createname (xfs_trans_t *, xfs_inode_t *, char *,
int, xfs_ino_t, xfs_fsblock_t *,
xfs_bmap_free_t *, xfs_extlen_t);
extern int libxfs_dir_lookup (xfs_trans_t *, xfs_inode_t *,
char *, int, xfs_ino_t *);
extern int libxfs_dir2_lookup (xfs_trans_t *, xfs_inode_t *,
char *, int, xfs_ino_t *);
extern int libxfs_dir_replace (xfs_trans_t *, xfs_inode_t *,
char *, int, xfs_ino_t, xfs_fsblock_t *,
xfs_bmap_free_t *, xfs_extlen_t);
extern int libxfs_dir2_replace (xfs_trans_t *, xfs_inode_t *,
char *, int, xfs_ino_t, xfs_fsblock_t *,
xfs_bmap_free_t *, xfs_extlen_t);
extern int libxfs_dir_removename (xfs_trans_t *, xfs_inode_t *,
char *, int, xfs_ino_t, xfs_fsblock_t *,
xfs_bmap_free_t *, xfs_extlen_t);
extern int libxfs_dir2_removename (xfs_trans_t *, xfs_inode_t *,
char *, int, xfs_ino_t, xfs_fsblock_t *,
xfs_bmap_free_t *, xfs_extlen_t);
extern int libxfs_dir_bogus_removename (xfs_trans_t *, xfs_inode_t *,
char *, xfs_fsblock_t *, xfs_bmap_free_t *,
xfs_extlen_t, xfs_dahash_t, int);
extern int libxfs_dir2_bogus_removename (xfs_trans_t *, xfs_inode_t *,
char *, xfs_fsblock_t *, xfs_bmap_free_t *,
xfs_extlen_t, xfs_dahash_t, int);
/*
* Block map interface
*/
extern int libxfs_bmapi (xfs_trans_t *, xfs_inode_t *, xfs_fileoff_t,
xfs_filblks_t, int, xfs_fsblock_t *,
xfs_extlen_t, xfs_bmbt_irec_t *, int *,
xfs_bmap_free_t *);
extern int libxfs_bmapi_single(xfs_trans_t *, xfs_inode_t *, int,
xfs_fsblock_t *, xfs_fileoff_t);
extern int libxfs_bmap_finish (xfs_trans_t **, xfs_bmap_free_t *,
xfs_fsblock_t, int *);
extern void libxfs_bmap_cancel(xfs_bmap_free_t *);
extern int libxfs_bmap_next_offset (xfs_trans_t *, xfs_inode_t *,
xfs_fileoff_t *, int);
extern int libxfs_bmap_last_offset(xfs_trans_t *, xfs_inode_t *,
xfs_fileoff_t *, int);
extern int libxfs_bunmapi (xfs_trans_t *, xfs_inode_t *, xfs_fileoff_t,
xfs_filblks_t, int, xfs_extnum_t,
xfs_fsblock_t *, xfs_bmap_free_t *, int *);
extern void libxfs_bmap_del_free (xfs_bmap_free_t *,
xfs_bmap_free_item_t *, xfs_bmap_free_item_t *);
/*
* All other routines we want to keep common...
*/
extern int libxfs_highbit32 (__uint32_t);
extern int libxfs_highbit64 (__uint64_t);
extern uint libxfs_da_log2_roundup (uint);
extern void libxfs_xlate_sb (void *, xfs_sb_t *, int, __int64_t);
extern void libxfs_xlate_dinode_core (xfs_caddr_t buf,
xfs_dinode_core_t *, int);
extern int libxfs_alloc_fix_freelist (xfs_alloc_arg_t *, int);
extern int libxfs_alloc_file_space (xfs_inode_t *, xfs_off_t,
xfs_off_t, int, int);
extern xfs_dahash_t libxfs_da_hashname (const uchar_t *, int);
extern int libxfs_attr_leaf_newentsize (int, int, int, int *);
extern int libxfs_attr_set_int (xfs_inode_t*, const char *, int, char *,
int, int);
extern int libxfs_attr_remove_int (xfs_inode_t *, const char *, int, int);
extern void libxfs_bmbt_get_all (xfs_bmbt_rec_t *, xfs_bmbt_irec_t *);
#if __BYTE_ORDER != __BIG_ENDIAN
extern void libxfs_bmbt_disk_get_all (xfs_bmbt_rec_t *, xfs_bmbt_irec_t *);
#else
# define libxfs_bmbt_disk_get_all(r,s) libxfs_bmbt_get_all(r,s)
#endif
extern int libxfs_free_extent (xfs_trans_t *, xfs_fsblock_t, xfs_extlen_t);
extern int libxfs_rtfree_extent (xfs_trans_t *, xfs_rtblock_t,
xfs_extlen_t);
/* Directory/Attribute routines used by xfs_repair */
extern void libxfs_da_bjoin (xfs_trans_t *, xfs_dabuf_t *);
extern int libxfs_da_shrink_inode (xfs_da_args_t *, xfs_dablk_t,
xfs_dabuf_t *);
extern int libxfs_da_grow_inode (xfs_da_args_t *, xfs_dablk_t *);
extern void libxfs_da_bhold (xfs_trans_t *, xfs_dabuf_t *);
extern void libxfs_da_brelse (xfs_trans_t *, xfs_dabuf_t *);
extern int libxfs_da_read_bufr (xfs_trans_t *, xfs_inode_t *, xfs_dablk_t,
xfs_daddr_t, xfs_dabuf_t **, int);
extern int libxfs_da_read_buf (xfs_trans_t *, xfs_inode_t *,
xfs_dablk_t, xfs_daddr_t, xfs_dabuf_t **, int);
extern int libxfs_da_get_buf (xfs_trans_t *, xfs_inode_t *,
xfs_dablk_t, xfs_daddr_t, xfs_dabuf_t **, int);
extern void libxfs_da_log_buf (xfs_trans_t *, xfs_dabuf_t *, uint, uint);
extern int libxfs_dir2_shrink_inode (xfs_da_args_t *, xfs_dir2_db_t,
xfs_dabuf_t *);
extern int libxfs_dir2_grow_inode (xfs_da_args_t *, int, xfs_dir2_db_t *);
extern int libxfs_dir2_isleaf (xfs_trans_t *, xfs_inode_t *, int *);
extern int libxfs_dir2_isblock (xfs_trans_t *, xfs_inode_t *, int *);
extern void libxfs_dir2_data_use_free (xfs_trans_t *, xfs_dabuf_t *,
xfs_dir2_data_unused_t *, xfs_dir2_data_aoff_t,
xfs_dir2_data_aoff_t, int *, int *);
extern void libxfs_dir2_data_make_free (xfs_trans_t *, xfs_dabuf_t *,
xfs_dir2_data_aoff_t, xfs_dir2_data_aoff_t,
int *, int *);
extern void libxfs_dir2_data_log_entry (xfs_trans_t *, xfs_dabuf_t *,
xfs_dir2_data_entry_t *);
extern void libxfs_dir2_data_log_header (xfs_trans_t *, xfs_dabuf_t *);
extern void libxfs_dir2_data_freescan (xfs_mount_t *, xfs_dir2_data_t *,
int *, char *);
extern void libxfs_dir2_free_log_bests (xfs_trans_t *, xfs_dabuf_t *,
int, int);
/* Shared utility routines */
extern unsigned int libxfs_log2_roundup(unsigned int i);
extern void cmn_err(int, char *, ...);
enum ce { CE_DEBUG, CE_CONT, CE_NOTE, CE_WARN, CE_ALERT, CE_PANIC };
/* lio interface */
/* lio_listio(3) interface (POSIX linked asynchronous I/O) */
extern int libxfs_lio_ino_count;
extern int libxfs_lio_dir_count;
extern int libxfs_lio_aio_count;
extern int libxfs_lio_init(void);
extern void libxfs_lio_allocate(void);
extern void *libxfs_get_lio_buffer(int type);
extern void libxfs_put_lio_buffer(void *buffer);
extern int libxfs_readbuf_list(dev_t dev, int nent, void *voidp, int type);
typedef struct libxfs_lio_req {
xfs_daddr_t blkno;
int len; /* bbs */
} libxfs_lio_req_t;
#define LIBXFS_LIO_TYPE_INO 0x1
#define LIBXFS_LIO_TYPE_DIR 0x2
#define LIBXFS_LIO_TYPE_RAW 0x3
#define LIBXFS_BBTOOFF64(bbs) (((xfs_off_t)(bbs)) << BBSHIFT)
#include <xfs/xfs_ialloc.h>
#include <xfs/xfs_rtalloc.h>
#include <xfs/xfs_attr_leaf.h>
#include <xfs/xfs_quota.h>
#include <xfs/xfs_trans_space.h>
#include <xfs/xfs_imap.h>
#include <xfs/xfs_log.h>
#include <xfs/xfs_log_priv.h>
#endif /* __LIBXFS_H__ */