erofs: kill prio and nofail of erofs_get_meta_page()
As Christoph pointed out [1], "Why is there __erofs_get_meta_page with the two weird booleans instead of a single erofs_get_meta_page that gets and gfp_t for additional flags and an unsigned int for additional bio op flags." And since all callers can handle errors, let's kill prio and nofail and erofs_get_inline_page() now. [1] https://lore.kernel.org/r/20190830162812.GA10694@infradead.org/ Reported-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Gao Xiang <gaoxiang25@huawei.com> Link: https://lore.kernel.org/r/20190904020912.63925-17-gaoxiang25@huawei.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
a5c0b7802c
commit
e655b5b3a2
|
@ -51,25 +51,19 @@ static struct bio *erofs_grab_raw_bio(struct super_block *sb,
|
||||||
return bio;
|
return bio;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* prio -- true is used for dir */
|
struct page *erofs_get_meta_page(struct super_block *sb, erofs_blk_t blkaddr)
|
||||||
struct page *__erofs_get_meta_page(struct super_block *sb,
|
|
||||||
erofs_blk_t blkaddr, bool prio, bool nofail)
|
|
||||||
{
|
{
|
||||||
struct inode *const bd_inode = sb->s_bdev->bd_inode;
|
struct inode *const bd_inode = sb->s_bdev->bd_inode;
|
||||||
struct address_space *const mapping = bd_inode->i_mapping;
|
struct address_space *const mapping = bd_inode->i_mapping;
|
||||||
/* prefer retrying in the allocator to blindly looping below */
|
const gfp_t gfp = mapping_gfp_constraint(mapping, ~__GFP_FS);
|
||||||
const gfp_t gfp = mapping_gfp_constraint(mapping, ~__GFP_FS) |
|
|
||||||
(nofail ? __GFP_NOFAIL : 0);
|
|
||||||
unsigned int io_retries = nofail ? EROFS_IO_MAX_RETRIES_NOFAIL : 0;
|
|
||||||
struct page *page;
|
struct page *page;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
repeat:
|
repeat:
|
||||||
page = find_or_create_page(mapping, blkaddr, gfp);
|
page = find_or_create_page(mapping, blkaddr, gfp);
|
||||||
if (!page) {
|
if (!page)
|
||||||
DBG_BUGON(nofail);
|
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
}
|
|
||||||
DBG_BUGON(!PageLocked(page));
|
DBG_BUGON(!PageLocked(page));
|
||||||
|
|
||||||
if (!PageUptodate(page)) {
|
if (!PageUptodate(page)) {
|
||||||
|
@ -82,14 +76,11 @@ repeat:
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
__submit_bio(bio, REQ_OP_READ,
|
__submit_bio(bio, REQ_OP_READ, REQ_META);
|
||||||
REQ_META | (prio ? REQ_PRIO : 0));
|
|
||||||
|
|
||||||
lock_page(page);
|
lock_page(page);
|
||||||
|
|
||||||
/* this page has been truncated by others */
|
/* this page has been truncated by others */
|
||||||
if (page->mapping != mapping) {
|
if (page->mapping != mapping) {
|
||||||
unlock_repeat:
|
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
put_page(page);
|
put_page(page);
|
||||||
goto repeat;
|
goto repeat;
|
||||||
|
@ -97,10 +88,6 @@ unlock_repeat:
|
||||||
|
|
||||||
/* more likely a read error */
|
/* more likely a read error */
|
||||||
if (!PageUptodate(page)) {
|
if (!PageUptodate(page)) {
|
||||||
if (io_retries) {
|
|
||||||
--io_retries;
|
|
||||||
goto unlock_repeat;
|
|
||||||
}
|
|
||||||
err = -EIO;
|
err = -EIO;
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
@ -251,7 +238,7 @@ submit_bio_retry:
|
||||||
|
|
||||||
DBG_BUGON(map.m_plen > PAGE_SIZE);
|
DBG_BUGON(map.m_plen > PAGE_SIZE);
|
||||||
|
|
||||||
ipage = erofs_get_meta_page(inode->i_sb, blknr, 0);
|
ipage = erofs_get_meta_page(inode->i_sb, blknr);
|
||||||
|
|
||||||
if (IS_ERR(ipage)) {
|
if (IS_ERR(ipage)) {
|
||||||
err = PTR_ERR(ipage);
|
err = PTR_ERR(ipage);
|
||||||
|
|
|
@ -182,7 +182,7 @@ static int fill_inode(struct inode *inode, int isdir)
|
||||||
debugln("%s, reading inode nid %llu at %u of blkaddr %u",
|
debugln("%s, reading inode nid %llu at %u of blkaddr %u",
|
||||||
__func__, vi->nid, ofs, blkaddr);
|
__func__, vi->nid, ofs, blkaddr);
|
||||||
|
|
||||||
page = erofs_get_meta_page(inode->i_sb, blkaddr, isdir);
|
page = erofs_get_meta_page(inode->i_sb, blkaddr);
|
||||||
|
|
||||||
if (IS_ERR(page)) {
|
if (IS_ERR(page)) {
|
||||||
errln("failed to get inode (nid: %llu) page, err %ld",
|
errln("failed to get inode (nid: %llu) page, err %ld",
|
||||||
|
|
|
@ -258,8 +258,6 @@ static inline int erofs_wait_on_workgroup_freezed(struct erofs_workgroup *grp)
|
||||||
#error erofs cannot be used in this platform
|
#error erofs cannot be used in this platform
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define EROFS_IO_MAX_RETRIES_NOFAIL 5
|
|
||||||
|
|
||||||
#define ROOT_NID(sb) ((sb)->root_nid)
|
#define ROOT_NID(sb) ((sb)->root_nid)
|
||||||
|
|
||||||
#define erofs_blknr(addr) ((addr) / EROFS_BLKSIZ)
|
#define erofs_blknr(addr) ((addr) / EROFS_BLKSIZ)
|
||||||
|
@ -418,24 +416,10 @@ static inline void __submit_bio(struct bio *bio, unsigned int op,
|
||||||
submit_bio(bio);
|
submit_bio(bio);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct page *__erofs_get_meta_page(struct super_block *sb, erofs_blk_t blkaddr,
|
struct page *erofs_get_meta_page(struct super_block *sb, erofs_blk_t blkaddr);
|
||||||
bool prio, bool nofail);
|
|
||||||
|
|
||||||
static inline struct page *erofs_get_meta_page(struct super_block *sb,
|
|
||||||
erofs_blk_t blkaddr, bool prio)
|
|
||||||
{
|
|
||||||
return __erofs_get_meta_page(sb, blkaddr, prio, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
int erofs_map_blocks(struct inode *, struct erofs_map_blocks *, int);
|
int erofs_map_blocks(struct inode *, struct erofs_map_blocks *, int);
|
||||||
|
|
||||||
static inline struct page *erofs_get_inline_page(struct inode *inode,
|
|
||||||
erofs_blk_t blkaddr)
|
|
||||||
{
|
|
||||||
return erofs_get_meta_page(inode->i_sb, blkaddr,
|
|
||||||
S_ISDIR(inode->i_mode));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* inode.c */
|
/* inode.c */
|
||||||
static inline unsigned long erofs_inode_hash(erofs_nid_t nid)
|
static inline unsigned long erofs_inode_hash(erofs_nid_t nid)
|
||||||
{
|
{
|
||||||
|
|
|
@ -87,7 +87,7 @@ static int init_inode_xattrs(struct inode *inode)
|
||||||
it.blkaddr = erofs_blknr(iloc(sbi, vi->nid) + vi->inode_isize);
|
it.blkaddr = erofs_blknr(iloc(sbi, vi->nid) + vi->inode_isize);
|
||||||
it.ofs = erofs_blkoff(iloc(sbi, vi->nid) + vi->inode_isize);
|
it.ofs = erofs_blkoff(iloc(sbi, vi->nid) + vi->inode_isize);
|
||||||
|
|
||||||
it.page = erofs_get_inline_page(inode, it.blkaddr);
|
it.page = erofs_get_meta_page(sb, it.blkaddr);
|
||||||
if (IS_ERR(it.page)) {
|
if (IS_ERR(it.page)) {
|
||||||
ret = PTR_ERR(it.page);
|
ret = PTR_ERR(it.page);
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
@ -117,8 +117,7 @@ static int init_inode_xattrs(struct inode *inode)
|
||||||
DBG_BUGON(it.ofs != EROFS_BLKSIZ);
|
DBG_BUGON(it.ofs != EROFS_BLKSIZ);
|
||||||
xattr_iter_end(&it, atomic_map);
|
xattr_iter_end(&it, atomic_map);
|
||||||
|
|
||||||
it.page = erofs_get_meta_page(sb, ++it.blkaddr,
|
it.page = erofs_get_meta_page(sb, ++it.blkaddr);
|
||||||
S_ISDIR(inode->i_mode));
|
|
||||||
if (IS_ERR(it.page)) {
|
if (IS_ERR(it.page)) {
|
||||||
kfree(vi->xattr_shared_xattrs);
|
kfree(vi->xattr_shared_xattrs);
|
||||||
vi->xattr_shared_xattrs = NULL;
|
vi->xattr_shared_xattrs = NULL;
|
||||||
|
@ -168,7 +167,7 @@ static inline int xattr_iter_fixup(struct xattr_iter *it)
|
||||||
|
|
||||||
it->blkaddr += erofs_blknr(it->ofs);
|
it->blkaddr += erofs_blknr(it->ofs);
|
||||||
|
|
||||||
it->page = erofs_get_meta_page(it->sb, it->blkaddr, false);
|
it->page = erofs_get_meta_page(it->sb, it->blkaddr);
|
||||||
if (IS_ERR(it->page)) {
|
if (IS_ERR(it->page)) {
|
||||||
int err = PTR_ERR(it->page);
|
int err = PTR_ERR(it->page);
|
||||||
|
|
||||||
|
@ -199,7 +198,7 @@ static int inline_xattr_iter_begin(struct xattr_iter *it,
|
||||||
it->blkaddr = erofs_blknr(iloc(sbi, vi->nid) + inline_xattr_ofs);
|
it->blkaddr = erofs_blknr(iloc(sbi, vi->nid) + inline_xattr_ofs);
|
||||||
it->ofs = erofs_blkoff(iloc(sbi, vi->nid) + inline_xattr_ofs);
|
it->ofs = erofs_blkoff(iloc(sbi, vi->nid) + inline_xattr_ofs);
|
||||||
|
|
||||||
it->page = erofs_get_inline_page(inode, it->blkaddr);
|
it->page = erofs_get_meta_page(inode->i_sb, it->blkaddr);
|
||||||
if (IS_ERR(it->page))
|
if (IS_ERR(it->page))
|
||||||
return PTR_ERR(it->page);
|
return PTR_ERR(it->page);
|
||||||
|
|
||||||
|
@ -401,7 +400,7 @@ static int shared_getxattr(struct inode *inode, struct getxattr_iter *it)
|
||||||
if (i)
|
if (i)
|
||||||
xattr_iter_end(&it->it, true);
|
xattr_iter_end(&it->it, true);
|
||||||
|
|
||||||
it->it.page = erofs_get_meta_page(sb, blkaddr, false);
|
it->it.page = erofs_get_meta_page(sb, blkaddr);
|
||||||
if (IS_ERR(it->it.page))
|
if (IS_ERR(it->it.page))
|
||||||
return PTR_ERR(it->it.page);
|
return PTR_ERR(it->it.page);
|
||||||
|
|
||||||
|
@ -623,7 +622,7 @@ static int shared_listxattr(struct listxattr_iter *it)
|
||||||
if (i)
|
if (i)
|
||||||
xattr_iter_end(&it->it, true);
|
xattr_iter_end(&it->it, true);
|
||||||
|
|
||||||
it->it.page = erofs_get_meta_page(sb, blkaddr, false);
|
it->it.page = erofs_get_meta_page(sb, blkaddr);
|
||||||
if (IS_ERR(it->it.page))
|
if (IS_ERR(it->it.page))
|
||||||
return PTR_ERR(it->it.page);
|
return PTR_ERR(it->it.page);
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ static int fill_inode_lazy(struct inode *inode)
|
||||||
|
|
||||||
pos = ALIGN(iloc(EROFS_SB(sb), vi->nid) + vi->inode_isize +
|
pos = ALIGN(iloc(EROFS_SB(sb), vi->nid) + vi->inode_isize +
|
||||||
vi->xattr_isize, 8);
|
vi->xattr_isize, 8);
|
||||||
page = erofs_get_meta_page(sb, erofs_blknr(pos), false);
|
page = erofs_get_meta_page(sb, erofs_blknr(pos));
|
||||||
if (IS_ERR(page)) {
|
if (IS_ERR(page)) {
|
||||||
err = PTR_ERR(page);
|
err = PTR_ERR(page);
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
@ -127,7 +127,7 @@ static int z_erofs_reload_indexes(struct z_erofs_maprecorder *m,
|
||||||
put_page(mpage);
|
put_page(mpage);
|
||||||
}
|
}
|
||||||
|
|
||||||
mpage = erofs_get_meta_page(sb, eblk, false);
|
mpage = erofs_get_meta_page(sb, eblk);
|
||||||
if (IS_ERR(mpage)) {
|
if (IS_ERR(mpage)) {
|
||||||
map->mpage = NULL;
|
map->mpage = NULL;
|
||||||
return PTR_ERR(mpage);
|
return PTR_ERR(mpage);
|
||||||
|
|
Loading…
Reference in New Issue