Agreed, but then why would it ever return a partially written result in this interface?  I can think of a few scenarios:

* The block device has disappeared, in which case it could return `Disconnected` and no further writes are possible.
* It has written some bytes and then the blocked thread has been cancelled via `Lwt.cancel`
* The write is taking a very long time and has triggered an Lwt timeout.  This is basically a more advanced version of the previous one (it just raises `Lwt.Timeout` when this happens).

In the case of the latter two, it would be useful if the `Error` return did explicitly signal how many bytes had been written.  Or should we consider another way to specify timeouts/interrupts on the device?  I'm of course in favour of hiding the details of the `select` loop where possible.