@@ -262,6 +262,24 @@ static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
262262 sys_##_prefix##_##_name##_show, \
263263 sys_##_prefix##_##_name##_store)
264264
265+ #define DEFINE_IPL_ATTR_BOOTPROG_RW (_prefix , _name , _fmt_out , _fmt_in , _hdr , _value ) \
266+ IPL_ATTR_SHOW_FN(_prefix, _name, _fmt_out, (unsigned long long) _value) \
267+ static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
268+ struct kobj_attribute *attr, \
269+ const char *buf, size_t len) \
270+ { \
271+ unsigned long long value; \
272+ if (sscanf(buf, _fmt_in, &value) != 1) \
273+ return -EINVAL; \
274+ (_value) = value; \
275+ (_hdr).flags &= ~IPL_PL_FLAG_SBP; \
276+ return len; \
277+ } \
278+ static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
279+ __ATTR(_name, 0644, \
280+ sys_##_prefix##_##_name##_show, \
281+ sys_##_prefix##_##_name##_store)
282+
265283#define DEFINE_IPL_ATTR_STR_RW (_prefix , _name , _fmt_out , _fmt_in , _value )\
266284IPL_ATTR_SHOW_FN(_prefix, _name, _fmt_out, _value) \
267285static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
@@ -818,12 +836,13 @@ DEFINE_IPL_ATTR_RW(reipl_fcp, wwpn, "0x%016llx\n", "%llx\n",
818836 reipl_block_fcp -> fcp .wwpn );
819837DEFINE_IPL_ATTR_RW (reipl_fcp , lun , "0x%016llx\n" , "%llx\n" ,
820838 reipl_block_fcp -> fcp .lun );
821- DEFINE_IPL_ATTR_RW (reipl_fcp , bootprog , "%lld\n" , "%lld\n" ,
822- reipl_block_fcp -> fcp .bootprog );
823839DEFINE_IPL_ATTR_RW (reipl_fcp , br_lba , "%lld\n" , "%lld\n" ,
824840 reipl_block_fcp -> fcp .br_lba );
825841DEFINE_IPL_ATTR_RW (reipl_fcp , device , "0.0.%04llx\n" , "0.0.%llx\n" ,
826842 reipl_block_fcp -> fcp .devno );
843+ DEFINE_IPL_ATTR_BOOTPROG_RW (reipl_fcp , bootprog , "%lld\n" , "%lld\n" ,
844+ reipl_block_fcp -> hdr ,
845+ reipl_block_fcp -> fcp .bootprog );
827846
828847static void reipl_get_ascii_loadparm (char * loadparm ,
829848 struct ipl_parameter_block * ibp )
@@ -942,10 +961,11 @@ DEFINE_IPL_ATTR_RW(reipl_nvme, fid, "0x%08llx\n", "%llx\n",
942961 reipl_block_nvme -> nvme .fid );
943962DEFINE_IPL_ATTR_RW (reipl_nvme , nsid , "0x%08llx\n" , "%llx\n" ,
944963 reipl_block_nvme -> nvme .nsid );
945- DEFINE_IPL_ATTR_RW (reipl_nvme , bootprog , "%lld\n" , "%lld\n" ,
946- reipl_block_nvme -> nvme .bootprog );
947964DEFINE_IPL_ATTR_RW (reipl_nvme , br_lba , "%lld\n" , "%lld\n" ,
948965 reipl_block_nvme -> nvme .br_lba );
966+ DEFINE_IPL_ATTR_BOOTPROG_RW (reipl_nvme , bootprog , "%lld\n" , "%lld\n" ,
967+ reipl_block_nvme -> hdr ,
968+ reipl_block_nvme -> nvme .bootprog );
949969
950970static struct attribute * reipl_nvme_attrs [] = {
951971 & sys_reipl_nvme_fid_attr .attr ,
@@ -1038,8 +1058,9 @@ static const struct bin_attribute *const reipl_eckd_bin_attrs[] = {
10381058};
10391059
10401060DEFINE_IPL_CCW_ATTR_RW (reipl_eckd , device , reipl_block_eckd -> eckd );
1041- DEFINE_IPL_ATTR_RW (reipl_eckd , bootprog , "%lld\n" , "%lld\n" ,
1042- reipl_block_eckd -> eckd .bootprog );
1061+ DEFINE_IPL_ATTR_BOOTPROG_RW (reipl_eckd , bootprog , "%lld\n" , "%lld\n" ,
1062+ reipl_block_eckd -> hdr ,
1063+ reipl_block_eckd -> eckd .bootprog );
10431064
10441065static struct attribute * reipl_eckd_attrs [] = {
10451066 & sys_reipl_eckd_device_attr .attr ,
@@ -1567,12 +1588,13 @@ DEFINE_IPL_ATTR_RW(dump_fcp, wwpn, "0x%016llx\n", "%llx\n",
15671588 dump_block_fcp -> fcp .wwpn );
15681589DEFINE_IPL_ATTR_RW (dump_fcp , lun , "0x%016llx\n" , "%llx\n" ,
15691590 dump_block_fcp -> fcp .lun );
1570- DEFINE_IPL_ATTR_RW (dump_fcp , bootprog , "%lld\n" , "%lld\n" ,
1571- dump_block_fcp -> fcp .bootprog );
15721591DEFINE_IPL_ATTR_RW (dump_fcp , br_lba , "%lld\n" , "%lld\n" ,
15731592 dump_block_fcp -> fcp .br_lba );
15741593DEFINE_IPL_ATTR_RW (dump_fcp , device , "0.0.%04llx\n" , "0.0.%llx\n" ,
15751594 dump_block_fcp -> fcp .devno );
1595+ DEFINE_IPL_ATTR_BOOTPROG_RW (dump_fcp , bootprog , "%lld\n" , "%lld\n" ,
1596+ dump_block_fcp -> hdr ,
1597+ dump_block_fcp -> fcp .bootprog );
15761598
15771599DEFINE_IPL_ATTR_SCP_DATA_RW (dump_fcp , dump_block_fcp -> hdr ,
15781600 dump_block_fcp -> fcp ,
@@ -1604,10 +1626,11 @@ DEFINE_IPL_ATTR_RW(dump_nvme, fid, "0x%08llx\n", "%llx\n",
16041626 dump_block_nvme -> nvme .fid );
16051627DEFINE_IPL_ATTR_RW (dump_nvme , nsid , "0x%08llx\n" , "%llx\n" ,
16061628 dump_block_nvme -> nvme .nsid );
1607- DEFINE_IPL_ATTR_RW (dump_nvme , bootprog , "%lld\n" , "%llx\n" ,
1608- dump_block_nvme -> nvme .bootprog );
16091629DEFINE_IPL_ATTR_RW (dump_nvme , br_lba , "%lld\n" , "%llx\n" ,
16101630 dump_block_nvme -> nvme .br_lba );
1631+ DEFINE_IPL_ATTR_BOOTPROG_RW (dump_nvme , bootprog , "%lld\n" , "%llx\n" ,
1632+ dump_block_nvme -> hdr ,
1633+ dump_block_nvme -> nvme .bootprog );
16111634
16121635DEFINE_IPL_ATTR_SCP_DATA_RW (dump_nvme , dump_block_nvme -> hdr ,
16131636 dump_block_nvme -> nvme ,
@@ -1635,8 +1658,9 @@ static const struct attribute_group dump_nvme_attr_group = {
16351658
16361659/* ECKD dump device attributes */
16371660DEFINE_IPL_CCW_ATTR_RW (dump_eckd , device , dump_block_eckd -> eckd );
1638- DEFINE_IPL_ATTR_RW (dump_eckd , bootprog , "%lld\n" , "%llx\n" ,
1639- dump_block_eckd -> eckd .bootprog );
1661+ DEFINE_IPL_ATTR_BOOTPROG_RW (dump_eckd , bootprog , "%lld\n" , "%llx\n" ,
1662+ dump_block_eckd -> hdr ,
1663+ dump_block_eckd -> eckd .bootprog );
16401664
16411665IPL_ATTR_BR_CHR_SHOW_FN (dump , dump_block_eckd -> eckd );
16421666IPL_ATTR_BR_CHR_STORE_FN (dump , dump_block_eckd -> eckd );
0 commit comments