git: fad756fd200b - main - cuse: Use make_dev_s() to create client devices
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 30 Sep 2026 09:51:29 UTC
The branch main has been updated by christos:
URL: https://cgit.FreeBSD.org/src/commit/?id=fad756fd200bf988861eb80146392661a887ab71
commit fad756fd200bf988861eb80146392661a887ab71
Author: Christos Margiolis <christos@FreeBSD.org>
AuthorDate: 2026-09-30 09:50:03 +0000
Commit: Christos Margiolis <christos@FreeBSD.org>
CommitDate: 2026-09-30 09:50:03 +0000
cuse: Use make_dev_s() to create client devices
make_dev_s() sets si_drv1 before the node is published in devfs, which
avoids a race where cuse_client_open() could see it as NULL. It also now
reports finer-grained errors on failure, instead of only ENOMEM.
While here, drop the NULL checks on kern_dev in cuse_server_free_dev(),
since a device is only added to the server's list once it has been
created.
MFC after: 1 week
Sponsored by: The FreeBSD Foundation
Reviewed by: kib
Differential Revision: https://reviews.freebsd.org/D59874
---
sys/fs/cuse/cuse.c | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/sys/fs/cuse/cuse.c b/sys/fs/cuse/cuse.c
index 52a1693a45ce..0bd8cc0d5dac 100644
--- a/sys/fs/cuse/cuse.c
+++ b/sys/fs/cuse/cuse.c
@@ -636,8 +636,7 @@ cuse_server_free_dev(struct cuse_server_dev *pcsd)
/* prevent creation of more devices */
cuse_server_lock(pcs);
- if (pcsd->kern_dev != NULL)
- pcsd->kern_dev->si_drv1 = NULL;
+ pcsd->kern_dev->si_drv1 = NULL;
TAILQ_FOREACH(pcc, &pcs->hcli, entry) {
if (pcc->server_dev == pcsd)
@@ -645,11 +644,8 @@ cuse_server_free_dev(struct cuse_server_dev *pcsd)
}
cuse_server_unlock(pcs);
- /* destroy device, if any */
- if (pcsd->kern_dev != NULL) {
- /* destroy device synchronously */
- destroy_dev(pcsd->kern_dev);
- }
+ /* destroy device synchronously */
+ destroy_dev(pcsd->kern_dev);
free(pcsd, M_CUSE);
}
@@ -1078,6 +1074,7 @@ cuse_server_ioctl(struct cdev *dev, unsigned long cmd,
struct cuse_create_dev *pcd;
struct cuse_server_dev *pcsd;
struct cuse_data_chunk *pchk;
+ struct make_dev_args args;
int n;
case CUSE_IOCTL_GET_COMMAND:
@@ -1260,16 +1257,19 @@ cuse_server_ioctl(struct cdev *dev, unsigned long cmd,
pcsd->user_dev = pcd->dev;
- pcsd->kern_dev = make_dev_credf(MAKEDEV_CHECKNAME,
- &cuse_client_devsw, 0, NULL, pcd->user_id, pcd->group_id,
- pcd->permissions, "%s", pcd->devname);
+ make_dev_args_init(&args);
+ args.mda_flags = MAKEDEV_CHECKNAME;
+ args.mda_devsw = &cuse_client_devsw;
+ args.mda_uid = pcd->user_id;
+ args.mda_gid = pcd->group_id;
+ args.mda_mode = pcd->permissions;
+ args.mda_si_drv1 = pcsd;
- if (pcsd->kern_dev == NULL) {
+ error = make_dev_s(&args, &pcsd->kern_dev, "%s", pcd->devname);
+ if (error != 0) {
free(pcsd, M_CUSE);
- error = ENOMEM;
break;
}
- pcsd->kern_dev->si_drv1 = pcsd;
cuse_server_lock(pcs);
TAILQ_INSERT_TAIL(&pcs->hdev, pcsd, entry);