From: Ilya Dryomov Date: Wed, 7 Jan 2026 21:37:55 +0000 (+0100) Subject: eod X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=587628ac3e3cea2f92e8d50244a77bdf45d9e6e9;p=ceph-client.git eod --- diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index af0e21149dbc..44f4dd6e98d9 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -3490,16 +3490,31 @@ static void rbd_img_object_requests(struct rbd_img_request *img_req) { struct rbd_device *rbd_dev = img_req->rbd_dev; struct rbd_obj_request *obj_req; + u64 mapping_size; rbd_assert(!img_req->pending.result && !img_req->pending.num_pending); rbd_assert(!need_exclusive_lock(img_req) || __rbd_is_lock_owner(rbd_dev)); + down_read(&rbd_dev->header_rwsem); + mapping_size = rbd_dev->mapping.size; if (rbd_img_is_write(img_req)) { rbd_assert(!img_req->snapc); - down_read(&rbd_dev->header_rwsem); img_req->snapc = ceph_get_snap_context(rbd_dev->header.snapc); - up_read(&rbd_dev->header_rwsem); + } + up_read(&rbd_dev->header_rwsem); + + if (!test_bit(IMG_REQ_CHILD, &img_req->flags)) { + struct request *rq = blk_mq_rq_from_pdu(img_req); + u64 off = (u64)blk_rq_pos(rq) << SECTOR_SHIFT; + u64 len = blk_rq_bytes(rq); + + if (unlikely(off + len > mapping_size)) { + rbd_warn(rbd_dev, "beyond EOD (%llu~%llu > %llu)", + off, len, mapping_size); + img_req->pending.result = -EIO; + return; + } } for_each_obj_request(img_req, obj_req) { @@ -4725,7 +4740,6 @@ static void rbd_queue_workfn(struct work_struct *work) struct request *rq = blk_mq_rq_from_pdu(img_request); u64 offset = (u64)blk_rq_pos(rq) << SECTOR_SHIFT; u64 length = blk_rq_bytes(rq); - u64 mapping_size; int result; /* Ignore/skip any zero-length requests */ @@ -4738,17 +4752,9 @@ static void rbd_queue_workfn(struct work_struct *work) blk_mq_start_request(rq); down_read(&rbd_dev->header_rwsem); - mapping_size = rbd_dev->mapping.size; rbd_img_capture_header(img_request); up_read(&rbd_dev->header_rwsem); - if (offset + length > mapping_size) { - rbd_warn(rbd_dev, "beyond EOD (%llu~%llu > %llu)", offset, - length, mapping_size); - result = -EIO; - goto err_img_request; - } - dout("%s rbd_dev %p img_req %p %s %llu~%llu\n", __func__, rbd_dev, img_request, obj_op_name(op_type), offset, length);