diff --git a/0460-ci-use-source-git-automation-composite-Action.patch b/0460-ci-use-source-git-automation-composite-Action.patch new file mode 100644 index 0000000..0c8a98e --- /dev/null +++ b/0460-ci-use-source-git-automation-composite-Action.patch @@ -0,0 +1,189 @@ +From bf287f49fab60f47dd2547cdc3653fed53af3b21 Mon Sep 17 00:00:00 2001 +From: Jan Macku +Date: Fri, 12 Jan 2024 15:25:14 +0100 +Subject: [PATCH] ci: use source-git-automation composite Action + +This will allow us maintain the source-git automation in separate repo +and reduce the duplication of the code and noise in the systemd repo. + +rhel-only + +Related: RHEL-1086 +--- + .../source-git-automation-on-demand.yml | 61 ++-------------- + .github/workflows/source-git-automation.yml | 72 ++----------------- + 2 files changed, 12 insertions(+), 121 deletions(-) + +diff --git a/.github/workflows/source-git-automation-on-demand.yml b/.github/workflows/source-git-automation-on-demand.yml +index 3f3da959c4..90149e74bb 100644 +--- a/.github/workflows/source-git-automation-on-demand.yml ++++ b/.github/workflows/source-git-automation-on-demand.yml +@@ -1,5 +1,3 @@ +---- +- + name: Source git Automation Scheduled/On Demand + on: + schedule: +@@ -59,62 +57,17 @@ jobs: + matrix: + pr-number: ${{ inputs.pr-number == 0 && fromJSON(needs.gather-pull-requests.outputs.pr-numbers) || fromJSON(needs.gather-pull-requests.outputs.pr-numbers-manual) }} + +- permissions: write-all +- # contents: write +- # statuses: write +- # checks: write +- # pull-requests: write ++ permissions: ++ # required for merging PRs ++ contents: write ++ # required for PR comments and setting labels ++ pull-requests: write + + steps: +- - name: Repository checkout +- uses: actions/checkout@v3 +- +- - id: metadata +- name: Gather Pull Request Metadata +- uses: redhat-plumbers-in-action/gather-pull-request-metadata@v1 ++ - name: Source-git Automation ++ uses: redhat-plumbers-in-action/source-git-automation@v1 + with: + pr-number: ${{ matrix.pr-number }} +- +- - if: ${{ !cancelled() }} +- id: commit-linter +- name: Lint Commits +- uses: redhat-plumbers-in-action/advanced-commit-linter@v2 +- with: +- pr-metadata: ${{ steps.metadata.outputs.metadata }} +- token: ${{ secrets.GITHUB_TOKEN }} +- +- # Validates tracker, changes tracker status, updates PR title +- - if: ${{ !cancelled() }} +- id: tracker-validator +- name: Validate Tracker +- uses: redhat-plumbers-in-action/tracker-validator@v1 +- with: +- pr-metadata: ${{ steps.metadata.outputs.metadata }} +- component: systemd +- tracker: ${{ fromJSON(steps.commit-linter.outputs.validated-pr-metadata).validation.tracker.id }} +- tracker-type: ${{ fromJSON(steps.commit-linter.outputs.validated-pr-metadata).validation.tracker.type }} +- bugzilla-instance: https://bugzilla.redhat.com +- bugzilla-api-token: ${{ secrets.BUGZILLA_API_TOKEN }} +- jira-instance: https://issues.redhat.com +- jira-api-token: ${{ secrets.JIRA_API_TOKEN }} +- token: ${{ secrets.GITHUB_TOKEN }} +- +- - if: ${{ !cancelled() }} +- name: Pull Request Validator +- uses: redhat-plumbers-in-action/pull-request-validator@v1 +- with: +- pr-metadata: ${{ steps.metadata.outputs.metadata }} +- token: ${{ secrets.GITHUB_TOKEN }} +- +- - id: auto-merge +- name: Auto Merge +- uses: redhat-plumbers-in-action/auto-merge@v1 +- with: +- pr-metadata: ${{ steps.metadata.outputs.metadata }} +- tracker: ${{ fromJSON(steps.commit-linter.outputs.validated-pr-metadata).validation.tracker.id }} +- tracker-type: ${{ fromJSON(steps.commit-linter.outputs.validated-pr-metadata).validation.tracker.type }} +- bugzilla-instance: https://bugzilla.redhat.com + bugzilla-api-token: ${{ secrets.BUGZILLA_API_TOKEN }} +- jira-instance: https://issues.redhat.com + jira-api-token: ${{ secrets.JIRA_API_TOKEN }} + token: ${{ secrets.GITHUB_TOKEN }} +diff --git a/.github/workflows/source-git-automation.yml b/.github/workflows/source-git-automation.yml +index 17135b590f..776ac5b237 100644 +--- a/.github/workflows/source-git-automation.yml ++++ b/.github/workflows/source-git-automation.yml +@@ -26,83 +26,21 @@ jobs: + with: + name: pr-metadata + +- commit-linter: ++ source-git-automation: + needs: [ download-metadata ] + runs-on: ubuntu-latest + +- outputs: +- validated-pr-metadata: ${{ steps.commit-linter.outputs.validated-pr-metadata }} +- +- permissions: +- statuses: write +- checks: write +- pull-requests: write +- +- steps: +- - id: commit-linter +- name: Lint Commits +- uses: redhat-plumbers-in-action/advanced-commit-linter@v2 +- with: +- pr-metadata: ${{ needs.download-metadata.outputs.pr-metadata }} +- token: ${{ secrets.GITHUB_TOKEN }} +- +- # Validates tracker, changes tracker status, updates PR title +- tracker-validator: +- if: ${{ !cancelled() }} +- needs: [ download-metadata, commit-linter ] +- runs-on: ubuntu-latest +- +- permissions: +- checks: write +- pull-requests: write +- +- steps: +- - name: Validate Tracker +- uses: redhat-plumbers-in-action/tracker-validator@v1 +- with: +- pr-metadata: ${{ needs.download-metadata.outputs.pr-metadata }} +- component: systemd +- tracker: ${{ fromJSON(needs.commit-linter.outputs.validated-pr-metadata).validation.tracker.id }} +- tracker-type: ${{ fromJSON(needs.commit-linter.outputs.validated-pr-metadata).validation.tracker.type }} +- bugzilla-instance: https://bugzilla.redhat.com +- bugzilla-api-token: ${{ secrets.BUGZILLA_API_TOKEN }} +- jira-instance: https://issues.redhat.com +- jira-api-token: ${{ secrets.JIRA_API_TOKEN }} +- token: ${{ secrets.GITHUB_TOKEN }} +- +- pull-request-validator: +- needs: [ download-metadata ] +- runs-on: ubuntu-latest +- +- permissions: +- checks: write +- pull-requests: write +- +- steps: +- - name: Pull Request Validator +- uses: redhat-plumbers-in-action/pull-request-validator@v1 +- with: +- pr-metadata: ${{ needs.download-metadata.outputs.pr-metadata }} +- token: ${{ secrets.GITHUB_TOKEN }} +- +- auto-merge: +- needs: [ download-metadata, commit-linter, tracker-validator, pull-request-validator ] +- runs-on: ubuntu-latest +- + permissions: ++ # required for merging PRs + contents: write +- checks: write ++ # required for PR comments and setting labels + pull-requests: write + + steps: +- - name: Auto Merge +- uses: redhat-plumbers-in-action/auto-merge@v1 ++ - name: Source-git Automation ++ uses: redhat-plumbers-in-action/source-git-automation@v1 + with: + pr-metadata: ${{ needs.download-metadata.outputs.pr-metadata }} +- tracker: ${{ fromJSON(needs.commit-linter.outputs.validated-pr-metadata).validation.tracker.id }} +- tracker-type: ${{ fromJSON(needs.commit-linter.outputs.validated-pr-metadata).validation.tracker.type }} +- bugzilla-instance: https://bugzilla.redhat.com + bugzilla-api-token: ${{ secrets.BUGZILLA_API_TOKEN }} +- jira-instance: https://issues.redhat.com + jira-api-token: ${{ secrets.JIRA_API_TOKEN }} + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/0461-ci-increase-the-cron-interval-to-45-minutes.patch b/0461-ci-increase-the-cron-interval-to-45-minutes.patch new file mode 100644 index 0000000..ebc1397 --- /dev/null +++ b/0461-ci-increase-the-cron-interval-to-45-minutes.patch @@ -0,0 +1,29 @@ +From 5f98f309ccc71db57b93392c4f6427df620b8f53 Mon Sep 17 00:00:00 2001 +From: Jan Macku +Date: Fri, 12 Jan 2024 15:27:56 +0100 +Subject: [PATCH] ci: increase the cron interval to 45 minutes + +This should help us to avoid hitting the rate limit on the GitHub API. + +rhel-only + +Related: RHEL-1086 +--- + .github/workflows/source-git-automation-on-demand.yml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/.github/workflows/source-git-automation-on-demand.yml b/.github/workflows/source-git-automation-on-demand.yml +index 90149e74bb..b5ccb891d1 100644 +--- a/.github/workflows/source-git-automation-on-demand.yml ++++ b/.github/workflows/source-git-automation-on-demand.yml +@@ -1,8 +1,8 @@ + name: Source git Automation Scheduled/On Demand + on: + schedule: +- # Workflow runs every 15 minutes +- - cron: '*/15 * * * *' ++ # Workflow runs every 45 minutes ++ - cron: '*/45 * * * *' + workflow_dispatch: + inputs: + pr-number: diff --git a/0462-ci-add-all-Z-Stream-versions-to-array-of-allowed-ver.patch b/0462-ci-add-all-Z-Stream-versions-to-array-of-allowed-ver.patch new file mode 100644 index 0000000..5f46659 --- /dev/null +++ b/0462-ci-add-all-Z-Stream-versions-to-array-of-allowed-ver.patch @@ -0,0 +1,39 @@ +From 5701905d024afc00a650ff2f2461570497694edb Mon Sep 17 00:00:00 2001 +From: Jan Macku +Date: Fri, 12 Jan 2024 15:32:27 +0100 +Subject: [PATCH] ci: add all Z-Stream versions to array of allowed versions + +rhel-only + +Related: RHEL-1086 +--- + .github/tracker-validator.yml | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/.github/tracker-validator.yml b/.github/tracker-validator.yml +index 9e43e4e7d5..f88cc0a572 100644 +--- a/.github/tracker-validator.yml ++++ b/.github/tracker-validator.yml +@@ -7,12 +7,22 @@ products: + - Red Hat Enterprise Linux 9 + - CentOS Stream 9 + - rhel-9.0.0 ++ - rhel-9.0.0.z + - rhel-9.2.0 ++ - rhel-9.2.0.z + - rhel-9.3.0 ++ - rhel-9.3.0.z + - rhel-9.4.0 ++ - rhel-9.4.0.z + - rhel-9.5.0 ++ - rhel-9.5.0.z + - rhel-9.6.0 ++ - rhel-9.6.0.z + - rhel-9.7.0 ++ - rhel-9.7.0.z + - rhel-9.8.0 ++ - rhel-9.8.0.z + - rhel-9.9.0 ++ - rhel-9.9.0.z + - rhel-9.10.0 ++ - rhel-9.10.0.z diff --git a/0463-udev-net_id-introduce-naming-scheme-for-RHEL-9.4.patch b/0463-udev-net_id-introduce-naming-scheme-for-RHEL-9.4.patch new file mode 100644 index 0000000..b353eef --- /dev/null +++ b/0463-udev-net_id-introduce-naming-scheme-for-RHEL-9.4.patch @@ -0,0 +1,55 @@ +From 63b7060ef28895ce56bb058912e8e81bd00b8395 Mon Sep 17 00:00:00 2001 +From: Jan Macku +Date: Tue, 23 Jan 2024 15:23:05 +0100 +Subject: [PATCH] udev/net_id: introduce naming scheme for RHEL-9.4 + +rhel-only + +Resolves: RHEL-22427 +--- + man/systemd.net-naming-scheme.xml | 6 ++++++ + src/shared/netif-naming-scheme.c | 1 + + src/shared/netif-naming-scheme.h | 1 + + 3 files changed, 8 insertions(+) + +diff --git a/man/systemd.net-naming-scheme.xml b/man/systemd.net-naming-scheme.xml +index 639c03262f..4f06587ec9 100644 +--- a/man/systemd.net-naming-scheme.xml ++++ b/man/systemd.net-naming-scheme.xml +@@ -582,6 +582,12 @@ + + + ++ ++ rhel-9.4 ++ ++ Same as naming scheme rhel-9.3. ++ ++ + + + Note that latest may be used to denote the latest scheme known (to this +diff --git a/src/shared/netif-naming-scheme.c b/src/shared/netif-naming-scheme.c +index e73c265371..bf27f5571b 100644 +--- a/src/shared/netif-naming-scheme.c ++++ b/src/shared/netif-naming-scheme.c +@@ -42,6 +42,7 @@ static const NamingScheme naming_schemes[] = { + { "rhel-9.1", NAMING_RHEL_9_1 }, + { "rhel-9.2", NAMING_RHEL_9_2 }, + { "rhel-9.3", NAMING_RHEL_9_3 }, ++ { "rhel-9.4", NAMING_RHEL_9_4 }, + /* … add more schemes here, as the logic to name devices is updated … */ + + EXTRA_NET_NAMING_MAP +diff --git a/src/shared/netif-naming-scheme.h b/src/shared/netif-naming-scheme.h +index 3baa7d5e72..f39c75c64e 100644 +--- a/src/shared/netif-naming-scheme.h ++++ b/src/shared/netif-naming-scheme.h +@@ -70,6 +70,7 @@ typedef enum NamingSchemeFlags { + NAMING_RHEL_9_1 = NAMING_RHEL_9_0, + NAMING_RHEL_9_2 = NAMING_RHEL_9_0, + NAMING_RHEL_9_3 = NAMING_RHEL_9_0 | NAMING_SR_IOV_R, ++ NAMING_RHEL_9_4 = NAMING_RHEL_9_3, + + EXTRA_NET_NAMING_SCHEMES + diff --git a/0464-basic-errno-util-add-wrappers-which-only-accept-nega.patch b/0464-basic-errno-util-add-wrappers-which-only-accept-nega.patch new file mode 100644 index 0000000..e5c0e66 --- /dev/null +++ b/0464-basic-errno-util-add-wrappers-which-only-accept-nega.patch @@ -0,0 +1,204 @@ +From 690c7cdadd1033bfb47e8de5cc9db781a6055e2a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= +Date: Wed, 9 Aug 2023 16:36:38 +0200 +Subject: [PATCH] basic/errno-util: add wrappers which only accept negative + errno + +We do 'IN_SET(r, -CONST1, -CONST2)', instead of 'IN_SET(-r, CONST1, CONST2)' +because -r is undefined if r is the minimum value (i.e. INT_MIN). But we know +that the constants are small, so their negative values are fine. + +(cherry picked from commit b0be985cdd5e51f5f16d6bf541435c225f7c0633) + +Related: RHEL-22443 +--- + src/basic/errno-util.h | 129 +++++++++++++++++++++---------------- + src/test/test-errno-util.c | 7 ++ + 2 files changed, 80 insertions(+), 56 deletions(-) + +diff --git a/src/basic/errno-util.h b/src/basic/errno-util.h +index 091f99c590..be5c04e285 100644 +--- a/src/basic/errno-util.h ++++ b/src/basic/errno-util.h +@@ -84,12 +84,21 @@ static inline int errno_or_else(int fallback) { + return -abs(fallback); + } + ++/* abs(3) says: Trying to take the absolute value of the most negative integer is not defined. */ ++#define _DEFINE_ABS_WRAPPER(name) \ ++ static inline bool ERRNO_IS_##name(int r) { \ ++ if (r == INT_MIN) \ ++ return false; \ ++ return ERRNO_IS_NEG_##name(-abs(r)); \ ++ } ++ + /* For send()/recv() or read()/write(). */ +-static inline bool ERRNO_IS_TRANSIENT(int r) { +- return IN_SET(abs(r), +- EAGAIN, +- EINTR); ++static inline bool ERRNO_IS_NEG_TRANSIENT(int r) { ++ return IN_SET(r, ++ -EAGAIN, ++ -EINTR); + } ++_DEFINE_ABS_WRAPPER(TRANSIENT); + + /* Hint #1: ENETUNREACH happens if we try to connect to "non-existing" special IP addresses, such as ::5. + * +@@ -98,79 +107,87 @@ static inline bool ERRNO_IS_TRANSIENT(int r) { + * + * Hint #3: When asynchronous connect() on TCP fails because the host never acknowledges a single packet, + * kernel tells us that with ETIMEDOUT, see tcp(7). */ +-static inline bool ERRNO_IS_DISCONNECT(int r) { +- return IN_SET(abs(r), +- ECONNABORTED, +- ECONNREFUSED, +- ECONNRESET, +- EHOSTDOWN, +- EHOSTUNREACH, +- ENETDOWN, +- ENETRESET, +- ENETUNREACH, +- ENONET, +- ENOPROTOOPT, +- ENOTCONN, +- EPIPE, +- EPROTO, +- ESHUTDOWN, +- ETIMEDOUT); ++static inline bool ERRNO_IS_NEG_DISCONNECT(int r) { ++ return IN_SET(r, ++ -ECONNABORTED, ++ -ECONNREFUSED, ++ -ECONNRESET, ++ -EHOSTDOWN, ++ -EHOSTUNREACH, ++ -ENETDOWN, ++ -ENETRESET, ++ -ENETUNREACH, ++ -ENONET, ++ -ENOPROTOOPT, ++ -ENOTCONN, ++ -EPIPE, ++ -EPROTO, ++ -ESHUTDOWN, ++ -ETIMEDOUT); + } ++_DEFINE_ABS_WRAPPER(DISCONNECT); + + /* Transient errors we might get on accept() that we should ignore. As per error handling comment in + * the accept(2) man page. */ +-static inline bool ERRNO_IS_ACCEPT_AGAIN(int r) { +- return ERRNO_IS_DISCONNECT(r) || +- ERRNO_IS_TRANSIENT(r) || +- abs(r) == EOPNOTSUPP; ++static inline bool ERRNO_IS_NEG_ACCEPT_AGAIN(int r) { ++ return ERRNO_IS_NEG_DISCONNECT(r) || ++ ERRNO_IS_NEG_TRANSIENT(r) || ++ r == -EOPNOTSUPP; + } ++_DEFINE_ABS_WRAPPER(ACCEPT_AGAIN); + + /* Resource exhaustion, could be our fault or general system trouble */ +-static inline bool ERRNO_IS_RESOURCE(int r) { +- return IN_SET(abs(r), +- EMFILE, +- ENFILE, +- ENOMEM); ++static inline bool ERRNO_IS_NEG_RESOURCE(int r) { ++ return IN_SET(r, ++ -EMFILE, ++ -ENFILE, ++ -ENOMEM); + } ++_DEFINE_ABS_WRAPPER(RESOURCE); + + /* Seven different errors for "operation/system call/ioctl/socket feature not supported" */ +-static inline bool ERRNO_IS_NOT_SUPPORTED(int r) { +- return IN_SET(abs(r), +- EOPNOTSUPP, +- ENOTTY, +- ENOSYS, +- EAFNOSUPPORT, +- EPFNOSUPPORT, +- EPROTONOSUPPORT, +- ESOCKTNOSUPPORT); ++static inline bool ERRNO_IS_NEG_NOT_SUPPORTED(int r) { ++ return IN_SET(r, ++ -EOPNOTSUPP, ++ -ENOTTY, ++ -ENOSYS, ++ -EAFNOSUPPORT, ++ -EPFNOSUPPORT, ++ -EPROTONOSUPPORT, ++ -ESOCKTNOSUPPORT); + } ++_DEFINE_ABS_WRAPPER(NOT_SUPPORTED); + + /* Two different errors for access problems */ +-static inline bool ERRNO_IS_PRIVILEGE(int r) { +- return IN_SET(abs(r), +- EACCES, +- EPERM); ++static inline bool ERRNO_IS_NEG_PRIVILEGE(int r) { ++ return IN_SET(r, ++ -EACCES, ++ -EPERM); + } ++_DEFINE_ABS_WRAPPER(PRIVILEGE); + + /* Three different errors for "not enough disk space" */ +-static inline bool ERRNO_IS_DISK_SPACE(int r) { +- return IN_SET(abs(r), +- ENOSPC, +- EDQUOT, +- EFBIG); ++static inline bool ERRNO_IS_NEG_DISK_SPACE(int r) { ++ return IN_SET(r, ++ -ENOSPC, ++ -EDQUOT, ++ -EFBIG); + } ++_DEFINE_ABS_WRAPPER(DISK_SPACE); + + /* Three different errors for "this device does not quite exist" */ +-static inline bool ERRNO_IS_DEVICE_ABSENT(int r) { +- return IN_SET(abs(r), +- ENODEV, +- ENXIO, +- ENOENT); ++static inline bool ERRNO_IS_NEG_DEVICE_ABSENT(int r) { ++ return IN_SET(r, ++ -ENODEV, ++ -ENXIO, ++ -ENOENT); + } ++_DEFINE_ABS_WRAPPER(DEVICE_ABSENT); + + /* Quite often we want to handle cases where the backing FS doesn't support extended attributes at all and + * where it simply doesn't have the requested xattr the same way */ +-static inline bool ERRNO_IS_XATTR_ABSENT(int r) { +- return abs(r) == ENODATA || +- ERRNO_IS_NOT_SUPPORTED(r); ++static inline bool ERRNO_IS_NEG_XATTR_ABSENT(int r) { ++ return r == -ENODATA || ++ ERRNO_IS_NEG_NOT_SUPPORTED(r); + } ++_DEFINE_ABS_WRAPPER(XATTR_ABSENT); +diff --git a/src/test/test-errno-util.c b/src/test/test-errno-util.c +index f858927c92..507d53df7a 100644 +--- a/src/test/test-errno-util.c ++++ b/src/test/test-errno-util.c +@@ -47,4 +47,11 @@ TEST(STRERROR_OR_ELSE) { + log_info("STRERROR_OR_ELSE(-EPERM, \"EOF\") → %s", STRERROR_OR_EOF(-EPERM)); + } + ++TEST(ERRNO_IS_TRANSIENT) { ++ assert_se( ERRNO_IS_NEG_TRANSIENT(-EINTR)); ++ assert_se(!ERRNO_IS_NEG_TRANSIENT(EINTR)); ++ assert_se( ERRNO_IS_TRANSIENT(-EINTR)); ++ assert_se( ERRNO_IS_TRANSIENT(EINTR)); ++} ++ + DEFINE_TEST_MAIN(LOG_INFO); diff --git a/0465-errno-util-allow-ERRNO_IS_-to-accept-types-wider-tha.patch b/0465-errno-util-allow-ERRNO_IS_-to-accept-types-wider-tha.patch new file mode 100644 index 0000000..638560f --- /dev/null +++ b/0465-errno-util-allow-ERRNO_IS_-to-accept-types-wider-tha.patch @@ -0,0 +1,148 @@ +From 7c5ece0b649ebea23ebb28eb3cafdb28ba49a9d0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= +Date: Wed, 9 Aug 2023 18:21:13 +0200 +Subject: [PATCH] errno-util: allow ERRNO_IS_* to accept types wider than int + +This is useful if the variable is ssize_t and we don't want to trigger a +warning or truncation. + +With gcc (gcc-13.2.1-1.fc38.x86_64), the resulting systemd binary is identical, +so I assume that the compiler is able to completely optimize away the type. + +(cherry picked from commit fe0feacb9e9641874fde459af4067d9b7e9d7462) + +Related: RHEL-22443 +--- + src/basic/errno-util.h | 27 +++++++++++++++------------ + src/test/test-errno-util.c | 13 +++++++++++++ + 2 files changed, 28 insertions(+), 12 deletions(-) + +diff --git a/src/basic/errno-util.h b/src/basic/errno-util.h +index be5c04e285..b10dd755c9 100644 +--- a/src/basic/errno-util.h ++++ b/src/basic/errno-util.h +@@ -1,6 +1,7 @@ + /* SPDX-License-Identifier: LGPL-2.1-or-later */ + #pragma once + ++#include + #include + #include + +@@ -86,14 +87,16 @@ static inline int errno_or_else(int fallback) { + + /* abs(3) says: Trying to take the absolute value of the most negative integer is not defined. */ + #define _DEFINE_ABS_WRAPPER(name) \ +- static inline bool ERRNO_IS_##name(int r) { \ +- if (r == INT_MIN) \ ++ static inline bool ERRNO_IS_##name(intmax_t r) { \ ++ if (r == INTMAX_MIN) \ + return false; \ +- return ERRNO_IS_NEG_##name(-abs(r)); \ ++ return ERRNO_IS_NEG_##name(-imaxabs(r)); \ + } + ++assert_cc(INT_MAX <= INTMAX_MAX); ++ + /* For send()/recv() or read()/write(). */ +-static inline bool ERRNO_IS_NEG_TRANSIENT(int r) { ++static inline bool ERRNO_IS_NEG_TRANSIENT(intmax_t r) { + return IN_SET(r, + -EAGAIN, + -EINTR); +@@ -107,7 +110,7 @@ _DEFINE_ABS_WRAPPER(TRANSIENT); + * + * Hint #3: When asynchronous connect() on TCP fails because the host never acknowledges a single packet, + * kernel tells us that with ETIMEDOUT, see tcp(7). */ +-static inline bool ERRNO_IS_NEG_DISCONNECT(int r) { ++static inline bool ERRNO_IS_NEG_DISCONNECT(intmax_t r) { + return IN_SET(r, + -ECONNABORTED, + -ECONNREFUSED, +@@ -129,7 +132,7 @@ _DEFINE_ABS_WRAPPER(DISCONNECT); + + /* Transient errors we might get on accept() that we should ignore. As per error handling comment in + * the accept(2) man page. */ +-static inline bool ERRNO_IS_NEG_ACCEPT_AGAIN(int r) { ++static inline bool ERRNO_IS_NEG_ACCEPT_AGAIN(intmax_t r) { + return ERRNO_IS_NEG_DISCONNECT(r) || + ERRNO_IS_NEG_TRANSIENT(r) || + r == -EOPNOTSUPP; +@@ -137,7 +140,7 @@ static inline bool ERRNO_IS_NEG_ACCEPT_AGAIN(int r) { + _DEFINE_ABS_WRAPPER(ACCEPT_AGAIN); + + /* Resource exhaustion, could be our fault or general system trouble */ +-static inline bool ERRNO_IS_NEG_RESOURCE(int r) { ++static inline bool ERRNO_IS_NEG_RESOURCE(intmax_t r) { + return IN_SET(r, + -EMFILE, + -ENFILE, +@@ -146,7 +149,7 @@ static inline bool ERRNO_IS_NEG_RESOURCE(int r) { + _DEFINE_ABS_WRAPPER(RESOURCE); + + /* Seven different errors for "operation/system call/ioctl/socket feature not supported" */ +-static inline bool ERRNO_IS_NEG_NOT_SUPPORTED(int r) { ++static inline bool ERRNO_IS_NEG_NOT_SUPPORTED(intmax_t r) { + return IN_SET(r, + -EOPNOTSUPP, + -ENOTTY, +@@ -159,7 +162,7 @@ static inline bool ERRNO_IS_NEG_NOT_SUPPORTED(int r) { + _DEFINE_ABS_WRAPPER(NOT_SUPPORTED); + + /* Two different errors for access problems */ +-static inline bool ERRNO_IS_NEG_PRIVILEGE(int r) { ++static inline bool ERRNO_IS_NEG_PRIVILEGE(intmax_t r) { + return IN_SET(r, + -EACCES, + -EPERM); +@@ -167,7 +170,7 @@ static inline bool ERRNO_IS_NEG_PRIVILEGE(int r) { + _DEFINE_ABS_WRAPPER(PRIVILEGE); + + /* Three different errors for "not enough disk space" */ +-static inline bool ERRNO_IS_NEG_DISK_SPACE(int r) { ++static inline bool ERRNO_IS_NEG_DISK_SPACE(intmax_t r) { + return IN_SET(r, + -ENOSPC, + -EDQUOT, +@@ -176,7 +179,7 @@ static inline bool ERRNO_IS_NEG_DISK_SPACE(int r) { + _DEFINE_ABS_WRAPPER(DISK_SPACE); + + /* Three different errors for "this device does not quite exist" */ +-static inline bool ERRNO_IS_NEG_DEVICE_ABSENT(int r) { ++static inline bool ERRNO_IS_NEG_DEVICE_ABSENT(intmax_t r) { + return IN_SET(r, + -ENODEV, + -ENXIO, +@@ -186,7 +189,7 @@ _DEFINE_ABS_WRAPPER(DEVICE_ABSENT); + + /* Quite often we want to handle cases where the backing FS doesn't support extended attributes at all and + * where it simply doesn't have the requested xattr the same way */ +-static inline bool ERRNO_IS_NEG_XATTR_ABSENT(int r) { ++static inline bool ERRNO_IS_NEG_XATTR_ABSENT(intmax_t r) { + return r == -ENODATA || + ERRNO_IS_NEG_NOT_SUPPORTED(r); + } +diff --git a/src/test/test-errno-util.c b/src/test/test-errno-util.c +index 507d53df7a..cac0d5402b 100644 +--- a/src/test/test-errno-util.c ++++ b/src/test/test-errno-util.c +@@ -52,6 +52,19 @@ TEST(ERRNO_IS_TRANSIENT) { + assert_se(!ERRNO_IS_NEG_TRANSIENT(EINTR)); + assert_se( ERRNO_IS_TRANSIENT(-EINTR)); + assert_se( ERRNO_IS_TRANSIENT(EINTR)); ++ ++ /* Test with type wider than int */ ++ ssize_t r = -EAGAIN; ++ assert_se( ERRNO_IS_NEG_TRANSIENT(r)); ++ ++ /* On 64-bit arches, now (int) r == EAGAIN */ ++ r = SSIZE_MAX - EAGAIN + 1; ++ assert_se(!ERRNO_IS_NEG_TRANSIENT(r)); ++ ++ assert_se(!ERRNO_IS_NEG_TRANSIENT(INT_MAX)); ++ assert_se(!ERRNO_IS_NEG_TRANSIENT(INT_MIN)); ++ assert_se(!ERRNO_IS_NEG_TRANSIENT(INTMAX_MAX)); ++ assert_se(!ERRNO_IS_NEG_TRANSIENT(INTMAX_MIN)); + } + + DEFINE_TEST_MAIN(LOG_INFO); diff --git a/0466-udev-add-new-builtin-net_driver.patch b/0466-udev-add-new-builtin-net_driver.patch new file mode 100644 index 0000000..156930d --- /dev/null +++ b/0466-udev-add-new-builtin-net_driver.patch @@ -0,0 +1,184 @@ +From f2bf171137c348f6f976276504c8e8a54e33ff78 Mon Sep 17 00:00:00 2001 +From: Lukas Nykryn +Date: Thu, 19 Oct 2023 10:38:06 +0200 +Subject: [PATCH] udev: add new builtin net_driver + +Currently the ID_NET_DRIVER is set in net_setup_link builtin. +But this is called pretty late in the udev processing chain. + +Right now in some custom rules it was workarounded by calling ethtool +binary directly, which is ugly. + +So let's split this code to a separate builtin. + +(cherry picked from commit 2b5b25f123ceb89b3ff45b2380db1c8a88b046d9) + +Resolves: RHEL-22443 +--- + rules.d/50-udev-default.rules.in | 2 ++ + src/udev/meson.build | 1 + + src/udev/net/link-config.c | 5 ++- + src/udev/net/link-config.h | 2 +- + src/udev/udev-builtin-net_driver.c | 43 ++++++++++++++++++++++++++ + src/udev/udev-builtin-net_setup_link.c | 3 -- + src/udev/udev-builtin.c | 1 + + src/udev/udev-builtin.h | 2 ++ + 8 files changed, 52 insertions(+), 7 deletions(-) + create mode 100644 src/udev/udev-builtin-net_driver.c + +diff --git a/rules.d/50-udev-default.rules.in b/rules.d/50-udev-default.rules.in +index 843bdaf9ce..f670b51987 100644 +--- a/rules.d/50-udev-default.rules.in ++++ b/rules.d/50-udev-default.rules.in +@@ -17,6 +17,8 @@ SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100" + SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb" + ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}" + ++SUBSYSTEM=="net", IMPORT{builtin}="net_driver" ++ + ACTION!="add", GOTO="default_end" + + SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666" +diff --git a/src/udev/meson.build b/src/udev/meson.build +index 08a1d97e81..564aa6de1b 100644 +--- a/src/udev/meson.build ++++ b/src/udev/meson.build +@@ -35,6 +35,7 @@ libudevd_core_sources = files( + 'udev-builtin-hwdb.c', + 'udev-builtin-input_id.c', + 'udev-builtin-keyboard.c', ++ 'udev-builtin-net_driver.c', + 'udev-builtin-net_id.c', + 'udev-builtin-net_setup_link.c', + 'udev-builtin-path_id.c', +diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c +index 2d8c902fd3..80c64519ab 100644 +--- a/src/udev/net/link-config.c ++++ b/src/udev/net/link-config.c +@@ -362,7 +362,6 @@ Link *link_free(Link *link) { + + sd_device_unref(link->device); + free(link->kind); +- free(link->driver); + strv_free(link->altnames); + return mfree(link); + } +@@ -415,8 +414,8 @@ int link_new(LinkConfigContext *ctx, sd_netlink **rtnl, sd_device *device, Link + log_link_debug_errno(link, r, "Failed to get permanent hardware address, ignoring: %m"); + } + +- r = ethtool_get_driver(&ctx->ethtool_fd, link->ifname, &link->driver); +- if (r < 0) ++ r = sd_device_get_property_value(link->device, "ID_NET_DRIVER", &link->driver); ++ if (r < 0 && r != -ENOENT) + log_link_debug_errno(link, r, "Failed to get driver, ignoring: %m"); + + *ret = TAKE_PTR(link); +diff --git a/src/udev/net/link-config.h b/src/udev/net/link-config.h +index 874a391543..8343783caf 100644 +--- a/src/udev/net/link-config.h ++++ b/src/udev/net/link-config.h +@@ -34,7 +34,7 @@ typedef struct Link { + sd_device_action_t action; + + char *kind; +- char *driver; ++ const char *driver; + uint16_t iftype; + uint32_t flags; + struct hw_addr_data hw_addr; +diff --git a/src/udev/udev-builtin-net_driver.c b/src/udev/udev-builtin-net_driver.c +new file mode 100644 +index 0000000000..f1642a491d +--- /dev/null ++++ b/src/udev/udev-builtin-net_driver.c +@@ -0,0 +1,43 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++ ++#include "alloc-util.h" ++#include "device-util.h" ++#include "errno-util.h" ++#include "ethtool-util.h" ++#include "fd-util.h" ++#include "log.h" ++#include "string-util.h" ++#include "udev-builtin.h" ++ ++static int builtin_net_driver_set_driver(UdevEvent *event, int argc, char **argv, bool test) { ++ sd_device *dev = ASSERT_PTR(ASSERT_PTR(event)->dev); ++ _cleanup_close_ int ethtool_fd = -EBADF; ++ _cleanup_free_ char *driver = NULL; ++ const char *sysname; ++ int r; ++ ++ r = sd_device_get_sysname(dev, &sysname); ++ if (r < 0) ++ return log_device_warning_errno(dev, r, "Failed to get sysname: %m"); ++ ++ r = ethtool_get_driver(ðtool_fd, sysname, &driver); ++ if (ERRNO_IS_NEG_NOT_SUPPORTED(r)) { ++ log_device_debug_errno(dev, r, "Querying driver name via ethtool API is not supported by device '%s', ignoring: %m", sysname); ++ return 0; ++ } ++ if (r == -ENODEV) { ++ log_device_debug_errno(dev, r, "Device already vanished, ignoring."); ++ return 0; ++ } ++ if (r < 0) ++ return log_device_warning_errno(dev, r, "Failed to get driver for '%s': %m", sysname); ++ ++ return udev_builtin_add_property(event->dev, test, "ID_NET_DRIVER", driver); ++} ++ ++const UdevBuiltin udev_builtin_net_driver = { ++ .name = "net_driver", ++ .cmd = builtin_net_driver_set_driver, ++ .help = "Set driver for network device", ++ .run_once = true, ++}; +diff --git a/src/udev/udev-builtin-net_setup_link.c b/src/udev/udev-builtin-net_setup_link.c +index e964bf7bf4..b0279a1814 100644 +--- a/src/udev/udev-builtin-net_setup_link.c ++++ b/src/udev/udev-builtin-net_setup_link.c +@@ -26,9 +26,6 @@ static int builtin_net_setup_link(UdevEvent *event, int argc, char **argv, bool + if (r < 0) + return log_device_warning_errno(dev, r, "Failed to get link information: %m"); + +- if (link->driver) +- udev_builtin_add_property(dev, test, "ID_NET_DRIVER", link->driver); +- + r = link_get_config(ctx, link); + if (r < 0) { + if (r == -ENOENT) { +diff --git a/src/udev/udev-builtin.c b/src/udev/udev-builtin.c +index c84db8855c..d55dc3337d 100644 +--- a/src/udev/udev-builtin.c ++++ b/src/udev/udev-builtin.c +@@ -22,6 +22,7 @@ static const UdevBuiltin *const builtins[_UDEV_BUILTIN_MAX] = { + #if HAVE_KMOD + [UDEV_BUILTIN_KMOD] = &udev_builtin_kmod, + #endif ++ [UDEV_BUILTIN_NET_DRIVER] = &udev_builtin_net_driver, + [UDEV_BUILTIN_NET_ID] = &udev_builtin_net_id, + [UDEV_BUILTIN_NET_LINK] = &udev_builtin_net_setup_link, + [UDEV_BUILTIN_PATH_ID] = &udev_builtin_path_id, +diff --git a/src/udev/udev-builtin.h b/src/udev/udev-builtin.h +index 919d51e798..c23f2d1613 100644 +--- a/src/udev/udev-builtin.h ++++ b/src/udev/udev-builtin.h +@@ -19,6 +19,7 @@ typedef enum UdevBuiltinCommand { + #if HAVE_KMOD + UDEV_BUILTIN_KMOD, + #endif ++ UDEV_BUILTIN_NET_DRIVER, + UDEV_BUILTIN_NET_ID, + UDEV_BUILTIN_NET_LINK, + UDEV_BUILTIN_PATH_ID, +@@ -63,6 +64,7 @@ extern const UdevBuiltin udev_builtin_keyboard; + #if HAVE_KMOD + extern const UdevBuiltin udev_builtin_kmod; + #endif ++extern const UdevBuiltin udev_builtin_net_driver; + extern const UdevBuiltin udev_builtin_net_id; + extern const UdevBuiltin udev_builtin_net_setup_link; + extern const UdevBuiltin udev_builtin_path_id; diff --git a/0467-udev-net_id-introduce-naming-scheme-for-RHEL-8.10.patch b/0467-udev-net_id-introduce-naming-scheme-for-RHEL-8.10.patch new file mode 100644 index 0000000..ea5366f --- /dev/null +++ b/0467-udev-net_id-introduce-naming-scheme-for-RHEL-8.10.patch @@ -0,0 +1,55 @@ +From 9ff108d83a19557593c1d0f1687878377e898a54 Mon Sep 17 00:00:00 2001 +From: Lukas Nykryn +Date: Wed, 24 Jan 2024 13:49:21 +0100 +Subject: [PATCH] udev/net_id: introduce naming scheme for RHEL-8.10 + +rhel-only + +Resolves: RHEL-22427 +--- + man/systemd.net-naming-scheme.xml | 6 ++++++ + src/shared/netif-naming-scheme.c | 1 + + src/shared/netif-naming-scheme.h | 1 + + 3 files changed, 8 insertions(+) + +diff --git a/man/systemd.net-naming-scheme.xml b/man/systemd.net-naming-scheme.xml +index 4f06587ec9..3bab402e98 100644 +--- a/man/systemd.net-naming-scheme.xml ++++ b/man/systemd.net-naming-scheme.xml +@@ -547,6 +547,12 @@ + Same as naming scheme rhel-8.7. + + ++ ++ rhel-8.10 ++ ++ Same as naming scheme rhel-8.7. ++ ++ + + rhel-9.0 + +diff --git a/src/shared/netif-naming-scheme.c b/src/shared/netif-naming-scheme.c +index bf27f5571b..536ed44b21 100644 +--- a/src/shared/netif-naming-scheme.c ++++ b/src/shared/netif-naming-scheme.c +@@ -38,6 +38,7 @@ static const NamingScheme naming_schemes[] = { + { "rhel-8.7", NAMING_RHEL_8_7 }, + { "rhel-8.8", NAMING_RHEL_8_8 }, + { "rhel-8.9", NAMING_RHEL_8_9 }, ++ { "rhel-8.10", NAMING_RHEL_8_10 }, + { "rhel-9.0", NAMING_RHEL_9_0 }, + { "rhel-9.1", NAMING_RHEL_9_1 }, + { "rhel-9.2", NAMING_RHEL_9_2 }, +diff --git a/src/shared/netif-naming-scheme.h b/src/shared/netif-naming-scheme.h +index f39c75c64e..5f49157aaa 100644 +--- a/src/shared/netif-naming-scheme.h ++++ b/src/shared/netif-naming-scheme.h +@@ -65,6 +65,7 @@ typedef enum NamingSchemeFlags { + NAMING_RHEL_8_7 = NAMING_RHEL_8_4 | NAMING_SLOT_FUNCTION_ID | NAMING_16BIT_INDEX, + NAMING_RHEL_8_8 = NAMING_RHEL_8_7, + NAMING_RHEL_8_9 = NAMING_RHEL_8_7, ++ NAMING_RHEL_8_10 = NAMING_RHEL_8_7, + + NAMING_RHEL_9_0 = NAMING_V250 | NAMING_BRIDGE_MULTIFUNCTION_SLOT, + NAMING_RHEL_9_1 = NAMING_RHEL_9_0, diff --git a/systemd.spec b/systemd.spec index abb6241..a69e44f 100644 --- a/systemd.spec +++ b/systemd.spec @@ -21,7 +21,7 @@ Name: systemd Url: https://systemd.io Version: 252 -Release: 23%{?dist} +Release: 24%{?dist} # For a breakdown of the licensing, see README License: LGPLv2+ and MIT and GPLv2+ Summary: System and Service Manager @@ -537,6 +537,14 @@ Patch0456: 0456-logind-don-t-setup-idle-session-watch-for-lock-scree.patch Patch0457: 0457-logind-don-t-make-idle-action-timer-accuracy-more-co.patch Patch0458: 0458-logind-do-TTY-idle-logic-only-for-sessions-marked-as.patch Patch0459: 0459-meson-Properly-install-90-uki-copy.install.patch +Patch0460: 0460-ci-use-source-git-automation-composite-Action.patch +Patch0461: 0461-ci-increase-the-cron-interval-to-45-minutes.patch +Patch0462: 0462-ci-add-all-Z-Stream-versions-to-array-of-allowed-ver.patch +Patch0463: 0463-udev-net_id-introduce-naming-scheme-for-RHEL-9.4.patch +Patch0464: 0464-basic-errno-util-add-wrappers-which-only-accept-nega.patch +Patch0465: 0465-errno-util-allow-ERRNO_IS_-to-accept-types-wider-tha.patch +Patch0466: 0466-udev-add-new-builtin-net_driver.patch +Patch0467: 0467-udev-net_id-introduce-naming-scheme-for-RHEL-8.10.patch # Downstream-only patches (9000–9999) @@ -1380,6 +1388,16 @@ getent passwd systemd-oom &>/dev/null || useradd -r -l -g systemd-oom -d / -s /s %files standalone-sysusers -f .file-list-standalone-sysusers %changelog +* Wed Jan 24 2024 systemd maintenance team - 252-24 +- ci: use source-git-automation composite Action (RHEL-1086) +- ci: increase the cron interval to 45 minutes (RHEL-1086) +- ci: add all Z-Stream versions to array of allowed versions (RHEL-1086) +- udev/net_id: introduce naming scheme for RHEL-9.4 (RHEL-22427) +- basic/errno-util: add wrappers which only accept negative errno (RHEL-22443) +- errno-util: allow ERRNO_IS_* to accept types wider than int (RHEL-22443) +- udev: add new builtin net_driver (RHEL-22443) +- udev/net_id: introduce naming scheme for RHEL-8.10 (RHEL-22427) + * Fri Jan 12 2024 systemd maintenance team - 252-23 - logind: don't setup idle session watch for lock-screen and greeter (RHEL-20757) - logind: don't make idle action timer accuracy more coarse than timeout (RHEL-20757)