@@ -625,13 +625,16 @@ std::ostream& operator<<(
625625 * left_paddr right_paddr
626626 */
627627struct overwrite_plan_t {
628- // addresses
628+ // reserved data base of object data
629+ laddr_t data_base;
630+
631+ // addresses about extents
629632 laddr_t pin_begin;
630633 laddr_t pin_end;
631634 paddr_t left_paddr;
632635 paddr_t right_paddr;
633- laddr_t data_begin;
634- laddr_t data_end;
636+ laddr_offset_t data_begin;
637+ laddr_offset_t data_end;
635638 laddr_t aligned_data_begin;
636639 laddr_t aligned_data_end;
637640
@@ -681,7 +684,8 @@ struct overwrite_plan_t {
681684 std::ostream& out,
682685 const overwrite_plan_t & overwrite_plan) {
683686 return out << " overwrite_plan_t("
684- << " pin_begin=" << overwrite_plan.pin_begin
687+ << " data_base=" << overwrite_plan.data_base
688+ << " , pin_begin=" << overwrite_plan.pin_begin
685689 << " , pin_end=" << overwrite_plan.pin_end
686690 << " , left_paddr=" << overwrite_plan.left_paddr
687691 << " , right_paddr=" << overwrite_plan.right_paddr
@@ -697,18 +701,20 @@ struct overwrite_plan_t {
697701 << " )" ;
698702 }
699703
700- overwrite_plan_t (laddr_t offset,
704+ overwrite_plan_t (laddr_t data_base,
705+ objaddr_t offset,
701706 extent_len_t len,
702707 const lba_pin_list_t & pins,
703708 extent_len_t block_size) :
709+ data_base (data_base),
704710 pin_begin (pins.front()->get_key ()),
705711 pin_end(pins.back()->get_key() + pins.back()->get_length()),
706712 left_paddr(pins.front()->get_val()),
707713 right_paddr(pins.back()->get_val()),
708- data_begin(offset),
709- data_end(offset + len),
710- aligned_data_begin(data_begin.get_aligned_laddr(block_size )),
711- aligned_data_end(data_end.get_roundup_laddr(block_size )),
714+ data_begin(data_base + offset),
715+ data_end(data_base + offset + len),
716+ aligned_data_begin(data_begin.get_aligned_laddr()),
717+ aligned_data_end(data_end.get_roundup_laddr()),
712718 left_operation(overwrite_operation_t ::UNKNOWN),
713719 right_operation(overwrite_operation_t ::UNKNOWN),
714720 block_size(block_size),
@@ -1076,14 +1082,14 @@ ObjectDataHandler::clear_ret ObjectDataHandler::trim_data_reservation(
10761082 extent_to_write_list_t (),
10771083 [ctx, size, &object_data, this ](auto &pins, auto &to_write) {
10781084 LOG_PREFIX (ObjectDataHandler::trim_data_reservation);
1079- DEBUGT (" object_data: {}~{}" ,
1080- ctx.t ,
1081- object_data.get_reserved_data_base (),
1082- object_data.get_reserved_data_len ());
1085+ auto data_base = object_data.get_reserved_data_base ();
1086+ auto data_len = object_data.get_reserved_data_len ();
1087+ DEBUGT (" object_data: {}~{}" , ctx.t , data_base, data_len);
1088+ laddr_t aligned_start = (data_base + size).get_aligned_laddr ();
1089+ loffset_t aligned_length =
1090+ data_len - aligned_start.get_byte_distance <loffset_t >(data_base);
10831091 return ctx.tm .get_pins (
1084- ctx.t ,
1085- object_data.get_reserved_data_base () + size,
1086- object_data.get_reserved_data_len () - size
1092+ ctx.t , aligned_start, aligned_length
10871093 ).si_then ([ctx, size, &pins, &object_data, &to_write](auto _pins) {
10881094 _pins.swap (pins);
10891095 ceph_assert (pins.size ());
@@ -1181,12 +1187,13 @@ ObjectDataHandler::clear_ret ObjectDataHandler::trim_data_reservation(
11811187 * optionally on the right.
11821188 */
11831189extent_to_write_list_t get_to_writes_with_zero_buffer (
1190+ laddr_t data_base,
11841191 const extent_len_t block_size,
1185- laddr_t offset, extent_len_t len,
1192+ objaddr_t offset, extent_len_t len,
11861193 std::optional<bufferptr> &&headptr, std::optional<bufferptr> &&tailptr)
11871194{
1188- auto zero_left = offset. get_roundup_laddr ( block_size);
1189- auto zero_right = (offset + len). get_aligned_laddr ( block_size);
1195+ auto zero_left = p2roundup ( offset, ( objaddr_t ) block_size);
1196+ auto zero_right = p2align (offset + len, ( objaddr_t ) block_size);
11901197 auto left = headptr ? (offset - headptr->length ()) : offset;
11911198 auto right = tailptr ?
11921199 (offset + len + tailptr->length ()) :
@@ -1218,7 +1225,8 @@ extent_to_write_list_t get_to_writes_with_zero_buffer(
12181225 assert (bl.length () % block_size == 0 );
12191226 assert (bl.length () == (right - left));
12201227 extent_to_write_list_t ret;
1221- ret.push_back (extent_to_write_t::create_data (left, bl));
1228+ ret.push_back (extent_to_write_t::create_data (
1229+ (data_base + left).checked_to_laddr (), bl));
12221230 return ret;
12231231 } else {
12241232 // reserved section between ends, headptr and tailptr in different extents
@@ -1229,10 +1237,13 @@ extent_to_write_list_t get_to_writes_with_zero_buffer(
12291237 headbl.append_zero (zero_left - left - headbl.length ());
12301238 assert (headbl.length () % block_size == 0 );
12311239 assert (headbl.length () > 0 );
1232- ret.push_back (extent_to_write_t::create_data (left, headbl));
1240+ ret.push_back (extent_to_write_t::create_data (
1241+ (data_base + left).checked_to_laddr (), headbl));
12331242 }
12341243 // reserved zero region
1235- ret.push_back (extent_to_write_t::create_zero (zero_left, zero_right - zero_left));
1244+ ret.push_back (extent_to_write_t::create_zero (
1245+ (data_base + zero_left).checked_to_laddr (),
1246+ zero_right - zero_left));
12361247 assert (ret.back ().len % block_size == 0 );
12371248 assert (ret.back ().len > 0 );
12381249 if (tailptr) {
@@ -1241,7 +1252,8 @@ extent_to_write_list_t get_to_writes_with_zero_buffer(
12411252 tailbl.append_zero (right - zero_right - tailbl.length ());
12421253 assert (tailbl.length () % block_size == 0 );
12431254 assert (tailbl.length () > 0 );
1244- ret.push_back (extent_to_write_t::create_data (zero_right, tailbl));
1255+ ret.push_back (extent_to_write_t::create_data (
1256+ (data_base + zero_right).checked_to_laddr (), tailbl));
12451257 }
12461258 return ret;
12471259 }
@@ -1263,19 +1275,20 @@ extent_to_write_list_t get_to_writes(laddr_t offset, bufferlist &bl)
12631275
12641276ObjectDataHandler::write_ret ObjectDataHandler::overwrite (
12651277 context_t ctx,
1266- laddr_t offset,
1278+ laddr_t data_base,
1279+ objaddr_t offset,
12671280 extent_len_t len,
12681281 std::optional<bufferlist> &&bl,
12691282 lba_pin_list_t &&_pins)
12701283{
12711284 if (bl.has_value ()) {
12721285 assert (bl->length () == len);
12731286 }
1274- overwrite_plan_t overwrite_plan (offset, len, _pins, ctx.tm .get_block_size ());
1287+ overwrite_plan_t overwrite_plan (data_base, offset, len, _pins, ctx.tm .get_block_size ());
12751288 return seastar::do_with (
12761289 std::move (_pins),
12771290 extent_to_write_list_t (),
1278- [ctx, len, offset, overwrite_plan, bl=std::move (bl), this ]
1291+ [ctx, data_base, len, offset, overwrite_plan, bl=std::move (bl), this ]
12791292 (auto &pins, auto &to_write) mutable
12801293 {
12811294 LOG_PREFIX (ObjectDataHandler::overwrite);
@@ -1290,7 +1303,7 @@ ObjectDataHandler::write_ret ObjectDataHandler::overwrite(
12901303 ctx,
12911304 pins.front (),
12921305 overwrite_plan
1293- ).si_then ([ctx, len, offset, overwrite_plan, bl=std::move (bl),
1306+ ).si_then ([ctx, data_base, len, offset, overwrite_plan, bl=std::move (bl),
12941307 &to_write, &pins, this ](auto p) mutable {
12951308 auto &[left_extent, headptr] = p;
12961309 if (left_extent) {
@@ -1304,7 +1317,7 @@ ObjectDataHandler::write_ret ObjectDataHandler::overwrite(
13041317 ctx,
13051318 pins.back (),
13061319 overwrite_plan
1307- ).si_then ([ctx, len, offset,
1320+ ).si_then ([ctx, data_base, len, offset,
13081321 pin_begin=overwrite_plan.pin_begin ,
13091322 pin_end=overwrite_plan.pin_end ,
13101323 bl=std::move (bl), headptr=std::move (headptr),
@@ -1324,11 +1337,12 @@ ObjectDataHandler::write_ret ObjectDataHandler::overwrite(
13241337 }
13251338 splice_extent_to_write (
13261339 to_write,
1327- get_to_writes (write_offset, write_bl));
1340+ get_to_writes ((data_base + write_offset). checked_to_laddr () , write_bl));
13281341 } else {
13291342 splice_extent_to_write (
13301343 to_write,
13311344 get_to_writes_with_zero_buffer (
1345+ data_base,
13321346 ctx.tm .get_block_size (),
13331347 offset,
13341348 len,
@@ -1380,14 +1394,20 @@ ObjectDataHandler::zero_ret ObjectDataHandler::zero(
13801394 object_data,
13811395 p2roundup (offset + len, ctx.tm .get_block_size ())
13821396 ).si_then ([this , ctx, offset, len, &object_data] {
1383- auto logical_offset = object_data.get_reserved_data_base () + offset;
1397+ auto data_base = object_data.get_reserved_data_base ();
1398+ laddr_offset_t l_start = data_base + offset;
1399+ laddr_offset_t l_end = l_start + len;
1400+ laddr_t aligned_start = l_start.get_aligned_laddr ();
1401+ loffset_t aligned_length =
1402+ l_end.get_roundup_laddr ().get_byte_distance <
1403+ loffset_t >(aligned_start);
13841404 return ctx.tm .get_pins (
13851405 ctx.t ,
1386- logical_offset ,
1387- len
1388- ).si_then ([this , ctx, logical_offset , len](auto pins) {
1406+ aligned_start ,
1407+ aligned_length
1408+ ).si_then ([this , ctx, data_base, offset , len](auto pins) {
13891409 return overwrite (
1390- ctx, logical_offset , len,
1410+ ctx, data_base, offset , len,
13911411 std::nullopt , std::move (pins));
13921412 });
13931413 });
@@ -1415,15 +1435,21 @@ ObjectDataHandler::write_ret ObjectDataHandler::write(
14151435 object_data,
14161436 p2roundup (offset + bl.length (), ctx.tm .get_block_size ())
14171437 ).si_then ([this , ctx, offset, &object_data, &bl] {
1418- auto logical_offset = object_data.get_reserved_data_base () + offset;
1438+ auto data_base = object_data.get_reserved_data_base ();
1439+ laddr_offset_t l_start = data_base + offset;
1440+ laddr_offset_t l_end = l_start + bl.length ();
1441+ laddr_t aligned_start = l_start.get_aligned_laddr ();
1442+ loffset_t aligned_length =
1443+ l_end.get_roundup_laddr ().get_byte_distance <
1444+ loffset_t >(aligned_start);
14191445 return ctx.tm .get_pins (
14201446 ctx.t ,
1421- logical_offset ,
1422- bl. length ()
1423- ).si_then ([this , ctx,logical_offset , &bl](
1447+ aligned_start ,
1448+ aligned_length
1449+ ).si_then ([this , ctx, offset, data_base , &bl](
14241450 auto pins) {
14251451 return overwrite (
1426- ctx, logical_offset , bl.length (),
1452+ ctx, data_base, offset , bl.length (),
14271453 bufferlist (bl), std::move (pins));
14281454 });
14291455 });
@@ -1451,17 +1477,21 @@ ObjectDataHandler::read_ret ObjectDataHandler::read(
14511477 ceph_assert (!object_data.is_null ());
14521478 ceph_assert ((obj_offset + len) <= object_data.get_reserved_data_len ());
14531479 ceph_assert (len > 0 );
1454- laddr_t l_start =
1480+ laddr_offset_t l_start =
14551481 object_data.get_reserved_data_base () + obj_offset;
1482+ laddr_offset_t l_end = l_start + len;
1483+ laddr_t aligned_start = l_start.get_aligned_laddr ();
1484+ loffset_t aligned_length =
1485+ l_end.get_roundup_laddr ().get_byte_distance <
1486+ loffset_t >(aligned_start);
14561487 return ctx.tm .get_pins (
14571488 ctx.t ,
1458- l_start ,
1459- len
1460- ).si_then ([FNAME, ctx, l_start, len , &ret](auto _pins) {
1489+ aligned_start ,
1490+ aligned_length
1491+ ).si_then ([FNAME, ctx, l_start, l_end , &ret](auto _pins) {
14611492 // offset~len falls within reserved region and len > 0
14621493 ceph_assert (_pins.size () >= 1 );
14631494 ceph_assert ((*_pins.begin ())->get_key () <= l_start);
1464- auto l_end = l_start + len;
14651495 return seastar::do_with (
14661496 std::move (_pins),
14671497 l_start,
@@ -1480,9 +1510,9 @@ ObjectDataHandler::read_ret ObjectDataHandler::read(
14801510 ceph_assert (l_current < l_end);
14811511 auto pin_len = pin->get_length ();
14821512 assert (pin_len > 0 );
1483- laddr_t l_pin_end = pin_key + pin_len;
1513+ laddr_offset_t l_pin_end = pin_key + pin_len;
14841514 ceph_assert (l_current < l_pin_end);
1485- laddr_t l_current_end = std::min (l_pin_end, l_end);
1515+ laddr_offset_t l_current_end = std::min (l_pin_end, l_end);
14861516 if (pin->get_val ().is_zero ()) {
14871517 DEBUGT (" got {}~{} from zero-pin {}~{}" ,
14881518 ctx.t ,
@@ -1584,19 +1614,24 @@ ObjectDataHandler::fiemap_ret ObjectDataHandler::fiemap(
15841614 ceph_assert (!object_data.is_null ());
15851615 ceph_assert ((obj_offset + len) <= object_data.get_reserved_data_len ());
15861616 ceph_assert (len > 0 );
1587- laddr_t l_start =
1617+ laddr_offset_t l_start =
15881618 object_data.get_reserved_data_base () + obj_offset;
1619+ laddr_offset_t l_end = l_start + len;
1620+ laddr_t aligned_start = l_start.get_aligned_laddr ();
1621+ loffset_t aligned_length =
1622+ l_end.get_roundup_laddr ().get_byte_distance <
1623+ loffset_t >(aligned_start);
15891624 return ctx.tm .get_pins (
15901625 ctx.t ,
1591- l_start ,
1592- len
1626+ aligned_start ,
1627+ aligned_length
15931628 ).si_then ([l_start, len, &object_data, &ret](auto &&pins) {
15941629 ceph_assert (pins.size () >= 1 );
15951630 ceph_assert ((*pins.begin ())->get_key () <= l_start);
15961631 for (auto &&i: pins) {
15971632 if (!(i->get_val ().is_zero ())) {
1598- auto ret_left = std::max (i->get_key (), l_start);
1599- auto ret_right = std::min (
1633+ laddr_offset_t ret_left = std::max (laddr_offset_t ( i->get_key (), 0 ), l_start);
1634+ laddr_offset_t ret_right = std::min (
16001635 i->get_key () + i->get_length (),
16011636 l_start + len);
16021637 assert (ret_right > ret_left);
0 commit comments