From e2a442e3288afec9450a9aef188fe38dce35aab0 Mon Sep 17 00:00:00 2001 From: Oleg Drokin Date: Sun, 3 Jan 2016 17:17:58 -0500 Subject: [PATCH] LU-7623 libcfs: Properly map page for vfs_write Apparently it's possible that the page might not be mapped before vfs_write, so map it. Also forcefully mark it __user to make sparse happy. This was part of upstream kernel commit 7ebcb731 that somehow never made it back even though vfs_write changes did. Change-Id: I88494eac08c02d9cac2476eeb56be1eb65cfc3bf Signed-off-by: Oleg Drokin Reviewed-on: http://review.whamcloud.com/17787 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: John L. Hammond --- libcfs/libcfs/tracefile.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libcfs/libcfs/tracefile.c b/libcfs/libcfs/tracefile.c index 7c674ba..5228bea 100644 --- a/libcfs/libcfs/tracefile.c +++ b/libcfs/libcfs/tracefile.c @@ -665,6 +665,7 @@ int cfs_tracefile_dump_all_pages(char *filename) struct cfs_trace_page *tage; struct cfs_trace_page *tmp; mm_segment_t __oldfs; + char *buf; int rc; cfs_tracefile_write_lock(); @@ -693,8 +694,10 @@ int cfs_tracefile_dump_all_pages(char *filename) __LASSERT_TAGE_INVARIANT(tage); - rc = vfs_write(filp, page_address(tage->page), tage->used, - &filp->f_pos); + buf = kmap(tage->page); + rc = vfs_write(filp, (__force const char __user *)buf, + tage->used, &filp->f_pos); + kunmap(tage->page); if (rc != (int)tage->used) { printk(KERN_WARNING "wanted to write %u but wrote " "%d\n", tage->used, rc); @@ -954,6 +957,7 @@ static int tracefiled(void *arg) struct cfs_trace_page *tmp; mm_segment_t __oldfs; struct file *filp; + char *buf; int last_loop = 0; int rc; @@ -1003,8 +1007,10 @@ static int tracefiled(void *arg) else if (f_pos > i_size_read(de->d_inode)) f_pos = i_size_read(de->d_inode); - rc = vfs_write(filp, page_address(tage->page), + buf = kmap(tage->page); + rc = vfs_write(filp, (__force const char __user *)buf, tage->used, &f_pos); + kunmap(tage->page); if (rc != (int)tage->used) { printk(KERN_WARNING "wanted to write %u " "but wrote %d\n", tage->used, rc); -- 1.8.3.1