Merge tag 'gfs2-v6.6-rc2-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / fs / gfs2 / bmap.c
index 011cd992e0e6d23ca54d5740255ff12155464506..d9ccfd27e4f11fe4ecc7ce36981cbef469942847 100644 (file)
@@ -43,53 +43,51 @@ struct metapath {
 static int punch_hole(struct gfs2_inode *ip, u64 offset, u64 length);
 
 /**
- * gfs2_unstuffer_page - unstuff a stuffed inode into a block cached by a page
+ * gfs2_unstuffer_folio - unstuff a stuffed inode into a block cached by a folio
  * @ip: the inode
  * @dibh: the dinode buffer
  * @block: the block number that was allocated
- * @page: The (optional) page. This is looked up if @page is NULL
+ * @folio: The folio.
  *
  * Returns: errno
  */
-
-static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh,
-                              u64 block, struct page *page)
+static int gfs2_unstuffer_folio(struct gfs2_inode *ip, struct buffer_head *dibh,
+                              u64 block, struct folio *folio)
 {
        struct inode *inode = &ip->i_inode;
 
-       if (!PageUptodate(page)) {
-               void *kaddr = kmap(page);
+       if (!folio_test_uptodate(folio)) {
+               void *kaddr = kmap_local_folio(folio, 0);
                u64 dsize = i_size_read(inode);
  
                memcpy(kaddr, dibh->b_data + sizeof(struct gfs2_dinode), dsize);
-               memset(kaddr + dsize, 0, PAGE_SIZE - dsize);
-               kunmap(page);
+               memset(kaddr + dsize, 0, folio_size(folio) - dsize);
+               kunmap_local(kaddr);
 
-               SetPageUptodate(page);
+               folio_mark_uptodate(folio);
        }
 
        if (gfs2_is_jdata(ip)) {
-               struct buffer_head *bh;
+               struct buffer_head *bh = folio_buffers(folio);
 
-               if (!page_has_buffers(page))
-                       create_empty_buffers(page, BIT(inode->i_blkbits),
-                                            BIT(BH_Uptodate));
+               if (!bh)
+                       bh = create_empty_buffers(folio,
+                               BIT(inode->i_blkbits), BIT(BH_Uptodate));
 
-               bh = page_buffers(page);
                if (!buffer_mapped(bh))
                        map_bh(bh, inode->i_sb, block);
 
                set_buffer_uptodate(bh);
                gfs2_trans_add_data(ip->i_gl, bh);
        } else {
-               set_page_dirty(page);
+               folio_mark_dirty(folio);
                gfs2_ordered_add_inode(ip);
        }
 
        return 0;
 }
 
-static int __gfs2_unstuff_inode(struct gfs2_inode *ip, struct page *page)
+static int __gfs2_unstuff_inode(struct gfs2_inode *ip, struct folio *folio)
 {
        struct buffer_head *bh, *dibh;
        struct gfs2_dinode *di;
@@ -106,7 +104,7 @@ static int __gfs2_unstuff_inode(struct gfs2_inode *ip, struct page *page)
                   and write it out to disk */
 
                unsigned int n = 1;
-               error = gfs2_alloc_blocks(ip, &block, &n, 0, NULL);
+               error = gfs2_alloc_blocks(ip, &block, &n, 0);
                if (error)
                        goto out_brelse;
                if (isdir) {
@@ -118,7 +116,7 @@ static int __gfs2_unstuff_inode(struct gfs2_inode *ip, struct page *page)
                                              dibh, sizeof(struct gfs2_dinode));
                        brelse(bh);
                } else {
-                       error = gfs2_unstuffer_page(ip, dibh, block, page);
+                       error = gfs2_unstuffer_folio(ip, dibh, block, folio);
                        if (error)
                                goto out_brelse;
                }
@@ -157,17 +155,17 @@ out_brelse:
 int gfs2_unstuff_dinode(struct gfs2_inode *ip)
 {
        struct inode *inode = &ip->i_inode;
-       struct page *page;
+       struct folio *folio;
        int error;
 
        down_write(&ip->i_rw_mutex);
-       page = grab_cache_page(inode->i_mapping, 0);
-       error = -ENOMEM;
-       if (!page)
+       folio = filemap_grab_folio(inode->i_mapping, 0);
+       error = PTR_ERR(folio);
+       if (IS_ERR(folio))
                goto out;
-       error = __gfs2_unstuff_inode(ip, page);
-       unlock_page(page);
-       put_page(page);
+       error = __gfs2_unstuff_inode(ip, folio);
+       folio_unlock(folio);
+       folio_put(folio);
 out:
        up_write(&ip->i_rw_mutex);
        return error;
@@ -317,6 +315,12 @@ static void gfs2_metapath_ra(struct gfs2_glock *gl, __be64 *start, __be64 *end)
        }
 }
 
+static inline struct buffer_head *
+metapath_dibh(struct metapath *mp)
+{
+       return mp->mp_bh[0];
+}
+
 static int __fillup_metapath(struct gfs2_inode *ip, struct metapath *mp,
                             unsigned int x, unsigned int h)
 {
@@ -415,13 +419,12 @@ static void release_metapath(struct metapath *mp)
  * gfs2_extent_length - Returns length of an extent of blocks
  * @bh: The metadata block
  * @ptr: Current position in @bh
- * @limit: Max extent length to return
  * @eob: Set to 1 if we hit "end of block"
  *
  * Returns: The length of the extent (minimum of one block)
  */
 
-static inline unsigned int gfs2_extent_length(struct buffer_head *bh, __be64 *ptr, size_t limit, int *eob)
+static inline unsigned int gfs2_extent_length(struct buffer_head *bh, __be64 *ptr, int *eob)
 {
        const __be64 *end = (__be64 *)(bh->b_data + bh->b_size);
        const __be64 *first = ptr;
@@ -660,7 +663,7 @@ static int __gfs2_iomap_alloc(struct inode *inode, struct iomap *iomap,
 {
        struct gfs2_inode *ip = GFS2_I(inode);
        struct gfs2_sbd *sdp = GFS2_SB(inode);
-       struct buffer_head *dibh = mp->mp_bh[0];
+       struct buffer_head *dibh = metapath_dibh(mp);
        u64 bn;
        unsigned n, i, blks, alloced = 0, iblks = 0, branch_start = 0;
        size_t dblks = iomap->length >> inode->i_blkbits;
@@ -702,7 +705,7 @@ static int __gfs2_iomap_alloc(struct inode *inode, struct iomap *iomap,
        i = mp->mp_aheight;
        do {
                n = blks - alloced;
-               ret = gfs2_alloc_blocks(ip, &bn, &n, 0, NULL);
+               ret = gfs2_alloc_blocks(ip, &bn, &n, 0);
                if (ret)
                        goto out;
                alloced += n;
@@ -913,7 +916,7 @@ unstuff:
                goto do_alloc;
 
        bh = mp->mp_bh[ip->i_height - 1];
-       len = gfs2_extent_length(bh, ptr, len, &eob);
+       len = gfs2_extent_length(bh, ptr, &eob);
 
        iomap->addr = be64_to_cpu(*ptr) << inode->i_blkbits;
        iomap->length = len << inode->i_blkbits;