diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-02-09 21:12:07 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-02-09 21:12:07 -0500 |
commit | f94aa7c7f1fc474be776e4bf88088d5a007d3575 (patch) | |
tree | ba607798fb9e9136d267353b9b5c1b4dd50f4819 /drivers | |
parent | 9c1db7798141e2658e4b5bb170128dfdc3270ff4 (diff) | |
parent | c9efe51165fa0aff57be54e3cb0201ac87f68980 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs fixes from Al Viro:
"A couple of fixes, both -stable fodder. The O_SYNC bug is fairly
old..."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
fix a kmap leak in virtio_console
fix O_SYNC|O_APPEND syncing the wrong range on write()
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/char/virtio_console.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index feea87cc6b8f..6928d094451d 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c | |||
@@ -890,12 +890,10 @@ static int pipe_to_sg(struct pipe_inode_info *pipe, struct pipe_buffer *buf, | |||
890 | } else { | 890 | } else { |
891 | /* Failback to copying a page */ | 891 | /* Failback to copying a page */ |
892 | struct page *page = alloc_page(GFP_KERNEL); | 892 | struct page *page = alloc_page(GFP_KERNEL); |
893 | char *src = buf->ops->map(pipe, buf, 1); | 893 | char *src; |
894 | char *dst; | ||
895 | 894 | ||
896 | if (!page) | 895 | if (!page) |
897 | return -ENOMEM; | 896 | return -ENOMEM; |
898 | dst = kmap(page); | ||
899 | 897 | ||
900 | offset = sd->pos & ~PAGE_MASK; | 898 | offset = sd->pos & ~PAGE_MASK; |
901 | 899 | ||
@@ -903,9 +901,8 @@ static int pipe_to_sg(struct pipe_inode_info *pipe, struct pipe_buffer *buf, | |||
903 | if (len + offset > PAGE_SIZE) | 901 | if (len + offset > PAGE_SIZE) |
904 | len = PAGE_SIZE - offset; | 902 | len = PAGE_SIZE - offset; |
905 | 903 | ||
906 | memcpy(dst + offset, src + buf->offset, len); | 904 | src = buf->ops->map(pipe, buf, 1); |
907 | 905 | memcpy(page_address(page) + offset, src + buf->offset, len); | |
908 | kunmap(page); | ||
909 | buf->ops->unmap(pipe, buf, src); | 906 | buf->ops->unmap(pipe, buf, src); |
910 | 907 | ||
911 | sg_set_page(&(sgl->sg[sgl->n]), page, len, offset); | 908 | sg_set_page(&(sgl->sg[sgl->n]), page, len, offset); |