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