@@ -383,6 +383,33 @@ static long vfio_group_fops_unl_ioctl(struct file *filep,
383
383
}
384
384
}
385
385
386
+ int vfio_device_block_group (struct vfio_device * device )
387
+ {
388
+ struct vfio_group * group = device -> group ;
389
+ int ret = 0 ;
390
+
391
+ mutex_lock (& group -> group_lock );
392
+ if (group -> opened_file ) {
393
+ ret = - EBUSY ;
394
+ goto out_unlock ;
395
+ }
396
+
397
+ group -> cdev_device_open_cnt ++ ;
398
+
399
+ out_unlock :
400
+ mutex_unlock (& group -> group_lock );
401
+ return ret ;
402
+ }
403
+
404
+ void vfio_device_unblock_group (struct vfio_device * device )
405
+ {
406
+ struct vfio_group * group = device -> group ;
407
+
408
+ mutex_lock (& group -> group_lock );
409
+ group -> cdev_device_open_cnt -- ;
410
+ mutex_unlock (& group -> group_lock );
411
+ }
412
+
386
413
static int vfio_group_fops_open (struct inode * inode , struct file * filep )
387
414
{
388
415
struct vfio_group * group =
@@ -405,6 +432,11 @@ static int vfio_group_fops_open(struct inode *inode, struct file *filep)
405
432
goto out_unlock ;
406
433
}
407
434
435
+ if (group -> cdev_device_open_cnt ) {
436
+ ret = - EBUSY ;
437
+ goto out_unlock ;
438
+ }
439
+
408
440
/*
409
441
* Do we need multiple instances of the group open? Seems not.
410
442
*/
@@ -479,6 +511,7 @@ static void vfio_group_release(struct device *dev)
479
511
mutex_destroy (& group -> device_lock );
480
512
mutex_destroy (& group -> group_lock );
481
513
WARN_ON (group -> iommu_group );
514
+ WARN_ON (group -> cdev_device_open_cnt );
482
515
ida_free (& vfio .group_ida , MINOR (group -> dev .devt ));
483
516
kfree (group );
484
517
}
0 commit comments