diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /fs/nfs/pagelist.c | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'fs/nfs/pagelist.c')
| -rw-r--r-- | fs/nfs/pagelist.c | 11 | 
1 files changed, 6 insertions, 5 deletions
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c index 1da68d3b1eda..7c5718ba625e 100644 --- a/fs/nfs/pagelist.c +++ b/fs/nfs/pagelist.c @@ -77,8 +77,8 @@ EXPORT_SYMBOL_GPL(nfs_pgheader_init);  void nfs_set_pgio_error(struct nfs_pgio_header *hdr, int error, loff_t pos)  {  	spin_lock(&hdr->lock); -	if (pos < hdr->io_start + hdr->good_bytes) { -		set_bit(NFS_IOHDR_ERROR, &hdr->flags); +	if (!test_and_set_bit(NFS_IOHDR_ERROR, &hdr->flags) +	    || pos < hdr->io_start + hdr->good_bytes) {  		clear_bit(NFS_IOHDR_EOF, &hdr->flags);  		hdr->good_bytes = pos - hdr->io_start;  		hdr->error = error; @@ -1100,8 +1100,6 @@ static int nfs_do_recoalesce(struct nfs_pageio_descriptor *desc)  		mirror->pg_base = 0;  		mirror->pg_recoalesce = 0; -		desc->pg_moreio = 0; -  		while (!list_empty(&head)) {  			struct nfs_page *req; @@ -1109,8 +1107,11 @@ static int nfs_do_recoalesce(struct nfs_pageio_descriptor *desc)  			nfs_list_remove_request(req);  			if (__nfs_pageio_add_request(desc, req))  				continue; -			if (desc->pg_error < 0) +			if (desc->pg_error < 0) { +				list_splice_tail(&head, &mirror->pg_list); +				mirror->pg_recoalesce = 1;  				return 0; +			}  			break;  		}  	} while (mirror->pg_recoalesce);  |