If we have a read that hits EOF, we need to do a short read. Previously
we would zero the buffer if we were completely withing the file, but
we also need to zero things if we overlap with EOF. This fixes a hang
of mpi-fsx on ceph-fuse. Triggered/tested by
LibCephFS.MulticlientHoleEOF.
Fixes: #5368
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
}
// short read?
if (r >= 0 && r < wanted) {
- if (pos + left <= in->size) {
- // hole, zero and return.
- bufferptr z(left);
+ if (pos < in->size) {
+ // zero up to known EOF
+ int some = MIN(in->size - pos, left);
+ bufferptr z(some);
z.zero();
bl->push_back(z);
- read += left;
- return read;
+ read += some;
+ pos += some;
+ left -= some;
+ if (left == 0)
+ return read;
}
// reverify size