goto undo_iommu;
        }
  
 -      return kvmgt_guest_init(mdev);
 +      ret = kvmgt_guest_init(mdev);
 +      if (ret)
 +              goto undo_group;
 +
 +      atomic_set(&vgpu->vdev.released, 0);
 +      return ret;
 +
 +undo_group:
-       vfio_unregister_notifier(&mdev->dev, VFIO_GROUP_NOTIFY,
++      vfio_unregister_notifier(mdev_dev(mdev), VFIO_GROUP_NOTIFY,
 +                                      &vgpu->vdev.group_notifier);
  
  undo_iommu:
-       vfio_unregister_notifier(&mdev->dev, VFIO_IOMMU_NOTIFY,
+       vfio_unregister_notifier(mdev_dev(mdev), VFIO_IOMMU_NOTIFY,
                                        &vgpu->vdev.iommu_notifier);
  out:
        return ret;
        if (!handle_valid(vgpu->handle))
                return;
  
 -      vfio_unregister_notifier(mdev_dev(vgpu->vdev.mdev), VFIO_IOMMU_NOTIFY,
 +      if (atomic_cmpxchg(&vgpu->vdev.released, 0, 1))
 +              return;
 +
-       ret = vfio_unregister_notifier(&vgpu->vdev.mdev->dev, VFIO_IOMMU_NOTIFY,
++      ret = vfio_unregister_notifier(mdev_dev(vgpu->vdev.mdev), VFIO_IOMMU_NOTIFY,
                                        &vgpu->vdev.iommu_notifier);
 -      vfio_unregister_notifier(mdev_dev(vgpu->vdev.mdev), VFIO_GROUP_NOTIFY,
 +      WARN(ret, "vfio_unregister_notifier for iommu failed: %d\n", ret);
 +
-       ret = vfio_unregister_notifier(&vgpu->vdev.mdev->dev, VFIO_GROUP_NOTIFY,
++      ret = vfio_unregister_notifier(mdev_dev(vgpu->vdev.mdev), VFIO_GROUP_NOTIFY,
                                        &vgpu->vdev.group_notifier);
 +      WARN(ret, "vfio_unregister_notifier for group failed: %d\n", ret);
  
        info = (struct kvmgt_guest_info *)vgpu->handle;
        kvmgt_guest_exit(info);