Return ERR even if there are pending data, but hw is not running.  Do not
decrement count in poll, do it in ioctl, where data are actually read.

Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Jiri Slaby 2008-04-29 00:59:14 -07:00 коммит произвёл Linus Torvalds
Родитель 7e4e8e689f
Коммит 7d4f9f094b
1 изменённых файлов: 6 добавлений и 4 удалений

Просмотреть файл

@ -169,6 +169,7 @@ static long phantom_ioctl(struct file *file, unsigned int cmd,
for (i = 0; i < m; i++) for (i = 0; i < m; i++)
if (rs.mask & BIT(i)) if (rs.mask & BIT(i))
rs.values[i] = ioread32(dev->iaddr + i); rs.values[i] = ioread32(dev->iaddr + i);
atomic_set(&dev->counter, 0);
spin_unlock_irqrestore(&dev->regs_lock, flags); spin_unlock_irqrestore(&dev->regs_lock, flags);
if (copy_to_user(argp, &rs, sizeof(rs))) if (copy_to_user(argp, &rs, sizeof(rs)))
@ -254,11 +255,12 @@ static unsigned int phantom_poll(struct file *file, poll_table *wait)
pr_debug("phantom_poll: %d\n", atomic_read(&dev->counter)); pr_debug("phantom_poll: %d\n", atomic_read(&dev->counter));
poll_wait(file, &dev->wait, wait); poll_wait(file, &dev->wait, wait);
if (atomic_read(&dev->counter)) {
if (!(dev->status & PHB_RUNNING))
mask = POLLERR;
else if (atomic_read(&dev->counter))
mask = POLLIN | POLLRDNORM; mask = POLLIN | POLLRDNORM;
atomic_dec(&dev->counter);
} else if ((dev->status & PHB_RUNNING) == 0)
mask = POLLIN | POLLRDNORM | POLLERR;
pr_debug("phantom_poll end: %x/%d\n", mask, atomic_read(&dev->counter)); pr_debug("phantom_poll end: %x/%d\n", mask, atomic_read(&dev->counter));
return mask; return mask;