VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / sound / oss / emu10k1 / audio.c
index 42fae03..9cf30ab 100644 (file)
@@ -50,7 +50,7 @@ static void calculate_ofrag(struct woinst *);
 static void calculate_ifrag(struct wiinst *);
 
 /* Audio file operations */
-static ssize_t emu10k1_audio_read(struct file *file, char *buffer, size_t count, loff_t * ppos)
+static ssize_t emu10k1_audio_read(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
 {
        struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
        struct wiinst *wiinst = wave_dev->wiinst;
@@ -59,9 +59,6 @@ static ssize_t emu10k1_audio_read(struct file *file, char *buffer, size_t count,
 
        DPD(3, "emu10k1_audio_read(), buffer=%p, count=%d\n", buffer, (u32) count);
 
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
-
        if (!access_ok(VERIFY_WRITE, buffer, count))
                return -EFAULT;
 
@@ -112,7 +109,7 @@ static ssize_t emu10k1_audio_read(struct file *file, char *buffer, size_t count,
                    || (bytestocopy >= count)) {
                        bytestocopy = min_t(u32, bytestocopy, count);
 
-                       emu10k1_wavein_xferdata(wiinst, (u8 *) buffer, &bytestocopy);
+                       emu10k1_wavein_xferdata(wiinst, (u8 __user *)buffer, &bytestocopy);
 
                        count -= bytestocopy;
                        buffer += bytestocopy;
@@ -137,7 +134,7 @@ static ssize_t emu10k1_audio_read(struct file *file, char *buffer, size_t count,
        return ret;
 }
 
-static ssize_t emu10k1_audio_write(struct file *file, const char *buffer, size_t count, loff_t * ppos)
+static ssize_t emu10k1_audio_write(struct file *file, const char __user *buffer, size_t count, loff_t * ppos)
 {
        struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
        struct woinst *woinst = wave_dev->woinst;
@@ -146,9 +143,6 @@ static ssize_t emu10k1_audio_write(struct file *file, const char *buffer, size_t
 
        DPD(3, "emu10k1_audio_write(), buffer=%p, count=%d\n", buffer, (u32) count);
 
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
-
        if (!access_ok(VERIFY_READ, buffer, count))
                return -EFAULT;
 
@@ -212,7 +206,7 @@ static ssize_t emu10k1_audio_write(struct file *file, const char *buffer, size_t
 
                        bytestocopy = min_t(u32, bytestocopy, count);
 
-                       emu10k1_waveout_xferdata(woinst, (u8 *) buffer, &bytestocopy);
+                       emu10k1_waveout_xferdata(woinst, (u8 __user *) buffer, &bytestocopy);
 
                        count -= bytestocopy;
                        buffer += bytestocopy * woinst->num_voices;
@@ -254,6 +248,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
        int val = 0;
        u32 bytestocopy;
        unsigned long flags;
+       int __user *p = (int __user *)arg;
 
        DPF(4, "emu10k1_audio_ioctl()\n");
 
@@ -266,7 +261,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
        switch (cmd) {
        case OSS_GETVERSION:
                DPF(2, "OSS_GETVERSION:\n");
-               return put_user(SOUND_VERSION, (int *) arg);
+               return put_user(SOUND_VERSION, p);
 
        case SNDCTL_DSP_RESET:
                DPF(2, "SNDCTL_DSP_RESET:\n");
@@ -352,11 +347,11 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                DPF(2, "SNDCTL_DSP_GETCAPS:\n");
                return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME |
                                DSP_CAP_TRIGGER | DSP_CAP_MMAP |
-                               DSP_CAP_COPROC| DSP_CAP_MULTI, (int *) arg);
+                               DSP_CAP_COPROC| DSP_CAP_MULTI, p);
        case SNDCTL_DSP_SPEED:
                DPF(2, "SNDCTL_DSP_SPEED:\n");
 
-               if (get_user(val, (int *) arg))
+               if (get_user(val, p))
                        return -EFAULT;
 
                DPD(2, "val is %d\n", val);
@@ -402,21 +397,21 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                                DPD(2, "set playback sampling rate -> %d\n", val);
                        }
 
-                       return put_user(val, (int *) arg);
+                       return put_user(val, p);
                } else {
                        if (file->f_mode & FMODE_READ)
                                val = wiinst->format.samplingrate;
                        else if (file->f_mode & FMODE_WRITE)
                                val = woinst->format.samplingrate;
 
-                       return put_user(val, (int *) arg);
+                       return put_user(val, p);
                }
                break;
 
        case SNDCTL_DSP_STEREO:
                DPF(2, "SNDCTL_DSP_STEREO:\n");
 
-               if (get_user(val, (int *) arg))
+               if (get_user(val, p))
                        return -EFAULT;
 
                DPD(2, " val is %d\n", val);
@@ -460,14 +455,14 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                        DPD(2, "set playback stereo -> %d\n", val);
                }
 
-               return put_user(val, (int *) arg);
+               return put_user(val, p);
 
                break;
 
        case SNDCTL_DSP_CHANNELS:
                DPF(2, "SNDCTL_DSP_CHANNELS:\n");
 
-               if (get_user(val, (int *) arg))
+               if (get_user(val, p))
                        return -EFAULT;
 
                DPD(2, " val is %d\n", val);
@@ -510,14 +505,14 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                                DPD(2, "set playback number of channels -> %d\n", val);
                        }
 
-                       return put_user(val, (int *) arg);
+                       return put_user(val, p);
                } else {
                        if (file->f_mode & FMODE_READ)
                                val = wiinst->format.channels;
                        else if (file->f_mode & FMODE_WRITE)
                                val = woinst->format.channels;
 
-                       return put_user(val, (int *) arg);
+                       return put_user(val, p);
                }
                break;
 
@@ -533,12 +528,12 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                                                     wave_dev->card->pt.enable_gpr_name) >= 0)
                                val |= AFMT_AC3;
                }
