aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/evdev/cdev.c
diff options
context:
space:
mode:
authorVladimir Kondratyev <wulf@FreeBSD.org>2020-04-21 22:38:14 +0000
committerVladimir Kondratyev <wulf@FreeBSD.org>2021-01-07 23:18:42 +0000
commit3b8c8b35de3a1a8a24169d144189b6a4db82ce10 (patch)
tree0c4ab1221f08828654358da47415420372c48de7 /sys/dev/evdev/cdev.c
parentd276eae674d22214d6a58d1f4871053ceb0cb9f5 (diff)
Diffstat (limited to 'sys/dev/evdev/cdev.c')
-rw-r--r--sys/dev/evdev/cdev.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/sys/dev/evdev/cdev.c b/sys/dev/evdev/cdev.c
index c4550362ebce..ec60a12dbf2d 100644
--- a/sys/dev/evdev/cdev.c
+++ b/sys/dev/evdev/cdev.c
@@ -126,19 +126,20 @@ evdev_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
mtx_init(&client->ec_buffer_mtx, "evclient", "evdev", MTX_DEF);
knlist_init_mtx(&client->ec_selp.si_note, &client->ec_buffer_mtx);
+ ret = EVDEV_LIST_LOCK_SIG(evdev);
+ if (ret != 0)
+ goto out;
/* Avoid race with evdev_unregister */
- EVDEV_LIST_LOCK(evdev);
if (dev->si_drv1 == NULL)
ret = ENODEV;
else
ret = evdev_register_client(evdev, client);
-
- if (ret != 0)
- evdev_revoke_client(client);
EVDEV_LIST_UNLOCK(evdev);
-
+out:
if (ret == 0)
ret = devfs_set_cdevpriv(client, evdev_dtor);
+ else
+ client->ec_revoked = true;
if (ret != 0) {
debugf(client, "cannot register evdev client");