@@ -3786,7 +3786,7 @@ int BlueFS::truncate(FileWriter *h, uint64_t offset)/*_WF_L*/
37863786 if (offset > fnode.size ) {
37873787 ceph_abort_msg (" truncate up not supported" );
37883788 }
3789- ceph_assert (offset <= fnode. size );
3789+
37903790 _flush_bdev (h);
37913791 {
37923792 std::lock_guard ll (log.lock );
@@ -3795,43 +3795,41 @@ int BlueFS::truncate(FileWriter *h, uint64_t offset)/*_WF_L*/
37953795 vselector->sub_usage (h->file ->vselector_hint , fnode);
37963796 uint64_t x_off = 0 ;
37973797 auto p = fnode.seek (offset, &x_off);
3798- uint64_t cut_off =
3799- (p == fnode.extents .end ()) ? 0 : p2roundup (x_off, alloc_size[p->bdev ]);
3800- uint64_t new_allocated;
3801- if (0 == cut_off) {
3802- // whole pextent to remove
3803- changed_extents = true ;
3804- new_allocated = offset;
3805- } else if (cut_off < p->length ) {
3806- dirty.pending_release [p->bdev ].insert (p->offset + cut_off, p->length - cut_off);
3807- new_allocated = (offset - x_off) + cut_off;
3808- p->length = cut_off;
3809- changed_extents = true ;
3810- ++p;
3811- } else {
3812- ceph_assert (cut_off >= p->length );
3813- new_allocated = (offset - x_off) + p->length ;
3814- // just leave it here
3815- ++p;
3816- }
3817- while (p != fnode.extents .end ()) {
3818- dirty.pending_release [p->bdev ].insert (p->offset , p->length );
3819- p = fnode.extents .erase (p);
3820- changed_extents = true ;
3798+ if (p != fnode.extents .end ()) {
3799+ uint64_t cut_off = p2roundup (x_off, alloc_size[p->bdev ]);
3800+ if (0 == cut_off) {
3801+ // whole pextent to remove
3802+ fnode.allocated = offset;
3803+ changed_extents = true ;
3804+ } else if (cut_off < p->length ) {
3805+ dirty.pending_release [p->bdev ].insert (p->offset + cut_off,
3806+ p->length - cut_off);
3807+ fnode.allocated = (offset - x_off) + cut_off;
3808+ p->length = cut_off;
3809+ changed_extents = true ;
3810+ ++p;
3811+ } else {
3812+ // cut_off > p->length means that we misaligned the extent
3813+ ceph_assert (cut_off == p->length );
3814+ fnode.allocated = (offset - x_off) + p->length ;
3815+ ++p; // leave extent untouched
3816+ }
3817+ while (p != fnode.extents .end ()) {
3818+ dirty.pending_release [p->bdev ].insert (p->offset , p->length );
3819+ p = fnode.extents .erase (p);
3820+ changed_extents = true ;
3821+ }
38213822 }
38223823 if (changed_extents) {
38233824 fnode.size = offset;
3824- fnode.allocated = new_allocated;
38253825 fnode.reset_delta ();
38263826 log.t .op_file_update (fnode);
38273827 // sad, but is_dirty must be set to signal flushing of the log
38283828 h->file ->is_dirty = true ;
3829- } else {
3830- if (offset != fnode.size ) {
3831- fnode.size = offset;
3832- // skipping log.t.op_file_update_inc, it will be done by flush()
3833- h->file ->is_dirty = true ;
3834- }
3829+ } else if (offset != fnode.size ) {
3830+ fnode.size = offset;
3831+ // skipping log.t.op_file_update_inc, it will be done by flush()
3832+ h->file ->is_dirty = true ;
38353833 }
38363834 vselector->add_usage (h->file ->vselector_hint , fnode);
38373835 }
0 commit comments