-               return put_user(val, (int *) arg);
+               return put_user(val, p);
 
        case SNDCTL_DSP_SETFMT: /* Same as SNDCTL_DSP_SAMPLESIZE */
                DPF(2, "SNDCTL_DSP_SETFMT:\n");
 
-               if (get_user(val, (int *) arg))
+               if (get_user(val, p))
                        return -EFAULT;
 
                DPD(2, " val is %d\n", val);
@@ -582,14 +577,14 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                                DPD(2, "set playback format -> %d\n", val);
                        }
 
-                       return put_user(val, (int *) arg);
+                       return put_user(val, p);
                } else {
                        if (file->f_mode & FMODE_READ)
                                val = wiinst->format.id;
                        else if (file->f_mode & FMODE_WRITE)
                                val = woinst->format.id;
 
-                       return put_user(val, (int *) arg);
+                       return put_user(val, p);
                }
                break;
 
@@ -600,7 +595,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                else if (file->f_mode & FMODE_WRITE)
                        val = woinst->format.bitsperchannel;
 
-               return put_user(val, (int *) arg);
+               return put_user(val, p);
 
        case SOUND_PCM_READ_RATE:
 
@@ -609,7 +604,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                else if (file->f_mode & FMODE_WRITE)
                        val = woinst->format.samplingrate;
 
-               return put_user(val, (int *) arg);
+               return put_user(val, p);
 
        case SOUND_PCM_READ_CHANNELS:
 
@@ -618,7 +613,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                else if (file->f_mode & FMODE_WRITE)
                        val = woinst->format.channels;
 
-               return put_user(val, (int *) arg);
+               return put_user(val, p);
 
        case SOUND_PCM_WRITE_FILTER:
                DPF(2, "SOUND_PCM_WRITE_FILTER: not implemented\n");
