Livepatch modules generated by klp-build do not contain MODULE_VERSION
metadata. Add --module-version to identify a livepatch release
independently of its module name.

Append MODULE_VERSION() to the temporary copy of init.c when the option
is supplied. Restrict the accepted characters so the value can be
embedded safely in a C string literal. Leave the source template and
default build behavior unchanged.

For example:

$ scripts/livepatch/klp-build --module-version=1.2.3 fix.patch

The version can be read from the resulting module file without loading it:

$ modinfo -F version livepatch-fix.ko

The version is descriptive module metadata; it does not control
livepatch replacement or compatibility.

Signed-off-by: Dmitry Malkin <[email protected]>
---
 scripts/livepatch/klp-build | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/scripts/livepatch/klp-build b/scripts/livepatch/klp-build
index b52a8489d9f6..25e91fef3fa7 100755
--- a/scripts/livepatch/klp-build
+++ b/scripts/livepatch/klp-build
@@ -22,6 +22,7 @@ shopt -s lastpipe
 unset DEBUG_CLONE DIFF_CHECKSUM SKIP_CLEANUP VERBOSE XTRACE
 
 REPLACE=1
+MODULE_VERSION=
 SHORT_CIRCUIT=0
 JOBS="$(getconf _NPROCESSORS_ONLN)"
 shopt -o xtrace | grep -q 'on' && XTRACE=1
@@ -132,6 +133,7 @@ Options:
    -f, --show-first-changed    Show address of first changed instruction
    -j, --jobs=<jobs>           Build jobs to run simultaneously [default: 
$JOBS]
    -o, --output=<file.ko>      Output file [default: livepatch-<patch-name>.ko]
+       --module-version=<ver>  Set MODULE_VERSION metadata (letters, digits, . 
_ + : -)
        --no-replace            Disable livepatch atomic replace
    -v, --verbose               Pass V=1 to kernel/module builds
 
@@ -160,7 +162,7 @@ process_args() {
        local patch
 
        short="hfj:o:vdS:T"
-       
long="help,show-first-changed,jobs:,output:,no-replace,verbose,debug,short-circuit:,keep-tmp"
+       
long="help,show-first-changed,jobs:,output:,module-version:,no-replace,verbose,debug,short-circuit:,keep-tmp"
 
        args=$(getopt --options "$short" --longoptions "$long" -- "$@") || {
                echo; usage; exit
@@ -189,6 +191,12 @@ process_args() {
                                NAME="$(module_name_string "$NAME")"
                                shift 2
                                ;;
+                       --module-version)
+                               [[ "$2" =~ ^[a-zA-Z0-9._+:-]+$ ]] || \
+                                       die "module version must contain only 
letters, digits, '.', '_', '+', ':' or '-'"
+                               MODULE_VERSION="$2"
+                               shift 2
+                               ;;
                        --no-replace)
                                REPLACE=0
                                shift
@@ -827,6 +835,10 @@ build_patch_module() {
 
        cp -f "$SCRIPT_DIR/init.c" "$KMOD_DIR"
 
+       if [[ -n "$MODULE_VERSION" ]]; then
+               printf '\nMODULE_VERSION("%s");\n' "$MODULE_VERSION" >> 
"$KMOD_DIR/init.c"
+       fi
+
        echo "obj-m := $NAME.o" > "$makefile"
        echo -n "$NAME-y := init.o" >> "$makefile"
 

Reply via email to