Date: Mon, 14 Jul 2008 10:21:54 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 145206 for review Message-ID: <200807141021.m6EALsHO086213@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=145206 Change 145206 by hselasky@hselasky_laptop001 on 2008/07/14 10:21:08 Revert changes to devfs after advice from PHK. Affected files ... .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_core.h#11 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.c#16 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.h#9 edit .. //depot/projects/usb/src/sys/fs/devfs/devfs_devs.c#9 integrate .. //depot/projects/usb/src/sys/kern/kern_conf.c#9 integrate .. //depot/projects/usb/src/sys/sys/conf.h#9 integrate Differences ... ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_core.h#11 (text+ko) ==== @@ -376,6 +376,7 @@ MALLOC_DECLARE(M_USBHC); extern struct mtx usb2_ref_lock; +extern struct mtx usb2_sym_lock; /* typedefs */ ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.c#16 (text+ko) ==== @@ -52,6 +52,8 @@ #include <sys/ttycom.h> #include <sys/syscallsubr.h> +#include <machine/stdarg.h> + #ifdef USB_DEBUG static int usb2_fifo_debug = 0; @@ -133,8 +135,10 @@ static eventhandler_tag usb2_clone_tag; static void *usb2_old_f_data; static struct fileops *usb2_old_f_ops; +static TAILQ_HEAD(, usb2_symlink) usb2_sym_head; struct mtx usb2_ref_lock; +struct mtx usb2_sym_lock; static uint32_t usb2_path_convert_one(const char **pp) @@ -653,7 +657,7 @@ /* destroy symlink devices, if any */ for (n = 0; n != 2; n++) { if (f->symlink[n]) { - destroy_dev(f->symlink[n]); + usb2_free_symlink(f->symlink[n]); f->symlink[n] = NULL; } } @@ -1093,14 +1097,14 @@ static void usb2_clone(void *arg, USB_UCRED char *name, int namelen, struct cdev **dev) { + enum { + USB_DNAME_LEN = sizeof(USB_DEVICE_NAME) - 1, + }; + if (*dev) { /* someone else has created a device */ return; } - if (strncmp(name, USB_DEVICE_NAME, - sizeof(USB_DEVICE_NAME) - 1)) { - return; - } if (usb2_last_devloc != (uint32_t)(0 - 1)) { /* * XXX can we assume that the clone and open operation is @@ -1108,8 +1112,13 @@ */ DPRINTF(1, "Clone race!\n"); } - usb2_last_devloc = usb2_path_convert(name + - sizeof(USB_DEVICE_NAME) - 1); + if (strcmp(name, USB_DEVICE_NAME)) { + usb2_last_devloc = + usb2_lookup_symlink(name, namelen); + } else { + usb2_last_devloc = + usb2_path_convert(name + USB_DNAME_LEN); + } if (usb2_last_devloc == (uint32_t)(0 - 1)) { /* invalid location */ @@ -1124,6 +1133,9 @@ usb2_dev_init(void *arg) { mtx_init(&usb2_ref_lock, "USB ref mutex", NULL, MTX_DEF); + mtx_init(&usb2_sym_lock, "USB sym mutex", NULL, MTX_DEF); + TAILQ_INIT(&usb2_sym_head); + /* check the UGEN methods */ usb2_fifo_check_methods(&usb2_ugen_methods); return; @@ -1939,10 +1951,10 @@ */ if (n & 1) { f_rx->symlink[n / 2] = - make_dev_symlink(src, "%s", buf); + usb2_alloc_symlink(src, "%s", buf); } else { f_tx->symlink[n / 2] = - make_dev_symlink(src, "%s", buf); + usb2_alloc_symlink(src, "%s", buf); } DPRINTF(0, "Symlink: %s -> %s\n", buf, src); } @@ -2259,3 +2271,92 @@ usb2_fifo_wakeup(f); return; } + +/*------------------------------------------------------------------------* + * usb2_alloc_symlink + * + * Return values: + * NULL: Failure + * Else: Pointer to symlink entry + *------------------------------------------------------------------------*/ +struct usb2_symlink * +usb2_alloc_symlink(const char *target, const char *fmt,...) +{ + struct usb2_symlink *ps; + va_list ap; + + ps = malloc(sizeof(*ps), M_USBDEV, M_WAITOK); + if (ps == NULL) { + return (ps); + } + strlcpy(ps->dst_path, target, sizeof(ps->dst_path)); + ps->dst_len = strlen(ps->dst_path); + + va_start(ap, fmt); + vsnrprintf(ps->src_path, + sizeof(ps->src_path), 32, fmt, ap); + va_end(ap); + ps->src_len = strlen(ps->src_path); + + mtx_lock(&usb2_sym_lock); + TAILQ_INSERT_TAIL(&usb2_sym_head, ps, sym_entry); + mtx_unlock(&usb2_sym_lock); + return (ps); +} + +/*------------------------------------------------------------------------* + * usb2_free_symlink + *------------------------------------------------------------------------*/ +void +usb2_free_symlink(struct usb2_symlink *ps) +{ + if (ps == NULL) { + return; + } + mtx_lock(&usb2_sym_lock); + TAILQ_REMOVE(&usb2_sym_head, ps, sym_entry); + mtx_unlock(&usb2_sym_lock); + + free(ps, M_USBDEV); + return; +} + +/*------------------------------------------------------------------------* + * usb2_lookup_symlink + * + * Return value: + * Numerical device location + *------------------------------------------------------------------------*/ +uint32_t +usb2_lookup_symlink(const char *src_ptr, uint8_t src_len) +{ + enum { + USB_DNAME_LEN = sizeof(USB_DEVICE_NAME) - 1, + }; + struct usb2_symlink *ps; + uint32_t temp; + + mtx_lock(&usb2_sym_lock); + + TAILQ_FOREACH(ps, &usb2_sym_head, sym_entry) { + + if (src_len != ps->src_len) + continue; + + if (memcmp(ps->src_path, src_ptr, src_len)) + continue; + + if (USB_DNAME_LEN > ps->dst_len) + continue; + + if (strncmp(ps->dst_path, USB_DEVICE_NAME, USB_DNAME_LEN)) + continue; + + temp = usb2_path_convert(ps->dst_path + USB_DNAME_LEN); + mtx_unlock(&usb2_sym_lock); + + return (temp); + } + mtx_unlock(&usb2_sym_lock); + return (0 - 1); +} ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_dev.h#9 (text+ko) ==== @@ -44,6 +44,16 @@ typedef int (usb2_fifo_ioctl_t)(struct usb2_fifo *fifo, u_long cmd, void *addr, int fflags, struct thread *td); typedef void (usb2_fifo_cmd_t)(struct usb2_fifo *fifo); +struct usb2_symlink { + TAILQ_ENTRY(usb2_symlink) sym_entry; + char src_path[32]; /* Source path - including terminating + * zero */ + char dst_path[32]; /* Destination path - including + * terminating zero */ + uint8_t src_len; /* String length */ + uint8_t dst_len; /* String length */ +}; + /* * Locking note for the following functions. All the * "usb2_fifo_cmd_t" functions are called locked. The others are @@ -72,7 +82,7 @@ struct cv cv_io; struct cv cv_drain; struct usb2_fifo_methods *methods; - struct cdev *symlink[2]; /* our symlinks */ + struct usb2_symlink *symlink[2];/* our symlinks */ struct proc *async_p; /* process that wants SIGIO */ struct usb2_fs_endpoint *fs_ep_ptr; struct usb2_device *udev; @@ -127,5 +137,8 @@ void usb2_fifo_reset(struct usb2_fifo *f); int usb2_check_thread_perm(struct usb2_device *udev, struct thread *td, int fflags, uint8_t iface_index, uint8_t ep_index); void usb2_fifo_wakeup(struct usb2_fifo *f); +struct usb2_symlink *usb2_alloc_symlink(const char *target, const char *fmt,...); +void usb2_free_symlink(struct usb2_symlink *ps); +uint32_t usb2_lookup_symlink(const char *src_ptr, uint8_t src_len); #endif /* _USB2_DEV_H_ */ ==== //depot/projects/usb/src/sys/fs/devfs/devfs_devs.c#9 (text+ko) ==== @@ -350,6 +350,7 @@ struct cdev_priv *cdp; struct devfs_dirent *de; struct devfs_dirent *dd; + struct cdev *pdev; int j; char *q, *s; @@ -435,9 +436,10 @@ de->de_gid = 0; de->de_mode = 0755; de->de_dirent->d_type = DT_LNK; - j = strlen(cdp->cdp_c.si_symlink) + 1; + pdev = cdp->cdp_c.si_parent; + j = strlen(pdev->si_name) + 1; de->de_symlink = malloc(j, M_DEVFS, M_WAITOK); - bcopy(cdp->cdp_c.si_symlink, de->de_symlink, j); + bcopy(pdev->si_name, de->de_symlink, j); } else { de->de_uid = cdp->cdp_c.si_uid; de->de_gid = cdp->cdp_c.si_gid; ==== //depot/projects/usb/src/sys/kern/kern_conf.c#9 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/kern/kern_conf.c,v 1.218 2008/06/16 17:34:59 kib Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/kern_conf.c,v 1.219 2008/07/11 11:22:19 kib Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -690,7 +690,7 @@ printf("WARNING: Device name truncated! (%s)\n", dev->__si_namebuf); } - + dev->si_flags |= SI_NAMED; #ifdef MAC if (cr != NULL) @@ -758,6 +758,7 @@ dev_dependsl(struct cdev *pdev, struct cdev *cdev) { + cdev->si_parent = pdev; cdev->si_flags |= SI_CHILD; LIST_INSERT_HEAD(&pdev->si_children, cdev, si_siblings); } @@ -772,81 +773,36 @@ dev_unlock(); } -static struct cdev * -make_dev_alias_symlink(const char *target, struct cdev *pdev, const char *fmt, va_list ap) +struct cdev * +make_dev_alias(struct cdev *pdev, const char *fmt, ...) { struct cdev *dev; + va_list ap; int i; + KASSERT(pdev != NULL, ("NULL pdev")); dev = devfs_alloc(); dev_lock(); dev->si_flags |= SI_ALIAS; dev->si_flags |= SI_NAMED; - i = sizeof(dev->__si_namebuf); - i -= vsnrprintf(dev->__si_namebuf, i, 32, fmt, ap); - if (i < 1) { + va_start(ap, fmt); + i = vsnrprintf(dev->__si_namebuf, sizeof dev->__si_namebuf, 32, fmt, ap); + if (i > (sizeof dev->__si_namebuf - 1)) { printf("WARNING: Device name truncated! (%s)\n", dev->__si_namebuf); - i = 1; } + va_end(ap); - if (target == NULL) { - /* use parent device name */ - dev->si_symlink = pdev->si_name; - } else { - if (i < 2) { - i = 1; - } else { - /* make sure there is a NUL between the strings */ - i --; - } - /* use specified target name */ - dev->si_symlink = dev->__si_namebuf + - sizeof(dev->__si_namebuf) - i; - i -= strlcpy(dev->si_symlink, target, i); - if (i < 1) { - printf("WARNING: Symlink name truncated! (%s)\n", - dev->si_symlink); - i = 1; - } - } devfs_create(dev); + dev_dependsl(pdev, dev); clean_unrhdrl(devfs_inos); dev_unlock(); - if (pdev != NULL) { - dev_depends(pdev, dev); - } - notify_create(dev); return (dev); } -struct cdev * -make_dev_alias(struct cdev *pdev, const char *fmt, ...) -{ - struct cdev *dev; - va_list ap; - - va_start(ap, fmt); - dev = make_dev_alias_symlink(NULL, pdev, fmt, ap); - va_end(ap); - return (dev); -} - -struct cdev * -make_dev_symlink(const char *target, const char *fmt, ...) -{ - struct cdev *dev; - va_list ap; - - va_start(ap, fmt); - dev = make_dev_alias_symlink(target, NULL, fmt, ap); - va_end(ap); - return (dev); -} - static void destroy_devl(struct cdev *dev) { ==== //depot/projects/usb/src/sys/sys/conf.h#9 (text+ko) ==== @@ -77,7 +77,7 @@ LIST_ENTRY(cdev) si_clone; LIST_HEAD(, cdev) si_children; LIST_ENTRY(cdev) si_siblings; - char *si_symlink; /* symbolic link name */ + struct cdev *si_parent; char *si_name; void *si_drv1, *si_drv2; struct cdevsw *si_devsw; @@ -273,8 +273,6 @@ struct ucred *_cr, uid_t _uid, gid_t _gid, int _mode, const char *_fmt, ...) __printflike(8, 9); struct cdev *make_dev_alias(struct cdev *_pdev, const char *_fmt, ...) __printflike(2, 3); -struct cdev *make_dev_symlink(const char *target, const char *fmt, ...) __printflike(2, 3); - void dev_lock(void); void dev_unlock(void); void setconf(void);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200807141021.m6EALsHO086213>
