Revision 9666a511 image_creator/disk.py

b/image_creator/disk.py
320 320

  
321 321
        self.out.output("Shrinking image (this may take a while)...", False)
322 322

  
323
        sector_size = self.g.blockdev_getss(self.guestfs_device)
324

  
323 325
        last_part = None
324 326
        fstype = None
325 327
        while True:
......
336 338
                part_del(last_part['part_num'])
337 339
                continue
338 340

  
339
            self.meta['SIZE'] = last_part['part_end'] + 1
341
            # Most disk manipulation programs leave 2048 sectors after the last
342
            # partition
343
            new_size = last_part['part_end'] + 1 + 2048 * sector_size
344
            self.meta['SIZE'] = min(self.meta['SIZE'], new_size)
340 345
            break
341 346

  
342 347
        if not re.match("ext[234]", fstype):
......
353 358
        block_cnt = int(
354 359
            filter(lambda x: x[0] == 'Block count', out)[0][1])
355 360

  
356
        sector_size = self.g.blockdev_getss(self.guestfs_device)
357 361
        start = last_part['part_start'] / sector_size
358 362
        end = start + (block_size * block_cnt) / sector_size - 1
359 363

  
......
398 402
                part_set_id(last_part['part_num'], last_part['id'])
399 403

  
400 404
        new_size = (end + 1) * sector_size
401
        self.out.success("new size is %dMB" % ((new_size + MB - 1) // MB))
405

  
406
        assert (new_size <= self.meta['SIZE'])
402 407

  
403 408
        if self.meta['PARTITION_TABLE'] == 'gpt':
404 409
            ptable = GPTPartitionTable(self.real_device)
405
            self.meta['SIZE'] = ptable.shrink(new_size)
410
            self.meta['SIZE'] = ptable.shrink(new_size, self.meta['SIZE'])
406 411
        else:
407
            self.meta['SIZE'] = new_size
412
            self.meta['SIZE'] = min(new_size + 2048 * sector_size,
413
                                    self.meta['SIZE'])
414

  
415
        self.out.success("new size is %dMB" %
416
                         ((self.meta['SIZE'] + MB - 1) // MB))
408 417

  
409 418
        return self.meta['SIZE']
410 419

  

Also available in: Unified diff