Skip to content

Commit

Permalink
spi: fix the read path in spidev
Browse files Browse the repository at this point in the history
This got broken by the recent "fix rmmod $spi_driver while spidev-user is
active".  I tested the rmmod & write path but didn't check the read path.
I am sorry.  The read logic changed and spidev_sync_read() +
spidev_sync_write() do not return zero on success anymore but the number
of bytes that has been transfered over the bus.  This patch changes the
logic and copy_to_user() gets called again.

The write path returns the number of bytes which are written to the
underlying device what may be less than the requested size.  This patch
makes the same change to the read path or else we request a read of 20
bytes, get 10, don't call copy to user and report to the user that we read
10 bytes.

[[email protected]: remove test of known-to-be-zero local]
Signed-off-by: Sebastian Siewior <[email protected]>
Acked-by: David Brownell <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Sebastian Siewior authored and torvalds committed Jul 4, 2008
1 parent bef67c5 commit 4b1295b
Showing 1 changed file with 4 additions and 6 deletions.
10 changes: 4 additions & 6 deletions drivers/spi/spidev.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,14 +167,14 @@ spidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)

mutex_lock(&spidev->buf_lock);
status = spidev_sync_read(spidev, count);
if (status == 0) {
if (status > 0) {
unsigned long missing;

missing = copy_to_user(buf, spidev->buffer, count);
if (count && missing == count)
missing = copy_to_user(buf, spidev->buffer, status);
if (missing == status)
status = -EFAULT;
else
status = count - missing;
status = status - missing;
}
mutex_unlock(&spidev->buf_lock);

Expand All @@ -200,8 +200,6 @@ spidev_write(struct file *filp, const char __user *buf,
missing = copy_from_user(spidev->buffer, buf, count);
if (missing == 0) {
status = spidev_sync_write(spidev, count);
if (status == 0)
status = count;
} else
status = -EFAULT;
mutex_unlock(&spidev->buf_lock);
Expand Down

0 comments on commit 4b1295b

Please sign in to comment.