- if ((retry > 0 && stat == -1 && errno == EBUSY)) {
- berrno be;
- Dmsg4(100, "===== read retry=%d stat=%d errno=%d: ERR=%s\n",
- retry, stat, errno, be.bstrerror());
- bmicrosleep(10, 0); /* pause a bit if busy or lots of errors */
- dev->clrerror(-1);
- }
- stat = dev->read(block->buf, (size_t)block->buf_len);
+ retry = 0;
+
+ do {
+ if ((retry > 0 && stat == -1 && errno == EBUSY)) {
+ berrno be;
+ Dmsg4(100, "===== read retry=%d stat=%d errno=%d: ERR=%s\n",
+ retry, stat, errno, be.bstrerror());
+ bmicrosleep(10, 0); /* pause a bit if busy or lots of errors */
+ dev->clrerror(-1);
+ }
+ stat = dev->read(block->buf + data_len, (size_t)(block->buf_len - data_len));
+ if (stat > 0)
+ data_len += stat;
+
+ } while (stat == -1 && (errno == EBUSY || errno == EINTR || errno == EIO) && retry++ < 3);
+
+ } while (data_len < block->buf_len && stat > 0 && dev->dev_type == B_FIFO_DEV);