@@ -696,6 +696,12 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
goto out;
}
+ /*
+ * FIXME: without this, we get "warning: ‘last_ofs_in_node’ may be
+ * used uninitialized". It's not clear whether that can actually
+ * happen, so there is now a WARN_ON() checking for this.
+ */
+ last_ofs_in_node = -1u;
next_dnode:
if (create)
f2fs_lock_op(sbi);
@@ -796,6 +802,7 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
allocated = dn.node_changed;
map->m_len += dn.ofs_in_node - ofs_in_node;
+ WARN_ON(last_ofs_in_node == -1u);
if (prealloc && dn.ofs_in_node != last_ofs_in_node + 1) {
err = -ENOSPC;
goto sync_out;
gcc is unsure about the use of last_ofs_in_node, which might happen without a prior initialization: fs/f2fs//git/arm-soc/fs/f2fs/data.c: In function ‘f2fs_map_blocks’: fs/f2fs/data.c:799:54: warning: ‘last_ofs_in_node’ may be used uninitialized in this function [-Wmaybe-uninitialized] if (prealloc && dn.ofs_in_node != last_ofs_in_node + 1) { I'm not sure about it either, so to shut up the warning I initialize it to a known invalid -1u and later check for this, so we get a runtime warning if we ever hit the uninitialized case. It would be much better to reorganize the code in some form that made it obvious to both the compiler and the reader that this variable use it ok. Since I only see the warning with gcc-4.9 but not any later version, it's possible that the compiler is actually smarter than I am here and has learned to see the code as correct, in which case this patch could just be disregarded. It would certainly be helpful to get an opinion from the maintainers on the matter. Fixes: 46008c6d4232 ("f2fs: support in batch multi blocks preallocation") Cc: Chao Yu <yuchao0@huawei.com> Cc: Jaegeuk Kim <jaegeuk@kernel.org> Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- fs/f2fs/data.c | 7 +++++++ 1 file changed, 7 insertions(+) -- 2.9.0