Commit 6f362500 authored by Linus Torvalds's avatar Linus Torvalds

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
parents b5f66ba2 2b872b0f
...@@ -408,7 +408,7 @@ int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb) ...@@ -408,7 +408,7 @@ int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb)
int size, ret = 0; int size, ret = 0;
if (!erofs_sb_has_compr_cfgs(sbi)) { 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); return z_erofs_load_lz4_config(sb, dsb, NULL, 0);
} }
......
...@@ -165,10 +165,10 @@ static int erofs_fscache_read_folios_async(struct fscache_cookie *cookie, ...@@ -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) static int erofs_fscache_meta_read_folio(struct file *data, struct folio *folio)
{ {
int ret; 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; 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)); folio_pos(folio), folio_size(folio));
if (IS_ERR(req)) { if (IS_ERR(req)) {
folio_unlock(folio); folio_unlock(folio);
...@@ -276,7 +276,7 @@ static int erofs_fscache_read_folio(struct file *file, struct folio *folio) ...@@ -276,7 +276,7 @@ static int erofs_fscache_read_folio(struct file *file, struct folio *folio)
struct erofs_fscache_request *req; struct erofs_fscache_request *req;
int ret; int ret;
req = erofs_fscache_req_alloc(folio_mapping(folio), req = erofs_fscache_req_alloc(folio->mapping,
folio_pos(folio), folio_size(folio)); folio_pos(folio), folio_size(folio));
if (IS_ERR(req)) { if (IS_ERR(req)) {
folio_unlock(folio); folio_unlock(folio);
......
...@@ -454,7 +454,7 @@ static int z_erofs_do_map_blocks(struct inode *inode, ...@@ -454,7 +454,7 @@ static int z_erofs_do_map_blocks(struct inode *inode,
.map = map, .map = map,
}; };
int err = 0; int err = 0;
unsigned int lclusterbits, endoff; unsigned int lclusterbits, endoff, afmt;
unsigned long initial_lcn; unsigned long initial_lcn;
unsigned long long ofs, end; unsigned long long ofs, end;
...@@ -543,17 +543,20 @@ static int z_erofs_do_map_blocks(struct inode *inode, ...@@ -543,17 +543,20 @@ static int z_erofs_do_map_blocks(struct inode *inode,
err = -EFSCORRUPTED; err = -EFSCORRUPTED;
goto unmap_out; goto unmap_out;
} }
if (vi->z_advise & Z_EROFS_ADVISE_INTERLACED_PCLUSTER) afmt = vi->z_advise & Z_EROFS_ADVISE_INTERLACED_PCLUSTER ?
map->m_algorithmformat = Z_EROFS_COMPRESSION_INTERLACED :
Z_EROFS_COMPRESSION_INTERLACED;
else
map->m_algorithmformat =
Z_EROFS_COMPRESSION_SHIFTED; Z_EROFS_COMPRESSION_SHIFTED;
} else if (m.headtype == Z_EROFS_LCLUSTER_TYPE_HEAD2) {
map->m_algorithmformat = vi->z_algorithmtype[1];
} else { } 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) || if ((flags & EROFS_GET_BLOCKS_FIEMAP) ||
((flags & EROFS_GET_BLOCKS_READMORE) && ((flags & EROFS_GET_BLOCKS_READMORE) &&
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment