Merge tag 'erofs-for-6.8-rc1-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs
Pull erofs fixes from Gao Xiang: - Fix a "BUG: kernel NULL pointer dereference" issue due to inconsistent on-disk indices of compressed inodes against per-sb `available_compr_algs` generated by Syzkaller - Don't use certain unnecessary folio_*() helpers if the folio type (page cache) is known * tag 'erofs-for-6.8-rc1-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs: erofs: Don't use certain unnecessary folio_*() functions erofs: fix inconsistent per-file compression format
This commit is contained in:
@@ -408,7 +408,7 @@ int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb)
|
||||
int size, ret = 0;
|
||||
|
||||
if (!erofs_sb_has_compr_cfgs(sbi)) {
|
||||
sbi->available_compr_algs = Z_EROFS_COMPRESSION_LZ4;
|
||||
sbi->available_compr_algs = 1 << Z_EROFS_COMPRESSION_LZ4;
|
||||
return z_erofs_load_lz4_config(sb, dsb, NULL, 0);
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -165,10 +165,10 @@ static int erofs_fscache_read_folios_async(struct fscache_cookie *cookie,
|
||||
static int erofs_fscache_meta_read_folio(struct file *data, struct folio *folio)
|
||||
{
|
||||
int ret;
|
||||
struct erofs_fscache *ctx = folio_mapping(folio)->host->i_private;
|
||||
struct erofs_fscache *ctx = folio->mapping->host->i_private;
|
||||
struct erofs_fscache_request *req;
|
||||
|
||||
req = erofs_fscache_req_alloc(folio_mapping(folio),
|
||||
req = erofs_fscache_req_alloc(folio->mapping,
|
||||
folio_pos(folio), folio_size(folio));
|
||||
if (IS_ERR(req)) {
|
||||
folio_unlock(folio);
|
||||
@@ -276,7 +276,7 @@ static int erofs_fscache_read_folio(struct file *file, struct folio *folio)
|
||||
struct erofs_fscache_request *req;
|
||||
int ret;
|
||||
|
||||
req = erofs_fscache_req_alloc(folio_mapping(folio),
|
||||
req = erofs_fscache_req_alloc(folio->mapping,
|
||||
folio_pos(folio), folio_size(folio));
|
||||
if (IS_ERR(req)) {
|
||||
folio_unlock(folio);
|
||||
|
||||
+13
-10
@@ -454,7 +454,7 @@ static int z_erofs_do_map_blocks(struct inode *inode,
|
||||
.map = map,
|
||||
};
|
||||
int err = 0;
|
||||
unsigned int lclusterbits, endoff;
|
||||
unsigned int lclusterbits, endoff, afmt;
|
||||
unsigned long initial_lcn;
|
||||
unsigned long long ofs, end;
|
||||
|
||||
@@ -543,17 +543,20 @@ static int z_erofs_do_map_blocks(struct inode *inode,
|
||||
err = -EFSCORRUPTED;
|
||||
goto unmap_out;
|
||||
}
|
||||
if (vi->z_advise & Z_EROFS_ADVISE_INTERLACED_PCLUSTER)
|
||||
map->m_algorithmformat =
|
||||
Z_EROFS_COMPRESSION_INTERLACED;
|
||||
else
|
||||
map->m_algorithmformat =
|
||||
Z_EROFS_COMPRESSION_SHIFTED;
|
||||
} else if (m.headtype == Z_EROFS_LCLUSTER_TYPE_HEAD2) {
|
||||
map->m_algorithmformat = vi->z_algorithmtype[1];
|
||||
afmt = vi->z_advise & Z_EROFS_ADVISE_INTERLACED_PCLUSTER ?
|
||||
Z_EROFS_COMPRESSION_INTERLACED :
|
||||
Z_EROFS_COMPRESSION_SHIFTED;
|
||||
} else {
|
||||
map->m_algorithmformat = vi->z_algorithmtype[0];
|
||||
afmt = m.headtype == Z_EROFS_LCLUSTER_TYPE_HEAD2 ?
|
||||
vi->z_algorithmtype[1] : vi->z_algorithmtype[0];
|
||||
if (!(EROFS_I_SB(inode)->available_compr_algs & (1 << afmt))) {
|
||||
erofs_err(inode->i_sb, "inconsistent algorithmtype %u for nid %llu",
|
||||
afmt, vi->nid);
|
||||
err = -EFSCORRUPTED;
|
||||
goto unmap_out;
|
||||
}
|
||||
}
|
||||
map->m_algorithmformat = afmt;
|
||||
|
||||
if ((flags & EROFS_GET_BLOCKS_FIEMAP) ||
|
||||
((flags & EROFS_GET_BLOCKS_READMORE) &&
|
||||
|
||||
Reference in New Issue
Block a user