Commit 4cfb44df authored by Benjamin Berg's avatar Benjamin Berg Committed by Johannes Berg

um: chan_user: retry partial writes

In the next commit, we are going to set the output FD to be blocking.
Once that is done, the write() may be short if an interrupt happens
while it is writing out data. As such, to properly catch an EINTR error,
we need to retry the write.
Signed-off-by: default avatarBenjamin Berg <benjamin.berg@intel.com>
Link: https://patch.msgid.link/20231018123643.1255813-3-benjamin@sipsolutions.netSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent c6c4cbaa
......@@ -37,11 +37,23 @@ int generic_read(int fd, __u8 *c_out, void *unused)
int generic_write(int fd, const __u8 *buf, size_t n, void *unused)
{
int written = 0;
int err;
CATCH_EINTR(err = write(fd, buf, n));
if (err > 0)
return err;
/* The FD may be in blocking mode, as such, need to retry short writes,
* they may have been interrupted by a signal.
*/
do {
errno = 0;
err = write(fd, buf + written, n - written);
if (err > 0) {
written += err;
continue;
}
} while (err < 0 && errno == EINTR);
if (written > 0)
return written;
else if (errno == EAGAIN)
return 0;
else if (err == 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment