File: [Development] / xfs-linux / xfs_rw.h (download)
Revision 1.12, Fri Oct 7 21:54:13 1994 UTC (23 years ago) by ajs
Branch: MAIN
Changes since 1.11: +18 -0
lines
241835 Make sure that we always zero unitialized data before
making it accessible to the user. We were failing to do so
in the case where when we mapped an extent it was delalloc,
but when xfs_strat_read() got the buffer for it it had been
allocated. Thus we read it from disk but it had not yet been
initialized. Now we track where the holes are when we map
out a region in xfs_strat_write() and use that list to know
which blocks must be unitialized in xfs_strat_read().
|
#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_extlen_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
/*
* 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 */