mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-10 00:26:34 +00:00
bio_vec-backed iov_iter
New variant of iov_iter - ITER_BVEC in iter->type, backed with bio_vec array instead of iovec one. Primitives taught to deal with such beasts, __swap_write() switched to using that kind of iov_iter. Note that bio_vec is just a <page, offset, length> triple - there's nothing block-specific about it. I've left the definition where it was, but took it from under ifdef CONFIG_BLOCK. Next target: ->splice_write()... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
81055e584f
commit
62a8067a7f
5 changed files with 385 additions and 44 deletions
19
mm/page_io.c
19
mm/page_io.c
|
@ -259,23 +259,28 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc,
|
|||
struct kiocb kiocb;
|
||||
struct file *swap_file = sis->swap_file;
|
||||
struct address_space *mapping = swap_file->f_mapping;
|
||||
struct iovec iov = {
|
||||
.iov_base = kmap(page),
|
||||
.iov_len = PAGE_SIZE,
|
||||
struct bio_vec bv = {
|
||||
.bv_page = page,
|
||||
.bv_len = PAGE_SIZE,
|
||||
.bv_offset = 0
|
||||
};
|
||||
struct iov_iter from = {
|
||||
.type = ITER_BVEC | WRITE,
|
||||
.count = PAGE_SIZE,
|
||||
.iov_offset = 0,
|
||||
.nr_segs = 1,
|
||||
.bvec = &bv
|
||||
};
|
||||
struct iov_iter from;
|
||||
|
||||
init_sync_kiocb(&kiocb, swap_file);
|
||||
kiocb.ki_pos = page_file_offset(page);
|
||||
kiocb.ki_nbytes = PAGE_SIZE;
|
||||
iov_iter_init(&from, KERNEL_WRITE, &iov, 1, PAGE_SIZE);
|
||||
|
||||
set_page_writeback(page);
|
||||
unlock_page(page);
|
||||
ret = mapping->a_ops->direct_IO(KERNEL_WRITE,
|
||||
ret = mapping->a_ops->direct_IO(ITER_BVEC | WRITE,
|
||||
&kiocb, &from,
|
||||
kiocb.ki_pos);
|
||||
kunmap(page);
|
||||
if (ret == PAGE_SIZE) {
|
||||
count_vm_event(PSWPOUT);
|
||||
ret = 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue