> From: Eric Farman <farman@xxxxxxxxxxxxx> > Sent: Thursday, October 20, 2022 12:22 AM > > @@ -101,15 +101,20 @@ static int vfio_ccw_mdev_probe(struct > mdev_device *mdev) > { > struct subchannel *sch = to_subchannel(mdev->dev.parent); > struct vfio_ccw_parent *parent = dev_get_drvdata(&sch->dev); > - struct vfio_ccw_private *private = dev_get_drvdata(&parent->dev); > + struct vfio_ccw_private *private; > int ret; > > - if (private->state == VFIO_CCW_STATE_NOT_OPER) > - return -ENODEV; Not familiar with ccw but just want to double confirm this removal is intentional w/o side-effect? > + private = vfio_ccw_alloc_private(sch); > + if (!private) > + return -ENOMEM; > > ret = vfio_init_device(&private->vdev, &mdev->dev, > &vfio_ccw_dev_ops); > - if (ret) > + if (ret) { > + kfree(private); > return ret; > + } > + > + dev_set_drvdata(&parent->dev, private); > > VFIO_CCW_MSG_EVENT(2, "sch %x.%x.%04x: create\n", > sch->schid.cssid, > @@ -123,6 +128,7 @@ static int vfio_ccw_mdev_probe(struct mdev_device > *mdev) > return 0; > > err_put_vdev: > + dev_set_drvdata(&parent->dev, NULL); No need to set drvdata to NULL, iiuc