@@ -1510,8 +1510,7 @@ static inline bool sect_empty(const Elf_Shdr *sect)
1510
1510
}
1511
1511
1512
1512
struct module_sect_attr {
1513
- struct module_attribute mattr ;
1514
- char * name ;
1513
+ struct bin_attribute battr ;
1515
1514
unsigned long address ;
1516
1515
};
1517
1516
@@ -1521,11 +1520,16 @@ struct module_sect_attrs {
1521
1520
struct module_sect_attr attrs [];
1522
1521
};
1523
1522
1524
- static ssize_t module_sect_show (struct module_attribute * mattr ,
1525
- struct module_kobject * mk , char * buf )
1523
+ static ssize_t module_sect_read (struct file * file , struct kobject * kobj ,
1524
+ struct bin_attribute * battr ,
1525
+ char * buf , loff_t pos , size_t count )
1526
1526
{
1527
1527
struct module_sect_attr * sattr =
1528
- container_of (mattr , struct module_sect_attr , mattr );
1528
+ container_of (battr , struct module_sect_attr , battr );
1529
+
1530
+ if (pos != 0 )
1531
+ return - EINVAL ;
1532
+
1529
1533
return sprintf (buf , "0x%px\n" , kptr_restrict < 2 ?
1530
1534
(void * )sattr -> address : NULL );
1531
1535
}
@@ -1535,7 +1539,7 @@ static void free_sect_attrs(struct module_sect_attrs *sect_attrs)
1535
1539
unsigned int section ;
1536
1540
1537
1541
for (section = 0 ; section < sect_attrs -> nsections ; section ++ )
1538
- kfree (sect_attrs -> attrs [section ].name );
1542
+ kfree (sect_attrs -> attrs [section ].battr . attr . name );
1539
1543
kfree (sect_attrs );
1540
1544
}
1541
1545
@@ -1544,42 +1548,41 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
1544
1548
unsigned int nloaded = 0 , i , size [2 ];
1545
1549
struct module_sect_attrs * sect_attrs ;
1546
1550
struct module_sect_attr * sattr ;
1547
- struct attribute * * gattr ;
1551
+ struct bin_attribute * * gattr ;
1548
1552
1549
1553
/* Count loaded sections and allocate structures */
1550
1554
for (i = 0 ; i < info -> hdr -> e_shnum ; i ++ )
1551
1555
if (!sect_empty (& info -> sechdrs [i ]))
1552
1556
nloaded ++ ;
1553
1557
size [0 ] = ALIGN (struct_size (sect_attrs , attrs , nloaded ),
1554
- sizeof (sect_attrs -> grp .attrs [0 ]));
1555
- size [1 ] = (nloaded + 1 ) * sizeof (sect_attrs -> grp .attrs [0 ]);
1558
+ sizeof (sect_attrs -> grp .bin_attrs [0 ]));
1559
+ size [1 ] = (nloaded + 1 ) * sizeof (sect_attrs -> grp .bin_attrs [0 ]);
1556
1560
sect_attrs = kzalloc (size [0 ] + size [1 ], GFP_KERNEL );
1557
1561
if (sect_attrs == NULL )
1558
1562
return ;
1559
1563
1560
1564
/* Setup section attributes. */
1561
1565
sect_attrs -> grp .name = "sections" ;
1562
- sect_attrs -> grp .attrs = (void * )sect_attrs + size [0 ];
1566
+ sect_attrs -> grp .bin_attrs = (void * )sect_attrs + size [0 ];
1563
1567
1564
1568
sect_attrs -> nsections = 0 ;
1565
1569
sattr = & sect_attrs -> attrs [0 ];
1566
- gattr = & sect_attrs -> grp .attrs [0 ];
1570
+ gattr = & sect_attrs -> grp .bin_attrs [0 ];
1567
1571
for (i = 0 ; i < info -> hdr -> e_shnum ; i ++ ) {
1568
1572
Elf_Shdr * sec = & info -> sechdrs [i ];
1569
1573
if (sect_empty (sec ))
1570
1574
continue ;
1575
+ sysfs_bin_attr_init (& sattr -> battr );
1571
1576
sattr -> address = sec -> sh_addr ;
1572
- sattr -> name = kstrdup ( info -> secstrings + sec -> sh_name ,
1573
- GFP_KERNEL );
1574
- if (sattr -> name == NULL )
1577
+ sattr -> battr . attr . name =
1578
+ kstrdup ( info -> secstrings + sec -> sh_name , GFP_KERNEL );
1579
+ if (sattr -> battr . attr . name == NULL )
1575
1580
goto out ;
1576
1581
sect_attrs -> nsections ++ ;
1577
- sysfs_attr_init (& sattr -> mattr .attr );
1578
- sattr -> mattr .show = module_sect_show ;
1579
- sattr -> mattr .store = NULL ;
1580
- sattr -> mattr .attr .name = sattr -> name ;
1581
- sattr -> mattr .attr .mode = S_IRUSR ;
1582
- * (gattr ++ ) = & (sattr ++ )-> mattr .attr ;
1582
+ sattr -> battr .read = module_sect_read ;
1583
+ sattr -> battr .size = 3 /* "0x", "\n" */ + (BITS_PER_LONG / 4 );
1584
+ sattr -> battr .attr .mode = 0400 ;
1585
+ * (gattr ++ ) = & (sattr ++ )-> battr ;
1583
1586
}
1584
1587
* gattr = NULL ;
1585
1588
@@ -1669,7 +1672,7 @@ static void add_notes_attrs(struct module *mod, const struct load_info *info)
1669
1672
continue ;
1670
1673
if (info -> sechdrs [i ].sh_type == SHT_NOTE ) {
1671
1674
sysfs_bin_attr_init (nattr );
1672
- nattr -> attr .name = mod -> sect_attrs -> attrs [loaded ].name ;
1675
+ nattr -> attr .name = mod -> sect_attrs -> attrs [loaded ].battr . attr . name ;
1673
1676
nattr -> attr .mode = S_IRUGO ;
1674
1677
nattr -> size = info -> sechdrs [i ].sh_size ;
1675
1678
nattr -> private = (void * ) info -> sechdrs [i ].sh_addr ;
0 commit comments