Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

9p: switch ->writepage() to direct use of p9_client_write()

Don't mess with kmap() - just use ITER_BVEC.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro 371098c6 070b3656

+13 -22
+13 -22
fs/9p/vfs_addr.c
··· 161 161 162 162 static int v9fs_vfs_writepage_locked(struct page *page) 163 163 { 164 - char *buffer; 165 - int retval, len; 166 - loff_t offset, size; 167 - mm_segment_t old_fs; 168 - struct v9fs_inode *v9inode; 169 164 struct inode *inode = page->mapping->host; 165 + struct v9fs_inode *v9inode = V9FS_I(inode); 166 + loff_t size = i_size_read(inode); 167 + struct iov_iter from; 168 + struct bio_vec bvec; 169 + int err, len; 170 170 171 - v9inode = V9FS_I(inode); 172 - size = i_size_read(inode); 173 171 if (page->index == size >> PAGE_CACHE_SHIFT) 174 172 len = size & ~PAGE_CACHE_MASK; 175 173 else 176 174 len = PAGE_CACHE_SIZE; 177 175 178 - set_page_writeback(page); 176 + bvec.bv_page = page; 177 + bvec.bv_offset = 0; 178 + bvec.bv_len = len; 179 + iov_iter_bvec(&from, ITER_BVEC | WRITE, &bvec, 1, len); 179 180 180 - buffer = kmap(page); 181 - offset = page_offset(page); 182 - 183 - old_fs = get_fs(); 184 - set_fs(get_ds()); 185 181 /* We should have writeback_fid always set */ 186 182 BUG_ON(!v9inode->writeback_fid); 187 183 188 - retval = v9fs_file_write_internal(inode, 189 - v9inode->writeback_fid, 190 - (__force const char __user *)buffer, 191 - len, &offset, 0); 192 - if (retval > 0) 193 - retval = 0; 184 + set_page_writeback(page); 194 185 195 - set_fs(old_fs); 196 - kunmap(page); 186 + p9_client_write(v9inode->writeback_fid, page_offset(page), &from, &err); 187 + 197 188 end_page_writeback(page); 198 - return retval; 189 + return err; 199 190 } 200 191 201 192 static int v9fs_vfs_writepage(struct page *page, struct writeback_control *wbc)