gfs2: Convert to release_folio
Use a folio throughout gfs2_release_folio(). Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Reviewed-by: Bob Peterson <rpeterso@redhat.com> Reviewed-by: Jeff Layton <jlayton@kernel.org>
This commit is contained in:
parent
c26cd04586
commit
e45c20d110
|
@ -691,38 +691,40 @@ static void gfs2_invalidate_folio(struct folio *folio, size_t offset,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gfs2_releasepage - free the metadata associated with a page
|
* gfs2_release_folio - free the metadata associated with a folio
|
||||||
* @page: the page that's being released
|
* @folio: the folio that's being released
|
||||||
* @gfp_mask: passed from Linux VFS, ignored by us
|
* @gfp_mask: passed from Linux VFS, ignored by us
|
||||||
*
|
*
|
||||||
* Calls try_to_free_buffers() to free the buffers and put the page if the
|
* Calls try_to_free_buffers() to free the buffers and put the folio if the
|
||||||
* buffers can be released.
|
* buffers can be released.
|
||||||
*
|
*
|
||||||
* Returns: 1 if the page was put or else 0
|
* Returns: true if the folio was put or else false
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
|
bool gfs2_release_folio(struct folio *folio, gfp_t gfp_mask)
|
||||||
{
|
{
|
||||||
struct address_space *mapping = page->mapping;
|
struct address_space *mapping = folio->mapping;
|
||||||
struct gfs2_sbd *sdp = gfs2_mapping2sbd(mapping);
|
struct gfs2_sbd *sdp = gfs2_mapping2sbd(mapping);
|
||||||
struct buffer_head *bh, *head;
|
struct buffer_head *bh, *head;
|
||||||
struct gfs2_bufdata *bd;
|
struct gfs2_bufdata *bd;
|
||||||
|
|
||||||
if (!page_has_buffers(page))
|
head = folio_buffers(folio);
|
||||||
return 0;
|
if (!head)
|
||||||
|
return false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* From xfs_vm_releasepage: mm accommodates an old ext3 case where
|
* mm accommodates an old ext3 case where clean folios might
|
||||||
* clean pages might not have had the dirty bit cleared. Thus, it can
|
* not have had the dirty bit cleared. Thus, it can send actual
|
||||||
* send actual dirty pages to ->releasepage() via shrink_active_list().
|
* dirty folios to ->release_folio() via shrink_active_list().
|
||||||
*
|
*
|
||||||
* As a workaround, we skip pages that contain dirty buffers below.
|
* As a workaround, we skip folios that contain dirty buffers
|
||||||
* Once ->releasepage isn't called on dirty pages anymore, we can warn
|
* below. Once ->release_folio isn't called on dirty folios
|
||||||
* on dirty buffers like we used to here again.
|
* anymore, we can warn on dirty buffers like we used to here
|
||||||
|
* again.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
gfs2_log_lock(sdp);
|
gfs2_log_lock(sdp);
|
||||||
head = bh = page_buffers(page);
|
bh = head;
|
||||||
do {
|
do {
|
||||||
if (atomic_read(&bh->b_count))
|
if (atomic_read(&bh->b_count))
|
||||||
goto cannot_release;
|
goto cannot_release;
|
||||||
|
@ -732,9 +734,9 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
|
||||||
if (buffer_dirty(bh) || WARN_ON(buffer_pinned(bh)))
|
if (buffer_dirty(bh) || WARN_ON(buffer_pinned(bh)))
|
||||||
goto cannot_release;
|
goto cannot_release;
|
||||||
bh = bh->b_this_page;
|
bh = bh->b_this_page;
|
||||||
} while(bh != head);
|
} while (bh != head);
|
||||||
|
|
||||||
head = bh = page_buffers(page);
|
bh = head;
|
||||||
do {
|
do {
|
||||||
bd = bh->b_private;
|
bd = bh->b_private;
|
||||||
if (bd) {
|
if (bd) {
|
||||||
|
@ -755,11 +757,11 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
|
||||||
} while (bh != head);
|
} while (bh != head);
|
||||||
gfs2_log_unlock(sdp);
|
gfs2_log_unlock(sdp);
|
||||||
|
|
||||||
return try_to_free_buffers(page);
|
return try_to_free_buffers(&folio->page);
|
||||||
|
|
||||||
cannot_release:
|
cannot_release:
|
||||||
gfs2_log_unlock(sdp);
|
gfs2_log_unlock(sdp);
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct address_space_operations gfs2_aops = {
|
static const struct address_space_operations gfs2_aops = {
|
||||||
|
@ -785,7 +787,7 @@ static const struct address_space_operations gfs2_jdata_aops = {
|
||||||
.dirty_folio = jdata_dirty_folio,
|
.dirty_folio = jdata_dirty_folio,
|
||||||
.bmap = gfs2_bmap,
|
.bmap = gfs2_bmap,
|
||||||
.invalidate_folio = gfs2_invalidate_folio,
|
.invalidate_folio = gfs2_invalidate_folio,
|
||||||
.releasepage = gfs2_releasepage,
|
.release_folio = gfs2_release_folio,
|
||||||
.is_partially_uptodate = block_is_partially_uptodate,
|
.is_partially_uptodate = block_is_partially_uptodate,
|
||||||
.error_remove_page = generic_error_remove_page,
|
.error_remove_page = generic_error_remove_page,
|
||||||
};
|
};
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
extern int gfs2_releasepage(struct page *page, gfp_t gfp_mask);
|
bool gfs2_release_folio(struct folio *folio, gfp_t gfp_mask);
|
||||||
extern int gfs2_internal_read(struct gfs2_inode *ip,
|
extern int gfs2_internal_read(struct gfs2_inode *ip,
|
||||||
char *buf, loff_t *pos, unsigned size);
|
char *buf, loff_t *pos, unsigned size);
|
||||||
extern void gfs2_set_aops(struct inode *inode);
|
extern void gfs2_set_aops(struct inode *inode);
|
||||||
|
|
|
@ -92,14 +92,14 @@ const struct address_space_operations gfs2_meta_aops = {
|
||||||
.dirty_folio = block_dirty_folio,
|
.dirty_folio = block_dirty_folio,
|
||||||
.invalidate_folio = block_invalidate_folio,
|
.invalidate_folio = block_invalidate_folio,
|
||||||
.writepage = gfs2_aspace_writepage,
|
.writepage = gfs2_aspace_writepage,
|
||||||
.releasepage = gfs2_releasepage,
|
.release_folio = gfs2_release_folio,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct address_space_operations gfs2_rgrp_aops = {
|
const struct address_space_operations gfs2_rgrp_aops = {
|
||||||
.dirty_folio = block_dirty_folio,
|
.dirty_folio = block_dirty_folio,
|
||||||
.invalidate_folio = block_invalidate_folio,
|
.invalidate_folio = block_invalidate_folio,
|
||||||
.writepage = gfs2_aspace_writepage,
|
.writepage = gfs2_aspace_writepage,
|
||||||
.releasepage = gfs2_releasepage,
|
.release_folio = gfs2_release_folio,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue