squashfs: convert squashfs_symlink_read_folio to use folio APIs
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Sat, 20 Apr 2024 02:50:17 +0000 (03:50 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 8 May 2024 15:41:28 +0000 (08:41 -0700)
Remove use of page APIs, return the errno instead of 0, switch from
kmap_atomic to kmap_local and use folio_end_read() to unify the two exit
paths.

Link: https://lkml.kernel.org/r/20240420025029.2166544-23-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Tested-by: Phillip Lougher <phillip@squashfs.org.uk>
Reviewed-by: Phillip Lougher <phillip@squashfs.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/squashfs/symlink.c

index 2bf977a52c2c37590eaf39e32ccf9f4c468dfdb7..6ef735bd841a16be3c4d0e518e569635d237f4f3 100644 (file)
 
 static int squashfs_symlink_read_folio(struct file *file, struct folio *folio)
 {
-       struct page *page = &folio->page;
-       struct inode *inode = page->mapping->host;
+       struct inode *inode = folio->mapping->host;
        struct super_block *sb = inode->i_sb;
        struct squashfs_sb_info *msblk = sb->s_fs_info;
-       int index = page->index << PAGE_SHIFT;
+       int index = folio_pos(folio);
        u64 block = squashfs_i(inode)->start;
        int offset = squashfs_i(inode)->offset;
        int length = min_t(int, i_size_read(inode) - index, PAGE_SIZE);
-       int bytes, copied;
+       int bytes, copied, error;
        void *pageaddr;
        struct squashfs_cache_entry *entry;
 
        TRACE("Entered squashfs_symlink_readpage, page index %ld, start block "
-                       "%llx, offset %x\n", page->index, block, offset);
+                       "%llx, offset %x\n", folio->index, block, offset);
 
        /*
         * Skip index bytes into symlink metadata.
@@ -57,14 +56,15 @@ static int squashfs_symlink_read_folio(struct file *file, struct folio *folio)
                        ERROR("Unable to read symlink [%llx:%x]\n",
                                squashfs_i(inode)->start,
                                squashfs_i(inode)->offset);
-                       goto error_out;
+                       error = bytes;
+                       goto out;
                }
        }
 
        /*
         * Read length bytes from symlink metadata.  Squashfs_read_metadata
         * is not used here because it can sleep and we want to use
-        * kmap_atomic to map the page.  Instead call the underlying
+        * kmap_local to map the folio.  Instead call the underlying
         * squashfs_cache_get routine.  As length bytes may overlap metadata
         * blocks, we may need to call squashfs_cache_get multiple times.
         */
@@ -75,29 +75,26 @@ static int squashfs_symlink_read_folio(struct file *file, struct folio *folio)
                                squashfs_i(inode)->start,
                                squashfs_i(inode)->offset);
                        squashfs_cache_put(entry);
-                       goto error_out;
+                       error = entry->error;
+                       goto out;
                }
 
-               pageaddr = kmap_atomic(page);
+               pageaddr = kmap_local_folio(folio, 0);
                copied = squashfs_copy_data(pageaddr + bytes, entry, offset,
                                                                length - bytes);
                if (copied == length - bytes)
                        memset(pageaddr + length, 0, PAGE_SIZE - length);
                else
                        block = entry->next_index;
-               kunmap_atomic(pageaddr);
+               kunmap_local(pageaddr);
                squashfs_cache_put(entry);
        }
 
-       flush_dcache_page(page);
-       SetPageUptodate(page);
-       unlock_page(page);
-       return 0;
-
-error_out:
-       SetPageError(page);
-       unlock_page(page);
-       return 0;
+       flush_dcache_folio(folio);
+       error = 0;
+out:
+       folio_end_read(folio, error == 0);
+       return error;
 }