PERFORCE change 158685 for review

Hans Petter Selasky hselasky at FreeBSD.org
Wed Mar 4 12:11:12 PST 2009


http://perforce.freebsd.org/chv.cgi?CH=158685

Change 158685 by hselasky at hselasky_laptop001 on 2009/03/04 20:10:25

	
	Make sure that userland applications wake up from select
	when the device is gone! Else they might end up sleeping
	forever.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb/usb_dev.c#6 edit
.. //depot/projects/usb/src/sys/fs/devfs/devfs_vnops.c#16 edit
.. //depot/projects/usb/src/sys/kern/kern_conf.c#13 edit
.. //depot/projects/usb/src/sys/sys/conf.h#16 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb/usb_dev.c#6 (text+ko) ====

@@ -1077,11 +1077,11 @@
 
 	err = devfs_get_cdevpriv((void **)&cpd);
 	if (err != 0)
-		return (err);
+		return (devfs_no_poll(dev, events, td));
 
 	err = usb2_ref_device(cpd, 0 /* no uref */ );
 	if (err)
-		return (POLLHUP);
+		return (devfs_no_poll(dev, events, td));
 
 	fflags = cpd->fflags;
 

==== //depot/projects/usb/src/sys/fs/devfs/devfs_vnops.c#16 (text+ko) ====

@@ -1014,7 +1014,7 @@
 	fpop = td->td_fpop;
 	error = devfs_fp_check(fp, &dev, &dsw);
 	if (error)
-		return (error);
+		return (devfs_no_poll(dev, events, td));
 	error = dsw->d_poll(dev, events, td);
 	td->td_fpop = fpop;
 	dev_relthread(dev);

==== //depot/projects/usb/src/sys/kern/kern_conf.c#13 (text+ko) ====

@@ -263,7 +263,7 @@
 #define dead_read	(d_read_t *)enxio
 #define dead_write	(d_write_t *)enxio
 #define dead_ioctl	(d_ioctl_t *)enxio
-#define dead_poll	(d_poll_t *)enodev
+#define dead_poll	(d_poll_t *)devfs_no_poll
 #define dead_mmap	(d_mmap_t *)enodev
 
 static void
@@ -309,8 +309,8 @@
 	biofinish(bp, NULL, ENODEV);
 }
 
-static int
-no_poll(struct cdev *dev __unused, int events, struct thread *td __unused)
+int
+devfs_no_poll(struct cdev *dev __unused, int events, struct thread *td __unused)
 {
 	/*
 	 * Return true for read/write.  If the user asked for something
@@ -619,7 +619,7 @@
 	FIXUP(d_read,		no_read,	giant_read);
 	FIXUP(d_write,		no_write,	giant_write);
 	FIXUP(d_ioctl,		no_ioctl,	giant_ioctl);
-	FIXUP(d_poll,		no_poll,	giant_poll);
+	FIXUP(d_poll,		devfs_no_poll,	giant_poll);
 	FIXUP(d_mmap,		no_mmap,	giant_mmap);
 	FIXUP(d_strategy,	no_strategy,	giant_strategy);
 	FIXUP(d_kqfilter,	no_kqfilter,	giant_kqfilter);

==== //depot/projects/usb/src/sys/sys/conf.h#16 (text+ko) ====

@@ -279,6 +279,7 @@
 int	devfs_set_cdevpriv(void *priv, cdevpriv_dtr_t dtr);
 void	devfs_clear_cdevpriv(void);
 void	devfs_fpdrop(struct file *fp);	/* XXX This is not public KPI */
+d_poll_t devfs_no_poll;
 
 #define		UID_ROOT	0
 #define		UID_BIN		3


More information about the p4-projects mailing list