]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
eod
authorIlya Dryomov <idryomov@gmail.com>
Wed, 7 Jan 2026 21:37:55 +0000 (22:37 +0100)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 7 Jan 2026 21:40:53 +0000 (22:40 +0100)
drivers/block/rbd.c

index af0e21149dbc9e2230ccdc624ae3616448c23d51..44f4dd6e98d990b8f3172c1693f9c8ac67f21afa 100644 (file)
@@ -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);