[BACK]Return to xfs_rw.h CVS log [TXT][DIR] Up to [Development] / xfs-linux-nodel

File: [Development] / xfs-linux-nodel / xfs_rw.h (download)

Revision 1.29, Sat Jan 25 02:55:42 1997 UTC (20 years, 8 months ago) by sup
Branch: MAIN
Changes since 1.28: +51 -2 lines

First cut of XFS I/O error handling changes.

#ifndef	_XFS_RW_H
#define	_XFS_RW_H

#ident "$Revision: 1.28 $"

struct bhv_desc;
struct bdevsw;
struct bmapval;
struct buf;
struct cred;
struct flid;
struct uio;
struct vnode;
struct xfs_inode;
struct xfs_mount;
struct xfs_trans;
struct pm;

/*
 * 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;

/*
 * Maximum count of bmaps used by read and write paths.
 */
#define	XFS_MAX_RW_NBMAPS	4

/*
 * Counts of readahead buffers to use based on physical memory size.
 * None of these should be more than XFS_MAX_RW_NBMAPS.
 */
#define	XFS_RW_NREADAHEAD_16MB	2
#define	XFS_RW_NREADAHEAD_32MB	3
#define	XFS_RW_NREADAHEAD_K32	4
#define	XFS_RW_NREADAHEAD_K64	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.
 */
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_FSB_TO_DB)
daddr_t xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb);
#define	XFS_FSB_TO_DB(ip,fsb)	xfs_fsb_to_db(ip,fsb)
#else
#define	XFS_FSB_TO_DB(ip,fsb) \
		(((ip)->i_d.di_flags & XFS_DIFLAG_REALTIME) ? \
		 XFS_FSB_TO_BB((ip)->i_mount, (fsb)) : \
		 XFS_FSB_TO_DADDR((ip)->i_mount, (fsb)))
#endif

#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BDWRITE)
void	xfs_bdelwri(struct xfs_mount *, struct buf *);
#define xfs_bdwrite(mp, bp)	xfs_bdelwri(mp, bp)
#else
#define	xfs_bdwrite(mp, bp) \
          ((!XFS_FORCED_SHUTDOWN(mp)) ? \
	  ((bp)->b_bdstrat = xfs_bdstrat, bdwrite(bp)) : (void) xfs_bioerror(bp))
#endif
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BAWRITE)
void	xfs_basyncwri(struct xfs_mount *, struct buf *);
#define xfs_bawrite(mp, bp)	xfs_basyncwri(mp, bp)
#else
#define	xfs_bawrite(mp, bp) \
	  ((!XFS_FORCED_SHUTDOWN(mp)) ? \
	  ((bp)->b_bdstrat = xfs_bdstrat, bawrite(bp)) : (void) xfs_bioerror(bp))

#endif

/*
 * 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_ITRUNC_START	8
#define	XFS_ITRUNC_FINISH1	9
#define	XFS_ITRUNC_FINISH2	10
#define	XFS_CTRUNC1		11
#define	XFS_CTRUNC2		12
#define	XFS_CTRUNC3		13
#define	XFS_CTRUNC4		14
#define	XFS_CTRUNC5		15
#define	XFS_CTRUNC6		16     

#define	XFS_STRAT_ENTER		1
#define	XFS_STRAT_FAST		2
#define	XFS_STRAT_SUB		3

#if defined(XFS_ALL_TRACE)
#define	XFS_RW_TRACE
#define	XFS_STRAT_TRACE
#endif

#if !defined(DEBUG) || defined(SIM)
#undef XFS_RW_TRACE
#undef XFS_STRAT_TRACE
#endif

/*
 * Prototypes for functions in xfs_rw.c.
 */
int
xfs_read(struct bhv_desc	*bdp,
	 struct uio		*uiop,
	 int			ioflag,
	 struct cred		*credp,
	 struct flid		*fl);

int
xfs_write_clear_setuid(
	struct xfs_inode	*ip);

int
xfs_write(struct bhv_desc	*bdp,
	  struct uio		*uiop,
	  int			ioflag,
	  struct cred		*credp,
	  struct flid		*fl);

int 
xfs_bwrite(
	struct xfs_mount 	*mp,
	struct buf		*bp);
int
xfsbdstrat(
	struct xfs_mount 	*mp,
	struct buf		*bp);

void
xfs_strategy(struct bhv_desc	*bdp,
	     struct buf		*bp);

int
xfs_bmap(struct bhv_desc	*bdp,
	 off_t			offset,
	 ssize_t		count,
	 int			flags,
	 struct cred		*credp,
	 struct bmapval		*bmapp,
	 int			*nbmaps);

int
xfs_zero_eof(struct xfs_inode	*ip,
	     off_t		offset,
	     xfs_fsize_t	isize,
	     struct cred	*credp,
	     struct pm		*pmp);

void
xfs_inval_cached_pages(
	struct xfs_inode	*ip,
	off_t			offset,
	off_t			len);

void
xfs_refcache_insert(
	struct xfs_inode	*ip);

void
xfs_refcache_purge_ip(
	struct xfs_inode	*ip);

void
xfs_refcache_purge_mp(
	struct xfs_mount	*mp);

void
xfs_refcache_purge_some(void);

int
xfs_bioerror(struct buf *b);

/*
 * Needed by xfs_rw.c
 */
void
xfs_rwlock(
	bhv_desc_t	*bdp,
	vrwlock_t	write_lock);

void
xfs_rwunlock(
	bhv_desc_t	*bdp,
	vrwlock_t	write_lock);

int
xfs_read_buf(
	struct xfs_mount *mp,
	dev_t		 dev,
        daddr_t 	 blkno,
        int              len,
        uint             flags,
	struct buf	 **bpp);

int
xfs_bdstrat(struct buf *bp);

void
xfs_ioerror_alert(
	char 			*func,
	struct xfs_mount	*mp,
	dev_t			dev,
	daddr_t			blkno);
	  
#endif /* _XFS_RW_H */