diff options
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_lrw.c')
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.c | 51 | 
1 files changed, 27 insertions, 24 deletions
| diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index e0ab45fbfeb..0169360475c 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c @@ -83,7 +83,7 @@ xfs_rw_enter_trace(  		(void *)((unsigned long)ioflags),  		(void *)((unsigned long)((io->io_new_size >> 32) & 0xffffffff)),  		(void *)((unsigned long)(io->io_new_size & 0xffffffff)), -		(void *)NULL, +		(void *)((unsigned long)current_pid()),  		(void *)NULL,  		(void *)NULL,  		(void *)NULL, @@ -113,7 +113,7 @@ xfs_inval_cached_trace(  		(void *)((unsigned long)(first & 0xffffffff)),  		(void *)((unsigned long)((last >> 32) & 0xffffffff)),  		(void *)((unsigned long)(last & 0xffffffff)), -		(void *)NULL, +		(void *)((unsigned long)current_pid()),  		(void *)NULL,  		(void *)NULL,  		(void *)NULL, @@ -249,9 +249,8 @@ xfs_read(  	if (n < size)  		size = n; -	if (XFS_FORCED_SHUTDOWN(mp)) { +	if (XFS_FORCED_SHUTDOWN(mp))  		return -EIO; -	}  	if (unlikely(ioflags & IO_ISDIRECT))  		mutex_lock(&inode->i_mutex); @@ -267,10 +266,14 @@ xfs_read(  					dmflags, &locktype);  		if (ret) {  			xfs_iunlock(ip, XFS_IOLOCK_SHARED); -			goto unlock_isem; +			goto unlock_mutex;  		}  	} +	if (unlikely((ioflags & IO_ISDIRECT) && VN_CACHED(vp))) +		VOP_FLUSHINVAL_PAGES(vp, ctooff(offtoct(*offset)), +						-1, FI_REMAPF_LOCKED); +  	xfs_rw_enter_trace(XFS_READ_ENTER, &ip->i_iocore,  				(void *)iovp, segs, *offset, ioflags);  	ret = __generic_file_aio_read(iocb, iovp, segs, offset); @@ -281,7 +284,7 @@ xfs_read(  	xfs_iunlock(ip, XFS_IOLOCK_SHARED); -unlock_isem: +unlock_mutex:  	if (unlikely(ioflags & IO_ISDIRECT))  		mutex_unlock(&inode->i_mutex);  	return ret; @@ -432,7 +435,7 @@ xfs_zero_eof(  	xfs_fsize_t	isize,		/* current inode size */  	xfs_fsize_t	end_size)	/* terminal inode size */  { -	struct inode	*ip = LINVFS_GET_IP(vp); +	struct inode	*ip = vn_to_inode(vp);  	xfs_fileoff_t	start_zero_fsb;  	xfs_fileoff_t	end_zero_fsb;  	xfs_fileoff_t	zero_count_fsb; @@ -573,7 +576,7 @@ xfs_write(  	vrwlock_t		locktype;  	size_t			ocount = 0, count;  	loff_t			pos; -	int			need_isem = 1, need_flush = 0; +	int			need_i_mutex = 1, need_flush = 0;  	XFS_STATS_INC(xs_write_calls); @@ -622,14 +625,14 @@ xfs_write(  			return XFS_ERROR(-EINVAL);  		if (!VN_CACHED(vp) && pos < i_size_read(inode)) -			need_isem = 0; +			need_i_mutex = 0;  		if (VN_CACHED(vp))  			need_flush = 1;  	}  relock: -	if (need_isem) { +	if (need_i_mutex) {  		iolock = XFS_IOLOCK_EXCL;  		locktype = VRWLOCK_WRITE; @@ -651,7 +654,7 @@ start:  					S_ISBLK(inode->i_mode));  	if (error) {  		xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); -		goto out_unlock_isem; +		goto out_unlock_mutex;  	}  	new_size = pos + count; @@ -663,7 +666,7 @@ start:  		loff_t		savedsize = pos;  		int		dmflags = FILP_DELAY_FLAG(file); -		if (need_isem) +		if (need_i_mutex)  			dmflags |= DM_FLAGS_IMUX;  		xfs_iunlock(xip, XFS_ILOCK_EXCL); @@ -672,7 +675,7 @@ start:  				      dmflags, &locktype);  		if (error) {  			xfs_iunlock(xip, iolock); -			goto out_unlock_isem; +			goto out_unlock_mutex;  		}  		xfs_ilock(xip, XFS_ILOCK_EXCL);  		eventsent = 1; @@ -710,7 +713,7 @@ start:  					isize, pos + count);  		if (error) {  			xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); -			goto out_unlock_isem; +			goto out_unlock_mutex;  		}  	}  	xfs_iunlock(xip, XFS_ILOCK_EXCL); @@ -731,7 +734,7 @@ start:  			error = -remove_suid(file->f_dentry);  		if (unlikely(error)) {  			xfs_iunlock(xip, iolock); -			goto out_unlock_isem; +			goto out_unlock_mutex;  		}  	} @@ -747,14 +750,14 @@ retry:  					-1, FI_REMAPF_LOCKED);  		} -		if (need_isem) { +		if (need_i_mutex) {  			/* demote the lock now the cached pages are gone */  			XFS_ILOCK_DEMOTE(mp, io, XFS_IOLOCK_EXCL);  			mutex_unlock(&inode->i_mutex);  			iolock = XFS_IOLOCK_SHARED;  			locktype = VRWLOCK_WRITE_DIRECT; -			need_isem = 0; +			need_i_mutex = 0;  		}   		xfs_rw_enter_trace(XFS_DIOWR_ENTER, io, (void *)iovp, segs, @@ -772,7 +775,7 @@ retry:  			pos += ret;  			count -= ret; -			need_isem = 1; +			need_i_mutex = 1;  			ioflags &= ~IO_ISDIRECT;  			xfs_iunlock(xip, iolock);  			goto relock; @@ -794,14 +797,14 @@ retry:  	    !(ioflags & IO_INVIS)) {  		xfs_rwunlock(bdp, locktype); -		if (need_isem) +		if (need_i_mutex)  			mutex_unlock(&inode->i_mutex);  		error = XFS_SEND_NAMESP(xip->i_mount, DM_EVENT_NOSPACE, vp,  				DM_RIGHT_NULL, vp, DM_RIGHT_NULL, NULL, NULL,  				0, 0, 0); /* Delay flag intentionally  unused */  		if (error)  			goto out_nounlocks; -		if (need_isem) +		if (need_i_mutex)  			mutex_lock(&inode->i_mutex);  		xfs_rwlock(bdp, locktype);  		pos = xip->i_d.di_size; @@ -905,9 +908,9 @@ retry:  			if (error)  				goto out_unlock_internal;  		} -	 +  		xfs_rwunlock(bdp, locktype); -		if (need_isem) +		if (need_i_mutex)  			mutex_unlock(&inode->i_mutex);  		error = sync_page_range(inode, mapping, pos, ret); @@ -918,8 +921,8 @@ retry:   out_unlock_internal:  	xfs_rwunlock(bdp, locktype); - out_unlock_isem: -	if (need_isem) + out_unlock_mutex: +	if (need_i_mutex)  		mutex_unlock(&inode->i_mutex);   out_nounlocks:  	return -error; | 
