Whamcloud - gitweb
LU-7623 libcfs: Properly map page for vfs_write 87/17787/2
authorOleg Drokin <oleg.drokin@intel.com>
Sun, 3 Jan 2016 22:17:58 +0000 (17:17 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 7 Jan 2016 02:49:28 +0000 (02:49 +0000)
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 <oleg.drokin@intel.com>
Reviewed-on: http://review.whamcloud.com/17787
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-by: John L. Hammond <john.hammond@intel.com>
libcfs/libcfs/tracefile.c

index 7c674ba..5228bea 100644 (file)
@@ -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);