'Restore volume from backup using diff transfer if possible.
Attempts a differential restore and reverts to full copy if diff fails.'

def _restore_volume(self, backup, volume, volume_file):

    length = (int(volume.size) * units.Gi)
    base_name = self._get_backup_base_name(backup.volume_id, diff_format=True)
    with rbd_driver.RADOSClient(self, backup.container) as client:
        (diff_allowed, restore_point) = self._diff_restore_allowed(base_name, backup, volume, volume_file, client)
    do_full_restore = True
    if diff_allowed:
        try:
            LOG.debug('Attempting    differential    restore.')
            self._diff_restore_rbd(backup, volume_file, volume.name, restore_point, length)
            do_full_restore = False
        except exception.BackupRBDOperationFailed:
            LOG.debug('Forcing    full    restore    to    volume    %s.', volume.id)
    if do_full_restore:
        LOG.debug('Running    full    restore.')
        self._full_restore(backup, volume_file, volume.name, length, src_snap=restore_point)
