PERFORCE change 145206 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Mon Jul 14 10:21:55 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=145206
Change 145206 by hselasky at 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);
More information about the p4-projects
mailing list