Skip to content

Commit b1aa01d

Browse files
svens-s390hcahca
authored andcommitted
s390/ipl: Clear SBP flag when bootprog is set
With z16 a new flag 'search boot program' was introduced for list-directed IPL (SCSI, NVMe, ECKD DASD). If this flag is set, e.g. via selecting the "Automatic" value for the "Boot program selector" control on an HMC load panel, it is copied to the reipl structure from the initial ipl structure. When a user now sets a boot prog via sysfs, the flag is not cleared and the bootloader will again automatically select the boot program, ignoring user configuration. To avoid that, clear the SBP flag when a bootprog sysfs file is written. Cc: stable@vger.kernel.org Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com> Reviewed-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Sven Schnelle <svens@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
1 parent 8f0b4cc commit b1aa01d

2 files changed

Lines changed: 37 additions & 12 deletions

File tree

arch/s390/include/uapi/asm/ipl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ struct ipl_pl_hdr {
1515
#define IPL_PL_FLAG_IPLPS 0x80
1616
#define IPL_PL_FLAG_SIPL 0x40
1717
#define IPL_PL_FLAG_IPLSR 0x20
18+
#define IPL_PL_FLAG_SBP 0x10
1819

1920
/* IPL Parameter Block header */
2021
struct ipl_pb_hdr {

arch/s390/kernel/ipl.c

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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)\
266284
IPL_ATTR_SHOW_FN(_prefix, _name, _fmt_out, _value) \
267285
static 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);
819837
DEFINE_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);
823839
DEFINE_IPL_ATTR_RW(reipl_fcp, br_lba, "%lld\n", "%lld\n",
824840
reipl_block_fcp->fcp.br_lba);
825841
DEFINE_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

828847
static 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);
943962
DEFINE_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);
947964
DEFINE_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

950970
static 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

10401060
DEFINE_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

10441065
static 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);
15681589
DEFINE_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);
15721591
DEFINE_IPL_ATTR_RW(dump_fcp, br_lba, "%lld\n", "%lld\n",
15731592
dump_block_fcp->fcp.br_lba);
15741593
DEFINE_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

15771599
DEFINE_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);
16051627
DEFINE_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);
16091629
DEFINE_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

16121635
DEFINE_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 */
16371660
DEFINE_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

16411665
IPL_ATTR_BR_CHR_SHOW_FN(dump, dump_block_eckd->eckd);
16421666
IPL_ATTR_BR_CHR_STORE_FN(dump, dump_block_eckd->eckd);

0 commit comments

Comments
 (0)