Browse Source

untangling process_vm_..., part 2

move iov to caller's stack frame; the value we assign to it on the
next call of process_vm_rw_pages() is equal to the value it had
when the last time we were leaving process_vm_rw_pages().

drop lvec argument of process_vm_rw_pages() - it's not used anymore.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Al Viro 11 years ago
parent
commit
c61c70384f
1 changed files with 5 additions and 3 deletions
  1. 5 3
      mm/process_vm_access.c

+ 5 - 3
mm/process_vm_access.c

@@ -45,7 +45,7 @@ static int process_vm_rw_pages(struct task_struct *task,
 			       unsigned long pa,
 			       unsigned long start_offset,
 			       unsigned long len,
-			       const struct iovec *lvec,
+			       const struct iovec **iovp,
 			       unsigned long lvec_cnt,
 			       unsigned long *lvec_current,
 			       size_t *lvec_offset,
@@ -60,7 +60,7 @@ static int process_vm_rw_pages(struct task_struct *task,
 	int ret;
 	ssize_t bytes_to_copy;
 	ssize_t rc = 0;
-	const struct iovec *iov = lvec + *lvec_current;
+	const struct iovec *iov = *iovp;
 
 	*bytes_copied = 0;
 
@@ -149,6 +149,7 @@ end:
 			put_page(process_pages[j]);
 	}
 
+	*iovp = iov;
 	return rc;
 }
 
@@ -192,6 +193,7 @@ static int process_vm_rw_single_vec(unsigned long addr,
 	unsigned long nr_pages_to_copy;
 	unsigned long max_pages_per_loop = PVM_MAX_KMALLOC_PAGES
 		/ sizeof(struct pages *);
+	const struct iovec *iov = lvec + *lvec_current;
 
 	*bytes_copied = 0;
 
@@ -206,7 +208,7 @@ static int process_vm_rw_single_vec(unsigned long addr,
 
 		rc = process_vm_rw_pages(task, mm, process_pages, pa,
 					 start_offset, len,
-					 lvec, lvec_cnt,
+					 &iov, lvec_cnt,
 					 lvec_current, lvec_offset,
 					 vm_write, nr_pages_to_copy,
 					 &bytes_copied_loop);