diff options
Diffstat (limited to 'fs/nilfs2/segment.c')
| -rw-r--r-- | fs/nilfs2/segment.c | 46 | 
1 files changed, 24 insertions, 22 deletions
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 76c3bd88b858..19446a8243d7 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c @@ -680,7 +680,7 @@ static size_t nilfs_lookup_dirty_data_buffers(struct inode *inode,  					      loff_t start, loff_t end)  {  	struct address_space *mapping = inode->i_mapping; -	struct pagevec pvec; +	struct folio_batch fbatch;  	pgoff_t index = 0, last = ULONG_MAX;  	size_t ndirties = 0;  	int i; @@ -694,23 +694,26 @@ static size_t nilfs_lookup_dirty_data_buffers(struct inode *inode,  		index = start >> PAGE_SHIFT;  		last = end >> PAGE_SHIFT;  	} -	pagevec_init(&pvec); +	folio_batch_init(&fbatch);   repeat:  	if (unlikely(index > last) || -	    !pagevec_lookup_range_tag(&pvec, mapping, &index, last, -				PAGECACHE_TAG_DIRTY)) +	      !filemap_get_folios_tag(mapping, &index, last, +		      PAGECACHE_TAG_DIRTY, &fbatch))  		return ndirties; -	for (i = 0; i < pagevec_count(&pvec); i++) { +	for (i = 0; i < folio_batch_count(&fbatch); i++) {  		struct buffer_head *bh, *head; -		struct page *page = pvec.pages[i]; +		struct folio *folio = fbatch.folios[i]; -		lock_page(page); -		if (!page_has_buffers(page)) -			create_empty_buffers(page, i_blocksize(inode), 0); -		unlock_page(page); +		folio_lock(folio); +		head = folio_buffers(folio); +		if (!head) { +			create_empty_buffers(&folio->page, i_blocksize(inode), 0); +			head = folio_buffers(folio); +		} +		folio_unlock(folio); -		bh = head = page_buffers(page); +		bh = head;  		do {  			if (!buffer_dirty(bh) || buffer_async_write(bh))  				continue; @@ -718,13 +721,13 @@ static size_t nilfs_lookup_dirty_data_buffers(struct inode *inode,  			list_add_tail(&bh->b_assoc_buffers, listp);  			ndirties++;  			if (unlikely(ndirties >= nlimit)) { -				pagevec_release(&pvec); +				folio_batch_release(&fbatch);  				cond_resched();  				return ndirties;  			}  		} while (bh = bh->b_this_page, bh != head);  	} -	pagevec_release(&pvec); +	folio_batch_release(&fbatch);  	cond_resched();  	goto repeat;  } @@ -734,20 +737,19 @@ static void nilfs_lookup_dirty_node_buffers(struct inode *inode,  {  	struct nilfs_inode_info *ii = NILFS_I(inode);  	struct inode *btnc_inode = ii->i_assoc_inode; -	struct pagevec pvec; +	struct folio_batch fbatch;  	struct buffer_head *bh, *head;  	unsigned int i;  	pgoff_t index = 0;  	if (!btnc_inode)  		return; +	folio_batch_init(&fbatch); -	pagevec_init(&pvec); - -	while (pagevec_lookup_tag(&pvec, btnc_inode->i_mapping, &index, -					PAGECACHE_TAG_DIRTY)) { -		for (i = 0; i < pagevec_count(&pvec); i++) { -			bh = head = page_buffers(pvec.pages[i]); +	while (filemap_get_folios_tag(btnc_inode->i_mapping, &index, +				(pgoff_t)-1, PAGECACHE_TAG_DIRTY, &fbatch)) { +		for (i = 0; i < folio_batch_count(&fbatch); i++) { +			bh = head = folio_buffers(fbatch.folios[i]);  			do {  				if (buffer_dirty(bh) &&  						!buffer_async_write(bh)) { @@ -758,7 +760,7 @@ static void nilfs_lookup_dirty_node_buffers(struct inode *inode,  				bh = bh->b_this_page;  			} while (bh != head);  		} -		pagevec_release(&pvec); +		folio_batch_release(&fbatch);  		cond_resched();  	}  } @@ -1581,7 +1583,7 @@ nilfs_segctor_update_payload_blocknr(struct nilfs_sc_info *sci,  			nblocks = le32_to_cpu(finfo->fi_nblocks);  			ndatablk = le32_to_cpu(finfo->fi_ndatablk); -			inode = bh->b_page->mapping->host; +			inode = bh->b_folio->mapping->host;  			if (mode == SC_LSEG_DSYNC)  				sc_op = &nilfs_sc_dsync_ops;  |