From cb38b32dfc29673caaf6987aacbe10b9ee0051ae Mon Sep 17 00:00:00 2001 From: Xunlei Pang Date: Mon, 10 Jul 2017 15:03:05 +0800 Subject: [PATCH] kdumpctl: use generated rd.lvm.lv=X Resolves: bz1451717 https://bugzilla.redhat.com/1451717 When there is any "rd.lvm.lv=X", "lvm" dracut module will try to recognize all the lvm volumes which is unnecessary and probably cause trouble for us. See https://bugzilla.redhat.com/show_bug.cgi?id=1451717#c2 Remove all the rd.lvm.lv=X inherited from the kernel cmdline, and generate the corresponding cmdline as needed for kdump. Because prepare_cmdline() is only used by kdump, we don't need to add any fadump judgement(also remove the existing judgement in passing). Currently, we don't handle "rd.lvm.vg=X", we can add it in when there is some bug reported in the future. Signed-off-by: Xunlei Pang Acked-by: Dave Young --- kdumpctl | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/kdumpctl b/kdumpctl index 1b8f4bd..ff7d01c 100755 --- a/kdumpctl +++ b/kdumpctl @@ -175,6 +175,45 @@ check_kdump_cpus() echo " try nr_cpus=$nr_min or larger instead" } +# Generate rd.lvm.lv=X for the kdump targets if any. +generate_lvm_cmdlines() +{ + local lvm_cmdlines="" + + generate_lvm_cmdline() { + local majmin=$1 dev + + [ -d "/sys/dev/block/$majmin/dm" ] || return 0 + dev=/dev/mapper/$(< "/sys/dev/block/$majmin/dm/name") + + vg=$(lvm lvs --rows $dev -o vg_name --separator=* 2>/dev/null | cut -d "*" -f 2) + lv=$(lvm lvs --rows $dev -o lv_name --separator=* 2>/dev/null | cut -d "*" -f 2) + if [ -n "$vg" -a -n "$lv" ]; then + lvm_cmdlines="rd.lvm.lv=$vg/$lv $lvm_cmdlines" + fi + + return 0 + } + + for_each_block_target_all generate_lvm_cmdline + + echo "$lvm_cmdlines" +} + +# $1: function name +for_each_block_target_all() +{ + local dev majmin + + for dev in $(get_kdump_targets); do + [ -b "$dev" ] || continue + majmin=$(get_maj_min $dev) + check_block_and_slaves_all $1 $majmin + done + + return 0 +} + # This function performs a series of edits on the command line. # Store the final result in global $KDUMP_COMMANDLINE. prepare_cmdline() @@ -194,15 +233,19 @@ prepare_cmdline() # Always remove "root=X", as we now explicitly generate all kinds # of dump target mount information including root fs. But we can - # not remove it in case of fadump or "default dump_to_rootfs". + # not remove it in case of "default dump_to_rootfs". # # We do this before KDUMP_COMMANDLINE_APPEND, if one really cares # about it(e.g. for debug purpose), then can pass "root=X" using # KDUMP_COMMANDLINE_APPEND. - if [ $DEFAULT_DUMP_MODE != "fadump" ] && ! is_dump_to_rootfs; then + if ! is_dump_to_rootfs; then cmdline=`remove_cmdline_param "$cmdline" root` fi + # Remove all the inherited rd.lvm.lv=X and generate those as needed. + cmdline=`remove_cmdline_param "$cmdline" rd.lvm.lv` + cmdline="${cmdline} $(generate_lvm_cmdlines)" + cmdline="${cmdline} ${KDUMP_COMMANDLINE_APPEND}" id=`get_bootcpu_initial_apicid`