Re: [PATCH v1] ext2: fix datatype of block number in ext2_xattr_set2()

From: kernel test robot
Date: Tue Aug 15 2023 - 07:50:41 EST


Hi Georg,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on v6.5-rc6 next-20230809]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Georg-Ottinger/ext2-fix-datatype-of-block-number-in-ext2_xattr_set2/20230815-180605
base: linus/master
patch link: https://lore.kernel.org/r/20230815100340.22121-1-g.ottinger%40gmx.at
patch subject: [PATCH v1] ext2: fix datatype of block number in ext2_xattr_set2()
config: hexagon-randconfig-r005-20230815 (https://download.01.org/0day-ci/archive/20230815/202308151929.QmgakA1l-lkp@xxxxxxxxx/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a)
reproduce: (https://download.01.org/0day-ci/archive/20230815/202308151929.QmgakA1l-lkp@xxxxxxxxx/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@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202308151929.QmgakA1l-lkp@xxxxxxxxx/

All warnings (new ones prefixed by >>):

In file included from fs/ext2/xattr.c:57:
In file included from include/linux/buffer_head.h:12:
In file included from include/linux/blk_types.h:10:
In file included from include/linux/bvec.h:10:
In file included from include/linux/highmem.h:12:
In file included from include/linux/hardirq.h:11:
In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1:
In file included from include/asm-generic/hardirq.h:17:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/hexagon/include/asm/io.h:334:
include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
547 | val = __raw_readb(PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
560 | val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
| ~~~~~~~~~~ ^
include/uapi/linux/byteorder/little_endian.h:37:51: note: expanded from macro '__le16_to_cpu'
37 | #define __le16_to_cpu(x) ((__force __u16)(__le16)(x))
| ^
In file included from fs/ext2/xattr.c:57:
In file included from include/linux/buffer_head.h:12:
In file included from include/linux/blk_types.h:10:
In file included from include/linux/bvec.h:10:
In file included from include/linux/highmem.h:12:
In file included from include/linux/hardirq.h:11:
In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1:
In file included from include/asm-generic/hardirq.h:17:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/hexagon/include/asm/io.h:334:
include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
573 | val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
| ~~~~~~~~~~ ^
include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__le32_to_cpu'
35 | #define __le32_to_cpu(x) ((__force __u32)(__le32)(x))
| ^
In file included from fs/ext2/xattr.c:57:
In file included from include/linux/buffer_head.h:12:
In file included from include/linux/blk_types.h:10:
In file included from include/linux/bvec.h:10:
In file included from include/linux/highmem.h:12:
In file included from include/linux/hardirq.h:11:
In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1:
In file included from include/asm-generic/hardirq.h:17:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/hexagon/include/asm/io.h:334:
include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
584 | __raw_writeb(value, PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
594 | __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
604 | __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
>> fs/ext2/xattr.c:748:42: warning: format specifies type 'int' but the argument has type 'ext2_fsblk_t' (aka 'unsigned long') [-Wformat]
748 | ea_idebug(inode, "creating block %d", block);
| ~~ ^~~~~
| %lu
fs/ext2/xattr.c:88:43: note: expanded from macro 'ea_idebug'
88 | # define ea_idebug(inode, f...) no_printk(f)
| ^
include/linux/printk.h:129:17: note: expanded from macro 'no_printk'
129 | printk(fmt, ##__VA_ARGS__); \
| ~~~ ^~~~~~~~~~~
include/linux/printk.h:455:60: note: expanded from macro 'printk'
455 | #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
| ~~~ ^~~~~~~~~~~
include/linux/printk.h:427:19: note: expanded from macro 'printk_index_wrap'
427 | _p_func(_fmt, ##__VA_ARGS__); \
| ~~~~ ^~~~~~~~~~~
7 warnings generated.


vim +748 fs/ext2/xattr.c

90ae40d243d46f Jan Kara 2022-07-12 701
^1da177e4c3f41 Linus Torvalds 2005-04-16 702 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 703 * Second half of ext2_xattr_set(): Update the file system.
^1da177e4c3f41 Linus Torvalds 2005-04-16 704 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 705 static int
^1da177e4c3f41 Linus Torvalds 2005-04-16 706 ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh,
^1da177e4c3f41 Linus Torvalds 2005-04-16 707 struct ext2_xattr_header *header)
^1da177e4c3f41 Linus Torvalds 2005-04-16 708 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 709 struct super_block *sb = inode->i_sb;
^1da177e4c3f41 Linus Torvalds 2005-04-16 710 struct buffer_head *new_bh = NULL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 711 int error;
47387409ee2e09 Tahsin Erdogan 2017-06-22 712 struct mb_cache *ea_block_cache = EA_BLOCK_CACHE(inode);
^1da177e4c3f41 Linus Torvalds 2005-04-16 713
^1da177e4c3f41 Linus Torvalds 2005-04-16 714 if (header) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 715 new_bh = ext2_xattr_cache_find(inode, header);
^1da177e4c3f41 Linus Torvalds 2005-04-16 716 if (new_bh) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 717 /* We found an identical block in the cache. */
^1da177e4c3f41 Linus Torvalds 2005-04-16 718 if (new_bh == old_bh) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 719 ea_bdebug(new_bh, "keeping this block");
^1da177e4c3f41 Linus Torvalds 2005-04-16 720 } else {
^1da177e4c3f41 Linus Torvalds 2005-04-16 721 /* The old block is released after updating
^1da177e4c3f41 Linus Torvalds 2005-04-16 722 the inode. */
^1da177e4c3f41 Linus Torvalds 2005-04-16 723 ea_bdebug(new_bh, "reusing block");
^1da177e4c3f41 Linus Torvalds 2005-04-16 724
5dd4056db84387 Christoph Hellwig 2010-03-03 725 error = dquot_alloc_block(inode, 1);
5dd4056db84387 Christoph Hellwig 2010-03-03 726 if (error) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 727 unlock_buffer(new_bh);
^1da177e4c3f41 Linus Torvalds 2005-04-16 728 goto cleanup;
^1da177e4c3f41 Linus Torvalds 2005-04-16 729 }
fba4d3997f4c3d Marcin Slusarz 2008-04-28 730 le32_add_cpu(&HDR(new_bh)->h_refcount, 1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 731 ea_bdebug(new_bh, "refcount now=%d",
^1da177e4c3f41 Linus Torvalds 2005-04-16 732 le32_to_cpu(HDR(new_bh)->h_refcount));
^1da177e4c3f41 Linus Torvalds 2005-04-16 733 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 734 unlock_buffer(new_bh);
^1da177e4c3f41 Linus Torvalds 2005-04-16 735 } else if (old_bh && header == HDR(old_bh)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 736 /* Keep this block. No need to lock the block as we
^1da177e4c3f41 Linus Torvalds 2005-04-16 737 don't need to change the reference count. */
^1da177e4c3f41 Linus Torvalds 2005-04-16 738 new_bh = old_bh;
^1da177e4c3f41 Linus Torvalds 2005-04-16 739 get_bh(new_bh);
47387409ee2e09 Tahsin Erdogan 2017-06-22 740 ext2_xattr_cache_insert(ea_block_cache, new_bh);
^1da177e4c3f41 Linus Torvalds 2005-04-16 741 } else {
^1da177e4c3f41 Linus Torvalds 2005-04-16 742 /* We need to allocate a new block */
24097d12efbb97 Akinobu Mita 2008-04-28 743 ext2_fsblk_t goal = ext2_group_first_block_no(sb,
24097d12efbb97 Akinobu Mita 2008-04-28 744 EXT2_I(inode)->i_block_group);
2a9807b4e5f804 Georg Ottinger 2023-08-15 745 ext2_fsblk_t block = ext2_new_block(inode, goal, &error);
^1da177e4c3f41 Linus Torvalds 2005-04-16 746 if (error)
^1da177e4c3f41 Linus Torvalds 2005-04-16 747 goto cleanup;
^1da177e4c3f41 Linus Torvalds 2005-04-16 @748 ea_idebug(inode, "creating block %d", block);
^1da177e4c3f41 Linus Torvalds 2005-04-16 749
^1da177e4c3f41 Linus Torvalds 2005-04-16 750 new_bh = sb_getblk(sb, block);
2b0542a4a0d9b8 Wang Shilong 2013-01-12 751 if (unlikely(!new_bh)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 752 ext2_free_blocks(inode, block, 1);
addacc7d6f0f0b Al Viro 2010-07-22 753 mark_inode_dirty(inode);
ab6a773dbcbd2b Wang Shilong 2013-01-15 754 error = -ENOMEM;
^1da177e4c3f41 Linus Torvalds 2005-04-16 755 goto cleanup;
^1da177e4c3f41 Linus Torvalds 2005-04-16 756 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 757 lock_buffer(new_bh);
^1da177e4c3f41 Linus Torvalds 2005-04-16 758 memcpy(new_bh->b_data, header, new_bh->b_size);
^1da177e4c3f41 Linus Torvalds 2005-04-16 759 set_buffer_uptodate(new_bh);
^1da177e4c3f41 Linus Torvalds 2005-04-16 760 unlock_buffer(new_bh);
47387409ee2e09 Tahsin Erdogan 2017-06-22 761 ext2_xattr_cache_insert(ea_block_cache, new_bh);
^1da177e4c3f41 Linus Torvalds 2005-04-16 762
^1da177e4c3f41 Linus Torvalds 2005-04-16 763 ext2_xattr_update_super_block(sb);
^1da177e4c3f41 Linus Torvalds 2005-04-16 764 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 765 mark_buffer_dirty(new_bh);
^1da177e4c3f41 Linus Torvalds 2005-04-16 766 if (IS_SYNC(inode)) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 767 sync_dirty_buffer(new_bh);
^1da177e4c3f41 Linus Torvalds 2005-04-16 768 error = -EIO;
^1da177e4c3f41 Linus Torvalds 2005-04-16 769 if (buffer_req(new_bh) && !buffer_uptodate(new_bh))
^1da177e4c3f41 Linus Torvalds 2005-04-16 770 goto cleanup;
^1da177e4c3f41 Linus Torvalds 2005-04-16 771 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 772 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 773
^1da177e4c3f41 Linus Torvalds 2005-04-16 774 /* Update the inode. */
^1da177e4c3f41 Linus Torvalds 2005-04-16 775 EXT2_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0;
02027d42c3f747 Deepa Dinamani 2016-09-14 776 inode->i_ctime = current_time(inode);
^1da177e4c3f41 Linus Torvalds 2005-04-16 777 if (IS_SYNC(inode)) {
c37650161a53c0 Christoph Hellwig 2010-10-06 778 error = sync_inode_metadata(inode, 1);
^1da177e4c3f41 Linus Torvalds 2005-04-16 779 /* In case sync failed due to ENOSPC the inode was actually
^1da177e4c3f41 Linus Torvalds 2005-04-16 780 * written (only some dirty data were not) so we just proceed
^1da177e4c3f41 Linus Torvalds 2005-04-16 781 * as if nothing happened and cleanup the unused block */
^1da177e4c3f41 Linus Torvalds 2005-04-16 782 if (error && error != -ENOSPC) {
3889717d2851bf Al Viro 2010-07-22 783 if (new_bh && new_bh != old_bh) {
3889717d2851bf Al Viro 2010-07-22 784 dquot_free_block_nodirty(inode, 1);
3889717d2851bf Al Viro 2010-07-22 785 mark_inode_dirty(inode);
3889717d2851bf Al Viro 2010-07-22 786 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 787 goto cleanup;
^1da177e4c3f41 Linus Torvalds 2005-04-16 788 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 789 } else
^1da177e4c3f41 Linus Torvalds 2005-04-16 790 mark_inode_dirty(inode);
^1da177e4c3f41 Linus Torvalds 2005-04-16 791
^1da177e4c3f41 Linus Torvalds 2005-04-16 792 error = 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 793 if (old_bh && old_bh != new_bh) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 794 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 795 * If there was an old block and we are no longer using it,
^1da177e4c3f41 Linus Torvalds 2005-04-16 796 * release the old block.
^1da177e4c3f41 Linus Torvalds 2005-04-16 797 */
90ae40d243d46f Jan Kara 2022-07-12 798 ext2_xattr_release_block(inode, old_bh);
^1da177e4c3f41 Linus Torvalds 2005-04-16 799 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 800
^1da177e4c3f41 Linus Torvalds 2005-04-16 801 cleanup:
^1da177e4c3f41 Linus Torvalds 2005-04-16 802 brelse(new_bh);
^1da177e4c3f41 Linus Torvalds 2005-04-16 803
^1da177e4c3f41 Linus Torvalds 2005-04-16 804 return error;
^1da177e4c3f41 Linus Torvalds 2005-04-16 805 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 806

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