cx25821: sanitize cx25821_get_audio_data() a bit
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 13 Apr 2013 20:35:35 +0000 (16:35 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 13 Apr 2013 20:35:35 +0000 (16:35 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
drivers/media/pci/cx25821/cx25821-audio-upstream.c

index 87491ca05ee556fc9b7b4fc4c2112684fc997604..d930f308e94e909c084420ba8677192f9d834c9b 100644 (file)
@@ -259,79 +259,46 @@ void cx25821_free_mem_upstream_audio(struct cx25821_dev *dev)
 static int cx25821_get_audio_data(struct cx25821_dev *dev,
                           struct sram_channel *sram_ch)
 {
-       struct file *myfile;
+       struct file *file;
        int frame_index_temp = dev->_audioframe_index;
        int i = 0;
-       int line_size = AUDIO_LINE_SIZE;
        int frame_size = AUDIO_DATA_BUF_SZ;
        int frame_offset = frame_size * frame_index_temp;
-       ssize_t vfs_read_retval = 0;
-       char mybuf[line_size];
+       char mybuf[AUDIO_LINE_SIZE];
        loff_t file_offset = dev->_audioframe_count * frame_size;
-       loff_t pos;
-       mm_segment_t old_fs;
+       char *p = NULL;
 
        if (dev->_audiofile_status == END_OF_FILE)
                return 0;
 
-       myfile = filp_open(dev->_audiofilename, O_RDONLY | O_LARGEFILE, 0);
+       file = filp_open(dev->_audiofilename, O_RDONLY | O_LARGEFILE, 0);
+       if (IS_ERR(file)) {
+               pr_err("%s(): ERROR opening file(%s) with errno = %ld!\n",
+                      __func__, dev->_audiofilename, -PTR_ERR(file));
+               return PTR_ERR(file);
+       }
 
-       if (IS_ERR(myfile)) {
-               const int open_errno = -PTR_ERR(myfile);
-               pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
-                      __func__, dev->_audiofilename, open_errno);
-               return PTR_ERR(myfile);
-       } else {
-               if (!(myfile->f_op)) {
-                       pr_err("%s(): File has no file operations registered!\n",
-                               __func__);
-                       filp_close(myfile, NULL);
-                       return -EIO;
-               }
+       if (dev->_audiodata_buf_virt_addr)
+               p = (char *)dev->_audiodata_buf_virt_addr + frame_offset;
 
-               if (!myfile->f_op->read) {
-                       pr_err("%s(): File has no READ operations registered!\n",
+       for (i = 0; i < dev->_audio_lines_count; i++) {
+               int n = kernel_read(file, file_offset, mybuf, AUDIO_LINE_SIZE);
+               if (n < AUDIO_LINE_SIZE) {
+                       pr_info("Done: exit %s() since no more bytes to read from Audio file\n",
                                __func__);
-                       filp_close(myfile, NULL);
-                       return -EIO;
+                       dev->_audiofile_status = END_OF_FILE;
+                       fput(file);
+                       return 0;
                }
-
-               pos = myfile->f_pos;
-               old_fs = get_fs();
-               set_fs(KERNEL_DS);
-
-               for (i = 0; i < dev->_audio_lines_count; i++) {
-                       pos = file_offset;
-
-                       vfs_read_retval = vfs_read(myfile, mybuf, line_size,
-                                                                       &pos);
-
-                       if (vfs_read_retval > 0 && vfs_read_retval == line_size
-                           && dev->_audiodata_buf_virt_addr != NULL) {
-                               memcpy((void *)(dev->_audiodata_buf_virt_addr +
-                                               frame_offset / 4), mybuf,
-                                       vfs_read_retval);
-                       }
-
-                       file_offset += vfs_read_retval;
-                       frame_offset += vfs_read_retval;
-
-                       if (vfs_read_retval < line_size) {
-                               pr_info("Done: exit %s() since no more bytes to read from Audio file\n",
-                                       __func__);
-                               break;
-                       }
+               dev->_audiofile_status = IN_PROGRESS;
+               if (p) {
+                       memcpy(p, mybuf, n);
+                       p += n;
                }
-
-               if (i > 0)
-                       dev->_audioframe_count++;
-
-               dev->_audiofile_status = (vfs_read_retval == line_size) ?
-                                               IN_PROGRESS : END_OF_FILE;
-
-               set_fs(old_fs);
-               filp_close(myfile, NULL);
+               file_offset += n;
        }
+       dev->_audioframe_count++;
+       fput(file);
 
        return 0;
 }