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==
Myklebust, Trond [[email protected]] wrote:
> On Mon, 2012-03-05 at 18:16 +0100, DENIEL Philippe wrote:
> > 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 ?
>
> Did the server actually return NFS3ERR_NOSPC, or did it return something
> else? If the server returns NFS3ERR_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