s390/extmem: return correct segment type in __segment_load()
authorGerald Schaefer <gerald.schaefer@linux.ibm.com>
Mon, 27 Feb 2023 19:03:00 +0000 (20:03 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Wed, 1 Mar 2023 19:01:34 +0000 (20:01 +0100)
commit8c42dd78df148c90e48efff204cce38743906a79
treeb672c8d3862b1112710a9b0a0a40776d2bd9a25b
parent9b5c37bbf659fe4edb4804bc0aa99840d6798878
s390/extmem: return correct segment type in __segment_load()

Commit f05f62d04271f ("s390/vmem: get rid of memory segment list")
reshuffled the call to vmem_add_mapping() in __segment_load(), which now
overwrites rc after it was set to contain the segment type code.

As result, __segment_load() will now always return 0 on success, which
corresponds to the segment type code SEG_TYPE_SW, i.e. a writeable
segment. This results in a kernel crash when loading a read-only segment
as dcssblk block device, and trying to write to it.

Instead of reshuffling code again, make sure to return the segment type
on success, and also describe this rather delicate and unexpected logic
in the function comment. Also initialize new segtype variable with
invalid value, to prevent possible future confusion.

Fixes: f05f62d04271 ("s390/vmem: get rid of memory segment list")
Cc: <stable@vger.kernel.org> # 5.9+
Signed-off-by: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/mm/extmem.c