|
@@ -4652,24 +4652,18 @@ static ssize_t proc_write( struct file *file,
|
|
|
size_t len,
|
|
|
loff_t *offset )
|
|
|
{
|
|
|
- loff_t pos = *offset;
|
|
|
+ ssize_t ret;
|
|
|
struct proc_data *priv = file->private_data;
|
|
|
|
|
|
if (!priv->wbuffer)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if (pos < 0)
|
|
|
- return -EINVAL;
|
|
|
- if (pos >= priv->maxwritelen)
|
|
|
- return 0;
|
|
|
- if (len > priv->maxwritelen - pos)
|
|
|
- len = priv->maxwritelen - pos;
|
|
|
- if (copy_from_user(priv->wbuffer + pos, buffer, len))
|
|
|
- return -EFAULT;
|
|
|
- if ( pos + len > priv->writelen )
|
|
|
- priv->writelen = len + file->f_pos;
|
|
|
- *offset = pos + len;
|
|
|
- return len;
|
|
|
+ ret = simple_write_to_buffer(priv->wbuffer, priv->maxwritelen, offset,
|
|
|
+ buffer, len);
|
|
|
+ if (ret > 0)
|
|
|
+ priv->writelen = max_t(int, priv->writelen, *offset);
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static int proc_status_open(struct inode *inode, struct file *file)
|