Ok, just for the record, I wrote a more precise error display routine, identifying what's going on, and fiddled with it with a few more devices. My findings are that the behavior is different from device to device. Some won't open at all with my sana io request, others will open but report error when I send an io request, others report an error outside the defined sana errors (atapi.device IIRC), and one (serial.device) even accepted the request and started waiting (would probably get error if I had something connected to the serial port though).
Bottom line, they're interpreting the io request as if it were they're own and sometimes values are accepted.