diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-05 13:25:45 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-05 13:25:45 -0800 | 
| commit | cc7889ff5ee7a1c1a2b5073c53db5ad9b76f14e2 (patch) | |
| tree | 647e11872abe7c20c0145de9adbb60f15085dad0 /fs/nfs/inode.c | |
| parent | b13d3c6e8ab6ac53e8c1858a9c837cb6ba3bbef0 (diff) | |
| parent | 3fa04ecd72780da31ba8b329e148179bc24a9c7d (diff) | |
Merge branch 'nfs-for-2.6.34' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
* 'nfs-for-2.6.34' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6: (44 commits)
  NFS: Remove requirement for inode->i_mutex from nfs_invalidate_mapping
  NFS: Clean up nfs_sync_mapping
  NFS: Simplify nfs_wb_page()
  NFS: Replace __nfs_write_mapping with sync_inode()
  NFS: Simplify nfs_wb_page_cancel()
  NFS: Ensure inode is always marked I_DIRTY_DATASYNC, if it has unstable pages
  NFS: Run COMMIT as an asynchronous RPC call when wbc->for_background is set
  NFS: Reduce the number of unnecessary COMMIT calls
  NFS: Add a count of the number of unstable writes carried by an inode
  NFS: Cleanup - move nfs_write_inode() into fs/nfs/write.c
  nfs41 fix NFS4ERR_CLID_INUSE for exchange id
  NFS: Fix an allocation-under-spinlock bug
  SUNRPC: Handle EINVAL error returns from the TCP connect operation
  NFSv4.1: Various fixes to the sequence flag error handling
  nfs4: renewd renew operations should take/put a client reference
  nfs41: renewd sequence operations should take/put client reference
  nfs: prevent backlogging of renewd requests
  nfs: kill renewd before clearing client minor version
  NFS: Make close(2) asynchronous when closing NFS O_DIRECT files
  NFS: Improve NFS iostat byte count accuracy for writes
  ...
Diffstat (limited to 'fs/nfs/inode.c')
| -rw-r--r-- | fs/nfs/inode.c | 90 | 
1 files changed, 13 insertions, 77 deletions
| diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 7f9ecc46f3fb..657201acda84 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -97,18 +97,6 @@ u64 nfs_compat_user_ino64(u64 fileid)  	return ino;  } -int nfs_write_inode(struct inode *inode, struct writeback_control *wbc) -{ -	int ret; - -	ret = nfs_commit_inode(inode, -			wbc->sync_mode == WB_SYNC_ALL ? FLUSH_SYNC : 0); -	if (ret >= 0) -		return 0; -	__mark_inode_dirty(inode, I_DIRTY_DATASYNC); -	return ret; -} -  void nfs_clear_inode(struct inode *inode)  {  	/* @@ -126,16 +114,12 @@ void nfs_clear_inode(struct inode *inode)   */  int nfs_sync_mapping(struct address_space *mapping)  { -	int ret; +	int ret = 0; -	if (mapping->nrpages == 0) -		return 0; -	unmap_mapping_range(mapping, 0, 0, 0); -	ret = filemap_write_and_wait(mapping); -	if (ret != 0) -		goto out; -	ret = nfs_wb_all(mapping->host); -out: +	if (mapping->nrpages != 0) { +		unmap_mapping_range(mapping, 0, 0, 0); +		ret = nfs_wb_all(mapping->host); +	}  	return ret;  } @@ -507,17 +491,11 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)  	int need_atime = NFS_I(inode)->cache_validity & NFS_INO_INVALID_ATIME;  	int err; -	/* -	 * Flush out writes to the server in order to update c/mtime. -	 * -	 * Hold the i_mutex to suspend application writes temporarily; -	 * this prevents long-running writing applications from blocking -	 * nfs_wb_nocommit. -	 */ +	/* Flush out writes to the server in order to update c/mtime.  */  	if (S_ISREG(inode->i_mode)) { -		mutex_lock(&inode->i_mutex); -		nfs_wb_nocommit(inode); -		mutex_unlock(&inode->i_mutex); +		err = filemap_write_and_wait(inode->i_mapping); +		if (err) +			goto out;  	}  	/* @@ -541,6 +519,7 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)  		generic_fillattr(inode, stat);  		stat->ino = nfs_compat_user_ino64(NFS_FILEID(inode));  	} +out:  	return err;  } @@ -616,11 +595,6 @@ void put_nfs_open_context(struct nfs_open_context *ctx)  	__put_nfs_open_context(ctx, 0);  } -static void put_nfs_open_context_sync(struct nfs_open_context *ctx) -{ -	__put_nfs_open_context(ctx, 1); -} -  /*   * Ensure that mmap has a recent RPC credential for use when writing out   * shared pages @@ -667,7 +641,7 @@ static void nfs_file_clear_open_context(struct file *filp)  		spin_lock(&inode->i_lock);  		list_move_tail(&ctx->list, &NFS_I(inode)->open_files);  		spin_unlock(&inode->i_lock); -		put_nfs_open_context_sync(ctx); +		__put_nfs_open_context(ctx, filp->f_flags & O_DIRECT ? 0 : 1);  	}  } @@ -775,7 +749,7 @@ int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)  	return __nfs_revalidate_inode(server, inode);  } -static int nfs_invalidate_mapping_nolock(struct inode *inode, struct address_space *mapping) +static int nfs_invalidate_mapping(struct inode *inode, struct address_space *mapping)  {  	struct nfs_inode *nfsi = NFS_I(inode); @@ -796,49 +770,10 @@ static int nfs_invalidate_mapping_nolock(struct inode *inode, struct address_spa  	return 0;  } -static int nfs_invalidate_mapping(struct inode *inode, struct address_space *mapping) -{ -	int ret = 0; - -	mutex_lock(&inode->i_mutex); -	if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_DATA) { -		ret = nfs_sync_mapping(mapping); -		if (ret == 0) -			ret = nfs_invalidate_mapping_nolock(inode, mapping); -	} -	mutex_unlock(&inode->i_mutex); -	return ret; -} - -/** - * nfs_revalidate_mapping_nolock - Revalidate the pagecache - * @inode - pointer to host inode - * @mapping - pointer to mapping - */ -int nfs_revalidate_mapping_nolock(struct inode *inode, struct address_space *mapping) -{ -	struct nfs_inode *nfsi = NFS_I(inode); -	int ret = 0; - -	if ((nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE) -			|| nfs_attribute_timeout(inode) || NFS_STALE(inode)) { -		ret = __nfs_revalidate_inode(NFS_SERVER(inode), inode); -		if (ret < 0) -			goto out; -	} -	if (nfsi->cache_validity & NFS_INO_INVALID_DATA) -		ret = nfs_invalidate_mapping_nolock(inode, mapping); -out: -	return ret; -} -  /**   * nfs_revalidate_mapping - Revalidate the pagecache   * @inode - pointer to host inode   * @mapping - pointer to mapping - * - * This version of the function will take the inode->i_mutex and attempt to - * flush out all dirty data if it needs to invalidate the page cache.   */  int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping)  { @@ -1416,6 +1351,7 @@ static void init_once(void *foo)  	INIT_LIST_HEAD(&nfsi->access_cache_inode_lru);  	INIT_RADIX_TREE(&nfsi->nfs_page_tree, GFP_ATOMIC);  	nfsi->npages = 0; +	nfsi->ncommit = 0;  	atomic_set(&nfsi->silly_count, 1);  	INIT_HLIST_HEAD(&nfsi->silly_list);  	init_waitqueue_head(&nfsi->waitqueue); | 
