All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <1505183055.31542.2.camel@primarydata.com>

diff --git a/a/1.txt b/N1/1.txt
index f9c3a29..ebbe3d2 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,91 +1,162 @@
-T24gTW9uLCAyMDE3LTA5LTExIGF0IDEzOjI0ICsxMDAwLCBOZWlsQnJvd24gd3JvdGU6DQo+IEhv
-d2V2ZXIsIHdoaWxlIGxvb2tpbmcgb3ZlciB0aGUgY29kZSB0byBtYWtlIHN1cmUgSSByZWFsbHkg
-dW5kZXJzdG9vZA0KPiBpdA0KPiBhbmQgYWxsIHRoZSBwb3NzaWJsZSBjb25zZXF1ZW5jZXMgb2Yg
-Y2hhbmdpbmcgdG8gZXJyc2VxX3QgSSBmb3VuZCBhDQo+IGZldw0KPiBhbm9tYWxpZXMuICBUaGUg
-cGF0Y2ggYmVsb3cgYWRkcmVzc2VzIHRoZW0gYWxsLg0KPiANCj4gV291bGQgeW91IHNlZSBpZiB0
-aGV5IG1heSBzZW5zZSB0byB5b3U/DQo+IA0KPiBUaGFua3MsDQo+IE5laWxCcm93bg0KPiANCj4g
-DQo+IEZyb206IE5laWxCcm93biA8bmVpbGJAc3VzZS5jb20+DQo+IERhdGU6IE1vbiwgMTEgU2Vw
-IDIwMTcgMTM6MTU6NTAgKzEwMDANCj4gU3ViamVjdDogW1BBVENIXSBORlM6IHZhcmlvdXMgY2hh
-bmdlcyByZWxhdGluZyB0byByZXBvcnRpbmcgSU8NCj4gZXJyb3JzLg0KPiANCj4gMS8gcmVtb3Zl
-ICdzdGFydCcgYW5kICdlbmQnIGFyZ3MgZnJvbSBuZnNfZmlsZV9mc3luY19jb21taXQoKS4NCj4g
-ICAgVGhleSBhcmVuJ3QgdXNlZC4NCj4gDQo+IDIvIE1ha2UgbmZzX2NvbnRleHRfc2V0X3dyaXRl
-X2Vycm9yKCkgYSAic3RhdGljIGlubGluZSIgaW4gaW50ZXJuYWwuaA0KPiAgICBzbyB3ZSBjYW4u
-Li4NCj4gDQo+IDMvIFVzZSBuZnNfY29udGV4dF9zZXRfd3JpdGVfZXJyb3IoKSBpbnN0ZWFkIG9m
-IG1hcHBpbmdfc2V0X2Vycm9yKCkNCj4gICAgaWYgbmZzX3BhZ2Vpb19hZGRfcmVxdWVzdCgpIGZh
-aWxzIGJlZm9yZSBzZW5kaW5nIGFueSByZXF1ZXN0Lg0KPiAgICBORlMgZ2VuZXJhbGx5IGtlZXBz
-IGVycm9ycyBpbiB0aGUgb3Blbl9jb250ZXh0LCBub3QgdGhlIG1hcHBpbmcsDQo+ICAgIHNvIHRo
-aXMgaXMgbW9yZSBjb25zaXN0ZW50Lg0KPiANCj4gNC8gSWYgZmlsZW1hcF93cml0ZV9hbmRfd3Jp
-dGVfcmFuZ2UoKSByZXBvcnRzIGFueSBlcnJvciwgc3RpbGwNCj4gICAgY2hlY2sgY3R4LT5lcnJv
-ci4gIFRoZSB2YWx1ZSBpbiBjdHgtPmVycm9yIGlzIGxpa2VseSB0byBiZQ0KPiAgICBtb3JlIHVz
-ZWZ1bC4gIEFzIHBhcnQgb2YgdGhpcywgTkZTX0NPTlRFWFRfRVJST1JfV1JJVEUgaXMNCj4gICAg
-Y2xlYXJlZCBzbGlnaHRseSBlYXJsaWVyLCBiZWZvcmUgbmZzX2ZpbGVfZnN5bmNfY29tbWl0KCkg
-aXMNCj4gY2FsbGVkLA0KPiAgICByYXRoZXIgdGhhbiBhdCB0aGUgc3RhcnQgb2YgdGhhdCBmdW5j
-dGlvbi4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IE5laWxCcm93biA8bmVpbGJAc3VzZS5jb20+DQo+
-IC0tLQ0KPiAgZnMvbmZzL2ZpbGUuYyAgICAgfCAxNiArKysrKysrKysrLS0tLS0tDQo+ICBmcy9u
-ZnMvaW50ZXJuYWwuaCB8ICA3ICsrKysrKysNCj4gIGZzL25mcy9wYWdlbGlzdC5jIHwgIDQgKyst
-LQ0KPiAgZnMvbmZzL3dyaXRlLmMgICAgfCAgNyAtLS0tLS0tDQo+ICA0IGZpbGVzIGNoYW5nZWQs
-IDE5IGluc2VydGlvbnMoKyksIDE1IGRlbGV0aW9ucygtKQ0KPiANCj4gZGlmZiAtLWdpdCBhL2Zz
-L25mcy9maWxlLmMgYi9mcy9uZnMvZmlsZS5jDQo+IGluZGV4IGFmMzMwYzMxZjYyNy4uYWIzMjRm
-MTQwODFmIDEwMDY0NA0KPiAtLS0gYS9mcy9uZnMvZmlsZS5jDQo+ICsrKyBiL2ZzL25mcy9maWxl
-LmMNCj4gQEAgLTIwOCwyMSArMjA4LDE5IEBAIEVYUE9SVF9TWU1CT0xfR1BMKG5mc19maWxlX21t
-YXApOw0KPiAgICogZmFsbCBiYWNrIHRvIGRvaW5nIGEgc3luY2hyb25vdXMgd3JpdGUuDQo+ICAg
-Ki8NCj4gIHN0YXRpYyBpbnQNCj4gLW5mc19maWxlX2ZzeW5jX2NvbW1pdChzdHJ1Y3QgZmlsZSAq
-ZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLA0KPiBpbnQgZGF0YXN5bmMpDQo+ICtuZnNf
-ZmlsZV9mc3luY19jb21taXQoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykNCj4gIHsN
-Cj4gIAlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4ID0gbmZzX2ZpbGVfb3Blbl9jb250ZXh0
-KGZpbGUpOw0KPiAgCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpOw0KPiAt
-CWludCBoYXZlX2Vycm9yLCBkb19yZXNlbmQsIHN0YXR1czsNCj4gKwlpbnQgZG9fcmVzZW5kLCBz
-dGF0dXM7DQo+ICAJaW50IHJldCA9IDA7DQo+ICANCj4gIAlkcHJpbnRrKCJORlM6IGZzeW5jIGZp
-bGUoJXBEMikgZGF0YXN5bmMgJWRcbiIsIGZpbGUsDQo+IGRhdGFzeW5jKTsNCj4gIA0KPiAgCW5m
-c19pbmNfc3RhdHMoaW5vZGUsIE5GU0lPU19WRlNGU1lOQyk7DQo+ICAJZG9fcmVzZW5kID0gdGVz
-dF9hbmRfY2xlYXJfYml0KE5GU19DT05URVhUX1JFU0VORF9XUklURVMsDQo+ICZjdHgtPmZsYWdz
-KTsNCj4gLQloYXZlX2Vycm9yID0gdGVzdF9hbmRfY2xlYXJfYml0KE5GU19DT05URVhUX0VSUk9S
-X1dSSVRFLA0KPiAmY3R4LT5mbGFncyk7DQo+ICAJc3RhdHVzID0gbmZzX2NvbW1pdF9pbm9kZShp
-bm9kZSwgRkxVU0hfU1lOQyk7DQo+IC0JaGF2ZV9lcnJvciB8PSB0ZXN0X2JpdChORlNfQ09OVEVY
-VF9FUlJPUl9XUklURSwgJmN0eC0NCj4gPmZsYWdzKTsNCj4gLQlpZiAoaGF2ZV9lcnJvcikgew0K
-PiArCWlmICh0ZXN0X2JpdChORlNfQ09OVEVYVF9FUlJPUl9XUklURSwgJmN0eC0+ZmxhZ3MpKSB7
-DQo+ICAJCXJldCA9IHhjaGcoJmN0eC0+ZXJyb3IsIDApOw0KPiAgCQlpZiAocmV0KQ0KPiAgCQkJ
-Z290byBvdXQ7DQo+IEBAIC0yNDcsMTAgKzI0NSwxNiBAQCBuZnNfZmlsZV9mc3luYyhzdHJ1Y3Qg
-ZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LA0KPiBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpDQo+
-ICAJdHJhY2VfbmZzX2ZzeW5jX2VudGVyKGlub2RlKTsNCj4gIA0KPiAgCWRvIHsNCj4gKwkJc3Ry
-dWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9DQo+IG5mc19maWxlX29wZW5fY29udGV4dChmaWxl
-KTsNCj4gIAkJcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBw
-aW5nLCANCj4gc3RhcnQsIGVuZCk7DQo+ICsJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTX0NP
-TlRFWFRfRVJST1JfV1JJVEUsDQo+ICZjdHgtPmZsYWdzKSkgew0KPiArCQkJaW50IHJldDIgPSB4
-Y2hnKCZjdHgtPmVycm9yLCAwKTsNCj4gKwkJCWlmIChyZXQyKQ0KPiArCQkJCXJldCA9IHJldDI7
-DQo+ICsJCX0NCj4gIAkJaWYgKHJldCAhPSAwKQ0KPiAgCQkJYnJlYWs7DQo+IC0JCXJldCA9IG5m
-c19maWxlX2ZzeW5jX2NvbW1pdChmaWxlLCBzdGFydCwgZW5kLA0KPiBkYXRhc3luYyk7DQo+ICsJ
-CXJldCA9IG5mc19maWxlX2ZzeW5jX2NvbW1pdChmaWxlLCBkYXRhc3luYyk7DQo+ICAJCWlmICgh
-cmV0KQ0KPiAgCQkJcmV0ID0gcG5mc19zeW5jX2lub2RlKGlub2RlLCAhIWRhdGFzeW5jKTsNCj4g
-IAkJLyoNCj4gZGlmZiAtLWdpdCBhL2ZzL25mcy9pbnRlcm5hbC5oIGIvZnMvbmZzL2ludGVybmFs
-LmgNCj4gaW5kZXggZGM0NTY0MTZkMmJlLi40NGM4OTYyZmVjOTEgMTAwNjQ0DQo+IC0tLSBhL2Zz
-L25mcy9pbnRlcm5hbC5oDQo+ICsrKyBiL2ZzL25mcy9pbnRlcm5hbC5oDQo+IEBAIC03NjksMyAr
-NzY5LDEwIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBuZnNfZXJyb3JfaXNfZmF0YWwoaW50IGVycikN
-Cj4gIAkJcmV0dXJuIGZhbHNlOw0KPiAgCX0NCj4gIH0NCj4gKw0KPiArc3RhdGljIGlubGluZSB2
-b2lkIG5mc19jb250ZXh0X3NldF93cml0ZV9lcnJvcihzdHJ1Y3QNCj4gbmZzX29wZW5fY29udGV4
-dCAqY3R4LCBpbnQgZXJyb3IpDQo+ICt7DQo+ICsJY3R4LT5lcnJvciA9IGVycm9yOw0KPiArCXNt
-cF93bWIoKTsNCj4gKwlzZXRfYml0KE5GU19DT05URVhUX0VSUk9SX1dSSVRFLCAmY3R4LT5mbGFn
-cyk7DQo+ICt9DQo+IGRpZmYgLS1naXQgYS9mcy9uZnMvcGFnZWxpc3QuYyBiL2ZzL25mcy9wYWdl
-bGlzdC5jDQo+IGluZGV4IGRlOTA2NmE5MmMwZC4uMGViZDI2YjlhNmJkIDEwMDY0NA0KPiAtLS0g
-YS9mcy9uZnMvcGFnZWxpc3QuYw0KPiArKysgYi9mcy9uZnMvcGFnZWxpc3QuYw0KPiBAQCAtMTE5
-OCw4ICsxMTk4LDggQEAgb3V0X2ZhaWxlZDoNCj4gIA0KPiAgCQkvKiByZW1lbWJlciBmYXRhbCBl
-cnJvcnMgKi8NCj4gIAkJaWYgKG5mc19lcnJvcl9pc19mYXRhbChkZXNjLT5wZ19lcnJvcikpDQo+
-IC0JCQltYXBwaW5nX3NldF9lcnJvcihkZXNjLT5wZ19pbm9kZS0+aV9tYXBwaW5nLA0KPiAtCQkJ
-CQkgIGRlc2MtPnBnX2Vycm9yKTsNCj4gKwkJCW5mc19jb250ZXh0X3NldF93cml0ZV9lcnJvcihy
-ZXEtPndiX2NvbnRleHQsDQo+ICsJCQkJCQkgICAgZGVzYy0+cGdfZXJyb3IpOw0KPiAgDQo+ICAJ
-CWZ1bmMgPSBkZXNjLT5wZ19jb21wbGV0aW9uX29wcy0+ZXJyb3JfY2xlYW51cDsNCj4gIAkJZm9y
-IChtaWR4ID0gMDsgbWlkeCA8IGRlc2MtPnBnX21pcnJvcl9jb3VudDsgbWlkeCsrKQ0KPiB7DQo+
-IGRpZmYgLS1naXQgYS9mcy9uZnMvd3JpdGUuYyBiL2ZzL25mcy93cml0ZS5jDQo+IGluZGV4IGIx
-YWY1ZGVlNWUwYS4uZjcwMmJmMmRlZjc5IDEwMDY0NA0KPiAtLS0gYS9mcy9uZnMvd3JpdGUuYw0K
-PiArKysgYi9mcy9uZnMvd3JpdGUuYw0KPiBAQCAtMTQ3LDEzICsxNDcsNiBAQCBzdGF0aWMgdm9p
-ZCBuZnNfaW9fY29tcGxldGlvbl9wdXQoc3RydWN0DQo+IG5mc19pb19jb21wbGV0aW9uICppb2Mp
-DQo+ICAJCWtyZWZfcHV0KCZpb2MtPnJlZmNvdW50LCBuZnNfaW9fY29tcGxldGlvbl9yZWxlYXNl
-KTsNCj4gIH0NCj4gIA0KPiAtc3RhdGljIHZvaWQgbmZzX2NvbnRleHRfc2V0X3dyaXRlX2Vycm9y
-KHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0DQo+ICpjdHgsIGludCBlcnJvcikNCj4gLXsNCj4gLQlj
-dHgtPmVycm9yID0gZXJyb3I7DQo+IC0Jc21wX3dtYigpOw0KPiAtCXNldF9iaXQoTkZTX0NPTlRF
-WFRfRVJST1JfV1JJVEUsICZjdHgtPmZsYWdzKTsNCj4gLX0NCj4gLQ0KPiAgLyoNCj4gICAqIG5m
-c19wYWdlX2ZpbmRfaGVhZF9yZXF1ZXN0X2xvY2tlZCAtIGZpbmQgaGVhZCByZXF1ZXN0IGFzc29j
-aWF0ZWQNCj4gd2l0aCBAcGFnZQ0KPiAgICoNCg0KVGhhdCBtYWtlcyBzZW5zZSB0byBtZS4gSSdt
-IGFwcGx5aW5nIGFuZCB3aWxsIHNlbmQgYXMgYW4gdXBkYXRlIHRvDQo0LjE0Li4uDQoNCi0tIA0K
-VHJvbmQgTXlrbGVidXN0DQpMaW51eCBORlMgY2xpZW50IG1haW50YWluZXIsIFByaW1hcnlEYXRh
-DQp0cm9uZC5teWtsZWJ1c3RAcHJpbWFyeWRhdGEuY29tDQo=
+On Mon, 2017-09-11 at 13:24 +1000, NeilBrown wrote:
+> However, while looking over the code to make sure I really understood
+> it
+> and all the possible consequences of changing to errseq_t I found a
+> few
+> anomalies.  The patch below addresses them all.
+> 
+> Would you see if they may sense to you?
+> 
+> Thanks,
+> NeilBrown
+> 
+> 
+> From: NeilBrown <neilb@suse.com>
+> Date: Mon, 11 Sep 2017 13:15:50 +1000
+> Subject: [PATCH] NFS: various changes relating to reporting IO
+> errors.
+> 
+> 1/ remove 'start' and 'end' args from nfs_file_fsync_commit().
+>    They aren't used.
+> 
+> 2/ Make nfs_context_set_write_error() a "static inline" in internal.h
+>    so we can...
+> 
+> 3/ Use nfs_context_set_write_error() instead of mapping_set_error()
+>    if nfs_pageio_add_request() fails before sending any request.
+>    NFS generally keeps errors in the open_context, not the mapping,
+>    so this is more consistent.
+> 
+> 4/ If filemap_write_and_write_range() reports any error, still
+>    check ctx->error.  The value in ctx->error is likely to be
+>    more useful.  As part of this, NFS_CONTEXT_ERROR_WRITE is
+>    cleared slightly earlier, before nfs_file_fsync_commit() is
+> called,
+>    rather than at the start of that function.
+> 
+> Signed-off-by: NeilBrown <neilb@suse.com>
+> ---
+>  fs/nfs/file.c     | 16 ++++++++++------
+>  fs/nfs/internal.h |  7 +++++++
+>  fs/nfs/pagelist.c |  4 ++--
+>  fs/nfs/write.c    |  7 -------
+>  4 files changed, 19 insertions(+), 15 deletions(-)
+> 
+> diff --git a/fs/nfs/file.c b/fs/nfs/file.c
+> index af330c31f627..ab324f14081f 100644
+> --- a/fs/nfs/file.c
+> +++ b/fs/nfs/file.c
+> @@ -208,21 +208,19 @@ EXPORT_SYMBOL_GPL(nfs_file_mmap);
+>   * fall back to doing a synchronous write.
+>   */
+>  static int
+> -nfs_file_fsync_commit(struct file *file, loff_t start, loff_t end,
+> int datasync)
+> +nfs_file_fsync_commit(struct file *file, int datasync)
+>  {
+>  	struct nfs_open_context *ctx = nfs_file_open_context(file);
+>  	struct inode *inode = file_inode(file);
+> -	int have_error, do_resend, status;
+> +	int do_resend, status;
+>  	int ret = 0;
+>  
+>  	dprintk("NFS: fsync file(%pD2) datasync %d\n", file,
+> datasync);
+>  
+>  	nfs_inc_stats(inode, NFSIOS_VFSFSYNC);
+>  	do_resend = test_and_clear_bit(NFS_CONTEXT_RESEND_WRITES,
+> &ctx->flags);
+> -	have_error = test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE,
+> &ctx->flags);
+>  	status = nfs_commit_inode(inode, FLUSH_SYNC);
+> -	have_error |= test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx-
+> >flags);
+> -	if (have_error) {
+> +	if (test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags)) {
+>  		ret = xchg(&ctx->error, 0);
+>  		if (ret)
+>  			goto out;
+> @@ -247,10 +245,16 @@ nfs_file_fsync(struct file *file, loff_t start,
+> loff_t end, int datasync)
+>  	trace_nfs_fsync_enter(inode);
+>  
+>  	do {
+> +		struct nfs_open_context *ctx =
+> nfs_file_open_context(file);
+>  		ret = filemap_write_and_wait_range(inode->i_mapping, 
+> start, end);
+> +		if (test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE,
+> &ctx->flags)) {
+> +			int ret2 = xchg(&ctx->error, 0);
+> +			if (ret2)
+> +				ret = ret2;
+> +		}
+>  		if (ret != 0)
+>  			break;
+> -		ret = nfs_file_fsync_commit(file, start, end,
+> datasync);
+> +		ret = nfs_file_fsync_commit(file, datasync);
+>  		if (!ret)
+>  			ret = pnfs_sync_inode(inode, !!datasync);
+>  		/*
+> diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
+> index dc456416d2be..44c8962fec91 100644
+> --- a/fs/nfs/internal.h
+> +++ b/fs/nfs/internal.h
+> @@ -769,3 +769,10 @@ static inline bool nfs_error_is_fatal(int err)
+>  		return false;
+>  	}
+>  }
+> +
+> +static inline void nfs_context_set_write_error(struct
+> nfs_open_context *ctx, int error)
+> +{
+> +	ctx->error = error;
+> +	smp_wmb();
+> +	set_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
+> +}
+> diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
+> index de9066a92c0d..0ebd26b9a6bd 100644
+> --- a/fs/nfs/pagelist.c
+> +++ b/fs/nfs/pagelist.c
+> @@ -1198,8 +1198,8 @@ out_failed:
+>  
+>  		/* remember fatal errors */
+>  		if (nfs_error_is_fatal(desc->pg_error))
+> -			mapping_set_error(desc->pg_inode->i_mapping,
+> -					  desc->pg_error);
+> +			nfs_context_set_write_error(req->wb_context,
+> +						    desc->pg_error);
+>  
+>  		func = desc->pg_completion_ops->error_cleanup;
+>  		for (midx = 0; midx < desc->pg_mirror_count; midx++)
+> {
+> diff --git a/fs/nfs/write.c b/fs/nfs/write.c
+> index b1af5dee5e0a..f702bf2def79 100644
+> --- a/fs/nfs/write.c
+> +++ b/fs/nfs/write.c
+> @@ -147,13 +147,6 @@ static void nfs_io_completion_put(struct
+> nfs_io_completion *ioc)
+>  		kref_put(&ioc->refcount, nfs_io_completion_release);
+>  }
+>  
+> -static void nfs_context_set_write_error(struct nfs_open_context
+> *ctx, int error)
+> -{
+> -	ctx->error = error;
+> -	smp_wmb();
+> -	set_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
+> -}
+> -
+>  /*
+>   * nfs_page_find_head_request_locked - find head request associated
+> with @page
+>   *
+
+That makes sense to me. I'm applying and will send as an update to
+4.14...
+
+-- 
+Trond Myklebust
+Linux NFS client maintainer, PrimaryData
+trond.myklebust@primarydata.com
diff --git a/a/content_digest b/N1/content_digest
index 6fb28cc..87378c3 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -19,96 +19,167 @@
  " linux-fsdevel@vger.kernel.org <linux-fsdevel@vger.kernel.org>\0"
  "\00:1\0"
  "b\0"
- "T24gTW9uLCAyMDE3LTA5LTExIGF0IDEzOjI0ICsxMDAwLCBOZWlsQnJvd24gd3JvdGU6DQo+IEhv\n"
- "d2V2ZXIsIHdoaWxlIGxvb2tpbmcgb3ZlciB0aGUgY29kZSB0byBtYWtlIHN1cmUgSSByZWFsbHkg\n"
- "dW5kZXJzdG9vZA0KPiBpdA0KPiBhbmQgYWxsIHRoZSBwb3NzaWJsZSBjb25zZXF1ZW5jZXMgb2Yg\n"
- "Y2hhbmdpbmcgdG8gZXJyc2VxX3QgSSBmb3VuZCBhDQo+IGZldw0KPiBhbm9tYWxpZXMuICBUaGUg\n"
- "cGF0Y2ggYmVsb3cgYWRkcmVzc2VzIHRoZW0gYWxsLg0KPiANCj4gV291bGQgeW91IHNlZSBpZiB0\n"
- "aGV5IG1heSBzZW5zZSB0byB5b3U/DQo+IA0KPiBUaGFua3MsDQo+IE5laWxCcm93bg0KPiANCj4g\n"
- "DQo+IEZyb206IE5laWxCcm93biA8bmVpbGJAc3VzZS5jb20+DQo+IERhdGU6IE1vbiwgMTEgU2Vw\n"
- "IDIwMTcgMTM6MTU6NTAgKzEwMDANCj4gU3ViamVjdDogW1BBVENIXSBORlM6IHZhcmlvdXMgY2hh\n"
- "bmdlcyByZWxhdGluZyB0byByZXBvcnRpbmcgSU8NCj4gZXJyb3JzLg0KPiANCj4gMS8gcmVtb3Zl\n"
- "ICdzdGFydCcgYW5kICdlbmQnIGFyZ3MgZnJvbSBuZnNfZmlsZV9mc3luY19jb21taXQoKS4NCj4g\n"
- "ICAgVGhleSBhcmVuJ3QgdXNlZC4NCj4gDQo+IDIvIE1ha2UgbmZzX2NvbnRleHRfc2V0X3dyaXRl\n"
- "X2Vycm9yKCkgYSAic3RhdGljIGlubGluZSIgaW4gaW50ZXJuYWwuaA0KPiAgICBzbyB3ZSBjYW4u\n"
- "Li4NCj4gDQo+IDMvIFVzZSBuZnNfY29udGV4dF9zZXRfd3JpdGVfZXJyb3IoKSBpbnN0ZWFkIG9m\n"
- "IG1hcHBpbmdfc2V0X2Vycm9yKCkNCj4gICAgaWYgbmZzX3BhZ2Vpb19hZGRfcmVxdWVzdCgpIGZh\n"
- "aWxzIGJlZm9yZSBzZW5kaW5nIGFueSByZXF1ZXN0Lg0KPiAgICBORlMgZ2VuZXJhbGx5IGtlZXBz\n"
- "IGVycm9ycyBpbiB0aGUgb3Blbl9jb250ZXh0LCBub3QgdGhlIG1hcHBpbmcsDQo+ICAgIHNvIHRo\n"
- "aXMgaXMgbW9yZSBjb25zaXN0ZW50Lg0KPiANCj4gNC8gSWYgZmlsZW1hcF93cml0ZV9hbmRfd3Jp\n"
- "dGVfcmFuZ2UoKSByZXBvcnRzIGFueSBlcnJvciwgc3RpbGwNCj4gICAgY2hlY2sgY3R4LT5lcnJv\n"
- "ci4gIFRoZSB2YWx1ZSBpbiBjdHgtPmVycm9yIGlzIGxpa2VseSB0byBiZQ0KPiAgICBtb3JlIHVz\n"
- "ZWZ1bC4gIEFzIHBhcnQgb2YgdGhpcywgTkZTX0NPTlRFWFRfRVJST1JfV1JJVEUgaXMNCj4gICAg\n"
- "Y2xlYXJlZCBzbGlnaHRseSBlYXJsaWVyLCBiZWZvcmUgbmZzX2ZpbGVfZnN5bmNfY29tbWl0KCkg\n"
- "aXMNCj4gY2FsbGVkLA0KPiAgICByYXRoZXIgdGhhbiBhdCB0aGUgc3RhcnQgb2YgdGhhdCBmdW5j\n"
- "dGlvbi4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IE5laWxCcm93biA8bmVpbGJAc3VzZS5jb20+DQo+\n"
- "IC0tLQ0KPiAgZnMvbmZzL2ZpbGUuYyAgICAgfCAxNiArKysrKysrKysrLS0tLS0tDQo+ICBmcy9u\n"
- "ZnMvaW50ZXJuYWwuaCB8ICA3ICsrKysrKysNCj4gIGZzL25mcy9wYWdlbGlzdC5jIHwgIDQgKyst\n"
- "LQ0KPiAgZnMvbmZzL3dyaXRlLmMgICAgfCAgNyAtLS0tLS0tDQo+ICA0IGZpbGVzIGNoYW5nZWQs\n"
- "IDE5IGluc2VydGlvbnMoKyksIDE1IGRlbGV0aW9ucygtKQ0KPiANCj4gZGlmZiAtLWdpdCBhL2Zz\n"
- "L25mcy9maWxlLmMgYi9mcy9uZnMvZmlsZS5jDQo+IGluZGV4IGFmMzMwYzMxZjYyNy4uYWIzMjRm\n"
- "MTQwODFmIDEwMDY0NA0KPiAtLS0gYS9mcy9uZnMvZmlsZS5jDQo+ICsrKyBiL2ZzL25mcy9maWxl\n"
- "LmMNCj4gQEAgLTIwOCwyMSArMjA4LDE5IEBAIEVYUE9SVF9TWU1CT0xfR1BMKG5mc19maWxlX21t\n"
- "YXApOw0KPiAgICogZmFsbCBiYWNrIHRvIGRvaW5nIGEgc3luY2hyb25vdXMgd3JpdGUuDQo+ICAg\n"
- "Ki8NCj4gIHN0YXRpYyBpbnQNCj4gLW5mc19maWxlX2ZzeW5jX2NvbW1pdChzdHJ1Y3QgZmlsZSAq\n"
- "ZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLA0KPiBpbnQgZGF0YXN5bmMpDQo+ICtuZnNf\n"
- "ZmlsZV9mc3luY19jb21taXQoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkYXRhc3luYykNCj4gIHsN\n"
- "Cj4gIAlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4ID0gbmZzX2ZpbGVfb3Blbl9jb250ZXh0\n"
- "KGZpbGUpOw0KPiAgCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpOw0KPiAt\n"
- "CWludCBoYXZlX2Vycm9yLCBkb19yZXNlbmQsIHN0YXR1czsNCj4gKwlpbnQgZG9fcmVzZW5kLCBz\n"
- "dGF0dXM7DQo+ICAJaW50IHJldCA9IDA7DQo+ICANCj4gIAlkcHJpbnRrKCJORlM6IGZzeW5jIGZp\n"
- "bGUoJXBEMikgZGF0YXN5bmMgJWRcbiIsIGZpbGUsDQo+IGRhdGFzeW5jKTsNCj4gIA0KPiAgCW5m\n"
- "c19pbmNfc3RhdHMoaW5vZGUsIE5GU0lPU19WRlNGU1lOQyk7DQo+ICAJZG9fcmVzZW5kID0gdGVz\n"
- "dF9hbmRfY2xlYXJfYml0KE5GU19DT05URVhUX1JFU0VORF9XUklURVMsDQo+ICZjdHgtPmZsYWdz\n"
- "KTsNCj4gLQloYXZlX2Vycm9yID0gdGVzdF9hbmRfY2xlYXJfYml0KE5GU19DT05URVhUX0VSUk9S\n"
- "X1dSSVRFLA0KPiAmY3R4LT5mbGFncyk7DQo+ICAJc3RhdHVzID0gbmZzX2NvbW1pdF9pbm9kZShp\n"
- "bm9kZSwgRkxVU0hfU1lOQyk7DQo+IC0JaGF2ZV9lcnJvciB8PSB0ZXN0X2JpdChORlNfQ09OVEVY\n"
- "VF9FUlJPUl9XUklURSwgJmN0eC0NCj4gPmZsYWdzKTsNCj4gLQlpZiAoaGF2ZV9lcnJvcikgew0K\n"
- "PiArCWlmICh0ZXN0X2JpdChORlNfQ09OVEVYVF9FUlJPUl9XUklURSwgJmN0eC0+ZmxhZ3MpKSB7\n"
- "DQo+ICAJCXJldCA9IHhjaGcoJmN0eC0+ZXJyb3IsIDApOw0KPiAgCQlpZiAocmV0KQ0KPiAgCQkJ\n"
- "Z290byBvdXQ7DQo+IEBAIC0yNDcsMTAgKzI0NSwxNiBAQCBuZnNfZmlsZV9mc3luYyhzdHJ1Y3Qg\n"
- "ZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LA0KPiBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpDQo+\n"
- "ICAJdHJhY2VfbmZzX2ZzeW5jX2VudGVyKGlub2RlKTsNCj4gIA0KPiAgCWRvIHsNCj4gKwkJc3Ry\n"
- "dWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9DQo+IG5mc19maWxlX29wZW5fY29udGV4dChmaWxl\n"
- "KTsNCj4gIAkJcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShpbm9kZS0+aV9tYXBw\n"
- "aW5nLCANCj4gc3RhcnQsIGVuZCk7DQo+ICsJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTX0NP\n"
- "TlRFWFRfRVJST1JfV1JJVEUsDQo+ICZjdHgtPmZsYWdzKSkgew0KPiArCQkJaW50IHJldDIgPSB4\n"
- "Y2hnKCZjdHgtPmVycm9yLCAwKTsNCj4gKwkJCWlmIChyZXQyKQ0KPiArCQkJCXJldCA9IHJldDI7\n"
- "DQo+ICsJCX0NCj4gIAkJaWYgKHJldCAhPSAwKQ0KPiAgCQkJYnJlYWs7DQo+IC0JCXJldCA9IG5m\n"
- "c19maWxlX2ZzeW5jX2NvbW1pdChmaWxlLCBzdGFydCwgZW5kLA0KPiBkYXRhc3luYyk7DQo+ICsJ\n"
- "CXJldCA9IG5mc19maWxlX2ZzeW5jX2NvbW1pdChmaWxlLCBkYXRhc3luYyk7DQo+ICAJCWlmICgh\n"
- "cmV0KQ0KPiAgCQkJcmV0ID0gcG5mc19zeW5jX2lub2RlKGlub2RlLCAhIWRhdGFzeW5jKTsNCj4g\n"
- "IAkJLyoNCj4gZGlmZiAtLWdpdCBhL2ZzL25mcy9pbnRlcm5hbC5oIGIvZnMvbmZzL2ludGVybmFs\n"
- "LmgNCj4gaW5kZXggZGM0NTY0MTZkMmJlLi40NGM4OTYyZmVjOTEgMTAwNjQ0DQo+IC0tLSBhL2Zz\n"
- "L25mcy9pbnRlcm5hbC5oDQo+ICsrKyBiL2ZzL25mcy9pbnRlcm5hbC5oDQo+IEBAIC03NjksMyAr\n"
- "NzY5LDEwIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBuZnNfZXJyb3JfaXNfZmF0YWwoaW50IGVycikN\n"
- "Cj4gIAkJcmV0dXJuIGZhbHNlOw0KPiAgCX0NCj4gIH0NCj4gKw0KPiArc3RhdGljIGlubGluZSB2\n"
- "b2lkIG5mc19jb250ZXh0X3NldF93cml0ZV9lcnJvcihzdHJ1Y3QNCj4gbmZzX29wZW5fY29udGV4\n"
- "dCAqY3R4LCBpbnQgZXJyb3IpDQo+ICt7DQo+ICsJY3R4LT5lcnJvciA9IGVycm9yOw0KPiArCXNt\n"
- "cF93bWIoKTsNCj4gKwlzZXRfYml0KE5GU19DT05URVhUX0VSUk9SX1dSSVRFLCAmY3R4LT5mbGFn\n"
- "cyk7DQo+ICt9DQo+IGRpZmYgLS1naXQgYS9mcy9uZnMvcGFnZWxpc3QuYyBiL2ZzL25mcy9wYWdl\n"
- "bGlzdC5jDQo+IGluZGV4IGRlOTA2NmE5MmMwZC4uMGViZDI2YjlhNmJkIDEwMDY0NA0KPiAtLS0g\n"
- "YS9mcy9uZnMvcGFnZWxpc3QuYw0KPiArKysgYi9mcy9uZnMvcGFnZWxpc3QuYw0KPiBAQCAtMTE5\n"
- "OCw4ICsxMTk4LDggQEAgb3V0X2ZhaWxlZDoNCj4gIA0KPiAgCQkvKiByZW1lbWJlciBmYXRhbCBl\n"
- "cnJvcnMgKi8NCj4gIAkJaWYgKG5mc19lcnJvcl9pc19mYXRhbChkZXNjLT5wZ19lcnJvcikpDQo+\n"
- "IC0JCQltYXBwaW5nX3NldF9lcnJvcihkZXNjLT5wZ19pbm9kZS0+aV9tYXBwaW5nLA0KPiAtCQkJ\n"
- "CQkgIGRlc2MtPnBnX2Vycm9yKTsNCj4gKwkJCW5mc19jb250ZXh0X3NldF93cml0ZV9lcnJvcihy\n"
- "ZXEtPndiX2NvbnRleHQsDQo+ICsJCQkJCQkgICAgZGVzYy0+cGdfZXJyb3IpOw0KPiAgDQo+ICAJ\n"
- "CWZ1bmMgPSBkZXNjLT5wZ19jb21wbGV0aW9uX29wcy0+ZXJyb3JfY2xlYW51cDsNCj4gIAkJZm9y\n"
- "IChtaWR4ID0gMDsgbWlkeCA8IGRlc2MtPnBnX21pcnJvcl9jb3VudDsgbWlkeCsrKQ0KPiB7DQo+\n"
- "IGRpZmYgLS1naXQgYS9mcy9uZnMvd3JpdGUuYyBiL2ZzL25mcy93cml0ZS5jDQo+IGluZGV4IGIx\n"
- "YWY1ZGVlNWUwYS4uZjcwMmJmMmRlZjc5IDEwMDY0NA0KPiAtLS0gYS9mcy9uZnMvd3JpdGUuYw0K\n"
- "PiArKysgYi9mcy9uZnMvd3JpdGUuYw0KPiBAQCAtMTQ3LDEzICsxNDcsNiBAQCBzdGF0aWMgdm9p\n"
- "ZCBuZnNfaW9fY29tcGxldGlvbl9wdXQoc3RydWN0DQo+IG5mc19pb19jb21wbGV0aW9uICppb2Mp\n"
- "DQo+ICAJCWtyZWZfcHV0KCZpb2MtPnJlZmNvdW50LCBuZnNfaW9fY29tcGxldGlvbl9yZWxlYXNl\n"
- "KTsNCj4gIH0NCj4gIA0KPiAtc3RhdGljIHZvaWQgbmZzX2NvbnRleHRfc2V0X3dyaXRlX2Vycm9y\n"
- "KHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0DQo+ICpjdHgsIGludCBlcnJvcikNCj4gLXsNCj4gLQlj\n"
- "dHgtPmVycm9yID0gZXJyb3I7DQo+IC0Jc21wX3dtYigpOw0KPiAtCXNldF9iaXQoTkZTX0NPTlRF\n"
- "WFRfRVJST1JfV1JJVEUsICZjdHgtPmZsYWdzKTsNCj4gLX0NCj4gLQ0KPiAgLyoNCj4gICAqIG5m\n"
- "c19wYWdlX2ZpbmRfaGVhZF9yZXF1ZXN0X2xvY2tlZCAtIGZpbmQgaGVhZCByZXF1ZXN0IGFzc29j\n"
- "aWF0ZWQNCj4gd2l0aCBAcGFnZQ0KPiAgICoNCg0KVGhhdCBtYWtlcyBzZW5zZSB0byBtZS4gSSdt\n"
- "IGFwcGx5aW5nIGFuZCB3aWxsIHNlbmQgYXMgYW4gdXBkYXRlIHRvDQo0LjE0Li4uDQoNCi0tIA0K\n"
- "VHJvbmQgTXlrbGVidXN0DQpMaW51eCBORlMgY2xpZW50IG1haW50YWluZXIsIFByaW1hcnlEYXRh\n"
- DQp0cm9uZC5teWtsZWJ1c3RAcHJpbWFyeWRhdGEuY29tDQo=
+ "On Mon, 2017-09-11 at 13:24 +1000, NeilBrown wrote:\n"
+ "> However, while looking over the code to make sure I really understood\n"
+ "> it\n"
+ "> and all the possible consequences of changing to errseq_t I found a\n"
+ "> few\n"
+ "> anomalies.  The patch below addresses them all.\n"
+ "> \n"
+ "> Would you see if they may sense to you?\n"
+ "> \n"
+ "> Thanks,\n"
+ "> NeilBrown\n"
+ "> \n"
+ "> \n"
+ "> From: NeilBrown <neilb@suse.com>\n"
+ "> Date: Mon, 11 Sep 2017 13:15:50 +1000\n"
+ "> Subject: [PATCH] NFS: various changes relating to reporting IO\n"
+ "> errors.\n"
+ "> \n"
+ "> 1/ remove 'start' and 'end' args from nfs_file_fsync_commit().\n"
+ ">    They aren't used.\n"
+ "> \n"
+ "> 2/ Make nfs_context_set_write_error() a \"static inline\" in internal.h\n"
+ ">    so we can...\n"
+ "> \n"
+ "> 3/ Use nfs_context_set_write_error() instead of mapping_set_error()\n"
+ ">    if nfs_pageio_add_request() fails before sending any request.\n"
+ ">    NFS generally keeps errors in the open_context, not the mapping,\n"
+ ">    so this is more consistent.\n"
+ "> \n"
+ "> 4/ If filemap_write_and_write_range() reports any error, still\n"
+ ">    check ctx->error.  The value in ctx->error is likely to be\n"
+ ">    more useful.  As part of this, NFS_CONTEXT_ERROR_WRITE is\n"
+ ">    cleared slightly earlier, before nfs_file_fsync_commit() is\n"
+ "> called,\n"
+ ">    rather than at the start of that function.\n"
+ "> \n"
+ "> Signed-off-by: NeilBrown <neilb@suse.com>\n"
+ "> ---\n"
+ ">  fs/nfs/file.c     | 16 ++++++++++------\n"
+ ">  fs/nfs/internal.h |  7 +++++++\n"
+ ">  fs/nfs/pagelist.c |  4 ++--\n"
+ ">  fs/nfs/write.c    |  7 -------\n"
+ ">  4 files changed, 19 insertions(+), 15 deletions(-)\n"
+ "> \n"
+ "> diff --git a/fs/nfs/file.c b/fs/nfs/file.c\n"
+ "> index af330c31f627..ab324f14081f 100644\n"
+ "> --- a/fs/nfs/file.c\n"
+ "> +++ b/fs/nfs/file.c\n"
+ "> @@ -208,21 +208,19 @@ EXPORT_SYMBOL_GPL(nfs_file_mmap);\n"
+ ">   * fall back to doing a synchronous write.\n"
+ ">   */\n"
+ ">  static int\n"
+ "> -nfs_file_fsync_commit(struct file *file, loff_t start, loff_t end,\n"
+ "> int datasync)\n"
+ "> +nfs_file_fsync_commit(struct file *file, int datasync)\n"
+ ">  {\n"
+ ">  \tstruct nfs_open_context *ctx = nfs_file_open_context(file);\n"
+ ">  \tstruct inode *inode = file_inode(file);\n"
+ "> -\tint have_error, do_resend, status;\n"
+ "> +\tint do_resend, status;\n"
+ ">  \tint ret = 0;\n"
+ ">  \n"
+ ">  \tdprintk(\"NFS: fsync file(%pD2) datasync %d\\n\", file,\n"
+ "> datasync);\n"
+ ">  \n"
+ ">  \tnfs_inc_stats(inode, NFSIOS_VFSFSYNC);\n"
+ ">  \tdo_resend = test_and_clear_bit(NFS_CONTEXT_RESEND_WRITES,\n"
+ "> &ctx->flags);\n"
+ "> -\thave_error = test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE,\n"
+ "> &ctx->flags);\n"
+ ">  \tstatus = nfs_commit_inode(inode, FLUSH_SYNC);\n"
+ "> -\thave_error |= test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx-\n"
+ "> >flags);\n"
+ "> -\tif (have_error) {\n"
+ "> +\tif (test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags)) {\n"
+ ">  \t\tret = xchg(&ctx->error, 0);\n"
+ ">  \t\tif (ret)\n"
+ ">  \t\t\tgoto out;\n"
+ "> @@ -247,10 +245,16 @@ nfs_file_fsync(struct file *file, loff_t start,\n"
+ "> loff_t end, int datasync)\n"
+ ">  \ttrace_nfs_fsync_enter(inode);\n"
+ ">  \n"
+ ">  \tdo {\n"
+ "> +\t\tstruct nfs_open_context *ctx =\n"
+ "> nfs_file_open_context(file);\n"
+ ">  \t\tret = filemap_write_and_wait_range(inode->i_mapping, \n"
+ "> start, end);\n"
+ "> +\t\tif (test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE,\n"
+ "> &ctx->flags)) {\n"
+ "> +\t\t\tint ret2 = xchg(&ctx->error, 0);\n"
+ "> +\t\t\tif (ret2)\n"
+ "> +\t\t\t\tret = ret2;\n"
+ "> +\t\t}\n"
+ ">  \t\tif (ret != 0)\n"
+ ">  \t\t\tbreak;\n"
+ "> -\t\tret = nfs_file_fsync_commit(file, start, end,\n"
+ "> datasync);\n"
+ "> +\t\tret = nfs_file_fsync_commit(file, datasync);\n"
+ ">  \t\tif (!ret)\n"
+ ">  \t\t\tret = pnfs_sync_inode(inode, !!datasync);\n"
+ ">  \t\t/*\n"
+ "> diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h\n"
+ "> index dc456416d2be..44c8962fec91 100644\n"
+ "> --- a/fs/nfs/internal.h\n"
+ "> +++ b/fs/nfs/internal.h\n"
+ "> @@ -769,3 +769,10 @@ static inline bool nfs_error_is_fatal(int err)\n"
+ ">  \t\treturn false;\n"
+ ">  \t}\n"
+ ">  }\n"
+ "> +\n"
+ "> +static inline void nfs_context_set_write_error(struct\n"
+ "> nfs_open_context *ctx, int error)\n"
+ "> +{\n"
+ "> +\tctx->error = error;\n"
+ "> +\tsmp_wmb();\n"
+ "> +\tset_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);\n"
+ "> +}\n"
+ "> diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c\n"
+ "> index de9066a92c0d..0ebd26b9a6bd 100644\n"
+ "> --- a/fs/nfs/pagelist.c\n"
+ "> +++ b/fs/nfs/pagelist.c\n"
+ "> @@ -1198,8 +1198,8 @@ out_failed:\n"
+ ">  \n"
+ ">  \t\t/* remember fatal errors */\n"
+ ">  \t\tif (nfs_error_is_fatal(desc->pg_error))\n"
+ "> -\t\t\tmapping_set_error(desc->pg_inode->i_mapping,\n"
+ "> -\t\t\t\t\t  desc->pg_error);\n"
+ "> +\t\t\tnfs_context_set_write_error(req->wb_context,\n"
+ "> +\t\t\t\t\t\t    desc->pg_error);\n"
+ ">  \n"
+ ">  \t\tfunc = desc->pg_completion_ops->error_cleanup;\n"
+ ">  \t\tfor (midx = 0; midx < desc->pg_mirror_count; midx++)\n"
+ "> {\n"
+ "> diff --git a/fs/nfs/write.c b/fs/nfs/write.c\n"
+ "> index b1af5dee5e0a..f702bf2def79 100644\n"
+ "> --- a/fs/nfs/write.c\n"
+ "> +++ b/fs/nfs/write.c\n"
+ "> @@ -147,13 +147,6 @@ static void nfs_io_completion_put(struct\n"
+ "> nfs_io_completion *ioc)\n"
+ ">  \t\tkref_put(&ioc->refcount, nfs_io_completion_release);\n"
+ ">  }\n"
+ ">  \n"
+ "> -static void nfs_context_set_write_error(struct nfs_open_context\n"
+ "> *ctx, int error)\n"
+ "> -{\n"
+ "> -\tctx->error = error;\n"
+ "> -\tsmp_wmb();\n"
+ "> -\tset_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);\n"
+ "> -}\n"
+ "> -\n"
+ ">  /*\n"
+ ">   * nfs_page_find_head_request_locked - find head request associated\n"
+ "> with @page\n"
+ ">   *\n"
+ "\n"
+ "That makes sense to me. I'm applying and will send as an update to\n"
+ "4.14...\n"
+ "\n"
+ "-- \n"
+ "Trond Myklebust\n"
+ "Linux NFS client maintainer, PrimaryData\n"
+ trond.myklebust@primarydata.com
 
-14c0a824fea8c01888222b2a2c24806f17d8731c46631220235887e6aa6f6b03
+fd29774d74ffed9df0e43444cfc160136ecd4a87303d38da9477e38d2aa367ad

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.