'Perform the actual backup operation.
:param backup_path: volume path
:param vol_id: volume id
:param backup_mode: file mode of source volume; \'image\' or \'file\'
:raises: InvalidBackup'

def _do_backup(self, backup_path, vol_id, backup_mode):

    backup_attrs = {'Total    number    of    objects    backed    up': '1'}
    compr_flag = ('yes' if CONF.backup_tsm_compression else 'no')
    backup_cmd = ['dsmc', 'backup']
    if _image_mode(backup_mode):
        backup_cmd.append('image')
    backup_cmd.extend(['-quiet', ('-compression=%s' % compr_flag), ('-password=%s' % self.tsm_password), backup_path])
    (out, err) = utils.execute(run_as_root=True, check_exit_code=False, *backup_cmd)
    success = _check_dsmc_output(out, backup_attrs, exact_match=False)
    if (not success):
        err = (_('backup:    %(vol_id)s    failed    to    obtain    backup    success    notification    from    server.\nstdout:    %(out)s\n    stderr:    %(err)s') % {'vol_id': vol_id, 'out': out, 'err': err})
        LOG.error(err)
        raise exception.InvalidBackup(reason=err)
