Commit e9b5b23e authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle)
Browse files

fs: Change the type of filler_t



By making filler_t the same as read_folio, we can use the same function
for both in gfs2.  We can push the use of folios down one more level
in jffs2 and nfs.  We also increase type safety for future users of the
various read_cache_page() family of functions by forcing the parameter
to be a pointer to struct file (or NULL).

Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
parent 6ece0a04
Loading
Loading
Loading
Loading
+11 −18
Original line number Diff line number Diff line
@@ -464,21 +464,24 @@ static int stuffed_readpage(struct gfs2_inode *ip, struct page *page)
	return 0;
}


static int __gfs2_readpage(void *file, struct page *page)
/**
 * gfs2_read_folio - read a folio from a file
 * @file: The file to read
 * @folio: The folio in the file
 */
static int gfs2_read_folio(struct file *file, struct folio *folio)
{
	struct folio *folio = page_folio(page);
	struct inode *inode = page->mapping->host;
	struct inode *inode = folio->mapping->host;
	struct gfs2_inode *ip = GFS2_I(inode);
	struct gfs2_sbd *sdp = GFS2_SB(inode);
	int error;

	if (!gfs2_is_jdata(ip) ||
	    (i_blocksize(inode) == PAGE_SIZE && !page_has_buffers(page))) {
	    (i_blocksize(inode) == PAGE_SIZE && !folio_buffers(folio))) {
		error = iomap_read_folio(folio, &gfs2_iomap_ops);
	} else if (gfs2_is_stuffed(ip)) {
		error = stuffed_readpage(ip, page);
		unlock_page(page);
		error = stuffed_readpage(ip, &folio->page);
		folio_unlock(folio);
	} else {
		error = mpage_read_folio(folio, gfs2_block_map);
	}
@@ -489,16 +492,6 @@ static int __gfs2_readpage(void *file, struct page *page)
	return error;
}

/**
 * gfs2_read_folio - read a folio from a file
 * @file: The file to read
 * @folio: The folio in the file
 */
static int gfs2_read_folio(struct file *file, struct folio *folio)
{
	return __gfs2_readpage(file, &folio->page);
}

/**
 * gfs2_internal_read - read an internal file
 * @ip: The gfs2 inode
@@ -523,7 +516,7 @@ int gfs2_internal_read(struct gfs2_inode *ip, char *buf, loff_t *pos,
		amt = size - copied;
		if (offset + size > PAGE_SIZE)
			amt = PAGE_SIZE - offset;
		page = read_cache_page(mapping, index, __gfs2_readpage, NULL);
		page = read_cache_page(mapping, index, gfs2_read_folio, NULL);
		if (IS_ERR(page))
			return PTR_ERR(page);
		p = kmap_atomic(page);
+4 −5
Original line number Diff line number Diff line
@@ -110,21 +110,20 @@ static int jffs2_do_readpage_nolock (struct inode *inode, struct page *pg)
	return ret;
}

int jffs2_do_readpage_unlock(void *data, struct page *pg)
int __jffs2_read_folio(struct file *file, struct folio *folio)
{
	int ret = jffs2_do_readpage_nolock(pg->mapping->host, pg);
	unlock_page(pg);
	int ret = jffs2_do_readpage_nolock(folio->mapping->host, &folio->page);
	folio_unlock(folio);
	return ret;
}


static int jffs2_read_folio(struct file *file, struct folio *folio)
{
	struct jffs2_inode_info *f = JFFS2_INODE_INFO(folio->mapping->host);
	int ret;

	mutex_lock(&f->sem);
	ret = jffs2_do_readpage_unlock(file, &folio->page);
	ret = __jffs2_read_folio(file, folio);
	mutex_unlock(&f->sem);
	return ret;
}
+1 −1
Original line number Diff line number Diff line
@@ -1327,7 +1327,7 @@ static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_era
	 * trying to write out, read_cache_page() will not deadlock. */
	mutex_unlock(&f->sem);
	page = read_cache_page(inode->i_mapping, start >> PAGE_SHIFT,
			       jffs2_do_readpage_unlock, NULL);
			       __jffs2_read_folio, NULL);
	if (IS_ERR(page)) {
		pr_warn("read_cache_page() returned error: %ld\n",
			PTR_ERR(page));
+1 −1
Original line number Diff line number Diff line
@@ -155,7 +155,7 @@ extern const struct file_operations jffs2_file_operations;
extern const struct inode_operations jffs2_file_inode_operations;
extern const struct address_space_operations jffs2_file_address_operations;
int jffs2_fsync(struct file *, loff_t, loff_t, int);
int jffs2_do_readpage_unlock(void *data, struct page *pg);
int __jffs2_read_folio(struct file *file, struct folio *folio);

/* ioctl.c */
long jffs2_ioctl(struct file *, unsigned int, unsigned long);
+7 −7
Original line number Diff line number Diff line
@@ -26,21 +26,21 @@
 * and straight-forward than readdir caching.
 */

static int nfs_symlink_filler(void *data, struct page *page)
static int nfs_symlink_filler(struct file *file, struct folio *folio)
{
	struct inode *inode = page->mapping->host;
	struct inode *inode = folio->mapping->host;
	int error;

	error = NFS_PROTO(inode)->readlink(inode, page, 0, PAGE_SIZE);
	error = NFS_PROTO(inode)->readlink(inode, &folio->page, 0, PAGE_SIZE);
	if (error < 0)
		goto error;
	SetPageUptodate(page);
	unlock_page(page);
	folio_mark_uptodate(folio);
	folio_unlock(folio);
	return 0;

error:
	SetPageError(page);
	unlock_page(page);
	folio_set_error(folio);
	folio_unlock(folio);
	return -EIO;
}

Loading