Commit c9c37e2e63786c595d704244cbb7d19dc5630493
1 parent
d22a943f44
fuse: switch to iov_iter_get_pages()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Showing 1 changed file with 12 additions and 21 deletions Side-by-side Diff
fs/fuse/file.c
... | ... | @@ -1294,7 +1294,7 @@ |
1294 | 1294 | size_t nbytes = 0; /* # bytes already packed in req */ |
1295 | 1295 | |
1296 | 1296 | /* Special case for kernel I/O: can copy directly into the buffer */ |
1297 | - if (segment_eq(get_fs(), KERNEL_DS)) { | |
1297 | + if (ii->type & REQ_KERNEL) { | |
1298 | 1298 | unsigned long user_addr = fuse_get_user_addr(ii); |
1299 | 1299 | size_t frag_size = fuse_get_frag_size(ii, *nbytesp); |
1300 | 1300 | |
1301 | 1301 | |
1302 | 1302 | |
1303 | 1303 | |
1304 | 1304 | |
... | ... | @@ -1310,35 +1310,26 @@ |
1310 | 1310 | |
1311 | 1311 | while (nbytes < *nbytesp && req->num_pages < req->max_pages) { |
1312 | 1312 | unsigned npages; |
1313 | - unsigned long user_addr = fuse_get_user_addr(ii); | |
1314 | - unsigned offset = user_addr & ~PAGE_MASK; | |
1315 | - size_t frag_size = fuse_get_frag_size(ii, *nbytesp - nbytes); | |
1316 | - int ret; | |
1317 | - | |
1313 | + size_t start, end, frag_size; | |
1318 | 1314 | unsigned n = req->max_pages - req->num_pages; |
1319 | - frag_size = min_t(size_t, frag_size, n << PAGE_SHIFT); | |
1320 | - | |
1321 | - npages = (frag_size + offset + PAGE_SIZE - 1) >> PAGE_SHIFT; | |
1322 | - npages = clamp(npages, 1U, n); | |
1323 | - | |
1324 | - ret = get_user_pages_fast(user_addr, npages, !write, | |
1325 | - &req->pages[req->num_pages]); | |
1315 | + ssize_t ret = iov_iter_get_pages(ii, | |
1316 | + &req->pages[req->num_pages], | |
1317 | + n * PAGE_SIZE, &start); | |
1326 | 1318 | if (ret < 0) |
1327 | 1319 | return ret; |
1328 | 1320 | |
1329 | - npages = ret; | |
1330 | - frag_size = min_t(size_t, frag_size, | |
1331 | - (npages << PAGE_SHIFT) - offset); | |
1332 | - iov_iter_advance(ii, frag_size); | |
1321 | + iov_iter_advance(ii, ret); | |
1322 | + nbytes += ret; | |
1333 | 1323 | |
1334 | - req->page_descs[req->num_pages].offset = offset; | |
1324 | + ret += start; | |
1325 | + npages = (ret + PAGE_SIZE - 1) / PAGE_SIZE; | |
1326 | + | |
1327 | + req->page_descs[req->num_pages].offset = start; | |
1335 | 1328 | fuse_page_descs_length_init(req, req->num_pages, npages); |
1336 | 1329 | |
1337 | 1330 | req->num_pages += npages; |
1338 | 1331 | req->page_descs[req->num_pages - 1].length -= |
1339 | - (npages << PAGE_SHIFT) - offset - frag_size; | |
1340 | - | |
1341 | - nbytes += frag_size; | |
1332 | + (PAGE_SIZE - ret) & (PAGE_SIZE - 1); | |
1342 | 1333 | } |
1343 | 1334 | |
1344 | 1335 | if (write) |