rbd discard use 'int' to return discarded length, but the 'len' user
passed is 'uint64', in some case, the ret value will be truncated
and return a negative value which means discard failed. ret -EINVAL
if len > MAX_INT32 to indicate support len <= MAX_INT32 only.
Fixes: http://tracker.ceph.com/issues/16465
Signed-off-by: Huan Zhang <zhanghuan@chinac.com>
(cherry picked from commit
ec259dfde87ed9bc5e7247f311b629707c636895)
{
ImageCtx *ictx = (ImageCtx *)ctx;
tracepoint(librbd, discard_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, ofs, len);
+ if (len > std::numeric_limits<int32_t>::max()) {
+ tracepoint(librbd, discard_exit, -EINVAL);
+ return -EINVAL;
+ }
int r = ictx->aio_work_queue->discard(ofs, len);
tracepoint(librbd, discard_exit, r);
return r;