Krzysztof Matula wrote: > SkyStar2, kernel: 2.6.10-1.760_FC3 > > I'm waiting for the dvr fd with select, and then if FD_ISSET I issue a > read() call to it. Usually it works perfectly well, but sometimes, > especially when other thread is performing multiple repeated tunings on > the forntend the read() blocks infinitely until the process is killed... Attached is a small patch that solves the problem. KM -------------- next part -------------- Index: linux/drivers/media/dvb/dvb-core/dmxdev.c =================================================================== RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/dvb-core/dmxdev.c,v retrieving revision 1.40 diff -u -d -r1.40 dmxdev.c --- linux/drivers/media/dvb/dvb-core/dmxdev.c 5 Apr 2005 00:54:19 -0000 1.40 +++ linux/drivers/media/dvb/dvb-core/dmxdev.c 21 Apr 2005 21:19:07 -0000 @@ -110,6 +110,12 @@ if (non_blocking && (src->pwrite==src->pread)) return -EWOULDBLOCK; + /* We may not block here if there are some bytes available in the + buffer - poll() may have informed the client about that! + Note that EWOULDBLOCK will never be returned in that case. */ + if (src->pwrite != src->pread) + non_blocking = 1; + while (todo>0) { if (non_blocking && (src->pwrite==src->pread)) return (count-todo) ? (count-todo) : -EWOULDBLOCK;