Commit 35dead4235e2b67da7275b4122fed37099c2f462

Authored by Helge Deller
Committed by Linus Torvalds
1 parent ebd65a5855

modules: don't export section names of empty sections via sysfs

On the parisc architecture we face for each and every loaded kernel module
this kernel "badness warning":
  sysfs: cannot create duplicate filename '/module/ac97_bus/sections/.text'
  Badness at fs/sysfs/dir.c:487

Reason for that is, that on parisc all kernel modules do have multiple
.text sections due to the usage of the -ffunction-sections compiler flag
which is needed to reach all jump targets on this platform.

An objdump on such a kernel module gives:
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .note.gnu.build-id 00000024  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .text         00000000  00000000  00000000  00000058  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .text.ac97_bus_match 0000001c  00000000  00000000  00000058  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  3 .text         00000000  00000000  00000000  000000d4  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
...
Since the .text sections are empty (size of 0 bytes) and won't be
loaded by the kernel module loader anyway, I don't see a reason
why such sections need to be listed under
/sys/module/<module_name>/sections/<section_name> either.

The attached patch does solve this issue by not exporting section
names which are empty.

This fixes bugzilla http://bugzilla.kernel.org/show_bug.cgi?id=14703

Signed-off-by: Helge Deller <deller@gmx.de>
CC: rusty@rustcorp.com.au
CC: akpm@linux-foundation.org
CC: James.Bottomley@HansenPartnership.com
CC: roland@redhat.com
CC: dave@hiauly1.hia.nrc.ca
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 4 additions and 1 deletions Side-by-side Diff

... ... @@ -1187,7 +1187,8 @@
1187 1187  
1188 1188 /* Count loaded sections and allocate structures */
1189 1189 for (i = 0; i < nsect; i++)
1190   - if (sechdrs[i].sh_flags & SHF_ALLOC)
  1190 + if (sechdrs[i].sh_flags & SHF_ALLOC
  1191 + && sechdrs[i].sh_size)
1191 1192 nloaded++;
1192 1193 size[0] = ALIGN(sizeof(*sect_attrs)
1193 1194 + nloaded * sizeof(sect_attrs->attrs[0]),
... ... @@ -1206,6 +1207,8 @@
1206 1207 gattr = &sect_attrs->grp.attrs[0];
1207 1208 for (i = 0; i < nsect; i++) {
1208 1209 if (! (sechdrs[i].sh_flags & SHF_ALLOC))
  1210 + continue;
  1211 + if (!sechdrs[i].sh_size)
1209 1212 continue;
1210 1213 sattr->address = sechdrs[i].sh_addr;
1211 1214 sattr->name = kstrdup(secstrings + sechdrs[i].sh_name,