diff options
| author | Christoph Hellwig <hch@infradead.org> | 2007-08-29 11:46:28 +1000 | 
|---|---|---|
| committer | Tim Shimmin <tes@chook.melbourne.sgi.com> | 2007-10-16 11:38:56 +1000 | 
| commit | b677c210cec0d6755335ffc01691982c417dd39e (patch) | |
| tree | 9a61fdd81e48aac948346a096bed9c72e5f34114 | |
| parent | 09262b4339de5417a10803fbfac277eebb38ca5a (diff) | |
| download | olio-linux-3.10-b677c210cec0d6755335ffc01691982c417dd39e.tar.xz olio-linux-3.10-b677c210cec0d6755335ffc01691982c417dd39e.zip  | |
[XFS] move v_iocount from bhv_vnode to xfs_inode
struct bhv_vnode is on it's way out, so move the I/O count to the XFS
inode.
SGI-PV: 969608
SGI-Modid: xfs-linux-melb:xfs-kern:29497a
Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: Tim Shimmin <tes@sgi.com>
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.c | 23 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.h | 2 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.c | 29 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.h | 12 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode.c | 3 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode.h | 1 | ||||
| -rw-r--r-- | fs/xfs/xfs_vfsops.c | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_vnodeops.c | 6 | 
8 files changed, 44 insertions, 34 deletions
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 22a40bd0cce..1dd198ec289 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c @@ -140,9 +140,11 @@ xfs_destroy_ioend(  		next = bh->b_private;  		bh->b_end_io(bh, !ioend->io_error);  	} -	if (unlikely(ioend->io_error)) -		vn_ioerror(ioend->io_vnode, ioend->io_error, __FILE__,__LINE__); -	vn_iowake(ioend->io_vnode); +	if (unlikely(ioend->io_error)) { +		vn_ioerror(XFS_I(ioend->io_inode), ioend->io_error, +				__FILE__,__LINE__); +	} +	vn_iowake(XFS_I(ioend->io_inode));  	mempool_free(ioend, xfs_ioend_pool);  } @@ -157,14 +159,10 @@ STATIC void  xfs_setfilesize(  	xfs_ioend_t		*ioend)  { -	xfs_inode_t		*ip; +	xfs_inode_t		*ip = XFS_I(ioend->io_inode);  	xfs_fsize_t		isize;  	xfs_fsize_t		bsize; -	ip = xfs_vtoi(ioend->io_vnode); -	if (!ip) -		return; -  	ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFREG);  	ASSERT(ioend->io_type != IOMAP_READ); @@ -228,12 +226,11 @@ xfs_end_bio_unwritten(  {  	xfs_ioend_t		*ioend =  		container_of(work, xfs_ioend_t, io_work); -	bhv_vnode_t		*vp = ioend->io_vnode;  	xfs_off_t		offset = ioend->io_offset;  	size_t			size = ioend->io_size;  	if (likely(!ioend->io_error)) { -		xfs_bmap(xfs_vtoi(vp), offset, size, +		xfs_bmap(XFS_I(ioend->io_inode), offset, size,  				BMAPI_UNWRITTEN, NULL, NULL);  		xfs_setfilesize(ioend);  	} @@ -277,10 +274,10 @@ xfs_alloc_ioend(  	ioend->io_error = 0;  	ioend->io_list = NULL;  	ioend->io_type = type; -	ioend->io_vnode = vn_from_inode(inode); +	ioend->io_inode = inode;  	ioend->io_buffer_head = NULL;  	ioend->io_buffer_tail = NULL; -	atomic_inc(&ioend->io_vnode->v_iocount); +	atomic_inc(&XFS_I(ioend->io_inode)->i_iocount);  	ioend->io_offset = 0;  	ioend->io_size = 0; @@ -506,7 +503,7 @@ xfs_cancel_ioend(  			unlock_buffer(bh);  		} while ((bh = next_bh) != NULL); -		vn_iowake(ioend->io_vnode); +		vn_iowake(XFS_I(ioend->io_inode));  		mempool_free(ioend, xfs_ioend_pool);  	} while ((ioend = next) != NULL);  } diff --git a/fs/xfs/linux-2.6/xfs_aops.h b/fs/xfs/linux-2.6/xfs_aops.h index 2244e516b66..3ba0631a381 100644 --- a/fs/xfs/linux-2.6/xfs_aops.h +++ b/fs/xfs/linux-2.6/xfs_aops.h @@ -32,7 +32,7 @@ typedef struct xfs_ioend {  	unsigned int		io_type;	/* delalloc / unwritten */  	int			io_error;	/* I/O error code */  	atomic_t		io_remaining;	/* hold count */ -	struct bhv_vnode	*io_vnode;	/* file being written to */ +	struct inode		*io_inode;	/* file being written to */  	struct buffer_head	*io_buffer_head;/* buffer linked list head */  	struct buffer_head	*io_buffer_tail;/* buffer linked list tail */  	size_t			io_size;	/* size of the extent */ diff --git a/fs/xfs/linux-2.6/xfs_vnode.c b/fs/xfs/linux-2.6/xfs_vnode.c index e6c559aee44..bde8d2e7f55 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.c +++ b/fs/xfs/linux-2.6/xfs_vnode.c @@ -20,6 +20,17 @@  #include "xfs_bmap_btree.h"  #include "xfs_inode.h" +/* + * And this gunk is needed for xfs_mount.h" + */ +#include "xfs_log.h" +#include "xfs_trans.h" +#include "xfs_sb.h" +#include "xfs_dmapi.h" +#include "xfs_inum.h" +#include "xfs_ag.h" +#include "xfs_mount.h" +  uint64_t vn_generation;		/* vnode generation number */  DEFINE_SPINLOCK(vnumber_lock); @@ -42,19 +53,19 @@ vn_init(void)  void  vn_iowait( -	bhv_vnode_t	*vp) +	xfs_inode_t	*ip)  { -	wait_queue_head_t *wq = vptosync(vp); +	wait_queue_head_t *wq = vptosync(ip); -	wait_event(*wq, (atomic_read(&vp->v_iocount) == 0)); +	wait_event(*wq, (atomic_read(&ip->i_iocount) == 0));  }  void  vn_iowake( -	bhv_vnode_t	*vp) +	xfs_inode_t	*ip)  { -	if (atomic_dec_and_test(&vp->v_iocount)) -		wake_up(vptosync(vp)); +	if (atomic_dec_and_test(&ip->i_iocount)) +		wake_up(vptosync(ip));  }  /* @@ -64,12 +75,12 @@ vn_iowake(   */  void  vn_ioerror( -	bhv_vnode_t	*vp, +	xfs_inode_t	*ip,  	int		error,  	char		*f,  	int		l)  { -	bhv_vfs_t	*vfsp = vfs_from_sb(vp->v_inode.i_sb); +	bhv_vfs_t	*vfsp = XFS_MTOVFS(ip->i_mount);  	if (unlikely(error == -ENODEV))  		bhv_vfs_force_shutdown(vfsp, SHUTDOWN_DEVICE_REQ, f, l); @@ -92,8 +103,6 @@ vn_initialize(  	ASSERT(VN_CACHED(vp) == 0); -	atomic_set(&vp->v_iocount, 0); -  #ifdef	XFS_VNODE_TRACE  	vp->v_trace = ktrace_alloc(VNODE_TRACE_SIZE, KM_SLEEP);  #endif	/* XFS_VNODE_TRACE */ diff --git a/fs/xfs/linux-2.6/xfs_vnode.h b/fs/xfs/linux-2.6/xfs_vnode.h index c8af208a73d..321346d9526 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.h +++ b/fs/xfs/linux-2.6/xfs_vnode.h @@ -29,7 +29,6 @@ typedef __u64		bhv_vnumber_t;  typedef struct bhv_vnode {  	bhv_vnumber_t	v_number;		/* in-core vnode number */ -	atomic_t	v_iocount;		/* outstanding I/O count */  #ifdef XFS_VNODE_TRACE  	struct ktrace	*v_trace;		/* trace header structure    */  #endif @@ -202,10 +201,13 @@ extern int	vn_revalidate(struct bhv_vnode *);  extern int	__vn_revalidate(struct bhv_vnode *, bhv_vattr_t *);  extern void	vn_revalidate_core(struct bhv_vnode *, bhv_vattr_t *); -extern void	vn_iowait(struct bhv_vnode *vp); -extern void	vn_iowake(struct bhv_vnode *vp); - -extern void	vn_ioerror(struct bhv_vnode *vp, int error, char *f, int l); +/* + * Yeah, these don't take vnode anymore at all, all this should be + * cleaned up at some point. + */ +extern void	vn_iowait(struct xfs_inode *ip); +extern void	vn_iowake(struct xfs_inode *ip); +extern void	vn_ioerror(struct xfs_inode *ip, int error, char *f, int l);  static inline int vn_count(struct bhv_vnode *vp)  { diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index c07553bbcdb..0349e714dc3 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -864,6 +864,7 @@ xfs_iread(  	ip = kmem_zone_zalloc(xfs_inode_zone, KM_SLEEP);  	ip->i_ino = ino;  	ip->i_mount = mp; +	atomic_set(&ip->i_iocount, 0);  	spin_lock_init(&ip->i_flags_lock);  	/* @@ -1455,7 +1456,7 @@ xfs_itruncate_start(  	mp = ip->i_mount;  	vp = XFS_ITOV(ip); -	vn_iowait(vp);  /* wait for the completion of any pending DIOs */ +	vn_iowait(ip);  /* wait for the completion of any pending DIOs */  	/*  	 * Call toss_pages or flushinval_pages to get rid of pages diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index ea1e24effd4..c8bb1a818a5 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -299,6 +299,7 @@ typedef struct xfs_inode {  	struct hlist_node	i_cnode;	/* cluster link node */  	xfs_fsize_t		i_size;		/* in-memory size */ +	atomic_t		i_iocount;	/* outstanding I/O count */  	/* Trace buffers per inode. */  #ifdef XFS_BMAP_TRACE  	struct ktrace		*i_xtrace;	/* inode extent list trace */ diff --git a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c index a9cebcb0b33..3fe64a3a77a 100644 --- a/fs/xfs/xfs_vfsops.c +++ b/fs/xfs/xfs_vfsops.c @@ -1209,7 +1209,7 @@ xfs_sync_inodes(  			 * place after this point  			 */  			if (flags & SYNC_IOWAIT) -				vn_iowait(vp); +				vn_iowait(ip);  			xfs_ilock(ip, XFS_ILOCK_SHARED);  		} diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 8ed7af3c5d6..e7ef78fb4da 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -598,7 +598,7 @@ xfs_setattr(  		}  		/* wait for all I/O to complete */ -		vn_iowait(vp); +		vn_iowait(ip);  		if (!code)  			code = xfs_itruncate_data(ip, vap->va_size); @@ -3683,7 +3683,7 @@ xfs_reclaim(  		return 0;  	} -	vn_iowait(vp); +	vn_iowait(ip);  	ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); @@ -4189,7 +4189,7 @@ xfs_free_file_space(  		need_iolock = 0;  	if (need_iolock) {  		xfs_ilock(ip, XFS_IOLOCK_EXCL); -		vn_iowait(vp);	/* wait for the completion of any pending DIOs */ +		vn_iowait(ip);	/* wait for the completion of any pending DIOs */  	}  	rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, NBPP);  |