Skip to content

Commit 09c5437

Browse files
committed
erofs: use meta buffers for zmap operations
Get rid of old erofs_get_meta_page() within zmap operations by using on-stack meta buffers in order to prepare subpage and folio features. Finally, erofs_get_meta_page() is useless. Get rid of it! Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Yue Hu <[email protected]> Reviewed-by: Liu Bo <[email protected]> Reviewed-by: Chao Yu <[email protected]> Signed-off-by: Gao Xiang <[email protected]>
1 parent bb88e8d commit 09c5437

File tree

4 files changed

+28
-70
lines changed

4 files changed

+28
-70
lines changed

fs/erofs/data.c

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,6 @@
99
#include <linux/dax.h>
1010
#include <trace/events/erofs.h>
1111

12-
struct page *erofs_get_meta_page(struct super_block *sb, erofs_blk_t blkaddr)
13-
{
14-
struct address_space *const mapping = sb->s_bdev->bd_inode->i_mapping;
15-
struct page *page;
16-
17-
page = read_cache_page_gfp(mapping, blkaddr,
18-
mapping_gfp_constraint(mapping, ~__GFP_FS));
19-
/* should already be PageUptodate */
20-
if (!IS_ERR(page))
21-
lock_page(page);
22-
return page;
23-
}
24-
2512
void erofs_unmap_metabuf(struct erofs_buf *buf)
2613
{
2714
if (buf->kmap_type == EROFS_KMAP)

fs/erofs/internal.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -419,14 +419,14 @@ enum {
419419
#define EROFS_MAP_FULL_MAPPED (1 << BH_FullMapped)
420420

421421
struct erofs_map_blocks {
422+
struct erofs_buf buf;
423+
422424
erofs_off_t m_pa, m_la;
423425
u64 m_plen, m_llen;
424426

425427
unsigned short m_deviceid;
426428
char m_algorithmformat;
427429
unsigned int m_flags;
428-
429-
struct page *mpage;
430430
};
431431

432432
/* Flags used by erofs_map_blocks_flatmode() */
@@ -474,7 +474,7 @@ struct erofs_map_dev {
474474

475475
/* data.c */
476476
extern const struct file_operations erofs_file_fops;
477-
struct page *erofs_get_meta_page(struct super_block *sb, erofs_blk_t blkaddr);
477+
void erofs_unmap_metabuf(struct erofs_buf *buf);
478478
void erofs_put_metabuf(struct erofs_buf *buf);
479479
void *erofs_read_metabuf(struct erofs_buf *buf, struct super_block *sb,
480480
erofs_blk_t blkaddr, enum erofs_kmap_type type);

fs/erofs/zdata.c

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -698,20 +698,18 @@ static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe,
698698
goto err_out;
699699

700700
if (z_erofs_is_inline_pcluster(clt->pcl)) {
701-
struct page *mpage;
701+
void *mp;
702702

703-
mpage = erofs_get_meta_page(inode->i_sb,
704-
erofs_blknr(map->m_pa));
705-
if (IS_ERR(mpage)) {
706-
err = PTR_ERR(mpage);
703+
mp = erofs_read_metabuf(&fe->map.buf, inode->i_sb,
704+
erofs_blknr(map->m_pa), EROFS_NO_KMAP);
705+
if (IS_ERR(mp)) {
706+
err = PTR_ERR(mp);
707707
erofs_err(inode->i_sb,
708708
"failed to get inline page, err %d", err);
709709
goto err_out;
710710
}
711-
/* TODO: new subpage feature will get rid of it */
712-
unlock_page(mpage);
713-
714-
WRITE_ONCE(clt->pcl->compressed_pages[0], mpage);
711+
get_page(fe->map.buf.page);
712+
WRITE_ONCE(clt->pcl->compressed_pages[0], fe->map.buf.page);
715713
clt->mode = COLLECT_PRIMARY_FOLLOWED_NOINPLACE;
716714
} else {
717715
/* preload all compressed pages (can change mode if needed) */
@@ -1529,9 +1527,7 @@ static int z_erofs_readpage(struct file *file, struct page *page)
15291527
if (err)
15301528
erofs_err(inode->i_sb, "failed to read, err [%d]", err);
15311529

1532-
if (f.map.mpage)
1533-
put_page(f.map.mpage);
1534-
1530+
erofs_put_metabuf(&f.map.buf);
15351531
erofs_release_pages(&pagepool);
15361532
return err;
15371533
}
@@ -1576,8 +1572,7 @@ static void z_erofs_readahead(struct readahead_control *rac)
15761572

15771573
z_erofs_runqueue(inode->i_sb, &f, &pagepool,
15781574
z_erofs_get_sync_decompress_policy(sbi, nr_pages));
1579-
if (f.map.mpage)
1580-
put_page(f.map.mpage);
1575+
erofs_put_metabuf(&f.map.buf);
15811576
erofs_release_pages(&pagepool);
15821577
}
15831578

fs/erofs/zmap.c

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ static int z_erofs_fill_inode_lazy(struct inode *inode)
3535
struct super_block *const sb = inode->i_sb;
3636
int err, headnr;
3737
erofs_off_t pos;
38-
struct page *page;
38+
struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
3939
void *kaddr;
4040
struct z_erofs_map_header *h;
4141

@@ -61,14 +61,13 @@ static int z_erofs_fill_inode_lazy(struct inode *inode)
6161

6262
pos = ALIGN(iloc(EROFS_SB(sb), vi->nid) + vi->inode_isize +
6363
vi->xattr_isize, 8);
64-
page = erofs_get_meta_page(sb, erofs_blknr(pos));
65-
if (IS_ERR(page)) {
66-
err = PTR_ERR(page);
64+
kaddr = erofs_read_metabuf(&buf, sb, erofs_blknr(pos),
65+
EROFS_KMAP_ATOMIC);
66+
if (IS_ERR(kaddr)) {
67+
err = PTR_ERR(kaddr);
6768
goto out_unlock;
6869
}
6970

70-
kaddr = kmap_atomic(page);
71-
7271
h = kaddr + erofs_blkoff(pos);
7372
vi->z_advise = le16_to_cpu(h->h_advise);
7473
vi->z_algorithmtype[0] = h->h_algorithmtype & 15;
@@ -101,20 +100,19 @@ static int z_erofs_fill_inode_lazy(struct inode *inode)
101100
goto unmap_done;
102101
}
103102
unmap_done:
104-
kunmap_atomic(kaddr);
105-
unlock_page(page);
106-
put_page(page);
103+
erofs_put_metabuf(&buf);
107104
if (err)
108105
goto out_unlock;
109106

110107
if (vi->z_advise & Z_EROFS_ADVISE_INLINE_PCLUSTER) {
111-
struct erofs_map_blocks map = { .mpage = NULL };
108+
struct erofs_map_blocks map = {
109+
.buf = __EROFS_BUF_INITIALIZER
110+
};
112111

113112
vi->z_idata_size = le16_to_cpu(h->h_idata_size);
114113
err = z_erofs_do_map_blocks(inode, &map,
115114
EROFS_GET_BLOCKS_FINDTAIL);
116-
if (map.mpage)
117-
put_page(map.mpage);
115+
erofs_put_metabuf(&map.buf);
118116

119117
if (!map.m_plen ||
120118
erofs_blkoff(map.m_pa) + map.m_plen > EROFS_BLKSIZ) {
@@ -151,31 +149,11 @@ static int z_erofs_reload_indexes(struct z_erofs_maprecorder *m,
151149
erofs_blk_t eblk)
152150
{
153151
struct super_block *const sb = m->inode->i_sb;
154-
struct erofs_map_blocks *const map = m->map;
155-
struct page *mpage = map->mpage;
156-
157-
if (mpage) {
158-
if (mpage->index == eblk) {
159-
if (!m->kaddr)
160-
m->kaddr = kmap_atomic(mpage);
161-
return 0;
162-
}
163152

164-
if (m->kaddr) {
165-
kunmap_atomic(m->kaddr);
166-
m->kaddr = NULL;
167-
}
168-
put_page(mpage);
169-
}
170-
171-
mpage = erofs_get_meta_page(sb, eblk);
172-
if (IS_ERR(mpage)) {
173-
map->mpage = NULL;
174-
return PTR_ERR(mpage);
175-
}
176-
m->kaddr = kmap_atomic(mpage);
177-
unlock_page(mpage);
178-
map->mpage = mpage;
153+
m->kaddr = erofs_read_metabuf(&m->map->buf, sb, eblk,
154+
EROFS_KMAP_ATOMIC);
155+
if (IS_ERR(m->kaddr))
156+
return PTR_ERR(m->kaddr);
179157
return 0;
180158
}
181159

@@ -711,8 +689,7 @@ static int z_erofs_do_map_blocks(struct inode *inode,
711689
map->m_flags |= EROFS_MAP_FULL_MAPPED;
712690
}
713691
unmap_out:
714-
if (m.kaddr)
715-
kunmap_atomic(m.kaddr);
692+
erofs_unmap_metabuf(&m.map->buf);
716693

717694
out:
718695
erofs_dbg("%s, m_la %llu m_pa %llu m_llen %llu m_plen %llu m_flags 0%o",
@@ -759,8 +736,7 @@ static int z_erofs_iomap_begin_report(struct inode *inode, loff_t offset,
759736
struct erofs_map_blocks map = { .m_la = offset };
760737

761738
ret = z_erofs_map_blocks_iter(inode, &map, EROFS_GET_BLOCKS_FIEMAP);
762-
if (map.mpage)
763-
put_page(map.mpage);
739+
erofs_put_metabuf(&map.buf);
764740
if (ret < 0)
765741
return ret;
766742

0 commit comments

Comments
 (0)