File: [Development] / xfs-linux-nodel / xfs_rw.h (download)
Revision 1.14, Wed Feb 22 20:47:44 1995 UTC (22 years, 7 months ago) by doucette
Branch: MAIN
Changes since 1.13: +1 -1
lines
Fix bugs 263156, 263632 - enable 64-bit file sizes in 64-bit kernels.
|
#ifndef _XFS_RW_H
#define _XFS_RW_H
/*
* This is a structure used to hold the local variables used
* in xfs_strat_write(). We dynamically allocate this to reduce
* the amount of stack space we use. This is here in the public
* header file since it is exported to xfs_init() so it can
* initialize the zone allocator.
*/
typedef struct xfs_strat_write_locals {
xfs_fileoff_t offset_fsb;
xfs_fileoff_t map_start_fsb;
xfs_fileoff_t imap_offset;
xfs_fsblock_t first_block;
xfs_fsize_t real_size;
xfs_filblks_t count_fsb;
xfs_extlen_t imap_blocks;
off_t last_rbp_offset;
xfs_extlen_t last_rbp_bcount;
daddr_t last_rbp_blkno;
int rbp_count;
int x;
caddr_t datap;
buf_t *rbp;
xfs_mount_t *mp;
xfs_inode_t *ip;
xfs_trans_t *tp;
int error;
xfs_bmap_free_t free_list;
xfs_bmbt_irec_t *imapp;
int rbp_offset;
int rbp_len;
int set_lead;
int s;
int loops;
int imap_index;
int nimaps;
xfs_bmbt_irec_t imap[XFS_BMAP_MAX_NMAP];
} xfs_strat_write_locals_t;
/*
* This structure is used to communicate which extents of a file
* were holes when a write started from xfs_write_file() to
* xfs_strat_read(). This is necessary so that we can know which
* blocks need to be zeroed when they are read in in xfs_strat_read()
* if they weren\'t allocated when the buffer given to xfs_strat_read()
* was mapped.
*
* We keep a list of these attached to the inode. The list is
* protected by the inode lock and the fact that the io lock is
* held exclusively by writers.
*/
typedef struct xfs_gap {
struct xfs_gap *xg_next;
xfs_fileoff_t xg_offset_fsb;
xfs_extlen_t xg_count_fsb;
} xfs_gap_t;
/*
* Count of bmaps allocated in one call to the xfs_bmap_zone
* allocator.
*/
#define XFS_ZONE_NBMAPS 4
/*
* Maximum size of a buffer that we\'ll map. Making this
* too big will degrade performance due to the number of
* pages which need to be gathered. Making it too small
* will prevent us from doing large I/O\'s to hardware that
* needs it.
*
* This is currently set to 512 KB.
*/
#define XFS_MAX_BMAP_LEN_BB 1024
#define XFS_MAX_BMAP_LEN_BYTES 524288
/*
* Convert the given file system block to a disk block.
* We have to treat it differently based on whether the
* file is a real time file or not, because the bmap code
* does.
*/
#define XFS_FSB_TO_DB(mp, ip, fsb) \
(((ip)->i_d.di_flags & XFS_DIFLAG_REALTIME) ? \
XFS_FSB_TO_BB((mp), (fsb)) : XFS_FSB_TO_DADDR((mp), (fsb)))
/*
* Defines for the trace mechanisms in xfs_rw.c.
*/
#define XFS_RW_KTRACE_SIZE 64
#define XFS_STRAT_KTRACE_SIZE 64
#define XFS_STRAT_GTRACE_SIZE 512
#define XFS_READ_ENTER 1
#define XFS_WRITE_ENTER 2
#define XFS_IOMAP_READ_ENTER 3
#define XFS_IOMAP_WRITE_ENTER 4
#define XFS_IOMAP_READ_MAP 5
#define XFS_IOMAP_WRITE_MAP 6
#define XFS_IOMAP_WRITE_NOSPACE 7
#define XFS_STRAT_ENTER 1
#define XFS_STRAT_FAST 2
#define XFS_STRAT_SUB 3
/*
* Prototypes for functions in xfs_rw.c.
*/
int
xfs_read(vnode_t *vp,
uio_t *uiop,
int ioflag,
cred_t *credp);
int
xfs_write(vnode_t *vp,
uio_t *uiop,
int ioflag,
cred_t *credp);
void
xfs_strategy(vnode_t *vp,
buf_t *bp);
int
xfs_bmap(vnode_t *vp,
off_t offset,
ssize_t count,
int flags,
cred_t *credp,
struct bmapval *bmapp,
int *nbmaps);
void
xfs_zero_eof(xfs_inode_t *ip,
off_t offset,
xfs_fsize_t isize,
cred_t *credp);
#endif /* _XFS_RW_H */