aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/IR/lirc_dev.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/media/IR/lirc_dev.c b/drivers/media/IR/lirc_dev.c
index 8ab9d87f3a4..756656e17bd 100644
--- a/drivers/media/IR/lirc_dev.c
+++ b/drivers/media/IR/lirc_dev.c
@@ -647,18 +647,18 @@ ssize_t lirc_dev_fop_read(struct file *file,
647 if (!buf) 647 if (!buf)
648 return -ENOMEM; 648 return -ENOMEM;
649 649
650 if (mutex_lock_interruptible(&ir->irctl_lock)) 650 if (mutex_lock_interruptible(&ir->irctl_lock)) {
651 return -ERESTARTSYS; 651 ret = -ERESTARTSYS;
652 goto out_unlocked;
653 }
652 if (!ir->attached) { 654 if (!ir->attached) {
653 mutex_unlock(&ir->irctl_lock); 655 ret = -ENODEV;
654 return -ENODEV; 656 goto out_locked;
655 } 657 }
656 658
657 if (length % ir->chunk_size) { 659 if (length % ir->chunk_size) {
658 dev_dbg(ir->d.dev, LOGHEAD "read result = -EINVAL\n", 660 ret = -EINVAL;
659 ir->d.name, ir->d.minor); 661 goto out_locked;
660 mutex_unlock(&ir->irctl_lock);
661 return -EINVAL;
662 } 662 }
663 663
664 /* 664 /*
@@ -709,18 +709,23 @@ ssize_t lirc_dev_fop_read(struct file *file,
709 lirc_buffer_read(ir->buf, buf); 709 lirc_buffer_read(ir->buf, buf);
710 ret = copy_to_user((void *)buffer+written, buf, 710 ret = copy_to_user((void *)buffer+written, buf,
711 ir->buf->chunk_size); 711 ir->buf->chunk_size);
712 written += ir->buf->chunk_size; 712 if (!ret)
713 written += ir->buf->chunk_size;
714 else
715 ret = -EFAULT;
713 } 716 }
714 } 717 }
715 718
716 remove_wait_queue(&ir->buf->wait_poll, &wait); 719 remove_wait_queue(&ir->buf->wait_poll, &wait);
717 set_current_state(TASK_RUNNING); 720 set_current_state(TASK_RUNNING);
721
722out_locked:
718 mutex_unlock(&ir->irctl_lock); 723 mutex_unlock(&ir->irctl_lock);
719 724
720out_unlocked: 725out_unlocked:
721 kfree(buf); 726 kfree(buf);
722 dev_dbg(ir->d.dev, LOGHEAD "read result = %s (%d)\n", 727 dev_dbg(ir->d.dev, LOGHEAD "read result = %s (%d)\n",
723 ir->d.name, ir->d.minor, ret ? "-EFAULT" : "OK", ret); 728 ir->d.name, ir->d.minor, ret ? "<fail>" : "<ok>", ret);
724 729
725 return ret ? ret : written; 730 return ret ? ret : written;
726} 731}