From 62307620f0bbce8ceb6c28f473f37ffcd114f9c2 Mon Sep 17 00:00:00 2001 From: Shaun Tancheff Date: Mon, 27 Nov 2023 23:02:25 -0800 Subject: [PATCH] LU-16118 build: Workaround __write_overflow_field errors Linux commit v5.17-rc3-1-gf68f2ff91512 fortify: Detect struct member overflows in memcpy() at compile-time memcpy and memset of collections of struct members will trigger: error: call to '__write_overflow_field' declared with attribute warning: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Werror] __write_overflow_field(p_size_field, size); Lustre-change: https://review.whamcloud.com/48364 Lustre-commit: a3a51806ef361f55421a1bc07f64c78730ae50d5 Test-Parameters: trivial HPE-bug-id: LUS-11194 Signed-off-by: Shaun Tancheff Change-Id: Iacd1ab03d1b90ce62b5d7b65e1cd518a5f7981f2 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/53264 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- libcfs/include/libcfs/linux/linux-misc.h | 12 ++++++++++++ lustre/include/cl_object.h | 9 ++------- lustre/obdclass/md_attrs.c | 3 +-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/libcfs/include/libcfs/linux/linux-misc.h b/libcfs/include/libcfs/linux/linux-misc.h index 9cab436..c271dc0 100644 --- a/libcfs/include/libcfs/linux/linux-misc.h +++ b/libcfs/include/libcfs/linux/linux-misc.h @@ -183,4 +183,16 @@ static inline int kstrtoul(const char *s, unsigned int base, unsigned long *res) int kstrtobool_from_user(const char __user *s, size_t count, bool *res); #endif + +#ifndef memset_startat +/** from linux 5.19 include/linux/string.h: */ +#define memset_startat(obj, v, member) \ +({ \ + u8 *__ptr = (u8 *)(obj); \ + typeof(v) __val = (v); \ + memset(__ptr + offsetof(typeof(*(obj)), member), __val, \ + sizeof(*(obj)) - offsetof(typeof(*(obj)), member)); \ +}) +#endif /* memset_startat() */ + #endif diff --git a/lustre/include/cl_object.h b/lustre/include/cl_object.h index f0c8a5b..f9fc2a5 100644 --- a/lustre/include/cl_object.h +++ b/lustre/include/cl_object.h @@ -99,6 +99,7 @@ #include #include #include +#include #include struct obd_info; @@ -2396,13 +2397,7 @@ struct cl_io *cl_io_top(struct cl_io *io); void cl_io_print(const struct lu_env *env, void *cookie, lu_printer_t printer, const struct cl_io *io); -#define CL_IO_SLICE_CLEAN(foo_io, base) \ -do { \ - typeof(foo_io) __foo_io = (foo_io); \ - \ - memset(&__foo_io->base, 0, \ - sizeof(*__foo_io) - offsetof(typeof(*__foo_io), base)); \ -} while (0) +#define CL_IO_SLICE_CLEAN(obj, base) memset_startat(obj, 0, base) /** @} cl_io */ diff --git a/lustre/obdclass/md_attrs.c b/lustre/obdclass/md_attrs.c index d0ca4f1..12c86e2 100644 --- a/lustre/obdclass/md_attrs.c +++ b/lustre/obdclass/md_attrs.c @@ -73,8 +73,7 @@ void lustre_loa_init(struct lustre_ost_attrs *loa, const struct lu_fid *fid, { CLASSERT(sizeof(*loa) == LMA_OLD_SIZE); - memset(&loa->loa_parent_fid, 0, - sizeof(*loa) - offsetof(typeof(*loa), loa_parent_fid)); + memset_startat(loa, 0, loa_parent_fid); lustre_lma_init(&loa->loa_lma, fid, compat, incompat); } EXPORT_SYMBOL(lustre_loa_init); -- 1.8.3.1