#ifndef __LIBXFS_H__
#define __LIBXFS_H__
+#include <xfs/libxfs_api_defs.h>
#include <xfs/platform_defs.h>
#include <xfs/list.h>
libxfs_get_block_t *, void *);
-#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 */
-
/* Shared utility routines */
extern unsigned int libxfs_log2_roundup(unsigned int i);
#define XFS_INOBT_IS_FREE_DISK(rp,i) \
((be64_to_cpu((rp)->ir_free) & XFS_INOBT_MASK(i)) != 0)
-/*
- * public xfs kernel routines to be called as libxfs_*
- *
- * These are all present in the xfs_* namespace but we don't want that namespace
- * to be used or even exposed, and hence we declare them here explicitly if we
- * aren't directly building the libxfs code itself.
- *
- * XXX: This needs to be more formalised in the shared header files so that
- * these declarations can go away, and so there's documentation in the kernel
- * code base that certain functions are shared with userspace.
- */
-#ifndef __LIBXFS_INTERNAL_XFS_H__
-
-/* xfs_sb.h */
-void libxfs_log_sb(struct xfs_trans *tp);
-void libxfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *);
-void libxfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *);
-void libxfs_sb_quota_from_disk(struct xfs_sb *sbp);
-
-/* xfs_bmap.h */
-int libxfs_bmapi_write(struct xfs_trans *tp, struct xfs_inode *ip,
- xfs_fileoff_t bno, xfs_filblks_t len, int flags,
- xfs_fsblock_t *firstblock, xfs_extlen_t total,
- struct xfs_bmbt_irec *mval, int *nmap,
- struct xfs_bmap_free *flist);
-int libxfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip,
- xfs_fileoff_t bno, xfs_filblks_t len, int flags,
- xfs_extnum_t nexts, xfs_fsblock_t *firstblock,
- struct xfs_bmap_free *flist, int *done);
-void libxfs_bmap_cancel(struct xfs_bmap_free *flist);
-int libxfs_bmap_last_offset(struct xfs_inode *ip,
- xfs_fileoff_t *unused, int whichfork);
-int libxfs_bmap_finish(struct xfs_trans **tp, struct xfs_bmap_free *flist,
- int *committed);
-
-/* xfs_dir2.h */
-int libxfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp,
- struct xfs_inode *pdp);
-int libxfs_dir_createname(struct xfs_trans *tp, struct xfs_inode *dp,
- struct xfs_name *name, xfs_ino_t inum,
- xfs_fsblock_t *first,
- struct xfs_bmap_free *flist, xfs_extlen_t tot);
-int libxfs_dir_lookup(struct xfs_trans *tp, struct xfs_inode *dp,
- struct xfs_name *name, xfs_ino_t *inum,
- struct xfs_name *ci_name);
-int libxfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp,
- struct xfs_name *name, xfs_ino_t inum,
- xfs_fsblock_t *first,
- struct xfs_bmap_free *flist, xfs_extlen_t tot);
-
-int libxfs_dir2_isblock(struct xfs_da_args *args, int *r);
-int libxfs_dir2_isleaf(struct xfs_da_args *args, int *r);
-int libxfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db,
- struct xfs_buf *bp);
-
-void libxfs_dir2_data_freescan(struct xfs_da_geometry *geo,
- const struct xfs_dir_ops *ops,
- struct xfs_dir2_data_hdr *hdr, int *loghead);
-
-void libxfs_dir2_data_log_entry(struct xfs_da_args *args,
- struct xfs_buf *bp, struct xfs_dir2_data_entry *dep);
-void libxfs_dir2_data_log_header(struct xfs_da_args *args,
- struct xfs_buf *bp);
-void libxfs_dir2_data_log_unused(struct xfs_da_args *args,
- struct xfs_buf *bp, struct xfs_dir2_data_unused *dup);
-void libxfs_dir2_data_make_free(struct xfs_da_args *args,
- struct xfs_buf *bp, xfs_dir2_data_aoff_t offset,
- xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp);
-void libxfs_dir2_data_use_free(struct xfs_da_args *args,
- struct xfs_buf *bp, struct xfs_dir2_data_unused *dup,
- xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len,
- int *needlogp, int *needscanp);
-
-/* xfs_da_btree.h */
-uint libxfs_da_hashname(const __uint8_t *name_string, int name_length);
-int libxfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno,
- struct xfs_buf *dead_buf);
-int libxfs_da_read_buf(struct xfs_trans *trans, struct xfs_inode *dp,
- xfs_dablk_t bno, xfs_daddr_t mappedbno,
- struct xfs_buf **bpp, int whichfork,
- const struct xfs_buf_ops *ops);
-
-
-/* xfs_inode_buf.h */
-void libxfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *);
-
-/* xfs_inode_fork.h */
-void libxfs_idata_realloc(struct xfs_inode *, int, int);
-
-/* xfs_symlink_remote.h */
-int libxfs_symlink_blocks(struct xfs_mount *mp, int pathlen);
-bool libxfs_symlink_hdr_ok(xfs_ino_t ino, uint32_t offset, uint32_t size,
- struct xfs_buf *bp);
-
-/* xfs_bit.h */
-/* XXX: these are special as they are static inline functions in the header */
-#define libxfs_highbit32 xfs_highbit32
-#define libxfs_highbit64 xfs_highbit64
-
-/* xfs_alloc.c */
-int libxfs_alloc_fix_freelist(xfs_alloc_arg_t *, int);
-
-/* xfs_attr.c */
-int libxfs_attr_get(struct xfs_inode *, const unsigned char *,
- unsigned char *, int *, int);
-int libxfs_attr_set(struct xfs_inode *, const unsigned char *,
- unsigned char *, int, int);
-int libxfs_attr_remove(struct xfs_inode *, const unsigned char *, int);
-
-/* xfs_bmap.c */
-xfs_bmbt_rec_host_t *xfs_bmap_search_extents(struct xfs_inode *, xfs_fileoff_t,
- int, int *, xfs_extnum_t *, xfs_bmbt_irec_t *,
- xfs_bmbt_irec_t *);
-void libxfs_bmbt_get_all(struct xfs_bmbt_rec_host *r, struct xfs_bmbt_irec *s);
-
static inline void
libxfs_bmbt_disk_get_all(
struct xfs_bmbt_rec *rp,
libxfs_bmbt_get_all(&hrec, irec);
}
-void libxfs_dinode_from_disk(struct xfs_icdinode *,
- struct xfs_dinode *);
-bool libxfs_dinode_verify(struct xfs_mount *mp, xfs_ino_t ino,
- struct xfs_dinode *dip);
-
-/* this file */
-/* XXX: this needs cleanup like the xfs_bit.h stuff */
-#define libxfs_verify_cksum xfs_verify_cksum
-#define libxfs_buf_verify_cksum xfs_buf_verify_cksum
-#define libxfs_buf_update_cksum xfs_buf_update_cksum
-
-#endif /* __LIBXFS_INTERNAL_XFS_H__ */
-
/* XXX: this is clearly a bug - a shared header needs to export this */
/* xfs_rtalloc.c */
int libxfs_rtfree_extent(struct xfs_trans *, xfs_rtblock_t, xfs_extlen_t);
+/* XXX: need parts of xfs_attr.h in userspace */
+#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 */
+
+int xfs_attr_remove(struct xfs_inode *dp, const unsigned char *name, int flags);
+int xfs_attr_set(struct xfs_inode *dp, const unsigned char *name,
+ unsigned char *value, int valuelen, int flags);
+
#endif /* __LIBXFS_H__ */
xfs_shared.h \
xfs_trans_resv.h \
xfs_trans_space.h \
- libxfs_io.h
+ libxfs_io.h \
+ libxfs_api_defs.h
CFILES = cache.c \
crc32.c \
--- /dev/null
+/*
+ * 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_API_DEFS_H__
+#define __LIBXFS_API_DEFS_H__
+
+/*
+ * This file defines all the kernel based functions we expose to userspace
+ * via the libxfs_* namespace. This is kept in a separate header file so
+ * it can be included in both the internal and external libxfs header files
+ * without introducing any depenencies between the two.
+ */
+#define xfs_highbit32 libxfs_highbit32
+#define xfs_highbit64 libxfs_highbit64
+
+#define xfs_fs_repair_cmn_err libxfs_fs_repair_cmn_err
+#define xfs_fs_cmn_err libxfs_fs_cmn_err
+
+#define xfs_trans_alloc libxfs_trans_alloc
+#define xfs_trans_add_item libxfs_trans_add_item
+#define xfs_trans_bhold libxfs_trans_bhold
+#define xfs_trans_binval libxfs_trans_binval
+#define xfs_trans_bjoin libxfs_trans_bjoin
+#define xfs_trans_brelse libxfs_trans_brelse
+#define xfs_trans_commit libxfs_trans_commit
+#define xfs_trans_cancel libxfs_trans_cancel
+#define xfs_trans_del_item libxfs_trans_del_item
+#define xfs_trans_dup libxfs_trans_dup
+#define xfs_trans_get_buf libxfs_trans_get_buf
+#define xfs_trans_getsb libxfs_trans_getsb
+#define xfs_trans_iget libxfs_trans_iget
+#define xfs_trans_ichgtime libxfs_trans_ichgtime
+#define xfs_trans_ijoin libxfs_trans_ijoin
+#define xfs_trans_ijoin_ref libxfs_trans_ijoin_ref
+#define xfs_trans_init libxfs_trans_init
+#define xfs_trans_inode_alloc_buf libxfs_trans_inode_alloc_buf
+#define xfs_trans_log_buf libxfs_trans_log_buf
+#define xfs_trans_log_inode libxfs_trans_log_inode
+#define xfs_trans_mod_sb libxfs_trans_mod_sb
+#define xfs_trans_read_buf libxfs_trans_read_buf
+#define xfs_trans_read_buf_map libxfs_trans_read_buf_map
+#define xfs_trans_roll libxfs_trans_roll
+#define xfs_trans_get_buf_map libxfs_trans_get_buf_map
+#define xfs_trans_reserve libxfs_trans_reserve
+#define xfs_trans_resv_calc libxfs_trans_resv_calc
+
+#define xfs_attr_get libxfs_attr_get
+#define xfs_attr_set libxfs_attr_set
+#define xfs_attr_remove libxfs_attr_remove
+#define xfs_attr_leaf_newentsize libxfs_attr_leaf_newentsize
+
+#define xfs_alloc_fix_freelist libxfs_alloc_fix_freelist
+#define xfs_bmap_cancel libxfs_bmap_cancel
+#define xfs_bmap_last_offset libxfs_bmap_last_offset
+#define xfs_bmap_search_extents libxfs_bmap_search_extents
+#define xfs_bmap_finish libxfs_bmap_finish
+#define xfs_bmapi_write libxfs_bmapi_write
+#define xfs_bmapi_read libxfs_bmapi_read
+#define xfs_bunmapi libxfs_bunmapi
+#define xfs_bmbt_get_all libxfs_bmbt_get_all
+#define xfs_rtfree_extent libxfs_rtfree_extent
+
+#define xfs_da_brelse libxfs_da_brelse
+#define xfs_da_hashname libxfs_da_hashname
+#define xfs_da_shrink_inode libxfs_da_shrink_inode
+#define xfs_da_read_buf libxfs_da_read_buf
+#define xfs_dir_createname libxfs_dir_createname
+#define xfs_dir_init libxfs_dir_init
+#define xfs_dir_lookup libxfs_dir_lookup
+#define xfs_dir_replace libxfs_dir_replace
+#define xfs_dir2_isblock libxfs_dir2_isblock
+#define xfs_dir2_isleaf libxfs_dir2_isleaf
+#define __xfs_dir2_data_freescan libxfs_dir2_data_freescan
+#define xfs_dir2_data_log_entry libxfs_dir2_data_log_entry
+#define xfs_dir2_data_log_header libxfs_dir2_data_log_header
+#define xfs_dir2_data_make_free libxfs_dir2_data_make_free
+#define xfs_dir2_data_use_free libxfs_dir2_data_use_free
+#define xfs_dir2_shrink_inode libxfs_dir2_shrink_inode
+
+#define xfs_dinode_from_disk libxfs_dinode_from_disk
+#define xfs_dinode_to_disk libxfs_dinode_to_disk
+#define xfs_dinode_calc_crc libxfs_dinode_calc_crc
+#define xfs_idata_realloc libxfs_idata_realloc
+#define xfs_idestroy_fork libxfs_idestroy_fork
+
+#define xfs_log_sb libxfs_log_sb
+#define xfs_sb_from_disk libxfs_sb_from_disk
+#define xfs_sb_quota_from_disk libxfs_sb_quota_from_disk
+#define xfs_sb_to_disk libxfs_sb_to_disk
+
+#define xfs_symlink_blocks libxfs_symlink_blocks
+#define xfs_symlink_hdr_ok libxfs_symlink_hdr_ok
+
+#define xfs_verify_cksum libxfs_verify_cksum
+
+#endif /* __LIBXFS_API_DEFS_H__ */
#define __LIBXFS_INTERNAL_XFS_H__
/*
- * repair doesn't have a inode when it calls libxfs_dir2_data_freescan,
- * so we map this internally for now.
+ * Repair doesn't have a inode when it calls libxfs_dir2_data_freescan,
+ * so we to work around this internally for now.
*/
#define xfs_dir2_data_freescan(ip, hdr, loghead) \
__xfs_dir2_data_freescan((ip)->i_mount->m_dir_geo, \
(ip)->d_ops, hdr, loghead)
-/*
- * start by remapping all the symbols we expect external users to call
- * to the libxfs_ namespace. This ensures that all internal symbols are
- * remapped correctly throughout all the included header files
- * as well as in the C code.
- */
-#define xfs_alloc_fix_freelist libxfs_alloc_fix_freelist
-#define xfs_attr_get libxfs_attr_get
-#define xfs_attr_set libxfs_attr_set
-#define xfs_attr_remove libxfs_attr_remove
-#define xfs_rtfree_extent libxfs_rtfree_extent
-
-#define xfs_fs_repair_cmn_err libxfs_fs_repair_cmn_err
-#define xfs_fs_cmn_err libxfs_fs_cmn_err
-
-#define xfs_bmap_finish libxfs_bmap_finish
-#define xfs_trans_ichgtime libxfs_trans_ichgtime
-
-#define xfs_trans_alloc libxfs_trans_alloc
-#define xfs_trans_add_item libxfs_trans_add_item
-#define xfs_trans_bhold libxfs_trans_bhold
-#define xfs_trans_binval libxfs_trans_binval
-#define xfs_trans_bjoin libxfs_trans_bjoin
-#define xfs_trans_brelse libxfs_trans_brelse
-#define xfs_trans_commit libxfs_trans_commit
-#define xfs_trans_cancel libxfs_trans_cancel
-#define xfs_trans_del_item libxfs_trans_del_item
-#define xfs_trans_dup libxfs_trans_dup
-#define xfs_trans_get_buf libxfs_trans_get_buf
-#define xfs_trans_getsb libxfs_trans_getsb
-#define xfs_trans_iget libxfs_trans_iget
-#define xfs_trans_ijoin libxfs_trans_ijoin
-#define xfs_trans_ijoin_ref libxfs_trans_ijoin_ref
-#define xfs_trans_init libxfs_trans_init
-#define xfs_trans_inode_alloc_buf libxfs_trans_inode_alloc_buf
-#define xfs_trans_log_buf libxfs_trans_log_buf
-#define xfs_trans_log_inode libxfs_trans_log_inode
-#define xfs_trans_mod_sb libxfs_trans_mod_sb
-#define xfs_trans_read_buf libxfs_trans_read_buf
-#define xfs_trans_read_buf_map libxfs_trans_read_buf_map
-#define xfs_trans_roll libxfs_trans_roll
-#define xfs_trans_get_buf_map libxfs_trans_get_buf_map
-#define xfs_trans_reserve libxfs_trans_reserve
-
-/* xfs_attr_leaf.h */
-#define xfs_attr_leaf_newentsize libxfs_attr_leaf_newentsize
-
-/* xfs_bit.h */
-#define xfs_highbit32 libxfs_highbit32
-#define xfs_highbit64 libxfs_highbit64
-
-/* xfs_bmap.h */
-#define xfs_bmap_cancel libxfs_bmap_cancel
-#define xfs_bmap_last_offset libxfs_bmap_last_offset
-#define xfs_bmapi_write libxfs_bmapi_write
-#define xfs_bmapi_read libxfs_bmapi_read
-#define xfs_bunmapi libxfs_bunmapi
-
-/* xfs_bmap_btree.h */
-#define xfs_bmbt_get_all libxfs_bmbt_get_all
-
-/* xfs_da_btree.h */
-#define xfs_da_brelse libxfs_da_brelse
-#define xfs_da_hashname libxfs_da_hashname
-#define xfs_da_shrink_inode libxfs_da_shrink_inode
-#define xfs_da_read_buf libxfs_da_read_buf
-
-/* xfs_dir2.h */
-#define xfs_dir_createname libxfs_dir_createname
-#define xfs_dir_init libxfs_dir_init
-#define xfs_dir_lookup libxfs_dir_lookup
-#define xfs_dir_replace libxfs_dir_replace
-#define xfs_dir2_isblock libxfs_dir2_isblock
-#define xfs_dir2_isleaf libxfs_dir2_isleaf
-
-/* xfs_dir2_data.h */
-#define __xfs_dir2_data_freescan libxfs_dir2_data_freescan
-#define xfs_dir2_data_log_entry libxfs_dir2_data_log_entry
-#define xfs_dir2_data_log_header libxfs_dir2_data_log_header
-#define xfs_dir2_data_make_free libxfs_dir2_data_make_free
-#define xfs_dir2_data_use_free libxfs_dir2_data_use_free
-#define xfs_dir2_shrink_inode libxfs_dir2_shrink_inode
-
-/* xfs_inode.h */
-#define xfs_dinode_from_disk libxfs_dinode_from_disk
-#define xfs_dinode_to_disk libxfs_dinode_to_disk
-#define xfs_dinode_calc_crc libxfs_dinode_calc_crc
-#define xfs_idata_realloc libxfs_idata_realloc
-#define xfs_idestroy_fork libxfs_idestroy_fork
-
-#define xfs_dinode_verify libxfs_dinode_verify
-
-/* xfs_sb.h */
-#define xfs_log_sb libxfs_log_sb
-#define xfs_sb_from_disk libxfs_sb_from_disk
-#define xfs_sb_quota_from_disk libxfs_sb_quota_from_disk
-#define xfs_sb_to_disk libxfs_sb_to_disk
-
-/* xfs_symlink.h */
-#define xfs_symlink_blocks libxfs_symlink_blocks
-#define xfs_symlink_hdr_ok libxfs_symlink_hdr_ok
-
-/* xfs_trans_resv.h */
-#define xfs_trans_resv_calc libxfs_trans_resv_calc
-
-
-/*
- * Now we've renamed and mapped everything, include the rest of the external
- * libxfs headers.
- */
+#include "libxfs_api_defs.h"
#include <xfs/platform_defs.h>
#include <xfs/list.h>
int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp,
xfs_agnumber_t agno, int flags, struct xfs_buf **bpp);
+int xfs_alloc_fix_freelist(struct xfs_alloc_arg *args, int flags);
#endif /* __XFS_ALLOC_H__ */
int num_exts);
int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset);
+struct xfs_bmbt_rec_host *
+ xfs_bmap_search_extents(struct xfs_inode *ip, xfs_fileoff_t bno,
+ int fork, int *eofp, xfs_extnum_t *lastxp,
+ struct xfs_bmbt_irec *gotp,
+ struct xfs_bmbt_irec *prevp);
+
+
#endif /* __XFS_BMAP_H__ */
bool
xfs_dinode_verify(
struct xfs_mount *mp,
- struct xfs_inode *ip,
+ xfs_ino_t ino,
struct xfs_dinode *dip)
{
if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC))
if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize,
XFS_DINODE_CRC_OFF))
return false;
- if (be64_to_cpu(dip->di_ino) != ip->i_ino)
+ if (be64_to_cpu(dip->di_ino) != ino)
return false;
if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_uuid))
return false;
return error;
/* even unallocated inodes are verified */
- if (!xfs_dinode_verify(mp, ip, dip)) {
+ if (!xfs_dinode_verify(mp, ip->i_ino, dip)) {
xfs_alert(mp, "%s: validation failed for inode %lld failed",
__func__, ip->i_ino);
void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *);
void xfs_dinode_to_disk(struct xfs_dinode *to, struct xfs_icdinode *from);
void xfs_dinode_from_disk(struct xfs_icdinode *to, struct xfs_dinode *from);
+bool xfs_dinode_verify(struct xfs_mount *mp, xfs_ino_t ino,
+ struct xfs_dinode *dip);
#if defined(DEBUG)
void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *);
(error = xfs_iread_extents(tp, ip, whichfork)))
return error;
bno = *bnop + 1;
- xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, &prev);
+ libxfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx,
+ &got, &prev);
if (eof)
*bnop = NULLFILEOFF;
else