RISC-V: Fix a race condition during kernel stack overflow
[platform/kernel/linux-starfive.git] / fs / nilfs2 / page.c
index 3267e96..39b7eea 100644 (file)
@@ -480,41 +480,36 @@ unsigned long nilfs_find_uncommitted_extent(struct inode *inode,
                                            sector_t start_blk,
                                            sector_t *blkoff)
 {
-       unsigned int i;
+       unsigned int i, nr_folios;
        pgoff_t index;
-       unsigned int nblocks_in_page;
        unsigned long length = 0;
-       sector_t b;
-       struct pagevec pvec;
-       struct page *page;
+       struct folio_batch fbatch;
+       struct folio *folio;
 
        if (inode->i_mapping->nrpages == 0)
                return 0;
 
        index = start_blk >> (PAGE_SHIFT - inode->i_blkbits);
-       nblocks_in_page = 1U << (PAGE_SHIFT - inode->i_blkbits);
 
-       pagevec_init(&pvec);
+       folio_batch_init(&fbatch);
 
 repeat:
-       pvec.nr = find_get_pages_contig(inode->i_mapping, index, PAGEVEC_SIZE,
-                                       pvec.pages);
-       if (pvec.nr == 0)
+       nr_folios = filemap_get_folios_contig(inode->i_mapping, &index, ULONG_MAX,
+                       &fbatch);
+       if (nr_folios == 0)
                return length;
 
-       if (length > 0 && pvec.pages[0]->index > index)
-               goto out;
-
-       b = pvec.pages[0]->index << (PAGE_SHIFT - inode->i_blkbits);
        i = 0;
        do {
-               page = pvec.pages[i];
+               folio = fbatch.folios[i];
 
-               lock_page(page);
-               if (page_has_buffers(page)) {
+               folio_lock(folio);
+               if (folio_buffers(folio)) {
                        struct buffer_head *bh, *head;
+                       sector_t b;
 
-                       bh = head = page_buffers(page);
+                       b = folio->index << (PAGE_SHIFT - inode->i_blkbits);
+                       bh = head = folio_buffers(folio);
                        do {
                                if (b < start_blk)
                                        continue;
@@ -529,21 +524,17 @@ repeat:
                } else {
                        if (length > 0)
                                goto out_locked;
-
-                       b += nblocks_in_page;
                }
-               unlock_page(page);
+               folio_unlock(folio);
 
-       } while (++i < pagevec_count(&pvec));
+       } while (++i < nr_folios);
 
-       index = page->index + 1;
-       pagevec_release(&pvec);
+       folio_batch_release(&fbatch);
        cond_resched();
        goto repeat;
 
 out_locked:
-       unlock_page(page);
-out:
-       pagevec_release(&pvec);
+       folio_unlock(folio);
+       folio_batch_release(&fbatch);
        return length;
 }