diff options
| author | Dmitry Torokhov <dtor@insightbb.com> | 2006-11-04 22:42:39 -0500 | 
|---|---|---|
| committer | Dmitry Torokhov <dtor@insightbb.com> | 2006-11-04 22:42:39 -0500 | 
| commit | 752c58a471c108d64da1676b2925dfbd83eb177e (patch) | |
| tree | fbffa0d7c54cd812950dffc16d642c9d449f4faf /fs/nfs/inode.c | |
| parent | e52b29c2a637f6854d71a45646d7283d984a6dad (diff) | |
| parent | 10b1fbdb0a0ca91847a534ad26d0bc250c25b74f (diff) | |
Merge rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'fs/nfs/inode.c')
| -rw-r--r-- | fs/nfs/inode.c | 30 | 
1 files changed, 24 insertions, 6 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index bc9376ca86c..08cc4c5919a 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -131,6 +131,15 @@ void nfs_zap_caches(struct inode *inode)  	spin_unlock(&inode->i_lock);  } +void nfs_zap_mapping(struct inode *inode, struct address_space *mapping) +{ +	if (mapping->nrpages != 0) { +		spin_lock(&inode->i_lock); +		NFS_I(inode)->cache_validity |= NFS_INO_INVALID_DATA; +		spin_unlock(&inode->i_lock); +	} +} +  static void nfs_zap_acl_cache(struct inode *inode)  {  	void (*clear_acl_cache)(struct inode *); @@ -574,7 +583,7 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)  	nfs_inc_stats(inode, NFSIOS_INODEREVALIDATE);  	lock_kernel(); -	if (!inode || is_bad_inode(inode)) +	if (is_bad_inode(inode))   		goto out_nowait;  	if (NFS_STALE(inode))   		goto out_nowait; @@ -671,13 +680,20 @@ int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping)  	if ((nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE)  			|| nfs_attribute_timeout(inode))  		ret = __nfs_revalidate_inode(NFS_SERVER(inode), inode); +	if (ret < 0) +		goto out;  	if (nfsi->cache_validity & NFS_INO_INVALID_DATA) { -		nfs_inc_stats(inode, NFSIOS_DATAINVALIDATE); -		if (S_ISREG(inode->i_mode)) -			nfs_sync_mapping(mapping); -		invalidate_inode_pages2(mapping); - +		if (mapping->nrpages != 0) { +			if (S_ISREG(inode->i_mode)) { +				ret = nfs_sync_mapping(mapping); +				if (ret < 0) +					goto out; +			} +			ret = invalidate_inode_pages2(mapping); +			if (ret < 0) +				goto out; +		}  		spin_lock(&inode->i_lock);  		nfsi->cache_validity &= ~NFS_INO_INVALID_DATA;  		if (S_ISDIR(inode->i_mode)) { @@ -687,10 +703,12 @@ int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping)  		}  		spin_unlock(&inode->i_lock); +		nfs_inc_stats(inode, NFSIOS_DATAINVALIDATE);  		dfprintk(PAGECACHE, "NFS: (%s/%Ld) data cache invalidated\n",  				inode->i_sb->s_id,  				(long long)NFS_FILEID(inode));  	} +out:  	return ret;  }  | 
