ubifs: Convert ubifs_write_begin() to use a folio
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Wed, 24 Jan 2024 17:52:51 +0000 (17:52 +0000)
committerRichard Weinberger <richard@nod.at>
Sun, 25 Feb 2024 20:08:00 +0000 (21:08 +0100)
Save eight calls to compound_head() by using the new folio API.
Remove a few assumptions that would break with large folios.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Zhihao Cheng <chengzhihao1@huawei.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
fs/ubifs/file.c

index cc4d2ec95b70a804f29276d3ed5780adc7134198..13c078bdf156e205bed67d7ca7c3bf692b3f884b 100644 (file)
@@ -426,7 +426,7 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
        pgoff_t index = pos >> PAGE_SHIFT;
        int err, appending = !!(pos + len > inode->i_size);
        int skipped_read = 0;
-       struct page *page;
+       struct folio *folio;
 
        ubifs_assert(c, ubifs_inode(inode)->ui_size == inode->i_size);
        ubifs_assert(c, !c->ro_media && !c->ro_mount);
@@ -435,13 +435,14 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
                return -EROFS;
 
        /* Try out the fast-path part first */
-       page = grab_cache_page_write_begin(mapping, index);
-       if (unlikely(!page))
-               return -ENOMEM;
+       folio = __filemap_get_folio(mapping, index, FGP_WRITEBEGIN,
+                       mapping_gfp_mask(mapping));
+       if (IS_ERR(folio))
+               return PTR_ERR(folio);
 
-       if (!PageUptodate(page)) {
+       if (!folio_test_uptodate(folio)) {
                /* The page is not loaded from the flash */
-               if (!(pos & ~PAGE_MASK) && len == PAGE_SIZE) {
+               if (pos == folio_pos(folio) && len >= folio_size(folio)) {
                        /*
                         * We change whole page so no need to load it. But we
                         * do not know whether this page exists on the media or
@@ -451,19 +452,19 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
                         * media. Thus, we are setting the @PG_checked flag
                         * here.
                         */
-                       SetPageChecked(page);
+                       folio_set_checked(folio);
                        skipped_read = 1;
                } else {
-                       err = do_readpage(page);
+                       err = do_readpage(&folio->page);
                        if (err) {
-                               unlock_page(page);
-                               put_page(page);
+                               folio_unlock(folio);
+                               folio_put(folio);
                                return err;
                        }
                }
        }
 
-       err = allocate_budget(c, page, ui, appending);
+       err = allocate_budget(c, &folio->page, ui, appending);
        if (unlikely(err)) {
                ubifs_assert(c, err == -ENOSPC);
                /*
@@ -471,7 +472,7 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
                 * write all of it, then it is not up to date.
                 */
                if (skipped_read)
-                       ClearPageChecked(page);
+                       folio_clear_checked(folio);
                /*
                 * Budgeting failed which means it would have to force
                 * write-back but didn't, because we set the @fast flag in the
@@ -483,8 +484,8 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
                        ubifs_assert(c, mutex_is_locked(&ui->ui_mutex));
                        mutex_unlock(&ui->ui_mutex);
                }
-               unlock_page(page);
-               put_page(page);
+               folio_unlock(folio);
+               folio_put(folio);
 
                return write_begin_slow(mapping, pos, len, pagep);
        }
@@ -495,9 +496,8 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
         * with @ui->ui_mutex locked if we are appending pages, and unlocked
         * otherwise. This is an optimization (slightly hacky though).
         */
-       *pagep = page;
+       *pagep = &folio->page;
        return 0;
-
 }
 
 /**