[xiang-erofs:dev-test 27/27] fs/erofs/inode.c:182:24: error: 'struct erofs_sb_info' has no member named 'available_compr_algs'

kernel test robot lkp at intel.com
Thu Jan 29 05:13:42 AEDT 2026


tree:   https://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git dev-test
head:   713acdda5f818fb4f2286238a4f9f1f5f519b9da
commit: 713acdda5f818fb4f2286238a4f9f1f5f519b9da [27/27] erofs: separate plain and compressed filesystems formally
config: sparc64-randconfig-001-20260128 (https://download.01.org/0day-ci/archive/20260129/202601290220.4nKd6hHT-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 12.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260129/202601290220.4nKd6hHT-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601290220.4nKd6hHT-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from include/asm-generic/div64.h:27,
                    from ./arch/sparc/include/generated/asm/div64.h:1,
                    from include/linux/math.h:6,
                    from include/linux/math64.h:6,
                    from include/linux/time.h:6,
                    from include/linux/stat.h:19,
                    from include/linux/fs_dirent.h:5,
                    from include/linux/fs/super_types.h:5,
                    from include/linux/fs/super.h:5,
                    from include/linux/fs.h:5,
                    from fs/erofs/internal.h:10,
                    from fs/erofs/xattr.h:9,
                    from fs/erofs/inode.c:7:
   fs/erofs/inode.c: In function 'erofs_read_inode':
>> fs/erofs/inode.c:182:24: error: 'struct erofs_sb_info' has no member named 'available_compr_algs'
     182 |         } else if (!sbi->available_compr_algs) {
         |                        ^~
   include/linux/compiler.h:57:52: note: in definition of macro '__trace_if_var'
      57 | #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
         |                                                    ^~~~
   fs/erofs/inode.c:182:16: note: in expansion of macro 'if'
     182 |         } else if (!sbi->available_compr_algs) {
         |                ^~
>> fs/erofs/inode.c:182:24: error: 'struct erofs_sb_info' has no member named 'available_compr_algs'
     182 |         } else if (!sbi->available_compr_algs) {
         |                        ^~
   include/linux/compiler.h:57:61: note: in definition of macro '__trace_if_var'
      57 | #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
         |                                                             ^~~~
   fs/erofs/inode.c:182:16: note: in expansion of macro 'if'
     182 |         } else if (!sbi->available_compr_algs) {
         |                ^~
>> fs/erofs/inode.c:182:24: error: 'struct erofs_sb_info' has no member named 'available_compr_algs'
     182 |         } else if (!sbi->available_compr_algs) {
         |                        ^~
   include/linux/compiler.h:68:10: note: in definition of macro '__trace_if_value'
      68 |         (cond) ?                                        \
         |          ^~~~
   include/linux/compiler.h:55:28: note: in expansion of macro '__trace_if_var'
      55 | #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
         |                            ^~~~~~~~~~~~~~
   fs/erofs/inode.c:182:16: note: in expansion of macro 'if'
     182 |         } else if (!sbi->available_compr_algs) {
         |                ^~


vim +182 fs/erofs/inode.c

    29	
    30	static int erofs_read_inode(struct inode *inode)
    31	{
    32		struct super_block *sb = inode->i_sb;
    33		erofs_blk_t blkaddr = erofs_blknr(sb, erofs_iloc(inode));
    34		unsigned int ofs = erofs_blkoff(sb, erofs_iloc(inode));
    35		bool in_mbox = erofs_inode_in_metabox(inode);
    36		struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
    37		struct erofs_sb_info *sbi = EROFS_SB(sb);
    38		erofs_blk_t addrmask = BIT_ULL(48) - 1;
    39		struct erofs_inode *vi = EROFS_I(inode);
    40		struct erofs_inode_extended *die, copied;
    41		struct erofs_inode_compact *dic;
    42		unsigned int ifmt;
    43		void *ptr;
    44		int err = 0;
    45	
    46		ptr = erofs_read_metabuf(&buf, sb, erofs_pos(sb, blkaddr), in_mbox);
    47		if (IS_ERR(ptr)) {
    48			err = PTR_ERR(ptr);
    49			erofs_err(sb, "failed to read inode meta block (nid: %llu): %d",
    50				  vi->nid, err);
    51			goto err_out;
    52		}
    53	
    54		dic = ptr + ofs;
    55		ifmt = le16_to_cpu(dic->i_format);
    56		if (ifmt & ~EROFS_I_ALL) {
    57			erofs_err(sb, "unsupported i_format %u of nid %llu",
    58				  ifmt, vi->nid);
    59			err = -EOPNOTSUPP;
    60			goto err_out;
    61		}
    62	
    63		vi->datalayout = erofs_inode_datalayout(ifmt);
    64		if (vi->datalayout >= EROFS_INODE_DATALAYOUT_MAX) {
    65			erofs_err(sb, "unsupported datalayout %u of nid %llu",
    66				  vi->datalayout, vi->nid);
    67			err = -EOPNOTSUPP;
    68			goto err_out;
    69		}
    70	
    71		switch (erofs_inode_version(ifmt)) {
    72		case EROFS_INODE_LAYOUT_EXTENDED:
    73			vi->inode_isize = sizeof(struct erofs_inode_extended);
    74			/* check if the extended inode acrosses block boundary */
    75			if (ofs + vi->inode_isize <= sb->s_blocksize) {
    76				ofs += vi->inode_isize;
    77				die = (struct erofs_inode_extended *)dic;
    78				copied.i_u = die->i_u;
    79				copied.i_nb = die->i_nb;
    80			} else {
    81				const unsigned int gotten = sb->s_blocksize - ofs;
    82	
    83				memcpy(&copied, dic, gotten);
    84				ptr = erofs_read_metabuf(&buf, sb,
    85						erofs_pos(sb, blkaddr + 1), in_mbox);
    86				if (IS_ERR(ptr)) {
    87					err = PTR_ERR(ptr);
    88					erofs_err(sb, "failed to read inode payload block (nid: %llu): %d",
    89						  vi->nid, err);
    90					goto err_out;
    91				}
    92				ofs = vi->inode_isize - gotten;
    93				memcpy((u8 *)&copied + gotten, ptr, ofs);
    94				die = &copied;
    95			}
    96			vi->xattr_isize = erofs_xattr_ibody_size(die->i_xattr_icount);
    97	
    98			inode->i_mode = le16_to_cpu(die->i_mode);
    99			i_uid_write(inode, le32_to_cpu(die->i_uid));
   100			i_gid_write(inode, le32_to_cpu(die->i_gid));
   101			set_nlink(inode, le32_to_cpu(die->i_nlink));
   102			inode_set_mtime(inode, le64_to_cpu(die->i_mtime),
   103					le32_to_cpu(die->i_mtime_nsec));
   104	
   105			inode->i_size = le64_to_cpu(die->i_size);
   106			break;
   107		case EROFS_INODE_LAYOUT_COMPACT:
   108			vi->inode_isize = sizeof(struct erofs_inode_compact);
   109			ofs += vi->inode_isize;
   110			vi->xattr_isize = erofs_xattr_ibody_size(dic->i_xattr_icount);
   111	
   112			inode->i_mode = le16_to_cpu(dic->i_mode);
   113			copied.i_u = dic->i_u;
   114			i_uid_write(inode, le16_to_cpu(dic->i_uid));
   115			i_gid_write(inode, le16_to_cpu(dic->i_gid));
   116			if (!S_ISDIR(inode->i_mode) &&
   117			    ((ifmt >> EROFS_I_NLINK_1_BIT) & 1)) {
   118				set_nlink(inode, 1);
   119				copied.i_nb = dic->i_nb;
   120			} else {
   121				set_nlink(inode, le16_to_cpu(dic->i_nb.nlink));
   122				copied.i_nb.startblk_hi = 0;
   123				addrmask = BIT_ULL(32) - 1;
   124			}
   125			inode_set_mtime(inode, sbi->epoch + le32_to_cpu(dic->i_mtime),
   126					sbi->fixed_nsec);
   127	
   128			inode->i_size = le32_to_cpu(dic->i_size);
   129			break;
   130		default:
   131			erofs_err(sb, "unsupported on-disk inode version %u of nid %llu",
   132				  erofs_inode_version(ifmt), vi->nid);
   133			err = -EOPNOTSUPP;
   134			goto err_out;
   135		}
   136	
   137		if (unlikely(inode->i_size < 0)) {
   138			erofs_err(sb, "negative i_size @ nid %llu", vi->nid);
   139			err = -EFSCORRUPTED;
   140			goto err_out;
   141		}
   142	
   143		if (IS_ENABLED(CONFIG_EROFS_FS_POSIX_ACL) &&
   144		    erofs_inode_has_noacl(inode, ptr, ofs))
   145			cache_no_acl(inode);
   146	
   147		switch (inode->i_mode & S_IFMT) {
   148		case S_IFDIR:
   149			vi->dot_omitted = (ifmt >> EROFS_I_DOT_OMITTED_BIT) & 1;
   150			fallthrough;
   151		case S_IFREG:
   152		case S_IFLNK:
   153			vi->startblk = le32_to_cpu(copied.i_u.startblk_lo) |
   154				((u64)le16_to_cpu(copied.i_nb.startblk_hi) << 32);
   155			if (vi->datalayout == EROFS_INODE_FLAT_PLAIN &&
   156			    !((vi->startblk ^ EROFS_NULL_ADDR) & addrmask))
   157				vi->startblk = EROFS_NULL_ADDR;
   158	
   159			if(S_ISLNK(inode->i_mode)) {
   160				err = erofs_fill_symlink(inode, ptr, ofs);
   161				if (err)
   162					goto err_out;
   163			}
   164			break;
   165		case S_IFCHR:
   166		case S_IFBLK:
   167			inode->i_rdev = new_decode_dev(le32_to_cpu(copied.i_u.rdev));
   168			break;
   169		case S_IFIFO:
   170		case S_IFSOCK:
   171			inode->i_rdev = 0;
   172			break;
   173		default:
   174			erofs_err(sb, "bogus i_mode (%o) @ nid %llu", inode->i_mode,
   175				  vi->nid);
   176			err = -EFSCORRUPTED;
   177			goto err_out;
   178		}
   179	
   180		if (!erofs_inode_is_data_compressed(vi->datalayout)) {
   181			inode->i_blocks = round_up(inode->i_size, sb->s_blocksize) >> 9;
 > 182		} else if (!sbi->available_compr_algs) {
   183			erofs_err(sb, "compressed inode (nid %llu) is invalid in a plain filesystem",
   184				  vi->nid);
   185			err = -EFSCORRUPTED;
   186			goto err_out;
   187		} else {
   188			inode->i_blocks = le32_to_cpu(copied.i_u.blocks_lo) <<
   189					(sb->s_blocksize_bits - 9);
   190		}
   191	
   192		if (vi->datalayout == EROFS_INODE_CHUNK_BASED) {
   193			/* fill chunked inode summary info */
   194			vi->chunkformat = le16_to_cpu(copied.i_u.c.format);
   195			if (vi->chunkformat & ~EROFS_CHUNK_FORMAT_ALL) {
   196				erofs_err(sb, "unsupported chunk format %x of nid %llu",
   197					  vi->chunkformat, vi->nid);
   198				err = -EOPNOTSUPP;
   199				goto err_out;
   200			}
   201			vi->chunkbits = sb->s_blocksize_bits +
   202				(vi->chunkformat & EROFS_CHUNK_FORMAT_BLKBITS_MASK);
   203		}
   204		inode_set_atime_to_ts(inode,
   205				      inode_set_ctime_to_ts(inode, inode_get_mtime(inode)));
   206	
   207		inode->i_flags &= ~S_DAX;
   208		if (test_opt(&sbi->opt, DAX_ALWAYS) && S_ISREG(inode->i_mode) &&
   209		    (vi->datalayout == EROFS_INODE_FLAT_PLAIN ||
   210		     vi->datalayout == EROFS_INODE_CHUNK_BASED))
   211			inode->i_flags |= S_DAX;
   212	err_out:
   213		erofs_put_metabuf(&buf);
   214		return err;
   215	}
   216	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


More information about the Linux-erofs mailing list