Commit b79e4a0a authored by Xiubo Li's avatar Xiubo Li Committed by Ilya Dryomov
Browse files

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: default avatarXiubo Li <xiubli@redhat.com>
Reviewed-by: default avatarIlya Dryomov <idryomov@gmail.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent f48e0342
Loading
Loading
Loading
Loading
+4 −13
Original line number Diff line number Diff line
@@ -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);