Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Sven Schnelle and committed by
Heiko Carstens
b1aa01d3 8f0b4cce

+37 -12
+1
arch/s390/include/uapi/asm/ipl.h
··· 15 15 #define IPL_PL_FLAG_IPLPS 0x80 16 16 #define IPL_PL_FLAG_SIPL 0x40 17 17 #define IPL_PL_FLAG_IPLSR 0x20 18 + #define IPL_PL_FLAG_SBP 0x10 18 19 19 20 /* IPL Parameter Block header */ 20 21 struct ipl_pb_hdr {
+36 -12
arch/s390/kernel/ipl.c
··· 262 262 sys_##_prefix##_##_name##_show, \ 263 263 sys_##_prefix##_##_name##_store) 264 264 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 + 265 283 #define DEFINE_IPL_ATTR_STR_RW(_prefix, _name, _fmt_out, _fmt_in, _value)\ 266 284 IPL_ATTR_SHOW_FN(_prefix, _name, _fmt_out, _value) \ 267 285 static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \ ··· 836 818 reipl_block_fcp->fcp.wwpn); 837 819 DEFINE_IPL_ATTR_RW(reipl_fcp, lun, "0x%016llx\n", "%llx\n", 838 820 reipl_block_fcp->fcp.lun); 839 - DEFINE_IPL_ATTR_RW(reipl_fcp, bootprog, "%lld\n", "%lld\n", 840 - reipl_block_fcp->fcp.bootprog); 841 821 DEFINE_IPL_ATTR_RW(reipl_fcp, br_lba, "%lld\n", "%lld\n", 842 822 reipl_block_fcp->fcp.br_lba); 843 823 DEFINE_IPL_ATTR_RW(reipl_fcp, device, "0.0.%04llx\n", "0.0.%llx\n", 844 824 reipl_block_fcp->fcp.devno); 825 + DEFINE_IPL_ATTR_BOOTPROG_RW(reipl_fcp, bootprog, "%lld\n", "%lld\n", 826 + reipl_block_fcp->hdr, 827 + reipl_block_fcp->fcp.bootprog); 845 828 846 829 static void reipl_get_ascii_loadparm(char *loadparm, 847 830 struct ipl_parameter_block *ibp) ··· 961 942 reipl_block_nvme->nvme.fid); 962 943 DEFINE_IPL_ATTR_RW(reipl_nvme, nsid, "0x%08llx\n", "%llx\n", 963 944 reipl_block_nvme->nvme.nsid); 964 - DEFINE_IPL_ATTR_RW(reipl_nvme, bootprog, "%lld\n", "%lld\n", 965 - reipl_block_nvme->nvme.bootprog); 966 945 DEFINE_IPL_ATTR_RW(reipl_nvme, br_lba, "%lld\n", "%lld\n", 967 946 reipl_block_nvme->nvme.br_lba); 947 + DEFINE_IPL_ATTR_BOOTPROG_RW(reipl_nvme, bootprog, "%lld\n", "%lld\n", 948 + reipl_block_nvme->hdr, 949 + reipl_block_nvme->nvme.bootprog); 968 950 969 951 static struct attribute *reipl_nvme_attrs[] = { 970 952 &sys_reipl_nvme_fid_attr.attr, ··· 1058 1038 }; 1059 1039 1060 1040 DEFINE_IPL_CCW_ATTR_RW(reipl_eckd, device, reipl_block_eckd->eckd); 1061 - DEFINE_IPL_ATTR_RW(reipl_eckd, bootprog, "%lld\n", "%lld\n", 1062 - reipl_block_eckd->eckd.bootprog); 1041 + DEFINE_IPL_ATTR_BOOTPROG_RW(reipl_eckd, bootprog, "%lld\n", "%lld\n", 1042 + reipl_block_eckd->hdr, 1043 + reipl_block_eckd->eckd.bootprog); 1063 1044 1064 1045 static struct attribute *reipl_eckd_attrs[] = { 1065 1046 &sys_reipl_eckd_device_attr.attr, ··· 1588 1567 dump_block_fcp->fcp.wwpn); 1589 1568 DEFINE_IPL_ATTR_RW(dump_fcp, lun, "0x%016llx\n", "%llx\n", 1590 1569 dump_block_fcp->fcp.lun); 1591 - DEFINE_IPL_ATTR_RW(dump_fcp, bootprog, "%lld\n", "%lld\n", 1592 - dump_block_fcp->fcp.bootprog); 1593 1570 DEFINE_IPL_ATTR_RW(dump_fcp, br_lba, "%lld\n", "%lld\n", 1594 1571 dump_block_fcp->fcp.br_lba); 1595 1572 DEFINE_IPL_ATTR_RW(dump_fcp, device, "0.0.%04llx\n", "0.0.%llx\n", 1596 1573 dump_block_fcp->fcp.devno); 1574 + DEFINE_IPL_ATTR_BOOTPROG_RW(dump_fcp, bootprog, "%lld\n", "%lld\n", 1575 + dump_block_fcp->hdr, 1576 + dump_block_fcp->fcp.bootprog); 1597 1577 1598 1578 DEFINE_IPL_ATTR_SCP_DATA_RW(dump_fcp, dump_block_fcp->hdr, 1599 1579 dump_block_fcp->fcp, ··· 1626 1604 dump_block_nvme->nvme.fid); 1627 1605 DEFINE_IPL_ATTR_RW(dump_nvme, nsid, "0x%08llx\n", "%llx\n", 1628 1606 dump_block_nvme->nvme.nsid); 1629 - DEFINE_IPL_ATTR_RW(dump_nvme, bootprog, "%lld\n", "%llx\n", 1630 - dump_block_nvme->nvme.bootprog); 1631 1607 DEFINE_IPL_ATTR_RW(dump_nvme, br_lba, "%lld\n", "%llx\n", 1632 1608 dump_block_nvme->nvme.br_lba); 1609 + DEFINE_IPL_ATTR_BOOTPROG_RW(dump_nvme, bootprog, "%lld\n", "%llx\n", 1610 + dump_block_nvme->hdr, 1611 + dump_block_nvme->nvme.bootprog); 1633 1612 1634 1613 DEFINE_IPL_ATTR_SCP_DATA_RW(dump_nvme, dump_block_nvme->hdr, 1635 1614 dump_block_nvme->nvme, ··· 1658 1635 1659 1636 /* ECKD dump device attributes */ 1660 1637 DEFINE_IPL_CCW_ATTR_RW(dump_eckd, device, dump_block_eckd->eckd); 1661 - DEFINE_IPL_ATTR_RW(dump_eckd, bootprog, "%lld\n", "%llx\n", 1662 - dump_block_eckd->eckd.bootprog); 1638 + DEFINE_IPL_ATTR_BOOTPROG_RW(dump_eckd, bootprog, "%lld\n", "%llx\n", 1639 + dump_block_eckd->hdr, 1640 + dump_block_eckd->eckd.bootprog); 1663 1641 1664 1642 IPL_ATTR_BR_CHR_SHOW_FN(dump, dump_block_eckd->eckd); 1665 1643 IPL_ATTR_BR_CHR_STORE_FN(dump, dump_block_eckd->eckd);