From: Ira Weiny Date: Wed, 17 Feb 2021 02:48:26 +0000 (-0800) Subject: btrfs: integrity-checker: convert block context kmap's to kmap_local_page X-Git-Tag: accepted/tizen/unified/20230118.172025~7052^2~113 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9a002d531b30bfe81d900f61a5ca955a85fab0e6;p=platform%2Fkernel%2Flinux-rpi.git btrfs: integrity-checker: convert block context kmap's to kmap_local_page btrfsic_read_block() (which calls kmap()) and btrfsic_release_block_ctx() (which calls kunmap()) are always called within a single thread of execution. Therefore the mappings created within these calls can be a thread local mapping. Convert the kmap() of bloc_ctx->pagev to kmap_local_page(). Luckily the unmap loops backwards through the array pointer so no adjustment needs to be made to the unmapping order. Signed-off-by: Ira Weiny Reviewed-by: David Sterba Signed-off-by: David Sterba --- diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index 6cc8296..1695086 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -1555,10 +1555,11 @@ static void btrfsic_release_block_ctx(struct btrfsic_block_data_ctx *block_ctx) BUG_ON(!block_ctx->pagev); num_pages = (block_ctx->len + (u64)PAGE_SIZE - 1) >> PAGE_SHIFT; + /* Pages must be unmapped in reverse order */ while (num_pages > 0) { num_pages--; if (block_ctx->datav[num_pages]) { - kunmap(block_ctx->pagev[num_pages]); + kunmap_local(block_ctx->datav[num_pages]); block_ctx->datav[num_pages] = NULL; } if (block_ctx->pagev[num_pages]) { @@ -1637,7 +1638,7 @@ static int btrfsic_read_block(struct btrfsic_state *state, i = j; } for (i = 0; i < num_pages; i++) - block_ctx->datav[i] = kmap(block_ctx->pagev[i]); + block_ctx->datav[i] = kmap_local_page(block_ctx->pagev[i]); return block_ctx->len; }