nilfs2: return the mapped address from nilfs_get_page()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 27 Nov 2023 14:30:25 +0000 (23:30 +0900)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 11 Dec 2023 01:21:46 +0000 (17:21 -0800)
In prepartion for switching from kmap() to kmap_local(), return the kmap
address from nilfs_get_page() instead of having the caller look up
page_address().

[konishi.ryusuke: fixed a missing blank line after declaration]
Link: https://lkml.kernel.org/r/20231127143036.2425-7-konishi.ryusuke@gmail.com
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/nilfs2/dir.c

index 385e47eda99f97cf3fc3eb031172ccbd23d0c7ef..45f75d4c452229c4e2c4299a224b7bc0c23229fd 100644 (file)
@@ -180,19 +180,24 @@ fail:
        return false;
 }
 
-static struct page *nilfs_get_page(struct inode *dir, unsigned long n)
+static void *nilfs_get_page(struct inode *dir, unsigned long n,
+               struct page **pagep)
 {
        struct address_space *mapping = dir->i_mapping;
        struct page *page = read_mapping_page(mapping, n, NULL);
+       void *kaddr;
 
-       if (!IS_ERR(page)) {
-               kmap(page);
-               if (unlikely(!PageChecked(page))) {
-                       if (!nilfs_check_page(page))
-                               goto fail;
-               }
+       if (IS_ERR(page))
+               return page;
+
+       kaddr = kmap(page);
+       if (unlikely(!PageChecked(page))) {
+               if (!nilfs_check_page(page))
+                       goto fail;
        }
-       return page;
+
+       *pagep = page;
+       return kaddr;
 
 fail:
        nilfs_put_page(page);
@@ -269,14 +274,14 @@ static int nilfs_readdir(struct file *file, struct dir_context *ctx)
        for ( ; n < npages; n++, offset = 0) {
                char *kaddr, *limit;
                struct nilfs_dir_entry *de;
-               struct page *page = nilfs_get_page(inode, n);
+               struct page *page;
 
-               if (IS_ERR(page)) {
+               kaddr = nilfs_get_page(inode, n, &page);
+               if (IS_ERR(kaddr)) {
                        nilfs_error(sb, "bad page in #%lu", inode->i_ino);
                        ctx->pos += PAGE_SIZE - offset;
                        return -EIO;
                }
-               kaddr = page_address(page);
                de = (struct nilfs_dir_entry *)(kaddr + offset);
                limit = kaddr + nilfs_last_byte(inode, n) -
                        NILFS_DIR_REC_LEN(1);
@@ -339,11 +344,9 @@ nilfs_find_entry(struct inode *dir, const struct qstr *qstr,
                start = 0;
        n = start;
        do {
-               char *kaddr;
+               char *kaddr = nilfs_get_page(dir, n, &page);
 
-               page = nilfs_get_page(dir, n);
-               if (!IS_ERR(page)) {
-                       kaddr = page_address(page);
+               if (!IS_ERR(kaddr)) {
                        de = (struct nilfs_dir_entry *)kaddr;
                        kaddr += nilfs_last_byte(dir, n) - reclen;
                        while ((char *) de <= kaddr) {
@@ -381,15 +384,11 @@ found:
 
 struct nilfs_dir_entry *nilfs_dotdot(struct inode *dir, struct page **p)
 {
-       struct page *page = nilfs_get_page(dir, 0);
-       struct nilfs_dir_entry *de = NULL;
+       struct nilfs_dir_entry *de = nilfs_get_page(dir, 0, p);
 
-       if (!IS_ERR(page)) {
-               de = nilfs_next_entry(
-                       (struct nilfs_dir_entry *)page_address(page));
-               *p = page;
-       }
-       return de;
+       if (IS_ERR(de))
+               return NULL;
+       return nilfs_next_entry(de);
 }
 
 ino_t nilfs_inode_by_name(struct inode *dir, const struct qstr *qstr)
@@ -451,12 +450,11 @@ int nilfs_add_link(struct dentry *dentry, struct inode *inode)
        for (n = 0; n <= npages; n++) {
                char *dir_end;
 
-               page = nilfs_get_page(dir, n);
-               err = PTR_ERR(page);
-               if (IS_ERR(page))
+               kaddr = nilfs_get_page(dir, n, &page);
+               err = PTR_ERR(kaddr);
+               if (IS_ERR(kaddr))
                        goto out;
                lock_page(page);
-               kaddr = page_address(page);
                dir_end = kaddr + nilfs_last_byte(dir, n);
                de = (struct nilfs_dir_entry *)kaddr;
                kaddr += PAGE_SIZE - reclen;
@@ -618,11 +616,10 @@ int nilfs_empty_dir(struct inode *inode)
                char *kaddr;
                struct nilfs_dir_entry *de;
 
-               page = nilfs_get_page(inode, i);
-               if (IS_ERR(page))
+               kaddr = nilfs_get_page(inode, i, &page);
+               if (IS_ERR(kaddr))
                        continue;
 
-               kaddr = page_address(page);
                de = (struct nilfs_dir_entry *)kaddr;
                kaddr += nilfs_last_byte(inode, i) - NILFS_DIR_REC_LEN(1);