Commit db675409 authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Jan Kara
Browse files

udf: Convert udf_expand_file_adinicb() to use a folio



Use the folio APIs throughout this function.

Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Fixes: 1eeceaec ("udf: Convert udf_expand_file_adinicb() to avoid kmap_atomic()")
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Message-Id: <20240417150416.752929-4-willy@infradead.org>
parent d08f069c
Loading
Loading
Loading
Loading
+14 −13
Original line number Diff line number Diff line
@@ -342,7 +342,7 @@ const struct address_space_operations udf_aops = {
 */
int udf_expand_file_adinicb(struct inode *inode)
{
	struct page *page;
	struct folio *folio;
	struct udf_inode_info *iinfo = UDF_I(inode);
	int err;

@@ -358,12 +358,13 @@ int udf_expand_file_adinicb(struct inode *inode)
		return 0;
	}

	page = find_or_create_page(inode->i_mapping, 0, GFP_KERNEL);
	if (!page)
		return -ENOMEM;
	folio = __filemap_get_folio(inode->i_mapping, 0,
			FGP_LOCK | FGP_ACCESSED | FGP_CREAT, GFP_KERNEL);
	if (IS_ERR(folio))
		return PTR_ERR(folio);

	if (!PageUptodate(page))
		udf_adinicb_readpage(page);
	if (!folio_test_uptodate(folio))
		udf_adinicb_readpage(&folio->page);
	down_write(&iinfo->i_data_sem);
	memset(iinfo->i_data + iinfo->i_lenEAttr, 0x00,
	       iinfo->i_lenAlloc);
@@ -372,22 +373,22 @@ int udf_expand_file_adinicb(struct inode *inode)
		iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT;
	else
		iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG;
	set_page_dirty(page);
	unlock_page(page);
	folio_mark_dirty(folio);
	folio_unlock(folio);
	up_write(&iinfo->i_data_sem);
	err = filemap_fdatawrite(inode->i_mapping);
	if (err) {
		/* Restore everything back so that we don't lose data... */
		lock_page(page);
		folio_lock(folio);
		down_write(&iinfo->i_data_sem);
		memcpy_to_page(page, 0, iinfo->i_data + iinfo->i_lenEAttr,
			       inode->i_size);
		unlock_page(page);
		memcpy_from_folio(iinfo->i_data + iinfo->i_lenEAttr,
				folio, 0, inode->i_size);
		folio_unlock(folio);
		iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB;
		iinfo->i_lenAlloc = inode->i_size;
		up_write(&iinfo->i_data_sem);
	}
	put_page(page);
	folio_put(folio);
	mark_inode_dirty(inode);

	return err;