From 91270162bf8a86bee756da7e931591d9953cb5a8 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Tue, 1 Oct 2013 17:42:03 -0400 Subject: [PATCH] sysfs: skip bin_buffer->buffer while reading After b31ca3f5dfc ("sysfs: fix deadlock"), bin read() first writes data to bb->buffer and bounces it to a transient kernel buffer which is then copied out to userland. The double bouncing doesn't add anything. Let's just use the transient buffer directly. While at it, rename @temp to @buf for clarity. Signed-off-by: Tejun Heo Signed-off-by: Greg Kroah-Hartman --- fs/sysfs/bin.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/fs/sysfs/bin.c b/fs/sysfs/bin.c index d49e6ca..d2142c0 100644 --- a/fs/sysfs/bin.c +++ b/fs/sysfs/bin.c @@ -72,7 +72,7 @@ read(struct file *file, char __user *userbuf, size_t bytes, loff_t *off) int size = file_inode(file)->i_size; loff_t offs = *off; int count = min_t(size_t, bytes, PAGE_SIZE); - char *temp; + char *buf; if (!bytes) return 0; @@ -84,23 +84,18 @@ read(struct file *file, char __user *userbuf, size_t bytes, loff_t *off) count = size - offs; } - temp = kmalloc(count, GFP_KERNEL); - if (!temp) + buf = kmalloc(count, GFP_KERNEL); + if (!buf) return -ENOMEM; mutex_lock(&bb->mutex); + count = fill_read(file, buf, offs, count); + mutex_unlock(&bb->mutex); - count = fill_read(file, bb->buffer, offs, count); - if (count < 0) { - mutex_unlock(&bb->mutex); + if (count < 0) goto out_free; - } - - memcpy(temp, bb->buffer, count); - mutex_unlock(&bb->mutex); - - if (copy_to_user(userbuf, temp, count)) { + if (copy_to_user(userbuf, buf, count)) { count = -EFAULT; goto out_free; } @@ -110,7 +105,7 @@ read(struct file *file, char __user *userbuf, size_t bytes, loff_t *off) *off = offs + count; out_free: - kfree(temp); + kfree(buf); return count; } -- 2.7.4