async_tx: fix kmap_atomic usage in async_memcpy
Andrew Morton: [async_memcpy] is very wrong if both ASYNC_TX_KMAP_DST and ASYNC_TX_KMAP_SRC can ever be set. We'll end up using the same kmap slot for both src add dest and we get either corrupted data or a BUG. Evgeniy Polyakov: Btw, shouldn't it always be kmap_atomic() even if flag is not set. That pages are usual one returned by alloc_page(). So fix the usage of kmap_atomic and kill the ASYNC_TX_KMAP_DST and ASYNC_TX_KMAP_SRC flags. Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Evgeniy Polyakov <johnpol@2ka.mipt.ru> Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
7c6129c68f
commit
eb0645a8b1
@@ -493,12 +493,12 @@ async_copy_data(int frombio, struct bio *bio, struct page *page,
|
||||
if (frombio)
|
||||
tx = async_memcpy(page, bio_page, page_offset,
|
||||
b_offset, clen,
|
||||
ASYNC_TX_DEP_ACK | ASYNC_TX_KMAP_SRC,
|
||||
ASYNC_TX_DEP_ACK,
|
||||
tx, NULL, NULL);
|
||||
else
|
||||
tx = async_memcpy(bio_page, page, b_offset,
|
||||
page_offset, clen,
|
||||
ASYNC_TX_DEP_ACK | ASYNC_TX_KMAP_DST,
|
||||
ASYNC_TX_DEP_ACK,
|
||||
tx, NULL, NULL);
|
||||
}
|
||||
if (clen < len) /* hit end of page */
|
||||
|
Reference in New Issue
Block a user