mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	iov_iter: Don't deal with iter->copy_mc in memcpy_from_iter_mc()
iter->copy_mc is only used with a bvec iterator and only by dump_emit_page() in fs/coredump.c so rather than handle this in memcpy_from_iter_mc() where it is checked repeatedly by _copy_from_iter() and copy_page_from_iter_atomic(), Signed-off-by: David Howells <dhowells@redhat.com> Link: https://lore.kernel.org/r/20230925120309.1731676-9-dhowells@redhat.com cc: Alexander Viro <viro@zeniv.linux.org.uk> cc: Jens Axboe <axboe@kernel.dk> cc: Christoph Hellwig <hch@lst.de> cc: Christian Brauner <christian@brauner.io> cc: Matthew Wilcox <willy@infradead.org> cc: Linus Torvalds <torvalds@linux-foundation.org> cc: David Laight <David.Laight@ACULAB.COM> cc: linux-block@vger.kernel.org cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
		
							parent
							
								
									f1982740f5
								
							
						
					
					
						commit
						c9eec08bac
					
				
					 1 changed files with 23 additions and 12 deletions
				
			
		|  | @ -253,14 +253,29 @@ size_t _copy_mc_to_iter(const void *addr, size_t bytes, struct iov_iter *i) | |||
| EXPORT_SYMBOL_GPL(_copy_mc_to_iter); | ||||
| #endif /* CONFIG_ARCH_HAS_COPY_MC */ | ||||
| 
 | ||||
| static size_t memcpy_from_iter_mc(void *iter_from, size_t progress, | ||||
| 				  size_t len, void *to, void *priv2) | ||||
| static __always_inline | ||||
| size_t memcpy_from_iter_mc(void *iter_from, size_t progress, | ||||
| 			   size_t len, void *to, void *priv2) | ||||
| { | ||||
| 	struct iov_iter *iter = priv2; | ||||
| 	return copy_mc_to_kernel(to + progress, iter_from, len); | ||||
| } | ||||
| 
 | ||||
| 	if (iov_iter_is_copy_mc(iter)) | ||||
| 		return copy_mc_to_kernel(to + progress, iter_from, len); | ||||
| 	return memcpy_from_iter(iter_from, progress, len, to, priv2); | ||||
| static size_t __copy_from_iter_mc(void *addr, size_t bytes, struct iov_iter *i) | ||||
| { | ||||
| 	if (unlikely(i->count < bytes)) | ||||
| 		bytes = i->count; | ||||
| 	if (unlikely(!bytes)) | ||||
| 		return 0; | ||||
| 	return iterate_bvec(i, bytes, addr, NULL, memcpy_from_iter_mc); | ||||
| } | ||||
| 
 | ||||
| static __always_inline | ||||
| size_t __copy_from_iter(void *addr, size_t bytes, struct iov_iter *i) | ||||
| { | ||||
| 	if (unlikely(iov_iter_is_copy_mc(i))) | ||||
| 		return __copy_from_iter_mc(addr, bytes, i); | ||||
| 	return iterate_and_advance(i, bytes, addr, | ||||
| 				   copy_from_user_iter, memcpy_from_iter); | ||||
| } | ||||
| 
 | ||||
| size_t _copy_from_iter(void *addr, size_t bytes, struct iov_iter *i) | ||||
|  | @ -270,9 +285,7 @@ size_t _copy_from_iter(void *addr, size_t bytes, struct iov_iter *i) | |||
| 
 | ||||
| 	if (user_backed_iter(i)) | ||||
| 		might_fault(); | ||||
| 	return iterate_and_advance2(i, bytes, addr, i, | ||||
| 				    copy_from_user_iter, | ||||
| 				    memcpy_from_iter_mc); | ||||
| 	return __copy_from_iter(addr, bytes, i); | ||||
| } | ||||
| EXPORT_SYMBOL(_copy_from_iter); | ||||
| 
 | ||||
|  | @ -493,9 +506,7 @@ size_t copy_page_from_iter_atomic(struct page *page, size_t offset, | |||
| 		} | ||||
| 
 | ||||
| 		p = kmap_atomic(page) + offset; | ||||
| 		n = iterate_and_advance2(i, n, p, i, | ||||
| 					 copy_from_user_iter, | ||||
| 					 memcpy_from_iter_mc); | ||||
| 		n = __copy_from_iter(p, n, i); | ||||
| 		kunmap_atomic(p); | ||||
| 		copied += n; | ||||
| 		offset += n; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 David Howells
						David Howells