Merge tag 'mm-stable-2023-11-01-14-33' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / fs / gfs2 / quota.c
index d9854aece15b5612441bb1d42762d3e95c597bff..5cbbc1a46a92bb46e77bc9aa690f5a035acd357c 100644 (file)
@@ -196,13 +196,26 @@ static unsigned long gfs2_qd_shrink_count(struct shrinker *shrink,
        return vfs_pressure_ratio(list_lru_shrink_count(&gfs2_qd_lru, sc));
 }
 
-struct shrinker gfs2_qd_shrinker = {
-       .count_objects = gfs2_qd_shrink_count,
-       .scan_objects = gfs2_qd_shrink_scan,
-       .seeks = DEFAULT_SEEKS,
-       .flags = SHRINKER_NUMA_AWARE,
-};
+static struct shrinker *gfs2_qd_shrinker;
+
+int __init gfs2_qd_shrinker_init(void)
+{
+       gfs2_qd_shrinker = shrinker_alloc(SHRINKER_NUMA_AWARE, "gfs2-qd");
+       if (!gfs2_qd_shrinker)
+               return -ENOMEM;
+
+       gfs2_qd_shrinker->count_objects = gfs2_qd_shrink_count;
+       gfs2_qd_shrinker->scan_objects = gfs2_qd_shrink_scan;
+
+       shrinker_register(gfs2_qd_shrinker);
 
+       return 0;
+}
+
+void gfs2_qd_shrinker_exit(void)
+{
+       shrinker_free(gfs2_qd_shrinker);
+}
 
 static u64 qd2index(struct gfs2_quota_data *qd)
 {
@@ -736,7 +749,7 @@ static int gfs2_write_buf_to_page(struct gfs2_sbd *sdp, unsigned long index,
        struct gfs2_inode *ip = GFS2_I(sdp->sd_quota_inode);
        struct inode *inode = &ip->i_inode;
        struct address_space *mapping = inode->i_mapping;
-       struct page *page;
+       struct folio *folio;
        struct buffer_head *bh;
        u64 blk;
        unsigned bsize = sdp->sd_sb.sb_bsize, bnum = 0, boff = 0;
@@ -745,15 +758,15 @@ static int gfs2_write_buf_to_page(struct gfs2_sbd *sdp, unsigned long index,
        blk = index << (PAGE_SHIFT - sdp->sd_sb.sb_bsize_shift);
        boff = off % bsize;
 
-       page = grab_cache_page(mapping, index);
-       if (!page)
-               return -ENOMEM;
-       if (!page_has_buffers(page))
-               create_empty_buffers(page, bsize, 0);
+       folio = filemap_grab_folio(mapping, index);
+       if (IS_ERR(folio))
+               return PTR_ERR(folio);
+       bh = folio_buffers(folio);
+       if (!bh)
+               bh = create_empty_buffers(folio, bsize, 0);
 
-       bh = page_buffers(page);
-       for(;;) {
-               /* Find the beginning block within the page */
+       for (;;) {
+               /* Find the beginning block within the folio */
                if (pg_off >= ((bnum * bsize) + bsize)) {
                        bh = bh->b_this_page;
                        bnum++;
@@ -766,9 +779,10 @@ static int gfs2_write_buf_to_page(struct gfs2_sbd *sdp, unsigned long index,
                                goto unlock_out;
                        /* If it's a newly allocated disk block, zero it */
                        if (buffer_new(bh))
-                               zero_user(page, bnum * bsize, bh->b_size);
+                               folio_zero_range(folio, bnum * bsize,
+                                               bh->b_size);
                }
-               if (PageUptodate(page))
+               if (folio_test_uptodate(folio))
                        set_buffer_uptodate(bh);
                if (bh_read(bh, REQ_META | REQ_PRIO) < 0)
                        goto unlock_out;
@@ -784,17 +798,17 @@ static int gfs2_write_buf_to_page(struct gfs2_sbd *sdp, unsigned long index,
                break;
        }
 
-       /* Write to the page, now that we have setup the buffer(s) */
-       memcpy_to_page(page, off, buf, bytes);
-       flush_dcache_page(page);
-       unlock_page(page);
-       put_page(page);
+       /* Write to the folio, now that we have setup the buffer(s) */
+       memcpy_to_folio(folio, off, buf, bytes);
+       flush_dcache_folio(folio);
+       folio_unlock(folio);
+       folio_put(folio);
 
        return 0;
 
 unlock_out:
-       unlock_page(page);
-       put_page(page);
+       folio_unlock(folio);
+       folio_put(folio);
        return -EIO;
 }