diff --git a/.gitignore b/.gitignore index c297b30..908094d 100644 --- a/.gitignore +++ b/.gitignore @@ -33,5 +33,3 @@ multipath-tools-091027.tar.gz /multipath-tools-0.9.8.tgz /multipath-tools-0.9.9.tgz /multipath-tools-0.10.0.tgz -/multipath-tools-0.11.1.tgz -/multipath-tools-0.13.0.tgz diff --git a/0001-GitHub-workflows-use-upload-download-artifact-v4.patch b/0001-GitHub-workflows-use-upload-download-artifact-v4.patch new file mode 100644 index 0000000..c8247ca --- /dev/null +++ b/0001-GitHub-workflows-use-upload-download-artifact-v4.patch @@ -0,0 +1,122 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Fri, 13 Sep 2024 09:09:19 +0200 +Subject: [PATCH] GitHub workflows: use {upload,download}-artifact@v4 + +The @v1 releases are deprecated. +https://github.blog/changelog/2024-02-13-deprecation-notice-v1-and-v2-of-the-artifact-actions/ + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + .github/workflows/abi.yaml | 6 ++++-- + .github/workflows/foreign.yaml | 15 +++++++-------- + .github/workflows/native.yaml | 5 +++-- + 3 files changed, 14 insertions(+), 12 deletions(-) + +diff --git a/.github/workflows/abi.yaml b/.github/workflows/abi.yaml +index 393322e5..dce09f5c 100644 +--- a/.github/workflows/abi.yaml ++++ b/.github/workflows/abi.yaml +@@ -45,10 +45,11 @@ jobs: + - name: create ABI + run: make -Orecurse -j$(grep -c ^processor /proc/cpuinfo) abi.tar.gz + - name: save ABI +- uses: actions/upload-artifact@v1 ++ uses: actions/upload-artifact@v4 + with: + name: abi + path: abi ++ overwrite: true + - name: compare ABI against reference + id: compare + continue-on-error: true +@@ -56,10 +57,11 @@ jobs: + run: make abi-test + - name: save differences + if: ${{ steps.compare.outcome == 'failure' }} +- uses: actions/upload-artifact@v1 ++ uses: actions/upload-artifact@v4 + with: + name: abi-test + path: abi-test ++ overwrite: true + + - name: fail + # MUST use >- here, otherwise the condition always evaluates to true +diff --git a/.github/workflows/foreign.yaml b/.github/workflows/foreign.yaml +index 9e4d35e0..d68650df 100644 +--- a/.github/workflows/foreign.yaml ++++ b/.github/workflows/foreign.yaml +@@ -36,14 +36,13 @@ jobs: + - name: checkout + uses: actions/checkout@v1 + - name: build +- run: make -j8 -Orecurse test-progs +- - name: create binary archive +- run: make test-progs.tar ++ run: make -j -Orecurse test-progs.tar + - name: upload binary archive +- uses: actions/upload-artifact@v1 ++ uses: actions/upload-artifact@v4 + with: + name: cross-${{ matrix.os }}-${{ matrix.arch }} + path: test-progs.tar ++ overwrite: true + + test: + runs-on: ubuntu-22.04 +@@ -61,11 +60,11 @@ jobs: + run: echo CONTAINER_ARCH="arm/v7" >> $GITHUB_ENV + if: ${{ matrix.arch == 'armhf' }} + - name: download binary archive +- uses: actions/download-artifact@v1 ++ uses: actions/download-artifact@v4 + with: + name: cross-${{ matrix.os }}-${{ matrix.arch }} + - name: unpack binary archive +- run: tar xfv cross-${{ matrix.os }}-${{ matrix.arch }}/test-progs.tar ++ run: tar xfv test-progs.tar + - name: enable foreign arch + uses: dbhi/qus/action@main + - name: run tests +@@ -100,11 +99,11 @@ jobs: + run: echo CONTAINER_ARCH="arm/v7" >> $GITHUB_ENV + if: ${{ matrix.arch == 'armhf' }} + - name: download binary archive +- uses: actions/download-artifact@v1 ++ uses: actions/download-artifact@v4 + with: + name: cross-${{ matrix.os }}-${{ matrix.arch }} + - name: unpack binary archive +- run: tar xfv cross-${{ matrix.os }}-${{ matrix.arch }}/test-progs.tar ++ run: tar xfv test-progs.tar + - name: enable foreign arch + uses: dbhi/qus/action@main + - name: run tests +diff --git a/.github/workflows/native.yaml b/.github/workflows/native.yaml +index 80ff6df5..500becaa 100644 +--- a/.github/workflows/native.yaml ++++ b/.github/workflows/native.yaml +@@ -57,10 +57,11 @@ jobs: + - name: create binary archive + run: make ${{ env.ARCHIVE_TGT }} + - name: upload binary archive +- uses: actions/upload-artifact@v1 ++ uses: actions/upload-artifact@v4 + with: + name: native-${{ matrix.os }} + path: ${{ env.ARCHIVE_TGT }} ++ overwrite: true + + - name: clean + run: make clean +@@ -98,7 +99,7 @@ jobs: + uses: actions/checkout@v1 + + - name: download binary archive +- uses: actions/download-artifact@v1 ++ uses: actions/download-artifact@v4 + with: + name: native-${{ matrix.os }} + - name: unpack binary archive diff --git a/0002-GitHub-workflows-update-dawidd6-action-download-arti.patch b/0002-GitHub-workflows-update-dawidd6-action-download-arti.patch new file mode 100644 index 0000000..423bf56 --- /dev/null +++ b/0002-GitHub-workflows-update-dawidd6-action-download-arti.patch @@ -0,0 +1,24 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Fri, 13 Sep 2024 09:10:38 +0200 +Subject: [PATCH] GitHub workflows: update dawidd6/action-download-artifact + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + .github/workflows/abi.yaml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/.github/workflows/abi.yaml b/.github/workflows/abi.yaml +index dce09f5c..d5f8b477 100644 +--- a/.github/workflows/abi.yaml ++++ b/.github/workflows/abi.yaml +@@ -28,7 +28,7 @@ jobs: + - name: get reference ABI + id: reference + continue-on-error: true +- uses: dawidd6/action-download-artifact@v2 ++ uses: dawidd6/action-download-artifact@v6 + with: + workflow: abi.yaml + branch: ${{ env.ABI_BRANCH }} diff --git a/0003-Github-workflows-native.yml-use-mosteo-actions-docke.patch b/0003-Github-workflows-native.yml-use-mosteo-actions-docke.patch new file mode 100644 index 0000000..63aa273 --- /dev/null +++ b/0003-Github-workflows-native.yml-use-mosteo-actions-docke.patch @@ -0,0 +1,98 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Fri, 13 Sep 2024 09:45:25 +0200 +Subject: [PATCH] Github workflows: native.yml: use mosteo-actions/docker-run + +We can't use "container:" any more because upload-artifact@v4 doesn't +work on Debian Jessie. + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + .github/workflows/native.yaml | 45 +++++++++++++++++++++-------------- + 1 file changed, 27 insertions(+), 18 deletions(-) + +diff --git a/.github/workflows/native.yaml b/.github/workflows/native.yaml +index 500becaa..70d01c55 100644 +--- a/.github/workflows/native.yaml ++++ b/.github/workflows/native.yaml +@@ -35,17 +35,9 @@ jobs: + - debian-bookworm + - fedora-40 + - opensuse-leap +- container: ghcr.io/mwilck/multipath-build-${{ matrix.os }} + steps: + - name: checkout + uses: actions/checkout@v1 +- - name: build and test +- if: ${{ matrix.os != 'debian-jessie' }} +- run: make -j -Orecurse test +- - name: build and test (jessie) +- # On jessie, we use libreadline 5 (no licensing issue) +- if: ${{ matrix.os == 'debian-jessie' }} +- run: make -j -Orecurse READLINE=libreadline test + + - name: set archive name + # Leap containers have cpio but not tar +@@ -54,8 +46,21 @@ jobs: + - name: set archive name + run: echo ARCHIVE_TGT=test-progs.tar >> $GITHUB_ENV + if: ${{ matrix.os != 'opensuse-leap' }} +- - name: create binary archive +- run: make ${{ env.ARCHIVE_TGT }} ++ ++ - name: build and test ++ if: ${{ matrix.os != 'debian-jessie' }} ++ uses: mosteo-actions/docker-run@v1 ++ with: ++ image: ghcr.io/mwilck/multipath-build-${{ matrix.os }} ++ command: -j -Orecurse ${{ env.ARCHIVE_TGT }} test ++ - name: build and test (jessie) ++ # On jessie, we use libreadline 5 (no licensing issue) ++ if: ${{ matrix.os == 'debian-jessie' }} ++ uses: mosteo-actions/docker-run@v1 ++ with: ++ image: ghcr.io/mwilck/multipath-build-${{ matrix.os }} ++ command: -j -Orecurse READLINE=libreadline ${{ env.ARCHIVE_TGT }} test ++ + - name: upload binary archive + uses: actions/upload-artifact@v4 + with: +@@ -67,14 +72,18 @@ jobs: + run: make clean + - name: clang + if: ${{ matrix.os != 'debian-jessie' }} +- env: +- CC: clang +- run: make -j -Orecurse test ++ uses: mosteo-actions/docker-run@v1 ++ with: ++ image: ghcr.io/mwilck/multipath-build-${{ matrix.os }} ++ params: -e CC=clang ++ command: -j -Orecurse test + - name: clang (jessie) + if: ${{ matrix.os == 'debian-jessie' }} +- env: +- CC: clang +- run: make READLINE=libreadline test ++ uses: mosteo-actions/docker-run@v1 ++ with: ++ image: ghcr.io/mwilck/multipath-build-${{ matrix.os }} ++ params: -e CC=clang ++ command: -j -Orecurse READLINE=libreadline test + + root-test: + runs-on: ubuntu-22.04 +@@ -103,10 +112,10 @@ jobs: + with: + name: native-${{ matrix.os }} + - name: unpack binary archive +- run: cpio -idv < native-${{ matrix.os }}/test-progs.cpio ++ run: cpio -idv < test-progs.cpio + if: ${{ matrix.os == 'opensuse-leap' }} + - name: unpack binary archive +- run: tar xfmv native-${{ matrix.os }}/test-progs.tar ++ run: tar xfmv test-progs.tar + if: ${{ matrix.os != 'opensuse-leap' }} + + - name: run root tests diff --git a/0004-GitHub-workflows-native.yml-use-extra-job-for-clang.patch b/0004-GitHub-workflows-native.yml-use-extra-job-for-clang.patch new file mode 100644 index 0000000..e6d618c --- /dev/null +++ b/0004-GitHub-workflows-native.yml-use-extra-job-for-clang.patch @@ -0,0 +1,43 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Fri, 13 Sep 2024 10:17:17 +0200 +Subject: [PATCH] GitHub workflows: native.yml: use extra job for clang + +Running "make" in a container and "make clean" outside doesn't +work (access right issues). So just use separate jobs. + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + .github/workflows/native.yaml | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +diff --git a/.github/workflows/native.yaml b/.github/workflows/native.yaml +index 70d01c55..95b53b87 100644 +--- a/.github/workflows/native.yaml ++++ b/.github/workflows/native.yaml +@@ -68,8 +68,22 @@ jobs: + path: ${{ env.ARCHIVE_TGT }} + overwrite: true + +- - name: clean +- run: make clean ++ clang: ++ runs-on: ubuntu-22.04 ++ strategy: ++ fail-fast: false ++ matrix: ++ os: ++ - debian-jessie ++ - debian-buster ++ - debian-bullseye ++ - debian-bookworm ++ - fedora-40 ++ - opensuse-leap ++ steps: ++ - name: checkout ++ uses: actions/checkout@v1 ++ + - name: clang + if: ${{ matrix.os != 'debian-jessie' }} + uses: mosteo-actions/docker-run@v1 diff --git a/0005-GitHub-workflows-native.yaml-make-test-and-archive-s.patch b/0005-GitHub-workflows-native.yaml-make-test-and-archive-s.patch new file mode 100644 index 0000000..cabfbcf --- /dev/null +++ b/0005-GitHub-workflows-native.yaml-make-test-and-archive-s.patch @@ -0,0 +1,51 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Fri, 13 Sep 2024 10:30:47 +0200 +Subject: [PATCH] GitHub workflows: native.yaml: make test and archive + separately + +Avoid "text file busy" error on GitHub. + +dmevents-test: Text file busy +Makefile:74: recipe for target 'dmevents.out' failed + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + .github/workflows/native.yaml | 17 +++++++++++++++-- + 1 file changed, 15 insertions(+), 2 deletions(-) + +diff --git a/.github/workflows/native.yaml b/.github/workflows/native.yaml +index 95b53b87..f06b09df 100644 +--- a/.github/workflows/native.yaml ++++ b/.github/workflows/native.yaml +@@ -52,14 +52,27 @@ jobs: + uses: mosteo-actions/docker-run@v1 + with: + image: ghcr.io/mwilck/multipath-build-${{ matrix.os }} +- command: -j -Orecurse ${{ env.ARCHIVE_TGT }} test ++ command: -j -Orecurse test + - name: build and test (jessie) + # On jessie, we use libreadline 5 (no licensing issue) + if: ${{ matrix.os == 'debian-jessie' }} + uses: mosteo-actions/docker-run@v1 + with: + image: ghcr.io/mwilck/multipath-build-${{ matrix.os }} +- command: -j -Orecurse READLINE=libreadline ${{ env.ARCHIVE_TGT }} test ++ command: -j -Orecurse READLINE=libreadline test ++ ++ - name: create ${{ env.ARCHIVE_TGT }} ++ if: ${{ matrix.os != 'debian-jessie' }} ++ uses: mosteo-actions/docker-run@v1 ++ with: ++ image: ghcr.io/mwilck/multipath-build-${{ matrix.os }} ++ command: ${{ env.ARCHIVE_TGT }} ++ - name: create ${{ env.ARCHIVE_TGT }} (jessie) ++ if: ${{ matrix.os == 'debian-jessie' }} ++ uses: mosteo-actions/docker-run@v1 ++ with: ++ image: ghcr.io/mwilck/multipath-build-${{ matrix.os }} ++ command: READLINE=libreadline ${{ env.ARCHIVE_TGT }} + + - name: upload binary archive + uses: actions/upload-artifact@v4 diff --git a/0006-GitHub-workflows-enable-unit-tests-for-stable-branch.patch b/0006-GitHub-workflows-enable-unit-tests-for-stable-branch.patch new file mode 100644 index 0000000..4a9b254 --- /dev/null +++ b/0006-GitHub-workflows-enable-unit-tests-for-stable-branch.patch @@ -0,0 +1,133 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Thu, 14 Nov 2024 16:02:38 +0100 +Subject: [PATCH] GitHub workflows: enable unit tests for stable branches + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + .github/workflows/build-and-unittest.yaml | 2 ++ + .github/workflows/foreign.yaml | 2 ++ + .github/workflows/multiarch-stable.yaml | 2 ++ + .github/workflows/multiarch.yaml | 2 ++ + .github/workflows/native.yaml | 2 ++ + .github/workflows/rolling.yaml | 2 ++ + 6 files changed, 12 insertions(+) + +diff --git a/.github/workflows/build-and-unittest.yaml b/.github/workflows/build-and-unittest.yaml +index a838f9a2..1a727e14 100644 +--- a/.github/workflows/build-and-unittest.yaml ++++ b/.github/workflows/build-and-unittest.yaml +@@ -5,10 +5,12 @@ on: + - master + - queue + - tip ++ - 'stable-*' + pull_request: + branches: + - master + - queue ++ - 'stable-*' + jobs: + jammy: + runs-on: ubuntu-22.04 +diff --git a/.github/workflows/foreign.yaml b/.github/workflows/foreign.yaml +index d68650df..0f80957b 100644 +--- a/.github/workflows/foreign.yaml ++++ b/.github/workflows/foreign.yaml +@@ -5,6 +5,7 @@ on: + - master + - queue + - tip ++ - 'stable-*' + paths: + - '.github/workflows/foreign.yaml' + - '**.h' +@@ -15,6 +16,7 @@ on: + branches: + - master + - queue ++ - 'stable-*' + paths: + - '.github/workflows/foreign.yaml' + - '**.h' +diff --git a/.github/workflows/multiarch-stable.yaml b/.github/workflows/multiarch-stable.yaml +index e51d383c..ffede53d 100644 +--- a/.github/workflows/multiarch-stable.yaml ++++ b/.github/workflows/multiarch-stable.yaml +@@ -5,6 +5,7 @@ on: + - master + - queue + - tip ++ - 'stable-*' + paths: + - '.github/workflows/multiarch-stable.yaml' + - '**.h' +@@ -15,6 +16,7 @@ on: + branches: + - master + - queue ++ - 'stable-*' + paths: + - '.github/workflows/multiarch-stable.yaml' + - '**.h' +diff --git a/.github/workflows/multiarch.yaml b/.github/workflows/multiarch.yaml +index df95a02f..d2b833a4 100644 +--- a/.github/workflows/multiarch.yaml ++++ b/.github/workflows/multiarch.yaml +@@ -5,6 +5,7 @@ on: + - master + - queue + - tip ++ - 'stable-*' + paths: + - '.github/workflows/multiarch.yaml' + - '**.h' +@@ -15,6 +16,7 @@ on: + branches: + - master + - queue ++ - 'stable-*' + paths: + - '.github/workflows/multiarch.yaml' + - '**.h' +diff --git a/.github/workflows/native.yaml b/.github/workflows/native.yaml +index f06b09df..c9d9df9e 100644 +--- a/.github/workflows/native.yaml ++++ b/.github/workflows/native.yaml +@@ -5,6 +5,7 @@ on: + - master + - queue + - tip ++ - 'stable-*' + paths: + - '.github/workflows/native.yaml' + - '**.h' +@@ -15,6 +16,7 @@ on: + branches: + - master + - queue ++ - 'stable-*' + paths: + - '.github/workflows/native.yaml' + - '**.h' +diff --git a/.github/workflows/rolling.yaml b/.github/workflows/rolling.yaml +index 3536b944..66af7a44 100644 +--- a/.github/workflows/rolling.yaml ++++ b/.github/workflows/rolling.yaml +@@ -5,6 +5,7 @@ on: + - master + - queue + - tip ++ - 'stable-*' + paths: + - '.github/workflows/rolling.yaml' + - '**.h' +@@ -15,6 +16,7 @@ on: + branches: + - master + - queue ++ - 'stable-*' + paths: + - '.github/workflows/rolling.yaml' + - '**.h' diff --git a/0007-GitHub-Workflows-add-abi-check-for-stable-branches.patch b/0007-GitHub-Workflows-add-abi-check-for-stable-branches.patch new file mode 100644 index 0000000..c19980f --- /dev/null +++ b/0007-GitHub-Workflows-add-abi-check-for-stable-branches.patch @@ -0,0 +1,110 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Thu, 14 Nov 2024 16:51:05 +0100 +Subject: [PATCH] GitHub Workflows: add abi check for stable branches + +The ABI should never change on a stable branch. This workflow +asserts that. + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + .github/workflows/abi-stable.yaml | 89 +++++++++++++++++++++++++++++++ + 1 file changed, 89 insertions(+) + create mode 100644 .github/workflows/abi-stable.yaml + +diff --git a/.github/workflows/abi-stable.yaml b/.github/workflows/abi-stable.yaml +new file mode 100644 +index 00000000..a6746f23 +--- /dev/null ++++ b/.github/workflows/abi-stable.yaml +@@ -0,0 +1,89 @@ ++name: check-abi for stable branch ++on: ++ push: ++ branches: ++ - 'stable-*' ++ paths: ++ - '.github/workflows/abi-stable.yaml' ++ - '**.h' ++ - '**.c' ++ - '**.version' ++ pull_request: ++ branches: ++ - 'stable-*' ++ workflow_dispatch: ++ ++jobs: ++ reference-abi: ++ runs-on: ubuntu-20.04 ++ steps: ++ - name: get parent tag ++ run: > ++ echo ${{ github.ref }} | ++ sed -E 's,refs/heads/stable-([0-9]\.[0-9]*)\.y,PARENT_TAG=\1.0,' >> $GITHUB_ENV ++ - name: assert parent tag ++ run: /bin/false ++ if: ${{ env.PARENT_TAG == '' }} ++ - name: update ++ run: sudo apt-get update ++ - name: dependencies ++ run: > ++ sudo apt-get install --yes gcc ++ gcc make pkg-config abigail-tools ++ libdevmapper-dev libreadline-dev libaio-dev libsystemd-dev ++ libudev-dev libjson-c-dev liburcu-dev libcmocka-dev libedit-dev ++ - name: checkout ${{ env.PARENT_TAG }} ++ uses: actions/checkout@v4 ++ with: ++ ref: ${{ env.PARENT_TAG }} ++ - name: build ABI for ${{ env.PARENT_TAG }} ++ run: make -j$(grep -c ^processor /proc/cpuinfo) -Orecurse abi ++ - name: save ABI ++ uses: actions/upload-artifact@v4 ++ with: ++ name: multipath-abi-${{ env.PARENT_TAG }} ++ path: abi ++ ++ check-abi: ++ runs-on: ubuntu-20.04 ++ needs: reference-abi ++ steps: ++ - name: get parent tag ++ run: > ++ echo ${{ github.ref }} | ++ sed -E 's,refs/heads/stable-([0-9]\.[0-9]*)\.y,PARENT_TAG=\1.0,' >> $GITHUB_ENV ++ - name: assert parent tag ++ run: /bin/false ++ if: ${{ env.PARENT_TAG == '' }} ++ - name: checkout ${{ env.PARENT_TAG }} ++ uses: actions/checkout@v4 ++ with: ++ ref: ${{ env.PARENT_TAG }} ++ - name: download ABI for ${{ env.PARENT_TAG }} ++ id: download_abi ++ uses: actions/download-artifact@v4 ++ with: ++ name: multipath-abi-${{ env.PARENT_TAG }} ++ path: reference-abi ++ - name: update ++ run: sudo apt-get update ++ if: steps.download_abi.outcome != 'success' ++ - name: dependencies ++ run: > ++ sudo apt-get install --yes gcc ++ gcc make pkg-config abigail-tools ++ libdevmapper-dev libreadline-dev libaio-dev libsystemd-dev ++ libudev-dev libjson-c-dev liburcu-dev libcmocka-dev libedit-dev ++ - name: check ABI of ${{ github.ref }} against ${{ env.PARENT_TAG }} ++ id: check_abi ++ run: make -j$(grep -c ^processor /proc/cpuinfo) -Orecurse abi-test ++ continue-on-error: true ++ - name: save differences ++ if: ${{ steps.check_abi.outcome != 'success' }} ++ uses: actions/upload-artifact@v4 ++ with: ++ name: abi-test ++ path: abi-test ++ - name: fail ++ run: /bin/false ++ if: steps.check_abi.outcome != 'success' diff --git a/0008-libmultipath-dm_get_maps-don-t-bail-out-for-single-m.patch b/0008-libmultipath-dm_get_maps-don-t-bail-out-for-single-m.patch new file mode 100644 index 0000000..88122b0 --- /dev/null +++ b/0008-libmultipath-dm_get_maps-don-t-bail-out-for-single-m.patch @@ -0,0 +1,32 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Tue, 12 Nov 2024 13:06:10 +0100 +Subject: [PATCH] libmultipath: dm_get_maps(): don't bail out for single-map + failures + +dm_get_maps() traverses the entire list of dm maps. We shouldn't +give up just because probing a single map failed. + +Fixes: bf3a4ad ("libmultipath: simplify dm_get_maps()") +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + libmultipath/devmapper.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c +index c497c225..52bfe9ce 100644 +--- a/libmultipath/devmapper.c ++++ b/libmultipath/devmapper.c +@@ -1262,10 +1262,8 @@ int dm_get_maps(vector mp) + } + vector_set_slot(mp, mpp); + break; +- case DMP_NO_MATCH: +- break; + default: +- return 1; ++ break; + } + next = names->next; + names = (void *) names + next; diff --git a/0009-11-dm-mpath.rules.in-import-DM_COLDPLUG_SUSPENDED-on.patch b/0009-11-dm-mpath.rules.in-import-DM_COLDPLUG_SUSPENDED-on.patch new file mode 100644 index 0000000..b380f75 --- /dev/null +++ b/0009-11-dm-mpath.rules.in-import-DM_COLDPLUG_SUSPENDED-on.patch @@ -0,0 +1,42 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Thu, 31 Oct 2024 12:08:08 +0100 +Subject: [PATCH] 11-dm-mpath.rules.in: import DM_COLDPLUG_SUSPENDED only once + +We import DM_COLDPLUG_SUSPENDED in all code flows below mpath_coldplug_end. +Clarify this in the code. + +Signed-off-by: Martin Wilck +Reviewed-by: Benjamin Marzinski +Signed-off-by: Benjamin Marzinski +--- + multipath/11-dm-mpath.rules.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/multipath/11-dm-mpath.rules.in b/multipath/11-dm-mpath.rules.in +index 30647b99..67838261 100644 +--- a/multipath/11-dm-mpath.rules.in ++++ b/multipath/11-dm-mpath.rules.in +@@ -24,12 +24,13 @@ ENV{DM_UDEV_RULES_VSN}=="1|2", ENV{.DM_SUSPENDED}!="1", ENV{DISK_RO}!="1", \ + ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="", GOTO="scan_import" + LABEL="mpath_coldplug_end" + ++IMPORT{db}="DM_COLDPLUG_SUSPENDED" ++ + # If this uevent didn't come from dm, don't try to update the + # device state + # Note that .MPATH_DEVICE_READY_OLD=="" here. Thus we won't activate the + # device below at mpath_is_ready, which is correct. + ENV{DM_COOKIE}!="?*", ENV{DM_ACTION}!="PATH_*", \ +- IMPORT{db}="DM_COLDPLUG_SUSPENDED", \ + GOTO="check_mpath_ready" + + ENV{.MPATH_DEVICE_READY_OLD}="$env{MPATH_DEVICE_READY}" +@@ -67,7 +68,6 @@ LABEL="check_mpath_unchanged" + # A previous coldplug event occurred while the device was suspended. + # Activation might have been partially skipped. Activate the device now, + # i.e. disable the MPATH_UNCHANGED logic and set DM_ACTIVATION=1. +-IMPORT{db}="DM_COLDPLUG_SUSPENDED" + ENV{DM_COLDPLUG_SUSPENDED}=="1", ENV{.DM_SUSPENDED}!="1", \ + ENV{DM_ACTIVATION}="1", ENV{MPATH_UNCHANGED}="0", \ + PROGRAM="@SYSDIR_BIN@/logger -t 11-dm-mpath.rules -p daemon.notice \"Forcing activation of previously suspended device\"", \ diff --git a/0010-11-dm-mpath.rules.in-handle-inactive-suspended-devic.patch b/0010-11-dm-mpath.rules.in-handle-inactive-suspended-devic.patch new file mode 100644 index 0000000..f34e699 --- /dev/null +++ b/0010-11-dm-mpath.rules.in-handle-inactive-suspended-devic.patch @@ -0,0 +1,66 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Thu, 31 Oct 2024 12:59:03 +0100 +Subject: [PATCH] 11-dm-mpath.rules.in: handle inactive suspended devices + correctly + +Since b22c273 ("11-dm-mpath.rules: Don't force activation while device is +suspended"), we've handled the case where a device is suspended while +an uevent is processed (e.g. because multipathd is reloading the +map again at the same time). But we were missing the case where +The device had never been initialized before. If .MPATH_DEVICE_READY_OLD +was empty, we'd jump to scan_import without setting MPATH_DEVICE_READY +to 0. This can cause a device not to be fully activated at boot time, +because in follow-up uevents we'd assume that the device had already +been set up. + +Treat the case in which an uevent is processed for a previously not +fully set-up, suspended device like other situations where we set +MPATH_DEVICE_READY to 0. + +Fixes: b22c273 ("11-dm-mpath.rules: Don't force activation while device is +suspended") +Reviewed-by: Benjamin Marzinski + +Signed-off-by: Benjamin Marzinski +--- + multipath/11-dm-mpath.rules.in | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +diff --git a/multipath/11-dm-mpath.rules.in b/multipath/11-dm-mpath.rules.in +index 67838261..20f8c6ac 100644 +--- a/multipath/11-dm-mpath.rules.in ++++ b/multipath/11-dm-mpath.rules.in +@@ -35,6 +35,13 @@ ENV{DM_COOKIE}!="?*", ENV{DM_ACTION}!="PATH_*", \ + + ENV{.MPATH_DEVICE_READY_OLD}="$env{MPATH_DEVICE_READY}" + ++# If the device wasn't ready previously and is currently suspended, ++# we have to postpone the activation until the next event. ++# In this case, we have to set MPATH_DEVICE_READY=0; otherwise, the ++# MPATH_UNCHANGED logic will cause later rules to skipped in the next event. ++ENV{.MPATH_DEVICE_READY_OLD}!="1", ENV{.DM_SUSPENDED}=="1", \ ++ ENV{MPATH_DEVICE_READY}="0", GOTO="check_mpath_unchanged" ++ + # multipath sets DM_SUBSYSTEM_UDEV_FLAG2 when it reloads a + # table with no active devices. If this happens, mark the + # device not ready +@@ -106,14 +113,10 @@ GOTO="scan_import" + LABEL="mpath_is_ready" + + # If the device comes back online, set DM_ACTIVATION so that +-# upper layers do a rescan. If the device is currently suspended, +-# we have to postpone the activation until the next event. +-# In this case, we have to set MPATH_DEVICE_READY=0; otherwise, the +-# MPATH_UNCHANGED logic will cause later rules to skipped in the next event. +-ENV{.MPATH_DEVICE_READY_OLD}!="0", GOTO="scan_import" +-ENV{.DM_SUSPENDED}=="1", ENV{MPATH_DEVICE_READY}="0", GOTO="scan_import" +- +-ENV{DM_ACTIVATION}="1", ENV{MPATH_UNCHANGED}="0" ++# upper layers will do a rescan. Don't do this if .MPATH_DEVICE_READY_OLD ++# is just empty (see comment above the DM_COOKIE test above). ++ENV{.MPATH_DEVICE_READY_OLD}=="0", \ ++ ENV{DM_ACTIVATION}="1", ENV{MPATH_UNCHANGED}="0" + + # The code to check multipath state ends here. We need to set + # properties and symlinks regardless whether the map is usable or diff --git a/0011-11-dm-mpath.rules.in-clarify-DM_ACTIVATION-logic.patch b/0011-11-dm-mpath.rules.in-clarify-DM_ACTIVATION-logic.patch new file mode 100644 index 0000000..cb129bf --- /dev/null +++ b/0011-11-dm-mpath.rules.in-clarify-DM_ACTIVATION-logic.patch @@ -0,0 +1,78 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Thu, 31 Oct 2024 13:11:21 +0100 +Subject: [PATCH] 11-dm-mpath.rules.in: clarify DM_ACTIVATION logic + +Our code is always setting MPATH_UNCHANGED and DM_ACTIVATION in +pairs. While DM_ACTIVATION is a global DM property, MPATH_UNCHANGED +is owned by us. Just set MPATH_UNCHANGED, and adapt DM_ACTIVATION +when necessary just in one place. + +Signed-off-by: Martin Wilck +Reviewed-by: Benjamin Marzinski +Signed-off-by: Benjamin Marzinski +--- + multipath/11-dm-mpath.rules.in | 21 ++++++++++++--------- + 1 file changed, 12 insertions(+), 9 deletions(-) + +diff --git a/multipath/11-dm-mpath.rules.in b/multipath/11-dm-mpath.rules.in +index 20f8c6ac..a2655cb2 100644 +--- a/multipath/11-dm-mpath.rules.in ++++ b/multipath/11-dm-mpath.rules.in +@@ -74,25 +74,25 @@ LABEL="check_mpath_unchanged" + + # A previous coldplug event occurred while the device was suspended. + # Activation might have been partially skipped. Activate the device now, +-# i.e. disable the MPATH_UNCHANGED logic and set DM_ACTIVATION=1. ++# i.e. disable the MPATH_UNCHANGED logic. + ENV{DM_COLDPLUG_SUSPENDED}=="1", ENV{.DM_SUSPENDED}!="1", \ +- ENV{DM_ACTIVATION}="1", ENV{MPATH_UNCHANGED}="0", \ ++ ENV{MPATH_UNCHANGED}="0", \ + PROGRAM="@SYSDIR_BIN@/logger -t 11-dm-mpath.rules -p daemon.notice \"Forcing activation of previously suspended device\"", \ + GOTO="check_mpath_ready" + + # DM_SUBSYSTEM_UDEV_FLAG0 is the "RELOAD" flag for multipath subsystem. +-# Drop the DM_ACTIVATION flag here as mpath reloads tables if any of its ++# Set the MPATH_UNCHANGED flag here as mpath reloads tables if any of its + # paths are lost/recovered. For any stack above the mpath device, this is not + # something that should be reacted upon since it would be useless extra work. + # It's exactly mpath's job to provide *seamless* device access to any of the + # paths that are available underneath. + ENV{DM_SUBSYSTEM_UDEV_FLAG0}=="1", \ +- ENV{DM_ACTIVATION}="0", ENV{MPATH_UNCHANGED}="1" ++ ENV{MPATH_UNCHANGED}="1" + +-# For path failed or reinstated events, unset DM_ACTIVATION. ++# For path failed or reinstated events, set MPATH_UNCHANGED. + # This is similar to the DM_SUBSYSTEM_UDEV_FLAG0 case above. + ENV{DM_ACTION}=="PATH_FAILED|PATH_REINSTATED", \ +- ENV{DM_ACTIVATION}="0", ENV{MPATH_UNCHANGED}="1" ++ ENV{MPATH_UNCHANGED}="1" + + LABEL="check_mpath_ready" + +@@ -112,11 +112,10 @@ GOTO="scan_import" + + LABEL="mpath_is_ready" + +-# If the device comes back online, set DM_ACTIVATION so that ++# If the device comes back online, clear MPATH_UNCHANGED so that + # upper layers will do a rescan. Don't do this if .MPATH_DEVICE_READY_OLD + # is just empty (see comment above the DM_COOKIE test above). +-ENV{.MPATH_DEVICE_READY_OLD}=="0", \ +- ENV{DM_ACTIVATION}="1", ENV{MPATH_UNCHANGED}="0" ++ENV{.MPATH_DEVICE_READY_OLD}=="0", ENV{MPATH_UNCHANGED}="0" + + # The code to check multipath state ends here. We need to set + # properties and symlinks regardless whether the map is usable or +@@ -146,6 +145,10 @@ IMPORT{db}="ID_PART_GPT_AUTO_ROOT" + + LABEL="import_end" + ++# If MPATH_UNCHANGED is set, adapt DM_ACTIVATION. ++ENV{MPATH_UNCHANGED}=="0", ENV{DM_ACTIVATION}="1" ++ENV{MPATH_UNCHANGED}=="1", ENV{DM_ACTIVATION}="0" ++ + # Reset previous DM_COLDPLUG_SUSPENDED if activation happens now + ENV{.DM_SUSPENDED}!="1", ENV{DM_ACTIVATION}=="1", ENV{DM_COLDPLUG_SUSPENDED}="" + diff --git a/0012-11-dm-mpath-rules.in-skip-one-.DM_NOSCAN-check.patch b/0012-11-dm-mpath-rules.in-skip-one-.DM_NOSCAN-check.patch new file mode 100644 index 0000000..cb1620a --- /dev/null +++ b/0012-11-dm-mpath-rules.in-skip-one-.DM_NOSCAN-check.patch @@ -0,0 +1,28 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Sun, 3 Nov 2024 23:04:08 +0100 +Subject: [PATCH] 11-dm-mpath-rules.in: skip one .DM_NOSCAN check + +We set .DM_NOSCAN above where we set DM_UDEV_DISABLE_OTHER_RULES_FLAG, too. If +the latter isn't set, .DM_NOSCAN can't be set. Skip the redundant test. + +Signed-off-by: Martin Wilck +Reviewed-by: Benjamin Marzinski +Signed-off-by: Benjamin Marzinski +--- + multipath/11-dm-mpath.rules.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/multipath/11-dm-mpath.rules.in b/multipath/11-dm-mpath.rules.in +index a2655cb2..79227bec 100644 +--- a/multipath/11-dm-mpath.rules.in ++++ b/multipath/11-dm-mpath.rules.in +@@ -132,7 +132,7 @@ ENV{DM_UDEV_PRIMARY_SOURCE_FLAG}!="1", GOTO="import_end" + ENV{DM_UDEV_RULES_VSN}!="1|2", GOTO="import_end" + + # Don't import the properties from db if we will run blkid later. +-ENV{.DM_NOSCAN}!="1", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}!="1", GOTO="import_end" ++ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}!="1", GOTO="import_end" + + IMPORT{db}="ID_FS_TYPE" + IMPORT{db}="ID_FS_USAGE" diff --git a/0013-11-dm-mpath.rules.in-set-.DM_NOSCAN-if-MPATH_UNCHANG.patch b/0013-11-dm-mpath.rules.in-set-.DM_NOSCAN-if-MPATH_UNCHANG.patch new file mode 100644 index 0000000..36cd91d --- /dev/null +++ b/0013-11-dm-mpath.rules.in-set-.DM_NOSCAN-if-MPATH_UNCHANG.patch @@ -0,0 +1,44 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Sun, 3 Nov 2024 23:07:23 +0100 +Subject: [PATCH] 11-dm-mpath.rules.in: set .DM_NOSCAN if MPATH_UNCHANGED is + set + +When multipath reloads a device or fails or restores a path, the udev +rules disable LVM scanning, but since .DM_NOSCAN isn't set, blkid is +still run on the device. When multipath devices that are set to +queue_if_no_path lose all their paths at close to the same time, udev +workers can hang trying to run blkid. The blkid results shouldn't +change when multipathd is adding, removing, failing or reinstating +paths, aside from avoiding hanging udev processes, we're skipping +unnecessary work. + +Hence, set .DM_NOSCAN if MPATH_UNCHANGED is set, to avoid blkid from +being called in 13-dm.rules. + +Suggested-by: Benjamin Marzinski +Signed-off-by: Martin Wilck +Reviewed-by: Benjamin Marzinski +Signed-off-by: Benjamin Marzinski +--- + multipath/11-dm-mpath.rules.in | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/multipath/11-dm-mpath.rules.in b/multipath/11-dm-mpath.rules.in +index 79227bec..a816edbf 100644 +--- a/multipath/11-dm-mpath.rules.in ++++ b/multipath/11-dm-mpath.rules.in +@@ -145,9 +145,11 @@ IMPORT{db}="ID_PART_GPT_AUTO_ROOT" + + LABEL="import_end" + +-# If MPATH_UNCHANGED is set, adapt DM_ACTIVATION. ++# If MPATH_UNCHANGED is set, adapt DM_ACTIVATION and DM_NOSCAN. ++# .DM_NOSCAN controls whether blkid will be run in 13-dm-disk.rules; ++# we don't want to do that if MPATH_UNCHANGED is 1. + ENV{MPATH_UNCHANGED}=="0", ENV{DM_ACTIVATION}="1" +-ENV{MPATH_UNCHANGED}=="1", ENV{DM_ACTIVATION}="0" ++ENV{MPATH_UNCHANGED}=="1", ENV{DM_ACTIVATION}="0", ENV{.DM_NOSCAN}="1" + + # Reset previous DM_COLDPLUG_SUSPENDED if activation happens now + ENV{.DM_SUSPENDED}!="1", ENV{DM_ACTIVATION}=="1", ENV{DM_COLDPLUG_SUSPENDED}="" diff --git a/0014-libmultipath-don-t-set-dev_loss_tmo-to-0-for-NO_PATH.patch b/0014-libmultipath-don-t-set-dev_loss_tmo-to-0-for-NO_PATH.patch new file mode 100644 index 0000000..b7ae3c4 --- /dev/null +++ b/0014-libmultipath-don-t-set-dev_loss_tmo-to-0-for-NO_PATH.patch @@ -0,0 +1,31 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Thu, 7 Nov 2024 22:07:03 +0100 +Subject: [PATCH] libmultipath: don't set dev_loss_tmo to 0 for + NO_PATH_RETRY_FAIL + +If pp->dev_loss is DEV_LOSS_TMO_UNSET and min_dev_loss is 0 (which is +the case if no_path_retry is NO_PATH_RETRY_FAIL or NO_PATH_RETRY_UNDEF), +we will set pp->dev_loss to 0, which is wrong. Fix it. + +Fixes: 058b5f5 ("libmultipath: fix dev_loss_tmo even if not set in configuration") +Signed-off-by: Martin Wilck +Reviewed-by: Benjamin Marzinski +Signed-off-by: Benjamin Marzinski +--- + libmultipath/discovery.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c +index e94705bf..5043330c 100644 +--- a/libmultipath/discovery.c ++++ b/libmultipath/discovery.c +@@ -942,7 +942,7 @@ sysfs_set_scsi_tmo (struct config *conf, struct multipath *mpp) + continue; + } + +- if (pp->dev_loss == DEV_LOSS_TMO_UNSET) ++ if (pp->dev_loss == DEV_LOSS_TMO_UNSET && min_dev_loss != 0) + pp->dev_loss = min_dev_loss; + else if (pp->dev_loss < min_dev_loss) { + pp->dev_loss = min_dev_loss; diff --git a/0015-multipathd-fix-deferred_failback_tick-for-reload-rem.patch b/0015-multipathd-fix-deferred_failback_tick-for-reload-rem.patch new file mode 100644 index 0000000..f775e85 --- /dev/null +++ b/0015-multipathd-fix-deferred_failback_tick-for-reload-rem.patch @@ -0,0 +1,35 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Mon, 14 Oct 2024 23:28:30 -0400 +Subject: [PATCH] multipathd: fix deferred_failback_tick for reload removes + +If reload_and_sync_map() removes the multipath device, +deferred_failback_tick() needs to decrement the counter so that it +doesn't skip the following device. + +Reviewed-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + multipathd/main.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/multipathd/main.c b/multipathd/main.c +index 1b7fd04f..e4ef9a1d 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -2080,9 +2080,12 @@ deferred_failback_tick (struct vectors *vecs) + + if (!mpp->failback_tick && + need_switch_pathgroup(mpp, &need_reload)) { +- if (need_reload) +- reload_and_sync_map(mpp, vecs); +- else ++ if (need_reload) { ++ if (reload_and_sync_map(mpp, vecs) == 2) { ++ /* multipath device removed */ ++ i--; ++ } ++ } else + switch_pathgroup(mpp); + } + } diff --git a/0016-multipathd-fix-an-unsigned-int-ovwerflow.patch b/0016-multipathd-fix-an-unsigned-int-ovwerflow.patch new file mode 100644 index 0000000..12c9a51 --- /dev/null +++ b/0016-multipathd-fix-an-unsigned-int-ovwerflow.patch @@ -0,0 +1,28 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Wed, 13 Nov 2024 16:19:49 +0100 +Subject: [PATCH] multipathd: fix an unsigned int ovwerflow + +Reported by coverity: "i--" may cause an underflow, which will again +cause an overflow when the loop continues. Use a signed int for +loops like this to make coverity happy. + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + multipathd/main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/multipathd/main.c b/multipathd/main.c +index e4ef9a1d..3fb623fd 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -2068,7 +2068,7 @@ static void + deferred_failback_tick (struct vectors *vecs) + { + struct multipath * mpp; +- unsigned int i; ++ int i; + bool need_reload; + + vector_foreach_slot (vecs->mpvec, mpp, i) { diff --git a/0017-libmpathutil-avoid-Wcast-function-type-mismatch-erro.patch b/0017-libmpathutil-avoid-Wcast-function-type-mismatch-erro.patch new file mode 100644 index 0000000..64b90d7 --- /dev/null +++ b/0017-libmpathutil-avoid-Wcast-function-type-mismatch-erro.patch @@ -0,0 +1,36 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Wed, 6 Nov 2024 22:17:16 +0100 +Subject: [PATCH] libmpathutil: avoid -Wcast-function-type-mismatch error with + clang 19 + +Avoid the following error with clang 19: + +msort.c:268:27: error: cast from '__compar_fn_t' (aka 'int (*)(const void *, const void *)') to '__compar_d_fn_t' (aka 'int (*)(const void *, const void *, void *)') converts to incompatible function type [-Werror,-Wcast-function-type-mismatch] + 268 | return msort_r (b, n, s, (__compar_d_fn_t)cmp, NULL); + | ^~~~~~~~~~~~~~~~~~~~ + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + libmpathutil/msort.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/libmpathutil/msort.c b/libmpathutil/msort.c +index 50f799d9..9df7b267 100644 +--- a/libmpathutil/msort.c ++++ b/libmpathutil/msort.c +@@ -259,9 +259,12 @@ msort_r (void *b, size_t n, size_t s, __compar_d_fn_t cmp, void *arg) + * If this is safe for them, it should be for us, too. + */ + #pragma GCC diagnostic push +-#if __GNUC__ >= 8 ++#if __GNUC__ >= 8 || __clang_major__ >= 19 + #pragma GCC diagnostic ignored "-Wcast-function-type" + #endif ++#if __clang_major__ >= 19 ++#pragma GCC diagnostic ignored "-Wcast-function-type-mismatch" ++#endif + void + msort (void *b, size_t n, size_t s, __compar_fn_t cmp) + { diff --git a/0018-Update-NEWS.md-for-0.10.1.patch b/0018-Update-NEWS.md-for-0.10.1.patch new file mode 100644 index 0000000..601b6e5 --- /dev/null +++ b/0018-Update-NEWS.md-for-0.10.1.patch @@ -0,0 +1,44 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Thu, 14 Nov 2024 17:59:14 +0100 +Subject: [PATCH] Update NEWS.md for 0.10.1 + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + NEWS.md | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +diff --git a/NEWS.md b/NEWS.md +index 69acda47..b740efb1 100644 +--- a/NEWS.md ++++ b/NEWS.md +@@ -1,5 +1,28 @@ + # multipath-tools Release Notes + ++## multipath-tools 0.10.1, 2024/11 ++ ++This is the first bug fix release on the `stable-0.10.y` branch. It contains ++bug fixes from 0.11.0, and some CI-related fixes. ++ ++### Bug fixes ++ ++* Fixed the problem that multipathd wouldn't start on systems with certain types ++ of device mapper devices, in particular devices with multiple DM targets. ++ The problem was introduced in 0.10.0. ++ Fixes [#102](https://github.com/opensvc/multipath-tools/issues/102). ++* Fixed a corner case in the udev rules which could cause a device not to be ++ activated during boot if a cold plug uevent is processed for a previously ++ not configured multipath map while this map was suspended. This problem existed ++ since 0.9.8. ++* Fixed the problem that devices with `no_path_retry fail` and no setting ++ for `dev_loss_tmo` might get the `dev_loss_tmo` set to 0, causing the ++ device to be deleted immediately in the event of a transport disruption. ++ This bug was introduced in 0.9.6. ++* Fixed the problem that, if there were multiple maps with deferred failback ++ (`failback` value > 0 in `multipath.conf`), some maps might fail back later ++ than configured. The problem existed since 0.9.6. ++ + ## multipath-tools 0.10.0, 2024/08 + + ### User-Visible Changes diff --git a/0019-libmultipath-don-t-print-error-message-if-WATCHDOG_U.patch b/0019-libmultipath-don-t-print-error-message-if-WATCHDOG_U.patch new file mode 100644 index 0000000..18fb614 --- /dev/null +++ b/0019-libmultipath-don-t-print-error-message-if-WATCHDOG_U.patch @@ -0,0 +1,30 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Thu, 14 Nov 2024 15:20:24 +0100 +Subject: [PATCH] libmultipath: don't print error message if WATCHDOG_USEC is 0 + +WATCHDOG_USEC may be set to 0, which means that the watchdog +is disabled in systemd. + +Fixes: 9366cfb ("multipathd: Implement systemd watchdog integration") +Signed-off-by: Martin Wilck +Reviewed-by: Benjamin Marzinski +Signed-off-by: Benjamin Marzinski +--- + libmultipath/config.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/libmultipath/config.c b/libmultipath/config.c +index 0e3a5cc1..226ddecb 100644 +--- a/libmultipath/config.c ++++ b/libmultipath/config.c +@@ -865,6 +865,9 @@ static void set_max_checkint_from_watchdog(struct config *conf) + unsigned long checkint; + + if (envp && sscanf(envp, "%lu", &checkint) == 1) { ++ if (checkint == 0) ++ /* watchdog disabled */ ++ return; + /* Value is in microseconds */ + checkint /= 1000000; + if (checkint < 1 || checkint > UINT_MAX) { diff --git a/0020-libmultipath-reduce-log-level-of-map-X-has-multiple-.patch b/0020-libmultipath-reduce-log-level-of-map-X-has-multiple-.patch new file mode 100644 index 0000000..7467627 --- /dev/null +++ b/0020-libmultipath-reduce-log-level-of-map-X-has-multiple-.patch @@ -0,0 +1,38 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Mon, 25 Nov 2024 18:01:32 +0100 +Subject: [PATCH] libmultipath: reduce log level of "map X has multiple + targets" + +On systems with LVM volumes, "multipath -ll" will spit out lots of messages +like + + libmp_mapinfo: map vg-lv0 has multiple targets + +which is irritating. Reduce the log level of these messages to 3, as they +are harmless most of the time. + +This is a backport of e8949c2 ("libmultipath: reduce log level of +libmp_mapinfo() messages") from the master branch. We can't apply exactly +the same fix because the stable branch is missing 8c772d3 ("libmultipath: +check DM UUID earlier in libmp_mapinfo__"). + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + libmultipath/devmapper.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c +index 52bfe9ce..fe5637b3 100644 +--- a/libmultipath/devmapper.c ++++ b/libmultipath/devmapper.c +@@ -718,7 +718,7 @@ static int libmp_mapinfo__(int flags, mapid_t id, mapinfo_t info, const char *ma + if (info.target || info.status || info.size || flags & MAPINFO_TGT_TYPE__) { + if (dm_get_next_target(dmt, NULL, &start, &length, + &target_type, ¶ms) != NULL) { +- condlog(2, "%s: map %s has multiple targets", fname__, map_id); ++ condlog(3, "%s: map %s has multiple targets", fname__, map_id); + return DMP_NOT_FOUND; + } + if (!params) { diff --git a/0021-libmultipath-foreign-fix-memory-leak-in-nvme-foreign.patch b/0021-libmultipath-foreign-fix-memory-leak-in-nvme-foreign.patch new file mode 100644 index 0000000..2610c6d --- /dev/null +++ b/0021-libmultipath-foreign-fix-memory-leak-in-nvme-foreign.patch @@ -0,0 +1,54 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Wed, 8 Jan 2025 19:06:53 -0500 +Subject: [PATCH] libmultipath/foreign: fix memory leak in nvme foreign handler + +_find_controllers() needs to free the udev device if it doesn't get +added to a path. Otherwise it can leak memory whenever check_foreign() +is called, causing multipathd's memory usage to continually grow. + +Fixes: 7b47762 ("libmultipath: nvme: fix path detection for kernel 4.16") +Signed-off-by: Benjamin Marzinski +Reviewed-by: Martin Wilck +(cherry picked from commit 5a3d334e416a4a35ee88d7b8f1433ff7f57923ad) +--- + libmultipath/foreign/nvme.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/libmultipath/foreign/nvme.c b/libmultipath/foreign/nvme.c +index 0b7f4eab..cde660ce 100644 +--- a/libmultipath/foreign/nvme.c ++++ b/libmultipath/foreign/nvme.c +@@ -675,7 +675,8 @@ static void _find_controllers(struct context *ctx, struct nvme_map *map) + pthread_cleanup_push_cast(free_scandir_result, &sr); + for (i = 0; i < r; i++) { + char *fn = di[i]->d_name; +- struct udev_device *ctrl, *udev; ++ struct udev_device *ctrl; ++ struct udev_device *udev __attribute__((cleanup(cleanup_udev_device))) = NULL; + + if (safe_snprintf(pathbuf + n, sizeof(pathbuf) - n, "/%s", fn)) + continue; +@@ -719,11 +720,11 @@ static void _find_controllers(struct context *ctx, struct nvme_map *map) + continue; + + path->gen.ops = &nvme_path_ops; +- path->udev = udev; ++ path->udev = steal_ptr(udev); + path->seen = true; + path->map = map; + path->ctl = udev_device_get_parent_with_subsystem_devtype +- (udev, "nvme", NULL); ++ (path->udev, "nvme", NULL); + if (path->ctl == NULL) { + condlog(1, "%s: %s: failed to get controller for %s", + __func__, THIS, fn); +@@ -744,7 +745,7 @@ static void _find_controllers(struct context *ctx, struct nvme_map *map) + } + vector_set_slot(&map->pgvec, &path->pg); + condlog(3, "%s: %s: new path %s added to %s", +- __func__, THIS, udev_device_get_sysname(udev), ++ __func__, THIS, udev_device_get_sysname(path->udev), + udev_device_get_sysname(map->udev)); + } + pthread_cleanup_pop(1); diff --git a/0022-libmultipath-add-condition-for-enqueueing-path-to-io.patch b/0022-libmultipath-add-condition-for-enqueueing-path-to-io.patch new file mode 100644 index 0000000..cf8d80a --- /dev/null +++ b/0022-libmultipath-add-condition-for-enqueueing-path-to-io.patch @@ -0,0 +1,41 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: chenrenhui +Date: Fri, 10 Jan 2025 14:38:16 +0800 +Subject: [PATCH] libmultipath: add condition for enqueueing path to io error + check + +In function io_err_stat_handle_pathfail(), path->io_err_dis_reinstate_time +is set to 0 to enqueue path to io error check as soon as possible. But +multipathd can not do it within marginal_path_err_recheck_gap_time seconds +after power-on, because curr_time is less than +marginal_path_err_recheck_gap_time. + +To handle the early marginal path, we can enqueue path when +io_err_dis_reinstate_time is 0. + +Signed-off-by: chenrenhui +Reviewed-by: Benjamin Marzinski +Reviewed-by: Martin Wilck + +> + +(cherry picked from commit a1e3cf2d42cc4bab10753e466c8adb7efa83c99e) +Signed-off-by: Benjamin Marzinski +--- + libmultipath/io_err_stat.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/libmultipath/io_err_stat.c b/libmultipath/io_err_stat.c +index 4996c0b0..879c310a 100644 +--- a/libmultipath/io_err_stat.c ++++ b/libmultipath/io_err_stat.c +@@ -367,7 +367,8 @@ int need_io_err_check(struct path *pp) + return 1; + get_monotonic_time(&curr_time); + if ((curr_time.tv_sec - pp->io_err_dis_reinstate_time) > +- pp->mpp->marginal_path_err_recheck_gap_time) { ++ pp->mpp->marginal_path_err_recheck_gap_time || ++ pp->io_err_dis_reinstate_time == 0) { + io_err_stat_log(4, "%s: reschedule checking after %d seconds", + pp->dev, + pp->mpp->marginal_path_err_recheck_gap_time); diff --git a/0023-Additional-NEWS.md-updates-for-0.10.1.patch b/0023-Additional-NEWS.md-updates-for-0.10.1.patch new file mode 100644 index 0000000..1093bd0 --- /dev/null +++ b/0023-Additional-NEWS.md-updates-for-0.10.1.patch @@ -0,0 +1,63 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Fri, 17 Jan 2025 22:38:26 +0100 +Subject: [PATCH] Additional NEWS.md updates for 0.10.1 + +Signed-off-by: Benjamin Marzinski +--- + .github/actions/spelling/expect.txt | 4 ++-- + NEWS.md | 8 ++++++++ + 2 files changed, 10 insertions(+), 2 deletions(-) + +diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt +index 934f582e..000d5ebb 100644 +--- a/.github/actions/spelling/expect.txt ++++ b/.github/actions/spelling/expect.txt +@@ -184,7 +184,6 @@ sas + sbp + scsi + sda +-sdc + setmarginal + setprkey + setprstatus +@@ -205,11 +204,11 @@ suse + svg + switchgroup + sys ++SYSDIR + sysfs + sysinit + tcp + terabytes +-SYSDIR + TESTDEPS + testname + tgill +@@ -231,6 +230,7 @@ unsetprkey + unsetprstatus + unspec + usb ++USEC + userdata + userspace + usr +diff --git a/NEWS.md b/NEWS.md +index b740efb1..3c51553e 100644 +--- a/NEWS.md ++++ b/NEWS.md +@@ -22,6 +22,14 @@ bug fixes from 0.11.0, and some CI-related fixes. + * Fixed the problem that, if there were multiple maps with deferred failback + (`failback` value > 0 in `multipath.conf`), some maps might fail back later + than configured. The problem existed since 0.9.6. ++* Removed a warning message that multipathd would print if systemd's ++ `WATCHDOG_USEC` environment variable had the value "0", which means that the ++ watchdog is simply disabled. This (minor) problem existed since 0.4.9. ++* Fixed a memory leak in the nvme foreign library. The bug existed since ++ 0.7.8. ++* Fixed a problem in the marginal path detection algorithm that could cause ++ the io error check for a recently failed path to be delayed. This bug ++ existed since 0.7.4. + + ## multipath-tools 0.10.0, 2024/08 + diff --git a/0024-libmultipath-fix-handling-of-pp-pgindex.patch b/0024-libmultipath-fix-handling-of-pp-pgindex.patch new file mode 100644 index 0000000..a9da346 --- /dev/null +++ b/0024-libmultipath-fix-handling-of-pp-pgindex.patch @@ -0,0 +1,138 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Mon, 25 Nov 2024 13:11:07 +0100 +Subject: [PATCH] libmultipath: fix handling of pp->pgindex + +pp->pgindex is set in disassemble_map() when a map is parsed. +There are various possiblities for this index to become invalid. +pp->pgindex is only used in enable_group() and followover_should_fallback(), +and both callers take no action if it is 0, which is the right +thing to do if we don't know the path's pathgroup. + +Make sure pp->pgindex is reset to 0 in various places: +- when it's orphaned, +- before (re)grouping paths, +- when we detect a bad mpp assignment in update_pathvec_from_dm(). +- when a pathgroup is deleted in update_pathvec_from_dm(). In this + case, pgindex needs to be invalidated for all paths in all pathgroups + after the one that was deleted. + +The hunk in group_paths is mostly redundant with the hunk in free_pgvec(), but +because we're looping over pg->paths in the former and over pg->pgp in +the latter, I think it's better too play safe. + +Fixes: 99db1bd ("[multipathd] re-enable disabled PG when at least one path is up") +Fixes: https://github.com/opensvc/multipath-tools/issues/105 +Signed-off-by: Martin Wilck +Reviewed-by: Benjamin Marzinski +(cherry picked from commit cd912cffa2797a18c47426c816afa8eb2eae5b22) +(cherry picked from commit 714c20bebba6911255a527d937e7a62764ffe338) +Signed-off-by: Benjamin Marzinski +--- + libmultipath/pgpolicies.c | 6 ++++++ + libmultipath/structs.c | 12 +++++++++++- + libmultipath/structs_vec.c | 15 +++++++++++++++ + 3 files changed, 32 insertions(+), 1 deletion(-) + +diff --git a/libmultipath/pgpolicies.c b/libmultipath/pgpolicies.c +index edc3c611..23ef2bdc 100644 +--- a/libmultipath/pgpolicies.c ++++ b/libmultipath/pgpolicies.c +@@ -127,6 +127,8 @@ fail: + int group_paths(struct multipath *mp, int marginal_pathgroups) + { + vector normal, marginal; ++ struct path *pp; ++ int i; + + if (!mp->pg) + mp->pg = vector_alloc(); +@@ -138,6 +140,10 @@ int group_paths(struct multipath *mp, int marginal_pathgroups) + if (!mp->pgpolicyfn) + goto fail; + ++ /* Reset pgindex, we're going to invalidate it */ ++ vector_foreach_slot(mp->paths, pp, i) ++ pp->pgindex = 0; ++ + if (!marginal_pathgroups || + split_marginal_paths(mp->paths, &normal, &marginal) != 0) { + if (mp->pgpolicyfn(mp, mp->paths) != 0) +diff --git a/libmultipath/structs.c b/libmultipath/structs.c +index 61c8f32c..48517252 100644 +--- a/libmultipath/structs.c ++++ b/libmultipath/structs.c +@@ -239,8 +239,18 @@ free_pgvec (vector pgvec, enum free_path_mode free_paths) + if (!pgvec) + return; + +- vector_foreach_slot(pgvec, pgp, i) ++ vector_foreach_slot(pgvec, pgp, i) { ++ ++ /* paths are going to be re-grouped, reset pgindex */ ++ if (free_paths != FREE_PATHS) { ++ struct path *pp; ++ int j; ++ ++ vector_foreach_slot(pgp->paths, pp, j) ++ pp->pgindex = 0; ++ } + free_pathgroup(pgp, free_paths); ++ } + + vector_free(pgvec); + } +diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c +index 5df495b3..9dc5a5ca 100644 +--- a/libmultipath/structs_vec.c ++++ b/libmultipath/structs_vec.c +@@ -108,6 +108,7 @@ static bool update_pathvec_from_dm(vector pathvec, struct multipath *mpp, + struct config *conf; + bool mpp_has_wwid; + bool must_reload = false; ++ bool pg_deleted = false; + + if (!mpp->pg) + return false; +@@ -125,6 +126,10 @@ static bool update_pathvec_from_dm(vector pathvec, struct multipath *mpp, + + vector_foreach_slot(pgp->paths, pp, j) { + ++ /* A pathgroup has been deleted before. Invalidate pgindex */ ++ if (pg_deleted) ++ pp->pgindex = 0; ++ + if (pp->mpp && pp->mpp != mpp) { + condlog(0, "BUG: %s: found path %s which is already in %s", + mpp->alias, pp->dev, pp->mpp->alias); +@@ -139,6 +144,13 @@ static bool update_pathvec_from_dm(vector pathvec, struct multipath *mpp, + must_reload = true; + dm_fail_path(mpp->alias, pp->dev_t); + vector_del_slot(pgp->paths, j--); ++ /* ++ * pp->pgindex has been set in disassemble_map(), ++ * which has probably been called just before for ++ * mpp. So he pgindex relates to mpp and may be ++ * wrong for pp->mpp. Invalidate it. ++ */ ++ pp->pgindex = 0; + continue; + } + pp->mpp = mpp; +@@ -237,6 +249,8 @@ static bool update_pathvec_from_dm(vector pathvec, struct multipath *mpp, + vector_del_slot(mpp->pg, i--); + free_pathgroup(pgp, KEEP_PATHS); + must_reload = true; ++ /* Invalidate pgindex for all other pathgroups */ ++ pg_deleted = true; + } + mpp->need_reload = mpp->need_reload || must_reload; + return must_reload; +@@ -354,6 +368,7 @@ void orphan_path(struct path *pp, const char *reason) + { + condlog(3, "%s: orphan path, %s", pp->dev, reason); + pp->mpp = NULL; ++ pp->pgindex = 0; + uninitialize_path(pp); + } + diff --git a/0025-libmultipath-make-pgcmp-detect-if-map-is-missing-a-p.patch b/0025-libmultipath-make-pgcmp-detect-if-map-is-missing-a-p.patch new file mode 100644 index 0000000..b2b9e48 --- /dev/null +++ b/0025-libmultipath-make-pgcmp-detect-if-map-is-missing-a-p.patch @@ -0,0 +1,70 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Mon, 25 Nov 2024 15:18:15 +0100 +Subject: [PATCH] libmultipath: make pgcmp detect if map is missing a path + group + +The previous algorithm didn't detect the case case where cpgp +contained a path that was not contained in pgp. Fix this. + +Cherry-picked from d4b35f61cb75c6e9b289e56c98457fc04ce4835e +Fixes: 90773ba ("libmultipath: resolve hash collisions in pgcmp()") +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + libmultipath/configure.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/libmultipath/configure.c b/libmultipath/configure.c +index a7257981..e86c1fd5 100644 +--- a/libmultipath/configure.c ++++ b/libmultipath/configure.c +@@ -426,6 +426,11 @@ compute_pgid(struct pathgroup * pgp) + pgp->id ^= (long)pp; + } + ++static void cleanup_bitfield(struct bitfield **p) ++{ ++ free(*p); ++} ++ + static int + pgcmp (struct multipath * mpp, struct multipath * cmpp) + { +@@ -433,16 +438,25 @@ pgcmp (struct multipath * mpp, struct multipath * cmpp) + struct pathgroup * pgp; + struct pathgroup * cpgp; + int r = 0; ++ struct bitfield *bf __attribute__((cleanup(cleanup_bitfield))) = NULL; + + if (!mpp) + return 0; + ++ if (VECTOR_SIZE(mpp->pg) != VECTOR_SIZE(cmpp->pg)) ++ return 1; ++ ++ bf = alloc_bitfield(VECTOR_SIZE(cmpp->pg)); ++ if (!bf) ++ return 1; ++ + vector_foreach_slot (mpp->pg, pgp, i) { + compute_pgid(pgp); + + vector_foreach_slot (cmpp->pg, cpgp, j) { + if (pgp->id == cpgp->id && + !pathcmp(pgp, cpgp)) { ++ set_bit_in_bitfield(j, bf); + r = 0; + break; + } +@@ -451,6 +465,10 @@ pgcmp (struct multipath * mpp, struct multipath * cmpp) + if (r) + return r; + } ++ vector_foreach_slot (cmpp->pg, cpgp, j) { ++ if (!is_bit_set_in_bitfield(j, bf)) ++ return 1; ++ } + return r; + } + diff --git a/0026-libmultipath-trigger-uevents-upon-map-creation-in-do.patch b/0026-libmultipath-trigger-uevents-upon-map-creation-in-do.patch new file mode 100644 index 0000000..bd3a7a4 --- /dev/null +++ b/0026-libmultipath-trigger-uevents-upon-map-creation-in-do.patch @@ -0,0 +1,94 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Tue, 26 Nov 2024 22:37:20 +0100 +Subject: [PATCH] libmultipath: trigger uevents upon map creation in domap() + +If map creation succeeds, previously not multipathed devices are +now multipathed. udev may not have noticed this yet, thus trigger +path uevents to make it aware of the situation. Likewise, if +creating a map fails, the paths in question were likely considered +multipath members by udev, too. They will now be marked as failed, +so trigger an event in this situation as well. + +Fixes: https://github.com/opensvc/multipath-tools/issues/103 +Suggested-by: Benjamin Marzinski +Signed-off-by: Martin Wilck +Reviewed-by: Benjamin Marzinski +(cherry picked from commit 98b3a7bd9ed2a89f068fe40c253843cf78261905) +Signed-off-by: Benjamin Marzinski +--- + libmultipath/configure.c | 11 ++++------- + libmultipath/devmapper.c | 9 +++------ + 2 files changed, 7 insertions(+), 13 deletions(-) + +diff --git a/libmultipath/configure.c b/libmultipath/configure.c +index e86c1fd5..d9fac384 100644 +--- a/libmultipath/configure.c ++++ b/libmultipath/configure.c +@@ -581,8 +581,6 @@ trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) + vector_foreach_slot(pgp->paths, pp, j) + trigger_path_udev_change(pp, is_mpath); + } +- +- mpp->needs_paths_uevent = 0; + } + + static int sysfs_set_max_sectors_kb(struct multipath *mpp) +@@ -954,10 +952,10 @@ int domap(struct multipath *mpp, char *params, int is_daemon) + * succeeded + */ + mpp->force_udev_reload = 0; +- if (mpp->action == ACT_CREATE && +- (remember_wwid(mpp->wwid) == 1 || +- mpp->needs_paths_uevent)) ++ if (mpp->action == ACT_CREATE) { ++ remember_wwid(mpp->wwid); + trigger_paths_udev_change(mpp, true); ++ } + if (!is_daemon) { + /* multipath client mode */ + dm_switchgroup(mpp->alias, mpp->bestpg); +@@ -982,8 +980,7 @@ int domap(struct multipath *mpp, char *params, int is_daemon) + } + dm_setgeometry(mpp); + return DOMAP_OK; +- } else if (r == DOMAP_FAIL && mpp->action == ACT_CREATE && +- mpp->needs_paths_uevent) ++ } else if (r == DOMAP_FAIL && mpp->action == ACT_CREATE) + trigger_paths_udev_change(mpp, false); + + return DOMAP_FAIL; +diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c +index fe5637b3..a0070c56 100644 +--- a/libmultipath/devmapper.c ++++ b/libmultipath/devmapper.c +@@ -536,7 +536,7 @@ static uint16_t build_udev_flags(const struct multipath *mpp, int reload) + MPATH_UDEV_RELOAD_FLAG : 0); + } + +-int dm_addmap_create (struct multipath *mpp, char * params) ++int dm_addmap_create (struct multipath *mpp, char *params) + { + int ro; + uint16_t udev_flags = build_udev_flags(mpp, 0); +@@ -546,9 +546,7 @@ int dm_addmap_create (struct multipath *mpp, char * params) + + if (dm_addmap(DM_DEVICE_CREATE, TGT_MPATH, mpp, params, ro, + udev_flags)) { +- if (unmark_failed_wwid(mpp->wwid) == +- WWID_FAILED_CHANGED) +- mpp->needs_paths_uevent = 1; ++ unmark_failed_wwid(mpp->wwid); + return 1; + } + /* +@@ -566,8 +564,7 @@ int dm_addmap_create (struct multipath *mpp, char * params) + break; + } + } +- if (mark_failed_wwid(mpp->wwid) == WWID_FAILED_CHANGED) +- mpp->needs_paths_uevent = 1; ++ mark_failed_wwid(mpp->wwid); + return 0; + } + diff --git a/0027-multipathd-trigger-uevents-upon-map-removal-in-coale.patch b/0027-multipathd-trigger-uevents-upon-map-removal-in-coale.patch new file mode 100644 index 0000000..f43ca0c --- /dev/null +++ b/0027-multipathd-trigger-uevents-upon-map-removal-in-coale.patch @@ -0,0 +1,41 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Wed, 27 Nov 2024 20:39:50 +0100 +Subject: [PATCH] multipathd: trigger uevents upon map removal in + coalesce_maps() + +... if a map has been flushed. In this case, we know that the +the paths haven't been multipathed by coalesce_paths() because of the current +configuration (failure to create the map can't be the reason if the map +exists in coalesce_maps()). Make sure udev sees the paths which have +been released from the map as non-multipath. + +Note that this is the only case where maps are flushed where it is correct +to trigger paths uevents. In other cases, e.g. after a "remove map" CLI +command, the configuration is unchanged and if we triggered an uevent, +the map would be re-created by multipathd when the uevent arrived. + +Signed-off-by: Martin Wilck +Reviewed-by: Benjamin Marzinski +(cherry picked from commit ad3ea472b587c0c20d2100331b5c66f8602f8414) +Signed-off-by: Benjamin Marzinski +--- + multipathd/main.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/multipathd/main.c b/multipathd/main.c +index 3fb623fd..4b089c0e 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -794,8 +794,10 @@ coalesce_maps(struct vectors *vecs, vector nmpv) + vector_del_slot(ompv, i); + i--; + } +- else ++ else { + condlog(2, "%s devmap removed", ompp->alias); ++ trigger_paths_udev_change(ompp, false); ++ } + } else if (reassign_maps) { + condlog(3, "%s: Reassign existing device-mapper" + " devices", ompp->alias); diff --git a/0028-libmultipath-Don-t-skip-set_path_max_sectors_kb.patch b/0028-libmultipath-Don-t-skip-set_path_max_sectors_kb.patch new file mode 100644 index 0000000..6c001f5 --- /dev/null +++ b/0028-libmultipath-Don-t-skip-set_path_max_sectors_kb.patch @@ -0,0 +1,31 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Wed, 4 Dec 2024 22:56:36 -0500 +Subject: [PATCH] libmultipath: Don't skip set_path_max_sectors_kb() + +If a multipath device already has need_reload set when a path is +adopted, it won't call set_path_max_sectors_kb() because of +short-circuit evaluation. This isn't what's intended. + +Fixes: e5e20c7b ("libmultipath: set max_sectors_kb in adopt_paths()") +Signed-off-by: Benjamin Marzinski +Reviewed-by: Martin Wilck +(cherry picked from commit f5c0c4b25c5eaac87b78e6e0c8d52b0828c29893) +--- + libmultipath/structs_vec.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c +index 9dc5a5ca..683ab473 100644 +--- a/libmultipath/structs_vec.c ++++ b/libmultipath/structs_vec.c +@@ -349,8 +349,7 @@ int adopt_paths(vector pathvec, struct multipath *mpp, + */ + if (!current_mpp || + !mp_find_path_by_devt(current_mpp, pp->dev_t)) +- mpp->need_reload = mpp->need_reload || +- set_path_max_sectors_kb(pp, mpp->max_sectors_kb); ++ mpp->need_reload = set_path_max_sectors_kb(pp, mpp->max_sectors_kb) || mpp->need_reload; + } + + pp->mpp = mpp; diff --git a/0029-libmultipath-stop-static-analyzer-complaint-in-init_.patch b/0029-libmultipath-stop-static-analyzer-complaint-in-init_.patch new file mode 100644 index 0000000..e293a0e --- /dev/null +++ b/0029-libmultipath-stop-static-analyzer-complaint-in-init_.patch @@ -0,0 +1,27 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Wed, 22 Jan 2025 22:16:42 -0500 +Subject: [PATCH] libmultipath: stop static analyzer complaint in init_foreign + +This change doesn't actually fix anything. The code was already safe. + +Signed-off-by: Benjamin Marzinski +Reviewed-by: Martin Wilck +(cherry picked from commit 85ec51e7930b4cadfbc12718afa91ce3a4adf4b5) +--- + libmultipath/foreign.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libmultipath/foreign.c b/libmultipath/foreign.c +index 28d1b115..af5b0ed3 100644 +--- a/libmultipath/foreign.c ++++ b/libmultipath/foreign.c +@@ -129,7 +129,7 @@ static void free_pre(void *arg) + static int _init_foreign(const char *enable) + { + char pathbuf[PATH_MAX]; +- struct dirent **di; ++ struct dirent **di = NULL; + struct scandir_result sr; + int r, i; + regex_t *enable_re = NULL; diff --git a/0030-libmultipath-be-lenient-in-allowing-the-alua-based-p.patch b/0030-libmultipath-be-lenient-in-allowing-the-alua-based-p.patch new file mode 100644 index 0000000..06a1b0f --- /dev/null +++ b/0030-libmultipath-be-lenient-in-allowing-the-alua-based-p.patch @@ -0,0 +1,44 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Wed, 22 Jan 2025 22:16:43 -0500 +Subject: [PATCH] libmultipath: be lenient in allowing the alua-based + pgpolicies + +multipath wouldn't autodetect the GROUP_BY_PRIO path grouping policy or +allow the GROUP_BY_TPG policy if there was a path that didn't have its +prioritizer selected (for instance because multipathd was reconfigured +while it was offline). To avoid this, make verify_alua_prio() assume an +alua multipath device if all the paths with a prioritizer selected +(there must be at least one) use an alua-based prioritizer. + +Signed-off-by: Benjamin Marzinski +Reviewed-by: Martin Wilck +(cherry picked from commit b47a577998eaff203018a00b57ba5e3674645848) +--- + libmultipath/propsel.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c +index a3fce203..c09a0619 100644 +--- a/libmultipath/propsel.c ++++ b/libmultipath/propsel.c +@@ -255,14 +255,18 @@ verify_alua_prio(struct multipath *mp) + { + int i; + struct path *pp; ++ bool assume_alua = false; + + vector_foreach_slot(mp->paths, pp, i) { + const char *name = prio_name(&pp->prio); ++ if (!prio_selected(&pp->prio)) ++ continue; + if (strncmp(name, PRIO_ALUA, PRIO_NAME_LEN) && + strncmp(name, PRIO_SYSFS, PRIO_NAME_LEN)) + return false; ++ assume_alua = true; + } +- return true; ++ return assume_alua; + } + + int select_detect_pgpolicy(struct config *conf, struct multipath *mp) diff --git a/0031-Update-NEWS.md-for-0.10.2.patch b/0031-Update-NEWS.md-for-0.10.2.patch new file mode 100644 index 0000000..fd31420 --- /dev/null +++ b/0031-Update-NEWS.md-for-0.10.2.patch @@ -0,0 +1,64 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Fri, 24 Jan 2025 20:03:15 +0100 +Subject: [PATCH] Update NEWS.md for 0.10.2 + +Signed-off-by: Benjamin Marzinski +--- + .github/actions/spelling/expect.txt | 2 ++ + NEWS.md | 23 ++++++++++++++++++++++- + 2 files changed, 24 insertions(+), 1 deletion(-) + +diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt +index 000d5ebb..4ac57510 100644 +--- a/.github/actions/spelling/expect.txt ++++ b/.github/actions/spelling/expect.txt +@@ -11,6 +11,7 @@ ata + autoconfig + autodetected + autoresize ++backported + barbie + BINDIR + blkid +@@ -122,6 +123,7 @@ Lun + lvm + lvmteam + Marzinski ++misdetection + mpath + mpathb + mpathpersist +diff --git a/NEWS.md b/NEWS.md +index 3c51553e..1b239ffa 100644 +--- a/NEWS.md ++++ b/NEWS.md +@@ -1,6 +1,27 @@ + # multipath-tools Release Notes + +-## multipath-tools 0.10.1, 2024/11 ++## multipath-tools 0.10.2, 2025/02 ++ ++This release contains backported bug fixes from the stable-0.11.y branch. ++ ++### Bug fixes ++ ++* Fix multipathd crash because of invalid path group index value, for example ++ if an invalid path device was removed from a map. ++ Fixes [#105](https://github.com/opensvc/multipath-tools/issues/105). ++* Make sure maps are reloaded in the path checker loop after detecting an ++ inconsistent or wrong kernel state (e.g. missing or falsely mapped path ++ device). Wrongly mapped paths will be unmapped and released to the system. ++ Fixes another issue reported in ++ [#105](https://github.com/opensvc/multipath-tools/issues/105). ++* Fix the problem that `group_by_tpg` might be disabled if one or more ++ paths were offline during initial configuration. ++* Fix possible misdetection of changed pathgroups in a map. ++* Fix the problem that if a map was scheduled to be reloaded already, ++ `max_sectors_kb` might not be set on a path device that ++ was being added to a multipath map. This problem was introduced in 0.9.9. ++ ++## multipath-tools 0.10.1, 2025/01 + + This is the first bug fix release on the `stable-0.10.y` branch. It contains + bug fixes from 0.11.0, and some CI-related fixes. diff --git a/0032-GitHub-Workflows-fix-abi-stable.yaml-for-pull-reques.patch b/0032-GitHub-Workflows-fix-abi-stable.yaml-for-pull-reques.patch new file mode 100644 index 0000000..3ddab39 --- /dev/null +++ b/0032-GitHub-Workflows-fix-abi-stable.yaml-for-pull-reques.patch @@ -0,0 +1,61 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Sat, 25 Jan 2025 00:49:19 +0100 +Subject: [PATCH] GitHub Workflows: fix abi-stable.yaml for pull request + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + .github/workflows/abi-stable.yaml | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +diff --git a/.github/workflows/abi-stable.yaml b/.github/workflows/abi-stable.yaml +index a6746f23..472914ce 100644 +--- a/.github/workflows/abi-stable.yaml ++++ b/.github/workflows/abi-stable.yaml +@@ -15,12 +15,16 @@ on: + + jobs: + reference-abi: +- runs-on: ubuntu-20.04 ++ runs-on: ubuntu-22.04 + steps: + - name: get parent tag + run: > + echo ${{ github.ref }} | + sed -E 's,refs/heads/stable-([0-9]\.[0-9]*)\.y,PARENT_TAG=\1.0,' >> $GITHUB_ENV ++ if: ${{ github.event_name == 'push' }} ++ - name: get parent tag ++ run: echo PARENT_TAG=${{ github.base_ref }} >> $GITHUB_ENV ++ if: ${{ github.event_name == 'pull_request' }} + - name: assert parent tag + run: /bin/false + if: ${{ env.PARENT_TAG == '' }} +@@ -45,20 +49,24 @@ jobs: + path: abi + + check-abi: +- runs-on: ubuntu-20.04 ++ runs-on: ubuntu-22.04 + needs: reference-abi + steps: + - name: get parent tag + run: > + echo ${{ github.ref }} | + sed -E 's,refs/heads/stable-([0-9]\.[0-9]*)\.y,PARENT_TAG=\1.0,' >> $GITHUB_ENV ++ if: ${{ github.event_name == 'push' }} ++ - name: get parent tag ++ run: echo PARENT_TAG=${{ github.base_ref }} >> $GITHUB_ENV ++ if: ${{ github.event_name == 'pull_request' }} + - name: assert parent tag + run: /bin/false + if: ${{ env.PARENT_TAG == '' }} +- - name: checkout ${{ env.PARENT_TAG }} ++ - name: checkout ${{ github.base_ref }} + uses: actions/checkout@v4 + with: +- ref: ${{ env.PARENT_TAG }} ++ ref: ${{ github.base_ref }} + - name: download ABI for ${{ env.PARENT_TAG }} + id: download_abi + uses: actions/download-artifact@v4 diff --git a/0001-RH-fixup-udev-rules-for-redhat.patch b/0033-RH-fixup-udev-rules-for-redhat.patch similarity index 96% rename from 0001-RH-fixup-udev-rules-for-redhat.patch rename to 0033-RH-fixup-udev-rules-for-redhat.patch index ed5b7e9..0645240 100644 --- a/0001-RH-fixup-udev-rules-for-redhat.patch +++ b/0033-RH-fixup-udev-rules-for-redhat.patch @@ -1,4 +1,4 @@ -From 64a07df23affd21842fdc604887276e62e5b41de Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 13 Apr 2017 07:22:23 -0500 Subject: [PATCH] RH: fixup udev rules for redhat @@ -15,7 +15,7 @@ Signed-off-by: Benjamin Marzinski 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.inc b/Makefile.inc -index 9e3dc466..ead89030 100644 +index 729618bd..81cb61d2 100644 --- a/Makefile.inc +++ b/Makefile.inc @@ -34,7 +34,7 @@ endif diff --git a/0002-RH-Remove-the-property-blacklist-exception-builtin.patch b/0034-RH-Remove-the-property-blacklist-exception-builtin.patch similarity index 91% rename from 0002-RH-Remove-the-property-blacklist-exception-builtin.patch rename to 0034-RH-Remove-the-property-blacklist-exception-builtin.patch index b8e580a..a74e6c2 100644 --- a/0002-RH-Remove-the-property-blacklist-exception-builtin.patch +++ b/0034-RH-Remove-the-property-blacklist-exception-builtin.patch @@ -1,4 +1,4 @@ -From f7be16ac9fce97585a4552d49f3d3c54a93c9c17 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Wed, 2 Jul 2014 12:49:53 -0500 Subject: [PATCH] RH: Remove the property blacklist exception builtin @@ -42,10 +42,10 @@ index 17e1b54a..10d13e98 100644 udev_device_get_properties_list_entry(udev)) { diff --git a/multipath/multipath.conf.5.in b/multipath/multipath.conf.5.in -index 3c9ae097..ba291e11 100644 +index 4388baad..af9fbb96 100644 --- a/multipath/multipath.conf.5.in +++ b/multipath/multipath.conf.5.in -@@ -1470,9 +1470,14 @@ keywords. Both are regular expressions. For a full description of these keywords +@@ -1469,9 +1469,14 @@ keywords. Both are regular expressions. For a full description of these keywords Regular expression for an udev property. All devices that have matching udev properties will be excluded/included. The handling of the \fIproperty\fR keyword is special, @@ -61,7 +61,7 @@ index 3c9ae097..ba291e11 100644 . .RS .PP -@@ -1483,10 +1488,6 @@ Blacklisting by missing properties is only applied to devices which do have the +@@ -1482,10 +1487,6 @@ Blacklisting by missing properties is only applied to devices which do have the property specified by \fIuid_attribute\fR (e.g. \fIID_SERIAL\fR) set. Previously, it was applied to every device, possibly causing devices to be blacklisted because of temporary I/O error conditions. @@ -73,10 +73,10 @@ index 3c9ae097..ba291e11 100644 .TP .B protocol diff --git a/tests/blacklist.c b/tests/blacklist.c -index ab3da619..52ae03e0 100644 +index ba8dfd07..693db3fa 100644 --- a/tests/blacklist.c +++ b/tests/blacklist.c -@@ -371,9 +371,8 @@ static void test_property_missing(void **state) +@@ -384,9 +384,8 @@ static void test_property_missing(void **state) { static struct udev_device udev = { "sdb", { "ID_FOO", "ID_BAZ", "ID_BAR", "ID_SERIAL", NULL } }; conf.blist_property = blist_property_wwn; @@ -87,7 +87,7 @@ index ab3da619..52ae03e0 100644 assert_int_equal(filter_property(&conf, &udev, 3, "ID_BLAH"), MATCH_NOTHING); assert_int_equal(filter_property(&conf, &udev, 3, ""), -@@ -465,9 +464,7 @@ static void test_filter_path_missing1(void **state) +@@ -478,9 +477,7 @@ static void test_filter_path_missing1(void **state) conf.blist_device = blist_device_foo_bar; conf.blist_protocol = blist_protocol_fcp; conf.blist_wwid = blist_wwid_xyzzy; diff --git a/0003-RH-don-t-start-without-a-config-file.patch b/0035-RH-don-t-start-without-a-config-file.patch similarity index 86% rename from 0003-RH-don-t-start-without-a-config-file.patch rename to 0035-RH-don-t-start-without-a-config-file.patch index 05d4e7a..8a3c5b6 100644 --- a/0003-RH-don-t-start-without-a-config-file.patch +++ b/0035-RH-don-t-start-without-a-config-file.patch @@ -1,4 +1,4 @@ -From 5613e07ce9cabf2fdc402f6f102cc54bd1059800 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Wed, 15 Oct 2014 10:39:30 -0500 Subject: [PATCH] RH: don't start without a config file @@ -18,14 +18,14 @@ Signed-off-by: Benjamin Marzinski multipath/multipath.rules.in | 1 + multipathd/multipathd.8.in | 2 ++ multipathd/multipathd.service.in | 1 + - multipathd/multipathd.socket.in | 1 + + multipathd/multipathd.socket | 1 + 7 files changed, 25 insertions(+) diff --git a/libmultipath/config.c b/libmultipath/config.c -index 8b424d18..b8317f4d 100644 +index 226ddecb..588ae9ee 100644 --- a/libmultipath/config.c +++ b/libmultipath/config.c -@@ -937,6 +937,19 @@ int init_config__ (const char *file, struct config *conf) +@@ -962,6 +962,19 @@ int init_config__ (const char *file, struct config *conf) } factorize_hwtable(conf->hwtable, builtin_hwtable_size, file); validate_pctable(conf->overrides, 0, file); @@ -46,7 +46,7 @@ index 8b424d18..b8317f4d 100644 conf->processed_main_config = 1; diff --git a/libmultipath/config.h b/libmultipath/config.h -index 5b4ebf8c..2302eacc 100644 +index 94cdf252..534b6142 100644 --- a/libmultipath/config.h +++ b/libmultipath/config.h @@ -10,6 +10,7 @@ @@ -58,10 +58,10 @@ index 5b4ebf8c..2302eacc 100644 enum devtypes { DEV_NONE, diff --git a/multipath/main.c b/multipath/main.c -index f2adcdeb..31012874 100644 +index 28e3a055..346acb61 100644 --- a/multipath/main.c +++ b/multipath/main.c -@@ -834,11 +834,14 @@ main (int argc, char *argv[]) +@@ -843,11 +843,14 @@ main (int argc, char *argv[]) char *dev = NULL; struct config *conf; bool enable_foreign = false; @@ -76,7 +76,7 @@ index f2adcdeb..31012874 100644 if (init_config(DEFAULT_CONFIGFILE)) exit(RTVL_FAIL); if (atexit(uninit_config)) -@@ -1092,6 +1095,9 @@ main (int argc, char *argv[]) +@@ -1101,6 +1104,9 @@ main (int argc, char *argv[]) while ((r = configure(conf, cmd, dev_type, dev)) == RTVL_RETRY) condlog(3, "restart multipath configuration process"); @@ -99,7 +99,7 @@ index 2ac1972f..cc248231 100644 ENV{DEVTYPE}!="partition", GOTO="test_dev" IMPORT{parent}="DM_MULTIPATH_DEVICE_PATH" diff --git a/multipathd/multipathd.8.in b/multipathd/multipathd.8.in -index 8815e099..342e363e 100644 +index 7bc8806e..315884eb 100644 --- a/multipathd/multipathd.8.in +++ b/multipathd/multipathd.8.in @@ -49,6 +49,8 @@ map regains its maximum performance and redundancy. @@ -112,10 +112,10 @@ index 8815e099..342e363e 100644 . .\" ---------------------------------------------------------------------------- diff --git a/multipathd/multipathd.service.in b/multipathd/multipathd.service.in -index eb58943c..ab166435 100644 +index 646001e6..72e44849 100644 --- a/multipathd/multipathd.service.in +++ b/multipathd/multipathd.service.in -@@ -6,6 +6,7 @@ Wants=systemd-udevd-kernel.socket multipathd-queueing.service @MODPROBE_UNIT@ +@@ -6,6 +6,7 @@ Wants=systemd-udevd-kernel.socket @MODPROBE_UNIT@ After=systemd-udevd-kernel.socket @MODPROBE_UNIT@ After=multipathd.socket systemd-remount-fs.service Before=initrd-cleanup.service @@ -123,10 +123,10 @@ index eb58943c..ab166435 100644 DefaultDependencies=no Conflicts=shutdown.target Conflicts=initrd-cleanup.service -diff --git a/multipathd/multipathd.socket.in b/multipathd/multipathd.socket.in -index 11002fce..5ed24757 100644 ---- a/multipathd/multipathd.socket.in -+++ b/multipathd/multipathd.socket.in +diff --git a/multipathd/multipathd.socket b/multipathd/multipathd.socket +index 6a62f5fd..263b6b0c 100644 +--- a/multipathd/multipathd.socket ++++ b/multipathd/multipathd.socket @@ -1,6 +1,7 @@ [Unit] Description=multipathd control socket diff --git a/0004-RH-Fix-nvme-function-missing-argument.patch b/0036-RH-Fix-nvme-function-missing-argument.patch similarity index 84% rename from 0004-RH-Fix-nvme-function-missing-argument.patch rename to 0036-RH-Fix-nvme-function-missing-argument.patch index 33a8d5f..74b7b53 100644 --- a/0004-RH-Fix-nvme-function-missing-argument.patch +++ b/0036-RH-Fix-nvme-function-missing-argument.patch @@ -1,4 +1,4 @@ -From 283b5dd645663a2cf16f2813581772d7a84db6ad Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Fri, 25 Jan 2019 14:54:56 -0600 Subject: [PATCH] RH: Fix nvme function missing argument @@ -12,10 +12,10 @@ Signed-off-by: Benjamin Marzinski 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libmultipath/nvme/argconfig.h b/libmultipath/nvme/argconfig.h -index b3caa7be..f91504c9 100644 +index e6c54453..0c6c9439 100644 --- a/libmultipath/nvme/argconfig.h +++ b/libmultipath/nvme/argconfig.h -@@ -63,7 +63,7 @@ struct argconfig_commandline_options { +@@ -76,7 +76,7 @@ struct argconfig_commandline_options { extern "C" { #endif diff --git a/0005-RH-use-rpm-optflags-if-present.patch b/0037-RH-use-rpm-optflags-if-present.patch similarity index 81% rename from 0005-RH-use-rpm-optflags-if-present.patch rename to 0037-RH-use-rpm-optflags-if-present.patch index 7a6f57f..66d14bc 100644 --- a/0005-RH-use-rpm-optflags-if-present.patch +++ b/0037-RH-use-rpm-optflags-if-present.patch @@ -1,4 +1,4 @@ -From bf46f8029998498045bb055415ba3ff515c79eaa Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Wed, 19 Apr 2017 06:10:01 -0500 Subject: [PATCH] RH: use rpm optflags if present @@ -7,16 +7,17 @@ Use the passed in optflags when compiling as an RPM, and keep the default flags as close as possible to the current fedora flags, while still being generic. +Co-authored-by: Yaakov Selkowitz Signed-off-by: Benjamin Marzinski --- Makefile.inc | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/Makefile.inc b/Makefile.inc -index ead89030..03aee175 100644 +index 81cb61d2..a5024bb7 100644 --- a/Makefile.inc +++ b/Makefile.inc -@@ -102,17 +102,29 @@ SYSTEMD_LIBDEPS := $(if $(SYSTEMD),$(if $(shell test $(SYSTEMD) -gt 209 && echo +@@ -99,28 +99,39 @@ SYSTEMD_LIBDEPS := $(if $(SYSTEMD),$(if $(shell test $(SYSTEMD) -gt 209 && echo MODPROBE_UNIT := $(shell test "0$(SYSTEMD)" -lt 245 2>/dev/null || \ echo "modprobe@dm_multipath.service") @@ -50,13 +51,11 @@ index ead89030..03aee175 100644 -D_FILE_OFFSET_BITS=64 \ -DBIN_DIR=\"$(bindir)\" -DMULTIPATH_DIR=\"$(TGTDIR)$(plugindir)\" \ -DRUNTIME_DIR=\"$(runtimedir)\" -DCONFIG_DIR=\"$(TGTDIR)$(configdir)\" \ -@@ -121,12 +133,11 @@ CPPFLAGS := $(FORTIFY_OPT) $(CPPFLAGS) $(D_URCU_VERSION) \ - -DABSTRACT_SOCKET=\"$(abstract_socket)\" -DPATHNAME_SOCKET=\"$(pathname_socket)\" \ - -DWSTRINGOP_TRUNCATION=$(if $(WSTRINGOP_TRUNCATION),1,0) \ - -MMD -MP --CFLAGS := -std=$(C_STD) $(CFLAGS) $(OPTFLAGS) $(WARNFLAGS) -pipe \ + -DDEFAULT_CONFIGFILE=\"$(TGTDIR)$(configfile)\" -DSTATE_DIR=\"$(TGTDIR)$(statedir)\" \ + -DEXTRAVERSION=\"$(EXTRAVERSION)\" -MMD -MP +-CFLAGS := -std=gnu99 $(CFLAGS) $(OPTFLAGS) $(WARNFLAGS) -pipe \ - -fexceptions -+CFLAGS := -std=$(C_STD) $(CFLAGS) $(OPTFLAGS) $(WARNFLAGS) -pipe ++CFLAGS := -std=gnu11 $(CFLAGS) $(OPTFLAGS) $(WARNFLAGS) -pipe BIN_CFLAGS := -fPIE -DPIE LIB_CFLAGS := -fPIC SHARED_FLAGS := -shared diff --git a/0006-RH-add-mpathconf.patch b/0038-RH-add-mpathconf.patch similarity index 99% rename from 0006-RH-add-mpathconf.patch rename to 0038-RH-add-mpathconf.patch index 46f1126..103ca55 100644 --- a/0006-RH-add-mpathconf.patch +++ b/0038-RH-add-mpathconf.patch @@ -1,4 +1,4 @@ -From 29e5c6d6e2177e73d1be2ed2af66c1007487bf60 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 16 Oct 2014 15:49:01 -0500 Subject: [PATCH] RH: add mpathconf @@ -23,10 +23,10 @@ Signed-off-by: Benjamin Marzinski create mode 100644 multipath/mpathconf.8 diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt -index a5856bcc..5c9113ba 100644 +index 4ac57510..3602a071 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt -@@ -131,9 +131,11 @@ Marzinski +@@ -126,9 +126,11 @@ Marzinski misdetection mpath mpathb @@ -38,7 +38,7 @@ index a5856bcc..5c9113ba 100644 multipathc multipathd multipathed -@@ -154,6 +156,7 @@ ontap +@@ -146,6 +148,7 @@ ontap OOM opensvc OPTFLAGS @@ -47,10 +47,10 @@ index a5856bcc..5c9113ba 100644 partx pathgroup diff --git a/libmultipath/config.c b/libmultipath/config.c -index b8317f4d..0bbaa981 100644 +index 588ae9ee..3cb8449c 100644 --- a/libmultipath/config.c +++ b/libmultipath/config.c -@@ -939,6 +939,8 @@ int init_config__ (const char *file, struct config *conf) +@@ -964,6 +964,8 @@ int init_config__ (const char *file, struct config *conf) validate_pctable(conf->overrides, 0, file); } else { condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices."); diff --git a/0007-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch b/0039-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch similarity index 91% rename from 0007-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch rename to 0039-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch index cef8b56..4e781fa 100644 --- a/0007-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch +++ b/0039-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch @@ -1,4 +1,4 @@ -From d6ad888bad3850bb0a342ebcdc9fd78773eb3b2a Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Fri, 17 Oct 2014 11:20:34 -0500 Subject: [PATCH] RH: add wwids from kernel cmdline mpath.wwids with -A @@ -20,10 +20,10 @@ Signed-off-by: Benjamin Marzinski 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/multipath/main.c b/multipath/main.c -index 31012874..a667c2ee 100644 +index 346acb61..adc50d69 100644 --- a/multipath/main.c +++ b/multipath/main.c -@@ -111,7 +111,7 @@ usage (char * progname) +@@ -120,7 +120,7 @@ usage (char * progname) fprintf (stderr, " %s [-v level] [-R retries] -F\n", progname); fprintf (stderr, " %s [-v level] [-l|-ll] [device]\n", progname); fprintf (stderr, " %s [-v level] [-a|-w] device\n", progname); @@ -32,7 +32,7 @@ index 31012874..a667c2ee 100644 fprintf (stderr, " %s [-v level] [-i] [-c|-C] device\n", progname); fprintf (stderr, " %s [-v level] [-i] [-u|-U]\n", progname); fprintf (stderr, " %s [-h|-t|-T]\n", progname); -@@ -125,6 +125,8 @@ usage (char * progname) +@@ -134,6 +134,8 @@ usage (char * progname) " -f flush a multipath device map\n" " -F flush all multipath device maps\n" " -a add a device wwid to the wwids file\n" @@ -41,7 +41,7 @@ index 31012874..a667c2ee 100644 " -c check if a device should be a path in a multipath device\n" " -C check if a multipath device has usable paths\n" " -q allow queue_if_no_path when multipathd is not running\n" -@@ -440,6 +442,50 @@ static void cleanup_vecs(void) +@@ -449,6 +451,50 @@ static void cleanup_vecs(void) free_pathvec(vecs.pathvec, FREE_PATHS); } @@ -92,7 +92,7 @@ index 31012874..a667c2ee 100644 static int configure (struct config *conf, enum mpath_cmds cmd, enum devtypes dev_type, char *devpath) -@@ -851,7 +897,7 @@ main (int argc, char *argv[]) +@@ -860,7 +906,7 @@ main (int argc, char *argv[]) condlog(1, "failed to register cleanup handler for vecs: %m"); if (atexit(cleanup_bindings)) condlog(1, "failed to register cleanup handler for bindings: %m"); @@ -101,7 +101,7 @@ index 31012874..a667c2ee 100644 switch(arg) { case 'v': if (!isdigit(optarg[0])) { -@@ -922,6 +968,10 @@ main (int argc, char *argv[]) +@@ -931,6 +977,10 @@ main (int argc, char *argv[]) case 'T': cmd = CMD_DUMP_CONFIG; break; @@ -138,14 +138,14 @@ index b88e9a4c..edd742aa 100644 Remove the WWID for the specified device from the WWIDs file. . diff --git a/multipathd/multipathd.service.in b/multipathd/multipathd.service.in -index ab166435..1ec08c6e 100644 +index 72e44849..69a6c39d 100644 --- a/multipathd/multipathd.service.in +++ b/multipathd/multipathd.service.in -@@ -19,6 +19,7 @@ StartLimitBurst=3 +@@ -17,6 +17,7 @@ ConditionVirtualization=!container [Service] Type=notify NotifyAccess=main +ExecStartPre=-@BINDIR@/multipath -A ExecStart=@BINDIR@/multipathd -d -s ExecReload=@BINDIR@/multipathd reconfigure - Restart=on-failure + TasksMax=infinity diff --git a/0008-RH-reset-default-find_mutipaths-value-to-off.patch b/0040-RH-reset-default-find_mutipaths-value-to-off.patch similarity index 87% rename from 0008-RH-reset-default-find_mutipaths-value-to-off.patch rename to 0040-RH-reset-default-find_mutipaths-value-to-off.patch index fdc90d4..5789916 100644 --- a/0008-RH-reset-default-find_mutipaths-value-to-off.patch +++ b/0040-RH-reset-default-find_mutipaths-value-to-off.patch @@ -1,4 +1,4 @@ -From 064d761121e7e2c7b63ab280e341d8010a413119 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 7 Jun 2018 17:43:52 -0500 Subject: [PATCH] RH: reset default find_mutipaths value to off @@ -14,7 +14,7 @@ Signed-off-by: Benjamin Marzinski 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libmultipath/defaults.h b/libmultipath/defaults.h -index 134b690a..e2fe7ac4 100644 +index 02f7e57c..cd03fd1a 100644 --- a/libmultipath/defaults.h +++ b/libmultipath/defaults.h @@ -24,7 +24,7 @@ @@ -27,10 +27,10 @@ index 134b690a..e2fe7ac4 100644 #define DEFAULT_DEV_LOSS_TMO 600 #define DEFAULT_RETAIN_HWHANDLER RETAIN_HWHANDLER_ON diff --git a/multipath/multipath.conf.5.in b/multipath/multipath.conf.5.in -index ba291e11..b8389db3 100644 +index af9fbb96..0c1eff40 100644 --- a/multipath/multipath.conf.5.in +++ b/multipath/multipath.conf.5.in -@@ -1227,7 +1227,7 @@ as non-multipath and passed on to upper layers. +@@ -1226,7 +1226,7 @@ as non-multipath and passed on to upper layers. \fBNote:\fR this may cause delays during device detection if there are single-path devices which aren\'t blacklisted. .TP diff --git a/0009-RH-attempt-to-get-ANA-info-via-sysfs-first.patch b/0041-RH-attempt-to-get-ANA-info-via-sysfs-first.patch similarity index 86% rename from 0009-RH-attempt-to-get-ANA-info-via-sysfs-first.patch rename to 0041-RH-attempt-to-get-ANA-info-via-sysfs-first.patch index 8065e9f..1f94eb3 100644 --- a/0009-RH-attempt-to-get-ANA-info-via-sysfs-first.patch +++ b/0041-RH-attempt-to-get-ANA-info-via-sysfs-first.patch @@ -1,4 +1,4 @@ -From 335b8eb2773b07a602e84e14c1f3e289a9b25b5a Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 11 Apr 2019 13:25:42 -0500 Subject: [PATCH] RH: attempt to get ANA info via sysfs first @@ -13,10 +13,10 @@ Signed-off-by: Benjamin Marzinski 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/libmultipath/prioritizers/ana.c b/libmultipath/prioritizers/ana.c -index 34527b22..4eaa3cc3 100644 +index e9827dca..80a32aa3 100644 --- a/libmultipath/prioritizers/ana.c +++ b/libmultipath/prioritizers/ana.c -@@ -23,6 +23,7 @@ +@@ -24,6 +24,7 @@ #include "prio.h" #include "util.h" #include "structs.h" @@ -24,7 +24,7 @@ index 34527b22..4eaa3cc3 100644 enum { ANA_ERR_GETCTRL_FAILED = 1, -@@ -35,6 +36,7 @@ enum { +@@ -36,6 +37,7 @@ enum { ANA_ERR_GETNS_FAILED, ANA_ERR_NO_MEMORY, ANA_ERR_NO_INFORMATION, @@ -32,7 +32,7 @@ index 34527b22..4eaa3cc3 100644 }; static const char *ana_errmsg[] = { -@@ -48,6 +50,7 @@ static const char *ana_errmsg[] = { +@@ -49,6 +51,7 @@ static const char *ana_errmsg[] = { [ANA_ERR_GETNS_FAILED] = "couldn't get namespace info", [ANA_ERR_NO_MEMORY] = "out of memory", [ANA_ERR_NO_INFORMATION] = "invalid fd", @@ -40,7 +40,7 @@ index 34527b22..4eaa3cc3 100644 }; static const char *anas_string[] = { -@@ -106,6 +109,27 @@ static int get_ana_state(__u32 nsid, __u32 anagrpid, void *ana_log, +@@ -107,6 +110,27 @@ static int get_ana_state(__u32 nsid, __u32 anagrpid, void *ana_log, return -ANA_ERR_GETANAS_NOTFOUND; } @@ -68,7 +68,7 @@ index 34527b22..4eaa3cc3 100644 static int get_ana_info(struct path * pp) { int rc; -@@ -208,8 +232,11 @@ int getprio(struct path *pp, __attribute__((unused)) char *args) +@@ -209,8 +233,11 @@ int getprio(struct path *pp, __attribute__((unused)) char *args) if (pp->fd < 0) rc = -ANA_ERR_NO_INFORMATION; diff --git a/0010-RH-make-parse_vpd_pg83-match-scsi_id-output.patch b/0042-RH-make-parse_vpd_pg83-match-scsi_id-output.patch similarity index 91% rename from 0010-RH-make-parse_vpd_pg83-match-scsi_id-output.patch rename to 0042-RH-make-parse_vpd_pg83-match-scsi_id-output.patch index f7bca92..0d5baa3 100644 --- a/0010-RH-make-parse_vpd_pg83-match-scsi_id-output.patch +++ b/0042-RH-make-parse_vpd_pg83-match-scsi_id-output.patch @@ -1,4 +1,4 @@ -From 137c96d16b6bb03d8a52854e152db4ee36b7d9e4 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 25 Mar 2021 13:05:10 -0500 Subject: [PATCH] RH: make parse_vpd_pg83 match scsi_id output @@ -14,10 +14,10 @@ Signed-off-by: Benjamin Marzinski 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c -index 31db8758..21cfcc73 100644 +index 5043330c..e14507e8 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c -@@ -1225,13 +1225,9 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len, +@@ -1221,13 +1221,9 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len, good_len = 8; break; case 2: @@ -33,7 +33,7 @@ index 31db8758..21cfcc73 100644 good_len = 8; break; default: -@@ -1249,10 +1245,6 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len, +@@ -1245,10 +1241,6 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len, break; case 0x8: /* SCSI Name: Prio 3 */ diff --git a/0011-RH-add-scsi-device-handlers-to-modules-load.d.patch b/0043-RH-add-scsi-device-handlers-to-modules-load.d.patch similarity index 89% rename from 0011-RH-add-scsi-device-handlers-to-modules-load.d.patch rename to 0043-RH-add-scsi-device-handlers-to-modules-load.d.patch index 3fe7c25..ef0ee42 100644 --- a/0011-RH-add-scsi-device-handlers-to-modules-load.d.patch +++ b/0043-RH-add-scsi-device-handlers-to-modules-load.d.patch @@ -1,4 +1,4 @@ -From 374755791536be4870ab2e93ae36549cbaaeb800 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Fri, 25 Mar 2022 18:12:06 -0500 Subject: [PATCH] RH: add scsi device handlers to modules-load.d @@ -11,7 +11,7 @@ Signed-off-by: Benjamin Marzinski 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.inc b/Makefile.inc -index 03aee175..936a622f 100644 +index a5024bb7..834b63b9 100644 --- a/Makefile.inc +++ b/Makefile.inc @@ -16,7 +16,7 @@ READLINE := diff --git a/0012-RH-compile-with-libreadline-support.patch b/0044-RH-compile-with-libreadline-support.patch similarity index 89% rename from 0012-RH-compile-with-libreadline-support.patch rename to 0044-RH-compile-with-libreadline-support.patch index 0964c42..50781c3 100644 --- a/0012-RH-compile-with-libreadline-support.patch +++ b/0044-RH-compile-with-libreadline-support.patch @@ -1,4 +1,4 @@ -From cc15379130e8aa068e97c64afd46be212b456d4f Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Tue, 15 Nov 2022 18:03:33 -0600 Subject: [PATCH] RH: compile with libreadline support @@ -12,7 +12,7 @@ Signed-off-by: Benjamin Marzinski 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.inc b/Makefile.inc -index 936a622f..f475f70f 100644 +index 834b63b9..c482a181 100644 --- a/Makefile.inc +++ b/Makefile.inc @@ -12,7 +12,7 @@ diff --git a/0013-RH-Add-mpathcleanup.patch b/0045-RH-Add-mpathcleanup.patch similarity index 98% rename from 0013-RH-Add-mpathcleanup.patch rename to 0045-RH-Add-mpathcleanup.patch index d1a8e84..bd2dcd6 100644 --- a/0013-RH-Add-mpathcleanup.patch +++ b/0045-RH-Add-mpathcleanup.patch @@ -1,4 +1,4 @@ -From 2ef5bd86052ba0b22f4d3a16e69cdf268d90a53a Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Fri, 7 Jul 2023 15:25:59 -0500 Subject: [PATCH] RH: Add mpathcleanup diff --git a/device-mapper-multipath.spec b/device-mapper-multipath.spec index 5d80d4e..8e469ab 100644 --- a/device-mapper-multipath.spec +++ b/device-mapper-multipath.spec @@ -1,6 +1,6 @@ Name: device-mapper-multipath -Version: 0.13.0 -Release: 2%{?dist} +Version: 0.10.0 +Release: 5%{?dist} Summary: Tools to manage multipath devices using device-mapper # readline uses GPL-3.0-only License: GPL-2.0-only AND GPL-3.0-only @@ -8,22 +8,54 @@ URL: http://christophe.varoqui.free.fr/ # The source for this package was pulled from upstream's git repo. Use the # following command to generate the tarball -# curl -L https://github.com/opensvc/multipath-tools/archive/0.13.0.tar.gz -o multipath-tools-0.13.0.tgz -Source0: multipath-tools-0.13.0.tgz +# curl -L https://github.com/opensvc/multipath-tools/archive/0.10.0.tar.gz -o multipath-tools-0.10.0.tgz +Source0: multipath-tools-0.10.0.tgz Source1: multipath.conf -Patch0001: 0001-RH-fixup-udev-rules-for-redhat.patch -Patch0002: 0002-RH-Remove-the-property-blacklist-exception-builtin.patch -Patch0003: 0003-RH-don-t-start-without-a-config-file.patch -Patch0004: 0004-RH-Fix-nvme-function-missing-argument.patch -Patch0005: 0005-RH-use-rpm-optflags-if-present.patch -Patch0006: 0006-RH-add-mpathconf.patch -Patch0007: 0007-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch -Patch0008: 0008-RH-reset-default-find_mutipaths-value-to-off.patch -Patch0009: 0009-RH-attempt-to-get-ANA-info-via-sysfs-first.patch -Patch0010: 0010-RH-make-parse_vpd_pg83-match-scsi_id-output.patch -Patch0011: 0011-RH-add-scsi-device-handlers-to-modules-load.d.patch -Patch0012: 0012-RH-compile-with-libreadline-support.patch -Patch0013: 0013-RH-Add-mpathcleanup.patch +Patch0001: 0001-GitHub-workflows-use-upload-download-artifact-v4.patch +Patch0002: 0002-GitHub-workflows-update-dawidd6-action-download-arti.patch +Patch0003: 0003-Github-workflows-native.yml-use-mosteo-actions-docke.patch +Patch0004: 0004-GitHub-workflows-native.yml-use-extra-job-for-clang.patch +Patch0005: 0005-GitHub-workflows-native.yaml-make-test-and-archive-s.patch +Patch0006: 0006-GitHub-workflows-enable-unit-tests-for-stable-branch.patch +Patch0007: 0007-GitHub-Workflows-add-abi-check-for-stable-branches.patch +Patch0008: 0008-libmultipath-dm_get_maps-don-t-bail-out-for-single-m.patch +Patch0009: 0009-11-dm-mpath.rules.in-import-DM_COLDPLUG_SUSPENDED-on.patch +Patch0010: 0010-11-dm-mpath.rules.in-handle-inactive-suspended-devic.patch +Patch0011: 0011-11-dm-mpath.rules.in-clarify-DM_ACTIVATION-logic.patch +Patch0012: 0012-11-dm-mpath-rules.in-skip-one-.DM_NOSCAN-check.patch +Patch0013: 0013-11-dm-mpath.rules.in-set-.DM_NOSCAN-if-MPATH_UNCHANG.patch +Patch0014: 0014-libmultipath-don-t-set-dev_loss_tmo-to-0-for-NO_PATH.patch +Patch0015: 0015-multipathd-fix-deferred_failback_tick-for-reload-rem.patch +Patch0016: 0016-multipathd-fix-an-unsigned-int-ovwerflow.patch +Patch0017: 0017-libmpathutil-avoid-Wcast-function-type-mismatch-erro.patch +Patch0018: 0018-Update-NEWS.md-for-0.10.1.patch +Patch0019: 0019-libmultipath-don-t-print-error-message-if-WATCHDOG_U.patch +Patch0020: 0020-libmultipath-reduce-log-level-of-map-X-has-multiple-.patch +Patch0021: 0021-libmultipath-foreign-fix-memory-leak-in-nvme-foreign.patch +Patch0022: 0022-libmultipath-add-condition-for-enqueueing-path-to-io.patch +Patch0023: 0023-Additional-NEWS.md-updates-for-0.10.1.patch +Patch0024: 0024-libmultipath-fix-handling-of-pp-pgindex.patch +Patch0025: 0025-libmultipath-make-pgcmp-detect-if-map-is-missing-a-p.patch +Patch0026: 0026-libmultipath-trigger-uevents-upon-map-creation-in-do.patch +Patch0027: 0027-multipathd-trigger-uevents-upon-map-removal-in-coale.patch +Patch0028: 0028-libmultipath-Don-t-skip-set_path_max_sectors_kb.patch +Patch0029: 0029-libmultipath-stop-static-analyzer-complaint-in-init_.patch +Patch0030: 0030-libmultipath-be-lenient-in-allowing-the-alua-based-p.patch +Patch0031: 0031-Update-NEWS.md-for-0.10.2.patch +Patch0032: 0032-GitHub-Workflows-fix-abi-stable.yaml-for-pull-reques.patch +Patch0033: 0033-RH-fixup-udev-rules-for-redhat.patch +Patch0034: 0034-RH-Remove-the-property-blacklist-exception-builtin.patch +Patch0035: 0035-RH-don-t-start-without-a-config-file.patch +Patch0036: 0036-RH-Fix-nvme-function-missing-argument.patch +Patch0037: 0037-RH-use-rpm-optflags-if-present.patch +Patch0038: 0038-RH-add-mpathconf.patch +Patch0039: 0039-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch +Patch0040: 0040-RH-reset-default-find_mutipaths-value-to-off.patch +Patch0041: 0041-RH-attempt-to-get-ANA-info-via-sysfs-first.patch +Patch0042: 0042-RH-make-parse_vpd_pg83-match-scsi_id-output.patch +Patch0043: 0043-RH-add-scsi-device-handlers-to-modules-load.d.patch +Patch0044: 0044-RH-compile-with-libreadline-support.patch +Patch0045: 0045-RH-Add-mpathcleanup.patch # runtime Requires: %{name}-libs = %{version}-%{release} @@ -111,7 +143,7 @@ This package contains the files needed to develop applications that use device-mapper-multipath's libdmmp C API library %prep -%autosetup -n multipath-tools-0.13.0 -p1 +%autosetup -n multipath-tools-0.10.0 -p1 cp %{SOURCE1} . %build @@ -163,7 +195,6 @@ fi %{_sbindir}/mpathcleanup %{_sbindir}/mpathpersist %{_unitdir}/multipathd.service -%{_unitdir}/multipathd-queueing.service %{_unitdir}/multipathd.socket %{_mandir}/man5/multipath.conf.5* %{_mandir}/man8/multipath.8* @@ -234,26 +265,6 @@ fi %{_pkgconfdir}/libdmmp.pc %changelog -* Thu Nov 13 2025 Benjamin Marzinski - 0.13.0-2 -- Move STI tests to TMT - -* Tue Nov 4 2025 Benjamin Marzinski - 0.13.0-1 -- Update source to upstream release 0.13.0 - * Previous patches 0001-0004 are included in the tarball -- Install /lib/systemd/system/multipathd-queueing.service -- Rename redhat patches - * Previous patches 0005-0017 are now patches 0001-0013 - -* Wed Jul 23 2025 Fedora Release Engineering - 0.11.1-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild - -* Thu Feb 27 2025 Benjamin Marzinski - 0.11.1-1 -- Update source to upstream staging branch for 0.11.1 plus additional - stable branch patches. - * Previous patches 0001-0032 are included in the tarball -- Rename redhat patches - * Previous patches 0033-0045 are now patches 0005-0017 - * Sat Feb 1 2025 Benjamin Marzinski - 0.10.0-5 - Update source to upstream staging branch for 0.10.y (will be 0.10.2 when merged). diff --git a/plans/multipath.fmf b/plans/multipath.fmf deleted file mode 100644 index 876c77a..0000000 --- a/plans/multipath.fmf +++ /dev/null @@ -1,58 +0,0 @@ -summary: basic functionality tests - -provision: - hardware: - memory: ">= 2 GB" - -prepare: - how: install - package: - - device-mapper-multipath - - perl - -discover: - how: shell - tests: - - name: medium_error_scsi_debug - path: /tests/medium_error_scsi_debug - test: ./main.sh - duration: 15m - - name: squelch_scsi_id - path: /tests/squelch_scsi_id - test: ./main.sh - duration: 15m - - name: multipathd_oom - path: /tests/multipathd_oom - test: ./main.sh - duration: 15m - - name: user_friendly_names - path: /tests/user_friendly_names - test: ./main.sh - duration: 15m - - name: kpartx_4k_aligned - path: /tests/kpartx_4k_aligned - test: ./main.sh - duration: 15m - - name: bindings - path: /tests/bindings - test: ./main.sh - duration: 15m - - name: restate_module - path: /tests/restate_module - test: ./main.sh - duration: 15m - - name: find_multipaths - path: /tests/find_multipaths - test: ./main.sh - duration: 15m - - name: multipath_conf_syntax - path: /tests/multipath_conf_syntax - test: ./main.sh - duration: 15m - - name: alias_clash - path: /tests/alias_clash - test: ./main.sh - duration: 15m - -execute: - how: tmt diff --git a/sources b/sources index 233c4ea..da06e16 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ -SHA512 (multipath-tools-0.13.0.tgz) = 75c84524ee27590b8b751ea500898a44e5ac3d58d55be6bcab919d0d423049db3a4466fcb9135705cf63ba074416973bb651255063269e9f682f11d21ba57e59 +SHA512 (multipath-tools-0.10.0.tgz) = 8f545609fa20df7547428f2929571dc0df87c17d9f61f11aad3559446c2e94755e18b1c4b3780b3de92ec2cbc450939ca15a9d6c95551eee4084064d83874b2d SHA512 (multipath.conf) = 71953dce5a68adcf60a942305f5a66023e6f4c4baf53b1bfdb4edf65ed5b8e03db804363c36d1dcfd85591f4766f52b515269904c53b84d7b076da0b80b09942 diff --git a/.fmf/version b/tests/.fmf/version similarity index 100% rename from .fmf/version rename to tests/.fmf/version diff --git a/tests/provision.fmf b/tests/provision.fmf new file mode 100644 index 0000000..62a6eba --- /dev/null +++ b/tests/provision.fmf @@ -0,0 +1,5 @@ +--- + +standard-inventory-qcow2: + qemu: + m: 2G diff --git a/tests/tests.yml b/tests/tests.yml new file mode 100644 index 0000000..15f26d2 --- /dev/null +++ b/tests/tests.yml @@ -0,0 +1,44 @@ +--- +# No tests suitable for atomic environment +# No tests suitable for container environment + +# Tests suitable for classic environment +- hosts: localhost + roles: + - role: standard-test-basic + tags: + - classic + tests: + - medium_error_scsi_debug: + run: ./main.sh + timeout: 15m + - squelch_scsi_id: + run: ./main.sh + timeout: 15m + - multipathd_oom: + run: ./main.sh + timeout: 15m + - user_friendly_names: + run: ./main.sh + timeout: 15m + - kpartx_4k_aligned: + run: ./main.sh + timeout: 15m + - bindings: + run: ./main.sh + timeout: 15m + - restate_module: + run: ./main.sh + timeout: 15m + - find_multipaths: + run: ./main.sh + timeout: 15m + - multipath_conf_syntax: + run: ./main.sh + timeout: 15m + - alias_clash: + run: ./main.sh + timeout: 15m + required_packages: + - device-mapper-multipath + - perl