How does the client manage NFS3ERR_NOSPC ?
Subsystems (2)
Hi List,
I ran a stupid test (using the kernel's knfsd) : I filled up completely a filesystem with a few big file. When it was 100% full (no free block at all), I ran a dd on it. The dd said it could write 793 blocks of size 1mb and failed on IO error. At the end, I could see an empty file in the NFS exported tree. Question is :
- why did I get EIO and not ENOSPC ?
- why did dd say "hey, I could write 793 blocks" when it wrote
nothing (and could not write anything).
Do you have an idea on that ?
Regards
Philippe
T24gTW9uLCAyMDEyLTAzLTA1IGF0IDE4OjE2ICswMTAwLCBERU5JRUwgUGhpbGlwcGUgd3JvdGU6 DQo+IEhpIExpc3QsDQo+IA0KPiBJIHJhbiBhIHN0dXBpZCB0ZXN0ICh1c2luZyB0aGUga2VybmVs J3Mga25mc2QpIDogSSBmaWxsZWQgdXAgY29tcGxldGVseSANCj4gYSBmaWxlc3lzdGVtIHdpdGgg YSBmZXcgYmlnIGZpbGUuIFdoZW4gaXQgd2FzIDEwMCUgZnVsbCAobm8gZnJlZSBibG9jayANCj4g YXQgYWxsKSwgSSByYW4gYSBkZCBvbiBpdC4NCj4gVGhlIGRkIHNhaWQgaXQgY291bGQgd3JpdGUg NzkzIGJsb2NrcyBvZiBzaXplIDFtYiAgYW5kIGZhaWxlZCBvbiBJTyANCj4gZXJyb3IuIEF0IHRo ZSBlbmQsIEkgY291bGQgc2VlIGFuIGVtcHR5IGZpbGUgaW4gdGhlIE5GUyBleHBvcnRlZCB0cmVl Lg0KPiBRdWVzdGlvbiBpcyA6DQo+ICAgICAtIHdoeSBkaWQgSSBnZXQgRUlPIGFuZCBub3QgRU5P U1BDID8NCg0KRGlkIHRoZSBzZXJ2ZXIgYWN0dWFsbHkgcmV0dXJuIE5GUzNFUlJfTk9TUEMsIG9y IGRpZCBpdCByZXR1cm4gc29tZXRoaW5nDQplbHNlPyBJZiB0aGUgc2VydmVyIHJldHVybnMgTkZT M0VSUl9OT1NQQywgdGhlbiBJJ2QgZXhwZWN0IHRoZSBjbGllbnQgdG8NCnRyYW5zbGF0ZSB0aGF0 IGFzIEVOT1NQQy4NCg0KTm90ZSB0aGF0IGlmIHlvdSB3ZXJlIHVzaW5nIHNvZnQgbW91bnRzIChi b28hIGhpc3MhKSwgdGhlbiB0aGUgY2xpZW50DQptYXkgaGF2ZSB0aW1lZCBvdXQgd2hpbGUgdGhl IHNlcnZlciB3YXMgdHJ5aW5nIHRvIGZpbmQgZnJlZSBzcGFjZSBvbiB0aGUNCmZpbGVzeXN0ZW0u IEluIHRoYXQgY2FzZSwgSSdkIGluZGVlZCBleHBlY3QgRUlPLg0KDQo+ICAgICAtIHdoeSBkaWQg ZGQgc2F5ICJoZXksIEkgY291bGQgd3JpdGUgNzkzIGJsb2NrcyIgd2hlbiBpdCB3cm90ZSANCj4g bm90aGluZyAoYW5kIGNvdWxkIG5vdCB3cml0ZSBhbnl0aGluZykuDQo+IERvIHlvdSBoYXZlIGFu IGlkZWEgb24gdGhhdCA/DQoNClRoZSBjbGllbnQgY2FuJ3QgcHJlZGljdCB0aGUgc3RhdGUgb2Yg dGhlIHNlcnZlci4NCg0KSXQgd2lsbCBmaWxsIHVwIGl0cyBjYWNoZSwgYW5kIHRoZW4gb25seSBm aW5kIG91dCBhYm91dCB0aGUgRU5PU1BDIGVycm9yDQp3aGVuIGl0IHRyaWVzIHRvIHdyaXRlIG91 dCB0aGUgZGF0YS4gVGhhdCBpcyB0aGUgY29ycmVjdCB3YXkgdG8gb3B0aW1pc2UNCnRoZSBjbGll bnQgYmVoYXZpb3VyIHdoZW4gd2UncmUgZGVhbGluZyB3aXRoIHdoYXQgc2hvdWxkIGJlIGEgdmVy eSByYXJlDQpjb25kaXRpb24uDQoNClRyb25kDQotLSANClRyb25kIE15a2xlYnVzdA0KTGludXgg TkZTIGNsaWVudCBtYWludGFpbmVyDQoNCk5ldEFwcA0KVHJvbmQuTXlrbGVidXN0QG5ldGFwcC5j b20NCnd3dy5uZXRhcHAuY29tDQoNCg==
Quoted 11 lines · Myklebust, Trond [[email protected]] wrote:
Quoted 9 lines · DENIEL Philippe
Hi List,
I ran a stupid test (using the kernel's knfsd) : I filled up completely a filesystem with a few big file. When it was 100% full (no free block at all), I ran a dd on it.
The dd said it could write 793 blocks of size 1mb and failed on IO error. At the end, I could see an empty file in the NFS exported tree. Question is :
- why did I get EIO and not ENOSPC ?
Quoted 3 lines
Did the server actually return
NFS3ERR_NOSPC, or did it return something else? If the server returnsNFS3ERR_NOSPC, then I'd expect the client to translate that as ENOSPC.
AFAIR, the server returns ENOSPC but the Linux client has a bug under certain cases that returns it as EIO. Filed a bug and Neil sent a patch but I have not tested it yet.
I tried with various versions and they gave some differing results. I think in one case fsync() got ENOSPC but close() got EIO (or the other way around?)
Regards, Malahal.
PS: Easy way to reproduce the problem, just run the following:
dd if=/dev/zero of=./testfile conv=fdatasync