'Copy only extents changed between two points.
If no snapshot is provided, the diff extents will be all those changed
since the rbd volume/base was created, otherwise it will be those
changed since the snapshot was created.'

def _rbd_diff_transfer(self, src_name, src_pool, dest_name, dest_pool, src_user, src_conf, dest_user, dest_conf, src_snap=None, from_snap=None):

    LOG.debug("Performing    differential    transfer    from    '%(src)s'    to    '%(dest)s'", {'src': src_name, 'dest': dest_name})
    src_ceph_args = self._ceph_args(src_user, src_conf, pool=src_pool)
    dest_ceph_args = self._ceph_args(dest_user, dest_conf, pool=dest_pool)
    cmd1 = (['rbd', 'export-diff'] + src_ceph_args)
    if (from_snap is not None):
        cmd1.extend(['--from-snap', from_snap])
    if src_snap:
        path = utils.convert_str(('%s/%s@%s' % (src_pool, src_name, src_snap)))
    else:
        path = utils.convert_str(('%s/%s' % (src_pool, src_name)))
    cmd1.extend([path, '-'])
    cmd2 = (['rbd', 'import-diff'] + dest_ceph_args)
    rbd_path = utils.convert_str(('%s/%s' % (dest_pool, dest_name)))
    cmd2.extend(['-', rbd_path])
    (ret, stderr) = self._piped_execute(cmd1, cmd2)
    if ret:
        msg = (_('RBD    diff    op    failed    -    (ret=%(ret)s    stderr=%(stderr)s)') % {'ret': ret, 'stderr': stderr})
        LOG.info(msg)
        raise exception.BackupRBDOperationFailed(msg)
