I'm testing my smb client against Samba on FreeBSD. The server's local filesystem has a maximum filesize of 16 Terabytes. If my client attempts a writex with an offset of exactly 16TB then I see ERRnoaccess rather than ERRdiskfull. Looking at some 3.0 sources, it appears reply_write_and_X() assumes that if write_file() returns zero (nwritten) then an access error is presumed and reported. But if the offset is 16TB minus 1 then one byte is written and ERRdiskfull comes back.

For now I put this comment (below) in my client. Hopefully I'm overlooking something obvious. Anyone have other ideas for a workaround (detecting when ERRdiskfull should have been returned)?

* There is a case for which server(s) return
* ERRnoaccess but should return ERRdiskfull: When
* the offset for a write is exactly the server
* file size limit then Samba (at least) thinks
* the reason for zero bytes having been written
* must have been "access denied" from the local
* filesystem. This cannot be easily worked
* around since the server behaviour is
* indistinguishable from actual access denied.
* An incomplete workaround: attempt a 2 byte write
* from "offset-1". (That may require reading at
* offset-1 first.) The flaw is that reading or
* writing at offset-1 could cause an
* unrelated error (due to a byte range lock
* for instance) and we can't presume the
* order servers check errors in.

Reply via email to