mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-04 04:04:19 +00:00
libceph: remove MAX_EXTENTS check for sparse reads
There is no any limit for the extent array size and it's possible that when reading with a large size contents the total number of extents will exceed 4096. Then the messager will fail by reseting the connection and keeps resending the inflight IOs infinitely. [ idryomov: adjust error message ] Link: https://tracker.ceph.com/issues/62081 Signed-off-by: Xiubo Li <xiubli@redhat.com> Reviewed-by: Ilya Dryomov <idryomov@gmail.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
f48e0342a7
commit
b79e4a0aa9
@ -5850,8 +5850,6 @@ static inline void convert_extent_map(struct ceph_sparse_read *sr)
|
||||
}
|
||||
#endif
|
||||
|
||||
#define MAX_EXTENTS 4096
|
||||
|
||||
static int osd_sparse_read(struct ceph_connection *con,
|
||||
struct ceph_msg_data_cursor *cursor,
|
||||
char **pbuf)
|
||||
@ -5882,23 +5880,16 @@ static int osd_sparse_read(struct ceph_connection *con,
|
||||
|
||||
if (count > 0) {
|
||||
if (!sr->sr_extent || count > sr->sr_ext_len) {
|
||||
/*
|
||||
* Apply a hard cap to the number of extents.
|
||||
* If we have more, assume something is wrong.
|
||||
*/
|
||||
if (count > MAX_EXTENTS) {
|
||||
dout("%s: OSD returned 0x%x extents in a single reply!\n",
|
||||
__func__, count);
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
|
||||
/* no extent array provided, or too short */
|
||||
kfree(sr->sr_extent);
|
||||
sr->sr_extent = kmalloc_array(count,
|
||||
sizeof(*sr->sr_extent),
|
||||
GFP_NOIO);
|
||||
if (!sr->sr_extent)
|
||||
if (!sr->sr_extent) {
|
||||
pr_err("%s: failed to allocate %u extents\n",
|
||||
__func__, count);
|
||||
return -ENOMEM;
|
||||
}
|
||||
sr->sr_ext_len = count;
|
||||
}
|
||||
ret = count * sizeof(*sr->sr_extent);
|
||||
|
Loading…
Reference in New Issue
Block a user