]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
btrfs: convert kmap to kmap_local_page, simple cases
authorIra Weiny <ira.weiny@intel.com>
Wed, 17 Feb 2021 02:48:23 +0000 (18:48 -0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Apr 2021 15:25:16 +0000 (17:25 +0200)
Use a simple coccinelle script to help convert the most common
kmap()/kunmap() patterns to kmap_local_page()/kunmap_local().

Note that some kmaps which were caught by this script needed to be
handled by hand because of the strict unmapping order of kunmap_local()
so they are not included in this patch.  But this script got us started.

There's another temp variable added for the final length write to the
first page so it does not interfere with cpage_out that is used for
mapping other pages.

The development of this patch was aided by the follow script:

// <smpl>
// SPDX-License-Identifier: GPL-2.0-only
// Find kmap and replace with kmap_local_page then mark kunmap
//
// Confidence: Low
// Copyright: (C) 2021 Intel Corporation
// URL: http://coccinelle.lip6.fr/

@ catch_all @
expression e, e2;
@@

(
-kmap(e)
+kmap_local_page(e)
)
...
(
-kunmap(...)
+kunmap_local()
)

// </smpl>

Signed-off-by: Ira Weiny <ira.weiny@intel.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/compression.c
fs/btrfs/inode.c
fs/btrfs/lzo.c
fs/btrfs/raid56.c

index 3f4c832abfed6229963a3a78d4708af743fdd078..2600703fab83ff1369da5ef65edf95f87a9e0411 100644 (file)
@@ -1611,7 +1611,7 @@ static void heuristic_collect_sample(struct inode *inode, u64 start, u64 end,
        curr_sample_pos = 0;
        while (index < index_end) {
                page = find_get_page(inode->i_mapping, index);
-               in_data = kmap(page);
+               in_data = kmap_local_page(page);
                /* Handle case where the start is not aligned to PAGE_SIZE */
                i = start % PAGE_SIZE;
                while (i < PAGE_SIZE - SAMPLING_READ_SIZE) {
@@ -1624,7 +1624,7 @@ static void heuristic_collect_sample(struct inode *inode, u64 start, u64 end,
                        start += SAMPLING_INTERVAL;
                        curr_sample_pos += SAMPLING_READ_SIZE;
                }
-               kunmap(page);
+               kunmap_local(in_data);
                put_page(page);
 
                index++;
index 0e007da64a365fe1a3ac9f9faf2d38af056cd027..8f21036bcc99ae85d750fb3e2c93c08fae30bf60 100644 (file)
@@ -7019,7 +7019,7 @@ next:
                                if (ret)
                                        goto out;
                        } else {
-                               map = kmap(page);
+                               map = kmap_local_page(page);
                                read_extent_buffer(leaf, map + pg_offset, ptr,
                                                   copy_size);
                                if (pg_offset + copy_size < PAGE_SIZE) {
@@ -7027,7 +7027,7 @@ next:
                                               PAGE_SIZE - pg_offset -
                                               copy_size);
                                }
-                               kunmap(page);
+                               kunmap_local(map);
                        }
                        flush_dcache_page(page);
                }
index 9084a950dc091c0bef974613108d8b5c3988b202..cd042c7567a4752f2103cb2d1d5a23fc578ff5b2 100644 (file)
@@ -118,7 +118,7 @@ int lzo_compress_pages(struct list_head *ws, struct address_space *mapping,
        struct workspace *workspace = list_entry(ws, struct workspace, list);
        int ret = 0;
        char *data_in;
-       char *cpage_out;
+       char *cpage_out, *sizes_ptr;
        int nr_pages = 0;
        struct page *in_page = NULL;
        struct page *out_page = NULL;
@@ -258,10 +258,9 @@ int lzo_compress_pages(struct list_head *ws, struct address_space *mapping,
        }
 
        /* store the size of all chunks of compressed data */
-       cpage_out = kmap(pages[0]);
-       write_compress_length(cpage_out, tot_out);
-
-       kunmap(pages[0]);
+       sizes_ptr = kmap_local_page(pages[0]);
+       write_compress_length(sizes_ptr, tot_out);
+       kunmap_local(sizes_ptr);
 
        ret = 0;
        *total_out = tot_out;
index 0a2858609bb7cee58415948263f2f76d386b22d4..633b4b1b1ee1b01707239e8fc838948225abcbd3 100644 (file)
@@ -2388,13 +2388,13 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio,
 
                /* Check scrubbing parity and repair it */
                p = rbio_stripe_page(rbio, rbio->scrubp, pagenr);
-               parity = kmap(p);
+               parity = kmap_local_page(p);
                if (memcmp(parity, pointers[rbio->scrubp], PAGE_SIZE))
                        copy_page(parity, pointers[rbio->scrubp]);
                else
                        /* Parity is right, needn't writeback */
                        bitmap_clear(rbio->dbitmap, pagenr, 1);
-               kunmap(p);
+               kunmap_local(parity);
 
                for (stripe = 0; stripe < nr_data; stripe++)
                        kunmap(page_in_rbio(rbio, stripe, pagenr, 0));