gfs2: Convert gfs2_internal_read to folios
authorAndreas Gruenbacher <agruenba@redhat.com>
Mon, 24 Jul 2023 18:53:14 +0000 (20:53 +0200)
committerAndreas Gruenbacher <agruenba@redhat.com>
Mon, 6 Nov 2023 00:51:26 +0000 (01:51 +0100)
Change gfs2_internal_read() to use folios.  Convert sizes to size_t.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/aops.c
fs/gfs2/inode.h

index 98bc02f890d167eebc2ad5de2f4ab6bf13f90b92..23fc474046fbf5598d3d58ddf3121ed53530b760 100644 (file)
@@ -477,31 +477,29 @@ static int gfs2_read_folio(struct file *file, struct folio *folio)
  *
  */
 
-int gfs2_internal_read(struct gfs2_inode *ip, char *buf, loff_t *pos,
-                       unsigned size)
+ssize_t gfs2_internal_read(struct gfs2_inode *ip, char *buf, loff_t *pos,
+                          size_t size)
 {
        struct address_space *mapping = ip->i_inode.i_mapping;
        unsigned long index = *pos >> PAGE_SHIFT;
-       unsigned offset = *pos & (PAGE_SIZE - 1);
-       unsigned copied = 0;
-       unsigned amt;
-       struct page *page;
+       size_t copied = 0;
 
        do {
-               page = read_cache_page(mapping, index, gfs2_read_folio, NULL);
-               if (IS_ERR(page)) {
-                       if (PTR_ERR(page) == -EINTR)
+               size_t offset, chunk;
+               struct folio *folio;
+
+               folio = read_cache_folio(mapping, index, gfs2_read_folio, NULL);
+               if (IS_ERR(folio)) {
+                       if (PTR_ERR(folio) == -EINTR)
                                continue;
-                       return PTR_ERR(page);
+                       return PTR_ERR(folio);
                }
-               amt = size - copied;
-               if (offset + size > PAGE_SIZE)
-                       amt = PAGE_SIZE - offset;
-               memcpy_from_page(buf + copied, page, offset, amt);
-               put_page(page);
-               copied += amt;
-               index++;
-               offset = 0;
+               offset = *pos + copied - folio_pos(folio);
+               chunk = min(size - copied, folio_size(folio) - offset);
+               memcpy_from_folio(buf + copied, folio, offset, chunk);
+               index = folio_next_index(folio);
+               folio_put(folio);
+               copied += chunk;
        } while(copied < size);
        (*pos) += size;
        return size;
index 908c739220b83160653f2f69e90e1a79449fc47f..041b93367002505d89699b270860c4151806be70 100644 (file)
@@ -13,8 +13,8 @@
 #include "util.h"
 
 bool gfs2_release_folio(struct folio *folio, gfp_t gfp_mask);
-extern int gfs2_internal_read(struct gfs2_inode *ip,
-                             char *buf, loff_t *pos, unsigned size);
+extern ssize_t gfs2_internal_read(struct gfs2_inode *ip,
+                                 char *buf, loff_t *pos, size_t size);
 extern void gfs2_set_aops(struct inode *inode);
 
 static inline int gfs2_is_stuffed(const struct gfs2_inode *ip)