generic: 5.15: add pending patch fixing compilation warning in jffs2
Current gcc set a limit for each stack and complain if this limit is not
followed. JFSS2 in build_xattr function currently exceed the limit by
allocating a massive array of struct of 128 elements. Introduce a
pending patch that allocate this temp array dynamically fixing the
compilation warning:
fs/jffs2/xattr.c: In function 'jffs2_build_xattr_subsystem':
fs/jffs2/xattr.c:887:1: error: the frame size of 1088 bytes is larger than 1024 bytes [-Werror=frame-larger-than=]
  887 | }
      | ^
Affecting many target that require jffs2 support.
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
			
			
This commit is contained in:
		| @@ -0,0 +1,121 @@ | |||||||
|  | From eee53f6eb7561f516b9c4bac829ce31c48096130 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Fabian Frederick <fabf@skynet.be> | ||||||
|  | Date: Tue, 9 May 2017 22:30:03 +0200 | ||||||
|  | Subject: [PATCH] jffs2: reduce stack usage in jffs2_build_xattr_subsystem() | ||||||
|  |  | ||||||
|  | Use kcalloc() for allocation/flush of 128 pointers table to | ||||||
|  | reduce stack usage. | ||||||
|  |  | ||||||
|  | Function now returns -ENOMEM or 0 on success. | ||||||
|  |  | ||||||
|  | stackusage | ||||||
|  | Before: | ||||||
|  | ./fs/jffs2/xattr.c:775  jffs2_build_xattr_subsystem     1208 | ||||||
|  | dynamic,bounded | ||||||
|  |  | ||||||
|  | After: | ||||||
|  | ./fs/jffs2/xattr.c:775  jffs2_build_xattr_subsystem     192 | ||||||
|  | dynamic,bounded | ||||||
|  |  | ||||||
|  | Also update definition when CONFIG_JFFS2_FS_XATTR is not enabled | ||||||
|  |  | ||||||
|  | Tested with an MTD mount point and some user set/getfattr. | ||||||
|  |  | ||||||
|  | Many current target on OpenWRT also suffer from a compilation warning | ||||||
|  | (that become an error with CONFIG_WERROR) with the following output: | ||||||
|  |  | ||||||
|  | fs/jffs2/xattr.c: In function 'jffs2_build_xattr_subsystem': | ||||||
|  | fs/jffs2/xattr.c:887:1: error: the frame size of 1088 bytes is larger than 1024 bytes [-Werror=frame-larger-than=] | ||||||
|  |   887 | } | ||||||
|  |       | ^ | ||||||
|  |  | ||||||
|  | Using dynamic allocation fix this compilation warning. | ||||||
|  |  | ||||||
|  | Fixes: c9f700f840bd ("[JFFS2][XATTR] using 'delete marker' for xdatum/xref deletion") | ||||||
|  | Reported-by: Tim Gardner <tim.gardner@canonical.com> | ||||||
|  | Reported-by: kernel test robot <lkp@intel.com> | ||||||
|  | Reported-by: Ron Economos <re@w6rz.net> | ||||||
|  | Reported-by: Nathan Chancellor <nathan@kernel.org> | ||||||
|  | Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> | ||||||
|  | Signed-off-by: Fabian Frederick <fabf@skynet.be> | ||||||
|  | Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> | ||||||
|  | Cc: stable@vger.kernel.org | ||||||
|  | --- | ||||||
|  |  fs/jffs2/build.c |  5 ++++- | ||||||
|  |  fs/jffs2/xattr.c | 13 +++++++++---- | ||||||
|  |  fs/jffs2/xattr.h |  4 ++-- | ||||||
|  |  3 files changed, 15 insertions(+), 7 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/fs/jffs2/build.c | ||||||
|  | +++ b/fs/jffs2/build.c | ||||||
|  | @@ -211,7 +211,10 @@ static int jffs2_build_filesystem(struct | ||||||
|  |  		ic->scan_dents = NULL; | ||||||
|  |  		cond_resched(); | ||||||
|  |  	} | ||||||
|  | -	jffs2_build_xattr_subsystem(c); | ||||||
|  | +	ret = jffs2_build_xattr_subsystem(c); | ||||||
|  | +	if (ret) | ||||||
|  | +		goto exit; | ||||||
|  | + | ||||||
|  |  	c->flags &= ~JFFS2_SB_FLAG_BUILDING; | ||||||
|  |   | ||||||
|  |  	dbg_fsbuild("FS build complete\n"); | ||||||
|  | --- a/fs/jffs2/xattr.c | ||||||
|  | +++ b/fs/jffs2/xattr.c | ||||||
|  | @@ -772,10 +772,10 @@ void jffs2_clear_xattr_subsystem(struct | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  #define XREF_TMPHASH_SIZE	(128) | ||||||
|  | -void jffs2_build_xattr_subsystem(struct jffs2_sb_info *c) | ||||||
|  | +int jffs2_build_xattr_subsystem(struct jffs2_sb_info *c) | ||||||
|  |  { | ||||||
|  |  	struct jffs2_xattr_ref *ref, *_ref; | ||||||
|  | -	struct jffs2_xattr_ref *xref_tmphash[XREF_TMPHASH_SIZE]; | ||||||
|  | +	struct jffs2_xattr_ref **xref_tmphash; | ||||||
|  |  	struct jffs2_xattr_datum *xd, *_xd; | ||||||
|  |  	struct jffs2_inode_cache *ic; | ||||||
|  |  	struct jffs2_raw_node_ref *raw; | ||||||
|  | @@ -784,9 +784,12 @@ void jffs2_build_xattr_subsystem(struct | ||||||
|  |   | ||||||
|  |  	BUG_ON(!(c->flags & JFFS2_SB_FLAG_BUILDING)); | ||||||
|  |   | ||||||
|  | +	xref_tmphash = kcalloc(XREF_TMPHASH_SIZE, | ||||||
|  | +			       sizeof(struct jffs2_xattr_ref *), GFP_KERNEL); | ||||||
|  | +	if (!xref_tmphash) | ||||||
|  | +		return -ENOMEM; | ||||||
|  | + | ||||||
|  |  	/* Phase.1 : Merge same xref */ | ||||||
|  | -	for (i=0; i < XREF_TMPHASH_SIZE; i++) | ||||||
|  | -		xref_tmphash[i] = NULL; | ||||||
|  |  	for (ref=c->xref_temp; ref; ref=_ref) { | ||||||
|  |  		struct jffs2_xattr_ref *tmp; | ||||||
|  |   | ||||||
|  | @@ -884,6 +887,8 @@ void jffs2_build_xattr_subsystem(struct | ||||||
|  |  		     "%u of xref (%u dead, %u orphan) found.\n", | ||||||
|  |  		     xdatum_count, xdatum_unchecked_count, xdatum_orphan_count, | ||||||
|  |  		     xref_count, xref_dead_count, xref_orphan_count); | ||||||
|  | +	kfree(xref_tmphash); | ||||||
|  | +	return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  struct jffs2_xattr_datum *jffs2_setup_xattr_datum(struct jffs2_sb_info *c, | ||||||
|  | --- a/fs/jffs2/xattr.h | ||||||
|  | +++ b/fs/jffs2/xattr.h | ||||||
|  | @@ -71,7 +71,7 @@ static inline int is_xattr_ref_dead(stru | ||||||
|  |  #ifdef CONFIG_JFFS2_FS_XATTR | ||||||
|  |   | ||||||
|  |  extern void jffs2_init_xattr_subsystem(struct jffs2_sb_info *c); | ||||||
|  | -extern void jffs2_build_xattr_subsystem(struct jffs2_sb_info *c); | ||||||
|  | +extern int jffs2_build_xattr_subsystem(struct jffs2_sb_info *c); | ||||||
|  |  extern void jffs2_clear_xattr_subsystem(struct jffs2_sb_info *c); | ||||||
|  |   | ||||||
|  |  extern struct jffs2_xattr_datum *jffs2_setup_xattr_datum(struct jffs2_sb_info *c, | ||||||
|  | @@ -103,7 +103,7 @@ extern ssize_t jffs2_listxattr(struct de | ||||||
|  |  #else | ||||||
|  |   | ||||||
|  |  #define jffs2_init_xattr_subsystem(c) | ||||||
|  | -#define jffs2_build_xattr_subsystem(c) | ||||||
|  | +#define jffs2_build_xattr_subsystem(c)		(0) | ||||||
|  |  #define jffs2_clear_xattr_subsystem(c) | ||||||
|  |   | ||||||
|  |  #define jffs2_xattr_do_crccheck_inode(c, ic) | ||||||
		Reference in New Issue
	
	Block a user
	 Christian Marangi
					Christian Marangi