@@ -641,12 +636,12 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                if (file->f_mode & FMODE_READ && (wave_dev->enablebits & PCM_ENABLE_INPUT))
                        val |= PCM_ENABLE_INPUT;
 
-               return put_user(val, (int *) arg);
+               return put_user(val, p);
 
        case SNDCTL_DSP_SETTRIGGER:
                DPF(2, "SNDCTL_DSP_SETTRIGGER:\n");
 
-               if (get_user(val, (int *) arg))
+               if (get_user(val, p))
                        return -EFAULT;
 
                if (file->f_mode & FMODE_WRITE) {
@@ -708,7 +703,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                        info.fragstotal = woinst->buffer.numfrags * woinst->num_voices;
                        info.fragments = info.bytes / info.fragsize;
 
-                       if (copy_to_user((int *) arg, &info, sizeof(info)))
+                       if (copy_to_user(p, &info, sizeof(info)))
                                return -EFAULT;
                }
                break;
@@ -737,7 +732,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                        info.fragments = info.bytes / wiinst->buffer.fragment_size;
                        info.fragsize = wiinst->buffer.fragment_size;
 
-                       if (copy_to_user((int *) arg, &info, sizeof(info)))
+                       if (copy_to_user(p, &info, sizeof(info)))
                                return -EFAULT;
                }
                break;
@@ -765,7 +760,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                val *= woinst->num_voices;
                spin_unlock_irqrestore(&woinst->lock, flags);
 
-               return put_user(val, (int *) arg);
+               return put_user(val, p);
 
        case SNDCTL_DSP_GETIPTR:
                {
@@ -795,7 +790,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
 
                        spin_unlock_irqrestore(&wiinst->lock, flags);
 
-                       if (copy_to_user((void *) arg, &cinfo, sizeof(cinfo)))
+                       if (copy_to_user(p, &cinfo, sizeof(cinfo)))
                                return -EFAULT;
                }
                break;
@@ -841,7 +836,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
 
                        spin_unlock_irqrestore(&woinst->lock, flags);
 
-                       if (copy_to_user((void *) arg, &cinfo, sizeof(cinfo)))
+                       if (copy_to_user(p, &cinfo, sizeof(cinfo)))
                                return -EFAULT;
                }
                break;
@@ -867,7 +862,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                        spin_unlock_irqrestore(&wiinst->lock, flags);
                }
 
-               return put_user(val, (int *) arg);
+               return put_user(val, p);
 
                break;
 
@@ -892,7 +887,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
        case SNDCTL_DSP_SETFRAGMENT:
                DPF(2, "SNDCTL_DSP_SETFRAGMENT:\n");
 
-               if (get_user(val, (int *) arg))
+               if (get_user(val, p))
                        return -EFAULT;
 
                DPD(2, "val is %#x\n", val);
@@ -930,7 +925,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                        if (!buf)
                                return -ENOMEM;
 
-                       if (copy_from_user(buf, (copr_buffer *) arg, sizeof(copr_buffer))) {
+                       if (copy_from_user(buf, p, sizeof(copr_buffer))) {
                                kfree (buf);
                                return -EFAULT;
                        }
@@ -969,7 +964,7 @@ static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned
                                for (i = 0; i < buf->len; i++)
                                        ((u32 *) buf->data)[i] = sblive_readptr(wave_dev->card, buf->offs + i, buf->flags);
 
-                               if (copy_to_user((copr_buffer *) arg, buf, sizeof(copr_buffer))) {
+                               if (copy_to_user(p, buf, sizeof(copr_buffer))) {
                                        kfree(buf);
                                        return -EFAULT;
                                }
@@ -1248,7 +1243,7 @@ match:
 
        file->private_data = (void *) wave_dev;
 
-       return 0;
+       return nonseekable_open(inode, file);
 }
 
 static int emu10k1_audio_release(struct inode *inode, struct file *file)