diff options
Diffstat (limited to 'fs/nfs/write.c')
| -rw-r--r-- | fs/nfs/write.c | 19 | 
1 files changed, 13 insertions, 6 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index f83b02dc9166..af3af685a9e3 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -575,7 +575,7 @@ static int nfs_do_writepage(struct page *page, struct writeback_control *wbc, st  	int ret;  	nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGE); -	nfs_add_stats(inode, NFSIOS_WRITEPAGES, 1); +	nfs_inc_stats(inode, NFSIOS_WRITEPAGES);  	nfs_pageio_cond_complete(pgio, page_file_index(page));  	ret = nfs_page_async_flush(pgio, page, wbc->sync_mode == WB_SYNC_NONE); @@ -670,7 +670,8 @@ static void nfs_inode_add_request(struct inode *inode, struct nfs_page *req)  	nfs_lock_request(req);  	spin_lock(&inode->i_lock); -	if (!nfsi->npages && NFS_PROTO(inode)->have_delegation(inode, FMODE_WRITE)) +	if (!nfsi->nrequests && +	    NFS_PROTO(inode)->have_delegation(inode, FMODE_WRITE))  		inode->i_version++;  	/*  	 * Swap-space should not get truncated. Hence no need to plug the race @@ -681,9 +682,11 @@ static void nfs_inode_add_request(struct inode *inode, struct nfs_page *req)  		SetPagePrivate(req->wb_page);  		set_page_private(req->wb_page, (unsigned long)req);  	} -	nfsi->npages++; +	nfsi->nrequests++;  	/* this a head request for a page group - mark it as having an -	 * extra reference so sub groups can follow suit */ +	 * extra reference so sub groups can follow suit. +	 * This flag also informs pgio layer when to bump nrequests when +	 * adding subrequests. */  	WARN_ON(test_and_set_bit(PG_INODE_REF, &req->wb_flags));  	kref_get(&req->wb_kref);  	spin_unlock(&inode->i_lock); @@ -709,7 +712,11 @@ static void nfs_inode_remove_request(struct nfs_page *req)  			wake_up_page(head->wb_page, PG_private);  			clear_bit(PG_MAPPED, &head->wb_flags);  		} -		nfsi->npages--; +		nfsi->nrequests--; +		spin_unlock(&inode->i_lock); +	} else { +		spin_lock(&inode->i_lock); +		nfsi->nrequests--;  		spin_unlock(&inode->i_lock);  	} @@ -1735,7 +1742,7 @@ static int nfs_commit_unstable_pages(struct inode *inode, struct writeback_contr  		/* Don't commit yet if this is a non-blocking flush and there  		 * are a lot of outstanding writes for this mapping.  		 */ -		if (nfsi->commit_info.ncommit <= (nfsi->npages >> 1)) +		if (nfsi->commit_info.ncommit <= (nfsi->nrequests >> 1))  			goto out_mark_dirty;  		/* don't wait for the COMMIT response */  |