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.