Skip to content

Commit 9364b55

Browse files
Hongzhen Luohsiangkao
authored andcommitted
erofs: support compressed inodes for page cache share
This patch adds page cache sharing functionality for compressed inodes. Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com> Signed-off-by: Hongbo Li <lihongbo22@huawei.com> Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
1 parent 34096ba commit 9364b55

2 files changed

Lines changed: 24 additions & 16 deletions

File tree

fs/erofs/ishare.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@ bool erofs_ishare_fill_inode(struct inode *inode)
4444
struct inode *sharedinode;
4545
unsigned long hash;
4646

47-
if (erofs_inode_is_data_compressed(vi->datalayout))
48-
return false;
4947
if (erofs_xattr_fill_inode_fingerprint(&fp, inode, sbi->domain_id))
5048
return false;
5149
hash = xxh32(fp.opaque, fp.size, 0);

fs/erofs/zdata.c

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ enum z_erofs_pclustermode {
494494
};
495495

496496
struct z_erofs_frontend {
497-
struct inode *const inode;
497+
struct inode *inode, *sharedinode;
498498
struct erofs_map_blocks map;
499499
struct z_erofs_bvec_iter biter;
500500

@@ -509,8 +509,8 @@ struct z_erofs_frontend {
509509
unsigned int icur;
510510
};
511511

512-
#define Z_EROFS_DEFINE_FRONTEND(fe, i, ho) struct z_erofs_frontend fe = { \
513-
.inode = i, .head = Z_EROFS_PCLUSTER_TAIL, \
512+
#define Z_EROFS_DEFINE_FRONTEND(fe, i, si, ho) struct z_erofs_frontend fe = { \
513+
.inode = i, .sharedinode = si, .head = Z_EROFS_PCLUSTER_TAIL, \
514514
.mode = Z_EROFS_PCLUSTER_FOLLOWED, .headoffset = ho }
515515

516516
static bool z_erofs_should_alloc_cache(struct z_erofs_frontend *fe)
@@ -1858,7 +1858,7 @@ static void z_erofs_pcluster_readmore(struct z_erofs_frontend *f,
18581858
pgoff_t index = cur >> PAGE_SHIFT;
18591859
struct folio *folio;
18601860

1861-
folio = erofs_grab_folio_nowait(inode->i_mapping, index);
1861+
folio = erofs_grab_folio_nowait(f->sharedinode->i_mapping, index);
18621862
if (!IS_ERR_OR_NULL(folio)) {
18631863
if (folio_test_uptodate(folio))
18641864
folio_unlock(folio);
@@ -1875,11 +1875,13 @@ static void z_erofs_pcluster_readmore(struct z_erofs_frontend *f,
18751875

18761876
static int z_erofs_read_folio(struct file *file, struct folio *folio)
18771877
{
1878-
struct inode *const inode = folio->mapping->host;
1879-
Z_EROFS_DEFINE_FRONTEND(f, inode, folio_pos(folio));
1878+
struct inode *sharedinode = folio->mapping->host;
1879+
bool need_iput;
1880+
struct inode *realinode = erofs_real_inode(sharedinode, &need_iput);
1881+
Z_EROFS_DEFINE_FRONTEND(f, realinode, sharedinode, folio_pos(folio));
18801882
int err;
18811883

1882-
trace_erofs_read_folio(inode, folio, false);
1884+
trace_erofs_read_folio(realinode, folio, false);
18831885
z_erofs_pcluster_readmore(&f, NULL, true);
18841886
err = z_erofs_scan_folio(&f, folio, false);
18851887
z_erofs_pcluster_readmore(&f, NULL, false);
@@ -1888,23 +1890,28 @@ static int z_erofs_read_folio(struct file *file, struct folio *folio)
18881890
/* if some pclusters are ready, need submit them anyway */
18891891
err = z_erofs_runqueue(&f, 0) ?: err;
18901892
if (err && err != -EINTR)
1891-
erofs_err(inode->i_sb, "read error %d @ %lu of nid %llu",
1892-
err, folio->index, EROFS_I(inode)->nid);
1893+
erofs_err(realinode->i_sb, "read error %d @ %lu of nid %llu",
1894+
err, folio->index, EROFS_I(realinode)->nid);
18931895

18941896
erofs_put_metabuf(&f.map.buf);
18951897
erofs_release_pages(&f.pagepool);
1898+
1899+
if (need_iput)
1900+
iput(realinode);
18961901
return err;
18971902
}
18981903

18991904
static void z_erofs_readahead(struct readahead_control *rac)
19001905
{
1901-
struct inode *const inode = rac->mapping->host;
1902-
Z_EROFS_DEFINE_FRONTEND(f, inode, readahead_pos(rac));
1906+
struct inode *sharedinode = rac->mapping->host;
1907+
bool need_iput;
1908+
struct inode *realinode = erofs_real_inode(sharedinode, &need_iput);
1909+
Z_EROFS_DEFINE_FRONTEND(f, realinode, sharedinode, readahead_pos(rac));
19031910
unsigned int nrpages = readahead_count(rac);
19041911
struct folio *head = NULL, *folio;
19051912
int err;
19061913

1907-
trace_erofs_readahead(inode, readahead_index(rac), nrpages, false);
1914+
trace_erofs_readahead(realinode, readahead_index(rac), nrpages, false);
19081915
z_erofs_pcluster_readmore(&f, rac, true);
19091916
while ((folio = readahead_folio(rac))) {
19101917
folio->private = head;
@@ -1918,15 +1925,18 @@ static void z_erofs_readahead(struct readahead_control *rac)
19181925

19191926
err = z_erofs_scan_folio(&f, folio, true);
19201927
if (err && err != -EINTR)
1921-
erofs_err(inode->i_sb, "readahead error at folio %lu @ nid %llu",
1922-
folio->index, EROFS_I(inode)->nid);
1928+
erofs_err(realinode->i_sb, "readahead error at folio %lu @ nid %llu",
1929+
folio->index, EROFS_I(realinode)->nid);
19231930
}
19241931
z_erofs_pcluster_readmore(&f, rac, false);
19251932
z_erofs_pcluster_end(&f);
19261933

19271934
(void)z_erofs_runqueue(&f, nrpages << PAGE_SHIFT);
19281935
erofs_put_metabuf(&f.map.buf);
19291936
erofs_release_pages(&f.pagepool);
1937+
1938+
if (need_iput)
1939+
iput(realinode);
19301940
}
19311941

19321942
const struct address_space_operations z_erofs_aops = {

0 commit comments

Comments
 (0)