* [riteshharjani:vfs.all-ext4-atomic-write-bigalloc-lsfmm-rfcv2-wipv1-0day 4/4] fs/ext4/inode.c:3406:18-31: opportunity for str_true_false(mixed_mapping)
@ 2025-04-21 4:39 kernel test robot
0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2025-04-21 4:39 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Julia Lawall
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
TO: "Ritesh Harjani (IBM)" <ritesh.list@gmail.com>
tree: https://github.com/riteshharjani/linux vfs.all-ext4-atomic-write-bigalloc-lsfmm-rfcv2-wipv1-0day
head: 99132117c47d6ba564925d4129dee057f5fd200a
commit: 99132117c47d6ba564925d4129dee057f5fd200a [4/4] ext4: Add multi-fsblock atomic write support with bigalloc
:::::: branch date: 11 hours ago
:::::: commit date: 11 hours ago
config: nios2-randconfig-r051-20250421 (https://download.01.org/0day-ci/archive/20250421/202504211206.jhmSOTdR-lkp@intel.com/config)
compiler: nios2-linux-gcc (GCC) 12.4.0
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@intel.com>
| Reported-by: Julia Lawall <julia.lawall@inria.fr>
| Closes: https://lore.kernel.org/r/202504211206.jhmSOTdR-lkp@intel.com/
cocci warnings: (new ones prefixed by >>)
>> fs/ext4/inode.c:3406:18-31: opportunity for str_true_false(mixed_mapping)
vim +3406 fs/ext4/inode.c
b8a6176c214cf9 Jan Kara 2017-11-01 3280
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3281 static void ext4_set_iomap(struct inode *inode, struct iomap *iomap,
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3282 struct ext4_map_blocks *map, loff_t offset,
de205114777101 Christoph Hellwig 2021-11-29 3283 loff_t length, unsigned int flags)
364443cbcfe70f Jan Kara 2016-11-20 3284 {
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3285 u8 blkbits = inode->i_blkbits;
364443cbcfe70f Jan Kara 2016-11-20 3286
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3287 /*
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3288 * Writes that span EOF might trigger an I/O size update on completion,
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3289 * so consider them to be dirty for the purpose of O_DSYNC, even if
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3290 * there is no other metadata changes being made or are pending.
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3291 */
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3292 iomap->flags = 0;
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3293 if (ext4_inode_datasync_dirty(inode) ||
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3294 offset + length > i_size_read(inode))
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3295 iomap->flags |= IOMAP_F_DIRTY;
545052e9e35a34 Christoph Hellwig 2017-10-01 3296
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3297 if (map->m_flags & EXT4_MAP_NEW)
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3298 iomap->flags |= IOMAP_F_NEW;
545052e9e35a34 Christoph Hellwig 2017-10-01 3299
370a6de7651b97 John Garry 2025-03-20 3300 /* HW-offload atomics are always used */
370a6de7651b97 John Garry 2025-03-20 3301 if (flags & IOMAP_ATOMIC)
370a6de7651b97 John Garry 2025-03-20 3302 iomap->flags |= IOMAP_F_ATOMIC_BIO;
370a6de7651b97 John Garry 2025-03-20 3303
de205114777101 Christoph Hellwig 2021-11-29 3304 if (flags & IOMAP_DAX)
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3305 iomap->dax_dev = EXT4_SB(inode->i_sb)->s_daxdev;
de205114777101 Christoph Hellwig 2021-11-29 3306 else
de205114777101 Christoph Hellwig 2021-11-29 3307 iomap->bdev = inode->i_sb->s_bdev;
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3308 iomap->offset = (u64) map->m_lblk << blkbits;
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3309 iomap->length = (u64) map->m_len << blkbits;
545052e9e35a34 Christoph Hellwig 2017-10-01 3310
6386722a329824 Ritesh Harjani 2020-02-28 3311 if ((map->m_flags & EXT4_MAP_MAPPED) &&
6386722a329824 Ritesh Harjani 2020-02-28 3312 !ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
6386722a329824 Ritesh Harjani 2020-02-28 3313 iomap->flags |= IOMAP_F_MERGED;
6386722a329824 Ritesh Harjani 2020-02-28 3314
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3315 /*
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3316 * Flags passed to ext4_map_blocks() for direct I/O writes can result
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3317 * in m_flags having both EXT4_MAP_MAPPED and EXT4_MAP_UNWRITTEN bits
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3318 * set. In order for any allocated unwritten extents to be converted
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3319 * into written extents correctly within the ->end_io() handler, we
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3320 * need to ensure that the iomap->type is set appropriately. Hence, the
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3321 * reason why we need to check whether the EXT4_MAP_UNWRITTEN bit has
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3322 * been set first.
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3323 */
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3324 if (map->m_flags & EXT4_MAP_UNWRITTEN) {
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3325 iomap->type = IOMAP_UNWRITTEN;
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3326 iomap->addr = (u64) map->m_pblk << blkbits;
de205114777101 Christoph Hellwig 2021-11-29 3327 if (flags & IOMAP_DAX)
de205114777101 Christoph Hellwig 2021-11-29 3328 iomap->addr += EXT4_SB(inode->i_sb)->s_dax_part_off;
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3329 } else if (map->m_flags & EXT4_MAP_MAPPED) {
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3330 iomap->type = IOMAP_MAPPED;
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3331 iomap->addr = (u64) map->m_pblk << blkbits;
de205114777101 Christoph Hellwig 2021-11-29 3332 if (flags & IOMAP_DAX)
de205114777101 Christoph Hellwig 2021-11-29 3333 iomap->addr += EXT4_SB(inode->i_sb)->s_dax_part_off;
ec9d669eba4c27 Zhang Yi 2024-01-27 3334 } else if (map->m_flags & EXT4_MAP_DELAYED) {
ec9d669eba4c27 Zhang Yi 2024-01-27 3335 iomap->type = IOMAP_DELALLOC;
ec9d669eba4c27 Zhang Yi 2024-01-27 3336 iomap->addr = IOMAP_NULL_ADDR;
776722e85d3b09 Jan Kara 2016-11-20 3337 } else {
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3338 iomap->type = IOMAP_HOLE;
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3339 iomap->addr = IOMAP_NULL_ADDR;
545052e9e35a34 Christoph Hellwig 2017-10-01 3340 }
545052e9e35a34 Christoph Hellwig 2017-10-01 3341 }
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3342) /*
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3343) * ext4_map_blocks_atomic: Helper routine to ensure the entire requested mapping
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3344) * [map.m_lblk, map.m_len] is one single contiguous extent with no mixed
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3345) * mappings. This function is only called when the bigalloc is enabled, so we
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3346) * know that the allocated physical extent start is always aligned properly.
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3347) *
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3348) * We call EXT4_GET_BLOCKS_ZERO only when the underlying physical extent for the
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3349) * requested range does not have a single mapping type (Hole, Mapped, or
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3350) * Unwritten) throughout. In that case we will loop over the requested range to
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3351) * allocate and zero out the unwritten / holes in between, to get a single
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3352) * mapped extent from [m_lblk, m_len]. This case is mostly non-performance
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3353) * critical path, so it should be ok to loop using ext4_map_blocks() with
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3354) * appropriate flags to allocate & zero the underlying short holes/unwritten
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3355) * extents within the requested range.
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3356) */
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3357) static int ext4_map_blocks_atomic(handle_t *handle, struct inode *inode,
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3358) struct ext4_map_blocks *map)
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3359) {
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3360) ext4_lblk_t m_lblk = map->m_lblk;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3361) unsigned int m_len = map->m_len;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3362) unsigned int mapped_len = 0, flags = 0;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3363) u8 blkbits = inode->i_blkbits;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3364) bool mixed_mapping = false;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3365) int ret = 0;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3366)
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3367) WARN_ON(!ext4_has_feature_bigalloc(inode->i_sb));
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3368)
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3369) if (((loff_t)map->m_lblk << blkbits) >= i_size_read(inode)) {
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3370) flags = EXT4_GET_BLOCKS_CREATE;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3371) } else {
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3372) ret = ext4_map_blocks(handle, inode, map, 0);
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3373) if ((ret == 0 && map->m_len >= m_len) ||
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3374) (ret >= m_len && map->m_flags & EXT4_MAP_UNWRITTEN)) {
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3375) flags = EXT4_GET_BLOCKS_IO_CREATE_EXT;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3376) } else {
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3377) mixed_mapping = true;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3378) flags = EXT4_GET_BLOCKS_CREATE_ZERO;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3379) }
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3380) }
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3381)
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3382) do {
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3383) ret = ext4_map_blocks(handle, inode, map, flags);
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3384) if (ret < 0)
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3385) goto out;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3386) WARN_ON_ONCE(!mixed_mapping && ret < m_len);
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3387) if (ret == m_len)
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3388) goto out;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3389) mapped_len += map->m_len;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3390) map->m_lblk += map->m_len;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3391) map->m_len = m_len - mapped_len;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3392) } while (mapped_len < m_len);
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3393)
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3394) /*
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3395) * We might have done some work in above loop, so we need to query the
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3396) * start of the physical extent, based on the origin m_lblk and m_len.
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3397) * Let's also ensure we were able to allocate the required range for
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3398) * mixed mapping case.
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3399) */
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3400) map->m_lblk = m_lblk;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3401) map->m_len = m_len;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3402)
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3403) ret = ext4_map_blocks(handle, inode, map, 0);
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3404) if (ret != m_len) {
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3405) ext4_warning_inode(inode, "allocation failed for atomic write request pos:%u, len:%u, mixed_mapping:%s\n",
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 @3406) m_lblk, m_len, mixed_mapping ? "true" : "false");
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3407) ret = -EINVAL;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3408) }
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3409) out:
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3410) return ret;
99132117c47d6b Ritesh Harjani (IBM 2025-03-23 3411) }
c8fdfe29418745 Matthew Bobrowski 2019-11-05 3412
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-04-21 4:39 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-21 4:39 [riteshharjani:vfs.all-ext4-atomic-write-bigalloc-lsfmm-rfcv2-wipv1-0day 4/4] fs/ext4/inode.c:3406:18-31: opportunity for str_true_false(mixed_mapping) kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.