Your https://github.com/SpliFF/python-ioctl/blob/master/example.py#L33 hat the source and destination swapped:
ret = fcntl.ioctl(srcfd.fileno(), BTRFS_IOC_CLONE, dstfd.fileno())
See man:ioctl_ficlonerange(2):
int ioctl(int dest_fd, FICLONE, int src_fd);