'Backup the given volume to TSM.
TSM performs a backup of a volume. The volume_file is used
to determine the path of the block device that TSM will back-up.
:param backup: backup information for volume
:param volume_file: file object representing the volume
:param backup_metadata: whether or not to backup volume metadata
:raises InvalidBackup:'

def backup(self, backup, volume_file, backup_metadata=False):

    if backup_metadata:
        msg = _('Volume    metadata    backup    requested    but    this    driver    does    not    yet    support    this    feature.')
        raise exception.InvalidBackup(reason=msg)
    (volume_path, backup_mode) = _get_volume_realpath(volume_file, backup.volume_id)
    LOG.debug('Starting    backup    of    volume:    %(volume_id)s    to    TSM,    volume    path:    %(volume_path)s,    mode:    %(mode)s.', {'volume_id': backup.volume_id, 'volume_path': volume_path, 'mode': backup_mode})
    backup_path = _create_unique_device_link(backup.id, volume_path, backup.volume_id, backup_mode)
    service_metadata = {'backup_mode': backup_mode, 'backup_path': backup_path}
    backup.service_metadata = json.dumps(service_metadata)
    backup.save()
    try:
        self._do_backup(backup_path, backup.volume_id, backup_mode)
    except processutils.ProcessExecutionError as exc:
        err = (_('backup:    %(vol_id)s    failed    to    run    dsmc    on    %(bpath)s.\nstdout:    %(out)s\n    stderr:    %(err)s') % {'vol_id': backup.volume_id, 'bpath': backup_path, 'out': exc.stdout, 'err': exc.stderr})
        LOG.error(err)
        raise exception.InvalidBackup(reason=err)
    except exception.Error as exc:
        err = (_('backup:    %(vol_id)s    failed    to    run    dsmc    due    to    invalid    arguments    on    %(bpath)s.\nstdout:    %(out)s\n    stderr:    %(err)s') % {'vol_id': backup.volume_id, 'bpath': backup_path, 'out': exc.stdout, 'err': exc.stderr})
        LOG.error(err)
        raise exception.InvalidBackup(reason=err)
    finally:
        _cleanup_device_hardlink(backup_path, volume_path, backup.volume_id)
    LOG.debug('Backup    %s    finished.', backup.id)
