mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-18 06:50:08 +00:00
051e7cd44a
Currently xfs has a rather complicated internal scheme to allow for different directory formats in IRIX. This patch rips all code related to this out and pushes useage of the Linux filldir callback into the lowlevel directory code. This does not make the code any less portable because filldir can be used to create dirents of all possible variations (including the IRIX ones as proved by the IRIX binary emulation code under arch/mips/). This patch get rid of an unessecary copy in the readdir path, about 400 lines of code and one of the last two users of the uio structure. This version is updated to deal with dmapi aswell which greatly simplifies the get_dirattrs code. The dmapi part has been tested using the get_dirattrs tools from the xfstest dmapi suite1 with various small and large directories. SGI-PV: 968563 SGI-Modid: xfs-linux-melb:xfs-kern:29478a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: David Chinner <dgc@sgi.com> Signed-off-by: Tim Shimmin <tes@sgi.com>
103 lines
3.4 KiB
C
103 lines
3.4 KiB
C
/*
|
|
* Copyright (c) 2000-2001,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_DIR2_H__
|
|
#define __XFS_DIR2_H__
|
|
|
|
struct uio;
|
|
struct xfs_dabuf;
|
|
struct xfs_da_args;
|
|
struct xfs_dir2_put_args;
|
|
struct xfs_bmap_free;
|
|
struct xfs_inode;
|
|
struct xfs_mount;
|
|
struct xfs_trans;
|
|
|
|
/*
|
|
* Directory version 2.
|
|
* There are 4 possible formats:
|
|
* shortform
|
|
* single block - data with embedded leaf at the end
|
|
* multiple data blocks, single leaf+freeindex block
|
|
* data blocks, node&leaf blocks (btree), freeindex blocks
|
|
*
|
|
* The shortform format is in xfs_dir2_sf.h.
|
|
* The single block format is in xfs_dir2_block.h.
|
|
* The data block format is in xfs_dir2_data.h.
|
|
* The leaf and freeindex block formats are in xfs_dir2_leaf.h.
|
|
* Node blocks are the same as the other version, in xfs_da_btree.h.
|
|
*/
|
|
|
|
/*
|
|
* Byte offset in data block and shortform entry.
|
|
*/
|
|
typedef __uint16_t xfs_dir2_data_off_t;
|
|
#define NULLDATAOFF 0xffffU
|
|
typedef uint xfs_dir2_data_aoff_t; /* argument form */
|
|
|
|
/*
|
|
* Directory block number (logical dirblk in file)
|
|
*/
|
|
typedef __uint32_t xfs_dir2_db_t;
|
|
|
|
/*
|
|
* Byte offset in a directory.
|
|
*/
|
|
typedef xfs_off_t xfs_dir2_off_t;
|
|
|
|
/*
|
|
* Generic directory interface routines
|
|
*/
|
|
extern void xfs_dir_startup(void);
|
|
extern void xfs_dir_mount(struct xfs_mount *mp);
|
|
extern int xfs_dir_isempty(struct xfs_inode *dp);
|
|
extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp,
|
|
struct xfs_inode *pdp);
|
|
extern int xfs_dir_createname(struct xfs_trans *tp, struct xfs_inode *dp,
|
|
char *name, int namelen, xfs_ino_t inum,
|
|
xfs_fsblock_t *first,
|
|
struct xfs_bmap_free *flist, xfs_extlen_t tot);
|
|
extern int xfs_dir_lookup(struct xfs_trans *tp, struct xfs_inode *dp,
|
|
char *name, int namelen, xfs_ino_t *inum);
|
|
extern int xfs_dir_removename(struct xfs_trans *tp, struct xfs_inode *dp,
|
|
char *name, int namelen, xfs_ino_t ino,
|
|
xfs_fsblock_t *first,
|
|
struct xfs_bmap_free *flist, xfs_extlen_t tot);
|
|
extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp,
|
|
char *name, int namelen, xfs_ino_t inum,
|
|
xfs_fsblock_t *first,
|
|
struct xfs_bmap_free *flist, xfs_extlen_t tot);
|
|
extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp,
|
|
char *name, int namelen);
|
|
extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino);
|
|
extern int xfs_readdir(bhv_desc_t *dir_bdp, void *dirent, size_t bufsize,
|
|
xfs_off_t *offset, filldir_t filldir);
|
|
|
|
/*
|
|
* Utility routines for v2 directories.
|
|
*/
|
|
extern int xfs_dir2_grow_inode(struct xfs_da_args *args, int space,
|
|
xfs_dir2_db_t *dbp);
|
|
extern int xfs_dir2_isblock(struct xfs_trans *tp, struct xfs_inode *dp,
|
|
int *vp);
|
|
extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp,
|
|
int *vp);
|
|
extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db,
|
|
struct xfs_dabuf *bp);
|
|
|
|
#endif /* __XFS_DIR2_H__ */
|