Architecture specific change in rpms/glibc.git
by githook-noreply@fedoraproject.org
The package rpms/glibc.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/glibc.git/commit/?id=dfaf15a32934....
Change:
-%ifarch ppc64le
Thanks.
Full change:
============
commit 4f55bd2df5c705c99f21e1d35941843212b3e3a1
Author: Florian Weimer <fweimer(a)redhat.com>
Date: Fri May 7 12:17:30 2021 +0200
Trim changelog
diff --git a/ChangeLog.old b/ChangeLog.old
index 2afbfc5..1434b92 100644
--- a/ChangeLog.old
+++ b/ChangeLog.old
@@ -1,3 +1,2224 @@
+* Wed Jan 27 2021 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-29
+- Auto-sync with upstream branch master,
+ commit df359a25ba6f6bda06104229fbfe284c1fb30915:
+- Revert "Make libc symbols hidden in static PIE" [BZ #27237]
+- benchtests: Do not build bench-timing-type with MODULE_NAME=libc
+- aarch64: Fix the list of tested IFUNC variants [BZ #26818]
+- Update INSTALL with package versions that are known to work
+- aarch64: Move and update the definition of MTE_ENABLED
+- Fix misplaced const
+- Update C-SKY libm-test-ulps
+- manual: Correct argument order in mount examples [BZ #27207]
+- linux: mips: Fix getdents64 fallback on mips64-n32
+- x86: Properly match CPU features in /proc/cpuinfo [BZ #27222]
+- x86-64: Update tst-glibc-hwcaps-2.c for x86-64 baseline
+- powerpc64: Select POWER9 machine for the scv instruction
+- x86: Check ifunc resolver with CPU_FEATURE_USABLE [BZ #27072]
+- Revert "linux: Move {f}xstat{at} to compat symbols" for static build
+- aarch64: revert memcpy optimze for kunpeng to avoid performance degradation
+- Make libc symbols hidden in static PIE
+- csu: Move static pie self relocation later [BZ #27072]
+- Use hidden visibility for early static PIE code
+- csu: Avoid weak ref for __ehdr_start in static PIE
+- configure: Check for static PIE support
+- elf: Avoid RELATIVE relocs in __tunables_init
+- elf: Make the tunable struct definition internal only
+- <sys/platform/x86.h>: Remove the C preprocessor magic
+- posix: Fix fnmatch.c on bootstrap
+- stdlib: Add testcase for BZ #26241
+- posix: Fix regex_internal.h on bootstrap
+- Use <startup.h> in __libc_init_secure
+- elf: Avoid RELATIVE relocation for _dl_sysinfo
+- libmvec: Add extra-test-objs to test-extras
+- Hurd: Add rtld-strncpy-c.c
+- Update MIPS libm-test-ulps.
+- Update arm libm-test-ulps.
+- Update powerpc-nofpu libm-test-ulps.
+- Update hppa libm-test-ulps
+- ARC: nofpu: Regenerate ulps
+- ld.so: Add --list-tunables to print tunable values
+- math/test-tgmath2: Fix fabs failure when no long double
+- x86: Move x86 processor cache info to cpu_features
+- Fix x86 build with --enable-tunable=no
+- ifuncmain6pie: Remove the circular IFUNC dependency [BZ #20019]
+
+* Tue Jan 26 2021 Fedora Release Engineering <releng(a)fedoraproject.org> - 2.32.9000-28
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
+
+* Sat Jan 23 2021 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-27
+- Introduce new glibc-doc.noarch subpackage (#1346925)
+- Move the reference manual info pages from glibc-devel to glibc-doc
+- Move debugger interface documentation from glibc to glibc-doc
+- Remove unnecessary README, INSTALL, NEWS files from glibc
+- Remove unnecessary README.timezone and gai.conf files from glibc-common
+
+* Thu Jan 14 2021 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-26
+- Deprecate nscd (#1905135)
+- https://fedoraproject.org/wiki/Changes/DeprecateNSCD
+
+* Wed Jan 13 2021 Carlos O'Donell <carlos(a)redhat.com> - 2.32.9000-25
+- Auto-sync with upstream branch master,
+ commit cf1290064598def8dfeddec3d86d98495aee1fba:
+- Use the right argument code in unnormal tests
+- ldconfig/x86: Store ISA level in cache and aux cache
+- elf: work around a gcc bug in elf_get_dynamic_info
+- x86: Set header.feature_1 in TCB for always-on CET [BZ #27177]
+- posix: consume less entropy on tempname
+- Makerules: Do not require startup files for format.lds probe object
+- install: Replace scripts/output-format.sed with objdump -f [BZ #26559]
+- math: Add BZ#18980 fix back on dbl-64 cosh
+- posix: Sync tempname with gnulib [BZ #26648]
+- posix: Fix return value of system if shell can not be executed [BZ #27053]
+- support: Add xchmod wrapper
+- Update STATX_ATTR_DAX value from Linux 5.10.
+- riscv: Initialize $gp before resolving the IRELATIVE relocation
+- riscv: support GNU indirect function
+- posix: Correct attribute access mode on readlinkat [BZ #27024].
+- Add xfchmod to libsupport
+- Add xchdir to libsupport.
+- POSIX locale: Fix typo in comment
+- ARC: Regenerate ulps
+- mntent: Use __putc_unlocked instead of fputc_unlocked
+- aarch64: define PI_STATIC_AND_HIDDEN
+- Update NEWS for CVE-2019-25013.
+- x86: Support GNU_PROPERTY_X86_ISA_1_V[234] marker [BZ #26717]
+- Remove dbl-64/wordsize-64 (part 2)
+- Remove dbl-64/wordsize-64
+- Add SEGV_MTEAERR and SEGV_MTESERR from Linux 5.10.
+- support: Add support_small_thread_stack_size
+- stdlib: Sync canonicalize with gnulib [BZ #10635] [BZ #26592] [BZ #26341] [BZ #24970]
+- malloc: Add scratch_buffer_dupfree
+- Import filename.h from gnulib
+- Import idx.h from gnulib
+- alpha: Provide wait4 for static library [BZ #27150]
+- aarch64: push the set of rules before falling into slow path
+- nptl: Fix comment typo in pthread_cond_wait.c
+- x86: Check IFUNC definition in unrelocated executable [BZ #20019]
+- hurd: Fix mmap(!MAP_FIXED) on bogus address
+
+* Mon Jan 04 2021 Florian Weimer <fweimer(a)redhat.com> - 2.32.9000-24
+- Drop glibc-fedora-__libc_multiple_libcs.patch. Replaced by upstream's
+ __libc_initial flag.
+- Adjust glibc-rh819430.patch to upstream's gnulib merge of fnmatch.
+- Disable -Werror again due to GCC PR98512.
+- Auto-sync with upstream branch master,
+ commit 3ec5d83d2a237d39e7fd6ef7a0bc8ac4c171a4a5:
+- x86-64: Avoid rep movsb with short distance [BZ #27130]
+- aarch64: fix stack missing after sp is updated
+- nptl: Remove set*id, set*gid files which are not built
+- Drop nan-pseudo-number.h usage from tests
+- posix: Sync fnmatch with gnulib
+- Sync flexmember.h with gnulib
+- Sync intprops.h with gnulib
+- posix: Sync glob code with gnulib
+- posix: Sync regex code with gnulib
+- Move generic nan-pseudo-number.h to ldbl-96
+- Sync FDL from https://www.gnu.org/licenses/fdl-1.3.texi
+- Sync move-if-change from Gnulib
+- Update automatically-generated copyright dates
+- Update copyright dates not handled by scripts/update-copyrights.
+- Update copyright dates with scripts/update-copyrights
+- aarch64: use PTR_ARG and SIZE_ARG instead of DELOUSE
+- nonstring: Enable __FORTIFY_LEVEL=3
+- string: Enable __FORTIFY_LEVEL=3
+- Introduce _FORTIFY_SOURCE=3
+- Warn on unsupported fortification levels
+- powerpc: Use scv instruction on clone when available
+- powerpc: Runtime selection between sc and scv for syscalls
+- malloc: preserve errno on mcheck hooks [BZ #17924]
+- x86 long double: Add tests for pseudo normal numbers
+- x86 long double: Consider pseudo numbers as signaling
+- io: Remove xmknod{at} implementations
+- io: Remove xstat implementations
+- free: preserve errno [BZ#17924]
+- hurd: Accept including hurd/version.h
+- hurd: Add WSTOPPED/WCONTINUED/WEXITED/WNOWAIT support [BZ #23091]
+- support: Make support_process_state_wait wait less
+- hurd: set sigaction for signal preemptors in arch-independent file
+- hurd: Fix spawni SPAWN_XFLAGS_TRY_SHELL with empty argv
+- hurd: Try shell in posix_spawn* only in compat mode
+- Remove _ISOMAC check from <cpu-features.h>
+- x86: Remove the duplicated CPU_FEATURE_CPU_P
+- Partially revert 681900d29683722b1cb0a8e565a0585846ec5a61
+- x86 long double: Support pseudo numbers in isnanl
+- x86 long double: Support pseudo numbers in fpclassifyl
+- MTE: Do not pad size in realloc_check
+- tests-mcheck: New variable to run tests with MALLOC_CHECK_=3
+- elf: Account for glibc-hwcaps/ prefix in _dl_important_hwcaps
+- misc: Use __ferror_unlocked instead of ferror
+- s390x: Regenerate ulps
+- powerpc: Regenerate ulps
+- addmntent: Remove unbounded alloca usage from getmntent [BZ#27083]
+- <sys/platform/x86.h>: Add Intel LAM support
+- i386: Regenerate ulps
+- aarch64: update ulps.
+- aarch64: Add aarch64-specific files for memory tagging support
+- aarch64: Add sysv specific enabling code for memory tagging
+- linux: Add compatibility definitions to sys/prctl.h for MTE
+- malloc: Basic support for memory tagging in the malloc() family
+- elf: Add a tunable to control use of tagged memory
+- config: Allow memory tagging to be enabled when configuring glibc
+- alpha: Remove anonymous union in struct stat [BZ #27042]
+- add inputs to auto-libm-test-in yielding larger errors (binary64, x86_64)
+- m68k: fix clobbering a5 in setjmp() [BZ #24202]
+- iconv add iconv_close before the function returned with bad value.
+- iconv: use iconv_close after iconv_open
+- Fix buffer overrun in EUC-KR conversion module (bz #24973)
+- hurd: Make trampoline fill siginfo ss_sp from sc_uesp
+- Hurd: make sigstates hold a reference on thread ports
+- profil-counter: Add missing SIGINFO case
+- hurd: implement SA_SIGINFO signal handlers.
+- hurd: Fix ELF_MACHINE_USER_ADDRESS_MASK value
+- hurd: Note when the vm_map kernel bug was fixed
+- hurd: Also turn KERN_INVALID_ADDRESS to EINVAL
+- ieee754: Remove unused __sin32 and __cos32
+- ieee754: Remove slow paths from asin and acos
+- getenv: Move call to strlen to the branch it's used in.
+- Update kernel version to 5.10 in tst-mman-consts.py.
+- s390x: Require GCC 7.1 or later to build glibc.
+- malloc: Use __libc_initial to detect an inner libc
+- Replace __libc_multiple_libcs with __libc_initial flag
+- {nptl,htl}/semaphoreP.h: clean up
+- htl: Get sem_open/sem_close/sem_unlink support [BZ #25524]
+- pthread: Move semaphore initialization for open to semaphoreP.h
+- Mark __libc_freeres_fn as used [BZ #27002]
+- Update syscall lists for Linux 5.10.
+- htl: Add pshared semaphore support
+- hurd: Add LLL_PRIVATE and LLL_SHARED
+- hurd: Add __libc_open and __libc_close
+- htl: Add futex-internal.h
+- hurd: Add __lll_abstimed_wait_intr
+- hurd: make lll_* take a variable instead of a ptr
+- hurd: Rename LLL_INITIALIZER to LLL_LOCK_INITIALIZER
+- Use Linux 5.10 in build-many-glibcs.py.
+
+* Wed Dec 16 2020 DJ Delorie <dj(a)redhat.com> - 2.32.9000-23
+- Fix conditionals for _enable_debug_packages and benchtests [BZ #1902514]
+
+* Tue Dec 15 2020 Patsy Griffin <patsy(a)redhat.com> - 2.32.9000-22
+- Auto-sync with upstream branch master,
+ commit 4d0985543f479a6f421d4d8a9e0d1dc71c9c2c53.
+- elf: Record libc.so link map when it is the main program (bug 20972)
+- Use GMP 6.2.1 in build-many-glibcs.py.
+- aarch64: remove the strlen_asimd symbol
+- aarch64: fix static PIE start code for BTI [BZ #27068]
+- elf: Fix failure handling in _dl_map_object_from_fd
+- elf: inline lose for error handling
+- Remove strtoimax, strtoumax, wcstoimax, wcstoumax inlines
+- nsswitch: handle missing actions properly
+- x86: Remove the default REP MOVSB threshold tunable value [BZ #27061]
+- elf.h: Remove SHF_GNU_BUILD_NOTE.
+- elf.h: fix spelling typos in comments
+- Fix spelling and grammar in several comments
+- malloc: Detect infinite-loop in _int_free when freeing tcache [BZ#27052]
+- elf: Fix dl-load.c
+- elf: Include libc.so.6 as main program in dependency sort (bug 20972)
+- support: Add support_slibdir_prefix variable
+- aarch64: Use mmap to add PROT_BTI instead of mprotect [BZ #26831]
+- elf: Pass the fd to note processing
+- elf: Move note processing after l_phdr is updated
+- aarch64: align address for BTI protection [BZ #26988]
+- aarch64: Fix missing BTI protection from dependencies [BZ #26926]
+- Fix linknamespace errors in nss_database.c if build with -Os.
+- treewide: fix incorrect spelling of indices in comments
+- linux: Consolidate brk implementation
+- elf: Include <sys/param.h> in cache.c
+- s390x: Add glibc-hwcaps support
+- elf: Fix run-time dependencies of tst-dlopen-fail-2
+- Handle out-of-memory case in svc_tcp.c/svc_unix.c:rendezvous_request.
+- elf: Fix incorrect comparison in sort_priorities_by_name
+- S390: Derive float_t from FLT_EVAL_METHOD
+- Fix parsing of /sys/devices/system/cpu/online (bug 25859)
+- Make strtoimax, strtoumax, wcstoimax, wcstoumax into aliases
+- Fixed typos in "NEWS for version 2.32"
+- Add NEWS entry for CVE-2020-29562 (BZ #26923)
+- iconv: Fix incorrect UCS4 inner loop bounds (BZ#26923)
+- Drop glibc-rh1906066 and glibc-rh741105 patches fixed by sync.
+
+* Mon Dec 14 2020 Florian Weimer <fweimer(a)redhat.com> - 2.32.9000-21
+- Re-enable -Werror everywhere (#1888246)
+
+* Wed Dec 09 2020 DJ Delorie <dj(a)redhat.com> - 2.32.9000-20
+- nsswitch: handle missing actions properly (temporary fix for 1906066)
+
+* Mon Dec 07 2020 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-19
+- Auto-sync with upstream branch master,
+ commit 088e9625378f25607acff3daf7a79cbdee497043:
+- x86: Rename readelflib.c
+- nsswitch: use new internal API (callers)
+- nsswitch: user new internal API (tests)
+- nsswitch: use new internal API (core)
+- nss: Implement <nss_database.h>
+- <nss_action.h>: New abstraction for combining NSS modules and NSS actions
+- nss: Introduce <nss_module.h>
+- Add scripts/move-symbol-to-libc.py
+
+* Fri Dec 04 2020 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-18
+- Drop glibc-revert-fxstat-compat.patch; applied upstream.
+- Drop glibc-revert-mknod-compat.patch; applied upstream.
+- Auto-sync with upstream branch master,
+ commit 4c38c1a229bc3628269ad98bd7e8d31d118d91f6:
+- powerpc64le: Add glibc-hwcaps support
+- x86: Adjust tst-cpu-features-supports.c for GCC 11
+- x86: Set RDRAND usable if CPU supports RDRAND
+- elf: Add missing <stddef.h> header to elf/dl-hwcaps.h
+- lowlevellock-futex: Remove not used macros
+- futex: Remove not used futex_reltimed_wait{_cancelable}
+- y2038: Convert gai_suspend to support 64 bit time
+- symbols: Add defines for libanl's libanl_hidden_{def|proto}
+- x86_64: Add glibc-hwcaps support
+- elf: Add glibc-hwcaps subdirectory support to ld.so cache processing
+- elf: Process glibc-hwcaps subdirectories in ldconfig
+- elf: Implement tail merging of strings in ldconfig
+- elf: Implement a string table for ldconfig, with tail merging
+- elf: Add extension mechanism to ld.so.cache
+- elf: Add endianness markup to ld.so.cache (bug 27008)
+- elf: Add glibc-hwcaps support for LD_LIBRARY_PATH
+- elf: Synchronize <elf.h> section header flags with binutils
+- x86: Fix THREAD_SELF definition to avoid ld.so crash (bug 27004)
+- htl: Add hidden def for __pthread_create/detach
+- manual: Clarify File Access Modes section and add O_PATH
+- htl: Add missing symbols
+- Revert "linux: Move xmknod{at} to compat symbols"
+- Revert "linux: Move {f}xstat{at} to compat symbols"
+- elf.h: Fix spelling of EM_TILE64 comment
+- nptl: Fix __futex_clocklock64 return error check [BZ #26964]
+- powerpc64le: ifunc select *f128 routines in multiarch mode
+- y2038: Convert aio_suspend to support 64 bit time
+- Fix typo in NEWS file
+- nptl: Add EOVERFLOW checks for futex calls
+- nptl: Fix PTHREAD_PRIO_PROTECT timed lock
+- sh: Add sh4 fpu Implies folder
+- io: nftw/ftw: Fix stack overflow with large nopenfd [BZ #26353]
+- elf: Introduce enum opt_format in the ldconfig implementation
+- support: Add support_copy_file
+- NEWS entry for commit b4f020c9b408fb3d1d3d4901c4a71839145f8791
+- timezone: Change zdump installation to bin directory
+- nptl: Return EINVAL for invalid clock for pthread_clockjoin_np
+- nptl: Return EINVAL for pthread_mutex_clocklock/PI with CLOCK_MONOTONIC [BZ #26801]
+- nptl: Replace lll_futex_wake with futex-internal.h
+- nptl: Replace lll_futex_supported_clockid with futex-internal.h
+- nptl: Replace lll_futex_{timed_}wait by futex-internal.h
+- nptl: Replace lll_timedwait with __futex_abstimed_wait64
+- nptl: Replace __futex_clocklock_wait64 with __futex_abstimed_wait64
+- nptl: Remove _futex_clock_wait_bitset64
+- nptl: Consolidate __futex_abstimed_wait_{cancelable}64
+- nptl: Extend __futex_abstimed_wait_cancelable64 comment
+- nptl: Remove clockwait_tid
+- nptl: Remove futex_wait_cancelable
+- nptl: Remove unused internal futex functions
+- Mark mtrace tests UNSUPPORTED if bug-ga2.mtrace or tst-leaks2.mtrace are missing
+- elf: Fix uninitialized variable for _dl_write
+- powerpc: Make PT_THREAD_POINTER available to assembly code
+- Use libnss_files.so for tests posix/bug-ga2 and resolv/tst-leaks2 [BZ #26821]
+- hurd report-wait: Fix stpcpy usage
+- hurd S_msg_report_wait: Fix detecting fd ports
+- hurd S_msg_report_wait: Fix reporting ports
+- hurd: Fix strcpy calls
+- hurd: Fix _S_msg_get/set_env_variable prototype
+- hurd: Enable using ifunc
+- Add {,sysdep-}ld-library-path make variable
+- nptl: Move stack list variables into _rtld_global
+- hurd: let _dl_argv and __libc_stack_end be relro
+- hurd: Remove some remnants of cthreads
+- nanosleep: Pass NULL when rem == NULL on ports with __TIMESIZE != 64
+- y2038: Convert thrd_sleep to support 64 bit time
+- y2038: Convert mtx_timedlock to support 64 bit time
+- y2038: Convert cnd_timedwait to support 64 bit time
+- hurd: Drop CLOCK_MONOTONIC change which slipped in
+- hurd: make ptsname fail with ENOTTY on non-master-pty
+- mach: Add missing assert.h include
+- hurd: break relocation loop between libc.so and lib{mach,hurd}user.so
+- Remove obsolete defines for HPUX support from fcntl.h and update O_NONBLOCK.
+- Remove tls.h inclusion from internal errno.h
+- nptl: Eliminate <smp.h> and __is_smp
+- powerpc: Eliminate UP macro conditionals
+- x86: Remove UP macro. Define LOCK_PREFIX unconditionally.
+- alpha: Remove UP preprocessor conditionals
+- hurd: Make sure signals get started
+- hurd: initialize libpthread before starting the signal thread
+- hurd: Make _hurd_libc_proc_init idempotent
+- powerpc: Add optimized stpncpy for POWER9
+- powerpc: Add optimized strncpy for POWER9
+- Don't use nested function in test-ffs
+- Use __builtin___stpncpy_chk when available
+- tests: Remove NULL check for an array
+- hurd: Move {,f,l}xstat{,at} and xmknod{at} to compat symbols
+- hurd: Notify the proc server later during initialization
+- htl: Initialize later
+- htl: Keep thread signals blocked during its initialization
+- htl: Fix spurious symbols in namespaces
+- Use O_CLOEXEC in sysconf [BZ #26791]
+- struct _Unwind_Exception alignment should not depend on compiler flags
+- hurd: keep only required PLTs in ld.so
+- hurd: Add missing startup calls
+- riscv: Get cache information through sysconf
+- RISC-V: Add _dl_start_user.
+
+* Thu Nov 26 2020 Florian Weimer <fweimer(a)redhat.com> - 2.32.9000-17
+- s390x: Do not rewrite program interpreter symlink (make install is enough)
+
+* Tue Nov 10 2020 Carlos O'Donell <carlos(a)redhat.com> - 2.32.9000-16
+- Remove the work around for systemd-nspawn (#1869030).
+
+* Mon Nov 09 2020 DJ Delorie <dj(a)redhat.com> - 2.32.9000-15
+- Auto-sync with upstream branch master,
+ commit 75a193b7611bade31a150dfcc528b973e3d46231.
+- linux: Allow adjtime with NULL argument [BZ #26833]
+- aarch64: Add unwind information to _start (bug 26853)
+- bsd unlockpt: unlockpt needs to fail with EINVAL, not ENOTTY
+- Rearrange bsd_getpt vs bsd_openpt and implement posix_openpt on BSD
+- Remove __warndecl
+- Remove __warn_memset_zero_len [BZ #25399]
+- iconv: Accept redundant shift sequences in IBM1364 [BZ #26224]
+- msg: Remove redundant #include <sys/msg.h> header
+- tst-setuid1-static-ENV: Add $(common-objpfx)nss [BZ #26820]
+
+* Tue Nov 03 2020 Patsy Griffin <patsy(a)redhat.com> - 2.32.9000-14
+- Auto-sync with upstream branch master,
+ commit e156dabc766d6f6f99ce9402999eae380a3ec1f2.
+- aarch64: Add variant PCS lazy binding test [BZ #26798]
+- aarch64: Fix DT_AARCH64_VARIANT_PCS handling [BZ #26798]
+- hurd: Correct 'ethenet' spelling
+- Avoid -Wstringop-overflow warning in pthread_cleanup_push macros
+- Disable spurious -Warray-bounds for ypclnt.c (bug 26687)
+- Do not use array parameter to new_composite_name (bug 26726)
+- Disable spurious -Wstringop-overflow for setjmp/longjmp (bug 26647)
+- malloc debug: fix compile error when enable macro MALLOC_DEBUG > 1
+- tst-tcfree2: adjust coding style.
+- elf: In ldconfig, extract the new_sub_entry function from search_dir
+- Use MPC 1.2.1 in build-many-glibcs.py.
+- Argument Syntax: Use "option", @option, and @command.
+- elf: Unify old and new format cache handling code in ld.so
+- x86: Restore processing of cache size tunables in init_cacheinfo
+- Make elf.h header self contained.
+- x86: Optimizing memcpy for AMD Zen architecture.
+- Hurd: Fix ftime build
+- Add IP_RECVERR_RFC4884 and IPV6_RECVERR_RFC4884 from Linux 5.9.
+- misc: Add internal __getauxval2 function
+- Remove NEWS entry about ftime removal
+- time: Add 64-bit time_t support for ftime
+- Reinstate ftime and add deprecate message on ftime usage
+- Update kernel version to 5.9 in tst-mman-consts.py.
+- Amend grammar and add a description
+- Fix typo in NEWS file
+- Remove timing related checks of time/tst-cpuclock1
+- Update syscall lists for Linux 5.9.
+- Use Linux 5.9 in build-many-glibcs.py.
+- Reword description of SXID_* tunable properties
+- New benchtest: pthread locks
+- y2038: nptl: Provide __futex_clock_wait_bitset64 to support 64 bit bitset
+- C-SKY: Make dynamic linker's name compitable with the older gcc.
+- Revert "C-SKY:Fix dynamic linker's name when mfloat-abi=softfp."
+- Move vtimes to a compatibility symbol
+- y2038: linux: Provide __time64 implementation
+- rt: Fix typos in comments in <aio.h>
+- C-SKY:Fix dynamic linker's name when mfloat-abi=softfp.
+- Drop the glibc-revert-ftime-compat.patch.
+
+* Thu Oct 29 2020 DJ Delorie <dj(a)redhat.com> - 2.32.9000-13
+- Add BuildRequires for perl (malloc/mtrace) if running the testsuite.
+
+* Wed Oct 21 2020 Siddhesh Poyarekar <siddhesh(a)redhat.com> - 2.32.9000-12
+- Revert __xstat64 symbol removal.
+- Revert xmknod* symbol removal.
+- Revert ftime symbol removal.
+
+* Sun Oct 18 2020 Patsy Griffin <patsy(a)redhat.com> - 2.32.9000-11
+- Auto-sync with upstream branch master,
+ commit 0f09154c64005e78b61484ae87b5ea2028051ea0.
+- x86: Initialize CPU info via IFUNC relocation [BZ 26203]
+- Add NEWS entry for ftime compatibility move
+- support: Add create_temp_file_in_dir
+- linux: Add __readdir_unlocked
+- linux: Simplify opendir buffer allocation
+- linux: Move posix dir implementations to Linux
+- linux: Add 64-bit time_t support for wait3
+- Move ftime to a compatibility symbol
+- linux: Fix time64 support for futimesat
+- linux: Use INTERNAL_SYSCALL on fstatat{64}
+- shm tests: Append PID to names passed to shm_open [BZ #26737]
+- sysvipc: Fix tst-sysvshm-linux on x32
+- x86/CET: Update vfork to prevent child return
+- resolv: Serialize processing in resolv/tst-resolv-txnid-collision
+- statfs: add missing f_flags assignment
+- y2038: Remove not used __fstatat_time64 define
+- y2038: nptl: Convert pthread_mutex_{clock|timed}lock to support 64 bit
+- sysvipc: Return EINVAL for invalid shmctl commands
+- sysvipc: Fix IPC_INFO and SHM_INFO handling [BZ #26636]
+- AArch64: Use __memcpy_simd on Neoverse N2/V1
+- resolv: Handle transaction ID collisions in parallel queries (bug 26600)
+- support: Provide a way to clear the RA bit in DNS server responses
+- support: Provide a way to reorder responses within the DNS test server
+- Add missing stat/mknod symbol on libc.abilist some ABIs
+- manual: correct the spelling of "MALLOC_PERTURB_" [BZ #23015]
+- manual: replace an obsolete collation example with a valid one
+- rtld: fix typo in comment
+- elf: Add missing <dl-procinfo.h> header to elf/dl-usage.c
+- hurd: support clock_gettime(CLOCK_PROCESS/THREAD_CPUTIME_ID)
+- linux: Move xmknod{at} to compat symbols
+- linux: Add {f}stat{at} y2038 support
+- linux: Move {f}xstat{at} to compat symbols
+- linux: Disentangle fstatat from fxstatat
+- linux: Implement {l}fstat{at} in terms of fstatat
+- linux: Move the struct stat{64} to struct_stat.h
+- Remove mknod wrapper functions, move them to symbols
+- Remove stat wrapper functions, move them to exported symbols
+- <sys/platform/x86.h>: Add FSRCS/FSRS/FZLRM support
+- <sys/platform/x86.h>: Add Intel HRESET support
+- <sys/platform/x86.h>: Add AVX-VNNI support
+- <sys/platform/x86.h>: Add AVX512_FP16 support
+- <sys/platform/x86.h>: Add Intel UINTR support
+- elf: Do not pass GLRO(dl_platform), GLRO(dl_platformlen) to _dl_important_hwcaps
+- elf: Enhance ld.so --help to print HWCAP subdirectories
+- elf: Add library search path information to ld.so --help
+- sunrpc: Adjust RPC function declarations to match Sun's (bug 26686]
+- Avoid GCC 11 -Warray-parameter warnings [BZ #26686].
+- elf: Make __rtld_env_path_list and __rtld_search_dirs global variables
+- elf: Print the full name of the dynamic loader in the ld.so help message
+- elf: Use the term "program interpreter" in the ld.so help message
+- scripts/update-copyrights: Update csu/version.c, elf/dl-usage.c
+- elf: Implement ld.so --version
+- nptl: Add missing cancellation flags on lockf
+- Update mips64 libm-test-ulps
+- Update alpha libm-test-ulps
+- elf: Implement ld.so --help
+- elf: Record whether paths come from LD_LIBRARY_PATH or --library-path
+- elf: Move ld.so error/help output to _dl_usage
+- elf: Extract command-line/environment variables state from rtld.c
+
+* Wed Oct 14 2020 Florian Weimer <fweimer(a)redhat.com> - 2.32.9000-10
+- Disable -Werror on ELN (#1888246)
+
+* Wed Oct 14 2020 Florian Weimer <fweimer(a)redhat.com> - 2.32.9000-9
+- Make glibc.spec self-contained (#1887097)
+
+* Thu Oct 08 2020 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-8
+- Drop glibc-fix-float128-benchtests.patch; applied upstream.
+- Auto-sync with upstream branch master,
+ commit 72d36ffd7db55ae599f4c77feb0eae25a0f3714e:
+- elf: Implement __rtld_malloc_is_complete
+- __vfscanf_internal: fix aliasing violation (bug 26690)
+- Revert "Fix missing redirects in testsuite targets"
+- nptl: Add missing cancellation flags on futex_internal and pselect32
+- elf: Implement _dl_write
+- elf: Do not search HWCAP subdirectories in statically linked binaries
+- Linux: Require properly configured /dev/pts for PTYs
+- Linux: unlockpt needs to fail with EINVAL, not ENOTTY (bug 26053)
+- login/tst-grantpt: Convert to support framework, more error checking
+- posix: Fix -Warray-bounds instances building timer_create [BZ #26687]
+- Replace Minumum/minumum with Minimum/minimum
+- Optimize scripts/merge-test-results.sh
+- Fix GCC 11 -Warray-parameter warning for __sigsetjmp (bug 26647)
+- manual: Fix typo
+- y2038: nptl: Convert pthread_rwlock_{clock|timed}{rd|wr}lock to support 64
+ bit time
+- Y2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time
+- sysvipc: Return EINVAL for invalid msgctl commands
+- sysvipc: Fix IPC_INFO and MSG_INFO handling [BZ #26639]
+- sysvipc: Return EINVAL for invalid semctl commands
+- sysvipc: Fix SEM_STAT_ANY kernel argument pass [BZ #26637]
+- aarch64: enforce >=64K guard size [BZ #26691]
+- sysvipc: Fix semtimedop for Linux < 5.1 for 64-bit ABI
+- nptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h
+- nptl: Provide proper spelling for 32 bit version of futex_abstimed_wait
+- string: Fix strerrorname_np return value [BZ #26555]
+- Set tunable value as well as min/max values
+- ld.so: add an --argv0 option [BZ #16124]
+- Reversing calculation of __x86_shared_non_temporal_threshold
+- linux: Add time64 recvmmsg support
+- linux: Add time64 support for nanosleep
+- linux: Consolidate utimes
+- linux: Use 64-bit time_t syscall on clock_getcputclockid
+- linux: Add time64 sigtimedwait support
+- linux: Add time64 select support
+- nptl: Fix __futex_abstimed_wait_cancellable32
+- sysvipc: Fix semtimeop for !__ASSUME_DIRECT_SYSVIPC_SYSCALLS
+- hurd: add ST_RELATIME
+- intl: Handle translation output codesets with suffixes [BZ #26383]
+- bench-strcmp.c: Add workloads on page boundary
+- bench-strncmp.c: Add workloads on page boundary
+- strcmp: Add a testcase for page boundary
+- strncmp: Add a testcase for page boundary [BZ #25933]
+- Set locale related environment variables in debugglibc.sh
+- benchtests: Run _Float128 tests only on architectures that support it
+- powerpc: Protect dl_powerpc_cpu_features on INIT_ARCH() [BZ #26615]
+- x86: Harden printf against non-normal long double values (bug 26649)
+- x86: Use one ldbl2mpn.c file for both i386 and x86_64
+- Define __THROW to noexcept for C++11 and later
+
+* Mon Sep 21 2020 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-7
+- Adjust glibc-rh741105.patch.
+- Add glibc-fix-float128-benchtests.patch to allow building on armv7hl.
+- Auto-sync with upstream branch master,
+ commit cdf645427d176197b82f44308a5e131d69fb53ad:
+- Update mallinfo2 ABI, and test
+- Allow memset local PLT reference for RISC-V.
+- powerpc: fix ifunc implementation list for POWER9 strlen and stpcpy
+- nscd: bump GC cycle during cache pruning (bug 26130)
+- x86: Use HAS_CPU_FEATURE with IBT and SHSTK [BZ #26625]
+- <sys/platform/x86.h>: Add Intel Key Locker support
+- Fix handling of collating symbols in fnmatch (bug 26620)
+- pselect.c: Pass a pointer to SYSCALL_CANCEL [BZ #26606]
+- y2038: nptl: Convert sem_{clock|timed}wait to support 64 bit time
+- hurd: Add __x86_get_cpu_features to ld.abilist
+- x86: Install <sys/platform/x86.h> [BZ #26124]
+- linux: Add time64 pselect support
+- linux: Add time64 semtimedop support
+- linux: Add ppoll time64 optimization
+- linux: Simplify clock_getres
+- Update sparc libm-test-ulps
+- Remove internal usage of extensible stat functions
+- Linux: Consolidate xmknod
+- linux: Consolidate fxstatat{64}
+- linux: Consolidate fxstat{64}
+- linux: Consolidate lxstat{64}
+- linux: Consolidate xstat{64}
+- linux: Define STAT64_IS_KERNEL_STAT64
+- linux: Always define STAT_IS_KERNEL_STAT
+- Update powerpc libm-test-ulps
+- benchtests: Add "workload" traces for sinf128
+- benchtests: Add "workload" traces for sinf
+- benchtests: Add "workload" traces for sin
+- benchtests: Add "workload" traces for powf128
+- benchtests: Add "workload" traces for pow
+- benchtests: Add "workload" traces for expf128
+- benchtests: Add "workload" traces for exp
+- nptl: futex: Provide correct indentation for part of
+ __futex_abstimed_wait_cancelable64
+
+* Tue Sep 08 2020 DJ Delorie <dj(a)redhat.com> - 2.32.9000-6
+- Auto-sync with upstream branch master,
+ commit e74b61c09a2a2ab52153e731225ccba5078659b1.
+- Disable -Wstringop-overread for some string tests
+- string: Fix GCC 11 `-Werror=stringop-overread' error
+- C11 threads: Fix inaccuracies in testsuite
+- elf.h: Add aarch64 bti/pac dynamic tag constants
+- x86: Set CPU usable feature bits conservatively [BZ #26552]
+
+* Wed Sep 02 2020 Patsy Griffin <patsy(a)redhat.com> - 2.32.9000-5
+- Auto-sync with upstream branch master,
+ commit 86a912c8634f581ea42ec6973553dde7f058cfbf.
+- Update i686 ulps.
+- Use LFS readdir in generic POSIX getcwd [BZ# 22899]
+- linux: Remove __ASSUME_ATFCTS
+- Sync getcwd with gnulib
+- x86-64: Fix FMA4 detection in ifunc [BZ #26534]
+- y2038: nptl: Convert pthread_cond_{clock|timed}wait to support 64 bit time
+- malloc: Fix mallinfo deprecation declaration
+- x32: Add <fixup-asm-unistd.h> and regenerate arch-syscall.h
+- Add mallinfo2 function that support sizes >= 4GB.
+- Remove obsolete default/nss code
+- AArch64: Improve backwards memmove performance
+- Add RISC-V 32-bit target to build-many-glibcs.py
+- Documentation for the RISC-V 32-bit port
+- RISC-V: Build infrastructure for 32-bit port
+- RISC-V: Add rv32 path to RTLDLIST in ldd
+- riscv32: Specify the arch_minimum_kernel as 5.4
+- RISC-V: Fix llrint and llround missing exceptions on RV32
+- RISC-V: Add the RV32 libm-test-ulps
+- RISC-V: Add 32-bit ABI lists
+- RISC-V: Add hard float support for 32-bit CPUs
+- RISC-V: Support the 32-bit ABI implementation
+- RISC-V: Add arch-syscall.h for RV32
+- RISC-V: Add path of library directories for the 32-bit
+- RISC-V: Support dynamic loader for the 32-bit
+- RISC-V: Add support for 32-bit vDSO calls
+- RISC-V: Use 64-bit-time syscall numbers with the 32-bit port
+- RISC-V: Cleanup some of the sysdep.h code
+- RISC-V: Use 64-bit time_t and off_t for RV32 and RV64
+- io/lockf: Include bits/types.h before __OFF_T_MATCHES_OFF64_T check
+- elf/tst-libc_dlvsym: Add a TEST_COMPAT around some symbol tests
+- hurd: define BSD 4.3 ioctls only under __USE_MISC
+- string: test strncasecmp and strncpy near page boundaries
+- linux: Simplify utimensat
+- linux: Simplify timerfd_settime
+- linux: Simplify timer_gettime
+- linux: Simplify sched_rr_get_interval
+- linux: Simplify ppoll
+- linux: Simplify mq_timedsend
+- linux: Simplify mq_timedreceive
+- linux: Simplify clock_settime
+- linux: Simplify clock_nanosleep
+- linux: Simplify clock_gettime
+- linux: Simplify clock_adjtime
+- linux: Add helper function to optimize 64-bit time_t fallback support
+- S390: Sync HWCAP names with kernel by adding aliases [BZ #25971]
+- [vcstocl] Import ProjectQuirks from its own file
+- build-many-glibcs.py: Add a s390x -O3 glibc variant.
+- Fix namespace violation in stdio.h and sys/stat.h if build with optimization. [BZ #26376]
+- Add C2x BOOL_MAX and BOOL_WIDTH to limits.h.
+- Use MPC 1.2.0 in build-many-glibcs.py.
+- Add new STATX_* constants from Linux 5.8 to bits/statx-generic.h.
+- Correct locking and cancellation cleanup in syslog functions (bug 26100)
+
+* Thu Aug 20 2020 Carlos O'Donell <carlos(a)redhat.com> - 2.32.9000-4
+- Support building glibc in a mock chroot using older systemd-nspawn (#1869030).
+
+* Tue Aug 18 2020 Carlos O'Donell <carlos(a)redhat.com> - 2.32.9000-3
+- Suggest installing minimal localization e.g. C, POSIX, C.UTF-8.
+
+* Mon Aug 17 2020 DJ Delorie <dj(a)redhat.com> - 2.32.9000-2
+- Auto-sync with upstream branch master,
+ commit cb7e7a5ca1d6d25d59bc038bdc09630e507c41e5.
+- nptl: Handle NULL abstime [BZ #26394]
+- Update build-many-glibcs.py for binutils ia64 obsoletion.
+- Update kernel version to 5.8 in tst-mman-consts.py.
+- y2038: nptl: Convert pthread_{clock|timed}join_np to support 64 bit time
+- aarch64: update ulps.
+
+* Wed Aug 12 2020 Patsy Griffin <patsy(a)redhat.com> - 2.32.9000-1
+- Auto-sync with upstream branch master,
+ commit 0be0845b7a674dbfb996f66cd03d675f0f6028dc:
+- S390: Regenerate ULPs.
+- manual: Fix sigdescr_np and sigabbrev_np return type (BZ #26343)
+- math: Update x86_64 ulps
+- math: Regenerate auto-libm-test-out-j0
+- manual: Put the istrerrorname_np and strerrordesc_np return type in braces
+- Linux: Use faccessat2 to implement faccessat (bug 18683)
+- manual: Fix strerrorname_np and strerrordesc_np return type (BZ #26343)
+- math: Fix inaccuracy of j0f for x >= 2^127 when sin(x)+cos(x) is tiny
+- Update syscall lists for Linux 5.8.
+- Use Linux 5.8 in build-many-glibcs.py.
+- htl: Enable tst-cancelx?[45]
+- tst-cancel4: Make blocking on write more portable
+- hurd: Add missing hidden def
+- hurd: Rework sbrk
+- hurd: Implement basic sched_get/setscheduler
+- x86: Rename Intel CPU feature names
+- manual: Fix some @code/@var formatting glitches chapter Date And Time
+- Copy regex_internal.h from Gnulib
+- Copy regex BITSET_WORD_BITS porting from Gnulib
+- Sync regex.h from Gnulib
+- Sync mktime.c from Gnulib
+- Sync intprops.h from Gnulib
+- Open master branch for glibc 2.33 development.
+
+* Thu Aug 06 2020 Arjun Shankar <arjun(a)redhat.com> - 2.32-1
+- Auto-sync with upstream branch release/2.32/master,
+ commit 3de512be7ea6053255afed6154db9ee31d4e557a:
+- Prepare for glibc 2.32 release.
+- Regenerate configure scripts.
+- Update NEWS with bugs.
+- Update translations.
+- Don't mix linker error messages into edited scripts
+- benchtests/README update.
+- RISC-V: Update lp64d libm-test-ulps according to HiFive Unleashed
+- aarch64: update NEWS about branch protection
+- Add NEWS entry for CVE-2016-10228 (bug 19519)
+- powerpc: Fix incorrect cache line size load in memset (bug 26332)
+- Update Nios II libm-test-ulps file.
+
+* Fri Jul 31 2020 Patsy Griffin <patsy(a)redhat.com> - 2.31.9000-24
+- Auto-sync with upstream branch master,
+ commit 7f1a08cff82255cd4252a2c75fd65b80a6a170bf.
+- Move NEWS entry for CVE-2020-1751 to the 2.31 section
+- NEWS: Deprecate weak libpthread symbols for single-threaded checks
+- NEWS: Deprecate nss_hesiod
+- nptl: Zero-extend arguments to SETXID syscalls [BZ #26248]
+- Use binutils 2.35 branch in build-many-glibcs.py.
+- aarch64: Use future HWCAP2_MTE in ifunc resolver
+- Update x86-64 libm-test-ulps
+- aarch64: Respect p_flags when protecting code with PROT_BTI
+- Disable warnings due to deprecated libselinux symbols used by nss and nscd
+- Regenerate INSTALL for ARC port updates.
+- Update libc.pot for 2.32 release.
+- powerpc: Fix POWER10 selection
+- powerpc64le: guarantee a .gnu.attributes section [BZ #26220]
+
+* Wed Jul 29 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-23
+- Inherit -mbranch-protection=standard from redhat-rpm-config (for aarch64)
+
+* Mon Jul 27 2020 Fedora Release Engineering <releng(a)fedoraproject.org>
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Wed Jul 22 2020 Carlos O'Donell <carlos(a)redhat.com> - 2.31.9000-21
+- Use make macros
+- https://fedoraproject.org/wiki/Changes/UseMakeBuildInstallMacro
+
+* Tue Jul 21 2020 Arjun Shankar <arjun(a)redhat.com> - 2.31.9000-20
+- Add glibc-deprecated-selinux-makedb.patch and
+ glibc-deprecated-selinux-nscd.patch to work around libselinux API
+ deprecations.
+- Drop glibc-rseq-disable.patch; rseq support removed upstream. (#1855729)
+- Auto-sync with upstream branch master,
+ commit ec2f1fddf29053957d061dfe310f106388472a4f:
+- libio: Remove __libc_readline_unlocked
+- shadow: Implement fgetspent_r using __nss_fgetent_r
+- pwd: Implement fgetpwent_r using __nss_fgetent_r
+- gshadow: Implement fgetsgent_r using __nss_fgetent_r (bug 20338)
+- grp: Implement fgetgrent_r using __nss_fgetent_r
+- nss: Add __nss_fgetent_r
+- libio: Add fseterr_unlocked for internal use
+- nss_files: Use generic result pointer in parse_line
+- nss_files: Consolidate line parse declarations in <nss_files.h>
+- nss_compat: Do not use mmap to read database files (bug 26258)
+- nss_files: Consolidate file opening in __nss_files_fopen
+- Update powerpc-nofpu libm-test-ulps.
+- Use MPFR 4.1.0 in build-many-glibcs.py.
+- elf: Change TLS static surplus default back to 1664
+- hurd: Fix longjmp check for sigstate
+- hurd: Fix longjmp early in initialization
+- manual: New signal and errno string functions are AS-safe
+- AArch64: Improve strlen_asimd performance (bug 25824)
+- Move <rpc/netdb.h> from sunrpc to inet
+- en_US: Minimize changes to date_fmt (Bug 25923)
+- Linux: Remove rseq support
+- manual: Use Unicode instead HTML entities for characters (bug 19737)
+- Add NEWS entry for CVE-2020-6096 (bug 25620)
+- arm: remove string/tst-memmove-overflow XFAIL
+- AArch64: Rename IS_ARES to IS_NEOVERSE_N1
+- AArch64: Add optimized Q-register memcpy
+- AArch64: Align ENTRY to a cacheline
+- Correct timespec implementation [BZ #26232]
+- Remove --enable-obsolete-rpc configure flag
+- hurd: Fix build-many-glibcs.py
+- x86: Support usable check for all CPU features
+- string: Make tst-strerror/tst-strsignal unsupported if msgfmt is not installed
+- malloc: Deprecate more hook-related functionality
+- elf: Support at least 32-byte alignment in static dlopen
+- x86: Remove __ASSEMBLER__ check in init-arch.h
+- x86: Remove the unused __x86_prefetchw
+- Documentation for ARC port
+- build-many-glibcs.py: Enable ARC builds
+- ARC: Build Infrastructure
+- ARC: ABI lists
+- ARC: Linux Startup and Dynamic Loading
+- ARC: Linux ABI
+- ARC: Linux Syscall Interface
+- ARC: hardware floating point support
+- ARC: math soft float support
+- ARC: Atomics and Locking primitives
+- ARC: Thread Local Storage support
+- ARC: startup and dynamic linking code
+- ARC: ABI Implementation
+- Fix time/tst-cpuclock1 intermitent failures
+- powerpc64: Fix calls when r2 is not used [BZ #26173]
+- Add NEWS entry for Update to Unicode 13.0.0 [BZ #25819]
+- Update i686 libm-test-ulps
+- Fix memory leak in __printf_fp_l (bug 26215).
+- Fix double free in __printf_fp_l (bug 26214).
+- linux: Fix syscall list generation instructions
+- sysv: linux: Add 64-bit time_t variant for shmctl
+- sysvipc: Remove the linux shm-pad.h file
+- sysvipc: Split out linux struct shmid_ds
+- sysv: linux: Add 64-bit time_t variant for msgctl
+- sysvipc: Remove the linux msq-pad.h file
+- sysvipc: Split out linux struct semid_ds
+- sysv: linux: Add 64-bit time_t variant for semctl
+
+* Fri Jul 10 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-19
+- Disable rseq registration by default to help Firefox (#1855729)
+
+* Thu Jul 09 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-18
+- Auto-sync with upstream branch master,
+ commit ffb17e7ba3a5ba9632cee97330b325072fbe41dd:
+- rtld: Avoid using up static TLS surplus for optimizations [BZ #25051]
+- rtld: Account static TLS surplus for audit modules
+- rtld: Add rtld.nns tunable for the number of supported namespaces
+- Remove --enable-obsolete-nsl configure flag
+- Move non-deprecated RPC-related functions from sunrpc to inet
+- aarch64: add NEWS entry about branch protection support
+- aarch64: redefine RETURN_ADDRESS to strip PAC
+- aarch64: fix pac-ret support in _mcount
+- aarch64: Add pac-ret support to assembly files
+- aarch64: configure check for pac-ret code generation
+- aarch64: ensure objects are BTI compatible
+- aarch64: enable BTI at runtime
+- aarch64: fix RTLD_START for BTI
+- aarch64: fix swapcontext for BTI
+- aarch64: Add BTI support to assembly files
+- aarch64: Rename place holder .S files to .c
+- aarch64: configure test for BTI support
+- Rewrite abi-note.S in C.
+- rtld: Clean up PT_NOTE and add PT_GNU_PROPERTY handling
+- string: Move tst-strsignal tst-strerror to tests-container
+- string: Fix prototype mismatch in sigabbrev_np, __sigdescr_np
+- arm: CVE-2020-6096: Fix multiarch memcpy for negative length (#1820332)
+- arm: CVE-2020-6096: fix memcpy and memmove for negative length (#1820332)
+- sunrpc: Remove hidden aliases for global data symbols (bug 26210)
+- hurd: Fix strerror not setting errno
+- tst-strsignal: fix checking for RT signals support
+- hurd: Evaluate fd before entering the critical section
+- CVE-2016-10228: Rewrite iconv option parsing (#1428292)
+- nss: Remove cryptographic key support from nss_files, nss_nis, nss_nisplus
+- sunrpc: Do not export getrpcport by default
+- sunrpc: Do not export key handling hooks by default
+- sunrpc: Turn clnt_sperrno into a libc_hidden_nolink_sunrpc symbol
+- string: Add strerrorname_np and strerrordesc_np
+- string: Add sigabbrev_np and sigdescr_np
+- string: Add strerror_l on test-strerror-errno
+- string: Add strerror, strerror_r, and strerror_l test
+- string: Add strsignal test
+- string: Simplify strerror_r
+- string: Use tls-internal on strerror_l
+- string: Implement strerror in terms of strerror_l
+- string: Remove old TLS usage on strsignal
+- linux: Fix __NSIG_WORDS and add __NSIG_BYTES
+- signal: Move sys_errlist to a compat symbol
+- signal: Move sys_siglist to a compat symbol
+- signal: Add signum-{generic,arch}.h
+- Remove most vfprintf width/precision-dependent allocations (bug 14231, bug 26211).
+- elf: Do not signal LA_ACT_CONSISTENT for an empty namespace [BZ #26076]
+- Fix stringop-overflow errors from gcc 10 in iconv.
+- x86: Add thresholds for "rep movsb/stosb" to tunables
+- Use C2x return value from getpayload of non-NaN (bug 26073).
+- x86: Detect Extended Feature Disable (XFD)
+- x86: Correct bit_cpu_CLFSH [BZ #26208]
+- manual: Document __libc_single_threaded
+- Add the __libc_single_threaded variable
+- Linux: rseq registration tests
+- Linux: Use rseq in sched_getcpu if available
+- Linux: Perform rseq registration at C startup and thread creation
+- tst-cancel4: deal with ENOSYS errors
+- manual: Show copyright information not just in the printed manual
+
+
+* Thu Jul 02 2020 Carlos O'Donell <carlos(a)redhat.com> - 2.31.9000-17
+- Auto-sync with upstream branch master,
+ commit c6aac3bf3663709cdefde5f5d5e9e875d607be5e.
+- Fix typo in comment in bug 26137 fix.
+- Fix strtod multiple-precision division bug (bug 26137).
+- Linux: Fix UTC offset setting in settimeofday for __TIMESIZE != 64
+- random: range is not portably RAND_MAX [BZ #7003]
+- Update kernel version to 5.7 in tst-mman-consts.py.
+- powerpc: Add support for POWER10
+- hurd: Simplify usleep timeout computation
+- htl: Enable cancel*16 an cancel*20 tests
+- hurd: Add remaining cancelation points
+- hurd: fix usleep(ULONG_MAX)
+- hurd: Make fcntl(F_SETLKW*) cancellation points
+- hurd: make wait4 a cancellation point
+- hurd: Fix port definition in HURD_PORT_USE_CANCEL
+- hurd: make close a cancellation point
+- hurd: make open and openat cancellation points
+- hurd: clean fd and port on thread cancel
+- htl: Move cleanup handling to non-private libc-lock
+- htl: Fix includes for lockfile
+- htl: avoid cancelling threads inside critical sections
+- tst-cancel4-common.c: fix calling socketpair
+- x86: Detect Intel Advanced Matrix Extensions
+- Set width of JUNGSEONG/JONGSEONG characters from UD7B0 to UD7FB to 0 [BZ #26120]
+- S390: Optimize __memset_z196.
+- S390: Optimize __memcpy_z196.
+- elf: Include <stddef.h> (for size_t), <sys/stat.h> in <ldconfig.h>
+- nptl: Don't madvise user provided stack
+- S390: Regenerate ULPs.
+- htl: Add wrapper header for <semaphore.h> with hidden __sem_post
+- elf: Include <stdbool.h> in <dl-tunables.h> because bool is used
+- htl: Fix case when sem_*wait is canceled while holding a token
+- htl: Make sem_*wait cancellations points
+- htl: Simplify non-cancel path of __pthread_cond_timedwait_internal
+- htl: Enable tst-cancel25 test
+- powerpc: Add new hwcap values
+- aarch64: MTE compatible strncmp
+- aarch64: MTE compatible strcmp
+- aarch64: MTE compatible strrchr
+- aarch64: MTE compatible memrchr
+- aarch64: MTE compatible memchr
+- aarch64: MTE compatible strcpy
+- Add MREMAP_DONTUNMAP from Linux 5.7
+- x86: Update CPU feature detection [BZ #26149]
+
+* Mon Jun 22 2020 DJ Delorie <dj(a)redhat.com> - 2.31.9000-16
+- Auto-sync with upstream branch master,
+ commit ea04f0213135b13d80f568ca2c4127c2ec112537.
+- aarch64: Remove fpu Makefile
+- m68k: Use sqrt{f} builtin for coldfire
+- arm: Use sqrt{f} builtin
+- riscv: Use sqrt{f} builtin
+- s390: Use sqrt{f} builtin
+- sparc: Use sqrt{f} builtin
+- mips: Use sqrt{f} builtin
+- alpha: Use builtin sqrt{f}
+- i386: Use builtin sqrtl
+- x86_64: Use builtin sqrt{f,l}
+- powerpc: Use sqrt{f} builtin
+- s390x: Use fma{f} builtin
+- aarch64: Use math-use-builtins for ceil{f}
+- math: Decompose math-use-builtins.h
+- hurd: Add mremap
+- ia64: Use generic exp10f
+- New exp10f version without SVID compat wrapper
+- i386: Use generic exp10f
+- math: Optimized generic exp10f with wrappers
+- benchtests: Add exp10f benchmark
+
+* Fri Jun 19 2020 Patsy Franklin <patsy(a)redhat.com> - 2.31.9000-15
+- Auto-sync with upstream branch master,
+ commit 27f8864bd41f0f1b61e8e947d9a030b1a0d23df9.
+- x86: Update F16C detection [BZ #26133]
+- Fix avx2 strncmp offset compare condition check [BZ #25933]
+- nptl: Remove now-spurious tst-cancelx9 references
+- x86_64: Use %xmmN with vpxor to clear a vector register
+- x86: Correct bit_cpu_CLFLUSHOPT [BZ #26128]
+- powerpc64le: refactor e_sqrtf128.c
+- Update syscall-names.list for Linux 5.7.
+- ieee754/dbl-64: Reduce the scope of temporary storage variables
+- manual: Add pthread_attr_setsigmask_np, pthread_attr_getsigmask_np
+- ld.so: Check for new cache format first and enhance corruption check
+- hurd: Fix __writev_nocancel_nostatus
+- hurd: Make send* cancellation points
+- htl: Enable more cancellation tests
+- hurd: Make write and pwrite64 cancellation points
+- htl: Fix cleanup support for IO locking
+- htl: Move cleanup stack to variable shared between libc and pthread
+- htl: initialize first and prevent from unloading
+- htl: Add noreturn attribute on __pthread_exit forward
+- hurd: Make recv* cancellation points
+- powerpc: Automatic CPU detection in preconfigure
+- Use Linux 5.7 in build-many-glibcs.py.
+- htl: Enable more cancel tests
+- htl: Fix linking static tests by factorizing the symbols list
+- Add "%d" support to _dl_debug_vdprintf
+- aarch64: MTE compatible strlen
+- aarch64: MTE compatible strchr
+- aarch64: MTE compatible strchrnul
+- AArch64: Merge Falkor memcpy and memmove implementations
+- hurd: document that gcc&gdb look at the trampoline code
+- pthread: Move back linking rules to nptl and htl
+- htl: Enable more tests
+- htl: Fix registration of atfork handlers in modules
+- htl: Fix tls initialization for already-created threads
+- hurd: Make read and pread64 cancellable
+- hurd: Fix unwinding over interruptible RPC
+- htl: Enable but XFAIL tst-flock2, tst-signal1, tst-signal2
+- hurd: XFAIL more tests that require setpshared support
+- hurd: Briefly document in xfails the topics of the bugzilla entries
+- htl: Enable more tests
+- htl: Add sem_clockwait support
+- htl: fix register-atfork ordering
+- hurd: Fix hang in _hurd_raise_signal from pthread_kill
+- hurd: Reject raising invalid signals
+- hurd: fix clearing SS_ONSTACK when longjmp-ing from sighandler
+- hurd: Add pointer guard support
+- hurd: Add stack guard support
+- dl-runtime: reloc_{offset,index} now functions arch overide'able
+- powerpc64le: add optimized strlen for P9
+- powerpc64le: use common fmaf128 implementation
+
+* Fri Jun 05 2020 Patsy Griffin <patsy(a)redhat.com> - 2.31.9000-14
+- Auto-sync with upstream branch master,
+ commit e52434a2e4d1105272daaef87678da950fbec73f.
+- benchtests: Restore the clock_gettime option
+- Update HP_TIMING_NOW for _ISOMAC in sysdeps/generic/hp-timing.h
+- Replace val with __val in TUNABLE_SET_VAL_IF_VALID_RANGE
+- support: Fix detecting hole support on >2KB-block filesystems
+- powerpc: Fix powerpc64le due a7a3435c9a
+- manual/jobs.texi: remove unused var from example code
+- powerpc/fpu: use generic fma functions
+- aarch/fpu: use generic builtins based math functions
+- ieee754: provide gcc builtins based generic fma functions
+- ieee754: provide gcc builtins based generic sqrt functions
+- Linux: Use __pthread_attr_setsigmask_internal for timer helper thread
+- nptl: Add pthread_attr_setsigmask_np, pthread_attr_getsigmask_np
+- nptl: Make pthread_attr_t dynamically extensible
+- nptl: Destroy the default thread attribute as part of freeres
+- nptl: Change type of __default_pthread_attr
+- nptl: Use __pthread_attr_setaffinity_np in pthread_getattr_np
+- nptl: Use __pthread_getattr_default_np in pthread_create
+- nptl: Add internal alias __pthread_getattr_default_np
+- htl: Fix gsync_wait symbol exposition
+- htl: Make pthread_cond_destroy wait for threads to be woken
+- htl: Enable more cond tests
+- tst-cond11: Fix build with _SC_MONOTONIC_CLOCK > 0
+- mbstowcs: Document, test, and fix null pointer dst semantics (Bug 25219)
+- build: Use FAIL_EXIT1 () on failure to exec child [BZ #23990]
+- manual: Fix backtraces code example [BZ #10441]
+- hurd: Fix fexecve
+- i386: Remove unused file sysdeps/unix/i386/sysdep.S
+- hurd: fix ptsname error when called on a non-tty
+- hurd: Fix fdopendir checking for directory type
+- i386: Remove NO_TLS_DIRECT_SEG_REFS handling
+- Hurd: Move <hurd/sigpreempt.h> internals into wrapper header
+- Hurd: Use __sigmask in favor of deprecated sigmask
+- hurd: Fix pselect atomicity
+- elf: Remove extra hwcap mechanism from ldconfig
+- elf: Do not read hwcaps from the vDSO in ld.so
+- linux: Use internal DIR locks when accessing filepos on telldir
+- Update i386 libm-test-ulps
+- htl: Add clock variants
+- signal: Deprecate additional legacy signal handling functions
+- elf: Turn _dl_printf, _dl_error_printf, _dl_fatal_printf into functions
+- x86: Update Intel Atom processor family optimization
+- elf.h: add aarch64 property definitions
+- elf.h: Add PT_GNU_PROPERTY
+- <libc-symbols.h>: Add libpthread hidden alias support
+- nptl: Use __pthread_attr_copy in pthread_setattr_default_np
+- nptl: Use __pthread_attr_copy in pthread_getattr_default_np (bug 25999)
+- nptl: Add __pthread_attr_copy for copying pthread_attr_t objects
+- nptl: Make __pthread_attr_init, __pthread_attr_destroy available internally
+- nptl: Move pthread_gettattr_np into libc
+- nptl: Move pthread_getaffinity_np into libc
+- nptl: Move pthread_attr_setaffinity_np into libc
+- nptl: Replace some stubs with the Linux implementation
+- Linux: Add missing handling of tai field to __ntp_gettime64
+- Mention GCC 10 attribute access.
+- y2038: Replace __clock_gettime with __clock_gettime64
+- manual: Add missing section and node for clockid_t wait functions
+- y2038: linux: Provide __ntp_gettimex64 implementation
+- y2038: linux: Provide __ntp_gettime64 implementation
+- y2038: Provide conversion helpers for struct __ntptimeval64
+- y2038: Introduce struct __ntptimeval64 - new internal glibc type
+- y2038: linux: Provide __adjtime64 implementation
+- y2038: linux: Provide ___adjtimex64 implementation
+- y2038: linux: Provide __clock_adjtime64 implementation
+- ldconfig: Default to the new format for ld.so.cache
+- nss_compat: internal_end*ent may clobber errno, hiding ERANGE [BZ #25976]
+- powerpc: Optimized rawmemchr for POWER9
+- x86: Add --enable-cet=permissive
+- Remove NO_CTORS_DTORS_SECTIONS macro
+- elf: Assert that objects are relocated before their constructors run
+- powerpc: Optimized stpcpy for POWER9
+- powerpc: Optimized strcpy for POWER9
+- x86: Move CET control to _dl_x86_feature_control [BZ #25887]
+- sunrpc/tst-udp-*: Fix timeout value
+- Linux: Remove remnants of the getcpu cache
+- Update timezone code from tzcode 2020a
+- aarch64: fix strcpy and strnlen for big-endian [BZ #25824]
+- locale: Add transliteration for Geresh, Gershayim (U+05F3, U+05F4)
+- string: Fix string/tst-memmove-overflow to compile with GCC 7
+- Add arch-syscall.h dependency for generating sysd-syscalls file
+- arm: XFAIL string/tst-memmove-overflow due to bug 25620
+- elf: Remove redundant add_to_global_resize_failure call from dl_open_args
+- string: Add string/tst-memmove-overflow, a test case for bug 25620
+- support: Add support_blob_repeat_allocate_shared
+- nptl: wait for pending setxid request also in detached thread (bug 25942)
+- aarch64: Accept PLT calls to __getauxval within libc.so
+- Use unsigned constants for ICMP6 filters [BZ #22489]
+- Linux: Enhance glibcsyscalls.py to support listing system calls
+
+* Mon May 11 2020 DJ Delorie <dj(a)redhat.com> - 2.31.9000-13
+- Auto-sync with upstream branch master,
+ commit 978e8ac39f8ba2d694031e521511da1ae803ccfc.
+- Suppress GCC 10 true positive warnings [BZ #25967]
+- POWER: Add context-synchronizing instructions to pkey_write [BZ #25954]
+- hurd: Add missing sigstate members initialization
+- x86-64: Use RDX_LP on __x86_shared_non_temporal_threshold [BZ #25966]
+- linux: Remove assembly umount2 implementation
+- signal: Use <sigsetops.h> for sigemptyset, sigfillset
+- ckb_IQ, or_IN locales: Add missing reorder-end keywords
+- semaphore: consolidate arch headers into a generic one
+- Use GCC 10 branch in build-many-glibcs.py.
+- Document the internal _ and N_ macros
+- y2038: Provide conversion helpers for struct __timex64
+- y2038: Introduce struct __timex64 - new internal glibc type
+- y2038: include: Move struct __timeval64 definition to a separate file
+- y2038: nscd: Modify nscd_helper to use __clock_gettime64
+- y2038: inet: Convert inet deadline to support 64 bit time
+- y2038: hurd: Provide __clock_gettime64 function
+- y2038: Export __clock_gettime64 to be usable in other libraries
+- manual: Document the O_NOFOLLOW open flag
+- powerpc64le/power9: guard power9 strcmp against rtld usage [BZ# 25905]
+- float128: use builtin_signbitf128 always
+- improve out-of-bounds checking with GCC 10 attribute access [BZ #25219]
+- nios2: delete sysdeps/unix/sysv/linux/nios2/kernel-features.h
+- powerpc: Rename argN to _argN in LOADARGS_N [BZ #25902]
+- locale/tst-localedef-path-norm: Don't create $(complocaledir)
+- support: Set errno before testing it.
+- localedef: Add tests-container test for --no-hard-links.
+- test-container: Support $(complocaledir) and mkdirp.
+- i386: Remove unused variable in sysdeps/x86/cacheinfo.c
+- Add a C wrapper for prctl [BZ #25896]
+- powerpc64le: Enable support for IEEE long double
+- powerpc64le: blacklist broken GCC compilers (e.g GCC 7.5.0)
+- powerpc64le: bump binutils version requirement to >= 2.26
+- powerpc64le: raise GCC requirement to 7.4 for long double transition
+- Rename __LONG_DOUBLE_USES_FLOAT128 to __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI
+- ldbl-128ibm-compat: workaround GCC 9 C++ PR90731
+- x86: Add the test case of __get_cpu_features support for Zhaoxin processors
+- x86: Add cache information support for Zhaoxin processors
+- x86: Add CPU Vendor ID detection support for Zhaoxin processors
+- Update translations
+- Add C wrappers for process_vm_readv/process_vm_writev [BZ #25810]
+- generic/typesizes.h: Add support for 32-bit arches with 64-bit types
+- semctl: Remove the sem-pad.h file
+- bits/sem.h: Split out struct semid_ds
+- Mark unsigned long arguments with U in more syscalls [BZ #25810]
+- elf: Add initial flag argument to __libc_early_init
+- Add SYSCALL_ULONG_ARG_[12] to pass long to syscall [BZ #25810]
+- Makeconfig: Use $(error ...) to output error message
+- manual: Fix typos in the fexecve description
+- misc: Remove sstk from the autogenerated system call list
+- Remove unused floating-point configuration from gmp-impl.h.
+- support: Implement <support/xthread.h> key create/delete
+- nptl/tst-setuid1-static: Improve isolation from system objects
+- Increase the timeout of locale/tst-localedef-path-norm
+- Use 2020 as copyright year.
+- misc: Turn sstk into a compat symbol
+- manual: Document the fexecve function
+- nptl: Start new threads with all signals blocked [BZ #25098]
+- localedef: Add verbose messages for failure paths.
+- Remove most gmp-mparam.h headers.
+- elf: Implement __libc_early_init
+- elf: Introduce <elf_machine_sym_no_match.h>
+- Add a syscall test for [BZ #25810]
+- elf: Support lld-style link map for librtld.map
+- signal: Only handle on NSIG signals on signal functions (BZ #25657)
+- linux: Use pthread_sigmask on sigprocmask
+- ia64: Remove sigprocmask/sigblock objects from libpthread
+- nptl: Move pthread_sigmask implementation to libc
+- Bug 25819: Update to Unicode 13.0.0
+
+* Wed Apr 29 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-12
+- nss_db.x86_64 should install nss_db.i686 if glibc.i686 is installed (#1807821)
+- Likewise for nss_hesiod.
+
+* Mon Apr 27 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-11
+- Introduce glibc-headers-x86, glibc-headers-s390 packages (#1828332)
+- Remove the glibc-headers package
+
+* Mon Apr 20 2020 DJ Delorie <dj(a)redhat.com> - 2.31.9000-10
+- Auto-sync with upstream branch master,
+ commit 0798b8ecc8da8667362496c1217d18635106c609.
+- ARC: Update syscall-names.list for ARC specific syscalls
+- Revert "x86_64: Add SSE sfp-exceptions"
+- provide y2038 safe socket constants for default/asm-generic ABI
+- x86_64: Add SSE sfp-exceptions
+- Remove __NO_MATH_INLINES
+- i686: Add INTERNAL_SYSCALL_NCS 6 argument support
+- Reset converter state after second wchar_t output (Bug 25734)
+- Fix typo in posix/tst-fnmatch.input (Bug 25790)
+
+* Wed Apr 15 2020 Patsy Griffin <patsy(a)redhat.com> - 2.31.9000-9
+- Auto-sync with upstream branch master,
+ commit 076f09afbac1aa57756faa7a8feadb7936a724e4.
+- Linux: Remove <sys/sysctl.h> and the sysctl function
+- posix: Add wait4 test case
+- linux: wait4: Fix incorrect return value comparison
+- hurd: add mach_print function
+- x32: Properly pass long to syscall [BZ #25810]
+- Add GRND_INSECURE from Linux 5.6 to sys/random.h
+- Update kernel version to 5.6 in tst-mman-consts.py.
+
+* Wed Apr 15 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-8
+- nsswitch.conf: don't add sss to shadow line
+
+* Wed Apr 08 2020 Carlos O'Donell <carlos(a)redhat.com> - 2.31.9000-7
+- Auto-sync with upstream branch master,
+ commit b1caa144c74678097cada5a54eda2996bb459d8f.
+- Update mips libm-test-ulps
+- Update alpha libm-test-ulps
+- Update ia64 libm-test-ulps
+- Update sparc libm-test-ulps
+- Update arm libm-test-ulps
+- Update aarch64 libm-test-ulps
+- Updates to the shn_MM locale [BZ #25532]
+- powerpc: Update ULPs and xfail more ibm128 outputs
+- i386: Remove build support for GCC older than GCC 6
+- oc_FR locale: Fix spelling of April (bug 25639)
+- Update hppa libm-test-ulps
+- y2038: linux: Provide __mq_timedreceive_time64 implementation
+- y2038: linux: Provide __mq_timedsend_time64 implementation
+- y2038: include: Move struct __timespec64 definition to a separate file
+- malloc: ensure set_max_fast never stores zero [BZ #25733]
+- powerpc64le: enforce non-specific long double in .gnu.attributes section
+- powerpc64le: workaround ieee long double / _Float128 stdc++ bug
+- powerpc64le: Enforce -mabi=ibmlongdouble when -mfloat128 used
+- powerpc64le/multiarch: don't generate strong aliases for fmaf128-ppc64
+- ldbl-128ibm: simplify iscanonical.h
+- i386: Disable check_consistency for GCC 5 and above [BZ #25788]
+- Add IPPROTO_ETHERNET and IPPROTO_MPTCP from Linux 5.6 to netinet/in.h.
+- Update syscall lists for Linux 5.6.
+- elf: Implement DT_AUDIT, DT_DEPAUDIT support [BZ #24943]
+- elf: Simplify handling of lists of audit strings
+- support: Change xgetline to return 0 on EOF
+- nptl: Remove x86_64 cancellation assembly implementations [BZ #25765]
+- aarch64: update bits/hwcap.h
+- Add tests for Safe-Linking
+- S390: Regenerate ULPs.
+- sysv/alpha: Use generic __timeval32 and helpers
+- linux: Use long time_t for wait4/getrusage
+- resource: Add a __rusage64 struct
+- linux: Use long time_t __getitimer/__setitimer
+- sysv: Define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64
+- math: Add inputs that yield larger errors for float type (x86_64)
+
+* Tue Mar 31 2020 DJ Delorie <dj(a)redhat.com> - 2.31.9000-6
+- Auto-sync with upstream branch master,
+ commit 49c3c37651e2d2ec4ff8ce21252bbbc08a9d6639.
+- Fix alignment bug in Safe-Linking
+- Typo fixes and CR cleanup in Safe-Linking
+- Use Linux 5.6 and GMP 6.2.0 in build-many-glibcs.py.
+- Add new file missed in previous hppa commit.
+- powerpc: Add support for fmaf128() in hardware
+- Fix data race in setting function descriptors during lazy binding on hppa.
+- sparc: Move __fenv_{ld,st}fsr to fenv-private.h
+- x86: Remove feraiseexcept optimization
+- math: Remove fenvinline.h
+- hurd: Make O_TRUNC update mtime/ctime
+- Add Safe-Linking to fastbins and tcache
+- Add benchtests for roundeven and roundevenf.
+- time: Add a __itimerval64 struct
+- time: Add a timeval with a 32-bit tv_sec and tv_usec
+- sysv/linux: Rename alpha functions to be alpha specific
+- ARC: add definitions to elf/elf.h
+- powerpc64: apply -mabi=ibmlongdouble to special files
+- powerpc64le: add -mno-gnu-attribute to *f128 objects and difftime
+- Makeconfig: sandwich gnulib-tests between libc/ld linking of tests
+- powerpc64le: Ensure correct ldouble compiler flags are used
+- Fix tests which expose ldbl -> _Float128 redirects
+- ldbl-128ibm-compat: PLT redirects for using ldbl redirects internally
+
+* Wed Mar 25 2020 Patsy Franklin <patsy(a)redhat.com> - 2.31.9000-5
+- Auto-sync with upstream branch master,
+ commit 4eda036f5b897fa8bc20ddd2099b5a6ed4239dc9.
+- stdlib: Move tst-system to tests-container
+- support/shell-container.c: Add builtin kill
+- support/shell-container.c: Add builtin exit
+- support/shell-container.c: Return 127 if execve fails
+- Add NEWS entry for CVE-2020-1751 (bug 25423)
+- posix: Fix system error return value [BZ #25715]
+- y2038: fix: Add missing libc_hidden_def attribute for some syscall wrappers
+- Extended Char Intro: Use getwc in example (Bug 25626)
+- stdio: Add tests for printf multibyte convertion leak [BZ#25691]
+- stdio: Remove memory leak from multibyte convertion [BZ#25691]
+- Add NEWS entry for CVE-2020-1752 (bug 25414)
+- math: Remove inline math tests
+- Remove __LIBC_INTERNAL_MATH_INLINES
+- math: Remove mathinline
+- m68k: Remove mathinline.h
+- oc_FR locale: Fix spelling of Thursday (bug 25639)
+- x86: Remove ARCH_CET_LEGACY_BITMAP [BZ #25397]
+- Fix build with GCC 10 when long double = double.
+- nscd/cachedumper.c : fix whitespace
+- Fix nscd/cachedumper.c compile errors
+- manual: Fix inconsistent declaration of wcsrchr [BZ #24655]
+- nscd: add cache dumper
+
+* Fri Mar 13 2020 Patsy Franklin <patsy(a)redhat.com> - 2.31.9000-4
+- Auto-sync with upstream branch master,
+ commit 2de7fe62534b7a6461c633114f03e9dff394f5f7.
+- parse_tunables: Fix typo in comment
+- ldconfig: trace origin paths with -v
+- test-container: print errno when execvp fails
+- [AArch64] Improve integer memcpy
+- Add NEWS entry for CVE-2020-10029 (bug 25487)
+- gcc PR 89877: miscompilation due to missing cc clobber in longlong.h macros
+- mips: Fix wrong INTERNAL_SYSCALL_ERROR_P check from bc2eb9321e
+- elf: Fix wrong indentation from commit eb447b7b4b
+- y2038: linux: Provide __futimesat64 implementation
+- y2038: linux: Provide __lutimes64 implementation
+- y2038: linux: Provide __futimes64 implementation
+- y2038: fix: Add missing libc_hidden_def for __futimens64
+- sparc: Move sigreturn stub to assembly
+- ldbl-128ibm: Let long double files have specific compiler flags
+- ldbl-128ibm-compat: Add tests for IBM long double functions
+- powerpc: Fix feraiseexcept and feclearexcept macros
+- arm: Fix softp-fp Implies (BZ #25635)
+- Remove reference of --without-fp on configure
+- linux/sysipc: Include linux/posix_types.h for __kernel_mode_t
+- Improve IFUNC check [BZ #25506]
+- linux: Clear mode_t padding bits (BZ#25623)
+- linux: Remove aarch64 ipc_priv.h
+- Linux: Use __fstatat64 in fchmodat implementation
+- Linux: Use AT_FDCWD in utime, utimes when calling utimensat
+- S390: Remove backchain-based fallback and use generic backtrace.c.
+- manual: Fix wrong declaration of wcschr [BZ #24654]
+- manual: Fix typo in parse_printf_format example [BZ #24638]
+
+* Thu Mar 5 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-3
+- Emergency patch for broken utimes/utime functions
+
+* Tue Mar 03 2020 Patsy Franklin <patsy(a)redhat.com> - 2.31.9000-2
+- Auto-sync with upstream branch master,
+ commit 78c9d0c6efabe2067ef7f93cd36325f54c60adc2.
+- Update translations
+- Convert Python scripts to Python 3
+- alpha: Do not build with -fpic
+- y2038: linux: Provide __utime64 implementation
+- y2038: linux: Provide __utimes64 implementation
+- y2038: Introduce struct __utimbuf64 - new internal glibc type
+- microblaze: vfork is always available
+- m68k: getpagesize syscall number is always available
+- Linux: epoll_pwait syscall number is always available
+- x86_64: Do not define __NR_semtimedop in <sysdep.h>
+- ia64: Do not define __NR_semtimedop in <sysdep.h>
+- Linux: open_by_handle_at syscall number is always available
+- Linux: set_robust_list syscall number is always available
+- Linux: pciconfig_iobase syscall number is always available on alpha
+- Linux: getdents64 syscall number is always available on MIPS
+- Linux: Clean up preadv2, pwritev2 system call names
+- Linux: exit_group syscall number is always available
+- Linux: set_tid_address syscall number is always available
+- Linux: pkey_mprotect syscall number is always available
+- Linux: rt_sigqueueinfo syscall number is always available
+- Linux: getrandom syscall number is always available
+- Linux: Clean up preadv, pwritev system call names
+- Linux: Clean up pread64/pwrite64 system call names
+- Linux: sigaltstack syscall number is always available
+- Linux: sched_getaffinity syscall number is always available
+- Linux: sched_setaffinity syscall number is always available
+- Linux: statx syscall number is always available
+- Linux: mq_* syscall numbers are always available
+- Linux: mlock2 syscall number is always available
+- Linux: copy_file_range syscall number is always available
+- Linux: renameat2 syscall number is always available
+- build-many-glibcs.py: Add list-compilers, list-glibcs commands
+- build-many-glibcs.py: Add --shallow option
+- Fixed typo in run_command_array() in support/shell-container.c
+- Add missing libc_hidden_def for __utimensat64
+- elf: Add elf/check-wx-segment, a test for the presence of WX segments
+- i386: Use comdat instead of .gnu.linkonce for i386 setup pic register (BZ #20543)
+- ldbl-128ibm-compat: link tst-ldbl-efgcvt against loader too
+- ldbl-128ibm-compat: enforce ibm128 on compat tests
+- ldbl-128ibm-compat: Provide nexttoward functions
+- ldbl-128ibm-compat: Provide a significand implementation
+- ldbl-128ibm-compat: Redirect complex math functions
+- ldbl-128ibm-compat: Redirect long double functions to f128/ieee128 functions
+- posix: Remove posix waitid
+- posix: Refactor tst-waitid (BZ #14666)
+- support: Add support_process_state_wait
+- malloc/tst-mallocfork2: Kill lingering process for unexpected failures
+
+* Wed Feb 26 2020 Patsy Franklin <patsy(a)redhat.com> - 2.31.9000-1
+- Auto-sync with upstream branch master,
+ commit 758599bc9dcc5764e862bd9e1613c5d1e6efc5d3.
+- elf: Apply attribute_relro to pointers in elf/dl-minimal.c
+- powerpc: Refactor fenvinline.h
+- nss_nis: Use NSS_DECLARE_MODULE_FUNCTIONS
+- csu: Use ELF constructor instead of _init in libc.so
+- ldbl-128ibm: make ieee754.h work with IEEE 128 long double
+- ldbl-128ibm-compat: fixup subdir location of several funcs
+- ldbl-128ibm-compat: enforce correct abi flags on internal file
+- ldbl-128ibm-compat: Provide ieee128 symbols to narrow functions
+- Undefine redirections after long double definition on __LDBL_COMPAT [BZ #23294]
+- nios2: Fix Linux kABI for syscall return
+- Fix use-after-free in glob when expanding ~user (bug 25414)
+- nptl: Move pthread_setschedparam implementation into libc
+- nptl: Move pthread_getschedparam implementation into libc
+- Add hidden prototypes for __sched_getparam, __sched_getscheduler
+- nptl: Move pthread_cond_init implementation into libc
+- nptl: Move pthread_cond_destroy implementation into libc
+- nptl: Move pthread_condattr_init implementation into libc
+- nptl: Move pthread_condattr_destroy implementation into libc
+- nptl: Move pthread_attr_setscope implementation into libc
+- nptl: Move pthread_attr_getscope implementation into libc
+- nptl: Move pthread_attr_setschedpolicy implementation into libc
+- nptl: Move pthread_attr_getschedpolicy implementation into libc
+- nptl: Sort routines list in Makefile alphabetically
+- nptl: Use .NOTPARALLEL in Makefile only if actually running tests
+- Block all signals on timer_create thread (BZ#10815)
+- Fix tst-pkey expectations on pkey_get [BZ #23202]
+- y2038: linux: Provide __gettimeofday64 implementation
+- Linux: Work around kernel bugs in chmod on /proc/self/fd paths [BZ #14578]
+- Introduce <elf-initfini.h> and ELF_INITFINI for all architectures
+- mips: Fix bracktrace result for signal frames
+- Move implementation of <file_change_detection.h> into a C file
+- <fd_to_filename.h>: Add type safety and port to Hurd
+- Prepare redirections for IEEE long double on powerpc64le
+- conform/conformtest.py: Extend tokenizer to cover character constants
+- stdlib: Reduce namespace pollution in <inttypes.h>
+- x86: Avoid single-argument _Static_assert in <tls.h>
+- x86 tls: Use _Static_assert for TLS access size assertion
+- htl: Link internal htl tests against libpthread
+- pthread: Fix building tst-robust8 with nptl
+- pthread: Move robust mutex tests from nptl to sysdeps/pthread
+- htl: Remove stub warning for pthread_mutexattr_setpshared
+- htl: Add missing functions and defines for robust mutexes
+- htl: Only check pthread_self coherency when DEBUG is set
+- hurd: Add THREAD_GET/SETMEM/_NC
+- hurd tls: update comment about fields at the end of tcbhead
+- ld.so: Do not export free/calloc/malloc/realloc functions [BZ #25486]
+- Remove weak declaration of free from <inline-hashtab.h>
+- elf: Extract _dl_sym_post, _dl_sym_find_caller_map from elf/dl-sym.c
+- elf: Introduce the rtld-stubbed-symbols makefile variable
+- arm: fix use of INTERNAL_SYSCALL_CALL
+- linux: Remove INTERNAL_SYSCALL_DECL
+- nptl: Remove ununsed pthread-errnos.h rule
+- linux: Consolidate INLINE_SYSCALL
+- s390: Consolidate Linux syscall definition
+- riscv: Avoid clobbering register parameters in syscall
+- microblaze: Avoid clobbering register parameters in syscall
+- nios2: Use Linux kABI for syscall return
+- mips: Use Linux kABI for syscall return
+- mips64: Consolidate Linux sysdep.h
+- ia64: Use Linux kABI for syscall return
+- alpha: Refactor syscall and Use Linux kABI for syscall return
+- sparc: Avoid clobbering register parameters in syscall
+- sparc: Use Linux kABI for syscall return
+- powerpc: Use Linux kABI for syscall return
+- powerpc: Consolidate Linux syscall definition
+- i386: Enable CET support in ucontext functions
+- tst-clone3: Use __NR_futex_time64 if we don't have __NR_futex
+- powerpc64: Add memory protection key support [BZ #23202]
+- ldbl-128ibm-compat: Provide a scalb implementation
+- Add a generic scalb implementation
+- Adjust thresholds in Bessel function implementations (bug 14469).
+- resolv: Fix ABA race in /etc/resolv.conf change detection [BZ #25420]
+- resolv: Enhance __resolv_conf_load to capture file change data
+- resolv: Fix file handle leak in __resolv_conf_load [BZ #25429]
+- resolv: Use <file_change_detection.h> in __resolv_conf_get_current
+- Add STATX_ATTR_VERITY from Linux 5.5 to bits/statx-generic.h.
+- Use gcc -finput-charset=ascii for check-installed-headers.
+- math/test-sinl-pseudo: Use stack protector only if available
+- alpha: Fix static gettimeofday symbol
+- nss_nisplus: Use NSS_DECLARE_MODULE_FUNCTIONS
+- nss_dns: Use NSS_DECLARE_MODULE_FUNCTIONS
+- nss_files: Use NSS_DECLARE_MODULE_FUNCTIONS
+- nss_db: Use NSS_DECLARE_MODULE_FUNCTIONS
+- nss_compat: Use NSS_DECLARE_MODULE_FUNCTIONS
+- nss_hesiod: Use NSS_DECLARE_MODULE_FUNCTIONS
+- nss: Add function types and NSS_DECLARE_MODULE_FUNCTIONS macro to <nss.h>
+- nss_compat: Do not use nss_* names for function pointers
+- Avoid ldbl-96 stack corruption from range reduction of pseudo-zero (bug 25487).
+- mips: Fix argument passing for inlined syscalls on Linux [BZ #25523]
+- mips: Use 'long int' and 'long long int' in linux syscall code
+- alpha: Use generic gettimeofday implementation
+- sunrpc: Properly clean up if tst-udp-timeout fails
+- elf: avoid stack allocation in dl_open_worker
+- elf: avoid redundant sort in dlopen
+- elf: Allow dlopen of filter object to work [BZ #16272]
+- Update translations
+- Rename RWF_WRITE_LIFE_NOT_SET to RWH_WRITE_LIFE_NOT_SET following Linux 5.5.
+- S390: Fix non-ascii character in fenv.h.
+- io: Add io/tst-lchmod covering lchmod and fchmodat
+- Linux: Emulate fchmodat with AT_SYMLINK_NOFOLLOW using O_PATH [BZ #14578]
+- io: Implement lchmod using fchmodat [BZ #14578]
+- Add internal <file_change_detection.h> header file
+- elf.h: Add R_RISCV_IRELATIVE
+- Fix typo in the name for Wednesday in Kurdish [BZ #9809]
+- debug: Add missing locale dependencies of fortify tests
+- htl C11 threads: Avoid pthread_ symbols visibility in static library
+- hurd: Add __pthread_spin_wait and use it
+- ldbl-128ibm-compat: set PRINTF_CHK flag in {,v}sprintf_chk
+- Use --disable-gdbserver in build-many-glibcs.py.
+- Improve random memcpy benchmark
+- nptl: update default pthread-offsets.h
+- nptl: add missing pthread-offsets.h
+- htl: Avoid a local plt for pthread_self
+- pthread: Move some join tests from nptl to sysdeps/pthread
+- htl: Make joining self return EDEADLK
+- pthread: Move most barrier tests from nptl to sysdeps/pthread
+- htl: Fix barrier_wait with one thread
+- pthread: Move most sem tests from nptl to sysdeps/pthread
+- htl: Make sem_wait/sem_timedwait interruptible
+- htl: Make sem_open return ENOSYS
+- htl: Add support for semaphore maximum value
+- pthread: Move key tests from nptl to sysdeps/pthread
+- hurd: Make nanosleep a cancellation point
+- htl: Add support for libc cancellation points
+- htl: clean __pthread_get_cleanup_stack hidden proto
+- htl: XFAIL rwlock tests which need pshared support
+- pthread: Move some rwlock tests from nptl to sysdeps/pthread
+- pthread: Move most once tests from nptl to sysdeps/pthread
+- htl: support cancellation during pthread_once
+- pthread: Move most cond tests from nptl to sysdeps/pthread
+- htl: make pthread_cond_destroy return EBUSY on waiters
+- htl: Report missing mutex lock on pthread_cond_*wait
+- htl: Fix linking static testcases
+- htl: Move __register_atfork from forward to own file
+- pthread: Move some attr tests from nptl to sysdeps/pthread
+- htl: Fix default guard size
+- pthread: Move most mutex tests from nptl to sysdeps/pthread
+- pthread: Move spin tests from nptl to sysdeps/pthread
+- htl: make pthread_spin_lock really spin
+- htl: Avoid check-installed-headers looking at inlines
+- htl: Do not put spin_lock inlines in public headers
+- pthread: Move basic tests from nptl to sysdeps/pthread
+- htl: Fix calling pthread_exit in the child of a fork
+- x86: Remove <bits/select.h> and use the generic version
+- C11 threads: Move implementation to sysdeps/pthread
+- htl: Add C11 threads types definitions
+- C11 threads: make thrd_join more portable
+- C11 threads: Fix thrd_t / pthread_t compatibility assertion
+- C11 threads: do not require PTHREAD_DESTRUCTOR_ITERATIONS
+- nptl: Move nptl-specific types to separate header
+- htl: Make __PTHREAD_ONCE_INIT more flexible
+- htl: Add support for C11 threads behavior
+- htl: Add missing internal functions declarations
+- htl: Rename _pthread_mutex_init/destroy to __pthread_mutex_init/destroy
+- htl: Move internal mutex/rwlock symbols to GLIBC_PRIVATE
+- Linux: Add io/tst-o_path-locks test
+- support: Add the xlstat function
+- htl: Remove duplicate files
+- htl: Remove unused files
+- resolv: Fix CNAME chaining in resolv/tst-resolv-ai_idn-common.c
+- Remove a comment claiming that sin/cos round correctly.
+- y2038: linux: Provide __settimeofday64 implementation
+- y2038: Provide conversion helpers for struct __timeval64
+- y2038: alpha: Rename valid_timeval64_to_timeval to valid_timeval_to_timeval32
+- y2038: alpha: Rename valid_timeval_to_timeval64 to valid_timeval32_to_timeval
+- y2038: Introduce struct __timeval64 - new internal glibc type
+- y2038: Define __suseconds64_t type to be used with struct __timeval64
+- Update kernel version to 5.5 in tst-mman-consts.py.
+- Update syscall lists for Linux 5.5.
+- NEWS: Set fill-column hint to 72
+- y2038: linux: Provide __timespec_get64 implementation
+- Use binutils 2.34 branch in build-many-glibcs.py.
+- Run nptl/tst-pthread-getattr in a container
+- test-container: add exec, cwd
+- Use Linux 5.5 in build-many-glibcs.py.
+- rt: avoid PLT setup in timer_[sg]ettime
+- Update or_IN collation [BZ #22525]
+- Fix ckb_IQ [BZ #9809]
+- Add new locale: ckb_IQ (Kurdish/Sorani spoken in Iraq) [BZ #9809]
+- list-fixed-bugs.py: Wrap at 72 chars
+- y2038: linux: Provide __sched_rr_get_interval64 implementation
+- y2038: linux: Provide __timerfd_settime64 implementation
+- y2038: linux: Provide __timerfd_gettime64 implementation
+- i386: Remove _exit.S
+- i386: Use ENTRY/END in assembly codes
+- i386-mcount.S: Add _CET_ENDBR to _mcount and __fentry__
+- i386/sub_n.S: Add a missing _CET_ENDBR to indirect jump target
+- i386: Don't unnecessarily save and restore EAX, ECX and EDX [BZ# 25262]
+- x86: Don't make 2 calls to dlerror () in a row
+- Open master for 2.32 development
+
+* Mon Feb 03 2020 DJ Delorie <dj(a)redhat.com> - 2.31-1
+- Auto-sync with upstream branch release/2.31/master,
+ commit 9ea3686266dca3f004ba874745a4087a89682617.
+- glibc 2.31 release
+- Generate ChangeLog.old/ChangeLog.20 for 2.31
+- Add bugs fixed in 2.31 in NEWS
+- Update newest tested versions of dependencies in install.texi
+- Add more contributors to the manual
+- Add note to NEWS about kernel headers dependency on risc-v
+- Add Portuguese (Portugal) translation
+- Add NEWS entry about 64-bit time_t syscall use on 32-bit targets
+- nptl: Avoid using PTHREAD_MUTEX_DEFAULT in macro definition [BZ #25271]
+
+* Thu Jan 30 2020 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-33
+- Auto-sync with upstream branch master,
+ commit 352bb99754ae7c83ff1b974f9c52244e974c9410.
+- Build raise with -fasynchronous-unwind-tables.
+- Fix locale/tst-locale-locpath cross-testing when sshd sets LANG.
+- Fix elf/tst-rtld-preload cross-testing.
+- Fix cross-testing of tst-ifunc-fault-* tests.
+- gitlog-to-changelog: Drop scripts in favour of gnulib version
+- Add NEWS entry about the change in handling of PT_GNU_STACK on MIPS
+- Fix array overflow in backtrace on PowerPC (bug 25423)
+- getaddrinfo: Fix resource leak after strdup failure in gethosts (swbz#25425)
+
+* Tue Jan 28 2020 Fedora Release Engineering <releng(a)fedoraproject.org>
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
+
+* Mon Jan 20 2020 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-31
+- Auto-sync with upstream branch master,
+ commit 92ce43eef7ac844782d50a8015d977d216fbadec.
+- Run bench-timing-type with newly built libc.
+- Get rid of Werror=maybe-uninitialized in res_send.c.
+- translations: Update translations
+- translations: Trim po files using msgattrib
+- Update translations
+- translations: Run msgmerge when downloading translations
+- Fix maybe-uninitialized error on powerpc
+- powerpc32: Fix syntax error in __GLRO macro
+- Remove incorrect alloc_size attribute from pvalloc (swbz#25401)
+
+* Fri Jan 17 2020 Florian Weimer <fweimer(a)redhat.com> - 2.30.9000-30
+- Auto-sync with upstream branch master,
+ commit 70ba28f7ab2923d4e36ffc9d5d2e32357353b25c:
+- Fix tst-pkey.c pkey_alloc return checks and manual
+- powerpc: Move cache line size to rtld_global_ro
+- powerpc: Initialize rtld_global_ro for static dlopen (swbz#20802)
+- Revert outdated translations
+- vcs-to-changelog: Add quirk for __nonnull
+- elf: Add elf/tst-dlopenfail-2 (swbz#25396, #1395758)
+- Clear GL(dl_initfirst) when freeing its link_map (swbz#25396, #1395758)
+- Update Translations
+- Fix "elf: Add tst-ldconfig-ld_so_conf-update test" on 32bit.
+- elf: Add tst-ldconfig-ld_so_conf-update test
+- sl_SI locale: Use "." as the thousands separator (swbz#25233)
+
+* Mon Jan 06 2020 Arjun Shankar <arjun(a)redhat.com> - 2.30.9000-29
+- Auto-sync with upstream branch master,
+ commit cbce69e70dc4b04fefcc7257e593733b8b03856c:
+- Multiple locales: Add date_fmt (bug 24054)
+- Update libc.pot for 2.31 release
+- Add libm_alias_finite for _finite symbols
+- Linux: Fix clock_nanosleep time64 check
+- linux: Fix vDSO macros build with time64 interfaces
+- x86: Make x32 use x86 time implementation
+- Remove vDSO support from make-syscall.sh
+- linux: Update x86 vDSO symbols
+- linux: Update mips vDSO symbols
+- linux: Consolidate Linux gettimeofday
+- linux: Consolidate time implementation
+- elf: Enable relro for static build
+- elf: Move vDSO setup to rtld (BZ#24967)
+- linux: Add support for clock_gettime64 vDSO
+- linux: Optimize fallback 32-bit clock_gettime
+- linux: Enable vDSO clock_gettime64 for i386
+- linux: Enable vDSO clock_gettime64 for arm
+- linux: Enable vDSO clock_gettime64 for mips
+- linux: Add support for clock_getres64 vDSO
+- linux: Optimize fallback 32-bit clock_getres
+- htl: Use dso_handle.h
+- htl: Drop common tcbhead_t definition
+- htl: Move pthread_atfork to libc_nonshared.a
+- htl: Add __errno_location and __h_errno_location
+- hurd: Fix message reception for timer_thread
+
+* Thu Jan 02 2020 Florian Weimer <fweimer(a)redhat.com> - 2.30.9000-28
+- Auto-sync with upstream branch master,
+ commit cc47d5c5f53f6d845ac54698ae8929af15662c44:
+- Linux: Use built-in system call tables
+- lv_LV locale: Correct the time part of d_t_fmt (swbz#25324)
+- km_KH locale: Use "%M" instead of "m" in d_t_fmt (swbz#25323)
+- ldbl-128ibm-compat: Do not mix -mabi=*longdouble and -mlong-double-128
+- ldbl-128ibm-compat: Compiler flags for stdio functions
+- Do not redirect calls to __GI_* symbols, when redirecting to *ieee128
+- aarch64: add default memcpy version for kunpeng920
+- aarch64: ifunc rename for kunpeng
+- aarch64: Modify error-shown comments for strcpy
+- linux: Consolidate sigprocmask
+- Fix return code for __libc_signal_* functions
+- nptl: Remove duplicate internal __SIZEOF_PTHREAD_MUTEX_T (swbz#25241)
+
+* Thu Dec 26 2019 Carlos O'Donell <carlos(a)redhat.com> - 2.30.9000-27
+- Auto-sync with upstream branch master,
+ commit b8c210bcc74840d24c61d39bde15bea9daf3e271.
+- mnw_MM, my_MM, and shn_MM locales: Do not use %Op
+- Avoid compat symbols for totalorder in powerpc64le IEEE long double
+- ldbl-128ibm-compat: Add *cvt functions
+- Refactor *cvt functions implementation (2/2)
+- Refactor *cvt functions implementation (1/2)
+- Add exception-based flags for wait4
+- aarch64: Optimized memset for Kunpeng processor.
+- aarch64: Optimized strlen for strlen_asimd
+- aarch64: Add Huawei Kunpeng to tunable cpu list
+- aarch64: Optimized implementation of memrchr
+- aarch64: Optimized implementation of strnlen
+- aarch64: Optimized implementation of strcpy
+- aarch64: Optimized implementation of memcmp
+- Consolidate wait3 implementations
+- Implement waitpid in terms of wait4
+- linux: Use waitid on wait4 if __NR_wait4 is not defined
+- Implement wait in terms of waitpid
+- nptl: Move waitpid implementation to libc
+- nptl: Move wait implementation to libc
+- Remove __waitpid_nocancel
+- Fix test isolation for elf/tst-ifunc-fault-lazy, elf/tst-ifunc-fault-bindnow
+- Fix __libc_signal_block_all on sparc64
+- powerpc: Do not run IFUNC resolvers for LD_DEBUG=unused [BZ #24214]
+
+* Thu Dec 19 2019 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-26
+- Auto-sync with upstream branch master,
+ commit 3dcad8158f43d71d5b8f6f317f82952ddf3468f3.
+- hurd: Do not make sigprocmask available in ld.so
+- build-many-glibcs.py: Do not build C++ PCHs by default
+- hurd: Make getrandom honour GRND_NONBLOCK
+- tunables: report sbrk() failure
+- build-many-glibcs.py: Add mipsisa64r6el-linux-gnu target
+- mips: Do not include hi and lo in __SYSCALL_CLOBBERS for R6
+- ldbl-128ibm-compat: Add ISO C99 versions of scanf functions
+- ldbl-128ibm-compat: Fix selection of GNU and ISO C99 scanf
+- hurd: Fix local PLT
+- dlopen: Do not block signals
+- dlopen: Rework handling of pending NODELETE status
+- dlopen: Fix issues related to NODELETE handling and relocations
+- hurd: Fix __close_nocancel_nostatus availability
+- hurd: add getrandom and getentropy implementations
+- hurd: Implement __close_nocancel_nostatus
+- manual: clarify fopen with the x flag
+- S390: Use sysdeps/ieee754/dbl-64/wordsize-64 on s390x.
+- S390: Implement roundtoint and converttoint and define TOINT_INTRINSICS.
+- S390: Implement math-barriers math_opt_barrier and math_force_eval.
+- S390: Use libc_fe* macros in fe* functions.
+- S390: Implement libc_fe* macros.
+- S390: Use convert-to-fixed instruction for llround functions.
+- S390: Use convert-to-fixed instruction for lround functions.
+- S390: Use convert-to-fixed instruction for llrint functions.
+- S390: Use convert-to-fixed instruction for lrint functions.
+- S390: Use load-fp-integer instruction for roundeven functions.
+- Adjust s_copysignl.c regarding code style.
+- Adjust s_ceilf.c and s_ceill.c regarding code style.
+- Adjust s_floorf.c and s_floorl.c regarding code style.
+- Adjust s_rintf.c and s_rintl.c regarding code style.
+- Adjust s_nearbyintf.c and s_nearbyintl.c regarding code style.
+- Use GCC builtins for copysign functions if desired.
+- Use GCC builtins for round functions if desired.
+- Use GCC builtins for trunc functions if desired.
+- Use GCC builtins for ceil functions if desired.
+- Use GCC builtins for floor functions if desired.
+- Use GCC builtins for rint functions if desired.
+- Use GCC builtins for nearbyint functions if desired.
+- Always use wordsize-64 version of s_round.c.
+- Always use wordsize-64 version of s_trunc.c.
+- Always use wordsize-64 version of s_ceil.c.
+- Always use wordsize-64 version of s_floor.c.
+- Always use wordsize-64 version of s_rint.c.
+- Always use wordsize-64 version of s_nearbyint.c.
+- ldconfig: Do not print a warning for a missing ld.so.conf file
+- hurd: Fix using altstack while in an RPC call to be aborted
+- Fix failure when CFLAGS contains -DNDEBUG (Bug 25251)
+
+* Mon Dec 09 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-25
+- Auto-sync with upstream branch master,
+ commit 0487ebed2278b20971af4cabf186fd3681adccf0.
+- nptl: Add more missing placeholder abi symbol from nanosleep move
+- sysdeps/riscv/start.S: rename .Lload_gp to load_gp (bug 24376)
+- y2038: linux: Provide __timer_settime64 implementation
+- y2038: linux: Provide __timer_gettime64 implementation
+- timer: Decouple x86_64 specific timer_settime from generic Linux implementation
+- timer: Decouple x86_64 specific timer_gettime from generic Linux implementation
+- time: Introduce glibc's internal struct __itimerspec64
+- Correct range checking in mallopt/mxfast/tcache [BZ #25194]
+- misc/test-errno-linux: Handle EINVAL from quotactl
+- <string.h>: Define __CORRECT_ISO_CPP_STRING_H_PROTO for Clang [BZ #25232]
+- build-many-glibcs.py: Move sparcv8 to extra_glibcs
+
+* Thu Dec 5 2019 Florian Weimer <fweimer(a)redhat.com> - 2.30.9000-24
+- Upstream patches for fallout from dlopen NODELETE changes (#1778344, #1778366)
+
+* Wed Dec 04 2019 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-23
+- Auto-sync with upstream branch master,
+ commit ec138c67cbda8b5826a0a2a7ba456408117996dc.
+- sysdeps: Add clock_gettime64 vDSO
+- Do not use ld.so to open statically linked programs in debugglibc.sh
+- Attach to test in container from debugglibc.sh
+- Expand $(as-needed) and $(no-as-needed) throughout the build system
+- x86: Assume --enable-cet if GCC defaults to CET [BZ #25225]
+- ldbl-128ibm-compat: Add tests for strfroml, strtold, and wcstold
+- ldbl-128ibm-compat: Add tests for strfmon and strfmon_l
+- ldbl-128ibm-compat: Add strfmon_l with IEEE long double format
+- ldbl-128ibm-compat: Replace http with https in new files
+- elf: Do not run IFUNC resolvers for LD_DEBUG=unused [BZ #24214]
+- elf/tst-dlopenfail: Disable --no-as-needed for tst-dlopenfailmod1.so
+- hurd: Fix ld.so __access override from libc
+- hurd: Fix ld.so __getcwd override from libc
+- hurd: Make __sigprocmask GLIBC_PRIVATE
+- hurd: Fix renameat2 error
+- hurd: make strerror(0) coherent with other ports
+- hurd: Fix ld.so link
+- Update kernel version to 5.4 in tst-mman-consts.py.
+- Update SOMAXCONN value from Linux 5.4.
+- Update syscall-names.list for Linux 5.4.
+- Fix syntax error in build-many-glibcs.py.
+- Define MADV_COLD and MADV_PAGEOUT from Linux 5.4.
+
+* Mon Dec 2 2019 Florian Weimer <fweimer(a)redhat.com> - 2.30.9000-22
+- dlopen: Remove incorrect assert in activate_nodelete (#1778344)
+
+* Thu Nov 28 2019 Florian Weimer <fweimer(a)redhat.com> - 2.30.9000-21
+- Auto-sync with upstream branch master,
+ commit e37c2cf299b61ce18f62852f6c5624c27829b610:
+- Move _dl_open_check to its original place in dl_open_worker
+- Block signals during the initial part of dlopen
+- Remove all loaded objects if dlopen fails, ignoring NODELETE (#1395758)
+- Avoid late dlopen failure due to scope, TLS slotinfo updates (swbz#25112)
+- Avoid late failure in dlopen in global scope update (swbz#25112)
+- Lazy binding failures during dlopen/dlclose must be fatal (swbz#24304)
+- resolv: Implement trust-ad option for /etc/resolv.conf (#1164339)
+- dlsym: Do not determine caller link map if not needed
+- libio: Disable vtable validation for pre-2.1 interposed handles (swbz#25203)
+- ldbl-128ibm-compat: Add syslog functions
+- ldbl-128ibm-compat: Add obstack printing functions
+- ldbl-128ibm-compat: Reuse tests for err.h and error.h functions
+- ldbl-128ibm-compat: Add error.h functions
+- ldbl-128ibm-compat: Add err.h functions
+- ldbl-128ibm-compat: Add argp_error and argp_failure
+- sparc: Use atomic compiler builtins on sparc
+- Remove 32 bit sparc v7 support
+
+* Wed Nov 27 2019 Arjun Shankar <arjun(a)redhat.com> - 2.30.9000-20
+- Auto-sync with upstream branch master,
+ commit bfdb731438206b0f70fe7afa890681155c30b419:
+- rtld: Check __libc_enable_secure for LD_PREFER_MAP_32BIT_EXEC (CVE-2019-19126)
+- Introduce DL_LOOKUP_FOR_RELOCATE flag for _dl_lookup_symbol_x
+- Enable inlining issignalingf within glibc
+- Don't use a custom wrapper macro around __has_include (bug 25189).
+- Remove duplicate inline implementation of issignalingf
+- misc: Set generic pselect as ENOSYS
+- Use DEPRECATED_SCANF macro for remaining C99-compliant scanf functions
+- ldbl-128ibm-compat: Add regular/wide character printing printing functions
+- ldbl-128ibm-compat: Test double values and positional arguments
+- ldbl-128ibm-compat: Add regular/wide character scanning functions
+- arm: Fix armv7 selection after 'Split BE/LE abilist'
+- Use Linux 5.4 in build-many-glibcs.py.
+- sysdeps/posix: Simplify if expression in getaddrinfo
+- sysdeps/posix/getaddrinfo: Return early on invalid address family
+- ru_UA locale: use copy "ru_RU" in LC_TIME (bug 25044)
+- locale: Greek -> ASCII transliteration table [BZ #12031]
+- nptl: Cleanup mutex internal offset tests
+- nptl: Add tests for internal pthread_rwlock_t offsets
+- nptl: Remove rwlock elision definitions
+- nptl: Add struct_mutex.h and struct_rwlock.h
+- nptl: Add default pthreadtypes-arch.h and pthread-offsets.h
+- Compile elf/rtld.c with -fno-tree-loop-distribute-patterns.
+- nptl: Fix __PTHREAD_MUTEX_INITIALIZER for !__PTHREAD_MUTEX_HAVE_PREV
+- S390: Fix handling of needles crossing a page in strstr z15 ifunc [BZ #25226]
+
+* Mon Nov 18 2019 Patsy Griffin <patsy(a)redhat.com> - 2.30.9000-19
+- Auto-sync with upstream branch master,
+ commit 2a764c6ee848dfe92cb2921ed3b14085f15d9e79.
+- Enhance _dl_catch_exception to allow disabling exception handling
+- hurd: Suppress GCC 10 -Warray-bounds warning in init-first.c [BZ #25097]
+- linux: Add comment on affinity set sizes to tst-skeleton-affinity.c
+- Avoid zero-length array at the end of struct link_map [BZ #25097]
+- Introduce link_map_audit_state accessor function
+- Properly initialize audit cookie for the dynamic loader [BZ #25157]
+- nios2: Work around backend bug triggered by csu/libc-tls.c (GCC PR 92499)
+- Redefine _IO_iconv_t to store a single gconv step pointer [BZ #25097]
+- Add new script for plotting string benchmark JSON output
+- support: Fix support_set_small_thread_stack_size to build on Hurd
+- login: Use pread64 in utmp implementation
+- Clarify purpose of assert in _dl_lookup_symbol_x
+- aarch64: Increase small and medium cases for __memcpy_generic
+- login: Introduce matches_last_entry to utmp processing
+
+* Tue Nov 12 2019 Arjun Shankar <arjun(a)redhat.com> - 2.30.9000-18
+- Auto-sync with upstream branch master,
+ commit cba932a5a9e91cffd7f4172d7e91f9b2efb1f84b:
+- nptl: Move nanosleep implementation to libc
+- Refactor nanosleep in terms of clock_nanosleep
+- nptl: Refactor thrd_sleep in terms of clock_nanosleep
+- math: enhance the endloop condition of function handle_input_flag
+- hurd: Remove lingering references to the time function
+- hurd: Use __clock_gettime in _hurd_select
+- login: Remove double-assignment of fl.l_whence in try_file_lock
+- nptl: Add missing placeholder abi symbol from nanosleep move
+- login: Acquire write lock early in pututline [BZ #24882]
+- Remove hppa pthreadP.h
+- sysdeps/clock_nanosleep: Use clock_nanosleep_time64 if avaliable
+- Fix array bounds violation in regex matcher (bug 25149)
+- support: Add support_set_small_thread_stack_size
+- linux: Reduce stack size for nptl/tst-thread-affinity-pthread
+- y2038: linux: Provide __ppoll64 implementation
+- Declare asctime_r, ctime_r, gmtime_r, localtime_r for C2X.
+- support: Add xsetlocale function
+- libio/tst-fopenloc: Use xsetlocale, xfopen, and xfclose
+- Fix clock_nanosleep when interrupted by a signal
+- slotinfo in struct dtv_slotinfo_list should be flexible array [BZ #25097]
+
+* Wed Nov 06 2019 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-17
+- Auto-sync with upstream branch master,
+ commit 2a0356e1191804d57005e1cfe2a72f019b7a8cce.
+- posix: Sync regex with gnulib
+- Add mnw language code [BZ #25139]
+- Add new locale: mnw_MM (Mon language spoken in Myanmar) [BZ #25139]
+- S390: Fp comparison are now raising FE_INVALID with gcc 10.
+- linux: pselect: Remove CALL_PSELECT6 macro
+- Fix run-one-test so that it runs elf tests
+- nptl: Fix niggles with pthread_clockjoin_np
+- hppa: Align __clone stack argument to 8 bytes (Bug 25066)
+- y2038: linux: Provide __futimens64 implementation
+- y2038: linux: Provide __utimensat64 implementation
+- nptl: Add pthread_timedjoin_np, pthread_clockjoin_np NULL timeout test
+- nptl: Add pthread_clockjoin_np
+- manual: Add documentation for pthread_tryjoin_np and pthread_timedjoin_np
+- nptl: Convert tst-join3 to use libsupport
+- Sync time/mktime.c with gnulib
+- Sync timespec-{add,sub} with gnulib
+- Sync intprops.h with gnulib
+- Refactor adjtimex based on clock_adjtime
+- Refactor PI mutexes internal definitions
+- Remove pause and nanosleep not cancel wrappers
+- nptl: Replace non cancellable pause/nanosleep with futex
+- Consolidate lowlevellock-futex.h
+- Consolidate futex-internal.h
+- Base max_fast on alignment, not width, of bins (Bug 24903)
+- Revise the documentation of simple calendar time.
+- Make second argument of gettimeofday as 'void *'
+- Use clock_gettime to implement gettimeofday.
+- Use clock_gettime to implement timespec_get.
+- Consolidate and deprecate ftime
+- Change most internal uses of time to __clock_gettime.
+- Use clock_gettime to implement time.
+- Use clock_settime to implement settimeofday.
+- Use clock_settime to implement stime; withdraw stime.
+- Change most internal uses of __gettimeofday to __clock_gettime.
+- Linux/Alpha: don't use timeval32 system calls.
+- resolv/tst-idna_name_classify: Isolate from system libraries
+- hurd: Support for file record locking
+- Comment out initgroups from example nsswitch.conf (Bug 25146)
+
+* Mon Oct 28 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-16
+- Auto-sync with upstream branch master,
+ commit 177a3d48a1c74d7b2cd6bfd48901519d25a5ecad.
+- y2038: linux: Provide __clock_getres64 implementation
+- time: Introduce function to check correctness of nanoseconds value
+- Add Transliterations for Unicode Misc. Mathematical Symbols-A/B [BZ #23132]
+- Install charmaps uncompressed in testroot
+- Add wait-for-debugger test harness hooks
+- Define __STATFS_MATCHES_STATFS64
+- hurd: Fix build after __pread64 usage in the dynamic loader
+- sysdeps/stat: Handle 64-bit ino_t types on 32-bit hosts
+- S390: Remove not needed stack frame in syscall function.
+
+* Fri Oct 25 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-15
+- Add *.mo files to all-langpacks (#1624528)
+
+* Thu Oct 24 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-14
+- Add Requires on basesystem for main package (#1757267)
+- Add Requires on coreutils for glibc-headers (uses rm)
+
+* Wed Oct 23 2019 Arjun Shankar <arjun(a)redhat.com> - 2.30.9000-13
+- Auto-sync with upstream branch master,
+ commit 7db1fe38de21831d53ceab9ae83493d8d1aec601:
+- Include <kernel-features.h> explicitly in Linux clock_settime.c
+- Remove math-finite.h
+- Remove finite-math tests
+- Remove x64 _finite tests and references
+- Fix testroot.pristine creation copying dynamic linker
+
+* Fri Oct 18 2019 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-12
+- Auto-sync with upstream branch master,
+ commit ef21bd2d8c6805c0c186a01f7c5039189f51b8c4.
+- loadarchive: guard against locale-archive corruption (Bug #25115)
+- Undo accidental commit to ChangeLog.19.
+- nptl: Document AS-safe functions in cancellation.c.
+- elf: Use nocancel pread64() instead of lseek()+read()
+- Add nocancel version of pread64()
+- Add run-one-test convenience target and makefile help text
+- Update sysvipc kernel-features.h files for Linux 5.1
+- S390: Add new s390 platform z15.
+- nptl: SIGCANCEL, SIGTIMER, SIGSETXID are always defined
+- nptl/tst-cancel25 needs to be an internal test
+- Remove libc_hidden_def from __semtimedop stub
+- sysvipc: Implement semop based on semtimedop
+- ipc: Refactor sysvipc internal definitions
+- Rename and split elf/tst-dlopen-aout collection of tests
+- dlfcn: Remove remnants of caller sensitivity from dlinfo
+- ldconfig: handle .dynstr located in separate segment (bug 25087)
+- ldd: Print "not a dynamic executable" on standard error [BZ #24150]
+- Add PTRACE_GET_SYSCALL_INFO from Linux 5.3 to sys/ptrace.h.
+- Move ChangeLog to ChangeLog.old/ChangeLog.19
+- manual: Remove warning in the documentation of the abort function
+- sysvipc: Set ipc_perm mode as mode_t (BZ#18231)
+- Simplify note processing
+- syscall-names.list: fix typos in comment
+- y2038: linux: Provide __clock_settime64 implementation
+- posix: Use posix_spawn for wordexp
+- mips: Do not malloc on getdents64 fallback
+- sparc: Assume GOTDATA support in the toolchain
+- <dirent.h>: Remove wrong comment about getdents64 declaration
+- ChangeLog: Remove leading spaces before tabs and trailing whitespace
+- Make tst-strftime2 and tst-strftime3 depend on locale generation
+- posix/tst-wordexp-nocmd: Fix diagnostics output in test
+- wordexp: Split out command execution tests from posix/wordexp-test
+
+* Tue Oct 08 2019 Arjun Shankar <arjun(a)redhat.com> - 2.30.9000-11
+- Adjust glibc-rh741105.patch.
+- Auto-sync with upstream branch master,
+ commit ca602c1536ce2777f95c07525f3c42d78812e665:
+- Add TCP_TX_DELAY from Linux 5.3 to netinet/tcp.h
+- [powerpc] fenv_private.h clean up
+- [powerpc] libc_feupdateenv_test: optimize FPSCR access
+- [powerpc] __fesetround_inline optimizations
+- [powerpc] Rename fegetenv_status to fegetenv_control
+- [powerpc] libc_feholdsetround_noex_ppc_ctx: optimize FPSCR write
+- [powerpc] Rename fesetenv_mode to fesetenv_control
+- Add helper script for glibc debugging
+- Update bits/mman.h constants and tst-mman-consts.py for Linux 5.3.
+- y2038: Provide conversion helpers for struct __timespec64
+- Use binutils 2.33 branch in build-many-glibcs.py.
+- Sync "language", "lang_name", "territory", "country_name" with CLDR/langtable
+- Split up endian.h to minimize exposure of BYTE_ORDER.
+- time: Add padding for the timespec if required
+- Enable passing arguments to the inferior in debugglibc.sh
+- [powerpc] No need to enter "Ignore Exceptions Mode"
+- Y2038: Include proper header to provide support for struct timeval on HURD
+- Disable warnings in string/tester.c at top level.
+- string/endian.h: Restore the __USE_MISC conditionals
+- Disable -Wmaybe-uninitialized for total_deadline in sunrpc/clnt_udp.c.
+- ChangeLog update from my last commit
+- nptl: Move pthread_attr_setinheritsched implementation into libc.
+- elf: Never use the file ID of the main executable [BZ #24900]
+- elf: Assign TLS modid later during dlopen [BZ #24930]
+- nptl: Move pthread_attr_getschedparam implementation into libc
+- riscv: Remove support for variable page sizes
+- nptl: Move pthread_attr_setschedparam implementation into libc
+
+* Fri Sep 27 2019 Zbigniew Jędrzejewski-Szmek <zbyszek(a)in.waw.pl> - 2.30.9000-10
+- Use full locale names in langpack descriptions (#1651375)
+
+* Thu Sep 26 2019 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-9
+- Auto-sync with upstream branch master,
+ commit 464cd3a9d5f505d92bae9a941bb75b0d91ac14ee.
+- y2038: Introduce struct __timespec64 - new internal glibc type
+- auto-changelog: Remove latin1 from codecs
+- Set the expects flags to clock_nanosleep
+- Fix tst-sigcontext-get_pc rule name from a43565ac447b1
+- inet/net-internal.h: Fix uninitalised clntudp_call() variable
+- Fix vDSO initialization on arm and mips
+- Script to generate ChangeLog-like output from git log
+- [powerpc] SET_RESTORE_ROUND optimizations and bug fix
+- Fix building support_ptrace.c on i686-gnu.
+- S390: Use _HP_TIMING_S390_H instead of _HP_TIMING_H.
+- Update syscall-names.list for Linux 5.3.
+- Use Linux 5.3 in build-many-glibcs.py.
+- S390: Add support for HP_TIMING_NOW.
+- Fix RISC-V vfork build with Linux 5.3 kernel headers.
+- Add UNSUPPORTED check in elf/tst-pldd.
+- sparc64: Use linux generic time implementation
+- mips: Consolidate INTERNAL_VSYSCALL_CALL
+- powerpc: Simplify vsyscall internal macros
+- Refactor vDSO initialization code
+- Remove PREPARE_VERSION and PREPARE_VERSION_KNOW
+- Fix small error in HP_TIMING_PRINT trailing null char setting
+
+* Mon Sep 16 2019 Parag Nemade <pnemade AT redhat DOT com> - 2.30.9000-8
+- Change Supplements "langpacks-" to "langpacks-core-" (#1729992)
+
+* Mon Sep 16 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-7
+- Auto-sync with upstream branch master,
+ commit 1a6566094d3097f4a3037ab5555cddc6cb11c3a3.
+- alpha: force old OSF1 syscalls for getegid, geteuid and getppid [BZ #24986]
+- Fix http: URL in 'configure'
+- Regenerate charmap-kw.h, locfile-kw.h
+- Fix three GNU license URLs, along with trailing-newline issues.
+- Prefer https to http for gnu.org and fsf.org URLs
+
+* Fri Sep 06 2019 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-6
+- Auto-sync with upstream branch master,
+ commit 1b7f04070bd94f259e2ed24d6fb76309d64fb164.
+- locale: Avoid zero-length array in _nl_category_names [BZ #24962]
+- math: Replace const attribute with pure in totalorder* functions
+- y2038: Introduce the __ASSUME_TIME64_SYSCALLS define
+- Finish move of clock_* functions to libc. [BZ #24959]
+- Update Alpha libm-test-ulps
+- localedef: Use initializer for flexible array member [BZ #24950]
+- Add misc/tst-mntent-autofs, testing autofs "ignore" filtering
+- Use autofs "ignore" mount hint in getmntent_r/getmntent
+- hurd: Fix build
+- Use generic memset/memcpy/memmove in benchtests
+- nptl: Move pthread_attr_getinheritsched implementation into libc
+- hurd: Fix SS_ONSTACK support
+- hurd: Remove optimizing anonymous maps as __vm_allocate.
+- hurd: Fix poll and select POSIX compliancy details about errors
+- hurd: Fix timeout handling in _hurd_select
+- hurd getcwd: Allow unknown root directory
+- hurd: Fix implementation of setitimer.
+- hurd: Fix _hurd_select for single fd sets
+- MIPS support for GNU hash
+- sh: Split BE/LE abilist
+- microblaze: Split BE/LE abilist
+- arm: Split BE/LE abilist
+- Correct the spelling of more contributors
+- Fix posix/tst-regex by using UTF-8 and own test input
+- [powerpc] fegetenv_status: simplify instruction generation
+- [powerpc] fesetenv: optimize FPSCR access
+- [powerpc] SET_RESTORE_ROUND improvements
+- [powerpc] fe{en,dis}ableexcept, fesetmode: optimize FPSCR accesses
+- [powerpc] fe{en,dis}ableexcept optimize bit translations
+- misc: Use allocate_once in getmntent
+- nptl: Move pthread_attr_setdetachstate implementation into libc
+- login: pututxline could fail to overwrite existing entries [BZ #24902]
+- Fix posix/tst-regex by using a dedicated input-file.
+
+* Tue Aug 27 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-5
+- Move makedb from glibc-common to nss_db (#1704334)
+
+* Mon Aug 26 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-4
+- Auto-sync with upstream branch master,
+ commit 1bced8cadc82077f0201801239e89eb24b68e9aa.
+- Don't put non-ASCII into installed headers
+- Fix spellings of contributor names in comments and doc
+- [MIPS] Raise highest supported EI_ABIVERSION value [SWBZ #24916]
+- mips: Force RWX stack for hard-float builds that can run on pre-4.8 kernels
+- linux: Make profil_counter a compat_symbol (SWBZ#17726)
+- Refactor sigcontextinfo.h
+- Add RTLD_SINGLE_THREAD_P on generic single-thread.h
+- Chinese locales: Set first_weekday to 2 (swbug 24682).
+- powerpc: Fix typos and field name in comments
+- Mark IDN tests unsupported with libidn2 before 2.0.5.
+- Document strftime %Ob and %OB as C2X features.
+- Remove dead regex code
+- Fix bad pointer / leak in regex code
+- Don't use the argument to time.
+- Add tgmath.h macros for narrowing functions.
+- Update i386 libm-test-ulps
+
+* Mon Aug 19 2019 Carlos O'Donell <carlos(a)redhat.com> - 2.30.9000-3
+- Drop glibc-fedora-nscd-warnings.patch; applied upstream.
+- Drop Source7: nsswitch.conf; applying patch to upstream.
+- Add glibc-fedora-nsswitch.patch for Fedora customizations.
+- Auto-sync with upstream branch master,
+ commit d34d4c80226b3f5a1b51a8e5b005a52fba07d7ba:
+- Do not print backtraces on fatal glibc errors.
+- elf: Self-dlopen failure with explict loader invocation (swbz#24900)
+- login: Add nonstring attributes to struct utmp, struct utmpx (swbz#24899)
+- login: Use struct flock64 in utmp (swbz#24880)
+- login: Disarm timer after utmp lock acquisition (swbz#24879)
+
+* Fri Aug 16 2019 Carlos O'Donell <carlos(a)redhat.com> - 2.30.9000-2
+- Fix C.UTF-8 to use full code ranges.
+
+* Thu Aug 15 2019 Florian Weimer <fweimer(a)redhat.com> - 2.30.9000-1
+- Auto-sync with upstream branch master,
+ commit 341da5b4b6253de9a7581a066f33f89cacb44dec.
+
+* Fri Aug 02 2019 Florian Weimer <fweimer(a)redhat.com> - 2.30-1
+- Drop glibc-rh1734680.patch, applied upstream.
+- Auto-sync with upstream branch release/2.30/master,
+ commit be9a328c93834648e0bec106a1f86357d1a8c7e1:
+- malloc: Remove unwanted leading whitespace in malloc_info (swbz#24867)
+- glibc 2.30 release
+- iconv: Revert steps array reference counting changes (#1734680)
+- Restore r31 setting in powerpc32 swapcontext
+
+* Wed Jul 31 2019 Florian Weimer <fweimer(a)redhat.com> - 2.29.9000-37
+- Fix memory leak in iconv_open (#1734680)
+
+* Tue Jul 30 2019 Florian Weimer <fweimer(a)redhat.com> - 2.29.9000-36
+- Drop glibc-rh1732406.patch, fix for the regression applied upstream.
+- Auto-sync with upstream branch master,
+ commit 8a814e20d443adc460a1030fa1a66aa9ae817483:
+- nptl: Use uintptr_t for address diagnostic in nptl/tst-pthread-getattr
+- Linux: Move getdents64 to <dirent.h>
+- test-container: Install with $(sorted-subdirs) (swbz#24794)
+- gconv: Check reference count in __gconv_release_cache (#1732406)
+- x86-64: Compile branred.c with -mprefer-vector-width=128 (swbz#24603)
+- build-many-glibcs.py: Use Linux 5.2 by default
+- Linux: Use in-tree copy of SO_ constants for !__USE_MISC (swbz#24532)
+- test-container: Avoid copying unintended system libraries
+
+* Thu Jul 25 2019 Fedora Release Engineering <releng(a)fedoraproject.org>
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
+* Tue Jul 23 2019 Florian Weimer <fweimer(a)redhat.com> - 2.29.9000-34
+- Revert libio change that causes crashes (#1732406)
+
+* Mon Jul 22 2019 DJ Delorie <dj(a)redhat.com> - 2.29.9000-33
+- Auto-sync with upstream branch master,
+ commit dcf36bcad3f283f77893d3b157ef7bb2c99419f2.
+- Add NEWS entry about the new AArch64 IFUNC resolver call ABI
+- locale/C-translit.h.in: Cyrillic -> ASCII transliteration [BZ #2872]
+- Linux: Update syscall-names.list to Linux 5.2
+
+* Thu Jul 18 2019 DJ Delorie <dj(a)redhat.com> - 2.29.9000-32
+- Auto-sync with upstream branch master,
+ commit 3556658c5b8765480711b265abc901c67d5fc060.
+- Regenerate po/libc.pot for 2.30 release.
+- nptl: Add POSIX-proposed _clock functions to hppa pthread.h
+- nptl: Remove unnecessary forwarding of pthread_cond_clockwait from libc
+- Afar locales: Months and days updated from CLDR (bug 21897).
+- nl_BE locale: Use "copy "nl_NL"" in LC_NAME (bug 23996).
+- nl_BE and nl_NL locales: Dutch salutations (bug 23996).
+- ga_IE and en_IE locales: Revert first_weekday removal (bug 24200).
+- nptl: Remove futex_supports_exact_relative_timeouts
+- Update NEWS for new _clockwait and _clocklock functions
+- nptl: Add POSIX-proposed pthread_mutex_clocklock
+- nptl: Rename lll_timedlock to lll_clocklock and add clockid parameter
+- nptl: Add POSIX-proposed pthread_rwlock_clockrdlock & pthread_rwlock_clockwrlock
+- nptl: pthread_rwlock: Move timeout validation into _full functions
+- nptl: Add POSIX-proposed pthread_cond_clockwait
+- nptl: Add POSIX-proposed sem_clockwait
+- nptl: Add clockid parameter to futex timed wait calls
+- posix: Fix large mmap64 offset for mips64n32 (BZ#24699)
+- nss_db: fix endent wrt NULL mappings [BZ #24695] [BZ #24696]
+
+* Wed Jul 10 2019 Carlos O'Donell <carlos(a)redhat.com> - 2.29.9000-31
+- Auto-sync with upstream branch master,
+ commit 30ba0375464f34e4bf8129f3d3dc14d0c09add17.
+- Don't declare __malloc_check_init in <malloc.h> (bug 23352)
+- nftw: fill in stat buf for dangling links [BZ #23501]
+- dl-vdso: Add LINUX_4 HASH CODE to support nds32 vdso mechanism
+- riscv: restore ABI compatibility (bug 24484)
+- aarch64: new ifunc resolver ABI
+- nptl: Remove vfork IFUNC-based forwarder from libpthread [BZ #20188]
+- malloc: Add nptl, htl dependency for the subdirectory [BZ #24757]
+- Call _dl_open_check after relocation [BZ #24259]
+- Linux: Use mmap instead of malloc in dirent/tst-getdents64
+- ld.so: Support moving versioned symbols between sonames [BZ #24741]
+- io: Remove copy_file_range emulation [BZ #24744]
+- Linux: Adjust gedents64 buffer size to int range [BZ #24740]
+- powerpc: Use generic e_expf
+- Linux: Add nds32 specific syscalls to syscall-names.list
+- szl_PL locale: Fix a typo in the previous commit (bug 24652).
+
* Mon Jun 24 2019 DJ Delorie <dj(a)redhat.com> - 2.29.9000-30
- Auto-sync with upstream branch master,
commit 2bd81b60d6ffdf7e0d22006d69f4b812b1c80513.
diff --git a/glibc.spec b/glibc.spec
index ba0c17e..7b5d974 100644
--- a/glibc.spec
+++ b/glibc.spec
@@ -83,7 +83,7 @@
Summary: The GNU libc libraries
Name: glibc
Version: %{glibcversion}
-Release: 10%{?dist}
+Release: 11%{?dist}
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
# libraries.
@@ -2141,6 +2141,9 @@ fi
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
%changelog
+* Fri May 7 2021 Florian Weimer <fweimer(a)redhat.com> - 2.33-11
+- Trim changelog
+
* Fri May 7 2021 Florian Weimer <fweimer(a)redhat.com> - 2.33-10
- Downstream-only patches for CPU detection on ppc64le, s390x
@@ -2216,2224 +2219,3 @@ fi
* Mon Feb 15 2021 Florian Weimer <fweimer(a)redhat.com> - 2.33-1
- Switch to glibc 2.33 upstream release tarball
-
-* Wed Jan 27 2021 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-29
-- Auto-sync with upstream branch master,
- commit df359a25ba6f6bda06104229fbfe284c1fb30915:
-- Revert "Make libc symbols hidden in static PIE" [BZ #27237]
-- benchtests: Do not build bench-timing-type with MODULE_NAME=libc
-- aarch64: Fix the list of tested IFUNC variants [BZ #26818]
-- Update INSTALL with package versions that are known to work
-- aarch64: Move and update the definition of MTE_ENABLED
-- Fix misplaced const
-- Update C-SKY libm-test-ulps
-- manual: Correct argument order in mount examples [BZ #27207]
-- linux: mips: Fix getdents64 fallback on mips64-n32
-- x86: Properly match CPU features in /proc/cpuinfo [BZ #27222]
-- x86-64: Update tst-glibc-hwcaps-2.c for x86-64 baseline
-- powerpc64: Select POWER9 machine for the scv instruction
-- x86: Check ifunc resolver with CPU_FEATURE_USABLE [BZ #27072]
-- Revert "linux: Move {f}xstat{at} to compat symbols" for static build
-- aarch64: revert memcpy optimze for kunpeng to avoid performance degradation
-- Make libc symbols hidden in static PIE
-- csu: Move static pie self relocation later [BZ #27072]
-- Use hidden visibility for early static PIE code
-- csu: Avoid weak ref for __ehdr_start in static PIE
-- configure: Check for static PIE support
-- elf: Avoid RELATIVE relocs in __tunables_init
-- elf: Make the tunable struct definition internal only
-- <sys/platform/x86.h>: Remove the C preprocessor magic
-- posix: Fix fnmatch.c on bootstrap
-- stdlib: Add testcase for BZ #26241
-- posix: Fix regex_internal.h on bootstrap
-- Use <startup.h> in __libc_init_secure
-- elf: Avoid RELATIVE relocation for _dl_sysinfo
-- libmvec: Add extra-test-objs to test-extras
-- Hurd: Add rtld-strncpy-c.c
-- Update MIPS libm-test-ulps.
-- Update arm libm-test-ulps.
-- Update powerpc-nofpu libm-test-ulps.
-- Update hppa libm-test-ulps
-- ARC: nofpu: Regenerate ulps
-- ld.so: Add --list-tunables to print tunable values
-- math/test-tgmath2: Fix fabs failure when no long double
-- x86: Move x86 processor cache info to cpu_features
-- Fix x86 build with --enable-tunable=no
-- ifuncmain6pie: Remove the circular IFUNC dependency [BZ #20019]
-
-* Tue Jan 26 2021 Fedora Release Engineering <releng(a)fedoraproject.org> - 2.32.9000-28
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
-
-* Sat Jan 23 2021 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-27
-- Introduce new glibc-doc.noarch subpackage (#1346925)
-- Move the reference manual info pages from glibc-devel to glibc-doc
-- Move debugger interface documentation from glibc to glibc-doc
-- Remove unnecessary README, INSTALL, NEWS files from glibc
-- Remove unnecessary README.timezone and gai.conf files from glibc-common
-
-* Thu Jan 14 2021 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-26
-- Deprecate nscd (#1905135)
-- https://fedoraproject.org/wiki/Changes/DeprecateNSCD
-
-* Wed Jan 13 2021 Carlos O'Donell <carlos(a)redhat.com> - 2.32.9000-25
-- Auto-sync with upstream branch master,
- commit cf1290064598def8dfeddec3d86d98495aee1fba:
-- Use the right argument code in unnormal tests
-- ldconfig/x86: Store ISA level in cache and aux cache
-- elf: work around a gcc bug in elf_get_dynamic_info
-- x86: Set header.feature_1 in TCB for always-on CET [BZ #27177]
-- posix: consume less entropy on tempname
-- Makerules: Do not require startup files for format.lds probe object
-- install: Replace scripts/output-format.sed with objdump -f [BZ #26559]
-- math: Add BZ#18980 fix back on dbl-64 cosh
-- posix: Sync tempname with gnulib [BZ #26648]
-- posix: Fix return value of system if shell can not be executed [BZ #27053]
-- support: Add xchmod wrapper
-- Update STATX_ATTR_DAX value from Linux 5.10.
-- riscv: Initialize $gp before resolving the IRELATIVE relocation
-- riscv: support GNU indirect function
-- posix: Correct attribute access mode on readlinkat [BZ #27024].
-- Add xfchmod to libsupport
-- Add xchdir to libsupport.
-- POSIX locale: Fix typo in comment
-- ARC: Regenerate ulps
-- mntent: Use __putc_unlocked instead of fputc_unlocked
-- aarch64: define PI_STATIC_AND_HIDDEN
-- Update NEWS for CVE-2019-25013.
-- x86: Support GNU_PROPERTY_X86_ISA_1_V[234] marker [BZ #26717]
-- Remove dbl-64/wordsize-64 (part 2)
-- Remove dbl-64/wordsize-64
-- Add SEGV_MTEAERR and SEGV_MTESERR from Linux 5.10.
-- support: Add support_small_thread_stack_size
-- stdlib: Sync canonicalize with gnulib [BZ #10635] [BZ #26592] [BZ #26341] [BZ #24970]
-- malloc: Add scratch_buffer_dupfree
-- Import filename.h from gnulib
-- Import idx.h from gnulib
-- alpha: Provide wait4 for static library [BZ #27150]
-- aarch64: push the set of rules before falling into slow path
-- nptl: Fix comment typo in pthread_cond_wait.c
-- x86: Check IFUNC definition in unrelocated executable [BZ #20019]
-- hurd: Fix mmap(!MAP_FIXED) on bogus address
-
-* Mon Jan 04 2021 Florian Weimer <fweimer(a)redhat.com> - 2.32.9000-24
-- Drop glibc-fedora-__libc_multiple_libcs.patch. Replaced by upstream's
- __libc_initial flag.
-- Adjust glibc-rh819430.patch to upstream's gnulib merge of fnmatch.
-- Disable -Werror again due to GCC PR98512.
-- Auto-sync with upstream branch master,
- commit 3ec5d83d2a237d39e7fd6ef7a0bc8ac4c171a4a5:
-- x86-64: Avoid rep movsb with short distance [BZ #27130]
-- aarch64: fix stack missing after sp is updated
-- nptl: Remove set*id, set*gid files which are not built
-- Drop nan-pseudo-number.h usage from tests
-- posix: Sync fnmatch with gnulib
-- Sync flexmember.h with gnulib
-- Sync intprops.h with gnulib
-- posix: Sync glob code with gnulib
-- posix: Sync regex code with gnulib
-- Move generic nan-pseudo-number.h to ldbl-96
-- Sync FDL from https://www.gnu.org/licenses/fdl-1.3.texi
-- Sync move-if-change from Gnulib
-- Update automatically-generated copyright dates
-- Update copyright dates not handled by scripts/update-copyrights.
-- Update copyright dates with scripts/update-copyrights
-- aarch64: use PTR_ARG and SIZE_ARG instead of DELOUSE
-- nonstring: Enable __FORTIFY_LEVEL=3
-- string: Enable __FORTIFY_LEVEL=3
-- Introduce _FORTIFY_SOURCE=3
-- Warn on unsupported fortification levels
-- powerpc: Use scv instruction on clone when available
-- powerpc: Runtime selection between sc and scv for syscalls
-- malloc: preserve errno on mcheck hooks [BZ #17924]
-- x86 long double: Add tests for pseudo normal numbers
-- x86 long double: Consider pseudo numbers as signaling
-- io: Remove xmknod{at} implementations
-- io: Remove xstat implementations
-- free: preserve errno [BZ#17924]
-- hurd: Accept including hurd/version.h
-- hurd: Add WSTOPPED/WCONTINUED/WEXITED/WNOWAIT support [BZ #23091]
-- support: Make support_process_state_wait wait less
-- hurd: set sigaction for signal preemptors in arch-independent file
-- hurd: Fix spawni SPAWN_XFLAGS_TRY_SHELL with empty argv
-- hurd: Try shell in posix_spawn* only in compat mode
-- Remove _ISOMAC check from <cpu-features.h>
-- x86: Remove the duplicated CPU_FEATURE_CPU_P
-- Partially revert 681900d29683722b1cb0a8e565a0585846ec5a61
-- x86 long double: Support pseudo numbers in isnanl
-- x86 long double: Support pseudo numbers in fpclassifyl
-- MTE: Do not pad size in realloc_check
-- tests-mcheck: New variable to run tests with MALLOC_CHECK_=3
-- elf: Account for glibc-hwcaps/ prefix in _dl_important_hwcaps
-- misc: Use __ferror_unlocked instead of ferror
-- s390x: Regenerate ulps
-- powerpc: Regenerate ulps
-- addmntent: Remove unbounded alloca usage from getmntent [BZ#27083]
-- <sys/platform/x86.h>: Add Intel LAM support
-- i386: Regenerate ulps
-- aarch64: update ulps.
-- aarch64: Add aarch64-specific files for memory tagging support
-- aarch64: Add sysv specific enabling code for memory tagging
-- linux: Add compatibility definitions to sys/prctl.h for MTE
-- malloc: Basic support for memory tagging in the malloc() family
-- elf: Add a tunable to control use of tagged memory
-- config: Allow memory tagging to be enabled when configuring glibc
-- alpha: Remove anonymous union in struct stat [BZ #27042]
-- add inputs to auto-libm-test-in yielding larger errors (binary64, x86_64)
-- m68k: fix clobbering a5 in setjmp() [BZ #24202]
-- iconv add iconv_close before the function returned with bad value.
-- iconv: use iconv_close after iconv_open
-- Fix buffer overrun in EUC-KR conversion module (bz #24973)
-- hurd: Make trampoline fill siginfo ss_sp from sc_uesp
-- Hurd: make sigstates hold a reference on thread ports
-- profil-counter: Add missing SIGINFO case
-- hurd: implement SA_SIGINFO signal handlers.
-- hurd: Fix ELF_MACHINE_USER_ADDRESS_MASK value
-- hurd: Note when the vm_map kernel bug was fixed
-- hurd: Also turn KERN_INVALID_ADDRESS to EINVAL
-- ieee754: Remove unused __sin32 and __cos32
-- ieee754: Remove slow paths from asin and acos
-- getenv: Move call to strlen to the branch it's used in.
-- Update kernel version to 5.10 in tst-mman-consts.py.
-- s390x: Require GCC 7.1 or later to build glibc.
-- malloc: Use __libc_initial to detect an inner libc
-- Replace __libc_multiple_libcs with __libc_initial flag
-- {nptl,htl}/semaphoreP.h: clean up
-- htl: Get sem_open/sem_close/sem_unlink support [BZ #25524]
-- pthread: Move semaphore initialization for open to semaphoreP.h
-- Mark __libc_freeres_fn as used [BZ #27002]
-- Update syscall lists for Linux 5.10.
-- htl: Add pshared semaphore support
-- hurd: Add LLL_PRIVATE and LLL_SHARED
-- hurd: Add __libc_open and __libc_close
-- htl: Add futex-internal.h
-- hurd: Add __lll_abstimed_wait_intr
-- hurd: make lll_* take a variable instead of a ptr
-- hurd: Rename LLL_INITIALIZER to LLL_LOCK_INITIALIZER
-- Use Linux 5.10 in build-many-glibcs.py.
-
-* Wed Dec 16 2020 DJ Delorie <dj(a)redhat.com> - 2.32.9000-23
-- Fix conditionals for _enable_debug_packages and benchtests [BZ #1902514]
-
-* Tue Dec 15 2020 Patsy Griffin <patsy(a)redhat.com> - 2.32.9000-22
-- Auto-sync with upstream branch master,
- commit 4d0985543f479a6f421d4d8a9e0d1dc71c9c2c53.
-- elf: Record libc.so link map when it is the main program (bug 20972)
-- Use GMP 6.2.1 in build-many-glibcs.py.
-- aarch64: remove the strlen_asimd symbol
-- aarch64: fix static PIE start code for BTI [BZ #27068]
-- elf: Fix failure handling in _dl_map_object_from_fd
-- elf: inline lose for error handling
-- Remove strtoimax, strtoumax, wcstoimax, wcstoumax inlines
-- nsswitch: handle missing actions properly
-- x86: Remove the default REP MOVSB threshold tunable value [BZ #27061]
-- elf.h: Remove SHF_GNU_BUILD_NOTE.
-- elf.h: fix spelling typos in comments
-- Fix spelling and grammar in several comments
-- malloc: Detect infinite-loop in _int_free when freeing tcache [BZ#27052]
-- elf: Fix dl-load.c
-- elf: Include libc.so.6 as main program in dependency sort (bug 20972)
-- support: Add support_slibdir_prefix variable
-- aarch64: Use mmap to add PROT_BTI instead of mprotect [BZ #26831]
-- elf: Pass the fd to note processing
-- elf: Move note processing after l_phdr is updated
-- aarch64: align address for BTI protection [BZ #26988]
-- aarch64: Fix missing BTI protection from dependencies [BZ #26926]
-- Fix linknamespace errors in nss_database.c if build with -Os.
-- treewide: fix incorrect spelling of indices in comments
-- linux: Consolidate brk implementation
-- elf: Include <sys/param.h> in cache.c
-- s390x: Add glibc-hwcaps support
-- elf: Fix run-time dependencies of tst-dlopen-fail-2
-- Handle out-of-memory case in svc_tcp.c/svc_unix.c:rendezvous_request.
-- elf: Fix incorrect comparison in sort_priorities_by_name
-- S390: Derive float_t from FLT_EVAL_METHOD
-- Fix parsing of /sys/devices/system/cpu/online (bug 25859)
-- Make strtoimax, strtoumax, wcstoimax, wcstoumax into aliases
-- Fixed typos in "NEWS for version 2.32"
-- Add NEWS entry for CVE-2020-29562 (BZ #26923)
-- iconv: Fix incorrect UCS4 inner loop bounds (BZ#26923)
-- Drop glibc-rh1906066 and glibc-rh741105 patches fixed by sync.
-
-* Mon Dec 14 2020 Florian Weimer <fweimer(a)redhat.com> - 2.32.9000-21
-- Re-enable -Werror everywhere (#1888246)
-
-* Wed Dec 09 2020 DJ Delorie <dj(a)redhat.com> - 2.32.9000-20
-- nsswitch: handle missing actions properly (temporary fix for 1906066)
-
-* Mon Dec 07 2020 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-19
-- Auto-sync with upstream branch master,
- commit 088e9625378f25607acff3daf7a79cbdee497043:
-- x86: Rename readelflib.c
-- nsswitch: use new internal API (callers)
-- nsswitch: user new internal API (tests)
-- nsswitch: use new internal API (core)
-- nss: Implement <nss_database.h>
-- <nss_action.h>: New abstraction for combining NSS modules and NSS actions
-- nss: Introduce <nss_module.h>
-- Add scripts/move-symbol-to-libc.py
-
-* Fri Dec 04 2020 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-18
-- Drop glibc-revert-fxstat-compat.patch; applied upstream.
-- Drop glibc-revert-mknod-compat.patch; applied upstream.
-- Auto-sync with upstream branch master,
- commit 4c38c1a229bc3628269ad98bd7e8d31d118d91f6:
-- powerpc64le: Add glibc-hwcaps support
-- x86: Adjust tst-cpu-features-supports.c for GCC 11
-- x86: Set RDRAND usable if CPU supports RDRAND
-- elf: Add missing <stddef.h> header to elf/dl-hwcaps.h
-- lowlevellock-futex: Remove not used macros
-- futex: Remove not used futex_reltimed_wait{_cancelable}
-- y2038: Convert gai_suspend to support 64 bit time
-- symbols: Add defines for libanl's libanl_hidden_{def|proto}
-- x86_64: Add glibc-hwcaps support
-- elf: Add glibc-hwcaps subdirectory support to ld.so cache processing
-- elf: Process glibc-hwcaps subdirectories in ldconfig
-- elf: Implement tail merging of strings in ldconfig
-- elf: Implement a string table for ldconfig, with tail merging
-- elf: Add extension mechanism to ld.so.cache
-- elf: Add endianness markup to ld.so.cache (bug 27008)
-- elf: Add glibc-hwcaps support for LD_LIBRARY_PATH
-- elf: Synchronize <elf.h> section header flags with binutils
-- x86: Fix THREAD_SELF definition to avoid ld.so crash (bug 27004)
-- htl: Add hidden def for __pthread_create/detach
-- manual: Clarify File Access Modes section and add O_PATH
-- htl: Add missing symbols
-- Revert "linux: Move xmknod{at} to compat symbols"
-- Revert "linux: Move {f}xstat{at} to compat symbols"
-- elf.h: Fix spelling of EM_TILE64 comment
-- nptl: Fix __futex_clocklock64 return error check [BZ #26964]
-- powerpc64le: ifunc select *f128 routines in multiarch mode
-- y2038: Convert aio_suspend to support 64 bit time
-- Fix typo in NEWS file
-- nptl: Add EOVERFLOW checks for futex calls
-- nptl: Fix PTHREAD_PRIO_PROTECT timed lock
-- sh: Add sh4 fpu Implies folder
-- io: nftw/ftw: Fix stack overflow with large nopenfd [BZ #26353]
-- elf: Introduce enum opt_format in the ldconfig implementation
-- support: Add support_copy_file
-- NEWS entry for commit b4f020c9b408fb3d1d3d4901c4a71839145f8791
-- timezone: Change zdump installation to bin directory
-- nptl: Return EINVAL for invalid clock for pthread_clockjoin_np
-- nptl: Return EINVAL for pthread_mutex_clocklock/PI with CLOCK_MONOTONIC [BZ #26801]
-- nptl: Replace lll_futex_wake with futex-internal.h
-- nptl: Replace lll_futex_supported_clockid with futex-internal.h
-- nptl: Replace lll_futex_{timed_}wait by futex-internal.h
-- nptl: Replace lll_timedwait with __futex_abstimed_wait64
-- nptl: Replace __futex_clocklock_wait64 with __futex_abstimed_wait64
-- nptl: Remove _futex_clock_wait_bitset64
-- nptl: Consolidate __futex_abstimed_wait_{cancelable}64
-- nptl: Extend __futex_abstimed_wait_cancelable64 comment
-- nptl: Remove clockwait_tid
-- nptl: Remove futex_wait_cancelable
-- nptl: Remove unused internal futex functions
-- Mark mtrace tests UNSUPPORTED if bug-ga2.mtrace or tst-leaks2.mtrace are missing
-- elf: Fix uninitialized variable for _dl_write
-- powerpc: Make PT_THREAD_POINTER available to assembly code
-- Use libnss_files.so for tests posix/bug-ga2 and resolv/tst-leaks2 [BZ #26821]
-- hurd report-wait: Fix stpcpy usage
-- hurd S_msg_report_wait: Fix detecting fd ports
-- hurd S_msg_report_wait: Fix reporting ports
-- hurd: Fix strcpy calls
-- hurd: Fix _S_msg_get/set_env_variable prototype
-- hurd: Enable using ifunc
-- Add {,sysdep-}ld-library-path make variable
-- nptl: Move stack list variables into _rtld_global
-- hurd: let _dl_argv and __libc_stack_end be relro
-- hurd: Remove some remnants of cthreads
-- nanosleep: Pass NULL when rem == NULL on ports with __TIMESIZE != 64
-- y2038: Convert thrd_sleep to support 64 bit time
-- y2038: Convert mtx_timedlock to support 64 bit time
-- y2038: Convert cnd_timedwait to support 64 bit time
-- hurd: Drop CLOCK_MONOTONIC change which slipped in
-- hurd: make ptsname fail with ENOTTY on non-master-pty
-- mach: Add missing assert.h include
-- hurd: break relocation loop between libc.so and lib{mach,hurd}user.so
-- Remove obsolete defines for HPUX support from fcntl.h and update O_NONBLOCK.
-- Remove tls.h inclusion from internal errno.h
-- nptl: Eliminate <smp.h> and __is_smp
-- powerpc: Eliminate UP macro conditionals
-- x86: Remove UP macro. Define LOCK_PREFIX unconditionally.
-- alpha: Remove UP preprocessor conditionals
-- hurd: Make sure signals get started
-- hurd: initialize libpthread before starting the signal thread
-- hurd: Make _hurd_libc_proc_init idempotent
-- powerpc: Add optimized stpncpy for POWER9
-- powerpc: Add optimized strncpy for POWER9
-- Don't use nested function in test-ffs
-- Use __builtin___stpncpy_chk when available
-- tests: Remove NULL check for an array
-- hurd: Move {,f,l}xstat{,at} and xmknod{at} to compat symbols
-- hurd: Notify the proc server later during initialization
-- htl: Initialize later
-- htl: Keep thread signals blocked during its initialization
-- htl: Fix spurious symbols in namespaces
-- Use O_CLOEXEC in sysconf [BZ #26791]
-- struct _Unwind_Exception alignment should not depend on compiler flags
-- hurd: keep only required PLTs in ld.so
-- hurd: Add missing startup calls
-- riscv: Get cache information through sysconf
-- RISC-V: Add _dl_start_user.
-
-* Thu Nov 26 2020 Florian Weimer <fweimer(a)redhat.com> - 2.32.9000-17
-- s390x: Do not rewrite program interpreter symlink (make install is enough)
-
-* Tue Nov 10 2020 Carlos O'Donell <carlos(a)redhat.com> - 2.32.9000-16
-- Remove the work around for systemd-nspawn (#1869030).
-
-* Mon Nov 09 2020 DJ Delorie <dj(a)redhat.com> - 2.32.9000-15
-- Auto-sync with upstream branch master,
- commit 75a193b7611bade31a150dfcc528b973e3d46231.
-- linux: Allow adjtime with NULL argument [BZ #26833]
-- aarch64: Add unwind information to _start (bug 26853)
-- bsd unlockpt: unlockpt needs to fail with EINVAL, not ENOTTY
-- Rearrange bsd_getpt vs bsd_openpt and implement posix_openpt on BSD
-- Remove __warndecl
-- Remove __warn_memset_zero_len [BZ #25399]
-- iconv: Accept redundant shift sequences in IBM1364 [BZ #26224]
-- msg: Remove redundant #include <sys/msg.h> header
-- tst-setuid1-static-ENV: Add $(common-objpfx)nss [BZ #26820]
-
-* Tue Nov 03 2020 Patsy Griffin <patsy(a)redhat.com> - 2.32.9000-14
-- Auto-sync with upstream branch master,
- commit e156dabc766d6f6f99ce9402999eae380a3ec1f2.
-- aarch64: Add variant PCS lazy binding test [BZ #26798]
-- aarch64: Fix DT_AARCH64_VARIANT_PCS handling [BZ #26798]
-- hurd: Correct 'ethenet' spelling
-- Avoid -Wstringop-overflow warning in pthread_cleanup_push macros
-- Disable spurious -Warray-bounds for ypclnt.c (bug 26687)
-- Do not use array parameter to new_composite_name (bug 26726)
-- Disable spurious -Wstringop-overflow for setjmp/longjmp (bug 26647)
-- malloc debug: fix compile error when enable macro MALLOC_DEBUG > 1
-- tst-tcfree2: adjust coding style.
-- elf: In ldconfig, extract the new_sub_entry function from search_dir
-- Use MPC 1.2.1 in build-many-glibcs.py.
-- Argument Syntax: Use "option", @option, and @command.
-- elf: Unify old and new format cache handling code in ld.so
-- x86: Restore processing of cache size tunables in init_cacheinfo
-- Make elf.h header self contained.
-- x86: Optimizing memcpy for AMD Zen architecture.
-- Hurd: Fix ftime build
-- Add IP_RECVERR_RFC4884 and IPV6_RECVERR_RFC4884 from Linux 5.9.
-- misc: Add internal __getauxval2 function
-- Remove NEWS entry about ftime removal
-- time: Add 64-bit time_t support for ftime
-- Reinstate ftime and add deprecate message on ftime usage
-- Update kernel version to 5.9 in tst-mman-consts.py.
-- Amend grammar and add a description
-- Fix typo in NEWS file
-- Remove timing related checks of time/tst-cpuclock1
-- Update syscall lists for Linux 5.9.
-- Use Linux 5.9 in build-many-glibcs.py.
-- Reword description of SXID_* tunable properties
-- New benchtest: pthread locks
-- y2038: nptl: Provide __futex_clock_wait_bitset64 to support 64 bit bitset
-- C-SKY: Make dynamic linker's name compitable with the older gcc.
-- Revert "C-SKY:Fix dynamic linker's name when mfloat-abi=softfp."
-- Move vtimes to a compatibility symbol
-- y2038: linux: Provide __time64 implementation
-- rt: Fix typos in comments in <aio.h>
-- C-SKY:Fix dynamic linker's name when mfloat-abi=softfp.
-- Drop the glibc-revert-ftime-compat.patch.
-
-* Thu Oct 29 2020 DJ Delorie <dj(a)redhat.com> - 2.32.9000-13
-- Add BuildRequires for perl (malloc/mtrace) if running the testsuite.
-
-* Wed Oct 21 2020 Siddhesh Poyarekar <siddhesh(a)redhat.com> - 2.32.9000-12
-- Revert __xstat64 symbol removal.
-- Revert xmknod* symbol removal.
-- Revert ftime symbol removal.
-
-* Sun Oct 18 2020 Patsy Griffin <patsy(a)redhat.com> - 2.32.9000-11
-- Auto-sync with upstream branch master,
- commit 0f09154c64005e78b61484ae87b5ea2028051ea0.
-- x86: Initialize CPU info via IFUNC relocation [BZ 26203]
-- Add NEWS entry for ftime compatibility move
-- support: Add create_temp_file_in_dir
-- linux: Add __readdir_unlocked
-- linux: Simplify opendir buffer allocation
-- linux: Move posix dir implementations to Linux
-- linux: Add 64-bit time_t support for wait3
-- Move ftime to a compatibility symbol
-- linux: Fix time64 support for futimesat
-- linux: Use INTERNAL_SYSCALL on fstatat{64}
-- shm tests: Append PID to names passed to shm_open [BZ #26737]
-- sysvipc: Fix tst-sysvshm-linux on x32
-- x86/CET: Update vfork to prevent child return
-- resolv: Serialize processing in resolv/tst-resolv-txnid-collision
-- statfs: add missing f_flags assignment
-- y2038: Remove not used __fstatat_time64 define
-- y2038: nptl: Convert pthread_mutex_{clock|timed}lock to support 64 bit
-- sysvipc: Return EINVAL for invalid shmctl commands
-- sysvipc: Fix IPC_INFO and SHM_INFO handling [BZ #26636]
-- AArch64: Use __memcpy_simd on Neoverse N2/V1
-- resolv: Handle transaction ID collisions in parallel queries (bug 26600)
-- support: Provide a way to clear the RA bit in DNS server responses
-- support: Provide a way to reorder responses within the DNS test server
-- Add missing stat/mknod symbol on libc.abilist some ABIs
-- manual: correct the spelling of "MALLOC_PERTURB_" [BZ #23015]
-- manual: replace an obsolete collation example with a valid one
-- rtld: fix typo in comment
-- elf: Add missing <dl-procinfo.h> header to elf/dl-usage.c
-- hurd: support clock_gettime(CLOCK_PROCESS/THREAD_CPUTIME_ID)
-- linux: Move xmknod{at} to compat symbols
-- linux: Add {f}stat{at} y2038 support
-- linux: Move {f}xstat{at} to compat symbols
-- linux: Disentangle fstatat from fxstatat
-- linux: Implement {l}fstat{at} in terms of fstatat
-- linux: Move the struct stat{64} to struct_stat.h
-- Remove mknod wrapper functions, move them to symbols
-- Remove stat wrapper functions, move them to exported symbols
-- <sys/platform/x86.h>: Add FSRCS/FSRS/FZLRM support
-- <sys/platform/x86.h>: Add Intel HRESET support
-- <sys/platform/x86.h>: Add AVX-VNNI support
-- <sys/platform/x86.h>: Add AVX512_FP16 support
-- <sys/platform/x86.h>: Add Intel UINTR support
-- elf: Do not pass GLRO(dl_platform), GLRO(dl_platformlen) to _dl_important_hwcaps
-- elf: Enhance ld.so --help to print HWCAP subdirectories
-- elf: Add library search path information to ld.so --help
-- sunrpc: Adjust RPC function declarations to match Sun's (bug 26686]
-- Avoid GCC 11 -Warray-parameter warnings [BZ #26686].
-- elf: Make __rtld_env_path_list and __rtld_search_dirs global variables
-- elf: Print the full name of the dynamic loader in the ld.so help message
-- elf: Use the term "program interpreter" in the ld.so help message
-- scripts/update-copyrights: Update csu/version.c, elf/dl-usage.c
-- elf: Implement ld.so --version
-- nptl: Add missing cancellation flags on lockf
-- Update mips64 libm-test-ulps
-- Update alpha libm-test-ulps
-- elf: Implement ld.so --help
-- elf: Record whether paths come from LD_LIBRARY_PATH or --library-path
-- elf: Move ld.so error/help output to _dl_usage
-- elf: Extract command-line/environment variables state from rtld.c
-
-* Wed Oct 14 2020 Florian Weimer <fweimer(a)redhat.com> - 2.32.9000-10
-- Disable -Werror on ELN (#1888246)
-
-* Wed Oct 14 2020 Florian Weimer <fweimer(a)redhat.com> - 2.32.9000-9
-- Make glibc.spec self-contained (#1887097)
-
-* Thu Oct 08 2020 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-8
-- Drop glibc-fix-float128-benchtests.patch; applied upstream.
-- Auto-sync with upstream branch master,
- commit 72d36ffd7db55ae599f4c77feb0eae25a0f3714e:
-- elf: Implement __rtld_malloc_is_complete
-- __vfscanf_internal: fix aliasing violation (bug 26690)
-- Revert "Fix missing redirects in testsuite targets"
-- nptl: Add missing cancellation flags on futex_internal and pselect32
-- elf: Implement _dl_write
-- elf: Do not search HWCAP subdirectories in statically linked binaries
-- Linux: Require properly configured /dev/pts for PTYs
-- Linux: unlockpt needs to fail with EINVAL, not ENOTTY (bug 26053)
-- login/tst-grantpt: Convert to support framework, more error checking
-- posix: Fix -Warray-bounds instances building timer_create [BZ #26687]
-- Replace Minumum/minumum with Minimum/minimum
-- Optimize scripts/merge-test-results.sh
-- Fix GCC 11 -Warray-parameter warning for __sigsetjmp (bug 26647)
-- manual: Fix typo
-- y2038: nptl: Convert pthread_rwlock_{clock|timed}{rd|wr}lock to support 64
- bit time
-- Y2038: nptl: Provide futex_abstimed_wait64 supporting 64 bit time
-- sysvipc: Return EINVAL for invalid msgctl commands
-- sysvipc: Fix IPC_INFO and MSG_INFO handling [BZ #26639]
-- sysvipc: Return EINVAL for invalid semctl commands
-- sysvipc: Fix SEM_STAT_ANY kernel argument pass [BZ #26637]
-- aarch64: enforce >=64K guard size [BZ #26691]
-- sysvipc: Fix semtimedop for Linux < 5.1 for 64-bit ABI
-- nptl: futex: Move __NR_futex_time64 alias to beginning of futex-internal.h
-- nptl: Provide proper spelling for 32 bit version of futex_abstimed_wait
-- string: Fix strerrorname_np return value [BZ #26555]
-- Set tunable value as well as min/max values
-- ld.so: add an --argv0 option [BZ #16124]
-- Reversing calculation of __x86_shared_non_temporal_threshold
-- linux: Add time64 recvmmsg support
-- linux: Add time64 support for nanosleep
-- linux: Consolidate utimes
-- linux: Use 64-bit time_t syscall on clock_getcputclockid
-- linux: Add time64 sigtimedwait support
-- linux: Add time64 select support
-- nptl: Fix __futex_abstimed_wait_cancellable32
-- sysvipc: Fix semtimeop for !__ASSUME_DIRECT_SYSVIPC_SYSCALLS
-- hurd: add ST_RELATIME
-- intl: Handle translation output codesets with suffixes [BZ #26383]
-- bench-strcmp.c: Add workloads on page boundary
-- bench-strncmp.c: Add workloads on page boundary
-- strcmp: Add a testcase for page boundary
-- strncmp: Add a testcase for page boundary [BZ #25933]
-- Set locale related environment variables in debugglibc.sh
-- benchtests: Run _Float128 tests only on architectures that support it
-- powerpc: Protect dl_powerpc_cpu_features on INIT_ARCH() [BZ #26615]
-- x86: Harden printf against non-normal long double values (bug 26649)
-- x86: Use one ldbl2mpn.c file for both i386 and x86_64
-- Define __THROW to noexcept for C++11 and later
-
-* Mon Sep 21 2020 Arjun Shankar <arjun(a)redhat.com> - 2.32.9000-7
-- Adjust glibc-rh741105.patch.
-- Add glibc-fix-float128-benchtests.patch to allow building on armv7hl.
-- Auto-sync with upstream branch master,
- commit cdf645427d176197b82f44308a5e131d69fb53ad:
-- Update mallinfo2 ABI, and test
-- Allow memset local PLT reference for RISC-V.
-- powerpc: fix ifunc implementation list for POWER9 strlen and stpcpy
-- nscd: bump GC cycle during cache pruning (bug 26130)
-- x86: Use HAS_CPU_FEATURE with IBT and SHSTK [BZ #26625]
-- <sys/platform/x86.h>: Add Intel Key Locker support
-- Fix handling of collating symbols in fnmatch (bug 26620)
-- pselect.c: Pass a pointer to SYSCALL_CANCEL [BZ #26606]
-- y2038: nptl: Convert sem_{clock|timed}wait to support 64 bit time
-- hurd: Add __x86_get_cpu_features to ld.abilist
-- x86: Install <sys/platform/x86.h> [BZ #26124]
-- linux: Add time64 pselect support
-- linux: Add time64 semtimedop support
-- linux: Add ppoll time64 optimization
-- linux: Simplify clock_getres
-- Update sparc libm-test-ulps
-- Remove internal usage of extensible stat functions
-- Linux: Consolidate xmknod
-- linux: Consolidate fxstatat{64}
-- linux: Consolidate fxstat{64}
-- linux: Consolidate lxstat{64}
-- linux: Consolidate xstat{64}
-- linux: Define STAT64_IS_KERNEL_STAT64
-- linux: Always define STAT_IS_KERNEL_STAT
-- Update powerpc libm-test-ulps
-- benchtests: Add "workload" traces for sinf128
-- benchtests: Add "workload" traces for sinf
-- benchtests: Add "workload" traces for sin
-- benchtests: Add "workload" traces for powf128
-- benchtests: Add "workload" traces for pow
-- benchtests: Add "workload" traces for expf128
-- benchtests: Add "workload" traces for exp
-- nptl: futex: Provide correct indentation for part of
- __futex_abstimed_wait_cancelable64
-
-* Tue Sep 08 2020 DJ Delorie <dj(a)redhat.com> - 2.32.9000-6
-- Auto-sync with upstream branch master,
- commit e74b61c09a2a2ab52153e731225ccba5078659b1.
-- Disable -Wstringop-overread for some string tests
-- string: Fix GCC 11 `-Werror=stringop-overread' error
-- C11 threads: Fix inaccuracies in testsuite
-- elf.h: Add aarch64 bti/pac dynamic tag constants
-- x86: Set CPU usable feature bits conservatively [BZ #26552]
-
-* Wed Sep 02 2020 Patsy Griffin <patsy(a)redhat.com> - 2.32.9000-5
-- Auto-sync with upstream branch master,
- commit 86a912c8634f581ea42ec6973553dde7f058cfbf.
-- Update i686 ulps.
-- Use LFS readdir in generic POSIX getcwd [BZ# 22899]
-- linux: Remove __ASSUME_ATFCTS
-- Sync getcwd with gnulib
-- x86-64: Fix FMA4 detection in ifunc [BZ #26534]
-- y2038: nptl: Convert pthread_cond_{clock|timed}wait to support 64 bit time
-- malloc: Fix mallinfo deprecation declaration
-- x32: Add <fixup-asm-unistd.h> and regenerate arch-syscall.h
-- Add mallinfo2 function that support sizes >= 4GB.
-- Remove obsolete default/nss code
-- AArch64: Improve backwards memmove performance
-- Add RISC-V 32-bit target to build-many-glibcs.py
-- Documentation for the RISC-V 32-bit port
-- RISC-V: Build infrastructure for 32-bit port
-- RISC-V: Add rv32 path to RTLDLIST in ldd
-- riscv32: Specify the arch_minimum_kernel as 5.4
-- RISC-V: Fix llrint and llround missing exceptions on RV32
-- RISC-V: Add the RV32 libm-test-ulps
-- RISC-V: Add 32-bit ABI lists
-- RISC-V: Add hard float support for 32-bit CPUs
-- RISC-V: Support the 32-bit ABI implementation
-- RISC-V: Add arch-syscall.h for RV32
-- RISC-V: Add path of library directories for the 32-bit
-- RISC-V: Support dynamic loader for the 32-bit
-- RISC-V: Add support for 32-bit vDSO calls
-- RISC-V: Use 64-bit-time syscall numbers with the 32-bit port
-- RISC-V: Cleanup some of the sysdep.h code
-- RISC-V: Use 64-bit time_t and off_t for RV32 and RV64
-- io/lockf: Include bits/types.h before __OFF_T_MATCHES_OFF64_T check
-- elf/tst-libc_dlvsym: Add a TEST_COMPAT around some symbol tests
-- hurd: define BSD 4.3 ioctls only under __USE_MISC
-- string: test strncasecmp and strncpy near page boundaries
-- linux: Simplify utimensat
-- linux: Simplify timerfd_settime
-- linux: Simplify timer_gettime
-- linux: Simplify sched_rr_get_interval
-- linux: Simplify ppoll
-- linux: Simplify mq_timedsend
-- linux: Simplify mq_timedreceive
-- linux: Simplify clock_settime
-- linux: Simplify clock_nanosleep
-- linux: Simplify clock_gettime
-- linux: Simplify clock_adjtime
-- linux: Add helper function to optimize 64-bit time_t fallback support
-- S390: Sync HWCAP names with kernel by adding aliases [BZ #25971]
-- [vcstocl] Import ProjectQuirks from its own file
-- build-many-glibcs.py: Add a s390x -O3 glibc variant.
-- Fix namespace violation in stdio.h and sys/stat.h if build with optimization. [BZ #26376]
-- Add C2x BOOL_MAX and BOOL_WIDTH to limits.h.
-- Use MPC 1.2.0 in build-many-glibcs.py.
-- Add new STATX_* constants from Linux 5.8 to bits/statx-generic.h.
-- Correct locking and cancellation cleanup in syslog functions (bug 26100)
-
-* Thu Aug 20 2020 Carlos O'Donell <carlos(a)redhat.com> - 2.32.9000-4
-- Support building glibc in a mock chroot using older systemd-nspawn (#1869030).
-
-* Tue Aug 18 2020 Carlos O'Donell <carlos(a)redhat.com> - 2.32.9000-3
-- Suggest installing minimal localization e.g. C, POSIX, C.UTF-8.
-
-* Mon Aug 17 2020 DJ Delorie <dj(a)redhat.com> - 2.32.9000-2
-- Auto-sync with upstream branch master,
- commit cb7e7a5ca1d6d25d59bc038bdc09630e507c41e5.
-- nptl: Handle NULL abstime [BZ #26394]
-- Update build-many-glibcs.py for binutils ia64 obsoletion.
-- Update kernel version to 5.8 in tst-mman-consts.py.
-- y2038: nptl: Convert pthread_{clock|timed}join_np to support 64 bit time
-- aarch64: update ulps.
-
-* Wed Aug 12 2020 Patsy Griffin <patsy(a)redhat.com> - 2.32.9000-1
-- Auto-sync with upstream branch master,
- commit 0be0845b7a674dbfb996f66cd03d675f0f6028dc:
-- S390: Regenerate ULPs.
-- manual: Fix sigdescr_np and sigabbrev_np return type (BZ #26343)
-- math: Update x86_64 ulps
-- math: Regenerate auto-libm-test-out-j0
-- manual: Put the istrerrorname_np and strerrordesc_np return type in braces
-- Linux: Use faccessat2 to implement faccessat (bug 18683)
-- manual: Fix strerrorname_np and strerrordesc_np return type (BZ #26343)
-- math: Fix inaccuracy of j0f for x >= 2^127 when sin(x)+cos(x) is tiny
-- Update syscall lists for Linux 5.8.
-- Use Linux 5.8 in build-many-glibcs.py.
-- htl: Enable tst-cancelx?[45]
-- tst-cancel4: Make blocking on write more portable
-- hurd: Add missing hidden def
-- hurd: Rework sbrk
-- hurd: Implement basic sched_get/setscheduler
-- x86: Rename Intel CPU feature names
-- manual: Fix some @code/@var formatting glitches chapter Date And Time
-- Copy regex_internal.h from Gnulib
-- Copy regex BITSET_WORD_BITS porting from Gnulib
-- Sync regex.h from Gnulib
-- Sync mktime.c from Gnulib
-- Sync intprops.h from Gnulib
-- Open master branch for glibc 2.33 development.
-
-* Thu Aug 06 2020 Arjun Shankar <arjun(a)redhat.com> - 2.32-1
-- Auto-sync with upstream branch release/2.32/master,
- commit 3de512be7ea6053255afed6154db9ee31d4e557a:
-- Prepare for glibc 2.32 release.
-- Regenerate configure scripts.
-- Update NEWS with bugs.
-- Update translations.
-- Don't mix linker error messages into edited scripts
-- benchtests/README update.
-- RISC-V: Update lp64d libm-test-ulps according to HiFive Unleashed
-- aarch64: update NEWS about branch protection
-- Add NEWS entry for CVE-2016-10228 (bug 19519)
-- powerpc: Fix incorrect cache line size load in memset (bug 26332)
-- Update Nios II libm-test-ulps file.
-
-* Fri Jul 31 2020 Patsy Griffin <patsy(a)redhat.com> - 2.31.9000-24
-- Auto-sync with upstream branch master,
- commit 7f1a08cff82255cd4252a2c75fd65b80a6a170bf.
-- Move NEWS entry for CVE-2020-1751 to the 2.31 section
-- NEWS: Deprecate weak libpthread symbols for single-threaded checks
-- NEWS: Deprecate nss_hesiod
-- nptl: Zero-extend arguments to SETXID syscalls [BZ #26248]
-- Use binutils 2.35 branch in build-many-glibcs.py.
-- aarch64: Use future HWCAP2_MTE in ifunc resolver
-- Update x86-64 libm-test-ulps
-- aarch64: Respect p_flags when protecting code with PROT_BTI
-- Disable warnings due to deprecated libselinux symbols used by nss and nscd
-- Regenerate INSTALL for ARC port updates.
-- Update libc.pot for 2.32 release.
-- powerpc: Fix POWER10 selection
-- powerpc64le: guarantee a .gnu.attributes section [BZ #26220]
-
-* Wed Jul 29 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-23
-- Inherit -mbranch-protection=standard from redhat-rpm-config (for aarch64)
-
-* Mon Jul 27 2020 Fedora Release Engineering <releng(a)fedoraproject.org>
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
-
-* Wed Jul 22 2020 Carlos O'Donell <carlos(a)redhat.com> - 2.31.9000-21
-- Use make macros
-- https://fedoraproject.org/wiki/Changes/UseMakeBuildInstallMacro
-
-* Tue Jul 21 2020 Arjun Shankar <arjun(a)redhat.com> - 2.31.9000-20
-- Add glibc-deprecated-selinux-makedb.patch and
- glibc-deprecated-selinux-nscd.patch to work around libselinux API
- deprecations.
-- Drop glibc-rseq-disable.patch; rseq support removed upstream. (#1855729)
-- Auto-sync with upstream branch master,
- commit ec2f1fddf29053957d061dfe310f106388472a4f:
-- libio: Remove __libc_readline_unlocked
-- shadow: Implement fgetspent_r using __nss_fgetent_r
-- pwd: Implement fgetpwent_r using __nss_fgetent_r
-- gshadow: Implement fgetsgent_r using __nss_fgetent_r (bug 20338)
-- grp: Implement fgetgrent_r using __nss_fgetent_r
-- nss: Add __nss_fgetent_r
-- libio: Add fseterr_unlocked for internal use
-- nss_files: Use generic result pointer in parse_line
-- nss_files: Consolidate line parse declarations in <nss_files.h>
-- nss_compat: Do not use mmap to read database files (bug 26258)
-- nss_files: Consolidate file opening in __nss_files_fopen
-- Update powerpc-nofpu libm-test-ulps.
-- Use MPFR 4.1.0 in build-many-glibcs.py.
-- elf: Change TLS static surplus default back to 1664
-- hurd: Fix longjmp check for sigstate
-- hurd: Fix longjmp early in initialization
-- manual: New signal and errno string functions are AS-safe
-- AArch64: Improve strlen_asimd performance (bug 25824)
-- Move <rpc/netdb.h> from sunrpc to inet
-- en_US: Minimize changes to date_fmt (Bug 25923)
-- Linux: Remove rseq support
-- manual: Use Unicode instead HTML entities for characters (bug 19737)
-- Add NEWS entry for CVE-2020-6096 (bug 25620)
-- arm: remove string/tst-memmove-overflow XFAIL
-- AArch64: Rename IS_ARES to IS_NEOVERSE_N1
-- AArch64: Add optimized Q-register memcpy
-- AArch64: Align ENTRY to a cacheline
-- Correct timespec implementation [BZ #26232]
-- Remove --enable-obsolete-rpc configure flag
-- hurd: Fix build-many-glibcs.py
-- x86: Support usable check for all CPU features
-- string: Make tst-strerror/tst-strsignal unsupported if msgfmt is not installed
-- malloc: Deprecate more hook-related functionality
-- elf: Support at least 32-byte alignment in static dlopen
-- x86: Remove __ASSEMBLER__ check in init-arch.h
-- x86: Remove the unused __x86_prefetchw
-- Documentation for ARC port
-- build-many-glibcs.py: Enable ARC builds
-- ARC: Build Infrastructure
-- ARC: ABI lists
-- ARC: Linux Startup and Dynamic Loading
-- ARC: Linux ABI
-- ARC: Linux Syscall Interface
-- ARC: hardware floating point support
-- ARC: math soft float support
-- ARC: Atomics and Locking primitives
-- ARC: Thread Local Storage support
-- ARC: startup and dynamic linking code
-- ARC: ABI Implementation
-- Fix time/tst-cpuclock1 intermitent failures
-- powerpc64: Fix calls when r2 is not used [BZ #26173]
-- Add NEWS entry for Update to Unicode 13.0.0 [BZ #25819]
-- Update i686 libm-test-ulps
-- Fix memory leak in __printf_fp_l (bug 26215).
-- Fix double free in __printf_fp_l (bug 26214).
-- linux: Fix syscall list generation instructions
-- sysv: linux: Add 64-bit time_t variant for shmctl
-- sysvipc: Remove the linux shm-pad.h file
-- sysvipc: Split out linux struct shmid_ds
-- sysv: linux: Add 64-bit time_t variant for msgctl
-- sysvipc: Remove the linux msq-pad.h file
-- sysvipc: Split out linux struct semid_ds
-- sysv: linux: Add 64-bit time_t variant for semctl
-
-* Fri Jul 10 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-19
-- Disable rseq registration by default to help Firefox (#1855729)
-
-* Thu Jul 09 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-18
-- Auto-sync with upstream branch master,
- commit ffb17e7ba3a5ba9632cee97330b325072fbe41dd:
-- rtld: Avoid using up static TLS surplus for optimizations [BZ #25051]
-- rtld: Account static TLS surplus for audit modules
-- rtld: Add rtld.nns tunable for the number of supported namespaces
-- Remove --enable-obsolete-nsl configure flag
-- Move non-deprecated RPC-related functions from sunrpc to inet
-- aarch64: add NEWS entry about branch protection support
-- aarch64: redefine RETURN_ADDRESS to strip PAC
-- aarch64: fix pac-ret support in _mcount
-- aarch64: Add pac-ret support to assembly files
-- aarch64: configure check for pac-ret code generation
-- aarch64: ensure objects are BTI compatible
-- aarch64: enable BTI at runtime
-- aarch64: fix RTLD_START for BTI
-- aarch64: fix swapcontext for BTI
-- aarch64: Add BTI support to assembly files
-- aarch64: Rename place holder .S files to .c
-- aarch64: configure test for BTI support
-- Rewrite abi-note.S in C.
-- rtld: Clean up PT_NOTE and add PT_GNU_PROPERTY handling
-- string: Move tst-strsignal tst-strerror to tests-container
-- string: Fix prototype mismatch in sigabbrev_np, __sigdescr_np
-- arm: CVE-2020-6096: Fix multiarch memcpy for negative length (#1820332)
-- arm: CVE-2020-6096: fix memcpy and memmove for negative length (#1820332)
-- sunrpc: Remove hidden aliases for global data symbols (bug 26210)
-- hurd: Fix strerror not setting errno
-- tst-strsignal: fix checking for RT signals support
-- hurd: Evaluate fd before entering the critical section
-- CVE-2016-10228: Rewrite iconv option parsing (#1428292)
-- nss: Remove cryptographic key support from nss_files, nss_nis, nss_nisplus
-- sunrpc: Do not export getrpcport by default
-- sunrpc: Do not export key handling hooks by default
-- sunrpc: Turn clnt_sperrno into a libc_hidden_nolink_sunrpc symbol
-- string: Add strerrorname_np and strerrordesc_np
-- string: Add sigabbrev_np and sigdescr_np
-- string: Add strerror_l on test-strerror-errno
-- string: Add strerror, strerror_r, and strerror_l test
-- string: Add strsignal test
-- string: Simplify strerror_r
-- string: Use tls-internal on strerror_l
-- string: Implement strerror in terms of strerror_l
-- string: Remove old TLS usage on strsignal
-- linux: Fix __NSIG_WORDS and add __NSIG_BYTES
-- signal: Move sys_errlist to a compat symbol
-- signal: Move sys_siglist to a compat symbol
-- signal: Add signum-{generic,arch}.h
-- Remove most vfprintf width/precision-dependent allocations (bug 14231, bug 26211).
-- elf: Do not signal LA_ACT_CONSISTENT for an empty namespace [BZ #26076]
-- Fix stringop-overflow errors from gcc 10 in iconv.
-- x86: Add thresholds for "rep movsb/stosb" to tunables
-- Use C2x return value from getpayload of non-NaN (bug 26073).
-- x86: Detect Extended Feature Disable (XFD)
-- x86: Correct bit_cpu_CLFSH [BZ #26208]
-- manual: Document __libc_single_threaded
-- Add the __libc_single_threaded variable
-- Linux: rseq registration tests
-- Linux: Use rseq in sched_getcpu if available
-- Linux: Perform rseq registration at C startup and thread creation
-- tst-cancel4: deal with ENOSYS errors
-- manual: Show copyright information not just in the printed manual
-
-
-* Thu Jul 02 2020 Carlos O'Donell <carlos(a)redhat.com> - 2.31.9000-17
-- Auto-sync with upstream branch master,
- commit c6aac3bf3663709cdefde5f5d5e9e875d607be5e.
-- Fix typo in comment in bug 26137 fix.
-- Fix strtod multiple-precision division bug (bug 26137).
-- Linux: Fix UTC offset setting in settimeofday for __TIMESIZE != 64
-- random: range is not portably RAND_MAX [BZ #7003]
-- Update kernel version to 5.7 in tst-mman-consts.py.
-- powerpc: Add support for POWER10
-- hurd: Simplify usleep timeout computation
-- htl: Enable cancel*16 an cancel*20 tests
-- hurd: Add remaining cancelation points
-- hurd: fix usleep(ULONG_MAX)
-- hurd: Make fcntl(F_SETLKW*) cancellation points
-- hurd: make wait4 a cancellation point
-- hurd: Fix port definition in HURD_PORT_USE_CANCEL
-- hurd: make close a cancellation point
-- hurd: make open and openat cancellation points
-- hurd: clean fd and port on thread cancel
-- htl: Move cleanup handling to non-private libc-lock
-- htl: Fix includes for lockfile
-- htl: avoid cancelling threads inside critical sections
-- tst-cancel4-common.c: fix calling socketpair
-- x86: Detect Intel Advanced Matrix Extensions
-- Set width of JUNGSEONG/JONGSEONG characters from UD7B0 to UD7FB to 0 [BZ #26120]
-- S390: Optimize __memset_z196.
-- S390: Optimize __memcpy_z196.
-- elf: Include <stddef.h> (for size_t), <sys/stat.h> in <ldconfig.h>
-- nptl: Don't madvise user provided stack
-- S390: Regenerate ULPs.
-- htl: Add wrapper header for <semaphore.h> with hidden __sem_post
-- elf: Include <stdbool.h> in <dl-tunables.h> because bool is used
-- htl: Fix case when sem_*wait is canceled while holding a token
-- htl: Make sem_*wait cancellations points
-- htl: Simplify non-cancel path of __pthread_cond_timedwait_internal
-- htl: Enable tst-cancel25 test
-- powerpc: Add new hwcap values
-- aarch64: MTE compatible strncmp
-- aarch64: MTE compatible strcmp
-- aarch64: MTE compatible strrchr
-- aarch64: MTE compatible memrchr
-- aarch64: MTE compatible memchr
-- aarch64: MTE compatible strcpy
-- Add MREMAP_DONTUNMAP from Linux 5.7
-- x86: Update CPU feature detection [BZ #26149]
-
-* Mon Jun 22 2020 DJ Delorie <dj(a)redhat.com> - 2.31.9000-16
-- Auto-sync with upstream branch master,
- commit ea04f0213135b13d80f568ca2c4127c2ec112537.
-- aarch64: Remove fpu Makefile
-- m68k: Use sqrt{f} builtin for coldfire
-- arm: Use sqrt{f} builtin
-- riscv: Use sqrt{f} builtin
-- s390: Use sqrt{f} builtin
-- sparc: Use sqrt{f} builtin
-- mips: Use sqrt{f} builtin
-- alpha: Use builtin sqrt{f}
-- i386: Use builtin sqrtl
-- x86_64: Use builtin sqrt{f,l}
-- powerpc: Use sqrt{f} builtin
-- s390x: Use fma{f} builtin
-- aarch64: Use math-use-builtins for ceil{f}
-- math: Decompose math-use-builtins.h
-- hurd: Add mremap
-- ia64: Use generic exp10f
-- New exp10f version without SVID compat wrapper
-- i386: Use generic exp10f
-- math: Optimized generic exp10f with wrappers
-- benchtests: Add exp10f benchmark
-
-* Fri Jun 19 2020 Patsy Franklin <patsy(a)redhat.com> - 2.31.9000-15
-- Auto-sync with upstream branch master,
- commit 27f8864bd41f0f1b61e8e947d9a030b1a0d23df9.
-- x86: Update F16C detection [BZ #26133]
-- Fix avx2 strncmp offset compare condition check [BZ #25933]
-- nptl: Remove now-spurious tst-cancelx9 references
-- x86_64: Use %xmmN with vpxor to clear a vector register
-- x86: Correct bit_cpu_CLFLUSHOPT [BZ #26128]
-- powerpc64le: refactor e_sqrtf128.c
-- Update syscall-names.list for Linux 5.7.
-- ieee754/dbl-64: Reduce the scope of temporary storage variables
-- manual: Add pthread_attr_setsigmask_np, pthread_attr_getsigmask_np
-- ld.so: Check for new cache format first and enhance corruption check
-- hurd: Fix __writev_nocancel_nostatus
-- hurd: Make send* cancellation points
-- htl: Enable more cancellation tests
-- hurd: Make write and pwrite64 cancellation points
-- htl: Fix cleanup support for IO locking
-- htl: Move cleanup stack to variable shared between libc and pthread
-- htl: initialize first and prevent from unloading
-- htl: Add noreturn attribute on __pthread_exit forward
-- hurd: Make recv* cancellation points
-- powerpc: Automatic CPU detection in preconfigure
-- Use Linux 5.7 in build-many-glibcs.py.
-- htl: Enable more cancel tests
-- htl: Fix linking static tests by factorizing the symbols list
-- Add "%d" support to _dl_debug_vdprintf
-- aarch64: MTE compatible strlen
-- aarch64: MTE compatible strchr
-- aarch64: MTE compatible strchrnul
-- AArch64: Merge Falkor memcpy and memmove implementations
-- hurd: document that gcc&gdb look at the trampoline code
-- pthread: Move back linking rules to nptl and htl
-- htl: Enable more tests
-- htl: Fix registration of atfork handlers in modules
-- htl: Fix tls initialization for already-created threads
-- hurd: Make read and pread64 cancellable
-- hurd: Fix unwinding over interruptible RPC
-- htl: Enable but XFAIL tst-flock2, tst-signal1, tst-signal2
-- hurd: XFAIL more tests that require setpshared support
-- hurd: Briefly document in xfails the topics of the bugzilla entries
-- htl: Enable more tests
-- htl: Add sem_clockwait support
-- htl: fix register-atfork ordering
-- hurd: Fix hang in _hurd_raise_signal from pthread_kill
-- hurd: Reject raising invalid signals
-- hurd: fix clearing SS_ONSTACK when longjmp-ing from sighandler
-- hurd: Add pointer guard support
-- hurd: Add stack guard support
-- dl-runtime: reloc_{offset,index} now functions arch overide'able
-- powerpc64le: add optimized strlen for P9
-- powerpc64le: use common fmaf128 implementation
-
-* Fri Jun 05 2020 Patsy Griffin <patsy(a)redhat.com> - 2.31.9000-14
-- Auto-sync with upstream branch master,
- commit e52434a2e4d1105272daaef87678da950fbec73f.
-- benchtests: Restore the clock_gettime option
-- Update HP_TIMING_NOW for _ISOMAC in sysdeps/generic/hp-timing.h
-- Replace val with __val in TUNABLE_SET_VAL_IF_VALID_RANGE
-- support: Fix detecting hole support on >2KB-block filesystems
-- powerpc: Fix powerpc64le due a7a3435c9a
-- manual/jobs.texi: remove unused var from example code
-- powerpc/fpu: use generic fma functions
-- aarch/fpu: use generic builtins based math functions
-- ieee754: provide gcc builtins based generic fma functions
-- ieee754: provide gcc builtins based generic sqrt functions
-- Linux: Use __pthread_attr_setsigmask_internal for timer helper thread
-- nptl: Add pthread_attr_setsigmask_np, pthread_attr_getsigmask_np
-- nptl: Make pthread_attr_t dynamically extensible
-- nptl: Destroy the default thread attribute as part of freeres
-- nptl: Change type of __default_pthread_attr
-- nptl: Use __pthread_attr_setaffinity_np in pthread_getattr_np
-- nptl: Use __pthread_getattr_default_np in pthread_create
-- nptl: Add internal alias __pthread_getattr_default_np
-- htl: Fix gsync_wait symbol exposition
-- htl: Make pthread_cond_destroy wait for threads to be woken
-- htl: Enable more cond tests
-- tst-cond11: Fix build with _SC_MONOTONIC_CLOCK > 0
-- mbstowcs: Document, test, and fix null pointer dst semantics (Bug 25219)
-- build: Use FAIL_EXIT1 () on failure to exec child [BZ #23990]
-- manual: Fix backtraces code example [BZ #10441]
-- hurd: Fix fexecve
-- i386: Remove unused file sysdeps/unix/i386/sysdep.S
-- hurd: fix ptsname error when called on a non-tty
-- hurd: Fix fdopendir checking for directory type
-- i386: Remove NO_TLS_DIRECT_SEG_REFS handling
-- Hurd: Move <hurd/sigpreempt.h> internals into wrapper header
-- Hurd: Use __sigmask in favor of deprecated sigmask
-- hurd: Fix pselect atomicity
-- elf: Remove extra hwcap mechanism from ldconfig
-- elf: Do not read hwcaps from the vDSO in ld.so
-- linux: Use internal DIR locks when accessing filepos on telldir
-- Update i386 libm-test-ulps
-- htl: Add clock variants
-- signal: Deprecate additional legacy signal handling functions
-- elf: Turn _dl_printf, _dl_error_printf, _dl_fatal_printf into functions
-- x86: Update Intel Atom processor family optimization
-- elf.h: add aarch64 property definitions
-- elf.h: Add PT_GNU_PROPERTY
-- <libc-symbols.h>: Add libpthread hidden alias support
-- nptl: Use __pthread_attr_copy in pthread_setattr_default_np
-- nptl: Use __pthread_attr_copy in pthread_getattr_default_np (bug 25999)
-- nptl: Add __pthread_attr_copy for copying pthread_attr_t objects
-- nptl: Make __pthread_attr_init, __pthread_attr_destroy available internally
-- nptl: Move pthread_gettattr_np into libc
-- nptl: Move pthread_getaffinity_np into libc
-- nptl: Move pthread_attr_setaffinity_np into libc
-- nptl: Replace some stubs with the Linux implementation
-- Linux: Add missing handling of tai field to __ntp_gettime64
-- Mention GCC 10 attribute access.
-- y2038: Replace __clock_gettime with __clock_gettime64
-- manual: Add missing section and node for clockid_t wait functions
-- y2038: linux: Provide __ntp_gettimex64 implementation
-- y2038: linux: Provide __ntp_gettime64 implementation
-- y2038: Provide conversion helpers for struct __ntptimeval64
-- y2038: Introduce struct __ntptimeval64 - new internal glibc type
-- y2038: linux: Provide __adjtime64 implementation
-- y2038: linux: Provide ___adjtimex64 implementation
-- y2038: linux: Provide __clock_adjtime64 implementation
-- ldconfig: Default to the new format for ld.so.cache
-- nss_compat: internal_end*ent may clobber errno, hiding ERANGE [BZ #25976]
-- powerpc: Optimized rawmemchr for POWER9
-- x86: Add --enable-cet=permissive
-- Remove NO_CTORS_DTORS_SECTIONS macro
-- elf: Assert that objects are relocated before their constructors run
-- powerpc: Optimized stpcpy for POWER9
-- powerpc: Optimized strcpy for POWER9
-- x86: Move CET control to _dl_x86_feature_control [BZ #25887]
-- sunrpc/tst-udp-*: Fix timeout value
-- Linux: Remove remnants of the getcpu cache
-- Update timezone code from tzcode 2020a
-- aarch64: fix strcpy and strnlen for big-endian [BZ #25824]
-- locale: Add transliteration for Geresh, Gershayim (U+05F3, U+05F4)
-- string: Fix string/tst-memmove-overflow to compile with GCC 7
-- Add arch-syscall.h dependency for generating sysd-syscalls file
-- arm: XFAIL string/tst-memmove-overflow due to bug 25620
-- elf: Remove redundant add_to_global_resize_failure call from dl_open_args
-- string: Add string/tst-memmove-overflow, a test case for bug 25620
-- support: Add support_blob_repeat_allocate_shared
-- nptl: wait for pending setxid request also in detached thread (bug 25942)
-- aarch64: Accept PLT calls to __getauxval within libc.so
-- Use unsigned constants for ICMP6 filters [BZ #22489]
-- Linux: Enhance glibcsyscalls.py to support listing system calls
-
-* Mon May 11 2020 DJ Delorie <dj(a)redhat.com> - 2.31.9000-13
-- Auto-sync with upstream branch master,
- commit 978e8ac39f8ba2d694031e521511da1ae803ccfc.
-- Suppress GCC 10 true positive warnings [BZ #25967]
-- POWER: Add context-synchronizing instructions to pkey_write [BZ #25954]
-- hurd: Add missing sigstate members initialization
-- x86-64: Use RDX_LP on __x86_shared_non_temporal_threshold [BZ #25966]
-- linux: Remove assembly umount2 implementation
-- signal: Use <sigsetops.h> for sigemptyset, sigfillset
-- ckb_IQ, or_IN locales: Add missing reorder-end keywords
-- semaphore: consolidate arch headers into a generic one
-- Use GCC 10 branch in build-many-glibcs.py.
-- Document the internal _ and N_ macros
-- y2038: Provide conversion helpers for struct __timex64
-- y2038: Introduce struct __timex64 - new internal glibc type
-- y2038: include: Move struct __timeval64 definition to a separate file
-- y2038: nscd: Modify nscd_helper to use __clock_gettime64
-- y2038: inet: Convert inet deadline to support 64 bit time
-- y2038: hurd: Provide __clock_gettime64 function
-- y2038: Export __clock_gettime64 to be usable in other libraries
-- manual: Document the O_NOFOLLOW open flag
-- powerpc64le/power9: guard power9 strcmp against rtld usage [BZ# 25905]
-- float128: use builtin_signbitf128 always
-- improve out-of-bounds checking with GCC 10 attribute access [BZ #25219]
-- nios2: delete sysdeps/unix/sysv/linux/nios2/kernel-features.h
-- powerpc: Rename argN to _argN in LOADARGS_N [BZ #25902]
-- locale/tst-localedef-path-norm: Don't create $(complocaledir)
-- support: Set errno before testing it.
-- localedef: Add tests-container test for --no-hard-links.
-- test-container: Support $(complocaledir) and mkdirp.
-- i386: Remove unused variable in sysdeps/x86/cacheinfo.c
-- Add a C wrapper for prctl [BZ #25896]
-- powerpc64le: Enable support for IEEE long double
-- powerpc64le: blacklist broken GCC compilers (e.g GCC 7.5.0)
-- powerpc64le: bump binutils version requirement to >= 2.26
-- powerpc64le: raise GCC requirement to 7.4 for long double transition
-- Rename __LONG_DOUBLE_USES_FLOAT128 to __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI
-- ldbl-128ibm-compat: workaround GCC 9 C++ PR90731
-- x86: Add the test case of __get_cpu_features support for Zhaoxin processors
-- x86: Add cache information support for Zhaoxin processors
-- x86: Add CPU Vendor ID detection support for Zhaoxin processors
-- Update translations
-- Add C wrappers for process_vm_readv/process_vm_writev [BZ #25810]
-- generic/typesizes.h: Add support for 32-bit arches with 64-bit types
-- semctl: Remove the sem-pad.h file
-- bits/sem.h: Split out struct semid_ds
-- Mark unsigned long arguments with U in more syscalls [BZ #25810]
-- elf: Add initial flag argument to __libc_early_init
-- Add SYSCALL_ULONG_ARG_[12] to pass long to syscall [BZ #25810]
-- Makeconfig: Use $(error ...) to output error message
-- manual: Fix typos in the fexecve description
-- misc: Remove sstk from the autogenerated system call list
-- Remove unused floating-point configuration from gmp-impl.h.
-- support: Implement <support/xthread.h> key create/delete
-- nptl/tst-setuid1-static: Improve isolation from system objects
-- Increase the timeout of locale/tst-localedef-path-norm
-- Use 2020 as copyright year.
-- misc: Turn sstk into a compat symbol
-- manual: Document the fexecve function
-- nptl: Start new threads with all signals blocked [BZ #25098]
-- localedef: Add verbose messages for failure paths.
-- Remove most gmp-mparam.h headers.
-- elf: Implement __libc_early_init
-- elf: Introduce <elf_machine_sym_no_match.h>
-- Add a syscall test for [BZ #25810]
-- elf: Support lld-style link map for librtld.map
-- signal: Only handle on NSIG signals on signal functions (BZ #25657)
-- linux: Use pthread_sigmask on sigprocmask
-- ia64: Remove sigprocmask/sigblock objects from libpthread
-- nptl: Move pthread_sigmask implementation to libc
-- Bug 25819: Update to Unicode 13.0.0
-
-* Wed Apr 29 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-12
-- nss_db.x86_64 should install nss_db.i686 if glibc.i686 is installed (#1807821)
-- Likewise for nss_hesiod.
-
-* Mon Apr 27 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-11
-- Introduce glibc-headers-x86, glibc-headers-s390 packages (#1828332)
-- Remove the glibc-headers package
-
-* Mon Apr 20 2020 DJ Delorie <dj(a)redhat.com> - 2.31.9000-10
-- Auto-sync with upstream branch master,
- commit 0798b8ecc8da8667362496c1217d18635106c609.
-- ARC: Update syscall-names.list for ARC specific syscalls
-- Revert "x86_64: Add SSE sfp-exceptions"
-- provide y2038 safe socket constants for default/asm-generic ABI
-- x86_64: Add SSE sfp-exceptions
-- Remove __NO_MATH_INLINES
-- i686: Add INTERNAL_SYSCALL_NCS 6 argument support
-- Reset converter state after second wchar_t output (Bug 25734)
-- Fix typo in posix/tst-fnmatch.input (Bug 25790)
-
-* Wed Apr 15 2020 Patsy Griffin <patsy(a)redhat.com> - 2.31.9000-9
-- Auto-sync with upstream branch master,
- commit 076f09afbac1aa57756faa7a8feadb7936a724e4.
-- Linux: Remove <sys/sysctl.h> and the sysctl function
-- posix: Add wait4 test case
-- linux: wait4: Fix incorrect return value comparison
-- hurd: add mach_print function
-- x32: Properly pass long to syscall [BZ #25810]
-- Add GRND_INSECURE from Linux 5.6 to sys/random.h
-- Update kernel version to 5.6 in tst-mman-consts.py.
-
-* Wed Apr 15 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-8
-- nsswitch.conf: don't add sss to shadow line
-
-* Wed Apr 08 2020 Carlos O'Donell <carlos(a)redhat.com> - 2.31.9000-7
-- Auto-sync with upstream branch master,
- commit b1caa144c74678097cada5a54eda2996bb459d8f.
-- Update mips libm-test-ulps
-- Update alpha libm-test-ulps
-- Update ia64 libm-test-ulps
-- Update sparc libm-test-ulps
-- Update arm libm-test-ulps
-- Update aarch64 libm-test-ulps
-- Updates to the shn_MM locale [BZ #25532]
-- powerpc: Update ULPs and xfail more ibm128 outputs
-- i386: Remove build support for GCC older than GCC 6
-- oc_FR locale: Fix spelling of April (bug 25639)
-- Update hppa libm-test-ulps
-- y2038: linux: Provide __mq_timedreceive_time64 implementation
-- y2038: linux: Provide __mq_timedsend_time64 implementation
-- y2038: include: Move struct __timespec64 definition to a separate file
-- malloc: ensure set_max_fast never stores zero [BZ #25733]
-- powerpc64le: enforce non-specific long double in .gnu.attributes section
-- powerpc64le: workaround ieee long double / _Float128 stdc++ bug
-- powerpc64le: Enforce -mabi=ibmlongdouble when -mfloat128 used
-- powerpc64le/multiarch: don't generate strong aliases for fmaf128-ppc64
-- ldbl-128ibm: simplify iscanonical.h
-- i386: Disable check_consistency for GCC 5 and above [BZ #25788]
-- Add IPPROTO_ETHERNET and IPPROTO_MPTCP from Linux 5.6 to netinet/in.h.
-- Update syscall lists for Linux 5.6.
-- elf: Implement DT_AUDIT, DT_DEPAUDIT support [BZ #24943]
-- elf: Simplify handling of lists of audit strings
-- support: Change xgetline to return 0 on EOF
-- nptl: Remove x86_64 cancellation assembly implementations [BZ #25765]
-- aarch64: update bits/hwcap.h
-- Add tests for Safe-Linking
-- S390: Regenerate ULPs.
-- sysv/alpha: Use generic __timeval32 and helpers
-- linux: Use long time_t for wait4/getrusage
-- resource: Add a __rusage64 struct
-- linux: Use long time_t __getitimer/__setitimer
-- sysv: Define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64
-- math: Add inputs that yield larger errors for float type (x86_64)
-
-* Tue Mar 31 2020 DJ Delorie <dj(a)redhat.com> - 2.31.9000-6
-- Auto-sync with upstream branch master,
- commit 49c3c37651e2d2ec4ff8ce21252bbbc08a9d6639.
-- Fix alignment bug in Safe-Linking
-- Typo fixes and CR cleanup in Safe-Linking
-- Use Linux 5.6 and GMP 6.2.0 in build-many-glibcs.py.
-- Add new file missed in previous hppa commit.
-- powerpc: Add support for fmaf128() in hardware
-- Fix data race in setting function descriptors during lazy binding on hppa.
-- sparc: Move __fenv_{ld,st}fsr to fenv-private.h
-- x86: Remove feraiseexcept optimization
-- math: Remove fenvinline.h
-- hurd: Make O_TRUNC update mtime/ctime
-- Add Safe-Linking to fastbins and tcache
-- Add benchtests for roundeven and roundevenf.
-- time: Add a __itimerval64 struct
-- time: Add a timeval with a 32-bit tv_sec and tv_usec
-- sysv/linux: Rename alpha functions to be alpha specific
-- ARC: add definitions to elf/elf.h
-- powerpc64: apply -mabi=ibmlongdouble to special files
-- powerpc64le: add -mno-gnu-attribute to *f128 objects and difftime
-- Makeconfig: sandwich gnulib-tests between libc/ld linking of tests
-- powerpc64le: Ensure correct ldouble compiler flags are used
-- Fix tests which expose ldbl -> _Float128 redirects
-- ldbl-128ibm-compat: PLT redirects for using ldbl redirects internally
-
-* Wed Mar 25 2020 Patsy Franklin <patsy(a)redhat.com> - 2.31.9000-5
-- Auto-sync with upstream branch master,
- commit 4eda036f5b897fa8bc20ddd2099b5a6ed4239dc9.
-- stdlib: Move tst-system to tests-container
-- support/shell-container.c: Add builtin kill
-- support/shell-container.c: Add builtin exit
-- support/shell-container.c: Return 127 if execve fails
-- Add NEWS entry for CVE-2020-1751 (bug 25423)
-- posix: Fix system error return value [BZ #25715]
-- y2038: fix: Add missing libc_hidden_def attribute for some syscall wrappers
-- Extended Char Intro: Use getwc in example (Bug 25626)
-- stdio: Add tests for printf multibyte convertion leak [BZ#25691]
-- stdio: Remove memory leak from multibyte convertion [BZ#25691]
-- Add NEWS entry for CVE-2020-1752 (bug 25414)
-- math: Remove inline math tests
-- Remove __LIBC_INTERNAL_MATH_INLINES
-- math: Remove mathinline
-- m68k: Remove mathinline.h
-- oc_FR locale: Fix spelling of Thursday (bug 25639)
-- x86: Remove ARCH_CET_LEGACY_BITMAP [BZ #25397]
-- Fix build with GCC 10 when long double = double.
-- nscd/cachedumper.c : fix whitespace
-- Fix nscd/cachedumper.c compile errors
-- manual: Fix inconsistent declaration of wcsrchr [BZ #24655]
-- nscd: add cache dumper
-
-* Fri Mar 13 2020 Patsy Franklin <patsy(a)redhat.com> - 2.31.9000-4
-- Auto-sync with upstream branch master,
- commit 2de7fe62534b7a6461c633114f03e9dff394f5f7.
-- parse_tunables: Fix typo in comment
-- ldconfig: trace origin paths with -v
-- test-container: print errno when execvp fails
-- [AArch64] Improve integer memcpy
-- Add NEWS entry for CVE-2020-10029 (bug 25487)
-- gcc PR 89877: miscompilation due to missing cc clobber in longlong.h macros
-- mips: Fix wrong INTERNAL_SYSCALL_ERROR_P check from bc2eb9321e
-- elf: Fix wrong indentation from commit eb447b7b4b
-- y2038: linux: Provide __futimesat64 implementation
-- y2038: linux: Provide __lutimes64 implementation
-- y2038: linux: Provide __futimes64 implementation
-- y2038: fix: Add missing libc_hidden_def for __futimens64
-- sparc: Move sigreturn stub to assembly
-- ldbl-128ibm: Let long double files have specific compiler flags
-- ldbl-128ibm-compat: Add tests for IBM long double functions
-- powerpc: Fix feraiseexcept and feclearexcept macros
-- arm: Fix softp-fp Implies (BZ #25635)
-- Remove reference of --without-fp on configure
-- linux/sysipc: Include linux/posix_types.h for __kernel_mode_t
-- Improve IFUNC check [BZ #25506]
-- linux: Clear mode_t padding bits (BZ#25623)
-- linux: Remove aarch64 ipc_priv.h
-- Linux: Use __fstatat64 in fchmodat implementation
-- Linux: Use AT_FDCWD in utime, utimes when calling utimensat
-- S390: Remove backchain-based fallback and use generic backtrace.c.
-- manual: Fix wrong declaration of wcschr [BZ #24654]
-- manual: Fix typo in parse_printf_format example [BZ #24638]
-
-* Thu Mar 5 2020 Florian Weimer <fweimer(a)redhat.com> - 2.31.9000-3
-- Emergency patch for broken utimes/utime functions
-
-* Tue Mar 03 2020 Patsy Franklin <patsy(a)redhat.com> - 2.31.9000-2
-- Auto-sync with upstream branch master,
- commit 78c9d0c6efabe2067ef7f93cd36325f54c60adc2.
-- Update translations
-- Convert Python scripts to Python 3
-- alpha: Do not build with -fpic
-- y2038: linux: Provide __utime64 implementation
-- y2038: linux: Provide __utimes64 implementation
-- y2038: Introduce struct __utimbuf64 - new internal glibc type
-- microblaze: vfork is always available
-- m68k: getpagesize syscall number is always available
-- Linux: epoll_pwait syscall number is always available
-- x86_64: Do not define __NR_semtimedop in <sysdep.h>
-- ia64: Do not define __NR_semtimedop in <sysdep.h>
-- Linux: open_by_handle_at syscall number is always available
-- Linux: set_robust_list syscall number is always available
-- Linux: pciconfig_iobase syscall number is always available on alpha
-- Linux: getdents64 syscall number is always available on MIPS
-- Linux: Clean up preadv2, pwritev2 system call names
-- Linux: exit_group syscall number is always available
-- Linux: set_tid_address syscall number is always available
-- Linux: pkey_mprotect syscall number is always available
-- Linux: rt_sigqueueinfo syscall number is always available
-- Linux: getrandom syscall number is always available
-- Linux: Clean up preadv, pwritev system call names
-- Linux: Clean up pread64/pwrite64 system call names
-- Linux: sigaltstack syscall number is always available
-- Linux: sched_getaffinity syscall number is always available
-- Linux: sched_setaffinity syscall number is always available
-- Linux: statx syscall number is always available
-- Linux: mq_* syscall numbers are always available
-- Linux: mlock2 syscall number is always available
-- Linux: copy_file_range syscall number is always available
-- Linux: renameat2 syscall number is always available
-- build-many-glibcs.py: Add list-compilers, list-glibcs commands
-- build-many-glibcs.py: Add --shallow option
-- Fixed typo in run_command_array() in support/shell-container.c
-- Add missing libc_hidden_def for __utimensat64
-- elf: Add elf/check-wx-segment, a test for the presence of WX segments
-- i386: Use comdat instead of .gnu.linkonce for i386 setup pic register (BZ #20543)
-- ldbl-128ibm-compat: link tst-ldbl-efgcvt against loader too
-- ldbl-128ibm-compat: enforce ibm128 on compat tests
-- ldbl-128ibm-compat: Provide nexttoward functions
-- ldbl-128ibm-compat: Provide a significand implementation
-- ldbl-128ibm-compat: Redirect complex math functions
-- ldbl-128ibm-compat: Redirect long double functions to f128/ieee128 functions
-- posix: Remove posix waitid
-- posix: Refactor tst-waitid (BZ #14666)
-- support: Add support_process_state_wait
-- malloc/tst-mallocfork2: Kill lingering process for unexpected failures
-
-* Wed Feb 26 2020 Patsy Franklin <patsy(a)redhat.com> - 2.31.9000-1
-- Auto-sync with upstream branch master,
- commit 758599bc9dcc5764e862bd9e1613c5d1e6efc5d3.
-- elf: Apply attribute_relro to pointers in elf/dl-minimal.c
-- powerpc: Refactor fenvinline.h
-- nss_nis: Use NSS_DECLARE_MODULE_FUNCTIONS
-- csu: Use ELF constructor instead of _init in libc.so
-- ldbl-128ibm: make ieee754.h work with IEEE 128 long double
-- ldbl-128ibm-compat: fixup subdir location of several funcs
-- ldbl-128ibm-compat: enforce correct abi flags on internal file
-- ldbl-128ibm-compat: Provide ieee128 symbols to narrow functions
-- Undefine redirections after long double definition on __LDBL_COMPAT [BZ #23294]
-- nios2: Fix Linux kABI for syscall return
-- Fix use-after-free in glob when expanding ~user (bug 25414)
-- nptl: Move pthread_setschedparam implementation into libc
-- nptl: Move pthread_getschedparam implementation into libc
-- Add hidden prototypes for __sched_getparam, __sched_getscheduler
-- nptl: Move pthread_cond_init implementation into libc
-- nptl: Move pthread_cond_destroy implementation into libc
-- nptl: Move pthread_condattr_init implementation into libc
-- nptl: Move pthread_condattr_destroy implementation into libc
-- nptl: Move pthread_attr_setscope implementation into libc
-- nptl: Move pthread_attr_getscope implementation into libc
-- nptl: Move pthread_attr_setschedpolicy implementation into libc
-- nptl: Move pthread_attr_getschedpolicy implementation into libc
-- nptl: Sort routines list in Makefile alphabetically
-- nptl: Use .NOTPARALLEL in Makefile only if actually running tests
-- Block all signals on timer_create thread (BZ#10815)
-- Fix tst-pkey expectations on pkey_get [BZ #23202]
-- y2038: linux: Provide __gettimeofday64 implementation
-- Linux: Work around kernel bugs in chmod on /proc/self/fd paths [BZ #14578]
-- Introduce <elf-initfini.h> and ELF_INITFINI for all architectures
-- mips: Fix bracktrace result for signal frames
-- Move implementation of <file_change_detection.h> into a C file
-- <fd_to_filename.h>: Add type safety and port to Hurd
-- Prepare redirections for IEEE long double on powerpc64le
-- conform/conformtest.py: Extend tokenizer to cover character constants
-- stdlib: Reduce namespace pollution in <inttypes.h>
-- x86: Avoid single-argument _Static_assert in <tls.h>
-- x86 tls: Use _Static_assert for TLS access size assertion
-- htl: Link internal htl tests against libpthread
-- pthread: Fix building tst-robust8 with nptl
-- pthread: Move robust mutex tests from nptl to sysdeps/pthread
-- htl: Remove stub warning for pthread_mutexattr_setpshared
-- htl: Add missing functions and defines for robust mutexes
-- htl: Only check pthread_self coherency when DEBUG is set
-- hurd: Add THREAD_GET/SETMEM/_NC
-- hurd tls: update comment about fields at the end of tcbhead
-- ld.so: Do not export free/calloc/malloc/realloc functions [BZ #25486]
-- Remove weak declaration of free from <inline-hashtab.h>
-- elf: Extract _dl_sym_post, _dl_sym_find_caller_map from elf/dl-sym.c
-- elf: Introduce the rtld-stubbed-symbols makefile variable
-- arm: fix use of INTERNAL_SYSCALL_CALL
-- linux: Remove INTERNAL_SYSCALL_DECL
-- nptl: Remove ununsed pthread-errnos.h rule
-- linux: Consolidate INLINE_SYSCALL
-- s390: Consolidate Linux syscall definition
-- riscv: Avoid clobbering register parameters in syscall
-- microblaze: Avoid clobbering register parameters in syscall
-- nios2: Use Linux kABI for syscall return
-- mips: Use Linux kABI for syscall return
-- mips64: Consolidate Linux sysdep.h
-- ia64: Use Linux kABI for syscall return
-- alpha: Refactor syscall and Use Linux kABI for syscall return
-- sparc: Avoid clobbering register parameters in syscall
-- sparc: Use Linux kABI for syscall return
-- powerpc: Use Linux kABI for syscall return
-- powerpc: Consolidate Linux syscall definition
-- i386: Enable CET support in ucontext functions
-- tst-clone3: Use __NR_futex_time64 if we don't have __NR_futex
-- powerpc64: Add memory protection key support [BZ #23202]
-- ldbl-128ibm-compat: Provide a scalb implementation
-- Add a generic scalb implementation
-- Adjust thresholds in Bessel function implementations (bug 14469).
-- resolv: Fix ABA race in /etc/resolv.conf change detection [BZ #25420]
-- resolv: Enhance __resolv_conf_load to capture file change data
-- resolv: Fix file handle leak in __resolv_conf_load [BZ #25429]
-- resolv: Use <file_change_detection.h> in __resolv_conf_get_current
-- Add STATX_ATTR_VERITY from Linux 5.5 to bits/statx-generic.h.
-- Use gcc -finput-charset=ascii for check-installed-headers.
-- math/test-sinl-pseudo: Use stack protector only if available
-- alpha: Fix static gettimeofday symbol
-- nss_nisplus: Use NSS_DECLARE_MODULE_FUNCTIONS
-- nss_dns: Use NSS_DECLARE_MODULE_FUNCTIONS
-- nss_files: Use NSS_DECLARE_MODULE_FUNCTIONS
-- nss_db: Use NSS_DECLARE_MODULE_FUNCTIONS
-- nss_compat: Use NSS_DECLARE_MODULE_FUNCTIONS
-- nss_hesiod: Use NSS_DECLARE_MODULE_FUNCTIONS
-- nss: Add function types and NSS_DECLARE_MODULE_FUNCTIONS macro to <nss.h>
-- nss_compat: Do not use nss_* names for function pointers
-- Avoid ldbl-96 stack corruption from range reduction of pseudo-zero (bug 25487).
-- mips: Fix argument passing for inlined syscalls on Linux [BZ #25523]
-- mips: Use 'long int' and 'long long int' in linux syscall code
-- alpha: Use generic gettimeofday implementation
-- sunrpc: Properly clean up if tst-udp-timeout fails
-- elf: avoid stack allocation in dl_open_worker
-- elf: avoid redundant sort in dlopen
-- elf: Allow dlopen of filter object to work [BZ #16272]
-- Update translations
-- Rename RWF_WRITE_LIFE_NOT_SET to RWH_WRITE_LIFE_NOT_SET following Linux 5.5.
-- S390: Fix non-ascii character in fenv.h.
-- io: Add io/tst-lchmod covering lchmod and fchmodat
-- Linux: Emulate fchmodat with AT_SYMLINK_NOFOLLOW using O_PATH [BZ #14578]
-- io: Implement lchmod using fchmodat [BZ #14578]
-- Add internal <file_change_detection.h> header file
-- elf.h: Add R_RISCV_IRELATIVE
-- Fix typo in the name for Wednesday in Kurdish [BZ #9809]
-- debug: Add missing locale dependencies of fortify tests
-- htl C11 threads: Avoid pthread_ symbols visibility in static library
-- hurd: Add __pthread_spin_wait and use it
-- ldbl-128ibm-compat: set PRINTF_CHK flag in {,v}sprintf_chk
-- Use --disable-gdbserver in build-many-glibcs.py.
-- Improve random memcpy benchmark
-- nptl: update default pthread-offsets.h
-- nptl: add missing pthread-offsets.h
-- htl: Avoid a local plt for pthread_self
-- pthread: Move some join tests from nptl to sysdeps/pthread
-- htl: Make joining self return EDEADLK
-- pthread: Move most barrier tests from nptl to sysdeps/pthread
-- htl: Fix barrier_wait with one thread
-- pthread: Move most sem tests from nptl to sysdeps/pthread
-- htl: Make sem_wait/sem_timedwait interruptible
-- htl: Make sem_open return ENOSYS
-- htl: Add support for semaphore maximum value
-- pthread: Move key tests from nptl to sysdeps/pthread
-- hurd: Make nanosleep a cancellation point
-- htl: Add support for libc cancellation points
-- htl: clean __pthread_get_cleanup_stack hidden proto
-- htl: XFAIL rwlock tests which need pshared support
-- pthread: Move some rwlock tests from nptl to sysdeps/pthread
-- pthread: Move most once tests from nptl to sysdeps/pthread
-- htl: support cancellation during pthread_once
-- pthread: Move most cond tests from nptl to sysdeps/pthread
-- htl: make pthread_cond_destroy return EBUSY on waiters
-- htl: Report missing mutex lock on pthread_cond_*wait
-- htl: Fix linking static testcases
-- htl: Move __register_atfork from forward to own file
-- pthread: Move some attr tests from nptl to sysdeps/pthread
-- htl: Fix default guard size
-- pthread: Move most mutex tests from nptl to sysdeps/pthread
-- pthread: Move spin tests from nptl to sysdeps/pthread
-- htl: make pthread_spin_lock really spin
-- htl: Avoid check-installed-headers looking at inlines
-- htl: Do not put spin_lock inlines in public headers
-- pthread: Move basic tests from nptl to sysdeps/pthread
-- htl: Fix calling pthread_exit in the child of a fork
-- x86: Remove <bits/select.h> and use the generic version
-- C11 threads: Move implementation to sysdeps/pthread
-- htl: Add C11 threads types definitions
-- C11 threads: make thrd_join more portable
-- C11 threads: Fix thrd_t / pthread_t compatibility assertion
-- C11 threads: do not require PTHREAD_DESTRUCTOR_ITERATIONS
-- nptl: Move nptl-specific types to separate header
-- htl: Make __PTHREAD_ONCE_INIT more flexible
-- htl: Add support for C11 threads behavior
-- htl: Add missing internal functions declarations
-- htl: Rename _pthread_mutex_init/destroy to __pthread_mutex_init/destroy
-- htl: Move internal mutex/rwlock symbols to GLIBC_PRIVATE
-- Linux: Add io/tst-o_path-locks test
-- support: Add the xlstat function
-- htl: Remove duplicate files
-- htl: Remove unused files
-- resolv: Fix CNAME chaining in resolv/tst-resolv-ai_idn-common.c
-- Remove a comment claiming that sin/cos round correctly.
-- y2038: linux: Provide __settimeofday64 implementation
-- y2038: Provide conversion helpers for struct __timeval64
-- y2038: alpha: Rename valid_timeval64_to_timeval to valid_timeval_to_timeval32
-- y2038: alpha: Rename valid_timeval_to_timeval64 to valid_timeval32_to_timeval
-- y2038: Introduce struct __timeval64 - new internal glibc type
-- y2038: Define __suseconds64_t type to be used with struct __timeval64
-- Update kernel version to 5.5 in tst-mman-consts.py.
-- Update syscall lists for Linux 5.5.
-- NEWS: Set fill-column hint to 72
-- y2038: linux: Provide __timespec_get64 implementation
-- Use binutils 2.34 branch in build-many-glibcs.py.
-- Run nptl/tst-pthread-getattr in a container
-- test-container: add exec, cwd
-- Use Linux 5.5 in build-many-glibcs.py.
-- rt: avoid PLT setup in timer_[sg]ettime
-- Update or_IN collation [BZ #22525]
-- Fix ckb_IQ [BZ #9809]
-- Add new locale: ckb_IQ (Kurdish/Sorani spoken in Iraq) [BZ #9809]
-- list-fixed-bugs.py: Wrap at 72 chars
-- y2038: linux: Provide __sched_rr_get_interval64 implementation
-- y2038: linux: Provide __timerfd_settime64 implementation
-- y2038: linux: Provide __timerfd_gettime64 implementation
-- i386: Remove _exit.S
-- i386: Use ENTRY/END in assembly codes
-- i386-mcount.S: Add _CET_ENDBR to _mcount and __fentry__
-- i386/sub_n.S: Add a missing _CET_ENDBR to indirect jump target
-- i386: Don't unnecessarily save and restore EAX, ECX and EDX [BZ# 25262]
-- x86: Don't make 2 calls to dlerror () in a row
-- Open master for 2.32 development
-
-* Mon Feb 03 2020 DJ Delorie <dj(a)redhat.com> - 2.31-1
-- Auto-sync with upstream branch release/2.31/master,
- commit 9ea3686266dca3f004ba874745a4087a89682617.
-- glibc 2.31 release
-- Generate ChangeLog.old/ChangeLog.20 for 2.31
-- Add bugs fixed in 2.31 in NEWS
-- Update newest tested versions of dependencies in install.texi
-- Add more contributors to the manual
-- Add note to NEWS about kernel headers dependency on risc-v
-- Add Portuguese (Portugal) translation
-- Add NEWS entry about 64-bit time_t syscall use on 32-bit targets
-- nptl: Avoid using PTHREAD_MUTEX_DEFAULT in macro definition [BZ #25271]
-
-* Thu Jan 30 2020 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-33
-- Auto-sync with upstream branch master,
- commit 352bb99754ae7c83ff1b974f9c52244e974c9410.
-- Build raise with -fasynchronous-unwind-tables.
-- Fix locale/tst-locale-locpath cross-testing when sshd sets LANG.
-- Fix elf/tst-rtld-preload cross-testing.
-- Fix cross-testing of tst-ifunc-fault-* tests.
-- gitlog-to-changelog: Drop scripts in favour of gnulib version
-- Add NEWS entry about the change in handling of PT_GNU_STACK on MIPS
-- Fix array overflow in backtrace on PowerPC (bug 25423)
-- getaddrinfo: Fix resource leak after strdup failure in gethosts (swbz#25425)
-
-* Tue Jan 28 2020 Fedora Release Engineering <releng(a)fedoraproject.org>
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
-
-* Mon Jan 20 2020 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-31
-- Auto-sync with upstream branch master,
- commit 92ce43eef7ac844782d50a8015d977d216fbadec.
-- Run bench-timing-type with newly built libc.
-- Get rid of Werror=maybe-uninitialized in res_send.c.
-- translations: Update translations
-- translations: Trim po files using msgattrib
-- Update translations
-- translations: Run msgmerge when downloading translations
-- Fix maybe-uninitialized error on powerpc
-- powerpc32: Fix syntax error in __GLRO macro
-- Remove incorrect alloc_size attribute from pvalloc (swbz#25401)
-
-* Fri Jan 17 2020 Florian Weimer <fweimer(a)redhat.com> - 2.30.9000-30
-- Auto-sync with upstream branch master,
- commit 70ba28f7ab2923d4e36ffc9d5d2e32357353b25c:
-- Fix tst-pkey.c pkey_alloc return checks and manual
-- powerpc: Move cache line size to rtld_global_ro
-- powerpc: Initialize rtld_global_ro for static dlopen (swbz#20802)
-- Revert outdated translations
-- vcs-to-changelog: Add quirk for __nonnull
-- elf: Add elf/tst-dlopenfail-2 (swbz#25396, #1395758)
-- Clear GL(dl_initfirst) when freeing its link_map (swbz#25396, #1395758)
-- Update Translations
-- Fix "elf: Add tst-ldconfig-ld_so_conf-update test" on 32bit.
-- elf: Add tst-ldconfig-ld_so_conf-update test
-- sl_SI locale: Use "." as the thousands separator (swbz#25233)
-
-* Mon Jan 06 2020 Arjun Shankar <arjun(a)redhat.com> - 2.30.9000-29
-- Auto-sync with upstream branch master,
- commit cbce69e70dc4b04fefcc7257e593733b8b03856c:
-- Multiple locales: Add date_fmt (bug 24054)
-- Update libc.pot for 2.31 release
-- Add libm_alias_finite for _finite symbols
-- Linux: Fix clock_nanosleep time64 check
-- linux: Fix vDSO macros build with time64 interfaces
-- x86: Make x32 use x86 time implementation
-- Remove vDSO support from make-syscall.sh
-- linux: Update x86 vDSO symbols
-- linux: Update mips vDSO symbols
-- linux: Consolidate Linux gettimeofday
-- linux: Consolidate time implementation
-- elf: Enable relro for static build
-- elf: Move vDSO setup to rtld (BZ#24967)
-- linux: Add support for clock_gettime64 vDSO
-- linux: Optimize fallback 32-bit clock_gettime
-- linux: Enable vDSO clock_gettime64 for i386
-- linux: Enable vDSO clock_gettime64 for arm
-- linux: Enable vDSO clock_gettime64 for mips
-- linux: Add support for clock_getres64 vDSO
-- linux: Optimize fallback 32-bit clock_getres
-- htl: Use dso_handle.h
-- htl: Drop common tcbhead_t definition
-- htl: Move pthread_atfork to libc_nonshared.a
-- htl: Add __errno_location and __h_errno_location
-- hurd: Fix message reception for timer_thread
-
-* Thu Jan 02 2020 Florian Weimer <fweimer(a)redhat.com> - 2.30.9000-28
-- Auto-sync with upstream branch master,
- commit cc47d5c5f53f6d845ac54698ae8929af15662c44:
-- Linux: Use built-in system call tables
-- lv_LV locale: Correct the time part of d_t_fmt (swbz#25324)
-- km_KH locale: Use "%M" instead of "m" in d_t_fmt (swbz#25323)
-- ldbl-128ibm-compat: Do not mix -mabi=*longdouble and -mlong-double-128
-- ldbl-128ibm-compat: Compiler flags for stdio functions
-- Do not redirect calls to __GI_* symbols, when redirecting to *ieee128
-- aarch64: add default memcpy version for kunpeng920
-- aarch64: ifunc rename for kunpeng
-- aarch64: Modify error-shown comments for strcpy
-- linux: Consolidate sigprocmask
-- Fix return code for __libc_signal_* functions
-- nptl: Remove duplicate internal __SIZEOF_PTHREAD_MUTEX_T (swbz#25241)
-
-* Thu Dec 26 2019 Carlos O'Donell <carlos(a)redhat.com> - 2.30.9000-27
-- Auto-sync with upstream branch master,
- commit b8c210bcc74840d24c61d39bde15bea9daf3e271.
-- mnw_MM, my_MM, and shn_MM locales: Do not use %Op
-- Avoid compat symbols for totalorder in powerpc64le IEEE long double
-- ldbl-128ibm-compat: Add *cvt functions
-- Refactor *cvt functions implementation (2/2)
-- Refactor *cvt functions implementation (1/2)
-- Add exception-based flags for wait4
-- aarch64: Optimized memset for Kunpeng processor.
-- aarch64: Optimized strlen for strlen_asimd
-- aarch64: Add Huawei Kunpeng to tunable cpu list
-- aarch64: Optimized implementation of memrchr
-- aarch64: Optimized implementation of strnlen
-- aarch64: Optimized implementation of strcpy
-- aarch64: Optimized implementation of memcmp
-- Consolidate wait3 implementations
-- Implement waitpid in terms of wait4
-- linux: Use waitid on wait4 if __NR_wait4 is not defined
-- Implement wait in terms of waitpid
-- nptl: Move waitpid implementation to libc
-- nptl: Move wait implementation to libc
-- Remove __waitpid_nocancel
-- Fix test isolation for elf/tst-ifunc-fault-lazy, elf/tst-ifunc-fault-bindnow
-- Fix __libc_signal_block_all on sparc64
-- powerpc: Do not run IFUNC resolvers for LD_DEBUG=unused [BZ #24214]
-
-* Thu Dec 19 2019 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-26
-- Auto-sync with upstream branch master,
- commit 3dcad8158f43d71d5b8f6f317f82952ddf3468f3.
-- hurd: Do not make sigprocmask available in ld.so
-- build-many-glibcs.py: Do not build C++ PCHs by default
-- hurd: Make getrandom honour GRND_NONBLOCK
-- tunables: report sbrk() failure
-- build-many-glibcs.py: Add mipsisa64r6el-linux-gnu target
-- mips: Do not include hi and lo in __SYSCALL_CLOBBERS for R6
-- ldbl-128ibm-compat: Add ISO C99 versions of scanf functions
-- ldbl-128ibm-compat: Fix selection of GNU and ISO C99 scanf
-- hurd: Fix local PLT
-- dlopen: Do not block signals
-- dlopen: Rework handling of pending NODELETE status
-- dlopen: Fix issues related to NODELETE handling and relocations
-- hurd: Fix __close_nocancel_nostatus availability
-- hurd: add getrandom and getentropy implementations
-- hurd: Implement __close_nocancel_nostatus
-- manual: clarify fopen with the x flag
-- S390: Use sysdeps/ieee754/dbl-64/wordsize-64 on s390x.
-- S390: Implement roundtoint and converttoint and define TOINT_INTRINSICS.
-- S390: Implement math-barriers math_opt_barrier and math_force_eval.
-- S390: Use libc_fe* macros in fe* functions.
-- S390: Implement libc_fe* macros.
-- S390: Use convert-to-fixed instruction for llround functions.
-- S390: Use convert-to-fixed instruction for lround functions.
-- S390: Use convert-to-fixed instruction for llrint functions.
-- S390: Use convert-to-fixed instruction for lrint functions.
-- S390: Use load-fp-integer instruction for roundeven functions.
-- Adjust s_copysignl.c regarding code style.
-- Adjust s_ceilf.c and s_ceill.c regarding code style.
-- Adjust s_floorf.c and s_floorl.c regarding code style.
-- Adjust s_rintf.c and s_rintl.c regarding code style.
-- Adjust s_nearbyintf.c and s_nearbyintl.c regarding code style.
-- Use GCC builtins for copysign functions if desired.
-- Use GCC builtins for round functions if desired.
-- Use GCC builtins for trunc functions if desired.
-- Use GCC builtins for ceil functions if desired.
-- Use GCC builtins for floor functions if desired.
-- Use GCC builtins for rint functions if desired.
-- Use GCC builtins for nearbyint functions if desired.
-- Always use wordsize-64 version of s_round.c.
-- Always use wordsize-64 version of s_trunc.c.
-- Always use wordsize-64 version of s_ceil.c.
-- Always use wordsize-64 version of s_floor.c.
-- Always use wordsize-64 version of s_rint.c.
-- Always use wordsize-64 version of s_nearbyint.c.
-- ldconfig: Do not print a warning for a missing ld.so.conf file
-- hurd: Fix using altstack while in an RPC call to be aborted
-- Fix failure when CFLAGS contains -DNDEBUG (Bug 25251)
-
-* Mon Dec 09 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-25
-- Auto-sync with upstream branch master,
- commit 0487ebed2278b20971af4cabf186fd3681adccf0.
-- nptl: Add more missing placeholder abi symbol from nanosleep move
-- sysdeps/riscv/start.S: rename .Lload_gp to load_gp (bug 24376)
-- y2038: linux: Provide __timer_settime64 implementation
-- y2038: linux: Provide __timer_gettime64 implementation
-- timer: Decouple x86_64 specific timer_settime from generic Linux implementation
-- timer: Decouple x86_64 specific timer_gettime from generic Linux implementation
-- time: Introduce glibc's internal struct __itimerspec64
-- Correct range checking in mallopt/mxfast/tcache [BZ #25194]
-- misc/test-errno-linux: Handle EINVAL from quotactl
-- <string.h>: Define __CORRECT_ISO_CPP_STRING_H_PROTO for Clang [BZ #25232]
-- build-many-glibcs.py: Move sparcv8 to extra_glibcs
-
-* Thu Dec 5 2019 Florian Weimer <fweimer(a)redhat.com> - 2.30.9000-24
-- Upstream patches for fallout from dlopen NODELETE changes (#1778344, #1778366)
-
-* Wed Dec 04 2019 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-23
-- Auto-sync with upstream branch master,
- commit ec138c67cbda8b5826a0a2a7ba456408117996dc.
-- sysdeps: Add clock_gettime64 vDSO
-- Do not use ld.so to open statically linked programs in debugglibc.sh
-- Attach to test in container from debugglibc.sh
-- Expand $(as-needed) and $(no-as-needed) throughout the build system
-- x86: Assume --enable-cet if GCC defaults to CET [BZ #25225]
-- ldbl-128ibm-compat: Add tests for strfroml, strtold, and wcstold
-- ldbl-128ibm-compat: Add tests for strfmon and strfmon_l
-- ldbl-128ibm-compat: Add strfmon_l with IEEE long double format
-- ldbl-128ibm-compat: Replace http with https in new files
-- elf: Do not run IFUNC resolvers for LD_DEBUG=unused [BZ #24214]
-- elf/tst-dlopenfail: Disable --no-as-needed for tst-dlopenfailmod1.so
-- hurd: Fix ld.so __access override from libc
-- hurd: Fix ld.so __getcwd override from libc
-- hurd: Make __sigprocmask GLIBC_PRIVATE
-- hurd: Fix renameat2 error
-- hurd: make strerror(0) coherent with other ports
-- hurd: Fix ld.so link
-- Update kernel version to 5.4 in tst-mman-consts.py.
-- Update SOMAXCONN value from Linux 5.4.
-- Update syscall-names.list for Linux 5.4.
-- Fix syntax error in build-many-glibcs.py.
-- Define MADV_COLD and MADV_PAGEOUT from Linux 5.4.
-
-* Mon Dec 2 2019 Florian Weimer <fweimer(a)redhat.com> - 2.30.9000-22
-- dlopen: Remove incorrect assert in activate_nodelete (#1778344)
-
-* Thu Nov 28 2019 Florian Weimer <fweimer(a)redhat.com> - 2.30.9000-21
-- Auto-sync with upstream branch master,
- commit e37c2cf299b61ce18f62852f6c5624c27829b610:
-- Move _dl_open_check to its original place in dl_open_worker
-- Block signals during the initial part of dlopen
-- Remove all loaded objects if dlopen fails, ignoring NODELETE (#1395758)
-- Avoid late dlopen failure due to scope, TLS slotinfo updates (swbz#25112)
-- Avoid late failure in dlopen in global scope update (swbz#25112)
-- Lazy binding failures during dlopen/dlclose must be fatal (swbz#24304)
-- resolv: Implement trust-ad option for /etc/resolv.conf (#1164339)
-- dlsym: Do not determine caller link map if not needed
-- libio: Disable vtable validation for pre-2.1 interposed handles (swbz#25203)
-- ldbl-128ibm-compat: Add syslog functions
-- ldbl-128ibm-compat: Add obstack printing functions
-- ldbl-128ibm-compat: Reuse tests for err.h and error.h functions
-- ldbl-128ibm-compat: Add error.h functions
-- ldbl-128ibm-compat: Add err.h functions
-- ldbl-128ibm-compat: Add argp_error and argp_failure
-- sparc: Use atomic compiler builtins on sparc
-- Remove 32 bit sparc v7 support
-
-* Wed Nov 27 2019 Arjun Shankar <arjun(a)redhat.com> - 2.30.9000-20
-- Auto-sync with upstream branch master,
- commit bfdb731438206b0f70fe7afa890681155c30b419:
-- rtld: Check __libc_enable_secure for LD_PREFER_MAP_32BIT_EXEC (CVE-2019-19126)
-- Introduce DL_LOOKUP_FOR_RELOCATE flag for _dl_lookup_symbol_x
-- Enable inlining issignalingf within glibc
-- Don't use a custom wrapper macro around __has_include (bug 25189).
-- Remove duplicate inline implementation of issignalingf
-- misc: Set generic pselect as ENOSYS
-- Use DEPRECATED_SCANF macro for remaining C99-compliant scanf functions
-- ldbl-128ibm-compat: Add regular/wide character printing printing functions
-- ldbl-128ibm-compat: Test double values and positional arguments
-- ldbl-128ibm-compat: Add regular/wide character scanning functions
-- arm: Fix armv7 selection after 'Split BE/LE abilist'
-- Use Linux 5.4 in build-many-glibcs.py.
-- sysdeps/posix: Simplify if expression in getaddrinfo
-- sysdeps/posix/getaddrinfo: Return early on invalid address family
-- ru_UA locale: use copy "ru_RU" in LC_TIME (bug 25044)
-- locale: Greek -> ASCII transliteration table [BZ #12031]
-- nptl: Cleanup mutex internal offset tests
-- nptl: Add tests for internal pthread_rwlock_t offsets
-- nptl: Remove rwlock elision definitions
-- nptl: Add struct_mutex.h and struct_rwlock.h
-- nptl: Add default pthreadtypes-arch.h and pthread-offsets.h
-- Compile elf/rtld.c with -fno-tree-loop-distribute-patterns.
-- nptl: Fix __PTHREAD_MUTEX_INITIALIZER for !__PTHREAD_MUTEX_HAVE_PREV
-- S390: Fix handling of needles crossing a page in strstr z15 ifunc [BZ #25226]
-
-* Mon Nov 18 2019 Patsy Griffin <patsy(a)redhat.com> - 2.30.9000-19
-- Auto-sync with upstream branch master,
- commit 2a764c6ee848dfe92cb2921ed3b14085f15d9e79.
-- Enhance _dl_catch_exception to allow disabling exception handling
-- hurd: Suppress GCC 10 -Warray-bounds warning in init-first.c [BZ #25097]
-- linux: Add comment on affinity set sizes to tst-skeleton-affinity.c
-- Avoid zero-length array at the end of struct link_map [BZ #25097]
-- Introduce link_map_audit_state accessor function
-- Properly initialize audit cookie for the dynamic loader [BZ #25157]
-- nios2: Work around backend bug triggered by csu/libc-tls.c (GCC PR 92499)
-- Redefine _IO_iconv_t to store a single gconv step pointer [BZ #25097]
-- Add new script for plotting string benchmark JSON output
-- support: Fix support_set_small_thread_stack_size to build on Hurd
-- login: Use pread64 in utmp implementation
-- Clarify purpose of assert in _dl_lookup_symbol_x
-- aarch64: Increase small and medium cases for __memcpy_generic
-- login: Introduce matches_last_entry to utmp processing
-
-* Tue Nov 12 2019 Arjun Shankar <arjun(a)redhat.com> - 2.30.9000-18
-- Auto-sync with upstream branch master,
- commit cba932a5a9e91cffd7f4172d7e91f9b2efb1f84b:
-- nptl: Move nanosleep implementation to libc
-- Refactor nanosleep in terms of clock_nanosleep
-- nptl: Refactor thrd_sleep in terms of clock_nanosleep
-- math: enhance the endloop condition of function handle_input_flag
-- hurd: Remove lingering references to the time function
-- hurd: Use __clock_gettime in _hurd_select
-- login: Remove double-assignment of fl.l_whence in try_file_lock
-- nptl: Add missing placeholder abi symbol from nanosleep move
-- login: Acquire write lock early in pututline [BZ #24882]
-- Remove hppa pthreadP.h
-- sysdeps/clock_nanosleep: Use clock_nanosleep_time64 if avaliable
-- Fix array bounds violation in regex matcher (bug 25149)
-- support: Add support_set_small_thread_stack_size
-- linux: Reduce stack size for nptl/tst-thread-affinity-pthread
-- y2038: linux: Provide __ppoll64 implementation
-- Declare asctime_r, ctime_r, gmtime_r, localtime_r for C2X.
-- support: Add xsetlocale function
-- libio/tst-fopenloc: Use xsetlocale, xfopen, and xfclose
-- Fix clock_nanosleep when interrupted by a signal
-- slotinfo in struct dtv_slotinfo_list should be flexible array [BZ #25097]
-
-* Wed Nov 06 2019 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-17
-- Auto-sync with upstream branch master,
- commit 2a0356e1191804d57005e1cfe2a72f019b7a8cce.
-- posix: Sync regex with gnulib
-- Add mnw language code [BZ #25139]
-- Add new locale: mnw_MM (Mon language spoken in Myanmar) [BZ #25139]
-- S390: Fp comparison are now raising FE_INVALID with gcc 10.
-- linux: pselect: Remove CALL_PSELECT6 macro
-- Fix run-one-test so that it runs elf tests
-- nptl: Fix niggles with pthread_clockjoin_np
-- hppa: Align __clone stack argument to 8 bytes (Bug 25066)
-- y2038: linux: Provide __futimens64 implementation
-- y2038: linux: Provide __utimensat64 implementation
-- nptl: Add pthread_timedjoin_np, pthread_clockjoin_np NULL timeout test
-- nptl: Add pthread_clockjoin_np
-- manual: Add documentation for pthread_tryjoin_np and pthread_timedjoin_np
-- nptl: Convert tst-join3 to use libsupport
-- Sync time/mktime.c with gnulib
-- Sync timespec-{add,sub} with gnulib
-- Sync intprops.h with gnulib
-- Refactor adjtimex based on clock_adjtime
-- Refactor PI mutexes internal definitions
-- Remove pause and nanosleep not cancel wrappers
-- nptl: Replace non cancellable pause/nanosleep with futex
-- Consolidate lowlevellock-futex.h
-- Consolidate futex-internal.h
-- Base max_fast on alignment, not width, of bins (Bug 24903)
-- Revise the documentation of simple calendar time.
-- Make second argument of gettimeofday as 'void *'
-- Use clock_gettime to implement gettimeofday.
-- Use clock_gettime to implement timespec_get.
-- Consolidate and deprecate ftime
-- Change most internal uses of time to __clock_gettime.
-- Use clock_gettime to implement time.
-- Use clock_settime to implement settimeofday.
-- Use clock_settime to implement stime; withdraw stime.
-- Change most internal uses of __gettimeofday to __clock_gettime.
-- Linux/Alpha: don't use timeval32 system calls.
-- resolv/tst-idna_name_classify: Isolate from system libraries
-- hurd: Support for file record locking
-- Comment out initgroups from example nsswitch.conf (Bug 25146)
-
-* Mon Oct 28 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-16
-- Auto-sync with upstream branch master,
- commit 177a3d48a1c74d7b2cd6bfd48901519d25a5ecad.
-- y2038: linux: Provide __clock_getres64 implementation
-- time: Introduce function to check correctness of nanoseconds value
-- Add Transliterations for Unicode Misc. Mathematical Symbols-A/B [BZ #23132]
-- Install charmaps uncompressed in testroot
-- Add wait-for-debugger test harness hooks
-- Define __STATFS_MATCHES_STATFS64
-- hurd: Fix build after __pread64 usage in the dynamic loader
-- sysdeps/stat: Handle 64-bit ino_t types on 32-bit hosts
-- S390: Remove not needed stack frame in syscall function.
-
-* Fri Oct 25 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-15
-- Add *.mo files to all-langpacks (#1624528)
-
-* Thu Oct 24 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-14
-- Add Requires on basesystem for main package (#1757267)
-- Add Requires on coreutils for glibc-headers (uses rm)
-
-* Wed Oct 23 2019 Arjun Shankar <arjun(a)redhat.com> - 2.30.9000-13
-- Auto-sync with upstream branch master,
- commit 7db1fe38de21831d53ceab9ae83493d8d1aec601:
-- Include <kernel-features.h> explicitly in Linux clock_settime.c
-- Remove math-finite.h
-- Remove finite-math tests
-- Remove x64 _finite tests and references
-- Fix testroot.pristine creation copying dynamic linker
-
-* Fri Oct 18 2019 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-12
-- Auto-sync with upstream branch master,
- commit ef21bd2d8c6805c0c186a01f7c5039189f51b8c4.
-- loadarchive: guard against locale-archive corruption (Bug #25115)
-- Undo accidental commit to ChangeLog.19.
-- nptl: Document AS-safe functions in cancellation.c.
-- elf: Use nocancel pread64() instead of lseek()+read()
-- Add nocancel version of pread64()
-- Add run-one-test convenience target and makefile help text
-- Update sysvipc kernel-features.h files for Linux 5.1
-- S390: Add new s390 platform z15.
-- nptl: SIGCANCEL, SIGTIMER, SIGSETXID are always defined
-- nptl/tst-cancel25 needs to be an internal test
-- Remove libc_hidden_def from __semtimedop stub
-- sysvipc: Implement semop based on semtimedop
-- ipc: Refactor sysvipc internal definitions
-- Rename and split elf/tst-dlopen-aout collection of tests
-- dlfcn: Remove remnants of caller sensitivity from dlinfo
-- ldconfig: handle .dynstr located in separate segment (bug 25087)
-- ldd: Print "not a dynamic executable" on standard error [BZ #24150]
-- Add PTRACE_GET_SYSCALL_INFO from Linux 5.3 to sys/ptrace.h.
-- Move ChangeLog to ChangeLog.old/ChangeLog.19
-- manual: Remove warning in the documentation of the abort function
-- sysvipc: Set ipc_perm mode as mode_t (BZ#18231)
-- Simplify note processing
-- syscall-names.list: fix typos in comment
-- y2038: linux: Provide __clock_settime64 implementation
-- posix: Use posix_spawn for wordexp
-- mips: Do not malloc on getdents64 fallback
-- sparc: Assume GOTDATA support in the toolchain
-- <dirent.h>: Remove wrong comment about getdents64 declaration
-- ChangeLog: Remove leading spaces before tabs and trailing whitespace
-- Make tst-strftime2 and tst-strftime3 depend on locale generation
-- posix/tst-wordexp-nocmd: Fix diagnostics output in test
-- wordexp: Split out command execution tests from posix/wordexp-test
-
-* Tue Oct 08 2019 Arjun Shankar <arjun(a)redhat.com> - 2.30.9000-11
-- Adjust glibc-rh741105.patch.
-- Auto-sync with upstream branch master,
- commit ca602c1536ce2777f95c07525f3c42d78812e665:
-- Add TCP_TX_DELAY from Linux 5.3 to netinet/tcp.h
-- [powerpc] fenv_private.h clean up
-- [powerpc] libc_feupdateenv_test: optimize FPSCR access
-- [powerpc] __fesetround_inline optimizations
-- [powerpc] Rename fegetenv_status to fegetenv_control
-- [powerpc] libc_feholdsetround_noex_ppc_ctx: optimize FPSCR write
-- [powerpc] Rename fesetenv_mode to fesetenv_control
-- Add helper script for glibc debugging
-- Update bits/mman.h constants and tst-mman-consts.py for Linux 5.3.
-- y2038: Provide conversion helpers for struct __timespec64
-- Use binutils 2.33 branch in build-many-glibcs.py.
-- Sync "language", "lang_name", "territory", "country_name" with CLDR/langtable
-- Split up endian.h to minimize exposure of BYTE_ORDER.
-- time: Add padding for the timespec if required
-- Enable passing arguments to the inferior in debugglibc.sh
-- [powerpc] No need to enter "Ignore Exceptions Mode"
-- Y2038: Include proper header to provide support for struct timeval on HURD
-- Disable warnings in string/tester.c at top level.
-- string/endian.h: Restore the __USE_MISC conditionals
-- Disable -Wmaybe-uninitialized for total_deadline in sunrpc/clnt_udp.c.
-- ChangeLog update from my last commit
-- nptl: Move pthread_attr_setinheritsched implementation into libc.
-- elf: Never use the file ID of the main executable [BZ #24900]
-- elf: Assign TLS modid later during dlopen [BZ #24930]
-- nptl: Move pthread_attr_getschedparam implementation into libc
-- riscv: Remove support for variable page sizes
-- nptl: Move pthread_attr_setschedparam implementation into libc
-
-* Fri Sep 27 2019 Zbigniew Jędrzejewski-Szmek <zbyszek(a)in.waw.pl> - 2.30.9000-10
-- Use full locale names in langpack descriptions (#1651375)
-
-* Thu Sep 26 2019 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-9
-- Auto-sync with upstream branch master,
- commit 464cd3a9d5f505d92bae9a941bb75b0d91ac14ee.
-- y2038: Introduce struct __timespec64 - new internal glibc type
-- auto-changelog: Remove latin1 from codecs
-- Set the expects flags to clock_nanosleep
-- Fix tst-sigcontext-get_pc rule name from a43565ac447b1
-- inet/net-internal.h: Fix uninitalised clntudp_call() variable
-- Fix vDSO initialization on arm and mips
-- Script to generate ChangeLog-like output from git log
-- [powerpc] SET_RESTORE_ROUND optimizations and bug fix
-- Fix building support_ptrace.c on i686-gnu.
-- S390: Use _HP_TIMING_S390_H instead of _HP_TIMING_H.
-- Update syscall-names.list for Linux 5.3.
-- Use Linux 5.3 in build-many-glibcs.py.
-- S390: Add support for HP_TIMING_NOW.
-- Fix RISC-V vfork build with Linux 5.3 kernel headers.
-- Add UNSUPPORTED check in elf/tst-pldd.
-- sparc64: Use linux generic time implementation
-- mips: Consolidate INTERNAL_VSYSCALL_CALL
-- powerpc: Simplify vsyscall internal macros
-- Refactor vDSO initialization code
-- Remove PREPARE_VERSION and PREPARE_VERSION_KNOW
-- Fix small error in HP_TIMING_PRINT trailing null char setting
-
-* Mon Sep 16 2019 Parag Nemade <pnemade AT redhat DOT com> - 2.30.9000-8
-- Change Supplements "langpacks-" to "langpacks-core-" (#1729992)
-
-* Mon Sep 16 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-7
-- Auto-sync with upstream branch master,
- commit 1a6566094d3097f4a3037ab5555cddc6cb11c3a3.
-- alpha: force old OSF1 syscalls for getegid, geteuid and getppid [BZ #24986]
-- Fix http: URL in 'configure'
-- Regenerate charmap-kw.h, locfile-kw.h
-- Fix three GNU license URLs, along with trailing-newline issues.
-- Prefer https to http for gnu.org and fsf.org URLs
-
-* Fri Sep 06 2019 Patsy Franklin <patsy(a)redhat.com> - 2.30.9000-6
-- Auto-sync with upstream branch master,
- commit 1b7f04070bd94f259e2ed24d6fb76309d64fb164.
-- locale: Avoid zero-length array in _nl_category_names [BZ #24962]
-- math: Replace const attribute with pure in totalorder* functions
-- y2038: Introduce the __ASSUME_TIME64_SYSCALLS define
-- Finish move of clock_* functions to libc. [BZ #24959]
-- Update Alpha libm-test-ulps
-- localedef: Use initializer for flexible array member [BZ #24950]
-- Add misc/tst-mntent-autofs, testing autofs "ignore" filtering
-- Use autofs "ignore" mount hint in getmntent_r/getmntent
-- hurd: Fix build
-- Use generic memset/memcpy/memmove in benchtests
-- nptl: Move pthread_attr_getinheritsched implementation into libc
-- hurd: Fix SS_ONSTACK support
-- hurd: Remove optimizing anonymous maps as __vm_allocate.
-- hurd: Fix poll and select POSIX compliancy details about errors
-- hurd: Fix timeout handling in _hurd_select
-- hurd getcwd: Allow unknown root directory
-- hurd: Fix implementation of setitimer.
-- hurd: Fix _hurd_select for single fd sets
-- MIPS support for GNU hash
-- sh: Split BE/LE abilist
-- microblaze: Split BE/LE abilist
-- arm: Split BE/LE abilist
-- Correct the spelling of more contributors
-- Fix posix/tst-regex by using UTF-8 and own test input
-- [powerpc] fegetenv_status: simplify instruction generation
-- [powerpc] fesetenv: optimize FPSCR access
-- [powerpc] SET_RESTORE_ROUND improvements
-- [powerpc] fe{en,dis}ableexcept, fesetmode: optimize FPSCR accesses
-- [powerpc] fe{en,dis}ableexcept optimize bit translations
-- misc: Use allocate_once in getmntent
-- nptl: Move pthread_attr_setdetachstate implementation into libc
-- login: pututxline could fail to overwrite existing entries [BZ #24902]
-- Fix posix/tst-regex by using a dedicated input-file.
-
-* Tue Aug 27 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-5
-- Move makedb from glibc-common to nss_db (#1704334)
-
-* Mon Aug 26 2019 DJ Delorie <dj(a)redhat.com> - 2.30.9000-4
-- Auto-sync with upstream branch master,
- commit 1bced8cadc82077f0201801239e89eb24b68e9aa.
-- Don't put non-ASCII into installed headers
-- Fix spellings of contributor names in comments and doc
-- [MIPS] Raise highest supported EI_ABIVERSION value [SWBZ #24916]
-- mips: Force RWX stack for hard-float builds that can run on pre-4.8 kernels
-- linux: Make profil_counter a compat_symbol (SWBZ#17726)
-- Refactor sigcontextinfo.h
-- Add RTLD_SINGLE_THREAD_P on generic single-thread.h
-- Chinese locales: Set first_weekday to 2 (swbug 24682).
-- powerpc: Fix typos and field name in comments
-- Mark IDN tests unsupported with libidn2 before 2.0.5.
-- Document strftime %Ob and %OB as C2X features.
-- Remove dead regex code
-- Fix bad pointer / leak in regex code
-- Don't use the argument to time.
-- Add tgmath.h macros for narrowing functions.
-- Update i386 libm-test-ulps
-
-* Mon Aug 19 2019 Carlos O'Donell <carlos(a)redhat.com> - 2.30.9000-3
-- Drop glibc-fedora-nscd-warnings.patch; applied upstream.
-- Drop Source7: nsswitch.conf; applying patch to upstream.
-- Add glibc-fedora-nsswitch.patch for Fedora customizations.
-- Auto-sync with upstream branch master,
- commit d34d4c80226b3f5a1b51a8e5b005a52fba07d7ba:
-- Do not print backtraces on fatal glibc errors.
-- elf: Self-dlopen failure with explict loader invocation (swbz#24900)
-- login: Add nonstring attributes to struct utmp, struct utmpx (swbz#24899)
-- login: Use struct flock64 in utmp (swbz#24880)
-- login: Disarm timer after utmp lock acquisition (swbz#24879)
-
-* Fri Aug 16 2019 Carlos O'Donell <carlos(a)redhat.com> - 2.30.9000-2
-- Fix C.UTF-8 to use full code ranges.
-
-* Thu Aug 15 2019 Florian Weimer <fweimer(a)redhat.com> - 2.30.9000-1
-- Auto-sync with upstream branch master,
- commit 341da5b4b6253de9a7581a066f33f89cacb44dec.
-
-* Fri Aug 02 2019 Florian Weimer <fweimer(a)redhat.com> - 2.30-1
-- Drop glibc-rh1734680.patch, applied upstream.
-- Auto-sync with upstream branch release/2.30/master,
- commit be9a328c93834648e0bec106a1f86357d1a8c7e1:
-- malloc: Remove unwanted leading whitespace in malloc_info (swbz#24867)
-- glibc 2.30 release
-- iconv: Revert steps array reference counting changes (#1734680)
-- Restore r31 setting in powerpc32 swapcontext
-
-* Wed Jul 31 2019 Florian Weimer <fweimer(a)redhat.com> - 2.29.9000-37
-- Fix memory leak in iconv_open (#1734680)
-
-* Tue Jul 30 2019 Florian Weimer <fweimer(a)redhat.com> - 2.29.9000-36
-- Drop glibc-rh1732406.patch, fix for the regression applied upstream.
-- Auto-sync with upstream branch master,
- commit 8a814e20d443adc460a1030fa1a66aa9ae817483:
-- nptl: Use uintptr_t for address diagnostic in nptl/tst-pthread-getattr
-- Linux: Move getdents64 to <dirent.h>
-- test-container: Install with $(sorted-subdirs) (swbz#24794)
-- gconv: Check reference count in __gconv_release_cache (#1732406)
-- x86-64: Compile branred.c with -mprefer-vector-width=128 (swbz#24603)
-- build-many-glibcs.py: Use Linux 5.2 by default
-- Linux: Use in-tree copy of SO_ constants for !__USE_MISC (swbz#24532)
-- test-container: Avoid copying unintended system libraries
-
-* Thu Jul 25 2019 Fedora Release Engineering <releng(a)fedoraproject.org>
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
-
-* Tue Jul 23 2019 Florian Weimer <fweimer(a)redhat.com> - 2.29.9000-34
-- Revert libio change that causes crashes (#1732406)
-
-* Mon Jul 22 2019 DJ Delorie <dj(a)redhat.com> - 2.29.9000-33
-- Auto-sync with upstream branch master,
- commit dcf36bcad3f283f77893d3b157ef7bb2c99419f2.
-- Add NEWS entry about the new AArch64 IFUNC resolver call ABI
-- locale/C-translit.h.in: Cyrillic -> ASCII transliteration [BZ #2872]
-- Linux: Update syscall-names.list to Linux 5.2
-
-* Thu Jul 18 2019 DJ Delorie <dj(a)redhat.com> - 2.29.9000-32
-- Auto-sync with upstream branch master,
- commit 3556658c5b8765480711b265abc901c67d5fc060.
-- Regenerate po/libc.pot for 2.30 release.
-- nptl: Add POSIX-proposed _clock functions to hppa pthread.h
-- nptl: Remove unnecessary forwarding of pthread_cond_clockwait from libc
-- Afar locales: Months and days updated from CLDR (bug 21897).
-- nl_BE locale: Use "copy "nl_NL"" in LC_NAME (bug 23996).
-- nl_BE and nl_NL locales: Dutch salutations (bug 23996).
-- ga_IE and en_IE locales: Revert first_weekday removal (bug 24200).
-- nptl: Remove futex_supports_exact_relative_timeouts
-- Update NEWS for new _clockwait and _clocklock functions
-- nptl: Add POSIX-proposed pthread_mutex_clocklock
-- nptl: Rename lll_timedlock to lll_clocklock and add clockid parameter
-- nptl: Add POSIX-proposed pthread_rwlock_clockrdlock & pthread_rwlock_clockwrlock
-- nptl: pthread_rwlock: Move timeout validation into _full functions
-- nptl: Add POSIX-proposed pthread_cond_clockwait
-- nptl: Add POSIX-proposed sem_clockwait
-- nptl: Add clockid parameter to futex timed wait calls
-- posix: Fix large mmap64 offset for mips64n32 (BZ#24699)
-- nss_db: fix endent wrt NULL mappings [BZ #24695] [BZ #24696]
-
-* Wed Jul 10 2019 Carlos O'Donell <carlos(a)redhat.com> - 2.29.9000-31
-- Auto-sync with upstream branch master,
- commit 30ba0375464f34e4bf8129f3d3dc14d0c09add17.
-- Don't declare __malloc_check_init in <malloc.h> (bug 23352)
-- nftw: fill in stat buf for dangling links [BZ #23501]
-- dl-vdso: Add LINUX_4 HASH CODE to support nds32 vdso mechanism
-- riscv: restore ABI compatibility (bug 24484)
-- aarch64: new ifunc resolver ABI
-- nptl: Remove vfork IFUNC-based forwarder from libpthread [BZ #20188]
-- malloc: Add nptl, htl dependency for the subdirectory [BZ #24757]
-- Call _dl_open_check after relocation [BZ #24259]
-- Linux: Use mmap instead of malloc in dirent/tst-getdents64
-- ld.so: Support moving versioned symbols between sonames [BZ #24741]
-- io: Remove copy_file_range emulation [BZ #24744]
-- Linux: Adjust gedents64 buffer size to int range [BZ #24740]
-- powerpc: Use generic e_expf
-- Linux: Add nds32 specific syscalls to syscall-names.list
-- szl_PL locale: Fix a typo in the previous commit (bug 24652).
commit d17b6c268595bc32c15fed932fc5c00e99f5867f
Author: Florian Weimer <fweimer(a)redhat.com>
Date: Fri May 7 12:08:24 2021 +0200
Downstream-only patches for CPU detection on ppc64le, s390x
This patches are deliberately not in rawhide because either
they get accepted for glibc 2.34 and we keep them, or upstream
does not take them, and we'll drop them from Fedora (and downstream)
again.
diff --git a/glibc-cpu-check-1.patch b/glibc-cpu-check-1.patch
new file mode 100644
index 0000000..808c396
--- /dev/null
+++ b/glibc-cpu-check-1.patch
@@ -0,0 +1,64 @@
+Downstream-only patch to enhance CPU detection. Review thread:
+
+ <https://sourceware.org/pipermail/libc-alpha/2021-May/125916.html>
+
+Author: Florian Weimer <fweimer(a)redhat.com>
+Date: Thu May 6 11:54:52 2021 +0200
+
+ elf: Add hook for checking HWCAP bits after auxiliary vector parsing
+
+diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c
+index 0658c17da632efa5..657d74597e64045f 100644
+--- a/elf/dl-sysdep.c
++++ b/elf/dl-sysdep.c
+@@ -46,6 +46,7 @@
+
+ #include <dl-tunables.h>
+ #include <dl-auxv.h>
++#include <dl-hwcap-check.h>
+
+ extern char **_environ attribute_hidden;
+ extern char _end[] attribute_hidden;
+@@ -182,6 +183,8 @@ _dl_sysdep_start (void **start_argptr,
+ DL_PLATFORM_AUXV
+ }
+
++ dl_hwcap_check ();
++
+ #ifndef HAVE_AUX_SECURE
+ if (seen != -1)
+ {
+diff --git a/sysdeps/generic/dl-hwcap-check.h b/sysdeps/generic/dl-hwcap-check.h
+new file mode 100644
+index 0000000000000000..8db7a86256c9c724
+--- /dev/null
++++ b/sysdeps/generic/dl-hwcap-check.h
+@@ -0,0 +1,28 @@
++/* Check for hardware capabilities after HWCAP parsing. Generic version.
++ Copyright (C) 2021 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <https://www.gnu.org/licenses/>. */
++
++#ifndef _DL_HWCAP_CHECK_H
++#define _DL_HWCAP_CHECK_H
++
++static inline void
++dl_hwcap_check (void)
++{
++ /* The generic implementation does not perform any checks. */
++}
++
++#endif /* _DL_HWCAP_CHECK_H */
diff --git a/glibc-cpu-check-2.patch b/glibc-cpu-check-2.patch
new file mode 100644
index 0000000..346f414
--- /dev/null
+++ b/glibc-cpu-check-2.patch
@@ -0,0 +1,73 @@
+Downstream-only patch to enhance CPU detection. Review thread:
+
+ <https://sourceware.org/pipermail/libc-alpha/2021-May/125916.html>
+
+Author: Florian Weimer <fweimer(a)redhat.com>
+Date: Thu May 6 11:55:09 2021 +0200
+
+ powerpc64le: Check HWCAP bits against compiler build flags
+
+ When built with GCC 11.1 and -mcpu=power9, ld.so prints this error
+ message when running on POWER8:
+
+ Fatal glibc error: CPU lacks ISA 3.00 support (POWER9 or later required)
+
+ This approach does not work for the POWER10 because the bootstrap
+ relocation already uses PCREL instructions, so the detection code does
+ not actually run.
+
+diff --git a/sysdeps/powerpc/powerpc64/le/dl-hwcap-check.h b/sysdeps/powerpc/powerpc64/le/dl-hwcap-check.h
+new file mode 100644
+index 0000000000000000..6c7949c6d27ab0b4
+--- /dev/null
++++ b/sysdeps/powerpc/powerpc64/le/dl-hwcap-check.h
+@@ -0,0 +1,49 @@
++/* Check for hardware capabilities after HWCAP parsing. powerpc64le version.
++ Copyright (C) 2021 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <https://www.gnu.org/licenses/>. */
++
++#ifndef _DL_HWCAP_CHECK_H
++#define _DL_HWCAP_CHECK_H
++
++#include <ldsodefs.h>
++
++static inline void
++dl_hwcap_check (void)
++{
++#ifdef _ARCH_PWR9
++ if ((GLRO (dl_hwcap2) & PPC_FEATURE2_ARCH_3_00) == 0)
++ _dl_fatal_printf ("\
++Fatal glibc error: CPU lacks ISA 3.00 support (POWER9 or later required)\n");
++#endif
++#ifdef __FLOAT128_HARDWARE__
++ if ((GLRO (dl_hwcap2) & PPC_FEATURE2_HAS_IEEE128) == 0)
++ _dl_fatal_printf ("\
++Fatal glibc error: CPU lacks float128 support (POWER 9 or later required)\n");
++#endif
++#if defined _ARCH_PWR10 || defined __PCREL__
++ if ((GLRO (dl_hwcap2) & PPC_FEATURE2_ARCH_3_1) == 0)
++ _dl_fatal_printf ("\
++Fatal glibc error: CPU lacks ISA 3.10 support (POWER10 or later required)\n");
++#endif
++#ifdef __MMA__
++ if ((GLRO (dl_hwcap2) & PPC_FEATURE2_MMA) == 0)
++ _dl_fatal_printf ("\
++Fatal glibc error: CPU lacks MMA support (POWER10 or later required)\n");
++#endif
++}
++
++#endif /* _DL_HWCAP_CHECK_H */
diff --git a/glibc-cpu-check-3.patch b/glibc-cpu-check-3.patch
new file mode 100644
index 0000000..9e0bc88
--- /dev/null
+++ b/glibc-cpu-check-3.patch
@@ -0,0 +1,62 @@
+Downstream-only patch to enhance CPU detection. Review thread:
+
+ <https://sourceware.org/pipermail/libc-alpha/2021-May/125916.html>
+
+Author: Florian Weimer <fweimer(a)redhat.com>
+Date: Thu May 6 11:58:02 2021 +0200
+
+ s390x: Check HWCAP bits against compiler flags
+
+ When compiled with GCC 11.1 and -march=z14 -O3 build flags, running
+ ld.so (or any dynamically linked program) prints:
+
+ Fatal glibc error: CPU lacks VXE support (z14 or later required)
+
+ Co-Authored-By: Stefan Liebler <stli(a)linux.ibm.com>
+
+diff --git a/sysdeps/s390/s390-64/dl-hwcap-check.h b/sysdeps/s390/s390-64/dl-hwcap-check.h
+new file mode 100644
+index 0000000000000000..87e18be6bd0c512b
+--- /dev/null
++++ b/sysdeps/s390/s390-64/dl-hwcap-check.h
+@@ -0,0 +1,40 @@
++/* Check for hardware capabilities after HWCAP parsing. S390 version.
++ Copyright (C) 2021 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <https://www.gnu.org/licenses/>. */
++
++#ifndef _DL_HWCAP_CHECK_H
++#define _DL_HWCAP_CHECK_H
++
++#include <ldsodefs.h>
++
++static inline void
++dl_hwcap_check (void)
++{
++#if defined __ARCH__
++# if __ARCH__ >= 13
++ if (!(GLRO(dl_hwcap) & HWCAP_S390_VXRS_EXT2))
++ _dl_fatal_printf ("\
++Fatal glibc error: CPU lacks VXRS_EXT2 support (z15 or later required)\n");
++# elif __ARCH__ >= 12
++ if (!(GLRO(dl_hwcap) & HWCAP_S390_VXE))
++ _dl_fatal_printf ("\
++Fatal glibc error: CPU lacks VXE support (z14 or later required)\n");
++# endif
++#endif /* __ARCH__ */
++}
++
++#endif /* _DL_HWCAP_CHECK_H */
diff --git a/glibc.spec b/glibc.spec
index 583112d..ba0c17e 100644
--- a/glibc.spec
+++ b/glibc.spec
@@ -83,7 +83,7 @@
Summary: The GNU libc libraries
Name: glibc
Version: %{glibcversion}
-Release: 9%{?dist}
+Release: 10%{?dist}
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
# libraries.
@@ -197,6 +197,9 @@ Patch68: glibc-upstream-2.33-37.patch
Patch69: glibc-upstream-2.33-38.patch
Patch70: glibc-upstream-2.33-39.patch
Patch71: glibc-upstream-2.33-40.patch
+Patch72: glibc-cpu-check-1.patch
+Patch73: glibc-cpu-check-2.patch
+Patch74: glibc-cpu-check-3.patch
##############################################################################
# Continued list of core "glibc" package information:
@@ -2138,6 +2141,9 @@ fi
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
%changelog
+* Fri May 7 2021 Florian Weimer <fweimer(a)redhat.com> - 2.33-10
+- Downstream-only patches for CPU detection on ppc64le, s390x
+
* Fri May 7 2021 Florian Weimer <fweimer(a)redhat.com> - 2.33-9
- Remove spec file support for power9 multilib (not used on Fedora)
commit dcd1e471eb4807408c1a722324ca9c680065058a
Author: Florian Weimer <fweimer(a)redhat.com>
Date: Tue May 4 08:44:29 2021 +0200
Remove unused template.patch file
diff --git a/template.patch b/template.patch
deleted file mode 100644
index 10ec35e..0000000
--- a/template.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-Short description: <Short description>
-Author(s): <Who wrote them. Comma separated.>
-Origin: <Source repo(s) where it came from or keyword "PATCH" if this is simply a patch>
-# Likely git://sourceware.org/git/glibc.git
-Bug-RHEL: <Rhel bug #'s, comma separated e.g. #XXX, #YYY, #ZZZ>
-Bug-Fedora: <Fedora bug #'s, comma separated e.g. #XXX, #YYY, #ZZZ>
-Bug-Upstream: <Upstream bug#'s, comma separated e.g. #XXX, #YYY, #ZZZ>
-Upstream status: <[Patchwork URL|libc-alpha URL|not-needed|not-submitted|committed] for each commit>
-# <Additional descriptive text follows 'Upstream status:' line>
-<If upstream status == committed then a copy of the upstream commit log follows>
-<Patch>
commit dfaf15a3293437eb3eccb2667a5811c868aa3924
Author: Florian Weimer <fweimer(a)redhat.com>
Date: Fri May 7 11:41:27 2021 +0200
Remove spec file support for power9 multilib
This is not used in Fedora, and downstream removed the multilib
as well.
diff --git a/glibc.spec b/glibc.spec
index 88301d4..583112d 100644
--- a/glibc.spec
+++ b/glibc.spec
@@ -58,13 +58,6 @@
# Only some architectures have static PIE support.
%define pie_arches %{ix86} x86_64
-# Build the POWER9 runtime on POWER, but only for downstream.
-%ifarch ppc64le
-%define buildpower9 0%{?rhel} > 0
-%else
-%define buildpower9 0
-%endif
-
##############################################################################
# Any architecture/kernel combination that supports running 32-bit and 64-bit
# code in userspace is considered a biarch arch.
@@ -90,7 +83,7 @@
Summary: The GNU libc libraries
Name: glibc
Version: %{glibcversion}
-Release: 8%{?dist}
+Release: 9%{?dist}
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
# libraries.
@@ -1167,15 +1160,6 @@ build()
# Default set of compiler options.
build
-%if %{buildpower9}
-(
- GCC="$GCC -mcpu=power9 -mtune=power9"
- GXX="$GXX -mcpu=power9 -mtune=power9"
- core_with_options="--with-cpu=power9"
- build power9
-)
-%endif
-
##############################################################################
# Install glibc...
##############################################################################
@@ -1260,12 +1244,6 @@ install_different()
done
}
-%if %{buildpower9}
-pushd build-%{target}-power9
-install_different "$RPM_BUILD_ROOT/%{_lib}" power9 ..
-popd
-%endif
-
##############################################################################
# Remove the files we don't want to distribute
##############################################################################
@@ -1857,15 +1835,6 @@ pushd build-%{target}
run_tests
popd
-%if %{buildpower9}
-echo ====================TESTING -mcpu=power9=============
-pushd build-%{target}-power9
-run_tests
-popd
-%endif
-
-
-
echo ====================TESTING END=====================
PLTCMD='/^Relocation section .*\(\.rela\?\.plt\|\.rela\.IA_64\.pltoff\)/,/^$/p'
echo ====================PLT RELOCS LD.SO================
@@ -1960,7 +1929,9 @@ local remove_dirs = { "%{_libdir}/i686",
"%{_libdir}/i686/nosegneg",
"%{_libdir}/power6",
"%{_libdir}/power7",
- "%{_libdir}/power8" }
+ "%{_libdir}/power8",
+ "%{_libdir}/power9",
+ }
-- Walk all the directories with files we need to remove...
for _, rdir in ipairs (remove_dirs) do
@@ -2088,9 +2059,6 @@ fi
%files -f glibc.filelist
%dir %{_prefix}/%{_lib}/audit
-%if %{buildpower9}
-%dir /%{_lib}/power9
-%endif
%verify(not md5 size mtime) %config(noreplace) /etc/nsswitch.conf
%verify(not md5 size mtime) %config(noreplace) /etc/ld.so.conf
%verify(not md5 size mtime) %config(noreplace) /etc/rpc
@@ -2170,6 +2138,9 @@ fi
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
%changelog
+* Fri May 7 2021 Florian Weimer <fweimer(a)redhat.com> - 2.33-9
+- Remove spec file support for power9 multilib (not used on Fedora)
+
* Thu May 6 2021 Florian Weimer <fweimer(a)redhat.com> - 2.33-8
- Use distribution mechanism for debuginfo (#1661510, #1886295, #1905611)
2 years, 11 months
[Report] Packages Restricting Arches
by root
New package excluding arches (1)
============================
- rust-asn1_derive
ExclusiveArch: %{rust_arches}
List of packages currently excluding arches (1975)
===========================================
- 0ad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- 90-Second-Portraits
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- GoldenCheetah
ExclusiveArch: %{qt5_qtwebengine_arches}
- GtkAda
ExclusiveArch: %{GPRbuild_arches}
- GtkAda3
ExclusiveArch: %{GPRbuild_arches}
- OpenImageIO
ExclusiveArch: x86_64 ppc64le
- PragmARC
ExclusiveArch: %{GPRbuild_arches}
- R-V8
ExclusiveArch: %{nodejs_arches}
- RdRand
ExclusiveArch: %{ix86} x86_64
- RediSearch
ExclusiveArch: x86_64
- SLOF
ExclusiveArch: ppc64le
- YafaRay
ExclusiveArch: %{ix86} x86_64
- aboot
ExclusiveArch: alpha
- accel-config
ExclusiveArch: %{ix86} x86_64
- acpid
ExclusiveArch: ia64 x86_64 %{ix86} %{arm} aarch64
- ahven
ExclusiveArch: %{GPRbuild_arches}
- algobox
ExclusiveArch: %{qt5_qtwebengine_arches}
- alleyoop
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x %{arm} aarch64
- american-fuzzy-lop
ExclusiveArch: %{ix86} x86_64
- anet
ExclusiveArch: %{GPRbuild_arches}
- anki
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- apmd
ExclusiveArch: %{ix86}
- appstream-generator
ExclusiveArch: %{ldc_arches}
- arduino
ExclusiveArch: %{go_arches}
- arm-trusted-firmware
ExclusiveArch: aarch64
- aunit
ExclusiveArch: %GPRbuild_arches
- avgtime
ExclusiveArch: %{ldc_arches}
- aws
ExclusiveArch: %GPRbuild_arches
- bcal
ExclusiveArch: x86_64 aarch64 ia64 ppc64 ppc64le s390x
- bcc
ExclusiveArch: x86_64 %{power64} aarch64 s390x armv7hl
- bcm283x-firmware
ExclusiveArch: %{arm} aarch64
- berusky2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{mips}
- biosdevname
ExclusiveArch: %{ix86} x86_64
- blender
ExclusiveArch: x86_64 aarch64 ppc64le
- bless
ExclusiveArch: %mono_arches
- bpftrace
ExclusiveArch: x86_64 %{power64} aarch64 s390x
- calamares
ExclusiveArch: %{ix86} x86_64
- calibre
ExclusiveArch: %{qt5_qtwebengine_arches}
- ccdciel
ExclusiveArch: %{fpc_arches}
- cdcollect
ExclusiveArch: %{mono_arches}
- ceph
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- chromium
ExclusiveArch: x86_64 i686
ExclusiveArch: x86_64 i686 aarch64
- cjdns
ExclusiveArch: %{nodejs_arches}
- clevis-pin-tpm2
ExclusiveArch: %{rust_arches}
- cmospwd
ExclusiveArch: %{ix86} x86_64
- cmrt
ExclusiveArch: %{ix86} x86_64 ia64
- coffee-script
ExclusiveArch: %{nodejs_arches} noarch
- colorful
ExclusiveArch: %{fpc_arches}
- cpu-x
ExclusiveArch: i686 x86_64
- cpufetch
ExclusiveArch: %{arm} aarch64 x86_64
- cpuid
ExclusiveArch: %{ix86} x86_64
- cqrlog
ExclusiveArch: %{fpc_arches}
- crash
ExclusiveArch: %{ix86} ia64 x86_64 ppc ppc64 s390 s390x %{arm} aarch64 ppc64le
- crash-gcore-command
ExclusiveArch: aarch64 ppc64le x86_64
- crash-trace-command
ExclusiveArch: aarch64 ppc64le s390x x86_64
- criu
ExclusiveArch: x86_64 %{arm} ppc64le aarch64 s390x
- cryptlib
ExclusiveArch: x86_64 %{ix86} aarch64 ppc64 ppc64le
- cryptobone
ExclusiveArch: x86_64 %{ix86} ppc64 ppc64le aarch64
- daq
ExclusiveArch: x86_64 aarch64
- darktable
ExclusiveArch: x86_64 aarch64
ExclusiveArch: x86_64 ppc64le
- dbus-parsec
ExclusiveArch: %{rust_arches}
- dbus-sharp
ExclusiveArch: %mono_arches
- dbus-sharp-glib
ExclusiveArch: %mono_arches
- dbxtool
ExclusiveArch: i386 x86_64 aarch64
- deepin-daemon
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- deepin-desktop-schemas
ExclusiveArch: %{go_arches}
- dlm
ExclusiveArch: i686 x86_64
- dmidecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- dmtcp
ExclusiveArch: x86_64 aarch64
- docker-distribution
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- dolphin-emu
ExclusiveArch: x86_64 aarch64 ppc64le
- dotnet-build-reference-packages
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- dotnet3.1
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- dotnet5.0
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- dotnet5.0-build-reference-packages
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- doublecmd
ExclusiveArch: %{ix86} x86_64
- dpdk
ExclusiveArch: x86_64 i686 aarch64 ppc64le
- dssi-vst
ExclusiveArch: %{ix86} x86_64
- dyninst
ExclusiveArch: %{ix86} x86_64 ppc64le aarch64
- e3
ExclusiveArch: %{ix86} x86_64
- edk2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
ExclusiveArch: x86_64 aarch64
- efibootmgr
ExclusiveArch: %{efi}
- efifs
ExclusiveArch: %{efi}
- efitools
ExclusiveArch: %{efi}
- efivar
ExclusiveArch: %{efi}
- elk
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86} aarch64 %{arm} %{power64}
- emacs-slime
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- embree
ExclusiveArch: x86_64
- enki
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- envytools
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- eric
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- eth-tools
ExclusiveArch: x86_64
- extlinux-bootloader
ExclusiveArch: %{arm} aarch64
- fcitx-libpinyin
ExclusiveArch: %{qt5_qtwebengine_arches}
- fedora-dockerfiles
ExclusiveArch: %{go_arches}
- fes
ExclusiveArch: %{ix86} x86_64
- flannel
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- florist
ExclusiveArch: %{GPRbuild_arches}
- fpc
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64 ppc64le
- frescobaldi
ExclusiveArch: %{qt5_qtwebengine_arches}
- frysk
ExclusiveArch: %{ix86} x86_64 ppc64
- fwts
ExclusiveArch: x86_64 %{arm} aarch64 s390x riscv64 %{power64}
- fwupd-efi
ExclusiveArch: x86_64 aarch64
- fx
ExclusiveArch: %{nodejs_arches} noarch
- ga
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- gbrainy
ExclusiveArch: %mono_arches
- gdata-sharp
ExclusiveArch: %mono_arches
- gdb-exploitable
ExclusiveArch: x86_64 i386
ExclusiveArch: x86_64 noarch
- gearhead1
ExclusiveArch: %{fpc_arches}
- gela-asis
ExclusiveArch: %GPRbuild_arches
- ghdl
ExclusiveArch: %{GNAT_arches}
- ghostwriter
ExclusiveArch: %{qt5_qtwebengine_arches}
- gio-sharp
ExclusiveArch: %mono_arches
- gir-to-d
ExclusiveArch: %{ldc_arches}
- git-octopus
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- gitqlient
ExclusiveArch: %{qt5_qtwebengine_arches}
- giver
ExclusiveArch: %{mono_arches}
- gkeyfile-sharp
ExclusiveArch: %mono_arches
- glibc32
ExclusiveArch: x86_64
- glibd
ExclusiveArch: %{ldc_arches}
- gmqcc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- gnatcoll
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-bindings
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-db
ExclusiveArch: %{GPRbuild_arches}
- gnome-boxes
ExclusiveArch: x86_64
- gnome-desktop-sharp
ExclusiveArch: %mono_arches
- gnome-do
ExclusiveArch: %mono_arches
- gnome-guitar
ExclusiveArch: %{mono_arches}
- gnome-keyring-sharp
ExclusiveArch: %mono_arches
- gnome-rdp
ExclusiveArch: %{mono_arches}
- gnome-sharp
ExclusiveArch: %mono_arches
- gnome-subtitles
ExclusiveArch: %mono_arches
- gnu-efi
ExclusiveArch: %{efi}
- go-bindata
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- go-compilers
ExclusiveArch: %{go_arches}
- go-rpm-macros
ExclusiveArch: %{golang_arches} %{gccgo_arches}
- godep
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang
ExclusiveArch: %{golang_arches}
- gomtree
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- gotun
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: x86_64
- goverlay
ExclusiveArch: %{fpc_arches}
- gprbuild
ExclusiveArch: %{GPRbuild_arches} %{bootstrap_arch}
- gprolog
ExclusiveArch: x86_64 %{ix86} ppc alpha
- grafana
ExclusiveArch: %{grafana_arches}
- grafana-pcp
ExclusiveArch: %{grafanapcp_arches}
- gtk-sharp-beans
ExclusiveArch: %mono_arches
- gtk-sharp2
ExclusiveArch: %mono_arches
- gtk-sharp3
ExclusiveArch: %{mono_arches}
- gtkd
ExclusiveArch: %{ldc_arches}
- gudev-sharp
ExclusiveArch: %mono_arches
- guestfs-tools
ExclusiveArch: %{kernel_arches}
- hedgewars
ExclusiveArch: %{fpc_arches}
- hsakmt
ExclusiveArch: x86_64 aarch64
- hyena
ExclusiveArch: %{mono_arches}
- hyperscan
ExclusiveArch: x86_64
- hyperv-daemons
ExclusiveArch: i686 x86_64
- i3status-rs
ExclusiveArch: %{rust_arches}
- icaro
ExclusiveArch: %{ix86} x86_64 noarch
- ignition
ExclusiveArch: %{go_arches}
- imvirt
ExclusiveArch: %{ix86} x86_64 ia64
- indistarter
ExclusiveArch: %{fpc_arches}
- infinipath-psm
ExclusiveArch: x86_64
- intel-cmt-cat
ExclusiveArch: x86_64 i686 i586
ExclusiveArch: x86_64 i686 i586
- intel-gmmlib
ExclusiveArch: x86_64 i686
- intel-ipp-crypto-mb
ExclusiveArch: x86_64
ExclusiveArch: x86_64
- intel-ipsec-mb
ExclusiveArch: x86_64
ExclusiveArch: x86_64
- intel-mediasdk
ExclusiveArch: x86_64
- intel-undervolt
ExclusiveArch: i386 x86_64
- ioport
ExclusiveArch: %{ix86} x86_64
- ipmctl
ExclusiveArch: x86_64
- ipw2100-firmware
ExclusiveArch: noarch i386 x86_64
- ipw2200-firmware
ExclusiveArch: noarch i386 x86_64
- ispc
ExclusiveArch: x86_64 aarch64
- iucode-tool
ExclusiveArch: %{ix86} x86_64
- iyfct
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- java-1.8.0-openjdk-aarch32
ExclusiveArch: %{arm}
- keepass
ExclusiveArch: %{mono_arches}
- kernel
ExclusiveArch: x86_64 s390x %{arm} aarch64 ppc64le
ExclusiveArch: noarch i386 i686 x86_64 s390x %{arm} aarch64 ppc64le
- keyring-ima-signer
ExclusiveArch: %{rust_arches}
- kf5-akonadi-search
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-audiocd-kio
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kalarmcal
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kblog
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kcalendarcore
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kcalendarutils
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kitinerary
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kmailtransport
ExclusiveArch: x86_64 %{arm}
- kf5-ktnef
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-libkdcraw
ExclusiveArch: x86_64 ppc64le %{arm}
- kicad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- kiwix-desktop
ExclusiveArch: %{qt5_qtwebengine_arches}
- knot-resolver
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- knotes
ExclusiveArch: x86_64 %{arm}
- kompose
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 s390x
- kubernetes
ExclusiveArch: x86_64 aarch64 ppc64le s390x %{arm}
- lazarus
ExclusiveArch: %{fpc_arches}
- lazpaint
ExclusiveArch: %{fpc_arches}
- ldc
ExclusiveArch: %{ldc_arches}
- libbsr
ExclusiveArch: %{power64}
- libclc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{power64} s390x
- libcxl
ExclusiveArch: %{power64}
- libdfp
ExclusiveArch: ppc ppc64 ppc64le s390 s390x x86_64
- libdispatch
ExclusiveArch: x86_64 aarch64
- libguestfs
ExclusiveArch: %{kernel_arches}
- libica
ExclusiveArch: s390 s390x
- libipt
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- libnxz
ExclusiveArch: ppc64le
- libocxl
ExclusiveArch: ppc64le
- libpmemobj-cpp
ExclusiveArch: x86_64
- libpsm2
ExclusiveArch: x86_64
- libquentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- libretro-desmume2015
ExclusiveArch: i686 x86_64
- librtas
ExclusiveArch: %{power64}
- libservicelog
ExclusiveArch: ppc %{power64}
- libsmbios
ExclusiveArch: x86_64 %{ix86}
- libunwind
ExclusiveArch: %{arm} aarch64 hppa ia64 mips ppc %{power64} s390x %{ix86} x86_64
- libva-intel-hybrid-driver
ExclusiveArch: %{ix86} x86_64 ia64
- libvma
ExclusiveArch: x86_64 ppc64le ppc64 aarch64
- libvmi
ExclusiveArch: x86_64
- libvpd
ExclusiveArch: %{power64}
- libxsmm
ExclusiveArch: x86_64
- libzfcphbaapi
ExclusiveArch: s390 s390x
- lightdm
ExclusiveArch: x86_64 ppc64le
- log4net
ExclusiveArch: %mono_arches
- lrmi
ExclusiveArch: %{ix86}
- lsvpd
ExclusiveArch: %{power64}
- luajit
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 s390x ppc64le
- luxcorerender
ExclusiveArch: x86_64
- mactel-boot
ExclusiveArch: x86_64
- manifest-tool
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- mantle
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- marked
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- matreshka
ExclusiveArch: %GPRbuild_arches
- maxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- mbpfan
ExclusiveArch: x86_64
- mcelog
ExclusiveArch: i686 x86_64
- mediaconch
ExclusiveArch: %{qt5_qtwebengine_arches}
- mellowplayer
ExclusiveArch: %{qt5_qtwebengine_arches}
- memkind
ExclusiveArch: x86_64 ppc64 ppc64le s390x aarch64
- memtest86+
ExclusiveArch: %{ix86} x86_64
- mesos
ExclusiveArch: x86_64
- microcode_ctl
ExclusiveArch: %{ix86} x86_64
- micropython
ExclusiveArch: %{arm} %{ix86} x86_64
- mine_detector
ExclusiveArch: %{GPRbuild_arches}
- minetest
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- mingw-wine-gecko
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- mirrorlist-server
ExclusiveArch: %{rust_arches}
- mkbootdisk
ExclusiveArch: %{ix86} sparc sparc64 x86_64
- mod_mono
ExclusiveArch: %mono_arches
- module-build-service
ExclusiveArch: %{ix86} x86_64 noarch
- mokutil
ExclusiveArch: %{ix86} x86_64 aarch64 %{arm}
- mono
ExclusiveArch: %mono_arches
- mono-addins
ExclusiveArch: %mono_arches
- mono-basic
ExclusiveArch: %{mono_arches}
- mono-bouncycastle
ExclusiveArch: %mono_arches
- mono-cecil
ExclusiveArch: %mono_arches
- mono-cecil-flowanalysis
ExclusiveArch: %mono_arches
- mono-reflection
ExclusiveArch: %mono_arches
- mono-tools
ExclusiveArch: %mono_arches
- mono-zeroconf
ExclusiveArch: %mono_arches
- monobristol
ExclusiveArch: %{mono_arches}
- monodevelop
ExclusiveArch: %mono_arches
- monodevelop-debugger-gdb
ExclusiveArch: %{mono_arches}
- monosim
ExclusiveArch: %mono_arches
- mrrescue
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- msr-tools
ExclusiveArch: %{ix86} x86_64
- mustache-d
ExclusiveArch: %{ldc_arches}
- mysql-connector-net
ExclusiveArch: %{mono_arches}
- nant
ExclusiveArch: %mono_arches
- nativejit
ExclusiveArch: x86_64
- nbc
ExclusiveArch: %{fpc_arches}
- nbdkit
ExclusiveArch: x86_64
- ndesk-dbus
ExclusiveArch: %{mono_arches}
- ndesk-dbus-glib
ExclusiveArch: %{mono_arches}
- newsflash
ExclusiveArch: %{rust_arches}
- newtonsoft-json
ExclusiveArch: %{mono_arches}
- nispor
ExclusiveArch: %{rust_arches}
- nodejs
ExclusiveArch: %{nodejs_arches}
- nodejs-acorn-object-spread
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-backbone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-buble
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-colors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-generic-pool
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-linefix
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-nodemon
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-packaging
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-replace-require-self
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-supervisor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-svgo
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tape
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-typescript
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-underscore
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- notify-sharp
ExclusiveArch: %{mono_arches}
- notify-sharp3
ExclusiveArch: %{mono_arches}
- npm-name-cli
ExclusiveArch: %{nodejs_arches} noarch
- nuget
ExclusiveArch: %{mono_arches}
- numatop
ExclusiveArch: x86_64 ppc64le
- nunit
ExclusiveArch: %{mono_arches}
- nunit2
ExclusiveArch: %{mono_arches}
- nvml
ExclusiveArch: x86_64 ppc64le
- nwchem
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- obs-service-rust2rpm
ExclusiveArch: %{rust_arches} noarch
- oci-kvm-hook
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- oci-seccomp-bpf-hook
ExclusiveArch: x86_64 %%{power64} aarch64 s390x armv7hl
- oci-umount
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x %{mips}
- oidn
ExclusiveArch: x86_64
- olpc-kbdshim
ExclusiveArch: %{ix86} %{arm}
- olpc-netutils
ExclusiveArch: %{ix86} %{arm}
- olpc-utils
ExclusiveArch: %{ix86} %{arm}
- onednn
ExclusiveArch: x86_64 aarch64 ppc64le
- onedrive
ExclusiveArch: %{ldc_arches}
- opae
ExclusiveArch: x86_64
- opal-prd
ExclusiveArch: ppc64le
- open-vm-tools
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64
- openblas
ExclusiveArch: %{openblas_arches}
- openjfx
ExclusiveArch: x86_64
- openjfx8
ExclusiveArch: x86_64
- openlibm
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 %{power64}
- openni
ExclusiveArch: %{ix86} x86_64 %{arm}
- openni-primesense
ExclusiveArch: %{ix86} x86_64 %{arm}
- openshadinglanguage
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- openssl-ibmca
ExclusiveArch: s390 s390x
- origin
ExclusiveArch: %{go_arches}
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- orion
ExclusiveArch: %{qt5_qtwebengine_arches}
- orthorobot
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- paflib
ExclusiveArch: ppc %{power64}
- parsec
ExclusiveArch: %{rust_arches}
- parsec-tool
ExclusiveArch: %{rust_arches}
- pcc
ExclusiveArch: %{ix86} x86_64
- pcmciautils
ExclusiveArch: %{ix86} x86_64 ia64 ppc ppc64 %{arm}
- pdbg
ExclusiveArch: ppc64le
- pdfmod
ExclusiveArch: %mono_arches
- perl-Dumbbench
ExclusiveArch: %{ix86} x86_64 noarch
- perl-Parse-DMIDecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- pesign
ExclusiveArch: %{ix86} x86_64 ia64 aarch64 %{arm}
- pesign-test-app
ExclusiveArch: x86_64
- pinta
ExclusiveArch: %mono_arches
- pioneer
ExclusiveArch: %{ix86} x86_64
- playonlinux
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- pmdk-convert
ExclusiveArch: x86_64
- pmemkv
ExclusiveArch: x86_64
- poppler-sharp
ExclusiveArch: %mono_arches
- popub
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- powerpc-utils
ExclusiveArch: ppc %{power64}
- ppc64-diag
ExclusiveArch: ppc %{power64}
- psi-plus
ExclusiveArch: %{qt5_qtwebengine_arches}
- pveclib
ExclusiveArch: ppc %{power64}
- pvs-sbcl
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- pyqtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- python-cryptography
ExclusiveArch: %{rust_arches}
- python-etcd
ExclusiveArch: noarch %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- python-healpy
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-javabridge
ExclusiveArch: i686 x86_64
- python-openoffice
ExclusiveArch: noarch x86_64
- python-pymoc
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-rpi-gpio
ExclusiveArch: %{arm} aarch64
- python-setuptools-rust
ExclusiveArch: %{rust_arches}
- q4wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- qcint
ExclusiveArch: x86_64
- qclib
ExclusiveArch: s390 s390x
- qemu-sanity-check
ExclusiveArch: %{kernel_arches}
- qevercloud
ExclusiveArch: %{qt5_qtwebengine_arches}
- qmapshack
ExclusiveArch: %{qt5_qtwebengine_arches}
- qt4pas
ExclusiveArch: %{fpc_arches}
- qt5-qtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- quantum-espresso
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86}
- quentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- rear
ExclusiveArch: %ix86 x86_64 ppc ppc64 ppc64le ia64
- redhat-lsb
ExclusiveArch: %{ix86} ia64 x86_64 ppc ppc64 s390 s390x %{arm} aarch64 ppc64le
- renderdoc
ExclusiveArch: x86_64
- reptyr
ExclusiveArch: %{ix86} x86_64 %{arm}
- rescene
ExclusiveArch: %{mono_arches}
- restsharp
ExclusiveArch: %{mono_arches}
- rhythmbox-alternative-toolbar
ExclusiveArch: %{ix86} %{arm} x86_64 ppc64 ppc64le
- rmd
ExclusiveArch: %{ix86} x86_64
- rocm-runtime
ExclusiveArch: x86_64 aarch64
- rocminfo
ExclusiveArch: x86_64 aarch64
- rpm-ostree
ExclusiveArch: %{rust_arches}
- rr
ExclusiveArch: %{ix86} x86_64
- rssguard
ExclusiveArch: %{qt5_qtwebengine_arches}
- rubygem-childprocess
ExclusiveArch: %{ix86} x86_64 noarch
- runc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le %{mips} s390x
- rust
ExclusiveArch: %{rust_arches}
- rust-ab_glyph_rasterizer
ExclusiveArch: %{rust_arches}
- rust-abomonation
ExclusiveArch: %{rust_arches}
- rust-actix
ExclusiveArch: %{rust_arches}
- rust-actix-codec
ExclusiveArch: %{rust_arches}
- rust-actix-connect
ExclusiveArch: %{rust_arches}
- rust-actix-files
ExclusiveArch: %{rust_arches}
- rust-actix-http
ExclusiveArch: %{rust_arches}
- rust-actix-macros
ExclusiveArch: %{rust_arches}
- rust-actix-router
ExclusiveArch: %{rust_arches}
- rust-actix-rt
ExclusiveArch: %{rust_arches}
- rust-actix-server
ExclusiveArch: %{rust_arches}
- rust-actix-server-config
ExclusiveArch: %{rust_arches}
- rust-actix-service
ExclusiveArch: %{rust_arches}
- rust-actix-testing
ExclusiveArch: %{rust_arches}
- rust-actix-threadpool
ExclusiveArch: %{rust_arches}
- rust-actix-tls
ExclusiveArch: %{rust_arches}
- rust-actix-utils
ExclusiveArch: %{rust_arches}
- rust-actix-web
ExclusiveArch: %{rust_arches}
- rust-actix-web-codegen
ExclusiveArch: %{rust_arches}
- rust-actix_derive
ExclusiveArch: %{rust_arches}
- rust-addr2line
ExclusiveArch: %{rust_arches}
- rust-adler
ExclusiveArch: %{rust_arches}
- rust-adler32
ExclusiveArch: %{rust_arches}
- rust-aead
ExclusiveArch: %{rust_arches}
- rust-aes
ExclusiveArch: %{rust_arches}
- rust-aes-gcm
ExclusiveArch: %{rust_arches}
- rust-aes-soft
ExclusiveArch: %{rust_arches}
- rust-afterburn
ExclusiveArch: %{rust_arches}
- rust-ahash
ExclusiveArch: %{rust_arches}
- rust-ahash0.4
ExclusiveArch: %{rust_arches}
- rust-aho-corasick
ExclusiveArch: %{rust_arches}
- rust-alacritty
ExclusiveArch: %{rust_arches}
- rust-alacritty_config_derive
ExclusiveArch: %{rust_arches}
- rust-alacritty_terminal
ExclusiveArch: %{rust_arches}
- rust-alga
ExclusiveArch: %{rust_arches}
- rust-alga_derive
ExclusiveArch: %{rust_arches}
- rust-alloc-no-stdlib
ExclusiveArch: %{rust_arches}
- rust-alloc-stdlib
ExclusiveArch: %{rust_arches}
- rust-alphanumeric-sort
ExclusiveArch: %{rust_arches}
- rust-ammonia
ExclusiveArch: %{rust_arches}
- rust-andrew
ExclusiveArch: %{rust_arches}
- rust-ansi_colours
ExclusiveArch: %{rust_arches}
- rust-ansi_term
ExclusiveArch: %{rust_arches}
- rust-ansi_term0.11
ExclusiveArch: %{rust_arches}
- rust-antidote
ExclusiveArch: %{rust_arches}
- rust-anyhow
ExclusiveArch: %{rust_arches}
- rust-anymap
ExclusiveArch: %{rust_arches}
- rust-aom-sys
ExclusiveArch: %{rust_arches}
- rust-app_dirs
ExclusiveArch: %{rust_arches}
- rust-approx
ExclusiveArch: %{rust_arches}
- rust-arbitrary
ExclusiveArch: %{rust_arches}
- rust-arbitrary0.4
ExclusiveArch: %{rust_arches}
- rust-arc-swap
ExclusiveArch: %{rust_arches}
- rust-arg_enum_proc_macro
ExclusiveArch: %{rust_arches}
- rust-argparse
ExclusiveArch: %{rust_arches}
- rust-array-init
ExclusiveArch: %{rust_arches}
- rust-arraydeque
ExclusiveArch: %{rust_arches}
- rust-arrayref
ExclusiveArch: %{rust_arches}
- rust-arrayvec
ExclusiveArch: %{rust_arches}
- rust-article_scraper
ExclusiveArch: %{rust_arches}
- rust-ascii
ExclusiveArch: %{rust_arches}
- rust-ascii-canvas
ExclusiveArch: %{rust_arches}
- rust-askalono
ExclusiveArch: %{rust_arches}
- rust-askalono-cli
ExclusiveArch: %{rust_arches}
- rust-askama
ExclusiveArch: %{rust_arches}
- rust-askama_derive
ExclusiveArch: %{rust_arches}
- rust-askama_escape
ExclusiveArch: %{rust_arches}
- rust-askama_shared
ExclusiveArch: %{rust_arches}
- rust-asn1_derive
ExclusiveArch: %{rust_arches}
- rust-assert-json-diff
ExclusiveArch: %{rust_arches}
- rust-assert_approx_eq
ExclusiveArch: %{rust_arches}
- rust-assert_cli
ExclusiveArch: %{rust_arches}
- rust-assert_cmd
ExclusiveArch: %{rust_arches}
- rust-assert_fs
ExclusiveArch: %{rust_arches}
- rust-assert_matches
ExclusiveArch: %{rust_arches}
- rust-assign
ExclusiveArch: %{rust_arches}
- rust-async-attributes
ExclusiveArch: %{rust_arches}
- rust-async-compression
ExclusiveArch: %{rust_arches}
- rust-async-io
ExclusiveArch: %{rust_arches}
- rust-async-task
ExclusiveArch: %{rust_arches}
- rust-async-trait
ExclusiveArch: %{rust_arches}
- rust-asyncgit
ExclusiveArch: %{rust_arches}
- rust-atk
ExclusiveArch: %{rust_arches}
- rust-atk-sys
ExclusiveArch: %{rust_arches}
- rust-atom
ExclusiveArch: %{rust_arches}
- rust-atomicwrites
ExclusiveArch: %{rust_arches}
- rust-attohttpc
ExclusiveArch: %{rust_arches}
- rust-atty
ExclusiveArch: %{rust_arches}
- rust-autocfg
ExclusiveArch: %{rust_arches}
- rust-av-metrics
ExclusiveArch: %{rust_arches}
- rust-average
ExclusiveArch: %{rust_arches}
- rust-awc
ExclusiveArch: %{rust_arches}
- rust-backtrace
ExclusiveArch: %{rust_arches}
- rust-backtrace-sys
ExclusiveArch: %{rust_arches}
- rust-base100
ExclusiveArch: %{rust_arches}
- rust-base64
ExclusiveArch: %{rust_arches}
- rust-base64-0.10
ExclusiveArch: %{rust_arches}
- rust-base64-0.11
ExclusiveArch: %{rust_arches}
- rust-base64_0.12
ExclusiveArch: %{rust_arches}
- rust-bat
ExclusiveArch: %{rust_arches}
- rust-battery
ExclusiveArch: %{rust_arches}
- rust-bencher
ExclusiveArch: %{rust_arches}
- rust-better-panic
ExclusiveArch: %{rust_arches}
- rust-bincode
ExclusiveArch: %{rust_arches}
- rust-bincode0.8
ExclusiveArch: %{rust_arches}
- rust-bindgen
ExclusiveArch: %{rust_arches}
- rust-binfarce
ExclusiveArch: %{rust_arches}
- rust-biscuit
ExclusiveArch: %{rust_arches}
- rust-bit-set
ExclusiveArch: %{rust_arches}
- rust-bit-vec
ExclusiveArch: %{rust_arches}
- rust-bitfield
ExclusiveArch: %{rust_arches}
- rust-bitflags
ExclusiveArch: %{rust_arches}
- rust-bitmaps
ExclusiveArch: %{rust_arches}
- rust-bitstream-io
ExclusiveArch: %{rust_arches}
- rust-bitvec
ExclusiveArch: %{rust_arches}
- rust-blake2
ExclusiveArch: %{rust_arches}
- rust-blobby
ExclusiveArch: %{rust_arches}
- rust-blobby0.1
ExclusiveArch: %{rust_arches}
- rust-block-buffer
ExclusiveArch: %{rust_arches}
- rust-block-buffer0.7
ExclusiveArch: %{rust_arches}
- rust-block-modes
ExclusiveArch: %{rust_arches}
- rust-block-padding
ExclusiveArch: %{rust_arches}
- rust-blsctl
ExclusiveArch: %{rust_arches}
- rust-bodhi
ExclusiveArch: %{rust_arches}
- rust-bodhi-cli
ExclusiveArch: %{rust_arches}
- rust-bootupd
ExclusiveArch: x86_64 aarch64
- rust-box_drawing
ExclusiveArch: %{rust_arches}
- rust-brev
ExclusiveArch: %{rust_arches}
- rust-brotli
ExclusiveArch: %{rust_arches}
- rust-brotli-decompressor
ExclusiveArch: %{rust_arches}
- rust-brotli-sys
ExclusiveArch: %{rust_arches}
- rust-brotli2
ExclusiveArch: %{rust_arches}
- rust-bstr
ExclusiveArch: %{rust_arches}
- rust-buf-min
ExclusiveArch: %{rust_arches}
- rust-buf_redux
ExclusiveArch: %{rust_arches}
- rust-buffered-reader
ExclusiveArch: %{rust_arches}
- rust-bufsize
ExclusiveArch: %{rust_arches}
- rust-bufstream
ExclusiveArch: %{rust_arches}
- rust-build-env
ExclusiveArch: %{rust_arches}
- rust-build_const
ExclusiveArch: %{rust_arches}
- rust-bumpalo
ExclusiveArch: %{rust_arches}
- rust-byte-tools
ExclusiveArch: %{rust_arches}
- rust-byte-unit
ExclusiveArch: %{rust_arches}
- rust-byte-unit3
ExclusiveArch: %{rust_arches}
- rust-bytecount
ExclusiveArch: %{rust_arches}
- rust-bytelines
ExclusiveArch: %{rust_arches}
- rust-bytemuck
ExclusiveArch: %{rust_arches}
- rust-bytemuck_derive
ExclusiveArch: %{rust_arches}
- rust-byteorder
ExclusiveArch: %{rust_arches}
- rust-bytes
ExclusiveArch: %{rust_arches}
- rust-bytes0.4
ExclusiveArch: %{rust_arches}
- rust-bytes0.5
ExclusiveArch: %{rust_arches}
- rust-bytes0.6
ExclusiveArch: %{rust_arches}
- rust-bytesize
ExclusiveArch: %{rust_arches}
- rust-bytestring
ExclusiveArch: %{rust_arches}
- rust-bzip2
ExclusiveArch: %{rust_arches}
- rust-bzip2-sys
ExclusiveArch: %{rust_arches}
- rust-c_vec
ExclusiveArch: %{rust_arches}
- rust-cache-padded
ExclusiveArch: %{rust_arches}
- rust-cairo-rs
ExclusiveArch: %{rust_arches}
- rust-cairo-sys-rs
ExclusiveArch: %{rust_arches}
- rust-calloop
ExclusiveArch: %{rust_arches}
- rust-capnp
ExclusiveArch: %{rust_arches}
- rust-capnp-futures
ExclusiveArch: %{rust_arches}
- rust-capnp-rpc
ExclusiveArch: %{rust_arches}
- rust-caps
ExclusiveArch: %{rust_arches}
- rust-cargo
ExclusiveArch: %{rust_arches}
- rust-cargo-bloat
ExclusiveArch: %{rust_arches}
- rust-cargo-c
ExclusiveArch: %{rust_arches}
- rust-cargo-husky
ExclusiveArch: %{rust_arches}
- rust-cargo-insta
ExclusiveArch: %{rust_arches}
- rust-cargo-platform
ExclusiveArch: %{rust_arches}
- rust-cargo-readme
ExclusiveArch: %{rust_arches}
- rust-cargo_metadata
ExclusiveArch: %{rust_arches}
- rust-case
ExclusiveArch: %{rust_arches}
- rust-cassowary
ExclusiveArch: %{rust_arches}
- rust-cast
ExclusiveArch: %{rust_arches}
- rust-cbindgen
ExclusiveArch: %{rust_arches}
- rust-cc
ExclusiveArch: %{rust_arches}
- rust-cedarwood
ExclusiveArch: %{rust_arches}
- rust-cexpr
ExclusiveArch: %{rust_arches}
- rust-cfg-if
ExclusiveArch: %{rust_arches}
- rust-cfg-if0.1
ExclusiveArch: %{rust_arches}
- rust-chainerror
ExclusiveArch: %{rust_arches}
- rust-charset
ExclusiveArch: %{rust_arches}
- rust-chbs
ExclusiveArch: %{rust_arches}
- rust-checked_int_cast
ExclusiveArch: %{rust_arches}
- rust-choosier
ExclusiveArch: %{rust_arches}
- rust-chrono
ExclusiveArch: %{rust_arches}
- rust-chrono-humanize
ExclusiveArch: %{rust_arches}
- rust-chrono-tz
ExclusiveArch: %{rust_arches}
- rust-chunked_transfer
ExclusiveArch: %{rust_arches}
- rust-cipher
ExclusiveArch: %{rust_arches}
- rust-clang-sys
ExclusiveArch: %{rust_arches}
- rust-clap
ExclusiveArch: %{rust_arches}
- rust-clap2
ExclusiveArch: %{rust_arches}
- rust-clap_derive
ExclusiveArch: %{rust_arches}
- rust-clicolors-control
ExclusiveArch: %{rust_arches}
- rust-cmake
ExclusiveArch: %{rust_arches}
- rust-codespan-reporting
ExclusiveArch: %{rust_arches}
- rust-codicon
ExclusiveArch: %{rust_arches}
- rust-color-backtrace
ExclusiveArch: %{rust_arches}
- rust-color_quant
ExclusiveArch: %{rust_arches}
- rust-colored
ExclusiveArch: %{rust_arches}
- rust-colored1
ExclusiveArch: %{rust_arches}
- rust-colored_json
ExclusiveArch: %{rust_arches}
- rust-colorful
ExclusiveArch: %{rust_arches}
- rust-compiletest_rs
ExclusiveArch: %{rust_arches}
- rust-comrak
ExclusiveArch: %{rust_arches}
- rust-concurrent-queue
ExclusiveArch: %{rust_arches}
- rust-config
ExclusiveArch: %{rust_arches}
- rust-configparser
ExclusiveArch: %{rust_arches}
- rust-confy
ExclusiveArch: %{rust_arches}
- rust-console
ExclusiveArch: %{rust_arches}
- rust-console0.11
ExclusiveArch: %{rust_arches}
- rust-console0.12
ExclusiveArch: %{rust_arches}
- rust-console0.13
ExclusiveArch: %{rust_arches}
- rust-console0.9
ExclusiveArch: %{rust_arches}
- rust-const-cstr
ExclusiveArch: %{rust_arches}
- rust-const-random
ExclusiveArch: %{rust_arches}
- rust-const-random-macro
ExclusiveArch: %{rust_arches}
- rust-const_fn
ExclusiveArch: %{rust_arches}
- rust-content_inspector
ExclusiveArch: %{rust_arches}
- rust-conv
ExclusiveArch: %{rust_arches}
- rust-cookie
ExclusiveArch: %{rust_arches}
- rust-cookie_store
ExclusiveArch: %{rust_arches}
- rust-copydeps
ExclusiveArch: %{rust_arches}
- rust-copyless
ExclusiveArch: %{rust_arches}
- rust-copypasta
ExclusiveArch: %{rust_arches}
- rust-coreos-installer
ExclusiveArch: %{rust_arches}
- rust-cpio
ExclusiveArch: %{rust_arches}
- rust-cpp_demangle
ExclusiveArch: %{rust_arches}
- rust-cpuid-bool
ExclusiveArch: %{rust_arches}
- rust-cpython
ExclusiveArch: %{rust_arches}
- rust-crates-io
ExclusiveArch: %{rust_arches}
- rust-crc
ExclusiveArch: %{rust_arches}
- rust-crc-any
ExclusiveArch: %{rust_arches}
- rust-crc-core
ExclusiveArch: %{rust_arches}
- rust-crc32fast
ExclusiveArch: %{rust_arches}
- rust-criterion
ExclusiveArch: %{rust_arches}
- rust-criterion-plot
ExclusiveArch: %{rust_arches}
- rust-crossbeam
ExclusiveArch: %{rust_arches}
- rust-crossbeam-channel
ExclusiveArch: %{rust_arches}
- rust-crossbeam-channel0.4
ExclusiveArch: %{rust_arches}
- rust-crossbeam-deque
ExclusiveArch: %{rust_arches}
- rust-crossbeam-deque0.7
ExclusiveArch: %{rust_arches}
- rust-crossbeam-epoch
ExclusiveArch: %{rust_arches}
- rust-crossbeam-epoch0.8
ExclusiveArch: %{rust_arches}
- rust-crossbeam-queue
ExclusiveArch: %{rust_arches}
- rust-crossbeam-queue0.2
ExclusiveArch: %{rust_arches}
- rust-crossbeam-utils
ExclusiveArch: %{rust_arches}
- rust-crossbeam-utils0.7
ExclusiveArch: %{rust_arches}
- rust-crossbeam0.7
ExclusiveArch: %{rust_arches}
- rust-crossfont
ExclusiveArch: %{rust_arches}
- rust-crossterm
ExclusiveArch: %{rust_arches}
- rust-crossterm0.17
ExclusiveArch: %{rust_arches}
- rust-crossterm0.18
ExclusiveArch: %{rust_arches}
- rust-crosstermion
ExclusiveArch: %{rust_arches}
- rust-crunchy
ExclusiveArch: %{rust_arches}
- rust-crypto-hash
ExclusiveArch: %{rust_arches}
- rust-crypto-mac
ExclusiveArch: %{rust_arches}
- rust-crypto-mac0.8
ExclusiveArch: %{rust_arches}
- rust-cryptoki
ExclusiveArch: %{rust_arches}
- rust-cryptoki-sys
ExclusiveArch: %{rust_arches}
- rust-cryptovec
ExclusiveArch: %{rust_arches}
- rust-cssparser
ExclusiveArch: %{rust_arches}
- rust-cssparser-macros
ExclusiveArch: %{rust_arches}
- rust-cstr-argument
ExclusiveArch: %{rust_arches}
- rust-csv
ExclusiveArch: %{rust_arches}
- rust-csv-core
ExclusiveArch: %{rust_arches}
- rust-ctor
ExclusiveArch: %{rust_arches}
- rust-ctr
ExclusiveArch: %{rust_arches}
- rust-ctrlc
ExclusiveArch: %{rust_arches}
- rust-cty
ExclusiveArch: %{rust_arches}
- rust-curl
ExclusiveArch: %{rust_arches}
- rust-curl-sys
ExclusiveArch: %{rust_arches}
- rust-custom_derive
ExclusiveArch: %{rust_arches}
- rust-cxx
ExclusiveArch: %{rust_arches}
- rust-cxx-build
ExclusiveArch: %{rust_arches}
- rust-cxx-gen
ExclusiveArch: %{rust_arches}
- rust-cxxbridge-flags
ExclusiveArch: %{rust_arches}
- rust-cxxbridge-macro
ExclusiveArch: %{rust_arches}
- rust-darling
ExclusiveArch: %{rust_arches}
- rust-darling_core
ExclusiveArch: %{rust_arches}
- rust-darling_macro
ExclusiveArch: %{rust_arches}
- rust-dashmap
ExclusiveArch: %{rust_arches}
- rust-dashmap3
ExclusiveArch: %{rust_arches}
- rust-data-encoding
ExclusiveArch: %{rust_arches}
- rust-data-url
ExclusiveArch: %{rust_arches}
- rust-datetime
ExclusiveArch: %{rust_arches}
- rust-dav1d-sys
ExclusiveArch: %{rust_arches}
- rust-dbus
ExclusiveArch: %{rust_arches}
- rust-dbus-codegen
ExclusiveArch: %{rust_arches}
- rust-dbus-crossroads
ExclusiveArch: %{rust_arches}
- rust-dbus-tokio
ExclusiveArch: %{rust_arches}
- rust-dbus-tree
ExclusiveArch: %{rust_arches}
- rust-dbus0.8
ExclusiveArch: %{rust_arches}
- rust-debug-helper
ExclusiveArch: %{rust_arches}
- rust-decimal
ExclusiveArch: %{rust_arches}
- rust-deflate
ExclusiveArch: %{rust_arches}
- rust-defmac
ExclusiveArch: %{rust_arches}
- rust-delta_e
ExclusiveArch: %{rust_arches}
- rust-derivative
ExclusiveArch: %{rust_arches}
- rust-derive-new
ExclusiveArch: %{rust_arches}
- rust-derive_arbitrary
ExclusiveArch: %{rust_arches}
- rust-derive_arbitrary0.4
ExclusiveArch: %{rust_arches}
- rust-derive_builder
ExclusiveArch: %{rust_arches}
- rust-derive_builder_core
ExclusiveArch: %{rust_arches}
- rust-derive_builder_core0.9
ExclusiveArch: %{rust_arches}
- rust-derive_more
ExclusiveArch: %{rust_arches}
- rust-des
ExclusiveArch: %{rust_arches}
- rust-desed
ExclusiveArch: %{rust_arches}
- rust-deunicode
ExclusiveArch: %{rust_arches}
- rust-devicemapper
ExclusiveArch: %{rust_arches}
- rust-dialoguer
ExclusiveArch: %{rust_arches}
- rust-diesel
ExclusiveArch: %{rust_arches}
- rust-diesel_derives
ExclusiveArch: %{rust_arches}
- rust-diesel_migrations
ExclusiveArch: %{rust_arches}
- rust-diff
ExclusiveArch: %{rust_arches}
- rust-difference
ExclusiveArch: %{rust_arches}
- rust-diffus
ExclusiveArch: %{rust_arches}
- rust-diffus-derive
ExclusiveArch: %{rust_arches}
- rust-digest
ExclusiveArch: %{rust_arches}
- rust-digest0.8
ExclusiveArch: %{rust_arches}
- rust-directories
ExclusiveArch: %{rust_arches}
- rust-dirs
ExclusiveArch: %{rust_arches}
- rust-dirs-next
ExclusiveArch: %{rust_arches}
- rust-dirs-sys
ExclusiveArch: %{rust_arches}
- rust-dirs-sys-next
ExclusiveArch: %{rust_arches}
- rust-dirs2
ExclusiveArch: %{rust_arches}
- rust-diskonaut
ExclusiveArch: %{rust_arches}
- rust-dissimilar
ExclusiveArch: %{rust_arches}
- rust-dlib
ExclusiveArch: %{rust_arches}
- rust-dlv-list
ExclusiveArch: %{rust_arches}
- rust-dns-lookup
ExclusiveArch: %{rust_arches}
- rust-dns-parser
ExclusiveArch: %{rust_arches}
- rust-doc-comment
ExclusiveArch: %{rust_arches}
- rust-docmatic
ExclusiveArch: %{rust_arches}
- rust-docopt
ExclusiveArch: %{rust_arches}
- rust-dotenv
ExclusiveArch: %{rust_arches}
- rust-downcast-rs
ExclusiveArch: %{rust_arches}
- rust-dtoa
ExclusiveArch: %{rust_arches}
- rust-dtoa-short
ExclusiveArch: %{rust_arches}
- rust-dua-cli
ExclusiveArch: %{rust_arches}
- rust-duct
ExclusiveArch: %{rust_arches}
- rust-dummy
ExclusiveArch: %{rust_arches}
- rust-dunce
ExclusiveArch: %{rust_arches}
- rust-dutree
ExclusiveArch: %{rust_arches}
- rust-dyn-clone
ExclusiveArch: %{rust_arches}
- rust-easy-parallel
ExclusiveArch: %{rust_arches}
- rust-edit-distance
ExclusiveArch: %{rust_arches}
- rust-either
ExclusiveArch: %{rust_arches}
- rust-elasticlunr-rs
ExclusiveArch: %{rust_arches}
- rust-ena
ExclusiveArch: %{rust_arches}
- rust-encode_unicode
ExclusiveArch: %{rust_arches}
- rust-encoding
ExclusiveArch: %{rust_arches}
- rust-encoding-index-japanese
ExclusiveArch: %{rust_arches}
- rust-encoding-index-korean
ExclusiveArch: %{rust_arches}
- rust-encoding-index-simpchinese
ExclusiveArch: %{rust_arches}
- rust-encoding-index-singlebyte
ExclusiveArch: %{rust_arches}
- rust-encoding-index-tradchinese
ExclusiveArch: %{rust_arches}
- rust-encoding_index_tests
ExclusiveArch: %{rust_arches}
- rust-encoding_rs
ExclusiveArch: %{rust_arches}
- rust-encoding_rs_io
ExclusiveArch: %{rust_arches}
- rust-entities
ExclusiveArch: %{rust_arches}
- rust-enum-as-inner
ExclusiveArch: %{rust_arches}
- rust-enum-repr
ExclusiveArch: %{rust_arches}
- rust-enum_primitive
ExclusiveArch: %{rust_arches}
- rust-enumflags2
ExclusiveArch: %{rust_arches}
- rust-enumflags2_derive
ExclusiveArch: %{rust_arches}
- rust-env_logger
ExclusiveArch: %{rust_arches}
- rust-env_logger0.4
ExclusiveArch: %{rust_arches}
- rust-env_logger0.5
ExclusiveArch: %{rust_arches}
- rust-env_logger0.6
ExclusiveArch: %{rust_arches}
- rust-env_logger0.7
ExclusiveArch: %{rust_arches}
- rust-environment
ExclusiveArch: %{rust_arches}
- rust-envsubst
ExclusiveArch: %{rust_arches}
- rust-erased-serde
ExclusiveArch: %{rust_arches}
- rust-err-derive
ExclusiveArch: %{rust_arches}
- rust-errln
ExclusiveArch: %{rust_arches}
- rust-errno
ExclusiveArch: %{rust_arches}
- rust-error-chain
ExclusiveArch: %{rust_arches}
- rust-escaper
ExclusiveArch: %{rust_arches}
- rust-escargot
ExclusiveArch: %{rust_arches}
- rust-euclid
ExclusiveArch: %{rust_arches}
- rust-exa
ExclusiveArch: %{rust_arches}
- rust-expat-sys
ExclusiveArch: %{rust_arches}
- rust-extend
ExclusiveArch: %{rust_arches}
- rust-extprim
ExclusiveArch: %{rust_arches}
- rust-extprim_literals_macros
ExclusiveArch: %{rust_arches}
- rust-fail
ExclusiveArch: %{rust_arches}
- rust-failure
ExclusiveArch: %{rust_arches}
- rust-failure-tools
ExclusiveArch: %{rust_arches}
- rust-failure_derive
ExclusiveArch: %{rust_arches}
- rust-fake
ExclusiveArch: %{rust_arches}
- rust-fake-simd
ExclusiveArch: %{rust_arches}
- rust-fake_clock
ExclusiveArch: %{rust_arches}
- rust-fallible-iterator
ExclusiveArch: %{rust_arches}
- rust-fallible-streaming-iterator
ExclusiveArch: %{rust_arches}
- rust-fastrand
ExclusiveArch: %{rust_arches}
- rust-fbthrift_codegen_includer_proc_macro
ExclusiveArch: %{rust_arches}
- rust-fd-find
ExclusiveArch: %{rust_arches}
- rust-fdlimit
ExclusiveArch: %{rust_arches}
- rust-fedora
ExclusiveArch: %{rust_arches}
- rust-fedora-coreos-pinger
ExclusiveArch: %{rust_arches}
- rust-fedora-update-feedback
ExclusiveArch: %{rust_arches}
- rust-feed-rs
ExclusiveArch: %{rust_arches}
- rust-feedbin_api
ExclusiveArch: %{rust_arches}
- rust-feedly_api
ExclusiveArch: %{rust_arches}
- rust-fern
ExclusiveArch: %{rust_arches}
- rust-fever_api
ExclusiveArch: %{rust_arches}
- rust-ffsend
ExclusiveArch: %{rust_arches}
- rust-ffsend-api
ExclusiveArch: %{rust_arches}
- rust-filesize
ExclusiveArch: %{rust_arches}
- rust-filetime
ExclusiveArch: %{rust_arches}
- rust-findshlibs
ExclusiveArch: %{rust_arches}
- rust-fixedbitset
ExclusiveArch: %{rust_arches}
- rust-flame
ExclusiveArch: %{rust_arches}
- rust-flate2
ExclusiveArch: %{rust_arches}
- rust-float-cmp
ExclusiveArch: %{rust_arches}
- rust-float-cmp0.6
ExclusiveArch: %{rust_arches}
- rust-float-ord
ExclusiveArch: %{rust_arches}
- rust-flume
ExclusiveArch: %{rust_arches}
- rust-fnv
ExclusiveArch: %{rust_arches}
- rust-font-kit
ExclusiveArch: %{rust_arches}
- rust-foreign-types
ExclusiveArch: %{rust_arches}
- rust-foreign-types-macros
ExclusiveArch: %{rust_arches}
- rust-foreign-types-shared
ExclusiveArch: %{rust_arches}
- rust-foreign-types-shared0.1
ExclusiveArch: %{rust_arches}
- rust-foreign-types0.3
ExclusiveArch: %{rust_arches}
- rust-form_urlencoded
ExclusiveArch: %{rust_arches}
- rust-fragile
ExclusiveArch: %{rust_arches}
- rust-freetype
ExclusiveArch: %{rust_arches}
- rust-freetype-rs
ExclusiveArch: %{rust_arches}
- rust-freetype-sys
ExclusiveArch: %{rust_arches}
- rust-fs2
ExclusiveArch: %{rust_arches}
- rust-fs_extra
ExclusiveArch: %{rust_arches}
- rust-funty
ExclusiveArch: %{rust_arches}
- rust-fuse
ExclusiveArch: %{rust_arches}
- rust-futf
ExclusiveArch: %{rust_arches}
- rust-futures
ExclusiveArch: %{rust_arches}
- rust-futures-channel
ExclusiveArch: %{rust_arches}
- rust-futures-core
ExclusiveArch: %{rust_arches}
- rust-futures-cpupool
ExclusiveArch: %{rust_arches}
- rust-futures-executor
ExclusiveArch: %{rust_arches}
- rust-futures-io
ExclusiveArch: %{rust_arches}
- rust-futures-lite
ExclusiveArch: %{rust_arches}
- rust-futures-macro
ExclusiveArch: %{rust_arches}
- rust-futures-sink
ExclusiveArch: %{rust_arches}
- rust-futures-task
ExclusiveArch: %{rust_arches}
- rust-futures-timer
ExclusiveArch: %{rust_arches}
- rust-futures-util
ExclusiveArch: %{rust_arches}
- rust-futures0.1
ExclusiveArch: %{rust_arches}
- rust-fuzzy-matcher
ExclusiveArch: %{rust_arches}
- rust-fxhash
ExclusiveArch: %{rust_arches}
- rust-gcsf
ExclusiveArch: %{rust_arches}
- rust-gdk
ExclusiveArch: %{rust_arches}
- rust-gdk-pixbuf
ExclusiveArch: %{rust_arches}
- rust-gdk-pixbuf-sys
ExclusiveArch: %{rust_arches}
- rust-gdk-sys
ExclusiveArch: %{rust_arches}
- rust-generic-array
ExclusiveArch: %{rust_arches}
- rust-generic-array0.12
ExclusiveArch: %{rust_arches}
- rust-getch
ExclusiveArch: %{rust_arches}
- rust-gethostname
ExclusiveArch: %{rust_arches}
- rust-getopts
ExclusiveArch: %{rust_arches}
- rust-getrandom
ExclusiveArch: %{rust_arches}
- rust-getrandom0.1
ExclusiveArch: %{rust_arches}
- rust-gettext-rs
ExclusiveArch: %{rust_arches}
- rust-gettext-sys
ExclusiveArch: %{rust_arches}
- rust-ghash
ExclusiveArch: %{rust_arches}
- rust-ghost
ExclusiveArch: %{rust_arches}
- rust-gif
ExclusiveArch: %{rust_arches}
- rust-gif0.10
ExclusiveArch: %{rust_arches}
- rust-gimli
ExclusiveArch: %{rust_arches}
- rust-gio
ExclusiveArch: %{rust_arches}
- rust-gio-sys
ExclusiveArch: %{rust_arches}
- rust-gir-format-check
ExclusiveArch: %{rust_arches}
- rust-git-delta
ExclusiveArch: %{rust_arches}
- rust-git2
ExclusiveArch: %{rust_arches}
- rust-git2-curl
ExclusiveArch: %{rust_arches}
- rust-gitui
ExclusiveArch: %{rust_arches}
- rust-gl_generator
ExclusiveArch: %{rust_arches}
- rust-glib
ExclusiveArch: %{rust_arches}
- rust-glib-macros
ExclusiveArch: %{rust_arches}
- rust-glib-sys
ExclusiveArch: %{rust_arches}
- rust-glob
ExclusiveArch: %{rust_arches}
- rust-globset
ExclusiveArch: %{rust_arches}
- rust-globwalk
ExclusiveArch: %{rust_arches}
- rust-glutin
ExclusiveArch: %{rust_arches}
- rust-glutin_egl_sys
ExclusiveArch: %{rust_arches}
- rust-glutin_glx_sys
ExclusiveArch: %{rust_arches}
- rust-gobject-sys
ExclusiveArch: %{rust_arches}
- rust-goblin
ExclusiveArch: %{rust_arches}
- rust-google-drive3-fork
ExclusiveArch: %{rust_arches}
- rust-gptman
ExclusiveArch: %{rust_arches}
- rust-grep
ExclusiveArch: %{rust_arches}
- rust-grep-cli
ExclusiveArch: %{rust_arches}
- rust-grep-matcher
ExclusiveArch: %{rust_arches}
- rust-grep-pcre2
ExclusiveArch: %{rust_arches}
- rust-grep-printer
ExclusiveArch: %{rust_arches}
- rust-grep-regex
ExclusiveArch: %{rust_arches}
- rust-grep-searcher
ExclusiveArch: %{rust_arches}
- rust-groupable
ExclusiveArch: %{rust_arches}
- rust-gspell
ExclusiveArch: %{rust_arches}
- rust-gspell-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer
ExclusiveArch: %{rust_arches}
- rust-gstreamer-audio
ExclusiveArch: %{rust_arches}
- rust-gstreamer-audio-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-base
ExclusiveArch: %{rust_arches}
- rust-gstreamer-base-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-editing-services
ExclusiveArch: %{rust_arches}
- rust-gstreamer-editing-services-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-pbutils
ExclusiveArch: %{rust_arches}
- rust-gstreamer-pbutils-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-player
ExclusiveArch: %{rust_arches}
- rust-gstreamer-player-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-video
ExclusiveArch: %{rust_arches}
- rust-gstreamer-video-sys
ExclusiveArch: %{rust_arches}
- rust-gtk
ExclusiveArch: %{rust_arches}
- rust-gtk-macros
ExclusiveArch: %{rust_arches}
- rust-gtk-rs-lgpl-docs
ExclusiveArch: %{rust_arches}
- rust-gtk-source-sys
ExclusiveArch: %{rust_arches}
- rust-gtk-sys
ExclusiveArch: %{rust_arches}
- rust-gzip-header
ExclusiveArch: %{rust_arches}
- rust-h2
ExclusiveArch: %{rust_arches}
- rust-h2_0.2
ExclusiveArch: %{rust_arches}
- rust-half
ExclusiveArch: %{rust_arches}
- rust-hamcrest
ExclusiveArch: %{rust_arches}
- rust-handlebars
ExclusiveArch: %{rust_arches}
- rust-hashbrown
ExclusiveArch: %{rust_arches}
- rust-hashlink
ExclusiveArch: %{rust_arches}
- rust-headers
ExclusiveArch: %{rust_arches}
- rust-headers-core
ExclusiveArch: %{rust_arches}
- rust-headers-derive
ExclusiveArch: %{rust_arches}
- rust-heapsize
ExclusiveArch: %{rust_arches}
- rust-heatseeker
ExclusiveArch: %{rust_arches}
- rust-heck
ExclusiveArch: %{rust_arches}
- rust-hex
ExclusiveArch: %{rust_arches}
- rust-hex-literal
ExclusiveArch: %{rust_arches}
- rust-hex-literal-impl
ExclusiveArch: %{rust_arches}
- rust-hex-literal0.2
ExclusiveArch: %{rust_arches}
- rust-hexyl
ExclusiveArch: %{rust_arches}
- rust-hkdf
ExclusiveArch: %{rust_arches}
- rust-hmac
ExclusiveArch: %{rust_arches}
- rust-home
ExclusiveArch: %{rust_arches}
- rust-horrorshow
ExclusiveArch: %{rust_arches}
- rust-hostname
ExclusiveArch: %{rust_arches}
- rust-hostname-validator
ExclusiveArch: %{rust_arches}
- rust-html2pango
ExclusiveArch: %{rust_arches}
- rust-html5ever
ExclusiveArch: %{rust_arches}
- rust-http
ExclusiveArch: %{rust_arches}
- rust-http-body
ExclusiveArch: %{rust_arches}
- rust-http-body0.3
ExclusiveArch: %{rust_arches}
- rust-http0.1
ExclusiveArch: %{rust_arches}
- rust-httparse
ExclusiveArch: %{rust_arches}
- rust-httpdate
ExclusiveArch: %{rust_arches}
- rust-human-sort
ExclusiveArch: %{rust_arches}
- rust-humansize
ExclusiveArch: %{rust_arches}
- rust-humantime
ExclusiveArch: %{rust_arches}
- rust-humantime-serde
ExclusiveArch: %{rust_arches}
- rust-humantime1
ExclusiveArch: %{rust_arches}
- rust-hyper
ExclusiveArch: %{rust_arches}
- rust-hyper-native-tls
ExclusiveArch: %{rust_arches}
- rust-hyper-staticfile
ExclusiveArch: %{rust_arches}
- rust-hyper-tls
ExclusiveArch: %{rust_arches}
- rust-hyper-tls0.4
ExclusiveArch: %{rust_arches}
- rust-hyper0.10
ExclusiveArch: %{rust_arches}
- rust-hyper0.13
ExclusiveArch: %{rust_arches}
- rust-hyperfine
ExclusiveArch: %{rust_arches}
- rust-i3ipc
ExclusiveArch: %{rust_arches}
- rust-id_tree
ExclusiveArch: %{rust_arches}
- rust-ident_case
ExclusiveArch: %{rust_arches}
- rust-idna
ExclusiveArch: %{rust_arches}
- rust-idna0.1
ExclusiveArch: %{rust_arches}
- rust-ignore
ExclusiveArch: %{rust_arches}
- rust-im-rc
ExclusiveArch: %{rust_arches}
- rust-image
ExclusiveArch: %{rust_arches}
- rust-imgref
ExclusiveArch: %{rust_arches}
- rust-indexmap
ExclusiveArch: %{rust_arches}
- rust-indicatif
ExclusiveArch: %{rust_arches}
- rust-indoc
ExclusiveArch: %{rust_arches}
- rust-inflate
ExclusiveArch: %{rust_arches}
- rust-inotify
ExclusiveArch: %{rust_arches}
- rust-inotify-sys
ExclusiveArch: %{rust_arches}
- rust-input_buffer
ExclusiveArch: %{rust_arches}
- rust-insta
ExclusiveArch: %{rust_arches}
- rust-instant
ExclusiveArch: %{rust_arches}
- rust-interpolate_name
ExclusiveArch: %{rust_arches}
- rust-intervaltree
ExclusiveArch: %{rust_arches}
- rust-invalidstring
ExclusiveArch: %{rust_arches}
- rust-inventory
ExclusiveArch: %{rust_arches}
- rust-inventory-impl
ExclusiveArch: %{rust_arches}
- rust-iocuddle
ExclusiveArch: %{rust_arches}
- rust-iovec
ExclusiveArch: %{rust_arches}
- rust-ipnet
ExclusiveArch: %{rust_arches}
- rust-ipnetwork
ExclusiveArch: %{rust_arches}
- rust-iron
ExclusiveArch: %{rust_arches}
- rust-isahc
ExclusiveArch: %{rust_arches}
- rust-iso8601
ExclusiveArch: %{rust_arches}
- rust-iter-read
ExclusiveArch: %{rust_arches}
- rust-itertools
ExclusiveArch: %{rust_arches}
- rust-itertools-num
ExclusiveArch: %{rust_arches}
- rust-itertools0.8
ExclusiveArch: %{rust_arches}
- rust-itertools0.9
ExclusiveArch: %{rust_arches}
- rust-itoa
ExclusiveArch: %{rust_arches}
- rust-ivf
ExclusiveArch: %{rust_arches}
- rust-javascriptcore-rs
ExclusiveArch: %{rust_arches}
- rust-javascriptcore-rs-sys
ExclusiveArch: %{rust_arches}
- rust-jetscii
ExclusiveArch: %{rust_arches}
- rust-jieba-rs
ExclusiveArch: %{rust_arches}
- rust-jobserver
ExclusiveArch: %{rust_arches}
- rust-jpeg-decoder
ExclusiveArch: %{rust_arches}
- rust-jql
ExclusiveArch: %{rust_arches}
- rust-js-sys
ExclusiveArch: %{rust_arches}
- rust-js_int
ExclusiveArch: %{rust_arches}
- rust-json
ExclusiveArch: %{rust_arches}
- rust-jwalk
ExclusiveArch: %{rust_arches}
- rust-keccak
ExclusiveArch: %{rust_arches}
- rust-khronos_api
ExclusiveArch: %{rust_arches}
- rust-kstring
ExclusiveArch: %{rust_arches}
- rust-kv-log-macro
ExclusiveArch: %{rust_arches}
- rust-lab
ExclusiveArch: %{rust_arches}
- rust-lalrpop
ExclusiveArch: %{rust_arches}
- rust-lalrpop-util
ExclusiveArch: %{rust_arches}
- rust-language-tags
ExclusiveArch: %{rust_arches}
- rust-lazy-init
ExclusiveArch: %{rust_arches}
- rust-lazy_static
ExclusiveArch: %{rust_arches}
- rust-lazycell
ExclusiveArch: %{rust_arches}
- rust-leb128
ExclusiveArch: %{rust_arches}
- rust-letter-avatar
ExclusiveArch: %{rust_arches}
- rust-lexical-core
ExclusiveArch: %{rust_arches}
- rust-libc
ExclusiveArch: %{rust_arches}
- rust-libcryptsetup-rs
ExclusiveArch: %{rust_arches}
- rust-libcryptsetup-rs-sys
ExclusiveArch: %{rust_arches}
- rust-libdbus-sys
ExclusiveArch: %{rust_arches}
- rust-libflate
ExclusiveArch: %{rust_arches}
- rust-libflate_lz77
ExclusiveArch: %{rust_arches}
- rust-libgit2-sys
ExclusiveArch: %{rust_arches}
- rust-libhandy
ExclusiveArch: %{rust_arches}
- rust-libhandy-sys
ExclusiveArch: %{rust_arches}
- rust-libloading
ExclusiveArch: %{rust_arches}
- rust-libloading0.6
ExclusiveArch: %{rust_arches}
- rust-libm
ExclusiveArch: %{rust_arches}
- rust-libmount
ExclusiveArch: %{rust_arches}
- rust-libnotcurses-sys
ExclusiveArch: %{rust_arches}
- rust-liboverdrop
ExclusiveArch: %{rust_arches}
- rust-libpulse-binding
ExclusiveArch: %{rust_arches}
- rust-libpulse-sys
ExclusiveArch: %{rust_arches}
- rust-libslirp
ExclusiveArch: %{rust_arches}
- rust-libslirp-sys
ExclusiveArch: %{rust_arches}
- rust-libsqlite3-sys
ExclusiveArch: %{rust_arches}
- rust-libssh2-sys
ExclusiveArch: %{rust_arches}
- rust-libsystemd
ExclusiveArch: %{rust_arches}
- rust-libsystemd-sys
ExclusiveArch: %{rust_arches}
- rust-libudev
ExclusiveArch: %{rust_arches}
- rust-libudev-sys
ExclusiveArch: %{rust_arches}
- rust-libxml
ExclusiveArch: %{rust_arches}
- rust-libz-sys
ExclusiveArch: %{rust_arches}
- rust-line-wrap
ExclusiveArch: %{rust_arches}
- rust-line_drawing
ExclusiveArch: %{rust_arches}
- rust-link-cplusplus
ExclusiveArch: %{rust_arches}
- rust-linked-hash-map
ExclusiveArch: %{rust_arches}
- rust-linkify
ExclusiveArch: %{rust_arches}
- rust-lipsum
ExclusiveArch: %{rust_arches}
- rust-liquid
ExclusiveArch: %{rust_arches}
- rust-liquid-core
ExclusiveArch: %{rust_arches}
- rust-liquid-derive
ExclusiveArch: %{rust_arches}
- rust-liquid-lib
ExclusiveArch: %{rust_arches}
- rust-listenfd
ExclusiveArch: %{rust_arches}
- rust-lmdb
ExclusiveArch: %{rust_arches}
- rust-lmdb-sys
ExclusiveArch: %{rust_arches}
- rust-locale
ExclusiveArch: %{rust_arches}
- rust-locale_config
ExclusiveArch: %{rust_arches}
- rust-lock_api
ExclusiveArch: %{rust_arches}
- rust-lockfree
ExclusiveArch: %{rust_arches}
- rust-log
ExclusiveArch: %{rust_arches}
- rust-log-mdc
ExclusiveArch: %{rust_arches}
- rust-log-panics
ExclusiveArch: %{rust_arches}
- rust-log0.3
ExclusiveArch: %{rust_arches}
- rust-log4rs
ExclusiveArch: %{rust_arches}
- rust-loggerv
ExclusiveArch: %{rust_arches}
- rust-loopdev
ExclusiveArch: %{rust_arches}
- rust-lru-cache
ExclusiveArch: %{rust_arches}
- rust-lru_time_cache
ExclusiveArch: %{rust_arches}
- rust-lscolors
ExclusiveArch: %{rust_arches}
- rust-lsd
ExclusiveArch: %{rust_arches}
- rust-lzma-sys
ExclusiveArch: %{rust_arches}
- rust-lzw
ExclusiveArch: %{rust_arches}
- rust-mac
ExclusiveArch: %{rust_arches}
- rust-macro-attr
ExclusiveArch: %{rust_arches}
- rust-magic-crypt
ExclusiveArch: %{rust_arches}
- rust-maildir
ExclusiveArch: %{rust_arches}
- rust-mailparse
ExclusiveArch: %{rust_arches}
- rust-man
ExclusiveArch: %{rust_arches}
- rust-maplit
ExclusiveArch: %{rust_arches}
- rust-markup5ever
ExclusiveArch: %{rust_arches}
- rust-markup5ever_rcdom
ExclusiveArch: %{rust_arches}
- rust-match_cfg
ExclusiveArch: %{rust_arches}
- rust-matches
ExclusiveArch: %{rust_arches}
- rust-matrixmultiply
ExclusiveArch: %{rust_arches}
- rust-maxminddb
ExclusiveArch: %{rust_arches}
- rust-maybe-uninit
ExclusiveArch: %{rust_arches}
- rust-mbox
ExclusiveArch: %{rust_arches}
- rust-mbrman
ExclusiveArch: %{rust_arches}
- rust-md-5
ExclusiveArch: %{rust_arches}
- rust-md5
ExclusiveArch: %{rust_arches}
- rust-mdl
ExclusiveArch: %{rust_arches}
- rust-memchr
ExclusiveArch: %{rust_arches}
- rust-memmap
ExclusiveArch: %{rust_arches}
- rust-memmap2
ExclusiveArch: %{rust_arches}
- rust-memoffset
ExclusiveArch: %{rust_arches}
- rust-memoffset0.5
ExclusiveArch: %{rust_arches}
- rust-memsec
ExclusiveArch: %{rust_arches}
- rust-metadeps
ExclusiveArch: %{rust_arches}
- rust-migrations_internals
ExclusiveArch: %{rust_arches}
- rust-migrations_macros
ExclusiveArch: %{rust_arches}
- rust-mime
ExclusiveArch: %{rust_arches}
- rust-mime-sniffer
ExclusiveArch: %{rust_arches}
- rust-mime0.2
ExclusiveArch: %{rust_arches}
- rust-mime_guess
ExclusiveArch: %{rust_arches}
- rust-mime_guess1
ExclusiveArch: %{rust_arches}
- rust-miniflux_api
ExclusiveArch: %{rust_arches}
- rust-minify-html
ExclusiveArch: %{rust_arches}
- rust-miniz-sys
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide0.3
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide_c_api
ExclusiveArch: %{rust_arches}
- rust-mint
ExclusiveArch: %{rust_arches}
- rust-mio
ExclusiveArch: %{rust_arches}
- rust-mio-extras
ExclusiveArch: %{rust_arches}
- rust-mio-uds
ExclusiveArch: %{rust_arches}
- rust-mio0.6
ExclusiveArch: %{rust_arches}
- rust-mktemp
ExclusiveArch: %{rust_arches}
- rust-mnt
ExclusiveArch: %{rust_arches}
- rust-mockito
ExclusiveArch: %{rust_arches}
- rust-modifier
ExclusiveArch: %{rust_arches}
- rust-more-asserts
ExclusiveArch: %{rust_arches}
- rust-muldiv
ExclusiveArch: %{rust_arches}
- rust-multimap
ExclusiveArch: %{rust_arches}
- rust-multipart
ExclusiveArch: %{rust_arches}
- rust-mustache
ExclusiveArch: %{rust_arches}
- rust-nasm-rs
ExclusiveArch: %{rust_arches}
- rust-native-tls
ExclusiveArch: %{rust_arches}
- rust-natord
ExclusiveArch: %{rust_arches}
- rust-nb-connect
ExclusiveArch: %{rust_arches}
- rust-net2
ExclusiveArch: %{rust_arches}
- rust-netlink-packet-core
ExclusiveArch: %{rust_arches}
- rust-netlink-packet-route
ExclusiveArch: %{rust_arches}
- rust-netlink-packet-utils
ExclusiveArch: %{rust_arches}
- rust-netlink-proto
ExclusiveArch: %{rust_arches}
- rust-netlink-sys
ExclusiveArch: %{rust_arches}
- rust-netmap_sys
ExclusiveArch: %{rust_arches}
- rust-nettle
ExclusiveArch: %{rust_arches}
- rust-nettle-sys
ExclusiveArch: %{rust_arches}
- rust-new_debug_unreachable
ExclusiveArch: %{rust_arches}
- rust-news-flash
ExclusiveArch: %{rust_arches}
- rust-newsblur_api
ExclusiveArch: %{rust_arches}
- rust-newtype_derive
ExclusiveArch: %{rust_arches}
- rust-nickel
ExclusiveArch: %{rust_arches}
- rust-nix
ExclusiveArch: %{rust_arches}
- rust-nix0.14
ExclusiveArch: %{rust_arches}
- rust-nix0.17
ExclusiveArch: %{rust_arches}
- rust-nix0.18
ExclusiveArch: %{rust_arches}
- rust-no-panic
ExclusiveArch: %{rust_arches}
- rust-nodrop
ExclusiveArch: %{rust_arches}
- rust-nom
ExclusiveArch: %{rust_arches}
- rust-nom4
ExclusiveArch: %{rust_arches}
- rust-nom5
ExclusiveArch: %{rust_arches}
- rust-noop_proc_macro
ExclusiveArch: %{rust_arches}
- rust-normalize-line-endings
ExclusiveArch: %{rust_arches}
- rust-notify
ExclusiveArch: %{rust_arches}
- rust-notify-rust
ExclusiveArch: %{rust_arches}
- rust-num
ExclusiveArch: %{rust_arches}
- rust-num-bigint
ExclusiveArch: %{rust_arches}
- rust-num-bigint-dig
ExclusiveArch: %{rust_arches}
- rust-num-complex
ExclusiveArch: %{rust_arches}
- rust-num-derive
ExclusiveArch: %{rust_arches}
- rust-num-integer
ExclusiveArch: %{rust_arches}
- rust-num-iter
ExclusiveArch: %{rust_arches}
- rust-num-rational
ExclusiveArch: %{rust_arches}
- rust-num-traits
ExclusiveArch: %{rust_arches}
- rust-num-traits0.1
ExclusiveArch: %{rust_arches}
- rust-num_cpus
ExclusiveArch: %{rust_arches}
- rust-number_prefix
ExclusiveArch: %{rust_arches}
- rust-numtoa
ExclusiveArch: %{rust_arches}
- rust-oauth2
ExclusiveArch: %{rust_arches}
- rust-obfstr
ExclusiveArch: %{rust_arches}
- rust-object
ExclusiveArch: %{rust_arches}
- rust-odds
ExclusiveArch: %{rust_arches}
- rust-oid
ExclusiveArch: %{rust_arches}
- rust-once_cell
ExclusiveArch: %{rust_arches}
- rust-onig
ExclusiveArch: %{rust_arches}
- rust-onig_sys
ExclusiveArch: %{rust_arches}
- rust-oorandom
ExclusiveArch: %{rust_arches}
- rust-opaque-debug
ExclusiveArch: %{rust_arches}
- rust-open
ExclusiveArch: %{rust_arches}
- rust-openat
ExclusiveArch: %{rust_arches}
- rust-openat-ext
ExclusiveArch: %{rust_arches}
- rust-opener
ExclusiveArch: %{rust_arches}
- rust-openssh-keys
ExclusiveArch: %{rust_arches}
- rust-openssl
ExclusiveArch: %{rust_arches}
- rust-openssl-probe
ExclusiveArch: %{rust_arches}
- rust-openssl-sys
ExclusiveArch: %{rust_arches}
- rust-ord_subset
ExclusiveArch: %{rust_arches}
- rust-ordered-float
ExclusiveArch: %{rust_arches}
- rust-ordered-multimap
ExclusiveArch: %{rust_arches}
- rust-os_info
ExclusiveArch: %{rust_arches}
- rust-os_pipe
ExclusiveArch: %{rust_arches}
- rust-os_str_bytes
ExclusiveArch: %{rust_arches}
- rust-osmesa-sys
ExclusiveArch: %{rust_arches}
- rust-osstrtools
ExclusiveArch: %{rust_arches}
- rust-ostree
ExclusiveArch: %{rust_arches}
- rust-ostree-sys
ExclusiveArch: %{rust_arches}
- rust-owned-alloc
ExclusiveArch: %{rust_arches}
- rust-owned_ttf_parser
ExclusiveArch: %{rust_arches}
- rust-owning_ref
ExclusiveArch: %{rust_arches}
- rust-packaging
ExclusiveArch: %{rust_arches}
- rust-pad
ExclusiveArch: %{rust_arches}
- rust-pager
ExclusiveArch: %{rust_arches}
- rust-palette
ExclusiveArch: %{rust_arches}
- rust-palette_derive
ExclusiveArch: %{rust_arches}
- rust-pango
ExclusiveArch: %{rust_arches}
- rust-pango-sys
ExclusiveArch: %{rust_arches}
- rust-pangocairo
ExclusiveArch: %{rust_arches}
- rust-pangocairo-sys
ExclusiveArch: %{rust_arches}
- rust-parity-wasm
ExclusiveArch: %{rust_arches}
- rust-parking
ExclusiveArch: %{rust_arches}
- rust-parking_lot
ExclusiveArch: %{rust_arches}
- rust-parking_lot_core
ExclusiveArch: %{rust_arches}
- rust-parse-zoneinfo
ExclusiveArch: %{rust_arches}
- rust-parse_cfg
ExclusiveArch: %{rust_arches}
- rust-parsec-client
ExclusiveArch: %{rust_arches}
- rust-parsec-interface
ExclusiveArch: %{rust_arches}
- rust-partial-io
ExclusiveArch: %{rust_arches}
- rust-paste
ExclusiveArch: %{rust_arches}
- rust-paste-impl
ExclusiveArch: %{rust_arches}
- rust-path-absolutize
ExclusiveArch: %{rust_arches}
- rust-path-dedot
ExclusiveArch: %{rust_arches}
- rust-path-slash
ExclusiveArch: %{rust_arches}
- rust-pathdiff
ExclusiveArch: %{rust_arches}
- rust-pathfinder_geometry
ExclusiveArch: %{rust_arches}
- rust-pathfinder_simd
ExclusiveArch: %{rust_arches}
- rust-pbr
ExclusiveArch: %{rust_arches}
- rust-pcap
ExclusiveArch: %{rust_arches}
- rust-pcre2
ExclusiveArch: %{rust_arches}
- rust-pcre2-sys
ExclusiveArch: %{rust_arches}
- rust-peeking_take_while
ExclusiveArch: %{rust_arches}
- rust-peg
ExclusiveArch: %{rust_arches}
- rust-peg-macros
ExclusiveArch: %{rust_arches}
- rust-peg-runtime
ExclusiveArch: %{rust_arches}
- rust-peg0.5
ExclusiveArch: %{rust_arches}
- rust-pem
ExclusiveArch: %{rust_arches}
- rust-percent-encoding
ExclusiveArch: %{rust_arches}
- rust-percent-encoding1
ExclusiveArch: %{rust_arches}
- rust-peresil
ExclusiveArch: %{rust_arches}
- rust-permutate
ExclusiveArch: %{rust_arches}
- rust-permutohedron
ExclusiveArch: %{rust_arches}
- rust-pest
ExclusiveArch: %{rust_arches}
- rust-pest_derive
ExclusiveArch: %{rust_arches}
- rust-pest_generator
ExclusiveArch: %{rust_arches}
- rust-pest_meta
ExclusiveArch: %{rust_arches}
- rust-petgraph
ExclusiveArch: %{rust_arches}
- rust-phf
ExclusiveArch: %{rust_arches}
- rust-phf0.7
ExclusiveArch: %{rust_arches}
- rust-phf_codegen
ExclusiveArch: %{rust_arches}
- rust-phf_codegen0.7
ExclusiveArch: %{rust_arches}
- rust-phf_generator
ExclusiveArch: %{rust_arches}
- rust-phf_generator0.7
ExclusiveArch: %{rust_arches}
- rust-phf_macros
ExclusiveArch: %{rust_arches}
- rust-phf_macros0.7
ExclusiveArch: %{rust_arches}
- rust-phf_shared
ExclusiveArch: %{rust_arches}
- rust-phf_shared0.7
ExclusiveArch: %{rust_arches}
- rust-picky-asn1
ExclusiveArch: %{rust_arches}
- rust-picky-asn1-der
ExclusiveArch: %{rust_arches}
- rust-picky-asn1-x509
ExclusiveArch: %{rust_arches}
- rust-pico-args
ExclusiveArch: %{rust_arches}
- rust-pin-project
ExclusiveArch: %{rust_arches}
- rust-pin-project-internal
ExclusiveArch: %{rust_arches}
- rust-pin-project-internal0.4
ExclusiveArch: %{rust_arches}
- rust-pin-project-lite
ExclusiveArch: %{rust_arches}
- rust-pin-project-lite0.1
ExclusiveArch: %{rust_arches}
- rust-pin-project0.4
ExclusiveArch: %{rust_arches}
- rust-pin-utils
ExclusiveArch: %{rust_arches}
- rust-pipe
ExclusiveArch: %{rust_arches}
- rust-piper
ExclusiveArch: %{rust_arches}
- rust-pkcs11
ExclusiveArch: %{rust_arches}
- rust-pkg-config
ExclusiveArch: %{rust_arches}
- rust-plain
ExclusiveArch: %{rust_arches}
- rust-platform-dirs
ExclusiveArch: %{rust_arches}
- rust-platforms
ExclusiveArch: %{rust_arches}
- rust-plist
ExclusiveArch: %{rust_arches}
- rust-plotters
ExclusiveArch: %{rust_arches}
- rust-plugin
ExclusiveArch: %{rust_arches}
- rust-pnet_base
ExclusiveArch: %{rust_arches}
- rust-pnet_datalink
ExclusiveArch: %{rust_arches}
- rust-pnet_sys
ExclusiveArch: %{rust_arches}
- rust-png
ExclusiveArch: %{rust_arches}
- rust-podio
ExclusiveArch: %{rust_arches}
- rust-polling
ExclusiveArch: %{rust_arches}
- rust-polyval
ExclusiveArch: %{rust_arches}
- rust-pommes
ExclusiveArch: %{rust_arches}
- rust-ppv-lite86
ExclusiveArch: %{rust_arches}
- rust-pq-sys
ExclusiveArch: %{rust_arches}
- rust-precomputed-hash
ExclusiveArch: %{rust_arches}
- rust-predicates
ExclusiveArch: %{rust_arches}
- rust-predicates-core
ExclusiveArch: %{rust_arches}
- rust-predicates-tree
ExclusiveArch: %{rust_arches}
- rust-pretty-git-prompt
ExclusiveArch: %{rust_arches}
- rust-pretty-hex
ExclusiveArch: %{rust_arches}
- rust-pretty_assertions
ExclusiveArch: %{rust_arches}
- rust-pretty_assertions0.6
ExclusiveArch: %{rust_arches}
- rust-pretty_env_logger
ExclusiveArch: %{rust_arches}
- rust-prettytable-rs
ExclusiveArch: %{rust_arches}
- rust-proc-macro-crate
ExclusiveArch: %{rust_arches}
- rust-proc-macro-error
ExclusiveArch: %{rust_arches}
- rust-proc-macro-error-attr
ExclusiveArch: %{rust_arches}
- rust-proc-macro-hack
ExclusiveArch: %{rust_arches}
- rust-proc-macro-nested
ExclusiveArch: %{rust_arches}
- rust-proc-macro2
ExclusiveArch: %{rust_arches}
- rust-proc-macro2-0.4
ExclusiveArch: %{rust_arches}
- rust-proc-quote
ExclusiveArch: %{rust_arches}
- rust-proc-quote-impl
ExclusiveArch: %{rust_arches}
- rust-procedural-masquerade
ExclusiveArch: %{rust_arches}
- rust-process_path
ExclusiveArch: %{rust_arches}
- rust-procfs
ExclusiveArch: %{rust_arches}
- rust-procfs0.8
ExclusiveArch: %{rust_arches}
- rust-procs
ExclusiveArch: %{rust_arches}
- rust-progress-streams
ExclusiveArch: %{rust_arches}
- rust-prometheus
ExclusiveArch: %{rust_arches}
- rust-proptest
ExclusiveArch: %{rust_arches}
- rust-proptest-derive
ExclusiveArch: %{rust_arches}
- rust-prost
ExclusiveArch: %{rust_arches}
- rust-prost-build
ExclusiveArch: %{rust_arches}
- rust-prost-derive
ExclusiveArch: %{rust_arches}
- rust-prost-types
ExclusiveArch: %{rust_arches}
- rust-protobuf
ExclusiveArch: %{rust_arches}
- rust-protobuf-codegen
ExclusiveArch: %{rust_arches}
- rust-protobuf-codegen-pure
ExclusiveArch: %{rust_arches}
- rust-protoc
ExclusiveArch: %{rust_arches}
- rust-protoc-rust
ExclusiveArch: %{rust_arches}
- rust-psa-crypto
ExclusiveArch: %{rust_arches}
- rust-psa-crypto-sys
ExclusiveArch: %{rust_arches}
- rust-psm
ExclusiveArch: %{rust_arches}
- rust-psutil
ExclusiveArch: %{rust_arches}
- rust-publicsuffix
ExclusiveArch: %{rust_arches}
- rust-pulldown-cmark
ExclusiveArch: %{rust_arches}
- rust-pulse
ExclusiveArch: %{rust_arches}
- rust-pure-rust-locales
ExclusiveArch: %{rust_arches}
- rust-pyo3
ExclusiveArch: %{rust_arches}
- rust-pyo3-macros
ExclusiveArch: %{rust_arches}
- rust-pyo3-macros-backend
ExclusiveArch: %{rust_arches}
- rust-python3-sys
ExclusiveArch: %{rust_arches}
- rust-qr2term
ExclusiveArch: %{rust_arches}
- rust-qrcode
ExclusiveArch: %{rust_arches}
- rust-qstring
ExclusiveArch: %{rust_arches}
- rust-quick-error
ExclusiveArch: %{rust_arches}
- rust-quick-error1
ExclusiveArch: %{rust_arches}
- rust-quick-xml
ExclusiveArch: %{rust_arches}
- rust-quickcheck
ExclusiveArch: %{rust_arches}
- rust-quickcheck0.6
ExclusiveArch: %{rust_arches}
- rust-quickcheck0.9
ExclusiveArch: %{rust_arches}
- rust-quickcheck_macros
ExclusiveArch: %{rust_arches}
- rust-quickersort
ExclusiveArch: %{rust_arches}
- rust-quote
ExclusiveArch: %{rust_arches}
- rust-quote0.3
ExclusiveArch: %{rust_arches}
- rust-quote0.6
ExclusiveArch: %{rust_arches}
- rust-quoted_printable
ExclusiveArch: %{rust_arches}
- rust-r2d2
ExclusiveArch: %{rust_arches}
- rust-radium
ExclusiveArch: %{rust_arches}
- rust-rand
ExclusiveArch: %{rust_arches}
- rust-rand0.4
ExclusiveArch: %{rust_arches}
- rust-rand0.5
ExclusiveArch: %{rust_arches}
- rust-rand0.6
ExclusiveArch: %{rust_arches}
- rust-rand0.7
ExclusiveArch: %{rust_arches}
- rust-rand_chacha
ExclusiveArch: %{rust_arches}
- rust-rand_chacha0.1
ExclusiveArch: %{rust_arches}
- rust-rand_chacha0.2
ExclusiveArch: %{rust_arches}
- rust-rand_core
ExclusiveArch: %{rust_arches}
- rust-rand_core0.3
ExclusiveArch: %{rust_arches}
- rust-rand_core0.4
ExclusiveArch: %{rust_arches}
- rust-rand_core0.5
ExclusiveArch: %{rust_arches}
- rust-rand_distr
ExclusiveArch: %{rust_arches}
- rust-rand_distr0.2
ExclusiveArch: %{rust_arches}
- rust-rand_hc
ExclusiveArch: %{rust_arches}
- rust-rand_hc0.1
ExclusiveArch: %{rust_arches}
- rust-rand_isaac
ExclusiveArch: %{rust_arches}
- rust-rand_isaac0.1
ExclusiveArch: %{rust_arches}
- rust-rand_jitter
ExclusiveArch: %{rust_arches}
- rust-rand_jitter0.1
ExclusiveArch: %{rust_arches}
- rust-rand_os
ExclusiveArch: %{rust_arches}
- rust-rand_os0.1
ExclusiveArch: %{rust_arches}
- rust-rand_pcg
ExclusiveArch: %{rust_arches}
- rust-rand_pcg0.1
ExclusiveArch: %{rust_arches}
- rust-rand_pcg0.2
ExclusiveArch: %{rust_arches}
- rust-rand_xorshift
ExclusiveArch: %{rust_arches}
- rust-rand_xorshift0.1
ExclusiveArch: %{rust_arches}
- rust-rand_xoshiro
ExclusiveArch: %{rust_arches}
- rust-random-fast-rng
ExclusiveArch: %{rust_arches}
- rust-random-trait
ExclusiveArch: %{rust_arches}
- rust-randomize
ExclusiveArch: %{rust_arches}
- rust-rav1e
ExclusiveArch: %{rust_arches}
- rust-raw-window-handle
ExclusiveArch: %{rust_arches}
- rust-rawpointer
ExclusiveArch: %{rust_arches}
- rust-rawslice
ExclusiveArch: %{rust_arches}
- rust-rayon
ExclusiveArch: %{rust_arches}
- rust-rayon-core
ExclusiveArch: %{rust_arches}
- rust-readability-fork
ExclusiveArch: %{rust_arches}
- rust-readwrite
ExclusiveArch: %{rust_arches}
- rust-recycler
ExclusiveArch: %{rust_arches}
- rust-ref-cast
ExclusiveArch: %{rust_arches}
- rust-ref-cast-impl
ExclusiveArch: %{rust_arches}
- rust-regex
ExclusiveArch: %{rust_arches}
- rust-regex-automata
ExclusiveArch: %{rust_arches}
- rust-regex-syntax
ExclusiveArch: %{rust_arches}
- rust-region
ExclusiveArch: %{rust_arches}
- rust-relative-path
ExclusiveArch: %{rust_arches}
- rust-relay
ExclusiveArch: %{rust_arches}
- rust-remove_dir_all
ExclusiveArch: %{rust_arches}
- rust-reqwest
ExclusiveArch: %{rust_arches}
- rust-reqwest0.10
ExclusiveArch: %{rust_arches}
- rust-resize
ExclusiveArch: %{rust_arches}
- rust-resolv-conf
ExclusiveArch: %{rust_arches}
- rust-restson
ExclusiveArch: %{rust_arches}
- rust-retry
ExclusiveArch: %{rust_arches}
- rust-rgb
ExclusiveArch: %{rust_arches}
- rust-ring
ExclusiveArch: %{rust_arches}
- rust-ripgrep
ExclusiveArch: %{rust_arches}
- rust-rle-decode-fast
ExclusiveArch: %{rust_arches}
- rust-rmp
ExclusiveArch: %{rust_arches}
- rust-rmp-serde
ExclusiveArch: %{rust_arches}
- rust-roff
ExclusiveArch: %{rust_arches}
- rust-ron
ExclusiveArch: %{rust_arches}
- rust-roxmltree
ExclusiveArch: %{rust_arches}
- rust-rpassword
ExclusiveArch: %{rust_arches}
- rust-rpick
ExclusiveArch: %{rust_arches}
- rust-rsa
ExclusiveArch: %{rust_arches}
- rust-rspec
ExclusiveArch: %{rust_arches}
- rust-rtnetlink
ExclusiveArch: %{rust_arches}
- rust-ruma
ExclusiveArch: %{rust_arches}
- rust-ruma-api
ExclusiveArch: %{rust_arches}
- rust-ruma-api-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-appservice-api
ExclusiveArch: %{rust_arches}
- rust-ruma-client-api
ExclusiveArch: %{rust_arches}
- rust-ruma-common
ExclusiveArch: %{rust_arches}
- rust-ruma-events
ExclusiveArch: %{rust_arches}
- rust-ruma-events-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-federation-api
ExclusiveArch: %{rust_arches}
- rust-ruma-identifiers
ExclusiveArch: %{rust_arches}
- rust-ruma-identifiers-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-identifiers-validation
ExclusiveArch: %{rust_arches}
- rust-ruma-identity-service-api
ExclusiveArch: %{rust_arches}
- rust-ruma-push-gateway-api
ExclusiveArch: %{rust_arches}
- rust-ruma-serde
ExclusiveArch: %{rust_arches}
- rust-ruma-serde-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-signatures
ExclusiveArch: %{rust_arches}
- rust-rusqlite
ExclusiveArch: %{rust_arches}
- rust-rust-embed
ExclusiveArch: %{rust_arches}
- rust-rust-embed-impl
ExclusiveArch: %{rust_arches}
- rust-rust-embed-utils
ExclusiveArch: %{rust_arches}
- rust-rust-ini
ExclusiveArch: %{rust_arches}
- rust-rust-stemmers
ExclusiveArch: %{rust_arches}
- rust-rust_decimal
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_normal_macro
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_proc_macro
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_sys
ExclusiveArch: %{rust_arches}
- rust-rustc-demangle
ExclusiveArch: %{rust_arches}
- rust-rustc-hash
ExclusiveArch: %{rust_arches}
- rust-rustc-serialize
ExclusiveArch: %{rust_arches}
- rust-rustc-test
ExclusiveArch: %{rust_arches}
- rust-rustc_tools_util
ExclusiveArch: %{rust_arches}
- rust-rustc_version
ExclusiveArch: %{rust_arches}
- rust-rustdoc-stripper
ExclusiveArch: %{rust_arches}
- rust-rustfilt
ExclusiveArch: %{rust_arches}
- rust-rustfix
ExclusiveArch: %{rust_arches}
- rust-rustio
ExclusiveArch: %{rust_arches}
- rust-rusttype
ExclusiveArch: %{rust_arches}
- rust-rustversion
ExclusiveArch: %{rust_arches}
- rust-rusty-fork
ExclusiveArch: %{rust_arches}
- rust-rustyline
ExclusiveArch: %{rust_arches}
- rust-rustyline-derive
ExclusiveArch: %{rust_arches}
- rust-ryu
ExclusiveArch: %{rust_arches}
- rust-safe-transmute
ExclusiveArch: %{rust_arches}
- rust-safemem
ExclusiveArch: %{rust_arches}
- rust-same-file
ExclusiveArch: %{rust_arches}
- rust-sass-rs
ExclusiveArch: %{rust_arches}
- rust-sass-sys
ExclusiveArch: %{rust_arches}
- rust-scan_fmt
ExclusiveArch: %{rust_arches}
- rust-scheduled-thread-pool
ExclusiveArch: %{rust_arches}
- rust-scoped-tls
ExclusiveArch: %{rust_arches}
- rust-scoped-tls-hkt
ExclusiveArch: %{rust_arches}
- rust-scoped_threadpool
ExclusiveArch: %{rust_arches}
- rust-scopeguard
ExclusiveArch: %{rust_arches}
- rust-scopetime
ExclusiveArch: %{rust_arches}
- rust-scratch
ExclusiveArch: %{rust_arches}
- rust-scroll
ExclusiveArch: %{rust_arches}
- rust-scroll_derive
ExclusiveArch: %{rust_arches}
- rust-sct
ExclusiveArch: %{rust_arches}
- rust-sd
ExclusiveArch: %{rust_arches}
- rust-sd-notify
ExclusiveArch: %{rust_arches}
- rust-seahash
ExclusiveArch: %{rust_arches}
- rust-seahash3
ExclusiveArch: %{rust_arches}
- rust-secrecy
ExclusiveArch: %{rust_arches}
- rust-secret-service
ExclusiveArch: %{rust_arches}
- rust-semver
ExclusiveArch: %{rust_arches}
- rust-semver-parser
ExclusiveArch: %{rust_arches}
- rust-semver-parser0.7
ExclusiveArch: %{rust_arches}
- rust-semver-parser0.9
ExclusiveArch: %{rust_arches}
- rust-semver0.10
ExclusiveArch: %{rust_arches}
- rust-semver0.9
ExclusiveArch: %{rust_arches}
- rust-sequoia-autocrypt
ExclusiveArch: %{rust_arches}
- rust-sequoia-ipc
ExclusiveArch: %{rust_arches}
- rust-sequoia-keyring-linter
ExclusiveArch: %{rust_arches}
- rust-sequoia-net
ExclusiveArch: %{rust_arches}
- rust-sequoia-octopus-librnp
ExclusiveArch: %{rust_arches}
- rust-sequoia-openpgp
ExclusiveArch: %{rust_arches}
- rust-sequoia-sop
ExclusiveArch: %{rust_arches}
- rust-sequoia-sq
ExclusiveArch: %{rust_arches}
- rust-sequoia-sqv
ExclusiveArch: %{rust_arches}
- rust-serde
ExclusiveArch: %{rust_arches}
- rust-serde-big-array
ExclusiveArch: %{rust_arches}
- rust-serde-pickle
ExclusiveArch: %{rust_arches}
- rust-serde-value
ExclusiveArch: %{rust_arches}
- rust-serde-xml-rs
ExclusiveArch: %{rust_arches}
- rust-serde_bytes
ExclusiveArch: %{rust_arches}
- rust-serde_cbor
ExclusiveArch: %{rust_arches}
- rust-serde_derive
ExclusiveArch: %{rust_arches}
- rust-serde_ignored
ExclusiveArch: %{rust_arches}
- rust-serde_json
ExclusiveArch: %{rust_arches}
- rust-serde_repr
ExclusiveArch: %{rust_arches}
- rust-serde_stacker
ExclusiveArch: %{rust_arches}
- rust-serde_test
ExclusiveArch: %{rust_arches}
- rust-serde_url_params
ExclusiveArch: %{rust_arches}
- rust-serde_urlencoded
ExclusiveArch: %{rust_arches}
- rust-serde_urlencoded0.6
ExclusiveArch: %{rust_arches}
- rust-serde_with_macros
ExclusiveArch: %{rust_arches}
- rust-serde_yaml
ExclusiveArch: %{rust_arches}
- rust-serial_test
ExclusiveArch: %{rust_arches}
- rust-serial_test_derive
ExclusiveArch: %{rust_arches}
- rust-servo-fontconfig
ExclusiveArch: %{rust_arches}
- rust-servo-fontconfig-sys
ExclusiveArch: %{rust_arches}
- rust-sev
ExclusiveArch: %{rust_arches}
- rust-sevctl
ExclusiveArch: %{rust_arches}
- rust-sha-1
ExclusiveArch: %{rust_arches}
- rust-sha1
ExclusiveArch: %{rust_arches}
- rust-sha1collisiondetection
ExclusiveArch: %{rust_arches}
- rust-sha2
ExclusiveArch: %{rust_arches}
- rust-sha3
ExclusiveArch: %{rust_arches}
- rust-shared_child
ExclusiveArch: %{rust_arches}
- rust-shared_library
ExclusiveArch: %{rust_arches}
- rust-shell-escape
ExclusiveArch: %{rust_arches}
- rust-shell-words
ExclusiveArch: %{rust_arches}
- rust-shellexpand
ExclusiveArch: %{rust_arches}
- rust-shlex
ExclusiveArch: %{rust_arches}
- rust-signal-hook
ExclusiveArch: %{rust_arches}
- rust-signal-hook-registry
ExclusiveArch: %{rust_arches}
- rust-signal-hook0.1
ExclusiveArch: %{rust_arches}
- rust-silver
ExclusiveArch: %{rust_arches}
- rust-simd_helpers
ExclusiveArch: %{rust_arches}
- rust-simple_asn1
ExclusiveArch: %{rust_arches}
- rust-simple_logger
ExclusiveArch: %{rust_arches}
- rust-simplelog
ExclusiveArch: %{rust_arches}
- rust-siphasher
ExclusiveArch: %{rust_arches}
- rust-size
ExclusiveArch: %{rust_arches}
- rust-sized-chunks
ExclusiveArch: %{rust_arches}
- rust-skeptic
ExclusiveArch: %{rust_arches}
- rust-skim
ExclusiveArch: %{rust_arches}
- rust-slab
ExclusiveArch: %{rust_arches}
- rust-slash-formatter
ExclusiveArch: %{rust_arches}
- rust-slice-deque
ExclusiveArch: %{rust_arches}
- rust-slog
ExclusiveArch: %{rust_arches}
- rust-slog-async
ExclusiveArch: %{rust_arches}
- rust-slog-scope
ExclusiveArch: %{rust_arches}
- rust-slog-term
ExclusiveArch: %{rust_arches}
- rust-slotmap
ExclusiveArch: %{rust_arches}
- rust-slug
ExclusiveArch: %{rust_arches}
- rust-sluice
ExclusiveArch: %{rust_arches}
- rust-smallvec
ExclusiveArch: %{rust_arches}
- rust-smart-default
ExclusiveArch: %{rust_arches}
- rust-smawk
ExclusiveArch: %{rust_arches}
- rust-smithay-client-toolkit
ExclusiveArch: %{rust_arches}
- rust-smithay-clipboard
ExclusiveArch: %{rust_arches}
- rust-snafu
ExclusiveArch: %{rust_arches}
- rust-snafu-derive
ExclusiveArch: %{rust_arches}
- rust-snake_case
ExclusiveArch: %{rust_arches}
- rust-snowflake
ExclusiveArch: %{rust_arches}
- rust-socket2
ExclusiveArch: %{rust_arches}
- rust-socket2_0.3
ExclusiveArch: %{rust_arches}
- rust-soup-sys
ExclusiveArch: %{rust_arches}
- rust-sourceview
ExclusiveArch: %{rust_arches}
- rust-spin
ExclusiveArch: %{rust_arches}
- rust-spin_on
ExclusiveArch: %{rust_arches}
- rust-spinning_top
ExclusiveArch: %{rust_arches}
- rust-spmc
ExclusiveArch: %{rust_arches}
- rust-ssh-key-dir
ExclusiveArch: %{rust_arches}
- rust-stable_deref_trait
ExclusiveArch: %{rust_arches}
- rust-stacker
ExclusiveArch: %{rust_arches}
- rust-standback
ExclusiveArch: %{rust_arches}
- rust-starship
ExclusiveArch: %{rust_arches}
- rust-starship_module_config_derive
ExclusiveArch: %{rust_arches}
- rust-static_assertions
ExclusiveArch: %{rust_arches}
- rust-statistical
ExclusiveArch: %{rust_arches}
- rust-stb_truetype
ExclusiveArch: %{rust_arches}
- rust-streaming-stats
ExclusiveArch: %{rust_arches}
- rust-string
ExclusiveArch: %{rust_arches}
- rust-string_cache
ExclusiveArch: %{rust_arches}
- rust-string_cache_codegen
ExclusiveArch: %{rust_arches}
- rust-string_cache_shared
ExclusiveArch: %{rust_arches}
- rust-strings
ExclusiveArch: %{rust_arches}
- rust-strip-ansi-escapes
ExclusiveArch: %{rust_arches}
- rust-strsim
ExclusiveArch: %{rust_arches}
- rust-structopt
ExclusiveArch: %{rust_arches}
- rust-structopt-derive
ExclusiveArch: %{rust_arches}
- rust-structopt-derive0.2
ExclusiveArch: %{rust_arches}
- rust-structopt0.2
ExclusiveArch: %{rust_arches}
- rust-strum
ExclusiveArch: %{rust_arches}
- rust-strum_macros
ExclusiveArch: %{rust_arches}
- rust-subtle
ExclusiveArch: %{rust_arches}
- rust-sudo_plugin
ExclusiveArch: %{rust_arches}
- rust-sudo_plugin-sys
ExclusiveArch: %{rust_arches}
- rust-sval
ExclusiveArch: %{rust_arches}
- rust-sval_derive
ExclusiveArch: %{rust_arches}
- rust-svg_metadata
ExclusiveArch: %{rust_arches}
- rust-sxd-document
ExclusiveArch: %{rust_arches}
- rust-syn
ExclusiveArch: %{rust_arches}
- rust-syn-mid
ExclusiveArch: %{rust_arches}
- rust-syn0.15
ExclusiveArch: %{rust_arches}
- rust-synom
ExclusiveArch: %{rust_arches}
- rust-synstructure
ExclusiveArch: %{rust_arches}
- rust-syntect
ExclusiveArch: %{rust_arches}
- rust-sys-info
ExclusiveArch: %{rust_arches}
- rust-sysinfo
ExclusiveArch: %{rust_arches}
- rust-system-deps
ExclusiveArch: %{rust_arches}
- rust-systemd
ExclusiveArch: %{rust_arches}
- rust-tabwriter
ExclusiveArch: %{rust_arches}
- rust-take
ExclusiveArch: %{rust_arches}
- rust-take_mut
ExclusiveArch: %{rust_arches}
- rust-tap
ExclusiveArch: %{rust_arches}
- rust-tar
ExclusiveArch: %{rust_arches}
- rust-target-lexicon
ExclusiveArch: %{rust_arches}
- rust-tealdeer
ExclusiveArch: %{rust_arches}
- rust-teloxide
ExclusiveArch: %{rust_arches}
- rust-teloxide-macros
ExclusiveArch: %{rust_arches}
- rust-tempdir
ExclusiveArch: %{rust_arches}
- rust-tempfile
ExclusiveArch: %{rust_arches}
- rust-tendril
ExclusiveArch: %{rust_arches}
- rust-tera
ExclusiveArch: %{rust_arches}
- rust-term
ExclusiveArch: %{rust_arches}
- rust-term_grid
ExclusiveArch: %{rust_arches}
- rust-term_size
ExclusiveArch: %{rust_arches}
- rust-termcolor
ExclusiveArch: %{rust_arches}
- rust-terminal_size
ExclusiveArch: %{rust_arches}
- rust-terminfo
ExclusiveArch: %{rust_arches}
- rust-termion
ExclusiveArch: %{rust_arches}
- rust-termios
ExclusiveArch: %{rust_arches}
- rust-test-assembler
ExclusiveArch: %{rust_arches}
- rust-tester
ExclusiveArch: %{rust_arches}
- rust-testing_logger
ExclusiveArch: %{rust_arches}
- rust-textwrap
ExclusiveArch: %{rust_arches}
- rust-textwrap0.11
ExclusiveArch: %{rust_arches}
- rust-textwrap0.12
ExclusiveArch: %{rust_arches}
- rust-thiserror
ExclusiveArch: %{rust_arches}
- rust-thiserror-impl
ExclusiveArch: %{rust_arches}
- rust-thread-id
ExclusiveArch: %{rust_arches}
- rust-thread-scoped
ExclusiveArch: %{rust_arches}
- rust-thread_local
ExclusiveArch: %{rust_arches}
- rust-threadpool
ExclusiveArch: %{rust_arches}
- rust-tiff
ExclusiveArch: %{rust_arches}
- rust-tiger-digest
ExclusiveArch: %{rust_arches}
- rust-time
ExclusiveArch: %{rust_arches}
- rust-time-macros
ExclusiveArch: %{rust_arches}
- rust-time-macros-impl
ExclusiveArch: %{rust_arches}
- rust-time0.1
ExclusiveArch: %{rust_arches}
- rust-timebomb
ExclusiveArch: %{rust_arches}
- rust-timer
ExclusiveArch: %{rust_arches}
- rust-timerfd
ExclusiveArch: %{rust_arches}
- rust-tiny-keccak
ExclusiveArch: %{rust_arches}
- rust-tiny_http
ExclusiveArch: %{rust_arches}
- rust-tinytemplate
ExclusiveArch: %{rust_arches}
- rust-tinyvec
ExclusiveArch: %{rust_arches}
- rust-tinyvec_macros
ExclusiveArch: %{rust_arches}
- rust-tokei
ExclusiveArch: %{rust_arches}
- rust-tokio
ExclusiveArch: %{rust_arches}
- rust-tokio-codec
ExclusiveArch: %{rust_arches}
- rust-tokio-core
ExclusiveArch: %{rust_arches}
- rust-tokio-current-thread
ExclusiveArch: %{rust_arches}
- rust-tokio-executor
ExclusiveArch: %{rust_arches}
- rust-tokio-fs
ExclusiveArch: %{rust_arches}
- rust-tokio-io
ExclusiveArch: %{rust_arches}
- rust-tokio-io-pool
ExclusiveArch: %{rust_arches}
- rust-tokio-macros
ExclusiveArch: %{rust_arches}
- rust-tokio-macros0.2
ExclusiveArch: %{rust_arches}
- rust-tokio-mock-task
ExclusiveArch: %{rust_arches}
- rust-tokio-native-tls
ExclusiveArch: %{rust_arches}
- rust-tokio-openssl
ExclusiveArch: %{rust_arches}
- rust-tokio-openssl0.4
ExclusiveArch: %{rust_arches}
- rust-tokio-reactor
ExclusiveArch: %{rust_arches}
- rust-tokio-socks
ExclusiveArch: %{rust_arches}
- rust-tokio-socks0.3
ExclusiveArch: %{rust_arches}
- rust-tokio-stream
ExclusiveArch: %{rust_arches}
- rust-tokio-sync
ExclusiveArch: %{rust_arches}
- rust-tokio-tcp
ExclusiveArch: %{rust_arches}
- rust-tokio-test
ExclusiveArch: %{rust_arches}
- rust-tokio-threadpool
ExclusiveArch: %{rust_arches}
- rust-tokio-timer
ExclusiveArch: %{rust_arches}
- rust-tokio-tls
ExclusiveArch: %{rust_arches}
- rust-tokio-tls0.2
ExclusiveArch: %{rust_arches}
- rust-tokio-tungstenite
ExclusiveArch: %{rust_arches}
- rust-tokio-udp
ExclusiveArch: %{rust_arches}
- rust-tokio-uds
ExclusiveArch: %{rust_arches}
- rust-tokio-util
ExclusiveArch: %{rust_arches}
- rust-tokio-util0.2
ExclusiveArch: %{rust_arches}
- rust-tokio-util0.3
ExclusiveArch: %{rust_arches}
- rust-tokio0.1
ExclusiveArch: %{rust_arches}
- rust-tokio0.2
ExclusiveArch: %{rust_arches}
- rust-toml
ExclusiveArch: %{rust_arches}
- rust-toml0.4
ExclusiveArch: %{rust_arches}
- rust-tower-layer
ExclusiveArch: %{rust_arches}
- rust-tower-service
ExclusiveArch: %{rust_arches}
- rust-tower-test
ExclusiveArch: %{rust_arches}
- rust-tower-util
ExclusiveArch: %{rust_arches}
- rust-tpm2-policy
ExclusiveArch: %{rust_arches}
- rust-tracing
ExclusiveArch: %{rust_arches}
- rust-tracing-attributes
ExclusiveArch: %{rust_arches}
- rust-tracing-core
ExclusiveArch: %{rust_arches}
- rust-tracing-futures
ExclusiveArch: %{rust_arches}
- rust-traitobject
ExclusiveArch: %{rust_arches}
- rust-treebitmap
ExclusiveArch: %{rust_arches}
- rust-treeline
ExclusiveArch: %{rust_arches}
- rust-trust-dns-native-tls
ExclusiveArch: %{rust_arches}
- rust-trust-dns-native-tls0.19
ExclusiveArch: %{rust_arches}
- rust-trust-dns-openssl
ExclusiveArch: %{rust_arches}
- rust-trust-dns-openssl0.19
ExclusiveArch: %{rust_arches}
- rust-trust-dns-proto
ExclusiveArch: %{rust_arches}
- rust-trust-dns-proto0.19
ExclusiveArch: %{rust_arches}
- rust-trust-dns-resolver
ExclusiveArch: %{rust_arches}
- rust-trust-dns-resolver0.19
ExclusiveArch: %{rust_arches}
- rust-try-lock
ExclusiveArch: %{rust_arches}
- rust-try_from
ExclusiveArch: %{rust_arches}
- rust-try_or
ExclusiveArch: %{rust_arches}
- rust-trybuild
ExclusiveArch: %{rust_arches}
- rust-tss-esapi
ExclusiveArch: %{rust_arches}
- rust-tss-esapi-sys
ExclusiveArch: %{rust_arches}
- rust-ttf-parser
ExclusiveArch: %{rust_arches}
- rust-tui
ExclusiveArch: %{rust_arches}
- rust-tui-react
ExclusiveArch: %{rust_arches}
- rust-tui0.11
ExclusiveArch: %{rust_arches}
- rust-tui0.9
ExclusiveArch: %{rust_arches}
- rust-tuikit
ExclusiveArch: %{rust_arches}
- rust-tungstenite
ExclusiveArch: %{rust_arches}
- rust-twoway
ExclusiveArch: %{rust_arches}
- rust-typeable
ExclusiveArch: %{rust_arches}
- rust-typed-arena
ExclusiveArch: %{rust_arches}
- rust-typemap
ExclusiveArch: %{rust_arches}
- rust-typenum
ExclusiveArch: %{rust_arches}
- rust-typetag-impl
ExclusiveArch: %{rust_arches}
- rust-ucd-parse
ExclusiveArch: %{rust_arches}
- rust-ucd-trie
ExclusiveArch: %{rust_arches}
- rust-ucd-util
ExclusiveArch: %{rust_arches}
- rust-unchecked-index
ExclusiveArch: %{rust_arches}
- rust-unescape
ExclusiveArch: %{rust_arches}
- rust-unic-char-property
ExclusiveArch: %{rust_arches}
- rust-unic-char-range
ExclusiveArch: %{rust_arches}
- rust-unic-common
ExclusiveArch: %{rust_arches}
- rust-unic-segment
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-category
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-common
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-segment
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-version
ExclusiveArch: %{rust_arches}
- rust-unicase
ExclusiveArch: %{rust_arches}
- rust-unicase1
ExclusiveArch: %{rust_arches}
- rust-unicode-bidi
ExclusiveArch: %{rust_arches}
- rust-unicode-normalization
ExclusiveArch: %{rust_arches}
- rust-unicode-segmentation
ExclusiveArch: %{rust_arches}
- rust-unicode-width
ExclusiveArch: %{rust_arches}
- rust-unicode-xid
ExclusiveArch: %{rust_arches}
- rust-unicode-xid0.1
ExclusiveArch: %{rust_arches}
- rust-unicode_categories
ExclusiveArch: %{rust_arches}
- rust-unindent
ExclusiveArch: %{rust_arches}
- rust-universal-hash
ExclusiveArch: %{rust_arches}
- rust-unix_socket
ExclusiveArch: %{rust_arches}
- rust-unreachable
ExclusiveArch: %{rust_arches}
- rust-unsafe-any
ExclusiveArch: %{rust_arches}
- rust-untrusted
ExclusiveArch: %{rust_arches}
- rust-uom
ExclusiveArch: %{rust_arches}
- rust-url
ExclusiveArch: %{rust_arches}
- rust-url1
ExclusiveArch: %{rust_arches}
- rust-url_serde
ExclusiveArch: %{rust_arches}
- rust-urlencoding
ExclusiveArch: %{rust_arches}
- rust-urlocator
ExclusiveArch: %{rust_arches}
- rust-urlshortener
ExclusiveArch: %{rust_arches}
- rust-users
ExclusiveArch: %{rust_arches}
- rust-users0.10
ExclusiveArch: %{rust_arches}
- rust-utf-8
ExclusiveArch: %{rust_arches}
- rust-utf8-cstr
ExclusiveArch: %{rust_arches}
- rust-utf8-ranges
ExclusiveArch: %{rust_arches}
- rust-utf8-width
ExclusiveArch: %{rust_arches}
- rust-utf8parse
ExclusiveArch: %{rust_arches}
- rust-uuid
ExclusiveArch: %{rust_arches}
- rust-uuid0.7
ExclusiveArch: %{rust_arches}
- rust-v_escape
ExclusiveArch: %{rust_arches}
- rust-v_escape_derive
ExclusiveArch: %{rust_arches}
- rust-v_frame
ExclusiveArch: %{rust_arches}
- rust-v_htmlescape
ExclusiveArch: %{rust_arches}
- rust-varlink
ExclusiveArch: %{rust_arches}
- rust-varlink-cli
ExclusiveArch: %{rust_arches}
- rust-varlink_generator
ExclusiveArch: %{rust_arches}
- rust-varlink_parser
ExclusiveArch: %{rust_arches}
- rust-varlink_stdinterfaces
ExclusiveArch: %{rust_arches}
- rust-vec-arena
ExclusiveArch: %{rust_arches}
- rust-vec_map
ExclusiveArch: %{rust_arches}
- rust-vergen
ExclusiveArch: %{rust_arches}
- rust-version
ExclusiveArch: %{rust_arches}
- rust-version-compare
ExclusiveArch: %{rust_arches}
- rust-version-sync
ExclusiveArch: %{rust_arches}
- rust-version-sync0.8
ExclusiveArch: %{rust_arches}
- rust-version_check
ExclusiveArch: %{rust_arches}
- rust-vmm-sys-util
ExclusiveArch: x86_64 aarch64 ppc64le
- rust-vmw_backdoor
ExclusiveArch: %{rust_arches}
- rust-void
ExclusiveArch: %{rust_arches}
- rust-vte
ExclusiveArch: %{rust_arches}
- rust-vte0.3
ExclusiveArch: %{rust_arches}
- rust-vte_generate_state_changes
ExclusiveArch: %{rust_arches}
- rust-wait-timeout
ExclusiveArch: %{rust_arches}
- rust-waker-fn
ExclusiveArch: %{rust_arches}
- rust-walkdir
ExclusiveArch: %{rust_arches}
- rust-want
ExclusiveArch: %{rust_arches}
- rust-warp
ExclusiveArch: %{rust_arches}
- rust-warp0.2
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-backend
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-macro
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-macro-support
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-shared
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-test-macro
ExclusiveArch: %{rust_arches}
- rust-wayland-client
ExclusiveArch: %{rust_arches}
- rust-wayland-commons
ExclusiveArch: %{rust_arches}
- rust-wayland-cursor
ExclusiveArch: %{rust_arches}
- rust-wayland-egl
ExclusiveArch: %{rust_arches}
- rust-wayland-protocols
ExclusiveArch: %{rust_arches}
- rust-wayland-scanner
ExclusiveArch: %{rust_arches}
- rust-wayland-server
ExclusiveArch: %{rust_arches}
- rust-wayland-sys
ExclusiveArch: %{rust_arches}
- rust-web-sys
ExclusiveArch: %{rust_arches}
- rust-webbrowser
ExclusiveArch: %{rust_arches}
- rust-webkit2gtk
ExclusiveArch: %{rust_arches}
- rust-webkit2gtk-sys
ExclusiveArch: %{rust_arches}
- rust-websocket
ExclusiveArch: %{rust_arches}
- rust-websocket-base
ExclusiveArch: %{rust_arches}
- rust-weezl
ExclusiveArch: %{rust_arches}
- rust-which
ExclusiveArch: %{rust_arches}
- rust-wild
ExclusiveArch: %{rust_arches}
- rust-wildmatch
ExclusiveArch: %{rust_arches}
- rust-winit
ExclusiveArch: %{rust_arches}
- rust-ws
ExclusiveArch: %{rust_arches}
- rust-wyz
ExclusiveArch: %{rust_arches}
- rust-x11
ExclusiveArch: %{rust_arches}
- rust-x11-clipboard
ExclusiveArch: %{rust_arches}
- rust-x11-dl
ExclusiveArch: %{rust_arches}
- rust-xattr
ExclusiveArch: %{rust_arches}
- rust-xcb
ExclusiveArch: %{rust_arches}
- rust-xcursor
ExclusiveArch: %{rust_arches}
- rust-xdg
ExclusiveArch: %{rust_arches}
- rust-xkbcommon
ExclusiveArch: %{rust_arches}
- rust-xml-rs
ExclusiveArch: %{rust_arches}
- rust-xml5ever
ExclusiveArch: %{rust_arches}
- rust-xmlparser
ExclusiveArch: %{rust_arches}
- rust-xz2
ExclusiveArch: %{rust_arches}
- rust-y4m
ExclusiveArch: %{rust_arches}
- rust-yaml-rust
ExclusiveArch: %{rust_arches}
- rust-yaml-rust0.3
ExclusiveArch: %{rust_arches}
- rust-ybaas
ExclusiveArch: %{rust_arches}
- rust-ytop
ExclusiveArch: %{rust_arches}
- rust-yubibomb
ExclusiveArch: %{rust_arches}
- rust-yup-oauth2
ExclusiveArch: %{rust_arches}
- rust-zbase32
ExclusiveArch: %{rust_arches}
- rust-zbus
ExclusiveArch: %{rust_arches}
- rust-zbus_macros
ExclusiveArch: %{rust_arches}
- rust-zeroize
ExclusiveArch: %{rust_arches}
- rust-zeroize_derive
ExclusiveArch: %{rust_arches}
- rust-zincati
ExclusiveArch: %{rust_arches}
- rust-zip
ExclusiveArch: %{rust_arches}
- rust-zoneinfo_compiled
ExclusiveArch: %{rust_arches}
- rust-zoxide
ExclusiveArch: %{rust_arches}
- rust-zram-generator
ExclusiveArch: %{rust_arches}
- rust-zstd
ExclusiveArch: %{rust_arches}
- rust-zstd-safe
ExclusiveArch: %{rust_arches}
- rust-zstd-sys
ExclusiveArch: %{rust_arches}
- rust-zvariant
ExclusiveArch: %{rust_arches}
- rust-zvariant_derive
ExclusiveArch: %{rust_arches}
- s390utils
ExclusiveArch: s390 s390x
- safetyblanket
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- sagemath
ExclusiveArch: aarch64 %{ix86} x86_64 ppc sparcv9
- sbcl
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- sbd
ExclusiveArch: i686 x86_64 s390x aarch64 ppc64le
- sbsigntools
ExclusiveArch: x86_64 aarch64 %{arm} %{ix86}
- seabios
ExclusiveArch: x86_64
- seadrive-gui
ExclusiveArch: %{qt5_qtwebengine_arches}
- seafile-client
ExclusiveArch: %{qt5_qtwebengine_arches}
- seamonkey
ExclusiveArch: x86_64
- seqan3
ExclusiveArch: %{power64} x86_64 aarch64
- servicelog
ExclusiveArch: ppc %{power64}
- sgabios
ExclusiveArch: %{ix86} x86_64
- sharpfont
ExclusiveArch: %mono_arches
- sharpziplib
ExclusiveArch: %{mono_arches}
- shim
ExclusiveArch: %{efi}
- shim-unsigned-aarch64
ExclusiveArch: aarch64
- shim-unsigned-x64
ExclusiveArch: x86_64
- sigul
ExclusiveArch: x86_64
- skychart
ExclusiveArch: %{fpc_arches}
- snapd
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- soup-sharp
ExclusiveArch: %{mono_arches}
- sparkleshare
ExclusiveArch: %{mono_arches}
- spicctrl
ExclusiveArch: %{ix86} x86_64
- spice
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- springlobby
ExclusiveArch: %{ix86} x86_64
- squeekboard
ExclusiveArch: %{rust_arches}
- startdde
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- statsd
ExclusiveArch: %{nodejs_arches} noarch
- stratis-cli
ExclusiveArch: %{rust_arches} noarch
- stratisd
ExclusiveArch: %{rust_arches}
- stripesnoop
ExclusiveArch: %{ix86} x86_64
- supercollider
ExclusiveArch: %{qt5_qtwebengine_arches}
- supermin
ExclusiveArch: %{kernel_arches}
- svt-av1
ExclusiveArch: x86_64
- svt-vp9
ExclusiveArch: x86_64
- swift-lang
ExclusiveArch: x86_64 aarch64
- sysbench
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64le s390x
- syslinux
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- taglib-sharp
ExclusiveArch: %{mono_arches}
- tarantool
ExclusiveArch: %{ix86} x86_64
- tboot
ExclusiveArch: %{ix86} x86_64
- tdlib
ExclusiveArch: x86_64
- templates_parser
ExclusiveArch: %GPRbuild_arches
- ternimal
ExclusiveArch: %{rust_arches}
- testcloud
ExclusiveArch: %{kernel_arches} noarch
- themonospot-base
ExclusiveArch: %mono_arches
- themonospot-console
ExclusiveArch: %mono_arches
- themonospot-gui-gtk
ExclusiveArch: %mono_arches
- themonospot-plugin-avi
ExclusiveArch: %mono_arches
- themonospot-plugin-mkv
ExclusiveArch: %mono_arches
- thermald
ExclusiveArch: %{ix86} x86_64
- tilix
ExclusiveArch: %{ldc_arches}
- tmux-top
ExclusiveArch: %{go_arches}
- tomboy
ExclusiveArch: %{mono_arches}
- topojson-client
ExclusiveArch: %{nodejs_arches} noarch
- topojson-server
ExclusiveArch: %{nodejs_arches} noarch
- topojson-simplify
ExclusiveArch: %{nodejs_arches} noarch
- torbrowser-launcher
ExclusiveArch: %{ix86} x86_64
- tuned-profiles-nfv-host-bin
ExclusiveArch: %{ix86} x86_64
- uClibc
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
- ucx
ExclusiveArch: aarch64 ppc64le x86_64
- ugene
ExclusiveArch: %{ix86} x86_64
- uglify-js
ExclusiveArch: %{nodejs_arches} noarch
- uglify-js1
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- unetbootin
ExclusiveArch: %{ix86} x86_64
- ursa-major
ExclusiveArch: noarch aarch64 ppc64le s390x x86_64
- v8-314
ExclusiveArch: %{ix86} x86_64 %{arm} mips mipsel ppc ppc64
- valgrind
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x armv7hl aarch64
- vboot-utils
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- vim-go
ExclusiveArch: %{?golang_arches}%{!?golang_arches:%{ix86} x86_64 %{arm}}
- virt-p2v
ExclusiveArch: x86_64
- virt-v2v
ExclusiveArch: x86_64
- virtualbox-guest-additions
ExclusiveArch: i686 x86_64
- vkd3d
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- vmaf
ExclusiveArch: x86_64
- vmem
ExclusiveArch: x86_64
- vmemcache
ExclusiveArch: x86_64 ppc64 ppc64le s390x aarch64
- vrq
ExclusiveArch: %{ix86} x86_64
- warsow
ExclusiveArch: %{ix86} x86_64 %{arm}
- warsow-data
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{ix86} x86_64 %{arm}
- webkit2-sharp
ExclusiveArch: %mono_arches
- wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
ExclusiveArch: %{ix86} %{arm}
- wine-dxvk
ExclusiveArch: %{ix86} x86_64
- winetricks
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- wxMaxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
- x2goclient
ExclusiveArch: x86_64
- xe-guest-utilities-latest
ExclusiveArch: %{ix86} x86_64
- xen
ExclusiveArch: %{ix86} x86_64 armv7hl aarch64
- xmlada
ExclusiveArch: %{GPRbuild_arches}
- xorg-x11-drv-armsoc
ExclusiveArch: %{arm} aarch64
- xorg-x11-drv-intel
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-openchrome
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vesa
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vmware
ExclusiveArch: %{ix86} x86_64 ia64
- xsp
ExclusiveArch: %mono_arches
- yarnpkg
ExclusiveArch: %{nodejs_arches} noarch
- zeromq-ada
ExclusiveArch: %{GPRbuild_arches}
- zlib-ada
ExclusiveArch: %{GPRbuild_arches}
- zlib-ng
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
- zola
ExclusiveArch: %{rust_arches}
2 years, 11 months
Architecture specific change in rpms/ceph.git
by githook-noreply@fedoraproject.org
The package rpms/ceph.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/ceph.git/commit/?id=4bd118debcd4a...
https://src.fedoraproject.org/cgit/rpms/ceph.git/commit/?id=78e076b5afe9c....
Change:
+%ifarch s390
-%ifarch x86_64
Thanks.
Full change:
============
commit e06c944dbd1dd5f45f16beb5932a0e7a73b41da4
Author: Kaleb S. KEITHLEY <kkeithle(a)redhat.com>
Date: Thu May 6 07:17:45 2021 -0400
16.2.2 GA
Signed-off-by: Kaleb S. KEITHLEY <kkeithle(a)redhat.com>
diff --git a/sources b/sources
index f99318a..adc6360 100644
--- a/sources
+++ b/sources
@@ -1,5 +1 @@
-<<<<<<< HEAD
-SHA512 (ceph-16.2.1.tar.gz) = 42e404aa41565485dc4c08b66efb3de719adee72cfc535586992e15ab4601bfbd909ef61abf412badbbfa7ef13bf91a7c0576fbbf3f9f687bc7b465b21a8c416
-=======
SHA512 (ceph-16.2.2.tar.gz) = 4269fe07821400655c5cfcc2828b4a39a0adc81ef0045d86b50b539c13c151c9ace9710fe365bbf2de7e5134e03c45c88f19f4adcb7c4d608eab4b9580da113c
->>>>>>> origin/rawhide
commit 145268fb052ec4b1f5a725cef8ce6666b0a72875
Merge: 84c3ccc 4bd118d
Author: Kaleb S. KEITHLEY <kkeithle(a)redhat.com>
Date: Thu May 6 07:16:36 2021 -0400
16.2.2 GA
Signed-off-by: Kaleb S. KEITHLEY <kkeithle(a)redhat.com>
diff --cc sources
index 3de5593,adc6360..f99318a
--- a/sources
+++ b/sources
@@@ -1,1 -1,1 +1,5 @@@
++<<<<<<< HEAD
+SHA512 (ceph-16.2.1.tar.gz) = 42e404aa41565485dc4c08b66efb3de719adee72cfc535586992e15ab4601bfbd909ef61abf412badbbfa7ef13bf91a7c0576fbbf3f9f687bc7b465b21a8c416
++=======
+ SHA512 (ceph-16.2.2.tar.gz) = 4269fe07821400655c5cfcc2828b4a39a0adc81ef0045d86b50b539c13c151c9ace9710fe365bbf2de7e5134e03c45c88f19f4adcb7c4d608eab4b9580da113c
++>>>>>>> origin/rawhide
commit 4bd118debcd4aac68d8ce9472b887723546ef7b5
Author: Kaleb S. KEITHLEY <kkeithle(a)f34node1.kkeithle.usersys.redhat.com>
Date: Wed May 5 17:06:40 2021 -0400
16.2.2 GA
Signed-off-by: Kaleb S. KEITHLEY <kkeithle(a)f34node1.kkeithle.usersys.redhat.com>
diff --git a/0004-src-CMakeLists.txt.patch b/0004-src-CMakeLists.txt.patch
deleted file mode 100644
index f3f2e36..0000000
--- a/0004-src-CMakeLists.txt.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- ceph-16.0.0/src/CMakeLists.txt.orig 2021-01-25 13:45:15.316053258 -0500
-+++ ceph-16.0.0/src/CMakeLists.txt 2021-01-25 13:43:34.418305591 -0500
-@@ -29,7 +29,8 @@
- -D_THREAD_SAFE
- -D__STDC_FORMAT_MACROS
- -D_FILE_OFFSET_BITS=64
-- -DBOOST_ASIO_DISABLE_THREAD_KEYWORD_EXTENSION)
-+ -DBOOST_ASIO_DISABLE_THREAD_KEYWORD_EXTENSION
-+ -DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
- if(LINUX)
- add_definitions("-D_GNU_SOURCE")
- endif()
diff --git a/0012-rgw.patch b/0012-rgw.patch
deleted file mode 100644
index 0d85501..0000000
--- a/0012-rgw.patch
+++ /dev/null
@@ -1,7721 +0,0 @@
-From 483302af2622cb26983c847196b8bad0a80fbd2f Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Sat, 21 Nov 2020 17:04:12 -0500
-Subject: [PATCH 01/26] cls/log: Take const references of things you won't
- modify
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 73ea8cec06addc6af2ba354321f1099f657f13c5)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/cls/log/cls_log_client.cc | 4 ++--
- src/cls/log/cls_log_client.h | 6 +++---
- 2 files changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/cls/log/cls_log_client.cc b/src/cls/log/cls_log_client.cc
-index 418599c8066e4..182bb9fec47e9 100644
---- a/src/cls/log/cls_log_client.cc
-+++ b/src/cls/log/cls_log_client.cc
-@@ -113,8 +113,8 @@ class LogListCtx : public ObjectOperationCompletion {
- }
- };
-
--void cls_log_list(librados::ObjectReadOperation& op, utime_t& from, utime_t& to,
-- const string& in_marker, int max_entries,
-+void cls_log_list(librados::ObjectReadOperation& op, const utime_t& from,
-+ const utime_t& to, const string& in_marker, int max_entries,
- list<cls_log_entry>& entries,
- string *out_marker, bool *truncated)
- {
-diff --git a/src/cls/log/cls_log_client.h b/src/cls/log/cls_log_client.h
-index b049c2cc01bda..2afdabeb3e0a2 100644
---- a/src/cls/log/cls_log_client.h
-+++ b/src/cls/log/cls_log_client.h
-@@ -19,9 +19,9 @@ void cls_log_add(librados::ObjectWriteOperation& op, cls_log_entry& entry);
- void cls_log_add(librados::ObjectWriteOperation& op, const utime_t& timestamp,
- const std::string& section, const std::string& name, ceph::buffer::list& bl);
-
--void cls_log_list(librados::ObjectReadOperation& op, utime_t& from, utime_t& to,
-- const std::string& in_marker, int max_entries,
-- std::list<cls_log_entry>& entries,
-+void cls_log_list(librados::ObjectReadOperation& op, const utime_t& from,
-+ const utime_t& to, const std::string& in_marker,
-+ int max_entries, std::list<cls_log_entry>& entries,
- std::string *out_marker, bool *truncated);
-
- void cls_log_trim(librados::ObjectWriteOperation& op, const utime_t& from_time, const utime_t& to_time,
-
-From 35f044f39da713b3bf4c5002aade7b456727190e Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Tue, 3 Nov 2020 16:02:26 -0500
-Subject: [PATCH 02/26] rgw: Add AioCompletion* versions for the rest of the
- FIFO methods
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 665573ab8905bfa2e1ede6fc3be9bc80a625cb49)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/cls_fifo_legacy.cc | 1583 +++++++++++++++++++++-----
- src/rgw/cls_fifo_legacy.h | 91 +-
- src/rgw/rgw_datalog.cc | 7 +-
- src/test/rgw/test_cls_fifo_legacy.cc | 484 +++++++-
- 4 files changed, 1826 insertions(+), 339 deletions(-)
-
-diff --git a/src/rgw/cls_fifo_legacy.cc b/src/rgw/cls_fifo_legacy.cc
-index d835aeec76ab8..569a3e77c458f 100644
---- a/src/rgw/cls_fifo_legacy.cc
-+++ b/src/rgw/cls_fifo_legacy.cc
-@@ -109,6 +109,7 @@ int get_meta(lr::IoCtx& ioctx, const std::string& oid,
- return r;
- };
-
-+namespace {
- void update_meta(lr::ObjectWriteOperation* op, const fifo::objv& objv,
- const fifo::update& update)
- {
-@@ -175,6 +176,27 @@ int push_part(lr::IoCtx& ioctx, const std::string& oid, std::string_view tag,
- return retval;
- }
-
-+void push_part(lr::IoCtx& ioctx, const std::string& oid, std::string_view tag,
-+ std::deque<cb::list> data_bufs, std::uint64_t tid,
-+ lr::AioCompletion* c)
-+{
-+ lr::ObjectWriteOperation op;
-+ fifo::op::push_part pp;
-+
-+ pp.tag = tag;
-+ pp.data_bufs = data_bufs;
-+ pp.total_len = 0;
-+
-+ for (const auto& bl : data_bufs)
-+ pp.total_len += bl.length();
-+
-+ cb::list in;
-+ encode(pp, in);
-+ op.exec(fifo::op::CLASS, fifo::op::PUSH_PART, in);
-+ auto r = ioctx.aio_operate(oid, c, &op, lr::OPERATION_RETURNVEC);
-+ ceph_assert(r >= 0);
-+}
-+
- void trim_part(lr::ObjectWriteOperation* op,
- std::optional<std::string_view> tag,
- std::uint64_t ofs, bool exclusive)
-@@ -232,6 +254,70 @@ int list_part(lr::IoCtx& ioctx, const std::string& oid,
- return r;
- }
-
-+struct list_entry_completion : public lr::ObjectOperationCompletion {
-+ CephContext* cct;
-+ int* r_out;
-+ std::vector<fifo::part_list_entry>* entries;
-+ bool* more;
-+ bool* full_part;
-+ std::string* ptag;
-+ std::uint64_t tid;
-+
-+ list_entry_completion(CephContext* cct, int* r_out, std::vector<fifo::part_list_entry>* entries,
-+ bool* more, bool* full_part, std::string* ptag,
-+ std::uint64_t tid)
-+ : cct(cct), r_out(r_out), entries(entries), more(more),
-+ full_part(full_part), ptag(ptag), tid(tid) {}
-+ virtual ~list_entry_completion() = default;
-+ void handle_completion(int r, bufferlist& bl) override {
-+ if (r >= 0) try {
-+ fifo::op::list_part_reply reply;
-+ auto iter = bl.cbegin();
-+ decode(reply, iter);
-+ if (entries) *entries = std::move(reply.entries);
-+ if (more) *more = reply.more;
-+ if (full_part) *full_part = reply.full_part;
-+ if (ptag) *ptag = reply.tag;
-+ } catch (const cb::error& err) {
-+ lderr(cct)
-+ << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " decode failed: " << err.what()
-+ << " tid=" << tid << dendl;
-+ r = from_error_code(err.code());
-+ } else if (r < 0) {
-+ lderr(cct)
-+ << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " fifo::op::LIST_PART failed r=" << r << " tid=" << tid
-+ << dendl;
-+ }
-+ if (r_out) *r_out = r;
-+ }
-+};
-+
-+lr::ObjectReadOperation list_part(CephContext* cct,
-+ std::optional<std::string_view> tag,
-+ std::uint64_t ofs,
-+ std::uint64_t max_entries,
-+ int* r_out,
-+ std::vector<fifo::part_list_entry>* entries,
-+ bool* more, bool* full_part,
-+ std::string* ptag, std::uint64_t tid)
-+{
-+ lr::ObjectReadOperation op;
-+ fifo::op::list_part lp;
-+
-+ lp.tag = tag;
-+ lp.ofs = ofs;
-+ lp.max_entries = max_entries;
-+
-+ cb::list in;
-+ encode(lp, in);
-+ op.exec(fifo::op::CLASS, fifo::op::LIST_PART, in,
-+ new list_entry_completion(cct, r_out, entries, more, full_part,
-+ ptag, tid));
-+ return op;
-+}
-+
- int get_part_info(lr::IoCtx& ioctx, const std::string& oid,
- fifo::part_header* header,
- std::uint64_t tid, optional_yield y)
-@@ -264,29 +350,131 @@ int get_part_info(lr::IoCtx& ioctx, const std::string& oid,
- return r;
- }
-
--static void complete(lr::AioCompletion* c_, int r)
-+struct partinfo_completion : public lr::ObjectOperationCompletion {
-+ CephContext* cct;
-+ int* rp;
-+ fifo::part_header* h;
-+ std::uint64_t tid;
-+ partinfo_completion(CephContext* cct, int* rp, fifo::part_header* h,
-+ std::uint64_t tid) :
-+ cct(cct), rp(rp), h(h), tid(tid) {
-+ }
-+ virtual ~partinfo_completion() = default;
-+ void handle_completion(int r, bufferlist& bl) override {
-+ if (r >= 0) try {
-+ fifo::op::get_part_info_reply reply;
-+ auto iter = bl.cbegin();
-+ decode(reply, iter);
-+ if (h) *h = std::move(reply.header);
-+ } catch (const cb::error& err) {
-+ r = from_error_code(err.code());
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " decode failed: " << err.what()
-+ << " tid=" << tid << dendl;
-+ } else {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " fifo::op::GET_PART_INFO failed r=" << r << " tid=" << tid
-+ << dendl;
-+ }
-+ if (rp) {
-+ *rp = r;
-+ }
-+ }
-+};
-+
-+template<typename T>
-+struct Completion {
-+private:
-+ lr::AioCompletion* _cur = nullptr;
-+ lr::AioCompletion* _super;
-+public:
-+
-+ using Ptr = std::unique_ptr<T>;
-+
-+ lr::AioCompletion* cur() const {
-+ return _cur;
-+ }
-+ lr::AioCompletion* super() const {
-+ return _super;
-+ }
-+
-+ Completion(lr::AioCompletion* super) : _super(super) {
-+ super->pc->get();
-+ }
-+
-+ ~Completion() {
-+ if (_super) {
-+ _super->pc->put();
-+ }
-+ if (_cur)
-+ _cur->release();
-+ _super = nullptr;
-+ _cur = nullptr;
-+ }
-+
-+ // The only times that aio_operate can return an error are:
-+ // 1. The completion contains a null pointer. This should just
-+ // crash, and in our case it does.
-+ // 2. An attempt is made to write to a snapshot. RGW doesn't use
-+ // snapshots, so we don't care.
-+ //
-+ // So we will just assert that initiating an Aio operation succeeds
-+ // and not worry about recovering.
-+ static lr::AioCompletion* call(Ptr&& p) {
-+ p->_cur = lr::Rados::aio_create_completion(static_cast<void*>(p.get()),
-+ &cb);
-+ auto c = p->_cur;
-+ p.release();
-+ return c;
-+ }
-+ static void complete(Ptr&& p, int r) {
-+ auto c = p->_super->pc;
-+ p->_super = nullptr;
-+ c->lock.lock();
-+ c->rval = r;
-+ c->complete = true;
-+ c->lock.unlock();
-+
-+ auto cb_complete = c->callback_complete;
-+ auto cb_complete_arg = c->callback_complete_arg;
-+ if (cb_complete)
-+ cb_complete(c, cb_complete_arg);
-+
-+ auto cb_safe = c->callback_safe;
-+ auto cb_safe_arg = c->callback_safe_arg;
-+ if (cb_safe)
-+ cb_safe(c, cb_safe_arg);
-+
-+ c->lock.lock();
-+ c->callback_complete = nullptr;
-+ c->callback_safe = nullptr;
-+ c->cond.notify_all();
-+ c->put_unlock();
-+ }
-+
-+ static void cb(lr::completion_t, void* arg) {
-+ auto t = static_cast<T*>(arg);
-+ auto r = t->_cur->get_return_value();
-+ t->_cur->release();
-+ t->_cur = nullptr;
-+ t->handle(Ptr(t), r);
-+ }
-+};
-+
-+lr::ObjectReadOperation get_part_info(CephContext* cct,
-+ fifo::part_header* header,
-+ std::uint64_t tid, int* r = 0)
- {
-- auto c = c_->pc;
-- c->lock.lock();
-- c->rval = r;
-- c->complete = true;
-- c->lock.unlock();
--
-- auto cb_complete = c->callback_complete;
-- auto cb_complete_arg = c->callback_complete_arg;
-- if (cb_complete)
-- cb_complete(c, cb_complete_arg);
--
-- auto cb_safe = c->callback_safe;
-- auto cb_safe_arg = c->callback_safe_arg;
-- if (cb_safe)
-- cb_safe(c, cb_safe_arg);
--
-- c->lock.lock();
-- c->callback_complete = NULL;
-- c->callback_safe = NULL;
-- c->cond.notify_all();
-- c->put_unlock();
-+ lr::ObjectReadOperation op;
-+ fifo::op::get_part_info gpi;
-+
-+ cb::list in;
-+ cb::list bl;
-+ encode(gpi, in);
-+ op.exec(fifo::op::CLASS, fifo::op::GET_PART_INFO, in,
-+ new partinfo_completion(cct, r, header, tid));
-+ return op;
-+}
- }
-
- std::optional<marker> FIFO::to_marker(std::string_view s)
-@@ -385,11 +573,8 @@ int FIFO::_update_meta(const fifo::update& update,
- return r;
- }
-
--struct Updater {
-+struct Updater : public Completion<Updater> {
- FIFO* fifo;
-- lr::AioCompletion* super;
-- lr::AioCompletion* cur = lr::Rados::aio_create_completion(
-- static_cast<void*>(this), &FIFO::update_callback);
- fifo::update update;
- fifo::objv version;
- bool reread = false;
-@@ -398,92 +583,74 @@ struct Updater {
- Updater(FIFO* fifo, lr::AioCompletion* super,
- const fifo::update& update, fifo::objv version,
- bool* pcanceled, std::uint64_t tid)
-- : fifo(fifo), super(super), update(update), version(version),
-- pcanceled(pcanceled), tid(tid) {
-- super->pc->get();
-- }
-- ~Updater() {
-- cur->release();
-- }
--};
--
--void FIFO::update_callback(lr::completion_t, void* arg)
--{
-- std::unique_ptr<Updater> updater(static_cast<Updater*>(arg));
-- auto cct = updater->fifo->cct;
-- auto tid = updater->tid;
-- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " entering: tid=" << tid << dendl;
-- if (!updater->reread) {
-- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " handling async update_meta: tid="
-- << tid << dendl;
-- int r = updater->cur->get_return_value();
-+ : Completion(super), fifo(fifo), update(update), version(version),
-+ pcanceled(pcanceled) {}
-+
-+ void handle(Ptr&& p, int r) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+ if (reread)
-+ handle_reread(std::move(p), r);
-+ else
-+ handle_update(std::move(p), r);
-+ }
-+
-+ void handle_update(Ptr&& p, int r) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " handling async update_meta: tid="
-+ << tid << dendl;
- if (r < 0 && r != -ECANCELED) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ lderr(fifo->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
- << " update failed: r=" << r << " tid=" << tid << dendl;
-- complete(updater->super, r);
-+ complete(std::move(p), r);
- return;
- }
- bool canceled = (r == -ECANCELED);
- if (!canceled) {
-- int r = updater->fifo->apply_update(&updater->fifo->info,
-- updater->version,
-- updater->update, tid);
-+ int r = fifo->apply_update(&fifo->info, version, update, tid);
- if (r < 0) {
-- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " update failed, marking canceled: r=" << r << " tid="
-- << tid << dendl;
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " update failed, marking canceled: r=" << r
-+ << " tid=" << tid << dendl;
- canceled = true;
- }
- }
- if (canceled) {
-- updater->cur->release();
-- updater->cur = lr::Rados::aio_create_completion(
-- arg, &FIFO::update_callback);
-- updater->reread = true;
-- auto r = updater->fifo->read_meta(tid, updater->cur);
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " failed dispatching read_meta: r=" << r << " tid="
-- << tid << dendl;
-- complete(updater->super, r);
-- } else {
-- updater.release();
-- }
-+ reread = true;
-+ fifo->read_meta(tid, call(std::move(p)));
- return;
- }
-- if (updater->pcanceled)
-- *updater->pcanceled = false;
-- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " completing: tid=" << tid << dendl;
-- complete(updater->super, 0);
-- return;
-- }
--
-- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " handling async read_meta: tid="
-- << tid << dendl;
-- int r = updater->cur->get_return_value();
-- if (r < 0 && updater->pcanceled) {
-- *updater->pcanceled = false;
-- } else if (r >= 0 && updater->pcanceled) {
-- *updater->pcanceled = true;
-- }
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " failed dispatching read_meta: r=" << r << " tid="
-- << tid << dendl;
-- } else {
-- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " completing: tid=" << tid << dendl;
-+ if (pcanceled)
-+ *pcanceled = false;
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " completing: tid=" << tid << dendl;
-+ complete(std::move(p), 0);
-+ }
-+
-+ void handle_reread(Ptr&& p, int r) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " handling async read_meta: tid="
-+ << tid << dendl;
-+ if (r < 0 && pcanceled) {
-+ *pcanceled = false;
-+ } else if (r >= 0 && pcanceled) {
-+ *pcanceled = true;
-+ }
-+ if (r < 0) {
-+ lderr(fifo->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " failed dispatching read_meta: r=" << r << " tid="
-+ << tid << dendl;
-+ } else {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " completing: tid=" << tid << dendl;
-+ }
-+ complete(std::move(p), r);
- }
-- complete(updater->super, r);
--}
-+};
-
--int FIFO::_update_meta(const fifo::update& update,
-- fifo::objv version, bool* pcanceled,
-- std::uint64_t tid, lr::AioCompletion* c)
-+void FIFO::_update_meta(const fifo::update& update,
-+ fifo::objv version, bool* pcanceled,
-+ std::uint64_t tid, lr::AioCompletion* c)
- {
- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
- << " entering: tid=" << tid << dendl;
-@@ -491,15 +658,8 @@ int FIFO::_update_meta(const fifo::update& update,
- update_meta(&op, info.version, update);
- auto updater = std::make_unique<Updater>(this, c, update, version, pcanceled,
- tid);
-- auto r = ioctx.aio_operate(oid, updater->cur, &op);
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " failed dispatching update_meta: r=" << r << " tid="
-- << tid << dendl;
-- } else {
-- updater.release();
-- }
-- return r;
-+ auto r = ioctx.aio_operate(oid, Updater::call(std::move(updater)), &op);
-+ assert(r >= 0);
- }
-
- int FIFO::create_part(int64_t part_num, std::string_view tag, std::uint64_t tid,
-@@ -509,7 +669,7 @@ int FIFO::create_part(int64_t part_num, std::string_view tag, std::uint64_t tid,
- << " entering: tid=" << tid << dendl;
- lr::ObjectWriteOperation op;
- op.create(false); /* We don't need exclusivity, part_init ensures
-- we're creating from the same journal entry. */
-+ we're creating from the same journal entry. */
- std::unique_lock l(m);
- part_init(&op, tag, info.params);
- auto oid = info.part_oid(part_num);
-@@ -806,6 +966,209 @@ int FIFO::_prepare_new_head(std::uint64_t tid, optional_yield y)
- return 0;
- }
-
-+struct NewPartPreparer : public Completion<NewPartPreparer> {
-+ FIFO* f;
-+ std::vector<fifo::journal_entry> jentries;
-+ int i = 0;
-+ std::int64_t new_head_part_num;
-+ bool canceled = false;
-+ uint64_t tid;
-+
-+ NewPartPreparer(FIFO* f, lr::AioCompletion* super,
-+ std::vector<fifo::journal_entry> jentries,
-+ std::int64_t new_head_part_num,
-+ std::uint64_t tid)
-+ : Completion(super), f(f), jentries(std::move(jentries)),
-+ new_head_part_num(new_head_part_num), tid(tid) {}
-+
-+ void handle(Ptr&& p, int r) {
-+ ldout(f->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+ if (r < 0) {
-+ lderr(f->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " _update_meta failed: r=" << r
-+ << " tid=" << tid << dendl;
-+ complete(std::move(p), r);
-+ return;
-+ }
-+
-+ if (canceled) {
-+ std::unique_lock l(f->m);
-+ auto iter = f->info.journal.find(jentries.front().part_num);
-+ auto max_push_part_num = f->info.max_push_part_num;
-+ auto head_part_num = f->info.head_part_num;
-+ auto version = f->info.version;
-+ auto found = (iter != f->info.journal.end());
-+ l.unlock();
-+ if ((max_push_part_num >= jentries.front().part_num &&
-+ head_part_num >= new_head_part_num)) {
-+ ldout(f->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " raced, but journaled and processed: i=" << i
-+ << " tid=" << tid << dendl;
-+ complete(std::move(p), 0);
-+ return;
-+ }
-+ if (i >= MAX_RACE_RETRIES) {
-+ complete(std::move(p), -ECANCELED);
-+ return;
-+ }
-+ if (!found) {
-+ ++i;
-+ f->_update_meta(fifo::update{}
-+ .journal_entries_add(jentries),
-+ version, &canceled, tid, call(std::move(p)));
-+ return;
-+ } else {
-+ ldout(f->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " raced, journaled but not processed: i=" << i
-+ << " tid=" << tid << dendl;
-+ canceled = false;
-+ }
-+ // Fall through. We still need to process the journal.
-+ }
-+ f->process_journal(tid, super());
-+ return;
-+ }
-+};
-+
-+void FIFO::_prepare_new_part(bool is_head, std::uint64_t tid,
-+ lr::AioCompletion* c)
-+{
-+ std::unique_lock l(m);
-+ std::vector jentries = { info.next_journal_entry(generate_tag()) };
-+ if (info.journal.find(jentries.front().part_num) != info.journal.end()) {
-+ l.unlock();
-+ ldout(cct, 5) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " new part journaled, but not processed: tid="
-+ << tid << dendl;
-+ process_journal(tid, c);
-+ return;
-+ }
-+ std::int64_t new_head_part_num = info.head_part_num;
-+ auto version = info.version;
-+
-+ if (is_head) {
-+ auto new_head_jentry = jentries.front();
-+ new_head_jentry.op = fifo::journal_entry::Op::set_head;
-+ new_head_part_num = jentries.front().part_num;
-+ jentries.push_back(std::move(new_head_jentry));
-+ }
-+ l.unlock();
-+
-+ auto n = std::make_unique<NewPartPreparer>(this, c, jentries,
-+ new_head_part_num, tid);
-+ auto np = n.get();
-+ _update_meta(fifo::update{}.journal_entries_add(jentries), version,
-+ &np->canceled, tid, NewPartPreparer::call(std::move(n)));
-+}
-+
-+struct NewHeadPreparer : public Completion<NewHeadPreparer> {
-+ FIFO* f;
-+ int i = 0;
-+ bool newpart;
-+ std::int64_t new_head_num;
-+ bool canceled = false;
-+ std::uint64_t tid;
-+
-+ NewHeadPreparer(FIFO* f, lr::AioCompletion* super,
-+ bool newpart, std::int64_t new_head_num, std::uint64_t tid)
-+ : Completion(super), f(f), newpart(newpart), new_head_num(new_head_num),
-+ tid(tid) {}
-+
-+ void handle(Ptr&& p, int r) {
-+ if (newpart)
-+ handle_newpart(std::move(p), r);
-+ else
-+ handle_update(std::move(p), r);
-+ }
-+
-+ void handle_newpart(Ptr&& p, int r) {
-+ if (r < 0) {
-+ lderr(f->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " _prepare_new_part failed: r=" << r
-+ << " tid=" << tid << dendl;
-+ complete(std::move(p), r);
-+ return;
-+ }
-+ std::unique_lock l(f->m);
-+ if (f->info.max_push_part_num < new_head_num) {
-+ l.unlock();
-+ lderr(f->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " _prepare_new_part failed: r=" << r
-+ << " tid=" << tid << dendl;
-+ complete(std::move(p), -EIO);
-+ } else {
-+ l.unlock();
-+ complete(std::move(p), 0);
-+ }
-+ }
-+
-+ void handle_update(Ptr&& p, int r) {
-+ std::unique_lock l(f->m);
-+ auto head_part_num = f->info.head_part_num;
-+ auto version = f->info.version;
-+ l.unlock();
-+
-+ if (r < 0) {
-+ lderr(f->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " _update_meta failed: r=" << r
-+ << " tid=" << tid << dendl;
-+ complete(std::move(p), r);
-+ return;
-+ }
-+ if (canceled) {
-+ if (i >= MAX_RACE_RETRIES) {
-+ lderr(f->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " canceled too many times, giving up: tid=" << tid << dendl;
-+ complete(std::move(p), -ECANCELED);
-+ return;
-+ }
-+
-+ // Raced, but there's still work to do!
-+ if (head_part_num < new_head_num) {
-+ canceled = false;
-+ ++i;
-+ ldout(f->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " updating head: i=" << i << " tid=" << tid << dendl;
-+ f->_update_meta(fifo::update{}.head_part_num(new_head_num),
-+ version, &this->canceled, tid, call(std::move(p)));
-+ return;
-+ }
-+ }
-+ ldout(f->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " succeeded : i=" << i << " tid=" << tid << dendl;
-+ complete(std::move(p), 0);
-+ return;
-+ }
-+};
-+
-+void FIFO::_prepare_new_head(std::uint64_t tid, lr::AioCompletion* c)
-+{
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+ std::unique_lock l(m);
-+ int64_t new_head_num = info.head_part_num + 1;
-+ auto max_push_part_num = info.max_push_part_num;
-+ auto version = info.version;
-+ l.unlock();
-+
-+ if (max_push_part_num < new_head_num) {
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " need new part: tid=" << tid << dendl;
-+ auto n = std::make_unique<NewHeadPreparer>(this, c, true, new_head_num,
-+ tid);
-+ _prepare_new_part(true, tid, NewHeadPreparer::call(std::move(n)));
-+ } else {
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " updating head: tid=" << tid << dendl;
-+ auto n = std::make_unique<NewHeadPreparer>(this, c, false, new_head_num,
-+ tid);
-+ auto np = n.get();
-+ _update_meta(fifo::update{}.head_part_num(new_head_num), version,
-+ &np->canceled, tid, NewHeadPreparer::call(std::move(n)));
-+ }
-+}
-+
- int FIFO::push_entries(const std::deque<cb::list>& data_bufs,
- std::uint64_t tid, optional_yield y)
- {
-@@ -825,6 +1188,18 @@ int FIFO::push_entries(const std::deque<cb::list>& data_bufs,
- return r;
- }
-
-+void FIFO::push_entries(const std::deque<cb::list>& data_bufs,
-+ std::uint64_t tid, lr::AioCompletion* c)
-+{
-+ std::unique_lock l(m);
-+ auto head_part_num = info.head_part_num;
-+ auto tag = info.head_tag;
-+ const auto part_oid = info.part_oid(head_part_num);
-+ l.unlock();
-+
-+ push_part(ioctx, part_oid, tag, data_bufs, tid, c);
-+}
-+
- int FIFO::trim_part(int64_t part_num, uint64_t ofs,
- std::optional<std::string_view> tag,
- bool exclusive, std::uint64_t tid,
-@@ -845,10 +1220,10 @@ int FIFO::trim_part(int64_t part_num, uint64_t ofs,
- return 0;
- }
-
--int FIFO::trim_part(int64_t part_num, uint64_t ofs,
-- std::optional<std::string_view> tag,
-- bool exclusive, std::uint64_t tid,
-- lr::AioCompletion* c)
-+void FIFO::trim_part(int64_t part_num, uint64_t ofs,
-+ std::optional<std::string_view> tag,
-+ bool exclusive, std::uint64_t tid,
-+ lr::AioCompletion* c)
- {
- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
- << " entering: tid=" << tid << dendl;
-@@ -858,12 +1233,7 @@ int FIFO::trim_part(int64_t part_num, uint64_t ofs,
- l.unlock();
- rgw::cls::fifo::trim_part(&op, tag, ofs, exclusive);
- auto r = ioctx.aio_operate(part_oid, c, &op);
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " failed scheduling trim_part: r=" << r
-- << " tid=" << tid << dendl;
-- }
-- return r;
-+ ceph_assert(r >= 0);
- }
-
- int FIFO::open(lr::IoCtx ioctx, std::string oid, std::unique_ptr<FIFO>* fifo,
-@@ -960,54 +1330,42 @@ int FIFO::read_meta(optional_yield y) {
- return read_meta(tid, y);
- }
-
--struct Reader {
-+struct Reader : public Completion<Reader> {
- FIFO* fifo;
- cb::list bl;
-- lr::AioCompletion* super;
- std::uint64_t tid;
-- lr::AioCompletion* cur = lr::Rados::aio_create_completion(
-- static_cast<void*>(this), &FIFO::read_callback);
- Reader(FIFO* fifo, lr::AioCompletion* super, std::uint64_t tid)
-- : fifo(fifo), super(super), tid(tid) {
-- super->pc->get();
-- }
-- ~Reader() {
-- cur->release();
-- }
--};
-+ : Completion(super), fifo(fifo), tid(tid) {}
-
--void FIFO::read_callback(lr::completion_t, void* arg)
--{
-- std::unique_ptr<Reader> reader(static_cast<Reader*>(arg));
-- auto cct = reader->fifo->cct;
-- auto tid = reader->tid;
-- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " entering: tid=" << tid << dendl;
-- auto r = reader->cur->get_return_value();
-- if (r >= 0) try {
-- fifo::op::get_meta_reply reply;
-- auto iter = reader->bl.cbegin();
-- decode(reply, iter);
-- std::unique_lock l(reader->fifo->m);
-- if (reply.info.version.same_or_later(reader->fifo->info.version)) {
-- reader->fifo->info = std::move(reply.info);
-- reader->fifo->part_header_size = reply.part_header_size;
-- reader->fifo->part_entry_overhead = reply.part_entry_overhead;
-- }
-- } catch (const cb::error& err) {
-+ void handle(Ptr&& p, int r) {
-+ auto cct = fifo->cct;
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+ if (r >= 0) try {
-+ fifo::op::get_meta_reply reply;
-+ auto iter = bl.cbegin();
-+ decode(reply, iter);
-+ std::unique_lock l(fifo->m);
-+ if (reply.info.version.same_or_later(fifo->info.version)) {
-+ fifo->info = std::move(reply.info);
-+ fifo->part_header_size = reply.part_header_size;
-+ fifo->part_entry_overhead = reply.part_entry_overhead;
-+ }
-+ } catch (const cb::error& err) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " failed to decode response err=" << err.what()
-+ << " tid=" << tid << dendl;
-+ r = from_error_code(err.code());
-+ } else {
- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " failed to decode response err=" << err.what()
-+ << " read_meta failed r=" << r
- << " tid=" << tid << dendl;
-- r = from_error_code(err.code());
-- } else {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " read_meta failed r=" << r
-- << " tid=" << tid << dendl;
-+ }
-+ complete(std::move(p), r);
- }
-- complete(reader->super, r);
--}
-+};
-
--int FIFO::read_meta(std::uint64_t tid, lr::AioCompletion* c)
-+void FIFO::read_meta(std::uint64_t tid, lr::AioCompletion* c)
- {
- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
- << " entering: tid=" << tid << dendl;
-@@ -1016,16 +1374,10 @@ int FIFO::read_meta(std::uint64_t tid, lr::AioCompletion* c)
- cb::list in;
- encode(gm, in);
- auto reader = std::make_unique<Reader>(this, c, tid);
-- auto r = ioctx.aio_exec(oid, reader->cur, fifo::op::CLASS,
-- fifo::op::GET_META, in, &reader->bl);
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " failed scheduling read_meta r=" << r
-- << " tid=" << tid << dendl;
-- } else {
-- reader.release();
-- }
-- return r;
-+ auto rp = reader.get();
-+ auto r = ioctx.aio_exec(oid, Reader::call(std::move(reader)), fifo::op::CLASS,
-+ fifo::op::GET_META, in, &rp->bl);
-+ assert(r >= 0);
- }
-
- const fifo::info& FIFO::meta() const {
-@@ -1040,6 +1392,10 @@ int FIFO::push(const cb::list& bl, optional_yield y) {
- return push(std::vector{ bl }, y);
- }
-
-+void FIFO::push(const cb::list& bl, lr::AioCompletion* c) {
-+ push(std::vector{ bl }, c);
-+}
-+
- int FIFO::push(const std::vector<cb::list>& data_bufs, optional_yield y)
- {
- std::unique_lock l(m);
-@@ -1153,24 +1509,185 @@ int FIFO::push(const std::vector<cb::list>& data_bufs, optional_yield y)
- return 0;
- }
-
--int FIFO::list(int max_entries,
-- std::optional<std::string_view> markstr,
-- std::vector<list_entry>* presult, bool* pmore,
-- optional_yield y)
--{
-- std::unique_lock l(m);
-- auto tid = ++next_tid;
-- std::int64_t part_num = info.tail_part_num;
-- l.unlock();
-- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " entering: tid=" << tid << dendl;
-- std::uint64_t ofs = 0;
-- if (markstr) {
-- auto marker = to_marker(*markstr);
-- if (!marker) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " invalid marker string: " << markstr
-- << " tid= "<< tid << dendl;
-+struct Pusher : public Completion<Pusher> {
-+ FIFO* f;
-+ std::deque<cb::list> remaining;
-+ std::deque<cb::list> batch;
-+ int i = 0;
-+ std::uint64_t tid;
-+ bool new_heading = false;
-+
-+ void prep_then_push(Ptr&& p, const unsigned successes) {
-+ std::unique_lock l(f->m);
-+ auto max_part_size = f->info.params.max_part_size;
-+ auto part_entry_overhead = f->part_entry_overhead;
-+ l.unlock();
-+
-+ ldout(f->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " preparing push: remaining=" << remaining.size()
-+ << " batch=" << batch.size() << " i=" << i
-+ << " tid=" << tid << dendl;
-+
-+ uint64_t batch_len = 0;
-+ if (successes > 0) {
-+ if (successes == batch.size()) {
-+ batch.clear();
-+ } else {
-+ batch.erase(batch.begin(), batch.begin() + successes);
-+ for (const auto& b : batch) {
-+ batch_len += b.length() + part_entry_overhead;
-+ }
-+ }
-+ }
-+
-+ if (batch.empty() && remaining.empty()) {
-+ complete(std::move(p), 0);
-+ return;
-+ }
-+
-+ while (!remaining.empty() &&
-+ (remaining.front().length() + batch_len <= max_part_size)) {
-+
-+ /* We can send entries with data_len up to max_entry_size,
-+ however, we want to also account the overhead when
-+ dealing with multiple entries. Previous check doesn't
-+ account for overhead on purpose. */
-+ batch_len += remaining.front().length() + part_entry_overhead;
-+ batch.push_back(std::move(remaining.front()));
-+ remaining.pop_front();
-+ }
-+ ldout(f->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " prepared push: remaining=" << remaining.size()
-+ << " batch=" << batch.size() << " i=" << i
-+ << " batch_len=" << batch_len
-+ << " tid=" << tid << dendl;
-+ push(std::move(p));
-+ }
-+
-+ void push(Ptr&& p) {
-+ f->push_entries(batch, tid, call(std::move(p)));
-+ }
-+
-+ void new_head(Ptr&& p) {
-+ new_heading = true;
-+ f->_prepare_new_head(tid, call(std::move(p)));
-+ }
-+
-+ void handle(Ptr&& p, int r) {
-+ if (!new_heading) {
-+ if (r == -ERANGE) {
-+ ldout(f->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " need new head tid=" << tid << dendl;
-+ new_head(std::move(p));
-+ return;
-+ }
-+ if (r < 0) {
-+ lderr(f->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " push_entries failed: r=" << r
-+ << " tid=" << tid << dendl;
-+ complete(std::move(p), r);
-+ return;
-+ }
-+ i = 0; // We've made forward progress, so reset the race counter!
-+ prep_then_push(std::move(p), r);
-+ } else {
-+ if (r < 0) {
-+ lderr(f->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " prepare_new_head failed: r=" << r
-+ << " tid=" << tid << dendl;
-+ complete(std::move(p), r);
-+ return;
-+ }
-+ new_heading = false;
-+ handle_new_head(std::move(p), r);
-+ }
-+ }
-+
-+ void handle_new_head(Ptr&& p, int r) {
-+ if (r == -ECANCELED) {
-+ if (p->i == MAX_RACE_RETRIES) {
-+ lderr(f->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " canceled too many times, giving up: tid=" << tid << dendl;
-+ complete(std::move(p), -ECANCELED);
-+ return;
-+ }
-+ ++p->i;
-+ } else if (r) {
-+ complete(std::move(p), r);
-+ return;
-+ }
-+
-+ if (p->batch.empty()) {
-+ prep_then_push(std::move(p), 0);
-+ return;
-+ } else {
-+ push(std::move(p));
-+ return;
-+ }
-+ }
-+
-+ Pusher(FIFO* f, std::deque<cb::list>&& remaining,
-+ std::uint64_t tid, lr::AioCompletion* super)
-+ : Completion(super), f(f), remaining(std::move(remaining)),
-+ tid(tid) {}
-+};
-+
-+void FIFO::push(const std::vector<cb::list>& data_bufs,
-+ lr::AioCompletion* c)
-+{
-+ std::unique_lock l(m);
-+ auto tid = ++next_tid;
-+ auto max_entry_size = info.params.max_entry_size;
-+ auto need_new_head = info.need_new_head();
-+ l.unlock();
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+ auto p = std::make_unique<Pusher>(this, std::deque<cb::list>(data_bufs.begin(), data_bufs.end()),
-+ tid, c);
-+ // Validate sizes
-+ for (const auto& bl : data_bufs) {
-+ if (bl.length() > max_entry_size) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entry bigger than max_entry_size tid=" << tid << dendl;
-+ Pusher::complete(std::move(p), -E2BIG);
-+ return;
-+ }
-+ }
-+
-+ if (data_bufs.empty() ) {
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " empty push, returning success tid=" << tid << dendl;
-+ Pusher::complete(std::move(p), 0);
-+ return;
-+ }
-+
-+ if (need_new_head) {
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " need new head tid=" << tid << dendl;
-+ p->new_head(std::move(p));
-+ } else {
-+ p->prep_then_push(std::move(p), 0);
-+ }
-+}
-+
-+int FIFO::list(int max_entries,
-+ std::optional<std::string_view> markstr,
-+ std::vector<list_entry>* presult, bool* pmore,
-+ optional_yield y)
-+{
-+ std::unique_lock l(m);
-+ auto tid = ++next_tid;
-+ std::int64_t part_num = info.tail_part_num;
-+ l.unlock();
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+ std::uint64_t ofs = 0;
-+ if (markstr) {
-+ auto marker = to_marker(*markstr);
-+ if (!marker) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " invalid marker string: " << markstr
-+ << " tid= "<< tid << dendl;
- return -EINVAL;
- }
- part_num = marker->num;
-@@ -1340,157 +1857,116 @@ int FIFO::trim(std::string_view markstr, bool exclusive, optional_yield y)
- return 0;
- }
-
--struct Trimmer {
-+struct Trimmer : public Completion<Trimmer> {
- FIFO* fifo;
- std::int64_t part_num;
- std::uint64_t ofs;
- std::int64_t pn;
- bool exclusive;
-- lr::AioCompletion* super;
- std::uint64_t tid;
-- lr::AioCompletion* cur = lr::Rados::aio_create_completion(
-- static_cast<void*>(this), &FIFO::trim_callback);
- bool update = false;
- bool canceled = false;
- int retries = 0;
-
- Trimmer(FIFO* fifo, std::int64_t part_num, std::uint64_t ofs, std::int64_t pn,
- bool exclusive, lr::AioCompletion* super, std::uint64_t tid)
-- : fifo(fifo), part_num(part_num), ofs(ofs), pn(pn), exclusive(exclusive),
-- super(super), tid(tid) {
-- super->pc->get();
-- }
-- ~Trimmer() {
-- cur->release();
-- }
--};
-+ : Completion(super), fifo(fifo), part_num(part_num), ofs(ofs), pn(pn),
-+ exclusive(exclusive), tid(tid) {}
-
--void FIFO::trim_callback(lr::completion_t, void* arg)
--{
-- std::unique_ptr<Trimmer> trimmer(static_cast<Trimmer*>(arg));
-- auto cct = trimmer->fifo->cct;
-- auto tid = trimmer->tid;
-- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " entering: tid=" << tid << dendl;
-- int r = trimmer->cur->get_return_value();
-- if (r == -ENOENT) {
-- r = 0;
-- }
--
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " trim failed: r=" << r << " tid=" << tid << dendl;
-- complete(trimmer->super, r);
-- return;
-- }
--
-- if (!trimmer->update) {
-+ void handle(Ptr&& p, int r) {
-+ auto cct = fifo->cct;
- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " handling preceding trim callback: tid=" << tid << dendl;
-- trimmer->retries = 0;
-- if (trimmer->pn < trimmer->part_num) {
-- std::unique_lock l(trimmer->fifo->m);
-- const auto max_part_size = trimmer->fifo->info.params.max_part_size;
-- l.unlock();
-- trimmer->cur->release();
-- trimmer->cur = lr::Rados::aio_create_completion(arg, &FIFO::trim_callback);
-- r = trimmer->fifo->trim_part(trimmer->pn++, max_part_size, std::nullopt,
-- false, tid, trimmer->cur);
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " trim failed: r=" << r << " tid=" << tid << dendl;
-- complete(trimmer->super, r);
-- } else {
-- trimmer.release();
-- }
-- return;
-+ << " entering: tid=" << tid << dendl;
-+ if (r == -ENOENT) {
-+ r = 0;
- }
-
-- std::unique_lock l(trimmer->fifo->m);
-- const auto tail_part_num = trimmer->fifo->info.tail_part_num;
-- l.unlock();
-- trimmer->cur->release();
-- trimmer->cur = lr::Rados::aio_create_completion(arg, &FIFO::trim_callback);
-- trimmer->update = true;
-- trimmer->canceled = tail_part_num < trimmer->part_num;
-- r = trimmer->fifo->trim_part(trimmer->part_num, trimmer->ofs,
-- std::nullopt, trimmer->exclusive, tid, trimmer->cur);
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " failed scheduling trim: r=" << r << " tid=" << tid << dendl;
-- complete(trimmer->super, r);
-- } else {
-- trimmer.release();
-+ << (update ? " update_meta " : " trim ") << "failed: r="
-+ << r << " tid=" << tid << dendl;
-+ complete(std::move(p), r);
-+ return;
- }
-- return;
-- }
-
-- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " handling update-needed callback: tid=" << tid << dendl;
-- std::unique_lock l(trimmer->fifo->m);
-- auto tail_part_num = trimmer->fifo->info.tail_part_num;
-- auto objv = trimmer->fifo->info.version;
-- l.unlock();
-- if ((tail_part_num < trimmer->part_num) &&
-- trimmer->canceled) {
-- if (trimmer->retries > MAX_RACE_RETRIES) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " canceled too many times, giving up: tid=" << tid << dendl;
-- complete(trimmer->super, -EIO);
-+ if (!update) {
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " handling preceding trim callback: tid=" << tid << dendl;
-+ retries = 0;
-+ if (pn < part_num) {
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " pn=" << pn << " tid=" << tid << dendl;
-+ std::unique_lock l(fifo->m);
-+ const auto max_part_size = fifo->info.params.max_part_size;
-+ l.unlock();
-+ fifo->trim_part(pn++, max_part_size, std::nullopt,
-+ false, tid, call(std::move(p)));
-+ return;
-+ }
-+
-+ std::unique_lock l(fifo->m);
-+ const auto tail_part_num = fifo->info.tail_part_num;
-+ l.unlock();
-+ update = true;
-+ canceled = tail_part_num < part_num;
-+ fifo->trim_part(part_num, ofs, std::nullopt, exclusive, tid,
-+ call(std::move(p)));
- return;
- }
-- trimmer->cur->release();
-- trimmer->cur = lr::Rados::aio_create_completion(arg,
-- &FIFO::trim_callback);
-- ++trimmer->retries;
-- r = trimmer->fifo->_update_meta(fifo::update{}
-- .tail_part_num(trimmer->part_num),
-- objv, &trimmer->canceled,
-- tid, trimmer->cur);
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " failed scheduling _update_meta: r="
-- << r << " tid=" << tid << dendl;
-- complete(trimmer->super, r);
-+
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " handling update-needed callback: tid=" << tid << dendl;
-+ std::unique_lock l(fifo->m);
-+ auto tail_part_num = fifo->info.tail_part_num;
-+ auto objv = fifo->info.version;
-+ l.unlock();
-+ if ((tail_part_num < part_num) &&
-+ canceled) {
-+ if (retries > MAX_RACE_RETRIES) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " canceled too many times, giving up: tid=" << tid << dendl;
-+ complete(std::move(p), -EIO);
-+ return;
-+ }
-+ ++retries;
-+ fifo->_update_meta(fifo::update{}
-+ .tail_part_num(part_num), objv, &canceled,
-+ tid, call(std::move(p)));
- } else {
-- trimmer.release();
-+ complete(std::move(p), 0);
- }
-- } else {
-- complete(trimmer->super, 0);
- }
--}
-+};
-
--int FIFO::trim(std::string_view markstr, bool exclusive, lr::AioCompletion* c) {
-+void FIFO::trim(std::string_view markstr, bool exclusive,
-+ lr::AioCompletion* c) {
- auto marker = to_marker(markstr);
-- if (!marker) {
-- return -EINVAL;
-- }
-+ auto realmark = marker.value_or(::rgw::cls::fifo::marker{});
- std::unique_lock l(m);
- const auto max_part_size = info.params.max_part_size;
- const auto pn = info.tail_part_num;
- const auto part_oid = info.part_oid(pn);
- auto tid = ++next_tid;
- l.unlock();
-- auto trimmer = std::make_unique<Trimmer>(this, marker->num, marker->ofs, pn, exclusive, c,
-- tid);
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+ auto trimmer = std::make_unique<Trimmer>(this, realmark.num, realmark.ofs,
-+ pn, exclusive, c, tid);
-+ if (!marker) {
-+ Trimmer::complete(std::move(trimmer), -EINVAL);
-+ return;
-+ }
- ++trimmer->pn;
- auto ofs = marker->ofs;
- if (pn < marker->num) {
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " pn=" << pn << " tid=" << tid << dendl;
- ofs = max_part_size;
- } else {
- trimmer->update = true;
- }
-- auto r = trim_part(pn, ofs, std::nullopt, exclusive,
-- tid, trimmer->cur);
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " failed scheduling trim_part: r="
-- << r << " tid=" << tid << dendl;
-- complete(trimmer->super, r);
-- } else {
-- trimmer.release();
-- }
-- return r;
-+ trim_part(pn, ofs, std::nullopt, exclusive,
-+ tid, Trimmer::call(std::move(trimmer)));
- }
-
- int FIFO::get_part_info(int64_t part_num,
-@@ -1509,4 +1985,521 @@ int FIFO::get_part_info(int64_t part_num,
- }
- return r;
- }
-+
-+void FIFO::get_part_info(int64_t part_num,
-+ fifo::part_header* header,
-+ lr::AioCompletion* c)
-+{
-+ std::unique_lock l(m);
-+ const auto part_oid = info.part_oid(part_num);
-+ auto tid = ++next_tid;
-+ l.unlock();
-+ auto op = rgw::cls::fifo::get_part_info(cct, header, tid);
-+ auto r = ioctx.aio_operate(part_oid, c, &op, nullptr);
-+ ceph_assert(r >= 0);
-+}
-+
-+struct InfoGetter : Completion<InfoGetter> {
-+ FIFO* fifo;
-+ fifo::part_header header;
-+ fu2::function<void(int r, fifo::part_header&&)> f;
-+ std::uint64_t tid;
-+ bool headerread = false;
-+
-+ InfoGetter(FIFO* fifo, fu2::function<void(int r, fifo::part_header&&)> f,
-+ std::uint64_t tid, lr::AioCompletion* super)
-+ : Completion(super), fifo(fifo), f(std::move(f)), tid(tid) {}
-+ void handle(Ptr&& p, int r) {
-+ if (!headerread) {
-+ if (r < 0) {
-+ lderr(fifo->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " read_meta failed: r="
-+ << r << " tid=" << tid << dendl;
-+ if (f)
-+ f(r, {});
-+ complete(std::move(p), r);
-+ return;
-+ }
-+
-+ auto info = fifo->meta();
-+ auto hpn = info.head_part_num;
-+ if (hpn < 0) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " no head, returning empty partinfo r="
-+ << r << " tid=" << tid << dendl;
-+ if (f)
-+ f(0, {});
-+ complete(std::move(p), r);
-+ return;
-+ }
-+ headerread = true;
-+ auto op = rgw::cls::fifo::get_part_info(fifo->cct, &header, tid);
-+ std::unique_lock l(fifo->m);
-+ auto oid = fifo->info.part_oid(hpn);
-+ l.unlock();
-+ r = fifo->ioctx.aio_operate(oid, call(std::move(p)), &op,
-+ nullptr);
-+ ceph_assert(r >= 0);
-+ return;
-+ }
-+
-+ if (r < 0) {
-+ lderr(fifo->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " get_part_info failed: r="
-+ << r << " tid=" << tid << dendl;
-+ }
-+
-+ if (f)
-+ f(r, std::move(header));
-+ complete(std::move(p), r);
-+ return;
-+ }
-+};
-+
-+void FIFO::get_head_info(fu2::unique_function<void(int r,
-+ fifo::part_header&&)> f,
-+ lr::AioCompletion* c)
-+{
-+ std::unique_lock l(m);
-+ auto tid = ++next_tid;
-+ l.unlock();
-+ auto ig = std::make_unique<InfoGetter>(this, std::move(f), tid, c);
-+ read_meta(tid, InfoGetter::call(std::move(ig)));
-+}
-+
-+struct JournalProcessor : public Completion<JournalProcessor> {
-+private:
-+ FIFO* const fifo;
-+
-+ std::vector<fifo::journal_entry> processed;
-+ std::multimap<std::int64_t, fifo::journal_entry> journal;
-+ std::multimap<std::int64_t, fifo::journal_entry>::iterator iter;
-+ std::int64_t new_tail;
-+ std::int64_t new_head;
-+ std::int64_t new_max;
-+ int race_retries = 0;
-+ bool first_pp = true;
-+ bool canceled = false;
-+ std::uint64_t tid;
-+
-+ enum {
-+ entry_callback,
-+ pp_callback,
-+ } state;
-+
-+ void create_part(Ptr&& p, int64_t part_num,
-+ std::string_view tag) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+ state = entry_callback;
-+ lr::ObjectWriteOperation op;
-+ op.create(false); /* We don't need exclusivity, part_init ensures
-+ we're creating from the same journal entry. */
-+ std::unique_lock l(fifo->m);
-+ part_init(&op, tag, fifo->info.params);
-+ auto oid = fifo->info.part_oid(part_num);
-+ l.unlock();
-+ auto r = fifo->ioctx.aio_operate(oid, call(std::move(p)), &op);
-+ ceph_assert(r >= 0);
-+ return;
-+ }
-+
-+ void remove_part(Ptr&& p, int64_t part_num,
-+ std::string_view tag) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+ state = entry_callback;
-+ lr::ObjectWriteOperation op;
-+ op.remove();
-+ std::unique_lock l(fifo->m);
-+ auto oid = fifo->info.part_oid(part_num);
-+ l.unlock();
-+ auto r = fifo->ioctx.aio_operate(oid, call(std::move(p)), &op);
-+ ceph_assert(r >= 0);
-+ return;
-+ }
-+
-+ void finish_je(Ptr&& p, int r,
-+ const fifo::journal_entry& entry) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " finishing entry: entry=" << entry
-+ << " tid=" << tid << dendl;
-+
-+ if (entry.op == fifo::journal_entry::Op::remove && r == -ENOENT)
-+ r = 0;
-+
-+ if (r < 0) {
-+ lderr(fifo->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " processing entry failed: entry=" << entry
-+ << " r=" << r << " tid=" << tid << dendl;
-+ complete(std::move(p), r);
-+ return;
-+ } else {
-+ switch (entry.op) {
-+ case fifo::journal_entry::Op::unknown:
-+ case fifo::journal_entry::Op::set_head:
-+ // Can't happen. Filtered out in process.
-+ complete(std::move(p), -EIO);
-+ return;
-+
-+ case fifo::journal_entry::Op::create:
-+ if (entry.part_num > new_max) {
-+ new_max = entry.part_num;
-+ }
-+ break;
-+ case fifo::journal_entry::Op::remove:
-+ if (entry.part_num >= new_tail) {
-+ new_tail = entry.part_num + 1;
-+ }
-+ break;
-+ }
-+ processed.push_back(entry);
-+ }
-+ ++iter;
-+ process(std::move(p));
-+ }
-+
-+ void postprocess(Ptr&& p) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+ if (processed.empty()) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " nothing to update any more: race_retries="
-+ << race_retries << " tid=" << tid << dendl;
-+ complete(std::move(p), 0);
-+ return;
-+ }
-+ pp_run(std::move(p), 0, false);
-+ }
-+
-+public:
-+
-+ JournalProcessor(FIFO* fifo, std::uint64_t tid, lr::AioCompletion* super)
-+ : Completion(super), fifo(fifo), tid(tid) {
-+ std::unique_lock l(fifo->m);
-+ journal = fifo->info.journal;
-+ iter = journal.begin();
-+ new_tail = fifo->info.tail_part_num;
-+ new_head = fifo->info.head_part_num;
-+ new_max = fifo->info.max_push_part_num;
-+ }
-+
-+ void pp_run(Ptr&& p, int r, bool canceled) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+ std::optional<int64_t> tail_part_num;
-+ std::optional<int64_t> head_part_num;
-+ std::optional<int64_t> max_part_num;
-+
-+ if (r < 0) {
-+ lderr(fifo->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " failed, r=: " << r << " tid=" << tid << dendl;
-+ complete(std::move(p), r);
-+ }
-+
-+
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " postprocessing: race_retries="
-+ << race_retries << " tid=" << tid << dendl;
-+
-+ if (!first_pp && r == 0 && !canceled) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " nothing to update any more: race_retries="
-+ << race_retries << " tid=" << tid << dendl;
-+ complete(std::move(p), 0);
-+ return;
-+ }
-+
-+ first_pp = false;
-+
-+ if (canceled) {
-+ if (race_retries >= MAX_RACE_RETRIES) {
-+ lderr(fifo->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " canceled too many times, giving up: tid="
-+ << tid << dendl;
-+ complete(std::move(p), -ECANCELED);
-+ return;
-+ }
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " update canceled, retrying: race_retries="
-+ << race_retries << " tid=" << tid << dendl;
-+
-+ ++race_retries;
-+
-+ std::vector<fifo::journal_entry> new_processed;
-+ std::unique_lock l(fifo->m);
-+ for (auto& e : processed) {
-+ auto jiter = fifo->info.journal.find(e.part_num);
-+ /* journal entry was already processed */
-+ if (jiter == fifo->info.journal.end() ||
-+ !(jiter->second == e)) {
-+ continue;
-+ }
-+ new_processed.push_back(e);
-+ }
-+ processed = std::move(new_processed);
-+ }
-+
-+ std::unique_lock l(fifo->m);
-+ auto objv = fifo->info.version;
-+ if (new_tail > fifo->info.tail_part_num) {
-+ tail_part_num = new_tail;
-+ }
-+
-+ if (new_head > fifo->info.head_part_num) {
-+ head_part_num = new_head;
-+ }
-+
-+ if (new_max > fifo->info.max_push_part_num) {
-+ max_part_num = new_max;
-+ }
-+ l.unlock();
-+
-+ if (processed.empty() &&
-+ !tail_part_num &&
-+ !max_part_num) {
-+ /* nothing to update anymore */
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " nothing to update any more: race_retries="
-+ << race_retries << " tid=" << tid << dendl;
-+ complete(std::move(p), 0);
-+ return;
-+ }
-+ state = pp_callback;
-+ fifo->_update_meta(fifo::update{}
-+ .tail_part_num(tail_part_num)
-+ .head_part_num(head_part_num)
-+ .max_push_part_num(max_part_num)
-+ .journal_entries_rm(processed),
-+ objv, &this->canceled, tid, call(std::move(p)));
-+ return;
-+ }
-+
-+ JournalProcessor(const JournalProcessor&) = delete;
-+ JournalProcessor& operator =(const JournalProcessor&) = delete;
-+ JournalProcessor(JournalProcessor&&) = delete;
-+ JournalProcessor& operator =(JournalProcessor&&) = delete;
-+
-+ void process(Ptr&& p) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+ while (iter != journal.end()) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " processing entry: entry=" << *iter
-+ << " tid=" << tid << dendl;
-+ const auto entry = iter->second;
-+ switch (entry.op) {
-+ case fifo::journal_entry::Op::create:
-+ create_part(std::move(p), entry.part_num, entry.part_tag);
-+ return;
-+ case fifo::journal_entry::Op::set_head:
-+ if (entry.part_num > new_head) {
-+ new_head = entry.part_num;
-+ }
-+ processed.push_back(entry);
-+ ++iter;
-+ continue;
-+ case fifo::journal_entry::Op::remove:
-+ remove_part(std::move(p), entry.part_num, entry.part_tag);
-+ return;
-+ default:
-+ lderr(fifo->cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " unknown journaled op: entry=" << entry << " tid="
-+ << tid << dendl;
-+ complete(std::move(p), -EIO);
-+ return;
-+ }
-+ }
-+ postprocess(std::move(p));
-+ return;
-+ }
-+
-+ void handle(Ptr&& p, int r) {
-+ ldout(fifo->cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " entering: tid=" << tid << dendl;
-+ switch (state) {
-+ case entry_callback:
-+ finish_je(std::move(p), r, iter->second);
-+ return;
-+ case pp_callback:
-+ auto c = canceled;
-+ canceled = false;
-+ pp_run(std::move(p), r, c);
-+ return;
-+ }
-+
-+ abort();
-+ }
-+
-+};
-+
-+void FIFO::process_journal(std::uint64_t tid, lr::AioCompletion* c) {
-+ auto p = std::make_unique<JournalProcessor>(this, tid, c);
-+ p->process(std::move(p));
-+}
-+
-+struct Lister : Completion<Lister> {
-+ FIFO* f;
-+ std::vector<list_entry> result;
-+ bool more = false;
-+ std::int64_t part_num;
-+ std::uint64_t ofs;
-+ int max_entries;
-+ int r_out = 0;
-+ std::vector<fifo::part_list_entry> entries;
-+ bool part_more = false;
-+ bool part_full = false;
-+ std::vector<list_entry>* entries_out;
-+ bool* more_out;
-+ std::uint64_t tid;
-+
-+ bool read = false;
-+
-+ void complete(Ptr&& p, int r) {
-+ if (r >= 0) {
-+ if (more_out) *more_out = more;
-+ if (entries_out) *entries_out = std::move(result);
-+ }
-+ Completion::complete(std::move(p), r);
-+ }
-+
-+public:
-+ Lister(FIFO* f, std::int64_t part_num, std::uint64_t ofs, int max_entries,
-+ std::vector<list_entry>* entries_out, bool* more_out,
-+ std::uint64_t tid, lr::AioCompletion* super)
-+ : Completion(super), f(f), part_num(part_num), ofs(ofs), max_entries(max_entries),
-+ entries_out(entries_out), more_out(more_out), tid(tid) {
-+ result.reserve(max_entries);
-+ }
-+
-+ Lister(const Lister&) = delete;
-+ Lister& operator =(const Lister&) = delete;
-+ Lister(Lister&&) = delete;
-+ Lister& operator =(Lister&&) = delete;
-+
-+ void handle(Ptr&& p, int r) {
-+ if (read)
-+ handle_read(std::move(p), r);
-+ else
-+ handle_list(std::move(p), r);
-+ }
-+
-+ void list(Ptr&& p) {
-+ if (max_entries > 0) {
-+ part_more = false;
-+ part_full = false;
-+ entries.clear();
-+
-+ std::unique_lock l(f->m);
-+ auto part_oid = f->info.part_oid(part_num);
-+ l.unlock();
-+
-+ read = false;
-+ auto op = list_part(f->cct, {}, ofs, max_entries, &r_out,
-+ &entries, &part_more, &part_full,
-+ nullptr, tid);
-+ f->ioctx.aio_operate(part_oid, call(std::move(p)), &op, nullptr);
-+ } else {
-+ complete(std::move(p), 0);
-+ }
-+ }
-+
-+ void handle_read(Ptr&& p, int r) {
-+ read = false;
-+ if (r >= 0) r = r_out;
-+ r_out = 0;
-+
-+ if (r < 0) {
-+ complete(std::move(p), r);
-+ return;
-+ }
-+
-+ if (part_num < f->info.tail_part_num) {
-+ /* raced with trim? restart */
-+ max_entries += result.size();
-+ result.clear();
-+ part_num = f->info.tail_part_num;
-+ ofs = 0;
-+ list(std::move(p));
-+ return;
-+ }
-+ /* assuming part was not written yet, so end of data */
-+ more = false;
-+ complete(std::move(p), 0);
-+ return;
-+ }
-+
-+ void handle_list(Ptr&& p, int r) {
-+ if (r >= 0) r = r_out;
-+ r_out = 0;
-+ std::unique_lock l(f->m);
-+ auto part_oid = f->info.part_oid(part_num);
-+ l.unlock();
-+ if (r == -ENOENT) {
-+ read = true;
-+ f->read_meta(tid, call(std::move(p)));
-+ return;
-+ }
-+ if (r < 0) {
-+ complete(std::move(p), r);
-+ return;
-+ }
-+
-+ more = part_full || part_more;
-+ for (auto& entry : entries) {
-+ list_entry e;
-+ e.data = std::move(entry.data);
-+ e.marker = marker{part_num, entry.ofs}.to_string();
-+ e.mtime = entry.mtime;
-+ result.push_back(std::move(e));
-+ }
-+ max_entries -= entries.size();
-+ entries.clear();
-+ if (max_entries > 0 && part_more) {
-+ list(std::move(p));
-+ return;
-+ }
-+
-+ if (!part_full) { /* head part is not full */
-+ complete(std::move(p), 0);
-+ return;
-+ }
-+ ++part_num;
-+ ofs = 0;
-+ list(std::move(p));
-+ }
-+};
-+
-+void FIFO::list(int max_entries,
-+ std::optional<std::string_view> markstr,
-+ std::vector<list_entry>* out,
-+ bool* more,
-+ lr::AioCompletion* c) {
-+ std::unique_lock l(m);
-+ auto tid = ++next_tid;
-+ std::int64_t part_num = info.tail_part_num;
-+ l.unlock();
-+ std::uint64_t ofs = 0;
-+ std::optional<::rgw::cls::fifo::marker> marker;
-+
-+ if (markstr) {
-+ marker = to_marker(*markstr);
-+ if (marker) {
-+ part_num = marker->num;
-+ ofs = marker->ofs;
-+ }
-+ }
-+
-+ auto ls = std::make_unique<Lister>(this, part_num, ofs, max_entries, out,
-+ more, tid, c);
-+ if (markstr && !marker) {
-+ auto l = ls.get();
-+ l->complete(std::move(ls), -EINVAL);
-+ } else {
-+ ls->list(std::move(ls));
-+ }
-+}
- }
-diff --git a/src/rgw/cls_fifo_legacy.h b/src/rgw/cls_fifo_legacy.h
-index 1f8d3f3fc95d8..b6b5f04bb30ad 100644
---- a/src/rgw/cls_fifo_legacy.h
-+++ b/src/rgw/cls_fifo_legacy.h
-@@ -31,6 +31,7 @@
-
- #include "include/rados/librados.hpp"
- #include "include/buffer.h"
-+#include "include/function2.hpp"
-
- #include "common/async/yield_context.h"
-
-@@ -57,24 +58,6 @@ int get_meta(lr::IoCtx& ioctx, const std::string& oid,
- std::uint32_t* part_entry_overhead,
- std::uint64_t tid, optional_yield y,
- bool probe = false);
--void update_meta(lr::ObjectWriteOperation* op, const fifo::objv& objv,
-- const fifo::update& update);
--void part_init(lr::ObjectWriteOperation* op, std::string_view tag,
-- fifo::data_params params);
--int push_part(lr::IoCtx& ioctx, const std::string& oid, std::string_view tag,
-- std::deque<cb::list> data_bufs, std::uint64_t tid, optional_yield y);
--void trim_part(lr::ObjectWriteOperation* op,
-- std::optional<std::string_view> tag, std::uint64_t ofs,
-- bool exclusive);
--int list_part(lr::IoCtx& ioctx, const std::string& oid,
-- std::optional<std::string_view> tag, std::uint64_t ofs,
-- std::uint64_t max_entries,
-- std::vector<fifo::part_list_entry>* entries,
-- bool* more, bool* full_part, std::string* ptag,
-- std::uint64_t tid, optional_yield y);
--int get_part_info(lr::IoCtx& ioctx, const std::string& oid,
-- fifo::part_header* header, std::uint64_t,
-- optional_yield y);
-
- struct marker {
- std::int64_t num = 0;
-@@ -117,6 +100,12 @@ class FIFO {
- friend struct Reader;
- friend struct Updater;
- friend struct Trimmer;
-+ friend struct InfoGetter;
-+ friend struct Pusher;
-+ friend struct NewPartPreparer;
-+ friend struct NewHeadPreparer;
-+ friend struct JournalProcessor;
-+ friend struct Lister;
-
- mutable lr::IoCtx ioctx;
- CephContext* cct = static_cast<CephContext*>(ioctx.cct());
-@@ -144,32 +133,34 @@ class FIFO {
- int _update_meta(const fifo::update& update,
- fifo::objv version, bool* pcanceled,
- std::uint64_t tid, optional_yield y);
-- int _update_meta(const fifo::update& update,
-- fifo::objv version, bool* pcanceled,
-- std::uint64_t tid, lr::AioCompletion* c);
-+ void _update_meta(const fifo::update& update,
-+ fifo::objv version, bool* pcanceled,
-+ std::uint64_t tid, lr::AioCompletion* c);
- int create_part(int64_t part_num, std::string_view tag, std::uint64_t tid,
- optional_yield y);
- int remove_part(int64_t part_num, std::string_view tag, std::uint64_t tid,
- optional_yield y);
- int process_journal(std::uint64_t tid, optional_yield y);
-+ void process_journal(std::uint64_t tid, lr::AioCompletion* c);
- int _prepare_new_part(bool is_head, std::uint64_t tid, optional_yield y);
-+ void _prepare_new_part(bool is_head, std::uint64_t tid, lr::AioCompletion* c);
- int _prepare_new_head(std::uint64_t tid, optional_yield y);
-+ void _prepare_new_head(std::uint64_t tid, lr::AioCompletion* c);
- int push_entries(const std::deque<cb::list>& data_bufs,
- std::uint64_t tid, optional_yield y);
-+ void push_entries(const std::deque<cb::list>& data_bufs,
-+ std::uint64_t tid, lr::AioCompletion* c);
- int trim_part(int64_t part_num, uint64_t ofs,
- std::optional<std::string_view> tag, bool exclusive,
- std::uint64_t tid, optional_yield y);
-- int trim_part(int64_t part_num, uint64_t ofs,
-- std::optional<std::string_view> tag, bool exclusive,
-- std::uint64_t tid, lr::AioCompletion* c);
-+ void trim_part(int64_t part_num, uint64_t ofs,
-+ std::optional<std::string_view> tag, bool exclusive,
-+ std::uint64_t tid, lr::AioCompletion* c);
-
-- static void trim_callback(lr::completion_t, void* arg);
-- static void update_callback(lr::completion_t, void* arg);
-- static void read_callback(lr::completion_t, void* arg);
- /// Force refresh of metadata, yielding/blocking style
- int read_meta(std::uint64_t tid, optional_yield y);
- /// Force refresh of metadata, with a librados Completion
-- int read_meta(std::uint64_t tid, lr::AioCompletion* c);
-+ void read_meta(std::uint64_t tid, lr::AioCompletion* c);
-
- public:
-
-@@ -215,12 +206,20 @@ class FIFO {
- int push(const cb::list& bl, //< Entry to push
- optional_yield y //< Optional yield
- );
-- /// Push entres to the FIFO
-+ /// Push an entry to the FIFO
-+ void push(const cb::list& bl, //< Entry to push
-+ lr::AioCompletion* c //< Async Completion
-+ );
-+ /// Push entries to the FIFO
- int push(const std::vector<cb::list>& data_bufs, //< Entries to push
-- /// Optional yield
-- optional_yield y);
-+ optional_yield y //< Optional yield
-+ );
-+ /// Push entries to the FIFO
-+ void push(const std::vector<cb::list>& data_bufs, //< Entries to push
-+ lr::AioCompletion* c //< Async Completion
-+ );
- /// List entries
-- int list(int max_entries, /// Maximum entries to list
-+ int list(int max_entries, //< Maximum entries to list
- /// Point after which to begin listing. Start at tail if null
- std::optional<std::string_view> markstr,
- std::vector<list_entry>* out, //< OUT: entries
-@@ -228,6 +227,14 @@ class FIFO {
- bool* more,
- optional_yield y //< Optional yield
- );
-+ void list(int max_entries, //< Maximum entries to list
-+ /// Point after which to begin listing. Start at tail if null
-+ std::optional<std::string_view> markstr,
-+ std::vector<list_entry>* out, //< OUT: entries
-+ /// OUT: True if more entries in FIFO beyond the last returned
-+ bool* more,
-+ lr::AioCompletion* c //< Async Completion
-+ );
- /// Trim entries, coroutine/block style
- int trim(std::string_view markstr, //< Position to which to trim, inclusive
- bool exclusive, //< If true, do not trim the target entry
-@@ -235,16 +242,28 @@ class FIFO {
- optional_yield y //< Optional yield
- );
- /// Trim entries, librados AioCompletion style
-- int trim(std::string_view markstr, //< Position to which to trim, inclusive
-- bool exclusive, //< If true, do not trim the target entry
-- //< itself, just all those before it.
-- lr::AioCompletion* c //< librados AIO Completion
-+ void trim(std::string_view markstr, //< Position to which to trim, inclusive
-+ bool exclusive, //< If true, do not trim the target entry
-+ //< itself, just all those before it.
-+ lr::AioCompletion* c //< librados AIO Completion
- );
- /// Get part info
- int get_part_info(int64_t part_num, /// Part number
- fifo::part_header* header, //< OUT: Information
- optional_yield y //< Optional yield
- );
-+ /// Get part info
-+ void get_part_info(int64_t part_num, //< Part number
-+ fifo::part_header* header, //< OUT: Information
-+ lr::AioCompletion* c //< AIO Completion
-+ );
-+ /// A convenience method to fetch the part information for the FIFO
-+ /// head, using librados::AioCompletion, since
-+ /// libradio::AioCompletions compose lousily.
-+ void get_head_info(fu2::unique_function< //< Function to receive info
-+ void(int r, fifo::part_header&&)>,
-+ lr::AioCompletion* c //< AIO Completion
-+ );
- };
- }
-
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index a875d075ecade..8142b26e01a8b 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -469,12 +469,7 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- pc->cond.notify_all();
- pc->put_unlock();
- } else {
-- r = fifos[index]->trim(marker, false, c);
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": unable to trim FIFO: " << get_oid(index)
-- << ": " << cpp_strerror(-r) << dendl;
-- }
-+ fifos[index]->trim(marker, false, c);
- }
- return r;
- }
-diff --git a/src/test/rgw/test_cls_fifo_legacy.cc b/src/test/rgw/test_cls_fifo_legacy.cc
-index dae4980f8dca4..69cee5a887405 100644
---- a/src/test/rgw/test_cls_fifo_legacy.cc
-+++ b/src/test/rgw/test_cls_fifo_legacy.cc
-@@ -69,6 +69,8 @@ class LegacyFIFO : public testing::Test {
- };
-
- using LegacyClsFIFO = LegacyFIFO;
-+using AioLegacyFIFO = LegacyFIFO;
-+
-
- TEST_F(LegacyClsFIFO, TestCreate)
- {
-@@ -577,8 +579,7 @@ TEST_F(LegacyFIFO, TestAioTrim)
- marker = result.front().marker;
- std::unique_ptr<R::AioCompletion> c(rados.aio_create_completion(nullptr,
- nullptr));
-- r = f->trim(*marker, false, c.get());
-- ASSERT_EQ(0, r);
-+ f->trim(*marker, false, c.get());
- c->wait_for_complete();
- r = c->get_return_value();
- ASSERT_EQ(0, r);
-@@ -645,3 +646,482 @@ TEST_F(LegacyFIFO, TestTrimExclusive) {
- ASSERT_EQ(result.size(), 1);
- ASSERT_EQ(max_entries - 1, val);
- }
-+
-+TEST_F(AioLegacyFIFO, TestPushListTrim)
-+{
-+ std::unique_ptr<RCf::FIFO> f;
-+ auto r = RCf::FIFO::create(ioctx, fifo_id, &f, null_yield);
-+ ASSERT_EQ(0, r);
-+ static constexpr auto max_entries = 10u;
-+ for (uint32_t i = 0; i < max_entries; ++i) {
-+ cb::list bl;
-+ encode(i, bl);
-+ auto c = R::Rados::aio_create_completion();
-+ f->push(bl, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+ }
-+
-+ std::optional<std::string> marker;
-+ /* get entries one by one */
-+ std::vector<RCf::list_entry> result;
-+ bool more = false;
-+ for (auto i = 0u; i < max_entries; ++i) {
-+ auto c = R::Rados::aio_create_completion();
-+ f->list(1, marker, &result, &more, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+
-+ bool expected_more = (i != (max_entries - 1));
-+ ASSERT_EQ(expected_more, more);
-+ ASSERT_EQ(1, result.size());
-+
-+ std::uint32_t val;
-+ std::tie(val, marker) = decode_entry<std::uint32_t>(result.front());
-+
-+ ASSERT_EQ(i, val);
-+ result.clear();
-+ }
-+
-+ /* get all entries at once */
-+ std::string markers[max_entries];
-+ std::uint32_t min_entry = 0;
-+ auto c = R::Rados::aio_create_completion();
-+ f->list(max_entries * 10, std::nullopt, &result, &more, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+
-+ ASSERT_FALSE(more);
-+ ASSERT_EQ(max_entries, result.size());
-+ for (auto i = 0u; i < max_entries; ++i) {
-+ std::uint32_t val;
-+ std::tie(val, markers[i]) = decode_entry<std::uint32_t>(result[i]);
-+ ASSERT_EQ(i, val);
-+ }
-+
-+ /* trim one entry */
-+ c = R::Rados::aio_create_completion();
-+ f->trim(markers[min_entry], false, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+ ++min_entry;
-+
-+ c = R::Rados::aio_create_completion();
-+ f->list(max_entries * 10, std::nullopt, &result, &more, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+ ASSERT_FALSE(more);
-+ ASSERT_EQ(max_entries - min_entry, result.size());
-+
-+ for (auto i = min_entry; i < max_entries; ++i) {
-+ std::uint32_t val;
-+ std::tie(val, markers[i - min_entry]) =
-+ decode_entry<std::uint32_t>(result[i - min_entry]);
-+ EXPECT_EQ(i, val);
-+ }
-+}
-+
-+
-+TEST_F(AioLegacyFIFO, TestPushTooBig)
-+{
-+ static constexpr auto max_part_size = 2048ull;
-+ static constexpr auto max_entry_size = 128ull;
-+
-+ std::unique_ptr<RCf::FIFO> f;
-+ auto r = RCf::FIFO::create(ioctx, fifo_id, &f, null_yield, std::nullopt,
-+ std::nullopt, false, max_part_size, max_entry_size);
-+ ASSERT_EQ(0, r);
-+
-+ char buf[max_entry_size + 1];
-+ memset(buf, 0, sizeof(buf));
-+
-+ cb::list bl;
-+ bl.append(buf, sizeof(buf));
-+
-+ auto c = R::Rados::aio_create_completion();
-+ f->push(bl, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ ASSERT_EQ(-E2BIG, r);
-+ c->release();
-+
-+ c = R::Rados::aio_create_completion();
-+ f->push(std::vector<cb::list>{}, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ EXPECT_EQ(0, r);
-+}
-+
-+
-+TEST_F(AioLegacyFIFO, TestMultipleParts)
-+{
-+ static constexpr auto max_part_size = 2048ull;
-+ static constexpr auto max_entry_size = 128ull;
-+ std::unique_ptr<RCf::FIFO> f;
-+ auto r = RCf::FIFO::create(ioctx, fifo_id, &f, null_yield, std::nullopt,
-+ std::nullopt, false, max_part_size,
-+ max_entry_size);
-+ ASSERT_EQ(0, r);
-+
-+ {
-+ auto c = R::Rados::aio_create_completion();
-+ f->get_head_info([&](int r, RCf::part_info&& p) {
-+ ASSERT_TRUE(p.tag.empty());
-+ ASSERT_EQ(0, p.magic);
-+ ASSERT_EQ(0, p.min_ofs);
-+ ASSERT_EQ(0, p.last_ofs);
-+ ASSERT_EQ(0, p.next_ofs);
-+ ASSERT_EQ(0, p.min_index);
-+ ASSERT_EQ(0, p.max_index);
-+ ASSERT_EQ(ceph::real_time{}, p.max_time);
-+ }, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ }
-+
-+ char buf[max_entry_size];
-+ memset(buf, 0, sizeof(buf));
-+ const auto [part_header_size, part_entry_overhead] =
-+ f->get_part_layout_info();
-+ const auto entries_per_part = ((max_part_size - part_header_size) /
-+ (max_entry_size + part_entry_overhead));
-+ const auto max_entries = entries_per_part * 4 + 1;
-+ /* push enough entries */
-+ for (auto i = 0u; i < max_entries; ++i) {
-+ cb::list bl;
-+ *(int *)buf = i;
-+ bl.append(buf, sizeof(buf));
-+ auto c = R::Rados::aio_create_completion();
-+ f->push(bl, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ EXPECT_EQ(0, r);
-+ }
-+
-+ auto info = f->meta();
-+ ASSERT_EQ(info.id, fifo_id);
-+ /* head should have advanced */
-+ ASSERT_GT(info.head_part_num, 0);
-+
-+ /* list all at once */
-+ std::vector<RCf::list_entry> result;
-+ bool more = false;
-+ auto c = R::Rados::aio_create_completion();
-+ f->list(max_entries, std::nullopt, &result, &more, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ EXPECT_EQ(0, r);
-+ EXPECT_EQ(false, more);
-+ ASSERT_EQ(max_entries, result.size());
-+
-+ for (auto i = 0u; i < max_entries; ++i) {
-+ auto& bl = result[i].data;
-+ ASSERT_EQ(i, *(int *)bl.c_str());
-+ }
-+
-+ std::optional<std::string> marker;
-+ /* get entries one by one */
-+
-+ for (auto i = 0u; i < max_entries; ++i) {
-+ c = R::Rados::aio_create_completion();
-+ f->list(1, marker, &result, &more, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ EXPECT_EQ(0, r);
-+ ASSERT_EQ(result.size(), 1);
-+ const bool expected_more = (i != (max_entries - 1));
-+ ASSERT_EQ(expected_more, more);
-+
-+ std::uint32_t val;
-+ std::tie(val, marker) = decode_entry<std::uint32_t>(result.front());
-+
-+ auto& entry = result.front();
-+ auto& bl = entry.data;
-+ ASSERT_EQ(i, *(int *)bl.c_str());
-+ marker = entry.marker;
-+ }
-+
-+ /* trim one at a time */
-+ marker.reset();
-+ for (auto i = 0u; i < max_entries; ++i) {
-+ /* read single entry */
-+ c = R::Rados::aio_create_completion();
-+ f->list(1, marker, &result, &more, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ EXPECT_EQ(0, r);
-+ ASSERT_EQ(result.size(), 1);
-+ const bool expected_more = (i != (max_entries - 1));
-+ ASSERT_EQ(expected_more, more);
-+
-+ marker = result.front().marker;
-+ c = R::Rados::aio_create_completion();
-+ f->trim(*marker, false, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ EXPECT_EQ(0, r);
-+ ASSERT_EQ(result.size(), 1);
-+
-+ /* check tail */
-+ info = f->meta();
-+ ASSERT_EQ(info.tail_part_num, i / entries_per_part);
-+
-+ /* try to read all again, see how many entries left */
-+ c = R::Rados::aio_create_completion();
-+ f->list(max_entries, marker, &result, &more, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ EXPECT_EQ(0, r);
-+ ASSERT_EQ(max_entries - i - 1, result.size());
-+ ASSERT_EQ(false, more);
-+ }
-+
-+ /* tail now should point at head */
-+ info = f->meta();
-+ ASSERT_EQ(info.head_part_num, info.tail_part_num);
-+
-+ /* check old tails are removed */
-+ for (auto i = 0; i < info.tail_part_num; ++i) {
-+ c = R::Rados::aio_create_completion();
-+ RCf::part_info partinfo;
-+ f->get_part_info(i, &partinfo, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(-ENOENT, r);
-+ }
-+ /* check current tail exists */
-+ std::uint64_t next_ofs;
-+ {
-+ c = R::Rados::aio_create_completion();
-+ RCf::part_info partinfo;
-+ f->get_part_info(info.tail_part_num, &partinfo, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ next_ofs = partinfo.next_ofs;
-+ }
-+ ASSERT_EQ(0, r);
-+
-+ c = R::Rados::aio_create_completion();
-+ f->get_head_info([&](int r, RCf::part_info&& p) {
-+ ASSERT_EQ(next_ofs, p.next_ofs);
-+ }, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+}
-+
-+TEST_F(AioLegacyFIFO, TestTwoPushers)
-+{
-+ static constexpr auto max_part_size = 2048ull;
-+ static constexpr auto max_entry_size = 128ull;
-+
-+ std::unique_ptr<RCf::FIFO> f;
-+ auto r = RCf::FIFO::create(ioctx, fifo_id, &f, null_yield, std::nullopt,
-+ std::nullopt, false, max_part_size,
-+ max_entry_size);
-+ ASSERT_EQ(0, r);
-+ char buf[max_entry_size];
-+ memset(buf, 0, sizeof(buf));
-+
-+ auto [part_header_size, part_entry_overhead] = f->get_part_layout_info();
-+ const auto entries_per_part = ((max_part_size - part_header_size) /
-+ (max_entry_size + part_entry_overhead));
-+ const auto max_entries = entries_per_part * 4 + 1;
-+ std::unique_ptr<RCf::FIFO> f2;
-+ r = RCf::FIFO::open(ioctx, fifo_id, &f2, null_yield);
-+ std::vector fifos{&f, &f2};
-+
-+ for (auto i = 0u; i < max_entries; ++i) {
-+ cb::list bl;
-+ *(int *)buf = i;
-+ bl.append(buf, sizeof(buf));
-+ auto& f = *fifos[i % fifos.size()];
-+ auto c = R::Rados::aio_create_completion();
-+ f->push(bl, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+ }
-+
-+ /* list all by both */
-+ std::vector<RCf::list_entry> result;
-+ bool more = false;
-+ auto c = R::Rados::aio_create_completion();
-+ f2->list(max_entries, std::nullopt, &result, &more, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+ ASSERT_EQ(false, more);
-+ ASSERT_EQ(max_entries, result.size());
-+
-+ c = R::Rados::aio_create_completion();
-+ f2->list(max_entries, std::nullopt, &result, &more, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+ ASSERT_EQ(false, more);
-+ ASSERT_EQ(max_entries, result.size());
-+
-+ for (auto i = 0u; i < max_entries; ++i) {
-+ auto& bl = result[i].data;
-+ ASSERT_EQ(i, *(int *)bl.c_str());
-+ }
-+}
-+
-+TEST_F(AioLegacyFIFO, TestTwoPushersTrim)
-+{
-+ static constexpr auto max_part_size = 2048ull;
-+ static constexpr auto max_entry_size = 128ull;
-+ std::unique_ptr<RCf::FIFO> f1;
-+ auto r = RCf::FIFO::create(ioctx, fifo_id, &f1, null_yield, std::nullopt,
-+ std::nullopt, false, max_part_size,
-+ max_entry_size);
-+ ASSERT_EQ(0, r);
-+
-+ char buf[max_entry_size];
-+ memset(buf, 0, sizeof(buf));
-+
-+ auto [part_header_size, part_entry_overhead] = f1->get_part_layout_info();
-+ const auto entries_per_part = ((max_part_size - part_header_size) /
-+ (max_entry_size + part_entry_overhead));
-+ const auto max_entries = entries_per_part * 4 + 1;
-+
-+ std::unique_ptr<RCf::FIFO> f2;
-+ r = RCf::FIFO::open(ioctx, fifo_id, &f2, null_yield);
-+ ASSERT_EQ(0, r);
-+
-+ /* push one entry to f2 and the rest to f1 */
-+ for (auto i = 0u; i < max_entries; ++i) {
-+ cb::list bl;
-+ *(int *)buf = i;
-+ bl.append(buf, sizeof(buf));
-+ auto& f = (i < 1 ? f2 : f1);
-+ auto c = R::Rados::aio_create_completion();
-+ f->push(bl, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+ }
-+
-+ /* trim half by fifo1 */
-+ auto num = max_entries / 2;
-+ std::string marker;
-+ std::vector<RCf::list_entry> result;
-+ bool more = false;
-+ auto c = R::Rados::aio_create_completion();
-+ f1->list(num, std::nullopt, &result, &more, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+ ASSERT_EQ(true, more);
-+ ASSERT_EQ(num, result.size());
-+
-+ for (auto i = 0u; i < num; ++i) {
-+ auto& bl = result[i].data;
-+ ASSERT_EQ(i, *(int *)bl.c_str());
-+ }
-+
-+ auto& entry = result[num - 1];
-+ marker = entry.marker;
-+ c = R::Rados::aio_create_completion();
-+ f1->trim(marker, false, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+ /* list what's left by fifo2 */
-+
-+ const auto left = max_entries - num;
-+ c = R::Rados::aio_create_completion();
-+ f2->list(left, marker, &result, &more, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+ ASSERT_EQ(left, result.size());
-+ ASSERT_EQ(false, more);
-+
-+ for (auto i = num; i < max_entries; ++i) {
-+ auto& bl = result[i - num].data;
-+ ASSERT_EQ(i, *(int *)bl.c_str());
-+ }
-+}
-+
-+TEST_F(AioLegacyFIFO, TestPushBatch)
-+{
-+ static constexpr auto max_part_size = 2048ull;
-+ static constexpr auto max_entry_size = 128ull;
-+
-+ std::unique_ptr<RCf::FIFO> f;
-+ auto r = RCf::FIFO::create(ioctx, fifo_id, &f, null_yield, std::nullopt,
-+ std::nullopt, false, max_part_size,
-+ max_entry_size);
-+ ASSERT_EQ(0, r);
-+
-+ char buf[max_entry_size];
-+ memset(buf, 0, sizeof(buf));
-+ auto [part_header_size, part_entry_overhead] = f->get_part_layout_info();
-+ auto entries_per_part = ((max_part_size - part_header_size) /
-+ (max_entry_size + part_entry_overhead));
-+ auto max_entries = entries_per_part * 4 + 1; /* enough entries to span multiple parts */
-+ std::vector<cb::list> bufs;
-+ for (auto i = 0u; i < max_entries; ++i) {
-+ cb::list bl;
-+ *(int *)buf = i;
-+ bl.append(buf, sizeof(buf));
-+ bufs.push_back(bl);
-+ }
-+ ASSERT_EQ(max_entries, bufs.size());
-+
-+ auto c = R::Rados::aio_create_completion();
-+ f->push(bufs, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+
-+ /* list all */
-+
-+ std::vector<RCf::list_entry> result;
-+ bool more = false;
-+ c = R::Rados::aio_create_completion();
-+ f->list(max_entries, std::nullopt, &result, &more, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(0, r);
-+ ASSERT_EQ(false, more);
-+ ASSERT_EQ(max_entries, result.size());
-+ for (auto i = 0u; i < max_entries; ++i) {
-+ auto& bl = result[i].data;
-+ ASSERT_EQ(i, *(int *)bl.c_str());
-+ }
-+ auto& info = f->meta();
-+ ASSERT_EQ(info.head_part_num, 4);
-+}
-
-From aede44ac6667c9a1ec7e813b547f8765754d896f Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Sat, 21 Nov 2020 01:44:36 -0500
-Subject: [PATCH 03/26] rgw: Factor out tool to deal with different log backing
-
-Read through the shards of a log and find out what kind it is.
-
-Also remove a log.
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit ed15d03f068c6f6e959f04d9d8f99eac82ebbd29)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/cls/log/cls_log_types.h | 3 +
- src/rgw/CMakeLists.txt | 1 +
- src/rgw/rgw_log_backing.cc | 215 +++++++++++++++++++++++++++++++
- src/rgw/rgw_log_backing.h | 70 ++++++++++
- src/test/rgw/CMakeLists.txt | 5 +
- src/test/rgw/test_log_backing.cc | 176 +++++++++++++++++++++++++
- 6 files changed, 470 insertions(+)
- create mode 100644 src/rgw/rgw_log_backing.cc
- create mode 100644 src/rgw/rgw_log_backing.h
- create mode 100644 src/test/rgw/test_log_backing.cc
-
-diff --git a/src/cls/log/cls_log_types.h b/src/cls/log/cls_log_types.h
-index c5c00766d8156..1746d243e5a14 100644
---- a/src/cls/log/cls_log_types.h
-+++ b/src/cls/log/cls_log_types.h
-@@ -65,6 +65,9 @@ inline bool operator ==(const cls_log_header& lhs, const cls_log_header& rhs) {
- return (lhs.max_marker == rhs.max_marker &&
- lhs.max_time == rhs.max_time);
- }
-+inline bool operator !=(const cls_log_header& lhs, const cls_log_header& rhs) {
-+ return !(lhs == rhs);
-+}
- WRITE_CLASS_ENCODER(cls_log_header)
-
-
-diff --git a/src/rgw/CMakeLists.txt b/src/rgw/CMakeLists.txt
-index 44de25895ea2d..d3d91d4957947 100644
---- a/src/rgw/CMakeLists.txt
-+++ b/src/rgw/CMakeLists.txt
-@@ -141,6 +141,7 @@ set(librgw_common_srcs
- rgw_tag.cc
- rgw_tag_s3.cc
- rgw_tools.cc
-+ rgw_log_backing.cc
- rgw_user.cc
- rgw_website.cc
- rgw_xml.cc
-diff --git a/src/rgw/rgw_log_backing.cc b/src/rgw/rgw_log_backing.cc
-new file mode 100644
-index 0000000000000..63edf972a0307
---- /dev/null
-+++ b/src/rgw/rgw_log_backing.cc
-@@ -0,0 +1,215 @@
-+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-+// vim: ts=8 sw=2 smarttab ft=cpp
-+
-+#include "cls/log/cls_log_client.h"
-+
-+#include "rgw_log_backing.h"
-+#include "rgw_tools.h"
-+#include "cls_fifo_legacy.h"
-+
-+static constexpr auto dout_subsys = ceph_subsys_rgw;
-+
-+enum class shard_check { dne, omap, fifo, corrupt };
-+inline std::ostream& operator <<(std::ostream& m, const shard_check& t) {
-+ switch (t) {
-+ case shard_check::dne:
-+ return m << "shard_check::dne";
-+ case shard_check::omap:
-+ return m << "shard_check::omap";
-+ case shard_check::fifo:
-+ return m << "shard_check::fifo";
-+ case shard_check::corrupt:
-+ return m << "shard_check::corrupt";
-+ }
-+
-+ return m << "shard_check::UNKNOWN=" << static_cast<uint32_t>(t);
-+}
-+
-+namespace {
-+/// Return the shard type, and a bool to see whether it has entries.
-+std::pair<shard_check, bool>
-+probe_shard(librados::IoCtx& ioctx, const std::string& oid, optional_yield y)
-+{
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ bool omap = false;
-+ {
-+ librados::ObjectReadOperation op;
-+ cls_log_header header;
-+ cls_log_info(op, &header);
-+ auto r = rgw_rados_operate(ioctx, oid, &op, nullptr, y);
-+ if (r == -ENOENT) {
-+ return { shard_check::dne, {} };
-+ }
-+
-+ if (r < 0) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " error probing for omap: r=" << r
-+ << ", oid=" << oid << dendl;
-+ return { shard_check::corrupt, {} };
-+ }
-+ if (header != cls_log_header{})
-+ omap = true;
-+ }
-+ std::unique_ptr<rgw::cls::fifo::FIFO> fifo;
-+ auto r = rgw::cls::fifo::FIFO::open(ioctx, oid,
-+ &fifo, y,
-+ std::nullopt, true);
-+ if (r < 0 && !(r == -ENOENT || r == -ENODATA)) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " error probing for fifo: r=" << r
-+ << ", oid=" << oid << dendl;
-+ return { shard_check::corrupt, {} };
-+ }
-+ if (fifo && omap) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " fifo and omap found: oid=" << oid << dendl;
-+ return { shard_check::corrupt, {} };
-+ }
-+ if (fifo) {
-+ bool more = false;
-+ std::vector<rgw::cls::fifo::list_entry> entries;
-+ r = fifo->list(1, nullopt, &entries, &more, y);
-+ if (r < 0) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": unable to list entries: r=" << r
-+ << ", oid=" << oid << dendl;
-+ return { shard_check::corrupt, {} };
-+ }
-+ return { shard_check::fifo, !entries.empty() };
-+ }
-+ if (omap) {
-+ std::list<cls_log_entry> entries;
-+ std::string out_marker;
-+ bool truncated = false;
-+ librados::ObjectReadOperation op;
-+ cls_log_list(op, {}, {}, {}, 1, entries,
-+ &out_marker, &truncated);
-+ auto r = rgw_rados_operate(ioctx, oid, &op, nullptr, y);
-+ if (r < 0) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": failed to list: r=" << r << ", oid=" << oid << dendl;
-+ return { shard_check::corrupt, {} };
-+ }
-+ return { shard_check::omap, !entries.empty() };
-+ }
-+
-+ // An object exists, but has never had FIFO or cls_log entries written
-+ // to it. Likely just the marker Omap.
-+ return { shard_check::dne, {} };
-+}
-+
-+tl::expected<log_type, bs::error_code>
-+handle_dne(librados::IoCtx& ioctx,
-+ log_type def,
-+ std::string oid,
-+ optional_yield y)
-+{
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ if (def == log_type::fifo) {
-+ std::unique_ptr<rgw::cls::fifo::FIFO> fifo;
-+ auto r = rgw::cls::fifo::FIFO::create(ioctx, oid,
-+ &fifo, y,
-+ std::nullopt);
-+ if (r < 0) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " error creating FIFO: r=" << r
-+ << ", oid=" << oid << dendl;
-+ return tl::unexpected(bs::error_code(-r, bs::system_category()));
-+ }
-+ }
-+ return def;
-+}
-+}
-+
-+tl::expected<log_type, bs::error_code>
-+log_backing_type(librados::IoCtx& ioctx,
-+ log_type def,
-+ int shards,
-+ const fu2::unique_function<std::string(int) const>& get_oid,
-+ optional_yield y)
-+{
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ auto check = shard_check::dne;
-+ for (int i = 0; i < shards; ++i) {
-+ auto [c, e] = probe_shard(ioctx, get_oid(i), y);
-+ if (c == shard_check::corrupt)
-+ return tl::unexpected(bs::error_code(EIO, bs::system_category()));
-+ if (c == shard_check::dne) continue;
-+ if (check == shard_check::dne) {
-+ check = c;
-+ continue;
-+ }
-+
-+ if (check != c) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " clashing types: check=" << check
-+ << ", c=" << c << dendl;
-+ return tl::unexpected(bs::error_code(EIO, bs::system_category()));
-+ }
-+ }
-+ if (check == shard_check::corrupt) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " should be unreachable!" << dendl;
-+ return tl::unexpected(bs::error_code(EIO, bs::system_category()));
-+ }
-+
-+ if (check == shard_check::dne)
-+ return handle_dne(ioctx,
-+ def,
-+ get_oid(0),
-+ y);
-+
-+ return (check == shard_check::fifo ? log_type::fifo : log_type::omap);
-+}
-+
-+bs::error_code log_remove(librados::IoCtx& ioctx,
-+ int shards,
-+ const fu2::unique_function<std::string(int) const>& get_oid,
-+ optional_yield y)
-+{
-+ bs::error_code ec;
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ for (int i = 0; i < shards; ++i) {
-+ auto oid = get_oid(i);
-+ rados::cls::fifo::info info;
-+ uint32_t part_header_size = 0, part_entry_overhead = 0;
-+
-+ auto r = rgw::cls::fifo::get_meta(ioctx, oid, nullopt, &info,
-+ &part_header_size, &part_entry_overhead,
-+ 0, y, true);
-+ if (r == -ENOENT) continue;
-+ if (r == 0 && info.head_part_num > -1) {
-+ for (auto j = info.tail_part_num; j <= info.head_part_num; ++j) {
-+ librados::ObjectWriteOperation op;
-+ op.remove();
-+ auto part_oid = info.part_oid(j);
-+ auto subr = rgw_rados_operate(ioctx, part_oid, &op, null_yield);
-+ if (subr < 0 && subr != -ENOENT) {
-+ if (!ec)
-+ ec = bs::error_code(-subr, bs::system_category());
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": failed removing FIFO part: part_oid=" << part_oid
-+ << ", subr=" << subr << dendl;
-+ }
-+ }
-+ }
-+ if (r < 0 && r != -ENODATA) {
-+ if (!ec)
-+ ec = bs::error_code(-r, bs::system_category());
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": failed checking FIFO part: oid=" << oid
-+ << ", r=" << r << dendl;
-+ }
-+ librados::ObjectWriteOperation op;
-+ op.remove();
-+ r = rgw_rados_operate(ioctx, oid, &op, null_yield);
-+ if (r < 0 && r != -ENOENT) {
-+ if (!ec)
-+ ec = bs::error_code(-r, bs::system_category());
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": failed removing shard: oid=" << oid
-+ << ", r=" << r << dendl;
-+ }
-+ }
-+ return ec;
-+}
-diff --git a/src/rgw/rgw_log_backing.h b/src/rgw/rgw_log_backing.h
-new file mode 100644
-index 0000000000000..d769af48b01fe
---- /dev/null
-+++ b/src/rgw/rgw_log_backing.h
-@@ -0,0 +1,70 @@
-+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-+// vim: ts=8 sw=2 smarttab ft=cpp
-+
-+#ifndef CEPH_RGW_LOGBACKING_H
-+#define CEPH_RGW_LOGBACKING_H
-+
-+#include <optional>
-+#include <iostream>
-+#include <string>
-+#include <string_view>
-+
-+#include <strings.h>
-+
-+#include <boost/system/error_code.hpp>
-+
-+#include "include/rados/librados.hpp"
-+#include "include/expected.hpp"
-+#include "include/function2.hpp"
-+
-+#include "common/async/yield_context.h"
-+
-+namespace bs = boost::system;
-+
-+/// Type of log backing, stored in the mark used in the quick check,
-+/// and passed to checking functions.
-+enum class log_type {
-+ omap = 0,
-+ fifo = 1
-+};
-+
-+inline std::optional<log_type> to_log_type(std::string_view s) {
-+ if (strncasecmp(s.data(), "omap", s.length()) == 0) {
-+ return log_type::omap;
-+ } else if (strncasecmp(s.data(), "fifo", s.length()) == 0) {
-+ return log_type::fifo;
-+ } else {
-+ return std::nullopt;
-+ }
-+}
-+inline std::ostream& operator <<(std::ostream& m, const log_type& t) {
-+ switch (t) {
-+ case log_type::omap:
-+ return m << "log_type::omap";
-+ case log_type::fifo:
-+ return m << "log_type::fifo";
-+ }
-+
-+ return m << "log_type::UNKNOWN=" << static_cast<uint32_t>(t);
-+}
-+
-+/// Look over the shards in a log and determine the type.
-+tl::expected<log_type, bs::error_code>
-+log_backing_type(librados::IoCtx& ioctx,
-+ log_type def,
-+ int shards, //< Total number of shards
-+ /// A function taking a shard number and
-+ /// returning an oid.
-+ const fu2::unique_function<std::string(int) const>& get_oid,
-+ optional_yield y);
-+
-+/// Remove all log shards and associated parts of fifos.
-+bs::error_code log_remove(librados::IoCtx& ioctx,
-+ int shards, //< Total number of shards
-+ /// A function taking a shard number and
-+ /// returning an oid.
-+ const fu2::unique_function<std::string(int) const>& get_oid,
-+ optional_yield y);
-+
-+
-+#endif
-diff --git a/src/test/rgw/CMakeLists.txt b/src/test/rgw/CMakeLists.txt
-index 7817a42ef9ab8..c4aa22db81749 100644
---- a/src/test/rgw/CMakeLists.txt
-+++ b/src/test/rgw/CMakeLists.txt
-@@ -213,6 +213,11 @@ add_executable(unittest_cls_fifo_legacy test_cls_fifo_legacy.cc)
- target_link_libraries(unittest_cls_fifo_legacy radostest-cxx ${UNITTEST_LIBS}
- ${rgw_libs})
-
-+# unittest_log_backing
-+add_executable(unittest_log_backing test_log_backing.cc)
-+target_link_libraries(unittest_log_backing radostest-cxx ${UNITTEST_LIBS}
-+ ${rgw_libs})
-+
- add_executable(unittest_rgw_lua test_rgw_lua.cc)
- add_ceph_unittest(unittest_rgw_lua)
- target_link_libraries(unittest_rgw_lua ${rgw_libs} ${LUA_LIBRARIES})
-diff --git a/src/test/rgw/test_log_backing.cc b/src/test/rgw/test_log_backing.cc
-new file mode 100644
-index 0000000000000..5180d5fc74fe8
---- /dev/null
-+++ b/src/test/rgw/test_log_backing.cc
-@@ -0,0 +1,176 @@
-+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-+// vim: ts=8 sw=2 smarttab
-+/*
-+ * Ceph - scalable distributed file system
-+ *
-+ * Copyright (C) 2019 Red Hat, Inc.
-+ *
-+ * This is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License version 2.1, as published by the Free Software
-+ * Foundation. See file COPYING.
-+ *
-+ */
-+
-+#include "rgw_log_backing.h"
-+
-+#include <cerrno>
-+#include <iostream>
-+#include <string_view>
-+
-+#undef FMT_HEADER_ONLY
-+#define FMT_HEADER_ONLY 1
-+#include <fmt/format.h>
-+
-+#include "include/types.h"
-+#include "include/rados/librados.hpp"
-+
-+#include "test/librados/test_cxx.h"
-+#include "global/global_context.h"
-+
-+#include "cls/log/cls_log_client.h"
-+
-+#include "rgw/rgw_tools.h"
-+#include "rgw/cls_fifo_legacy.h"
-+
-+#include "gtest/gtest.h"
-+
-+namespace lr = librados;
-+namespace cb = ceph::buffer;
-+namespace fifo = rados::cls::fifo;
-+namespace RCf = rgw::cls::fifo;
-+
-+class LogBacking : public testing::Test {
-+protected:
-+ static constexpr int SHARDS = 3;
-+ const std::string pool_name = get_temp_pool_name();
-+ lr::Rados rados;
-+ lr::IoCtx ioctx;
-+
-+ void SetUp() override {
-+ ASSERT_EQ("", create_one_pool_pp(pool_name, rados));
-+ ASSERT_EQ(0, rados.ioctx_create(pool_name.c_str(), ioctx));
-+ }
-+ void TearDown() override {
-+ destroy_one_pool_pp(pool_name, rados);
-+ }
-+
-+ static std::string get_oid(int i) {
-+ return fmt::format("shard.{}", i);
-+ }
-+
-+ void make_omap() {
-+ for (int i = 0; i < SHARDS; ++i) {
-+ using ceph::encode;
-+ lr::ObjectWriteOperation op;
-+ cb::list bl;
-+ encode(i, bl);
-+ cls_log_add(op, ceph_clock_now(), {}, "meow", bl);
-+ auto r = rgw_rados_operate(ioctx, get_oid(i), &op, null_yield);
-+ ASSERT_GE(r, 0);
-+ }
-+ }
-+
-+ void add_omap(int i) {
-+ using ceph::encode;
-+ lr::ObjectWriteOperation op;
-+ cb::list bl;
-+ encode(i, bl);
-+ cls_log_add(op, ceph_clock_now(), {}, "meow", bl);
-+ auto r = rgw_rados_operate(ioctx, get_oid(i), &op, null_yield);
-+ ASSERT_GE(r, 0);
-+ }
-+
-+ void empty_omap() {
-+ for (int i = 0; i < SHARDS; ++i) {
-+ auto oid = get_oid(i);
-+ std::string to_marker;
-+ {
-+ lr::ObjectReadOperation op;
-+ std::list<cls_log_entry> entries;
-+ bool truncated = false;
-+ cls_log_list(op, {}, {}, {}, 1, entries, &to_marker, &truncated);
-+ auto r = rgw_rados_operate(ioctx, oid, &op, nullptr, null_yield);
-+ ASSERT_GE(r, 0);
-+ ASSERT_FALSE(entries.empty());
-+ }
-+ {
-+ lr::ObjectWriteOperation op;
-+ cls_log_trim(op, {}, {}, {}, to_marker);
-+ auto r = rgw_rados_operate(ioctx, oid, &op, null_yield);
-+ ASSERT_GE(r, 0);
-+ }
-+ {
-+ lr::ObjectReadOperation op;
-+ std::list<cls_log_entry> entries;
-+ bool truncated = false;
-+ cls_log_list(op, {}, {}, {}, 1, entries, &to_marker, &truncated);
-+ auto r = rgw_rados_operate(ioctx, oid, &op, nullptr, null_yield);
-+ ASSERT_GE(r, 0);
-+ ASSERT_TRUE(entries.empty());
-+ }
-+ }
-+ }
-+
-+ void make_fifo()
-+ {
-+ for (int i = 0; i < SHARDS; ++i) {
-+ std::unique_ptr<RCf::FIFO> fifo;
-+ auto r = RCf::FIFO::create(ioctx, get_oid(i), &fifo, null_yield);
-+ ASSERT_EQ(0, r);
-+ ASSERT_TRUE(fifo);
-+ }
-+ }
-+
-+ void add_fifo(int i)
-+ {
-+ using ceph::encode;
-+ std::unique_ptr<RCf::FIFO> fifo;
-+ auto r = RCf::FIFO::open(ioctx, get_oid(i), &fifo, null_yield);
-+ ASSERT_GE(0, r);
-+ ASSERT_TRUE(fifo);
-+ cb::list bl;
-+ encode(i, bl);
-+ r = fifo->push(bl, null_yield);
-+ ASSERT_GE(0, r);
-+ }
-+
-+ void assert_empty() {
-+ std::vector<lr::ObjectItem> result;
-+ lr::ObjectCursor next;
-+ auto r = ioctx.object_list(ioctx.object_list_begin(), ioctx.object_list_end(),
-+ 100, {}, &result, &next);
-+ ASSERT_GE(r, 0);
-+ ASSERT_TRUE(result.empty());
-+ }
-+};
-+
-+TEST_F(LogBacking, TestOmap)
-+{
-+ make_omap();
-+ auto stat = log_backing_type(ioctx, log_type::fifo, SHARDS,
-+ get_oid, null_yield);
-+ ASSERT_EQ(log_type::omap, *stat);
-+}
-+
-+TEST_F(LogBacking, TestOmapEmpty)
-+{
-+ auto stat = log_backing_type(ioctx, log_type::omap, SHARDS,
-+ get_oid, null_yield);
-+ ASSERT_EQ(log_type::omap, *stat);
-+}
-+
-+TEST_F(LogBacking, TestFIFO)
-+{
-+ make_fifo();
-+ auto stat = log_backing_type(ioctx, log_type::fifo, SHARDS,
-+ get_oid, null_yield);
-+ ASSERT_EQ(log_type::fifo, *stat);
-+}
-+
-+TEST_F(LogBacking, TestFIFOEmpty)
-+{
-+ auto stat = log_backing_type(ioctx, log_type::fifo, SHARDS,
-+ get_oid, null_yield);
-+ ASSERT_EQ(log_type::fifo, *stat);
-+}
-
-From 8c81b6fa1b2a0f1d409afbd0126d18cfc97315c4 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Sat, 21 Nov 2020 15:45:12 -0500
-Subject: [PATCH 04/26] rgw: Use refactored log backing tools
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit da6223d281e33e43fa74c50f4d0eedb5ac25ace4)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/common/options.cc | 16 ++--
- src/rgw/rgw_datalog.cc | 208 +++++------------------------------------
- src/rgw/rgw_datalog.h | 5 +-
- 3 files changed, 31 insertions(+), 198 deletions(-)
-
-diff --git a/src/common/options.cc b/src/common/options.cc
-index 75d6589c08296..8fdd62fb14ccb 100644
---- a/src/common/options.cc
-+++ b/src/common/options.cc
-@@ -7407,17 +7407,15 @@ std::vector<Option> get_rgw_options() {
- .add_see_also("rgw_dmclock_metadata_res")
- .add_see_also("rgw_dmclock_metadata_wgt"),
-
-- Option("rgw_data_log_backing", Option::TYPE_STR, Option::LEVEL_ADVANCED)
-- .set_default("auto")
-- .set_enum_allowed( { "auto", "fifo", "omap" } )
-- .set_description("Backing store for the RGW data sync log")
-+ Option("rgw_default_data_log_backing", Option::TYPE_STR, Option::LEVEL_ADVANCED)
-+ .set_default("fifo")
-+ .set_enum_allowed( { "fifo", "omap" } )
-+ .set_description("Default backing store for the RGW data sync log")
- .set_long_description(
- "Whether to use the older OMAP backing store or the high performance "
-- "FIFO based backing store. Auto uses whatever already exists "
-- "but will default to FIFO if there isn't an existing log. Either of "
-- "the explicit options will cause startup to fail if the other log is "
-- "still around."),
--
-+ "FIFO based backing store by default. This only covers the creation of "
-+ "the log on startup if none exists."),
-+
- Option("rgw_luarocks_location", Option::TYPE_STR, Option::LEVEL_ADVANCED)
- .set_flag(Option::FLAG_STARTUP)
- #ifdef WITH_RADOSGW_LUA_PACKAGES
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index 8142b26e01a8b..d6a9d210d1b56 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -14,6 +14,7 @@
-
- #include "cls_fifo_legacy.h"
- #include "rgw_datalog.h"
-+#include "rgw_log_backing.h"
- #include "rgw_tools.h"
-
- #define dout_context g_ceph_context
-@@ -67,38 +68,6 @@ void rgw_data_change_log_entry::decode_json(JSONObj *obj) {
- JSONDecoder::decode_json("entry", entry, obj);
- }
-
--int RGWDataChangesBE::remove(CephContext* cct, librados::Rados* rados,
-- const rgw_pool& log_pool)
--{
-- auto num_shards = cct->_conf->rgw_data_log_num_shards;
-- librados::IoCtx ioctx;
-- auto r = rgw_init_ioctx(rados, log_pool.name, ioctx,
-- false, false);
-- if (r < 0) {
-- if (r == -ENOENT) {
-- return 0;
-- } else {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": rgw_init_ioctx failed: " << log_pool.name
-- << ": " << cpp_strerror(-r) << dendl;
-- return r;
-- }
-- }
-- for (auto i = 0; i < num_shards; ++i) {
-- auto oid = get_oid(cct, i);
-- librados::ObjectWriteOperation op;
-- op.remove();
-- auto r = rgw_rados_operate(ioctx, oid, &op, null_yield);
-- if (r < 0 && r != -ENOENT) {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": remove failed: " << log_pool.name << "/" << oid
-- << ": " << cpp_strerror(-r) << dendl;
-- }
-- }
-- return 0;
--}
--
--
- class RGWDataChangesOmap final : public RGWDataChangesBE {
- using centries = std::list<cls_log_entry>;
- RGWSI_Cls& cls;
-@@ -113,44 +82,6 @@ class RGWDataChangesOmap final : public RGWDataChangesBE {
- }
- }
- ~RGWDataChangesOmap() override = default;
-- static int exists(CephContext* cct, RGWSI_Cls& cls, bool* exists,
-- bool* has_entries) {
-- auto num_shards = cct->_conf->rgw_data_log_num_shards;
-- std::string out_marker;
-- bool truncated = false;
-- std::list<cls_log_entry> log_entries;
-- const cls_log_header empty_info;
-- *exists = false;
-- *has_entries = false;
-- for (auto i = 0; i < num_shards; ++i) {
-- cls_log_header info;
-- auto oid = get_oid(cct, i);
-- auto r = cls.timelog.info(oid, &info, null_yield);
-- if (r < 0 && r != -ENOENT) {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": failed to get info " << oid << ": " << cpp_strerror(-r)
-- << dendl;
-- return r;
-- } else if ((r == -ENOENT) || (info == empty_info)) {
-- continue;
-- }
-- *exists = true;
-- r = cls.timelog.list(oid, {}, {}, 100, log_entries, "", &out_marker,
-- &truncated, null_yield);
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": failed to list " << oid << ": " << cpp_strerror(-r)
-- << dendl;
-- return r;
-- } else if (!log_entries.empty()) {
-- *has_entries = true;
-- break; // No reason to continue, once we have both existence
-- // AND non-emptiness
-- }
-- }
-- return 0;
-- }
--
- void prepare(ceph::real_time ut, const std::string& key,
- ceph::buffer::list&& entry, entries& out) override {
- if (!std::holds_alternative<centries>(out)) {
-@@ -294,54 +225,6 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- }));
- }
- ~RGWDataChangesFIFO() override = default;
-- static int exists(CephContext* cct, librados::Rados* rados,
-- const rgw_pool& log_pool, bool* exists, bool* has_entries) {
-- auto num_shards = cct->_conf->rgw_data_log_num_shards;
-- librados::IoCtx ioctx;
-- auto r = rgw_init_ioctx(rados, log_pool.name, ioctx,
-- false, false);
-- if (r < 0) {
-- if (r == -ENOENT) {
-- return 0;
-- } else {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": rgw_init_ioctx failed: " << log_pool.name
-- << ": " << cpp_strerror(-r) << dendl;
-- return r;
-- }
-- }
-- *exists = false;
-- *has_entries = false;
-- for (auto i = 0; i < num_shards; ++i) {
-- std::unique_ptr<rgw::cls::fifo::FIFO> fifo;
-- auto oid = get_oid(cct, i);
-- std::vector<rgw::cls::fifo::list_entry> log_entries;
-- bool more = false;
-- auto r = rgw::cls::fifo::FIFO::open(ioctx, oid,
-- &fifo, null_yield,
-- std::nullopt, true);
-- if (r == -ENOENT || r == -ENODATA) {
-- continue;
-- } else if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": unable to open FIFO: " << log_pool << "/" << oid
-- << ": " << cpp_strerror(-r) << dendl;
-- return r;
-- }
-- *exists = true;
-- r = fifo->list(1, nullopt, &log_entries, &more,
-- null_yield);
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": unable to list entries: " << log_pool << "/" << oid
-- << ": " << cpp_strerror(-r) << dendl;
-- } else if (!log_entries.empty()) {
-- *has_entries = true;
-- break;
-- }
-- }
-- return 0;
-- }
- void prepare(ceph::real_time, const std::string&,
- ceph::buffer::list&& entry, entries& out) override {
- if (!std::holds_alternative<centries>(out)) {
-@@ -490,83 +373,38 @@ int RGWDataChangesLog::start(const RGWZone* _zone,
- RGWSI_Cls *cls, librados::Rados* lr)
- {
- zone = _zone;
-- assert(zone);
-- auto backing = cct->_conf.get_val<std::string>("rgw_data_log_backing");
-+ ceph_assert(zone);
-+ auto defbacking = to_log_type(
-+ cct->_conf.get_val<std::string>("rgw_default_data_log_backing"));
- // Should be guaranteed by `set_enum_allowed`
-- ceph_assert(backing == "auto" || backing == "fifo" || backing == "omap");
-+ ceph_assert(defbacking);
- auto log_pool = zoneparams.log_pool;
-- bool omapexists = false, omaphasentries = false;
-- auto r = RGWDataChangesOmap::exists(cct, *cls, &omapexists, &omaphasentries);
-+ auto r = rgw_init_ioctx(lr, log_pool, ioctx, true, false);
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
-- << ": Error when checking for existing Omap datalog backend: "
-- << cpp_strerror(-r) << dendl;
-+ << ": Failed to initialized ioctx, r=" << r
-+ << ", pool=" << log_pool << dendl;
-+ return -r;
- }
-- bool fifoexists = false, fifohasentries = false;
-- r = RGWDataChangesFIFO::exists(cct, lr, log_pool, &fifoexists, &fifohasentries);
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": Error when checking for existing FIFO datalog backend: "
-- << cpp_strerror(-r) << dendl;
-- }
-- bool has_entries = omaphasentries || fifohasentries;
-- bool remove = false;
-+ auto found = log_backing_type(ioctx, *defbacking, num_shards,
-+ [this](int i) {
-+ return RGWDataChangesBE::get_oid(cct, i);
-+ },
-+ null_yield);
-
-- if (omapexists && fifoexists) {
-- if (has_entries) {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": Both Omap and FIFO backends exist, cannot continue."
-- << dendl;
-- return -EINVAL;
-- }
-- ldout(cct, 0)
-- << __PRETTY_FUNCTION__
-- << ": Both Omap and FIFO backends exist, but are empty. Will remove."
-- << dendl;
-- remove = true;
-- }
-- if (backing == "omap" && fifoexists) {
-- if (has_entries) {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": Omap requested, but FIFO backend exists, cannot continue."
-- << dendl;
-- return -EINVAL;
-- }
-- ldout(cct, 0) << __PRETTY_FUNCTION__
-- << ": Omap requested, FIFO exists, but is empty. Deleting."
-- << dendl;
-- remove = true;
-- }
-- if (backing == "fifo" && omapexists) {
-- if (has_entries) {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": FIFO requested, but Omap backend exists, cannot continue."
-- << dendl;
-- return -EINVAL;
-- }
-- ldout(cct, 0) << __PRETTY_FUNCTION__
-- << ": FIFO requested, Omap exists, but is empty. Deleting."
-- << dendl;
-- remove = true;
-- }
--
-- if (remove) {
-- r = RGWDataChangesBE::remove(cct, lr, log_pool);
-- if (r < 0) {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": remove failed, cannot continue."
-- << dendl;
-- return r;
-- }
-- omapexists = false;
-- fifoexists = false;
-+ if (!found) {
-+ lderr(cct) << __PRETTY_FUNCTION__
-+ << ": Error when checking log type: "
-+ << found.error().message() << dendl;
- }
--
- try {
-- if (backing == "omap" || (backing == "auto" && omapexists)) {
-+ switch (*found) {
-+ case log_type::omap:
- be = std::make_unique<RGWDataChangesOmap>(cct, *cls);
-- } else if (backing != "omap") {
-+ break;
-+ case log_type::fifo:
- be = std::make_unique<RGWDataChangesFIFO>(cct, lr, log_pool);
-+ break;
- }
- } catch (bs::system_error& e) {
- lderr(cct) << __PRETTY_FUNCTION__
-diff --git a/src/rgw/rgw_datalog.h b/src/rgw/rgw_datalog.h
-index 5440b3d1e4ba8..af5f4f0276a68 100644
---- a/src/rgw/rgw_datalog.h
-+++ b/src/rgw/rgw_datalog.h
-@@ -142,10 +142,6 @@ class RGWDataChangesBE {
- std::string get_oid(int i) {
- return fmt::format("{}.{}", prefix, i);
- }
-- static int remove(CephContext* cct, librados::Rados* rados,
-- const rgw_pool& log_pool);
--
--
- virtual void prepare(ceph::real_time now,
- const std::string& key,
- ceph::buffer::list&& entry,
-@@ -167,6 +163,7 @@ class RGWDataChangesBE {
-
- class RGWDataChangesLog {
- CephContext *cct;
-+ librados::IoCtx ioctx;
- rgw::BucketChangeObserver *observer = nullptr;
- const RGWZone* zone;
- std::unique_ptr<RGWDataChangesBE> be;
-
-From 57a76a06c75f60a8bb6d570c599eb40e15f93df2 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Sat, 21 Nov 2020 17:05:04 -0500
-Subject: [PATCH 05/26] rgw/datalog: Pass IoCtx in, don't have each backend
- make its own
-
-Also don't use svc_cls.
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 7f097cf8db433bb4c82a9bafc44e43b84f79bca4)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_datalog.cc | 68 ++++++++++++++++++++----------------------
- src/rgw/rgw_datalog.h | 10 +++----
- src/rgw/rgw_service.cc | 2 +-
- 3 files changed, 38 insertions(+), 42 deletions(-)
-
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index d6a9d210d1b56..92ad1869d3f48 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -11,6 +11,7 @@
- #include "common/async/librados_completion.h"
-
- #include "cls/fifo/cls_fifo_types.h"
-+#include "cls/log/cls_log_client.h"
-
- #include "cls_fifo_legacy.h"
- #include "rgw_datalog.h"
-@@ -21,6 +22,7 @@
- static constexpr auto dout_subsys = ceph_subsys_rgw;
-
- namespace bs = boost::system;
-+namespace lr = librados;
-
- void rgw_data_change::dump(ceph::Formatter *f) const
- {
-@@ -70,12 +72,10 @@ void rgw_data_change_log_entry::decode_json(JSONObj *obj) {
-
- class RGWDataChangesOmap final : public RGWDataChangesBE {
- using centries = std::list<cls_log_entry>;
-- RGWSI_Cls& cls;
- std::vector<std::string> oids;
- public:
-- RGWDataChangesOmap(CephContext* cct, RGWSI_Cls& cls)
-- : RGWDataChangesBE(cct), cls(cls) {
-- auto num_shards = cct->_conf->rgw_data_log_num_shards;
-+ RGWDataChangesOmap(lr::IoCtx& ioctx, int num_shards)
-+ : RGWDataChangesBE(ioctx) {
- oids.reserve(num_shards);
- for (auto i = 0; i < num_shards; ++i) {
- oids.push_back(get_oid(i));
-@@ -90,12 +90,13 @@ class RGWDataChangesOmap final : public RGWDataChangesBE {
- }
-
- cls_log_entry e;
-- cls.timelog.prepare_entry(e, ut, {}, key, entry);
-+ cls_log_add_prepare_entry(e, utime_t(ut), {}, key, entry);
- std::get<centries>(out).push_back(std::move(e));
- }
- int push(int index, entries&& items) override {
-- auto r = cls.timelog.add(oids[index], std::get<centries>(items),
-- nullptr, true, null_yield);
-+ lr::ObjectWriteOperation op;
-+ cls_log_add(op, std::get<centries>(items), true);
-+ auto r = rgw_rados_operate(ioctx, oids[index], &op, null_yield);
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
- << ": failed to push to " << oids[index] << cpp_strerror(-r)
-@@ -106,7 +107,9 @@ class RGWDataChangesOmap final : public RGWDataChangesBE {
- int push(int index, ceph::real_time now,
- const std::string& key,
- ceph::buffer::list&& bl) override {
-- auto r = cls.timelog.add(oids[index], now, {}, key, bl, null_yield);
-+ lr::ObjectWriteOperation op;
-+ cls_log_add(op, utime_t(now), {}, key, bl);
-+ auto r = rgw_rados_operate(ioctx, oids[index], &op, null_yield);
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
- << ": failed to push to " << oids[index]
-@@ -119,10 +122,10 @@ class RGWDataChangesOmap final : public RGWDataChangesBE {
- std::optional<std::string_view> marker,
- std::string* out_marker, bool* truncated) override {
- std::list<cls_log_entry> log_entries;
-- auto r = cls.timelog.list(oids[index], {}, {},
-- max_entries, log_entries,
-- std::string(marker.value_or("")),
-- out_marker, truncated, null_yield);
-+ lr::ObjectReadOperation op;
-+ cls_log_list(op, {}, {}, std::string(marker.value_or("")),
-+ max_entries, log_entries, out_marker, truncated);
-+ auto r = rgw_rados_operate(ioctx, oids[index], &op, nullptr, null_yield);
- if (r == -ENOENT) {
- *truncated = false;
- return 0;
-@@ -153,7 +156,9 @@ class RGWDataChangesOmap final : public RGWDataChangesBE {
- }
- int get_info(int index, RGWDataChangesLogInfo *info) override {
- cls_log_header header;
-- auto r = cls.timelog.info(oids[index], &header, null_yield);
-+ lr::ObjectReadOperation op;
-+ cls_log_info(op, &header);
-+ auto r = rgw_rados_operate(ioctx, oids[index], &op, nullptr, null_yield);
- if (r == -ENOENT) r = 0;
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
-@@ -166,10 +171,9 @@ class RGWDataChangesOmap final : public RGWDataChangesBE {
- return r;
- }
- int trim(int index, std::string_view marker) override {
-- auto r = cls.timelog.trim(oids[index], {}, {},
-- {}, std::string(marker), nullptr,
-- null_yield);
--
-+ lr::ObjectWriteOperation op;
-+ cls_log_trim(op, {}, {}, {}, std::string(marker));
-+ auto r = rgw_rados_operate(ioctx, oids[index], &op, null_yield);
- if (r == -ENOENT) r = 0;
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
-@@ -179,10 +183,10 @@ class RGWDataChangesOmap final : public RGWDataChangesBE {
- return r;
- }
- int trim(int index, std::string_view marker,
-- librados::AioCompletion* c) override {
-- auto r = cls.timelog.trim(oids[index], {}, {},
-- {}, std::string(marker), c, null_yield);
--
-+ lr::AioCompletion* c) override {
-+ lr::ObjectWriteOperation op;
-+ cls_log_trim(op, {}, {}, {}, std::string(marker));
-+ auto r = ioctx.aio_operate(oids[index], c, &op, 0);
- if (r == -ENOENT) r = 0;
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
-@@ -200,20 +204,12 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- using centries = std::vector<ceph::buffer::list>;
- std::vector<std::unique_ptr<rgw::cls::fifo::FIFO>> fifos;
- public:
-- RGWDataChangesFIFO(CephContext* cct, librados::Rados* rados,
-- const rgw_pool& log_pool)
-- : RGWDataChangesBE(cct) {
-- librados::IoCtx ioctx;
-- auto shards = cct->_conf->rgw_data_log_num_shards;
-- auto r = rgw_init_ioctx(rados, log_pool.name, ioctx,
-- true, false);
-- if (r < 0) {
-- throw bs::system_error(ceph::to_error_code(r));
-- }
-+ RGWDataChangesFIFO(lr::IoCtx& ioctx, int shards)
-+ : RGWDataChangesBE(ioctx) {
- fifos.resize(shards);
- for (auto i = 0; i < shards; ++i) {
-- r = rgw::cls::fifo::FIFO::create(ioctx, get_oid(i),
-- &fifos[i], null_yield);
-+ auto r = rgw::cls::fifo::FIFO::create(ioctx, get_oid(i),
-+ &fifos[i], null_yield);
- if (r < 0) {
- throw bs::system_error(ceph::to_error_code(r));
- }
-@@ -370,7 +366,7 @@ RGWDataChangesLog::RGWDataChangesLog(CephContext* cct)
-
- int RGWDataChangesLog::start(const RGWZone* _zone,
- const RGWZoneParams& zoneparams,
-- RGWSI_Cls *cls, librados::Rados* lr)
-+ librados::Rados* lr)
- {
- zone = _zone;
- ceph_assert(zone);
-@@ -400,10 +396,10 @@ int RGWDataChangesLog::start(const RGWZone* _zone,
- try {
- switch (*found) {
- case log_type::omap:
-- be = std::make_unique<RGWDataChangesOmap>(cct, *cls);
-+ be = std::make_unique<RGWDataChangesOmap>(ioctx, num_shards);
- break;
- case log_type::fifo:
-- be = std::make_unique<RGWDataChangesFIFO>(cct, lr, log_pool);
-+ be = std::make_unique<RGWDataChangesFIFO>(ioctx, num_shards);
- break;
- }
- } catch (bs::system_error& e) {
-diff --git a/src/rgw/rgw_datalog.h b/src/rgw/rgw_datalog.h
-index af5f4f0276a68..f6f52382f0947 100644
---- a/src/rgw/rgw_datalog.h
-+++ b/src/rgw/rgw_datalog.h
-@@ -37,8 +37,6 @@
- #include "rgw_zone.h"
- #include "rgw_trim_bilog.h"
-
--#include "services/svc_cls.h"
--
- namespace bc = boost::container;
-
- enum DataLogEntityType {
-@@ -118,6 +116,7 @@ struct RGWDataChangesLogMarker {
-
- class RGWDataChangesBE {
- protected:
-+ librados::IoCtx& ioctx;
- CephContext* const cct;
- private:
- std::string prefix;
-@@ -132,8 +131,9 @@ class RGWDataChangesBE {
- using entries = std::variant<std::list<cls_log_entry>,
- std::vector<ceph::buffer::list>>;
-
-- RGWDataChangesBE(CephContext* const cct)
-- : cct(cct), prefix(get_prefix(cct)) {}
-+ RGWDataChangesBE(librados::IoCtx& ioctx)
-+ : ioctx(ioctx), cct(static_cast<CephContext*>(ioctx.cct())),
-+ prefix(get_prefix(cct)) {}
- virtual ~RGWDataChangesBE() = default;
-
- static std::string get_oid(CephContext* cct, int i) {
-@@ -214,7 +214,7 @@ class RGWDataChangesLog {
- ~RGWDataChangesLog();
-
- int start(const RGWZone* _zone, const RGWZoneParams& zoneparams,
-- RGWSI_Cls *cls_svc, librados::Rados* lr);
-+ librados::Rados* lr);
-
- int add_entry(const RGWBucketInfo& bucket_info, int shard_id);
- int get_log_shard_id(rgw_bucket& bucket, int shard_id);
-diff --git a/src/rgw/rgw_service.cc b/src/rgw/rgw_service.cc
-index 3fb4f2b0b6413..7c7d8a02675d4 100644
---- a/src/rgw/rgw_service.cc
-+++ b/src/rgw/rgw_service.cc
-@@ -141,7 +141,7 @@ int RGWServices_Def::init(CephContext *cct,
- }
-
- r = datalog_rados->start(&zone->get_zone(),
-- zone->get_zone_params(), cls.get(),
-+ zone->get_zone_params(),
- rados->get_rados_handle());
- if (r < 0) {
- ldout(cct, 0) << "ERROR: failed to start datalog_rados service (" << cpp_strerror(-r) << dendl;
-
-From 665829501df70d80d7aa3c2227bfefb363f5b7bc Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Sat, 21 Nov 2020 18:20:57 -0500
-Subject: [PATCH 06/26] rgw: Move get_oid back to RGWDataChangesLog
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit bdd3528e54e399135f602e1f7e94d070d89b8c99)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_datalog.cc | 32 +++++++++++++++++++++-----------
- src/rgw/rgw_datalog.h | 28 ++++++++++++----------------
- 2 files changed, 33 insertions(+), 27 deletions(-)
-
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index 92ad1869d3f48..9fc2fff83c103 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -73,9 +73,14 @@ void rgw_data_change_log_entry::decode_json(JSONObj *obj) {
- class RGWDataChangesOmap final : public RGWDataChangesBE {
- using centries = std::list<cls_log_entry>;
- std::vector<std::string> oids;
-+ std::string get_oid(int i) const {
-+ return datalog.get_oid(i);
-+ }
- public:
-- RGWDataChangesOmap(lr::IoCtx& ioctx, int num_shards)
-- : RGWDataChangesBE(ioctx) {
-+ RGWDataChangesOmap(lr::IoCtx& ioctx,
-+ RGWDataChangesLog& datalog,
-+ int num_shards)
-+ : RGWDataChangesBE(ioctx, datalog) {
- oids.reserve(num_shards);
- for (auto i = 0; i < num_shards; ++i) {
- oids.push_back(get_oid(i));
-@@ -203,9 +208,14 @@ class RGWDataChangesOmap final : public RGWDataChangesBE {
- class RGWDataChangesFIFO final : public RGWDataChangesBE {
- using centries = std::vector<ceph::buffer::list>;
- std::vector<std::unique_ptr<rgw::cls::fifo::FIFO>> fifos;
-+ std::string get_oid(int i) const {
-+ return datalog.get_oid(i);
-+ }
- public:
-- RGWDataChangesFIFO(lr::IoCtx& ioctx, int shards)
-- : RGWDataChangesBE(ioctx) {
-+ RGWDataChangesFIFO(lr::IoCtx& ioctx,
-+ RGWDataChangesLog& datalog,
-+ int shards)
-+ : RGWDataChangesBE(ioctx, datalog) {
- fifos.resize(shards);
- for (auto i = 0; i < shards; ++i) {
- auto r = rgw::cls::fifo::FIFO::create(ioctx, get_oid(i),
-@@ -362,6 +372,7 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- RGWDataChangesLog::RGWDataChangesLog(CephContext* cct)
- : cct(cct),
- num_shards(cct->_conf->rgw_data_log_num_shards),
-+ prefix(get_prefix()),
- changes(cct->_conf->rgw_data_log_changes_size) {}
-
- int RGWDataChangesLog::start(const RGWZone* _zone,
-@@ -382,11 +393,10 @@ int RGWDataChangesLog::start(const RGWZone* _zone,
- << ", pool=" << log_pool << dendl;
- return -r;
- }
-+
- auto found = log_backing_type(ioctx, *defbacking, num_shards,
-- [this](int i) {
-- return RGWDataChangesBE::get_oid(cct, i);
-- },
-- null_yield);
-+ [this](int i) { return get_oid(i); },
-+ null_yield);
-
- if (!found) {
- lderr(cct) << __PRETTY_FUNCTION__
-@@ -396,10 +406,10 @@ int RGWDataChangesLog::start(const RGWZone* _zone,
- try {
- switch (*found) {
- case log_type::omap:
-- be = std::make_unique<RGWDataChangesOmap>(ioctx, num_shards);
-+ be = std::make_unique<RGWDataChangesOmap>(ioctx, *this, num_shards);
- break;
- case log_type::fifo:
-- be = std::make_unique<RGWDataChangesFIFO>(ioctx, num_shards);
-+ be = std::make_unique<RGWDataChangesFIFO>(ioctx, *this, num_shards);
- break;
- }
- } catch (bs::system_error& e) {
-@@ -521,7 +531,7 @@ bool RGWDataChangesLog::filter_bucket(const rgw_bucket& bucket,
- }
-
- std::string RGWDataChangesLog::get_oid(int i) const {
-- return be->get_oid(i);
-+ return fmt::format("{}.{}", prefix, i);
- }
-
- int RGWDataChangesLog::add_entry(const RGWBucketInfo& bucket_info, int shard_id) {
-diff --git a/src/rgw/rgw_datalog.h b/src/rgw/rgw_datalog.h
-index f6f52382f0947..387d50a1d4964 100644
---- a/src/rgw/rgw_datalog.h
-+++ b/src/rgw/rgw_datalog.h
-@@ -20,6 +20,7 @@
-
- #include "include/buffer.h"
- #include "include/encoding.h"
-+#include "include/function2.hpp"
-
- #include "include/rados/librados.hpp"
-
-@@ -114,34 +115,24 @@ struct RGWDataChangesLogMarker {
- RGWDataChangesLogMarker() = default;
- };
-
-+class RGWDataChangesLog;
-+
- class RGWDataChangesBE {
- protected:
- librados::IoCtx& ioctx;
- CephContext* const cct;
-+ RGWDataChangesLog& datalog;
- private:
-- std::string prefix;
-- static std::string_view get_prefix(CephContext* cct) {
-- std::string_view prefix = cct->_conf->rgw_data_log_obj_prefix;
-- if (prefix.empty()) {
-- prefix = "data_log"sv;
-- }
-- return prefix;
-- }
- public:
- using entries = std::variant<std::list<cls_log_entry>,
- std::vector<ceph::buffer::list>>;
-
-- RGWDataChangesBE(librados::IoCtx& ioctx)
-+ RGWDataChangesBE(librados::IoCtx& ioctx,
-+ RGWDataChangesLog& datalog)
- : ioctx(ioctx), cct(static_cast<CephContext*>(ioctx.cct())),
-- prefix(get_prefix(cct)) {}
-+ datalog(datalog) {}
- virtual ~RGWDataChangesBE() = default;
-
-- static std::string get_oid(CephContext* cct, int i) {
-- return fmt::format("{}.{}", get_prefix(cct), i);
-- }
-- std::string get_oid(int i) {
-- return fmt::format("{}.{}", prefix, i);
-- }
- virtual void prepare(ceph::real_time now,
- const std::string& key,
- ceph::buffer::list&& entry,
-@@ -169,6 +160,11 @@ class RGWDataChangesLog {
- std::unique_ptr<RGWDataChangesBE> be;
-
- const int num_shards;
-+ std::string get_prefix() {
-+ auto prefix = cct->_conf->rgw_data_log_obj_prefix;
-+ return prefix.empty() ? prefix : "data_log"s;
-+ }
-+ std::string prefix;
-
- ceph::mutex lock = ceph::make_mutex("RGWDataChangesLog::lock");
- ceph::shared_mutex modified_lock =
-
-From 504b024fa9f4cb054109c00e527eb0dc08b9b4ce Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Sun, 3 Jan 2021 18:32:50 -0500
-Subject: [PATCH 07/26] rgw/datalog: make get_oid take generation
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit f7b850f7aa84d9cf24b4eaebbe51c7ee221bbd44)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_datalog.cc | 27 +++++++------
- src/rgw/rgw_datalog.h | 78 ++++++++++++++++++++-----------------
- src/rgw/rgw_trim_datalog.cc | 2 +-
- 3 files changed, 57 insertions(+), 50 deletions(-)
-
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index 9fc2fff83c103..329657d463125 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -73,14 +73,13 @@ void rgw_data_change_log_entry::decode_json(JSONObj *obj) {
- class RGWDataChangesOmap final : public RGWDataChangesBE {
- using centries = std::list<cls_log_entry>;
- std::vector<std::string> oids;
-- std::string get_oid(int i) const {
-- return datalog.get_oid(i);
-- }
-+
- public:
- RGWDataChangesOmap(lr::IoCtx& ioctx,
- RGWDataChangesLog& datalog,
-+ uint64_t gen_id,
- int num_shards)
-- : RGWDataChangesBE(ioctx, datalog) {
-+ : RGWDataChangesBE(ioctx, datalog, gen_id) {
- oids.reserve(num_shards);
- for (auto i = 0; i < num_shards; ++i) {
- oids.push_back(get_oid(i));
-@@ -208,14 +207,12 @@ class RGWDataChangesOmap final : public RGWDataChangesBE {
- class RGWDataChangesFIFO final : public RGWDataChangesBE {
- using centries = std::vector<ceph::buffer::list>;
- std::vector<std::unique_ptr<rgw::cls::fifo::FIFO>> fifos;
-- std::string get_oid(int i) const {
-- return datalog.get_oid(i);
-- }
-+
- public:
- RGWDataChangesFIFO(lr::IoCtx& ioctx,
- RGWDataChangesLog& datalog,
-- int shards)
-- : RGWDataChangesBE(ioctx, datalog) {
-+ uint64_t gen_id, int shards)
-+ : RGWDataChangesBE(ioctx, datalog, gen_id) {
- fifos.resize(shards);
- for (auto i = 0; i < shards; ++i) {
- auto r = rgw::cls::fifo::FIFO::create(ioctx, get_oid(i),
-@@ -395,7 +392,7 @@ int RGWDataChangesLog::start(const RGWZone* _zone,
- }
-
- auto found = log_backing_type(ioctx, *defbacking, num_shards,
-- [this](int i) { return get_oid(i); },
-+ [this](int i) { return get_oid(0, i); },
- null_yield);
-
- if (!found) {
-@@ -406,10 +403,10 @@ int RGWDataChangesLog::start(const RGWZone* _zone,
- try {
- switch (*found) {
- case log_type::omap:
-- be = std::make_unique<RGWDataChangesOmap>(ioctx, *this, num_shards);
-+ be = std::make_unique<RGWDataChangesOmap>(ioctx, *this, 0, num_shards);
- break;
- case log_type::fifo:
-- be = std::make_unique<RGWDataChangesFIFO>(ioctx, *this, num_shards);
-+ be = std::make_unique<RGWDataChangesFIFO>(ioctx, *this, 0, num_shards);
- break;
- }
- } catch (bs::system_error& e) {
-@@ -530,8 +527,10 @@ bool RGWDataChangesLog::filter_bucket(const rgw_bucket& bucket,
- return bucket_filter(bucket, y);
- }
-
--std::string RGWDataChangesLog::get_oid(int i) const {
-- return fmt::format("{}.{}", prefix, i);
-+std::string RGWDataChangesLog::get_oid(uint64_t gen_id, int i) const {
-+ return (gen_id > 0 ?
-+ fmt::format("{}(a)G{}.{}", prefix, gen_id, i) :
-+ fmt::format("{}.{}", prefix, i));
- }
-
- int RGWDataChangesLog::add_entry(const RGWBucketInfo& bucket_info, int shard_id) {
-diff --git a/src/rgw/rgw_datalog.h b/src/rgw/rgw_datalog.h
-index 387d50a1d4964..2a73237b38d2d 100644
---- a/src/rgw/rgw_datalog.h
-+++ b/src/rgw/rgw_datalog.h
-@@ -117,40 +117,7 @@ struct RGWDataChangesLogMarker {
-
- class RGWDataChangesLog;
-
--class RGWDataChangesBE {
--protected:
-- librados::IoCtx& ioctx;
-- CephContext* const cct;
-- RGWDataChangesLog& datalog;
--private:
--public:
-- using entries = std::variant<std::list<cls_log_entry>,
-- std::vector<ceph::buffer::list>>;
--
-- RGWDataChangesBE(librados::IoCtx& ioctx,
-- RGWDataChangesLog& datalog)
-- : ioctx(ioctx), cct(static_cast<CephContext*>(ioctx.cct())),
-- datalog(datalog) {}
-- virtual ~RGWDataChangesBE() = default;
--
-- virtual void prepare(ceph::real_time now,
-- const std::string& key,
-- ceph::buffer::list&& entry,
-- entries& out) = 0;
-- virtual int push(int index, entries&& items) = 0;
-- virtual int push(int index, ceph::real_time now,
-- const std::string& key,
-- ceph::buffer::list&& bl) = 0;
-- virtual int list(int shard, int max_entries,
-- std::vector<rgw_data_change_log_entry>& entries,
-- std::optional<std::string_view> marker,
-- std::string* out_marker, bool* truncated) = 0;
-- virtual int get_info(int index, RGWDataChangesLogInfo *info) = 0;
-- virtual int trim(int index, std::string_view marker) = 0;
-- virtual int trim(int index, std::string_view marker,
-- librados::AioCompletion* c) = 0;
-- virtual std::string_view max_marker() const = 0;
--};
-+class RGWDataChangesBE;
-
- class RGWDataChangesLog {
- CephContext *cct;
-@@ -247,7 +214,48 @@ class RGWDataChangesLog {
- }
- // a marker that compares greater than any other
- std::string_view max_marker() const;
-- std::string get_oid(int shard_id) const;
-+ std::string get_oid(uint64_t gen_id, int shard_id) const;
-+};
-+
-+class RGWDataChangesBE {
-+protected:
-+ librados::IoCtx& ioctx;
-+ CephContext* const cct;
-+ RGWDataChangesLog& datalog;
-+ uint64_t gen_id;
-+
-+ std::string get_oid(int shard_id) {
-+ return datalog.get_oid(gen_id, shard_id);
-+ }
-+public:
-+ using entries = std::variant<std::list<cls_log_entry>,
-+ std::vector<ceph::buffer::list>>;
-+
-+ RGWDataChangesBE(librados::IoCtx& ioctx,
-+ RGWDataChangesLog& datalog,
-+ uint64_t gen_id)
-+ : ioctx(ioctx), cct(static_cast<CephContext*>(ioctx.cct())),
-+ datalog(datalog), gen_id(gen_id) {}
-+ virtual ~RGWDataChangesBE() = default;
-+
-+ virtual void prepare(ceph::real_time now,
-+ const std::string& key,
-+ ceph::buffer::list&& entry,
-+ entries& out) = 0;
-+ virtual int push(int index, entries&& items) = 0;
-+ virtual int push(int index, ceph::real_time now,
-+ const std::string& key,
-+ ceph::buffer::list&& bl) = 0;
-+ virtual int list(int shard, int max_entries,
-+ std::vector<rgw_data_change_log_entry>& entries,
-+ std::optional<std::string_view> marker,
-+ std::string* out_marker, bool* truncated) = 0;
-+ virtual int get_info(int index, RGWDataChangesLogInfo *info) = 0;
-+ virtual int trim(int index, std::string_view marker) = 0;
-+ virtual int trim(int index, std::string_view marker,
-+ librados::AioCompletion* c) = 0;
-+ virtual std::string_view max_marker() const = 0;
- };
-
-+
- #endif
-diff --git a/src/rgw/rgw_trim_datalog.cc b/src/rgw/rgw_trim_datalog.cc
-index 62f6c07d17205..85c19a7c4437b 100644
---- a/src/rgw/rgw_trim_datalog.cc
-+++ b/src/rgw/rgw_trim_datalog.cc
-@@ -202,7 +202,7 @@ class DataLogTrimPollCR : public RGWCoroutine {
- int num_shards, utime_t interval)
- : RGWCoroutine(store->ctx()), store(store), http(http),
- num_shards(num_shards), interval(interval),
-- lock_oid(store->svc()->datalog_rados->get_oid(0)),
-+ lock_oid(store->svc()->datalog_rados->get_oid(0, 0)),
- lock_cookie(RGWSimpleRadosLockCR::gen_random_cookie(cct)),
- last_trim(num_shards)
- {}
-
-From 1436be5861c8a19bd4969c219fb2a8848f359a92 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Sun, 3 Jan 2021 19:08:09 -0500
-Subject: [PATCH 08/26] rgw: Logback generation data structures
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit b97b207928c60b48fe405ab38be15ba55f927d5c)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_log_backing.h | 62 ++++++++++++++++++++++++++++++++
- src/test/rgw/test_log_backing.cc | 18 ++++++++++
- 2 files changed, 80 insertions(+)
-
-diff --git a/src/rgw/rgw_log_backing.h b/src/rgw/rgw_log_backing.h
-index d769af48b01fe..8546370a3757a 100644
---- a/src/rgw/rgw_log_backing.h
-+++ b/src/rgw/rgw_log_backing.h
-@@ -13,11 +13,18 @@
-
- #include <boost/system/error_code.hpp>
-
-+#undef FMT_HEADER_ONLY
-+#define FMT_HEADER_ONLY 1
-+#include <fmt/format.h>
-+
- #include "include/rados/librados.hpp"
-+#include "include/encoding.h"
- #include "include/expected.hpp"
- #include "include/function2.hpp"
-
- #include "common/async/yield_context.h"
-+#include "common/Formatter.h"
-+#include "common/strtol.h"
-
- namespace bs = boost::system;
-
-@@ -28,6 +35,17 @@ enum class log_type {
- fifo = 1
- };
-
-+inline void encode(const log_type& type, ceph::buffer::list& bl) {
-+ auto t = static_cast<uint8_t>(type);
-+ encode(t, bl);
-+}
-+
-+inline void decode(log_type& type, bufferlist::const_iterator& bl) {
-+ uint8_t t;
-+ decode(t, bl);
-+ type = static_cast<log_type>(type);
-+}
-+
- inline std::optional<log_type> to_log_type(std::string_view s) {
- if (strncasecmp(s.data(), "omap", s.length()) == 0) {
- return log_type::omap;
-@@ -67,4 +85,48 @@ bs::error_code log_remove(librados::IoCtx& ioctx,
- optional_yield y);
-
-
-+struct logback_generation {
-+ uint64_t gen_id = 0;
-+ log_type type;
-+ bool empty = false;
-+
-+ void encode(ceph::buffer::list& bl) const {
-+ ENCODE_START(1, 1, bl);
-+ encode(gen_id, bl);
-+ encode(type, bl);
-+ encode(empty, bl);
-+ ENCODE_FINISH(bl);
-+ }
-+
-+ void decode(bufferlist::const_iterator& bl) {
-+ DECODE_START(1, bl);
-+ decode(gen_id, bl);
-+ decode(type, bl);
-+ decode(empty, bl);
-+ DECODE_FINISH(bl);
-+ }
-+};
-+WRITE_CLASS_ENCODER(logback_generation)
-+
-+inline std::string gencursor(uint64_t gen_id, std::string_view cursor) {
-+ return (gen_id > 0 ?
-+ fmt::format("G{:0>20}@{}", gen_id, cursor) :
-+ std::string(cursor));
-+}
-+
-+inline std::pair<uint64_t, std::string_view>
-+cursorgen(std::string_view cursor_) {
-+ std::string_view cursor = cursor_;
-+ if (cursor[0] != 'G') {
-+ return { 0, cursor };
-+ }
-+ cursor.remove_prefix(1);
-+ auto gen_id = ceph::consume<uint64_t>(cursor);
-+ if (!gen_id || cursor[0] != '@') {
-+ return { 0, cursor_ };
-+ }
-+ cursor.remove_prefix(1);
-+ return { *gen_id, cursor };
-+}
-+
- #endif
-diff --git a/src/test/rgw/test_log_backing.cc b/src/test/rgw/test_log_backing.cc
-index 5180d5fc74fe8..848bd6b50c4e5 100644
---- a/src/test/rgw/test_log_backing.cc
-+++ b/src/test/rgw/test_log_backing.cc
-@@ -174,3 +174,21 @@ TEST_F(LogBacking, TestFIFOEmpty)
- get_oid, null_yield);
- ASSERT_EQ(log_type::fifo, *stat);
- }
-+
-+TEST(CursorGen, RoundTrip) {
-+ const auto pcurs = "fded"sv;
-+ {
-+ auto gc = gencursor(0, pcurs);
-+ ASSERT_EQ(pcurs, gc);
-+ auto [gen, cursor] = cursorgen(gc);
-+ ASSERT_EQ(0, gen);
-+ ASSERT_EQ(pcurs, cursor);
-+ }
-+ {
-+ auto gc = gencursor(53, pcurs);
-+ ASSERT_NE(pcurs, gc);
-+ auto [gen, cursor] = cursorgen(gc);
-+ ASSERT_EQ(53, gen);
-+ ASSERT_EQ(pcurs, cursor);
-+ }
-+}
-
-From 59f53ba6a790d16c035c7fe5f5776f69ee6f5513 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Tue, 5 Jan 2021 20:00:07 -0500
-Subject: [PATCH 09/26] rgw: Generational support for logback switching
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 6b50f6d6def59e3c4b2db2d5311a887127b4804b)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_log_backing.cc | 484 +++++++++++++++++++++++++++++++
- src/rgw/rgw_log_backing.h | 117 +++++++-
- src/test/rgw/test_log_backing.cc | 205 ++++++++++++-
- 3 files changed, 794 insertions(+), 12 deletions(-)
-
-diff --git a/src/rgw/rgw_log_backing.cc b/src/rgw/rgw_log_backing.cc
-index 63edf972a0307..eab60e672b9e8 100644
---- a/src/rgw/rgw_log_backing.cc
-+++ b/src/rgw/rgw_log_backing.cc
-@@ -2,11 +2,14 @@
- // vim: ts=8 sw=2 smarttab ft=cpp
-
- #include "cls/log/cls_log_client.h"
-+#include "cls/version/cls_version_client.h"
-
- #include "rgw_log_backing.h"
- #include "rgw_tools.h"
- #include "cls_fifo_legacy.h"
-
-+namespace cb = ceph::buffer;
-+
- static constexpr auto dout_subsys = ceph_subsys_rgw;
-
- enum class shard_check { dne, omap, fifo, corrupt };
-@@ -213,3 +216,484 @@ bs::error_code log_remove(librados::IoCtx& ioctx,
- }
- return ec;
- }
-+
-+logback_generations::~logback_generations() {
-+ if (watchcookie > 0) {
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ auto r = ioctx.unwatch2(watchcookie);
-+ if (r < 0) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": failed unwatching oid=" << oid
-+ << ", r=" << r << dendl;
-+ }
-+ }
-+}
-+
-+bs::error_code logback_generations::setup(log_type def,
-+ optional_yield y) noexcept
-+{
-+ try {
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ // First, read.
-+ auto res = read(y);
-+ if (!res && res.error() != bs::errc::no_such_file_or_directory) {
-+ return res.error();
-+ }
-+ if (res) {
-+ std::unique_lock lock(m);
-+ std::tie(entries_, version) = std::move(*res);
-+ } else {
-+ // Are we the first? Then create generation 0 and the generations
-+ // metadata.
-+ librados::ObjectWriteOperation op;
-+ auto type = log_backing_type(ioctx, def, shards,
-+ [this](int shard) {
-+ return this->get_oid(0, shard);
-+ }, y);
-+ if (!type)
-+ return type.error();
-+
-+ logback_generation l;
-+ l.type = *type;
-+
-+ std::unique_lock lock(m);
-+ version.ver = 1;
-+ static constexpr auto TAG_LEN = 24;
-+ version.tag.clear();
-+ append_rand_alpha(cct, version.tag, version.tag, TAG_LEN);
-+ op.create(true);
-+ cls_version_set(op, version);
-+ cb::list bl;
-+ entries_.emplace(0, std::move(l));
-+ encode(entries_, bl);
-+ lock.unlock();
-+
-+ op.write_full(bl);
-+ auto r = rgw_rados_operate(ioctx, oid, &op, y);
-+ if (r < 0 && r != -EEXIST) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": failed writing oid=" << oid
-+ << ", r=" << r << dendl;
-+ bs::system_error(-r, bs::system_category());
-+ }
-+ // Did someone race us? Then re-read.
-+ if (r != 0) {
-+ res = read(y);
-+ if (!res)
-+ return res.error();
-+ if (res->first.empty())
-+ return bs::error_code(EIO, bs::system_category());
-+ auto l = res->first.begin()->second;
-+ // In the unlikely event that someone raced us, created
-+ // generation zero, incremented, then erased generation zero,
-+ // don't leave generation zero lying around.
-+ if (l.gen_id != 0) {
-+ auto ec = log_remove(ioctx, shards,
-+ [this](int shard) {
-+ return this->get_oid(0, shard);
-+ }, y);
-+ if (ec) return ec;
-+ }
-+ std::unique_lock lock(m);
-+ std::tie(entries_, version) = std::move(*res);
-+ }
-+ }
-+ // Pass all non-empty generations to the handler
-+ std::unique_lock lock(m);
-+ auto i = lowest_nomempty(entries_);
-+ entries_t e;
-+ std::copy(i, entries_.cend(),
-+ std::inserter(e, e.end()));
-+ m.unlock();
-+ auto ec = watch();
-+ if (ec) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": failed to re-establish watch, unsafe to continue: oid="
-+ << oid << ", ec=" << ec.message() << dendl;
-+ }
-+ return handle_init(std::move(e));
-+ } catch (const std::bad_alloc&) {
-+ return bs::error_code(ENOMEM, bs::system_category());
-+ }
-+}
-+
-+bs::error_code logback_generations::update(optional_yield y) noexcept
-+{
-+ try {
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ auto res = read(y);
-+ if (!res) {
-+ return res.error();
-+ }
-+
-+ std::unique_lock l(m);
-+ auto& [es, v] = *res;
-+ if (v == version) {
-+ // Nothing to do!
-+ return {};
-+ }
-+
-+ // Check consistency and prepare update
-+ if (es.empty()) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": INCONSISTENCY! Read empty update." << dendl;
-+ return bs::error_code(EFAULT, bs::system_category());
-+ }
-+ auto cur_lowest = lowest_nomempty(entries_);
-+ // Straight up can't happen
-+ assert(cur_lowest != entries_.cend());
-+ auto new_lowest = lowest_nomempty(es);
-+ if (new_lowest == es.cend()) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": INCONSISTENCY! Read update with no active head." << dendl;
-+ return bs::error_code(EFAULT, bs::system_category());
-+ }
-+ if (new_lowest->first < cur_lowest->first) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": INCONSISTENCY! Tail moved wrong way." << dendl;
-+ return bs::error_code(EFAULT, bs::system_category());
-+ }
-+
-+ std::optional<uint64_t> highest_empty;
-+ if (new_lowest->first > cur_lowest->first && new_lowest != es.begin()) {
-+ --new_lowest;
-+ highest_empty = new_lowest->first;
-+ }
-+
-+ entries_t new_entries;
-+
-+ if ((es.end() - 1)->first < (entries_.end() - 1)->first) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": INCONSISTENCY! Head moved wrong way." << dendl;
-+ return bs::error_code(EFAULT, bs::system_category());
-+ }
-+
-+ if ((es.end() - 1)->first > (entries_.end() - 1)->first) {
-+ auto ei = es.lower_bound((entries_.end() - 1)->first + 1);
-+ std::copy(ei, es.end(), std::inserter(new_entries, new_entries.end()));
-+ }
-+
-+ // Everything checks out!
-+
-+ version = v;
-+ entries_ = es;
-+ l.unlock();
-+
-+ if (highest_empty) {
-+ auto ec = handle_empty_to(*highest_empty);
-+ if (ec) return ec;
-+ }
-+
-+ if (!new_entries.empty()) {
-+ auto ec = handle_new_gens(std::move(new_entries));
-+ if (ec) return ec;
-+ }
-+ } catch (const std::bad_alloc&) {
-+ return bs::error_code(ENOMEM, bs::system_category());
-+ }
-+ return {};
-+}
-+
-+auto logback_generations::read(optional_yield y) noexcept ->
-+ tl::expected<std::pair<entries_t, obj_version>, bs::error_code>
-+{
-+ try {
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ librados::ObjectReadOperation op;
-+ std::unique_lock l(m);
-+ cls_version_check(op, version, VER_COND_GE);
-+ l.unlock();
-+ obj_version v2;
-+ cls_version_read(op, &v2);
-+ cb::list bl;
-+ op.read(0, 0, &bl, nullptr);
-+ auto r = rgw_rados_operate(ioctx, oid, &op, nullptr, y);
-+ if (r < 0) {
-+ if (r == -ENOENT) {
-+ ldout(cct, 5) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": oid=" << oid
-+ << " not found" << dendl;
-+ } else {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": failed reading oid=" << oid
-+ << ", r=" << r << dendl;
-+ }
-+ return tl::unexpected(bs::error_code(-r, bs::system_category()));
-+ }
-+ auto bi = bl.cbegin();
-+ entries_t e;
-+ try {
-+ decode(e, bi);
-+ } catch (const cb::error& err) {
-+ return tl::unexpected(err.code());
-+ }
-+ return std::pair{ std::move(e), std::move(v2) };
-+ } catch (const std::bad_alloc&) {
-+ return tl::unexpected(bs::error_code(ENOMEM, bs::system_category()));
-+ }
-+}
-+
-+bs::error_code logback_generations::write(entries_t&& e,
-+ std::unique_lock<std::mutex>&& l_,
-+ optional_yield y) noexcept
-+{
-+ auto l = std::move(l_);
-+ ceph_assert(l.mutex() == &m &&
-+ l.owns_lock());
-+ try {
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ librados::ObjectWriteOperation op;
-+ cls_version_check(op, version, VER_COND_GE);
-+ cb::list bl;
-+ encode(e, bl);
-+ op.write_full(bl);
-+ cls_version_inc(op);
-+ auto r = rgw_rados_operate(ioctx, oid, &op, y);
-+ if (r == 0) {
-+ entries_ = std::move(e);
-+ version.inc();
-+ return {};
-+ }
-+ l.unlock();
-+ if (r < 0 && r != -ECANCELED) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": failed reading oid=" << oid
-+ << ", r=" << r << dendl;
-+ return { -r, bs::system_category() };
-+ }
-+ if (r == -ECANCELED) {
-+ auto ec = update(y);
-+ if (ec) {
-+ return ec;
-+ } else {
-+ return { ECANCELED, bs::system_category() };
-+ }
-+ }
-+ } catch (const std::bad_alloc&) {
-+ return { ENOMEM, bs::system_category() };
-+ }
-+ return {};
-+}
-+
-+
-+bs::error_code logback_generations::watch() noexcept {
-+ try {
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ auto r = ioctx.watch2(oid, &watchcookie, this);
-+ if (r < 0) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": failed to set watch oid=" << oid
-+ << ", r=" << r << dendl;
-+ return { -r, bs::system_category() };
-+ }
-+ } catch (const std::bad_alloc&) {
-+ return bs::error_code(ENOMEM, bs::system_category());
-+ }
-+ return {};
-+}
-+
-+bs::error_code logback_generations::new_backing(log_type type,
-+ optional_yield y) noexcept {
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ static constexpr auto max_tries = 10;
-+ try {
-+ auto ec = update(y);
-+ if (ec) return ec;
-+ auto tries = 0;
-+ entries_t new_entries;
-+ do {
-+ std::unique_lock l(m);
-+ auto last = entries_.end() - 1;
-+ if (last->second.type == type) {
-+ // Nothing to be done
-+ return {};
-+ }
-+ auto newgenid = last->first + 1;
-+ logback_generation newgen;
-+ newgen.gen_id = newgenid;
-+ newgen.type = type;
-+ new_entries.emplace(newgenid, newgen);
-+ auto es = entries_;
-+ es.emplace(newgenid, std::move(newgen));
-+ ec = write(std::move(es), std::move(l), y);
-+ ++tries;
-+ } while (ec == bs::errc::operation_canceled &&
-+ tries < max_tries);
-+ if (tries >= max_tries) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": exhausted retry attempts." << dendl;
-+ return ec;
-+ }
-+
-+ if (ec) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": write failed with ec=" << ec.message() << dendl;
-+ return ec;
-+ }
-+
-+ cb::list bl, rbl;
-+
-+ auto r = rgw_rados_notify(ioctx, oid, bl, 10'000, &rbl, y);
-+ if (r < 0) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": notify failed with r=" << r << dendl;
-+ return { -r, bs::system_category() };
-+ }
-+ ec = handle_new_gens(new_entries);
-+ } catch (const std::bad_alloc&) {
-+ return bs::error_code(ENOMEM, bs::system_category());
-+ }
-+ return {};
-+}
-+
-+bs::error_code logback_generations::empty_to(uint64_t gen_id,
-+ optional_yield y) noexcept {
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ static constexpr auto max_tries = 10;
-+ try {
-+ auto ec = update(y);
-+ if (ec) return ec;
-+ auto tries = 0;
-+ uint64_t newtail = 0;
-+ do {
-+ std::unique_lock l(m);
-+ {
-+ auto last = entries_.end() - 1;
-+ if (gen_id >= last->first) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": Attempt to trim beyond the possible." << dendl;
-+ return bs::error_code(EINVAL, bs::system_category());
-+ }
-+ }
-+ auto es = entries_;
-+ auto ei = es.upper_bound(gen_id);
-+ if (ei == es.begin()) {
-+ // Nothing to be done.
-+ return {};
-+ }
-+ for (auto i = es.begin(); i < ei; ++i) {
-+ newtail = i->first;
-+ i->second.empty = true;
-+ }
-+ ec = write(std::move(es), std::move(l), y);
-+ ++tries;
-+ } while (ec == bs::errc::operation_canceled &&
-+ tries < max_tries);
-+ if (tries >= max_tries) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": exhausted retry attempts." << dendl;
-+ return ec;
-+ }
-+
-+ if (ec) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": write failed with ec=" << ec.message() << dendl;
-+ return ec;
-+ }
-+
-+ cb::list bl, rbl;
-+
-+ auto r = rgw_rados_notify(ioctx, oid, bl, 10'000, &rbl, y);
-+ if (r < 0) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": notify failed with r=" << r << dendl;
-+ return { -r, bs::system_category() };
-+ }
-+ ec = handle_empty_to(newtail);
-+ } catch (const std::bad_alloc&) {
-+ return bs::error_code(ENOMEM, bs::system_category());
-+ }
-+ return {};
-+}
-+
-+bs::error_code logback_generations::remove_empty(optional_yield y) noexcept {
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ static constexpr auto max_tries = 10;
-+ try {
-+ auto ec = update(y);
-+ if (ec) return ec;
-+ auto tries = 0;
-+ entries_t new_entries;
-+ std::unique_lock l(m);
-+ ceph_assert(!entries_.empty());
-+ auto i = lowest_nomempty(entries_);
-+ if (i == entries_.begin()) {
-+ return {};
-+ }
-+ auto ln = i->first;
-+ entries_t es;
-+ std::copy(entries_.cbegin(), i,
-+ std::inserter(es, es.end()));
-+ l.unlock();
-+ do {
-+ for (const auto& [gen_id, e] : es) {
-+ ceph_assert(e.empty);
-+ auto ec = log_remove(ioctx, shards,
-+ [this, gen_id](int shard) {
-+ return this->get_oid(gen_id, shard);
-+ }, y);
-+ if (ec) {
-+ return ec;
-+ }
-+ }
-+ l.lock();
-+ i = entries_.find(ln);
-+ es.clear();
-+ std::copy(i, entries_.cend(), std::inserter(es, es.end()));
-+ ec = write(std::move(es), std::move(l), y);
-+ ++tries;
-+ } while (ec == bs::errc::operation_canceled &&
-+ tries < max_tries);
-+ if (tries >= max_tries) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": exhausted retry attempts." << dendl;
-+ return ec;
-+ }
-+
-+ if (ec) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": write failed with ec=" << ec.message() << dendl;
-+ return ec;
-+ }
-+ } catch (const std::bad_alloc&) {
-+ return bs::error_code(ENOMEM, bs::system_category());
-+ }
-+ return {};
-+}
-+
-+void logback_generations::handle_notify(uint64_t notify_id,
-+ uint64_t cookie,
-+ uint64_t notifier_id,
-+ bufferlist& bl)
-+{
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ if (notifier_id != my_id) {
-+ auto ec = update(null_yield);
-+ if (ec) {
-+ lderr(cct)
-+ << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": update failed, no one to report to and no safe way to continue."
-+ << dendl;
-+ abort();
-+ }
-+ }
-+ cb::list rbl;
-+ ioctx.notify_ack(oid, notify_id, watchcookie, rbl);
-+}
-+
-+void logback_generations::handle_error(uint64_t cookie, int err) {
-+ auto cct = static_cast<CephContext*>(ioctx.cct());
-+ auto r = ioctx.unwatch2(watchcookie);
-+ if (r < 0) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": failed to set unwatch oid=" << oid
-+ << ", r=" << r << dendl;
-+ }
-+
-+ auto ec = watch();
-+ if (ec) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": failed to re-establish watch, unsafe to continue: oid="
-+ << oid << ", ec=" << ec.message() << dendl;
-+ }
-+}
-diff --git a/src/rgw/rgw_log_backing.h b/src/rgw/rgw_log_backing.h
-index 8546370a3757a..242bf0e1c00a4 100644
---- a/src/rgw/rgw_log_backing.h
-+++ b/src/rgw/rgw_log_backing.h
-@@ -11,6 +11,7 @@
-
- #include <strings.h>
-
-+#include <boost/container/flat_map.hpp>
- #include <boost/system/error_code.hpp>
-
- #undef FMT_HEADER_ONLY
-@@ -22,10 +23,13 @@
- #include "include/expected.hpp"
- #include "include/function2.hpp"
-
-+#include "cls/version/cls_version_types.h"
-+
- #include "common/async/yield_context.h"
- #include "common/Formatter.h"
- #include "common/strtol.h"
-
-+namespace bc = boost::container;
- namespace bs = boost::system;
-
- /// Type of log backing, stored in the mark used in the quick check,
-@@ -43,7 +47,7 @@ inline void encode(const log_type& type, ceph::buffer::list& bl) {
- inline void decode(log_type& type, bufferlist::const_iterator& bl) {
- uint8_t t;
- decode(t, bl);
-- type = static_cast<log_type>(type);
-+ type = static_cast<log_type>(t);
- }
-
- inline std::optional<log_type> to_log_type(std::string_view s) {
-@@ -108,6 +112,117 @@ struct logback_generation {
- };
- WRITE_CLASS_ENCODER(logback_generation)
-
-+class logback_generations : public librados::WatchCtx2 {
-+public:
-+ using entries_t = bc::flat_map<uint64_t, logback_generation>;
-+
-+protected:
-+ librados::IoCtx& ioctx;
-+ logback_generations(librados::IoCtx& ioctx,
-+ std::string oid,
-+ fu2::unique_function<std::string(
-+ uint64_t, int) const>&& get_oid,
-+ int shards) noexcept
-+ : ioctx(ioctx), oid(oid), get_oid(std::move(get_oid)),
-+ shards(shards) {}
-+
-+ uint64_t my_id = ioctx.get_instance_id();
-+
-+private:
-+ const std::string oid;
-+ const fu2::unique_function<std::string(uint64_t, int) const> get_oid;
-+
-+protected:
-+ const int shards;
-+
-+ uint64_t watchcookie = 0;
-+
-+ obj_version version;
-+ std::mutex m;
-+ entries_t entries_;
-+
-+ tl::expected<std::pair<entries_t, obj_version>, bs::error_code>
-+ read(optional_yield y) noexcept;
-+ bs::error_code write(entries_t&& e, std::unique_lock<std::mutex>&& l_,
-+ optional_yield y) noexcept;
-+ bs::error_code setup(log_type def, optional_yield y) noexcept;
-+
-+ bs::error_code watch() noexcept;
-+
-+ auto lowest_nomempty(const entries_t& es) {
-+ return std::find_if(es.begin(), es.end(),
-+ [](const auto& e) {
-+ return !e.second.empty;
-+ });
-+ }
-+
-+public:
-+
-+ /// For the use of watch/notify.
-+
-+ void handle_notify(uint64_t notify_id,
-+ uint64_t cookie,
-+ uint64_t notifier_id,
-+ bufferlist& bl) override final;
-+
-+ void handle_error(uint64_t cookie, int err) override final;
-+
-+ /// Public interface
-+
-+ virtual ~logback_generations();
-+
-+ template<typename T, typename... Args>
-+ static tl::expected<std::unique_ptr<T>, bs::error_code>
-+ init(librados::IoCtx& ioctx_, std::string oid_,
-+ fu2::unique_function<std::string(uint64_t, int) const>&& get_oid_,
-+ int shards_, log_type def, optional_yield y,
-+ Args&& ...args) noexcept {
-+ try {
-+ T* lgp = new T(ioctx_, std::move(oid_),
-+ std::move(get_oid_),
-+ shards_, std::forward<Args>(args)...);
-+ std::unique_ptr<T> lg(lgp);
-+ lgp = nullptr;
-+ auto ec = lg->setup(def, y);
-+ if (ec)
-+ return tl::unexpected(ec);
-+ // Obnoxiousness for C++ Compiler in Bionic Beaver
-+ return tl::expected<std::unique_ptr<T>, bs::error_code>(std::move(lg));
-+ } catch (const std::bad_alloc&) {
-+ return tl::unexpected(bs::error_code(ENOMEM, bs::system_category()));
-+ }
-+ }
-+
-+ bs::error_code update(optional_yield y) noexcept;
-+
-+ entries_t entries() const {
-+ return entries_;
-+ }
-+
-+ bs::error_code new_backing(log_type type, optional_yield y) noexcept;
-+
-+ bs::error_code empty_to(uint64_t gen_id, optional_yield y) noexcept;
-+
-+ bs::error_code remove_empty(optional_yield y) noexcept;
-+
-+ // Callbacks, to be defined by descendant.
-+
-+ /// Handle initialization on startup
-+ ///
-+ /// @param e All non-empty generations
-+ virtual bs::error_code handle_init(entries_t e) noexcept = 0;
-+
-+ /// Handle new generations.
-+ ///
-+ /// @param e Map of generations added since last update
-+ virtual bs::error_code handle_new_gens(entries_t e) noexcept = 0;
-+
-+ /// Handle generations being marked empty
-+ ///
-+ /// @param new_tail Lowest non-empty generation
-+ virtual bs::error_code handle_empty_to(uint64_t new_tail) noexcept = 0;
-+};
-+
- inline std::string gencursor(uint64_t gen_id, std::string_view cursor) {
- return (gen_id > 0 ?
- fmt::format("G{:0>20}@{}", gen_id, cursor) :
-diff --git a/src/test/rgw/test_log_backing.cc b/src/test/rgw/test_log_backing.cc
-index 848bd6b50c4e5..166de2dd8242c 100644
---- a/src/test/rgw/test_log_backing.cc
-+++ b/src/test/rgw/test_log_backing.cc
-@@ -46,17 +46,23 @@ class LogBacking : public testing::Test {
- const std::string pool_name = get_temp_pool_name();
- lr::Rados rados;
- lr::IoCtx ioctx;
-+ lr::Rados rados2;
-+ lr::IoCtx ioctx2;
-
- void SetUp() override {
- ASSERT_EQ("", create_one_pool_pp(pool_name, rados));
- ASSERT_EQ(0, rados.ioctx_create(pool_name.c_str(), ioctx));
-+ connect_cluster_pp(rados2);
-+ ASSERT_EQ(0, rados2.ioctx_create(pool_name.c_str(), ioctx2));
- }
- void TearDown() override {
- destroy_one_pool_pp(pool_name, rados);
- }
-
-- static std::string get_oid(int i) {
-- return fmt::format("shard.{}", i);
-+ std::string get_oid(uint64_t gen_id, int i) const {
-+ return (gen_id > 0 ?
-+ fmt::format("shard(a)G{}.{}", gen_id, i) :
-+ fmt::format("shard.{}", i));
- }
-
- void make_omap() {
-@@ -66,7 +72,7 @@ class LogBacking : public testing::Test {
- cb::list bl;
- encode(i, bl);
- cls_log_add(op, ceph_clock_now(), {}, "meow", bl);
-- auto r = rgw_rados_operate(ioctx, get_oid(i), &op, null_yield);
-+ auto r = rgw_rados_operate(ioctx, get_oid(0, i), &op, null_yield);
- ASSERT_GE(r, 0);
- }
- }
-@@ -77,13 +83,13 @@ class LogBacking : public testing::Test {
- cb::list bl;
- encode(i, bl);
- cls_log_add(op, ceph_clock_now(), {}, "meow", bl);
-- auto r = rgw_rados_operate(ioctx, get_oid(i), &op, null_yield);
-+ auto r = rgw_rados_operate(ioctx, get_oid(0, i), &op, null_yield);
- ASSERT_GE(r, 0);
- }
-
- void empty_omap() {
- for (int i = 0; i < SHARDS; ++i) {
-- auto oid = get_oid(i);
-+ auto oid = get_oid(0, i);
- std::string to_marker;
- {
- lr::ObjectReadOperation op;
-@@ -116,7 +122,7 @@ class LogBacking : public testing::Test {
- {
- for (int i = 0; i < SHARDS; ++i) {
- std::unique_ptr<RCf::FIFO> fifo;
-- auto r = RCf::FIFO::create(ioctx, get_oid(i), &fifo, null_yield);
-+ auto r = RCf::FIFO::create(ioctx, get_oid(0, i), &fifo, null_yield);
- ASSERT_EQ(0, r);
- ASSERT_TRUE(fifo);
- }
-@@ -126,7 +132,7 @@ class LogBacking : public testing::Test {
- {
- using ceph::encode;
- std::unique_ptr<RCf::FIFO> fifo;
-- auto r = RCf::FIFO::open(ioctx, get_oid(i), &fifo, null_yield);
-+ auto r = RCf::FIFO::open(ioctx, get_oid(0, i), &fifo, null_yield);
- ASSERT_GE(0, r);
- ASSERT_TRUE(fifo);
- cb::list bl;
-@@ -149,14 +155,16 @@ TEST_F(LogBacking, TestOmap)
- {
- make_omap();
- auto stat = log_backing_type(ioctx, log_type::fifo, SHARDS,
-- get_oid, null_yield);
-+ [this](int shard){ return get_oid(0, shard); },
-+ null_yield);
- ASSERT_EQ(log_type::omap, *stat);
- }
-
- TEST_F(LogBacking, TestOmapEmpty)
- {
- auto stat = log_backing_type(ioctx, log_type::omap, SHARDS,
-- get_oid, null_yield);
-+ [this](int shard){ return get_oid(0, shard); },
-+ null_yield);
- ASSERT_EQ(log_type::omap, *stat);
- }
-
-@@ -164,14 +172,16 @@ TEST_F(LogBacking, TestFIFO)
- {
- make_fifo();
- auto stat = log_backing_type(ioctx, log_type::fifo, SHARDS,
-- get_oid, null_yield);
-+ [this](int shard){ return get_oid(0, shard); },
-+ null_yield);
- ASSERT_EQ(log_type::fifo, *stat);
- }
-
- TEST_F(LogBacking, TestFIFOEmpty)
- {
- auto stat = log_backing_type(ioctx, log_type::fifo, SHARDS,
-- get_oid, null_yield);
-+ [this](int shard){ return get_oid(0, shard); },
-+ null_yield);
- ASSERT_EQ(log_type::fifo, *stat);
- }
-
-@@ -192,3 +202,176 @@ TEST(CursorGen, RoundTrip) {
- ASSERT_EQ(pcurs, cursor);
- }
- }
-+
-+class generations final : public logback_generations {
-+public:
-+
-+ entries_t got_entries;
-+ std::optional<uint64_t> tail;
-+
-+ using logback_generations::logback_generations;
-+
-+ bs::error_code handle_init(entries_t e) noexcept {
-+ got_entries = e;
-+ return {};
-+ }
-+
-+ bs::error_code handle_new_gens(entries_t e) noexcept {
-+ got_entries = e;
-+ return {};
-+ }
-+
-+ bs::error_code handle_empty_to(uint64_t new_tail) noexcept {
-+ tail = new_tail;
-+ return {};
-+ }
-+};
-+
-+TEST_F(LogBacking, GenerationSingle)
-+{
-+ auto lgr = logback_generations::init<generations>(
-+ ioctx, "foobar", [this](uint64_t gen_id, int shard) {
-+ return get_oid(gen_id, shard);
-+ }, SHARDS, log_type::fifo, null_yield);
-+ ASSERT_TRUE(lgr);
-+
-+ auto lg = std::move(*lgr);
-+
-+ ASSERT_EQ(0, lg->got_entries.begin()->first);
-+
-+ ASSERT_EQ(0, lg->got_entries[0].gen_id);
-+ ASSERT_EQ(log_type::fifo, lg->got_entries[0].type);
-+ ASSERT_FALSE(lg->got_entries[0].empty);
-+
-+ auto ec = lg->empty_to(0, null_yield);
-+ ASSERT_TRUE(ec);
-+
-+
-+ lg.reset();
-+
-+ lg = *logback_generations::init<generations>(
-+ ioctx, "foobar", [this](uint64_t gen_id, int shard) {
-+ return get_oid(gen_id, shard);
-+ }, SHARDS, log_type::fifo, null_yield);
-+
-+ ASSERT_EQ(0, lg->got_entries.begin()->first);
-+
-+ ASSERT_EQ(0, lg->got_entries[0].gen_id);
-+ ASSERT_EQ(log_type::fifo, lg->got_entries[0].type);
-+ ASSERT_FALSE(lg->got_entries[0].empty);
-+
-+ lg->got_entries.clear();
-+
-+ ec = lg->new_backing(log_type::omap, null_yield);
-+ ASSERT_FALSE(ec);
-+
-+ ASSERT_EQ(1, lg->got_entries.size());
-+ ASSERT_EQ(1, lg->got_entries[1].gen_id);
-+ ASSERT_EQ(log_type::omap, lg->got_entries[1].type);
-+ ASSERT_FALSE(lg->got_entries[1].empty);
-+
-+ lg.reset();
-+
-+ lg = *logback_generations::init<generations>(
-+ ioctx, "foobar", [this](uint64_t gen_id, int shard) {
-+ return get_oid(gen_id, shard);
-+ }, SHARDS, log_type::fifo, null_yield);
-+
-+ ASSERT_EQ(2, lg->got_entries.size());
-+ ASSERT_EQ(0, lg->got_entries[0].gen_id);
-+ ASSERT_EQ(log_type::fifo, lg->got_entries[0].type);
-+ ASSERT_FALSE(lg->got_entries[0].empty);
-+
-+ ASSERT_EQ(1, lg->got_entries[1].gen_id);
-+ ASSERT_EQ(log_type::omap, lg->got_entries[1].type);
-+ ASSERT_FALSE(lg->got_entries[1].empty);
-+
-+ ec = lg->empty_to(0, null_yield);
-+ ASSERT_FALSE(ec);
-+
-+ ASSERT_EQ(0, *lg->tail);
-+
-+ lg.reset();
-+
-+ lg = *logback_generations::init<generations>(
-+ ioctx, "foobar", [this](uint64_t gen_id, int shard) {
-+ return get_oid(gen_id, shard);
-+ }, SHARDS, log_type::fifo, null_yield);
-+
-+ ASSERT_EQ(1, lg->got_entries.size());
-+ ASSERT_EQ(1, lg->got_entries[1].gen_id);
-+ ASSERT_EQ(log_type::omap, lg->got_entries[1].type);
-+ ASSERT_FALSE(lg->got_entries[1].empty);
-+
-+ ec = lg->remove_empty(null_yield);
-+ ASSERT_FALSE(ec);
-+
-+ auto entries = lg->entries();
-+ ASSERT_EQ(1, entries.size());
-+
-+ ASSERT_EQ(1, entries[1].gen_id);
-+ ASSERT_EQ(log_type::omap, entries[1].type);
-+ ASSERT_FALSE(entries[1].empty);
-+
-+ lg.reset();
-+}
-+
-+TEST_F(LogBacking, GenerationWN)
-+{
-+ auto lg1 = *logback_generations::init<generations>(
-+ ioctx, "foobar", [this](uint64_t gen_id, int shard) {
-+ return get_oid(gen_id, shard);
-+ }, SHARDS, log_type::fifo, null_yield);
-+
-+ auto ec = lg1->new_backing(log_type::omap, null_yield);
-+ ASSERT_FALSE(ec);
-+
-+ ASSERT_EQ(1, lg1->got_entries.size());
-+ ASSERT_EQ(1, lg1->got_entries[1].gen_id);
-+ ASSERT_EQ(log_type::omap, lg1->got_entries[1].type);
-+ ASSERT_FALSE(lg1->got_entries[1].empty);
-+
-+ lg1->got_entries.clear();
-+
-+ auto lg2 = *logback_generations::init<generations>(
-+ ioctx2, "foobar", [this](uint64_t gen_id, int shard) {
-+ return get_oid(gen_id, shard);
-+ }, SHARDS, log_type::fifo, null_yield);
-+
-+ ASSERT_EQ(2, lg2->got_entries.size());
-+
-+ ASSERT_EQ(0, lg2->got_entries[0].gen_id);
-+ ASSERT_EQ(log_type::fifo, lg2->got_entries[0].type);
-+ ASSERT_FALSE(lg2->got_entries[0].empty);
-+
-+ ASSERT_EQ(1, lg2->got_entries[1].gen_id);
-+ ASSERT_EQ(log_type::omap, lg2->got_entries[1].type);
-+ ASSERT_FALSE(lg2->got_entries[1].empty);
-+
-+ lg2->got_entries.clear();
-+
-+ ec = lg1->new_backing(log_type::fifo, null_yield);
-+ ASSERT_FALSE(ec);
-+
-+ ASSERT_EQ(1, lg1->got_entries.size());
-+ ASSERT_EQ(2, lg1->got_entries[2].gen_id);
-+ ASSERT_EQ(log_type::fifo, lg1->got_entries[2].type);
-+ ASSERT_FALSE(lg1->got_entries[2].empty);
-+
-+ ASSERT_EQ(1, lg2->got_entries.size());
-+ ASSERT_EQ(2, lg2->got_entries[2].gen_id);
-+ ASSERT_EQ(log_type::fifo, lg2->got_entries[2].type);
-+ ASSERT_FALSE(lg2->got_entries[2].empty);
-+
-+ lg1->got_entries.clear();
-+ lg2->got_entries.clear();
-+
-+ ec = lg2->empty_to(1, null_yield);
-+ ASSERT_FALSE(ec);
-+
-+ ASSERT_EQ(1, *lg1->tail);
-+ ASSERT_EQ(1, *lg2->tail);
-+
-+ lg1->tail.reset();
-+ lg2->tail.reset();
-+}
-
-From 739be4ff5322878d80a593f9364295c2ed1c1b86 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Mon, 23 Nov 2020 15:29:35 -0500
-Subject: [PATCH 10/26] rgw: Add rgw_complete_aio_completion()
-
-To manually complete an asynchronous librados call.
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 97c3f2b4e6d0a8d0c2366d6dca4570e063af7953)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/cls_fifo_legacy.cc | 24 +++---------------------
- src/rgw/rgw_datalog.cc | 22 +---------------------
- src/rgw/rgw_tools.cc | 8 ++++++++
- src/rgw/rgw_tools.h | 5 +++++
- 4 files changed, 17 insertions(+), 42 deletions(-)
-
-diff --git a/src/rgw/cls_fifo_legacy.cc b/src/rgw/cls_fifo_legacy.cc
-index 569a3e77c458f..f95b796152d33 100644
---- a/src/rgw/cls_fifo_legacy.cc
-+++ b/src/rgw/cls_fifo_legacy.cc
-@@ -428,28 +428,10 @@ struct Completion {
- return c;
- }
- static void complete(Ptr&& p, int r) {
-- auto c = p->_super->pc;
-+ auto c = p->_super;
- p->_super = nullptr;
-- c->lock.lock();
-- c->rval = r;
-- c->complete = true;
-- c->lock.unlock();
--
-- auto cb_complete = c->callback_complete;
-- auto cb_complete_arg = c->callback_complete_arg;
-- if (cb_complete)
-- cb_complete(c, cb_complete_arg);
--
-- auto cb_safe = c->callback_safe;
-- auto cb_safe_arg = c->callback_safe_arg;
-- if (cb_safe)
-- cb_safe(c, cb_safe_arg);
--
-- c->lock.lock();
-- c->callback_complete = nullptr;
-- c->callback_safe = nullptr;
-- c->cond.notify_all();
-- c->put_unlock();
-+ c->pc->put();
-+ rgw_complete_aio_completion(c, r);
- }
-
- static void cb(lr::completion_t, void* arg) {
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index 329657d463125..460ebd105dca8 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -333,27 +333,7 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- librados::AioCompletion* c) override {
- int r = 0;
- if (marker == rgw::cls::fifo::marker(0, 0).to_string()) {
-- auto pc = c->pc;
-- pc->get();
-- pc->lock.lock();
-- pc->rval = 0;
-- pc->complete = true;
-- pc->lock.unlock();
-- auto cb_complete = pc->callback_complete;
-- auto cb_complete_arg = pc->callback_complete_arg;
-- if (cb_complete)
-- cb_complete(pc, cb_complete_arg);
--
-- auto cb_safe = pc->callback_safe;
-- auto cb_safe_arg = pc->callback_safe_arg;
-- if (cb_safe)
-- cb_safe(pc, cb_safe_arg);
--
-- pc->lock.lock();
-- pc->callback_complete = NULL;
-- pc->callback_safe = NULL;
-- pc->cond.notify_all();
-- pc->put_unlock();
-+ rgw_complete_aio_completion(c, 0);
- } else {
- fifos[index]->trim(marker, false, c);
- }
-diff --git a/src/rgw/rgw_tools.cc b/src/rgw/rgw_tools.cc
-index 89a322b0675ad..82e0ecf546d60 100644
---- a/src/rgw/rgw_tools.cc
-+++ b/src/rgw/rgw_tools.cc
-@@ -11,6 +11,8 @@
- #include "include/types.h"
- #include "include/stringify.h"
-
-+#include "librados/AioCompletionImpl.h"
-+
- #include "rgw_common.h"
- #include "rgw_tools.h"
- #include "rgw_acl_s3.h"
-@@ -592,3 +594,9 @@ void rgw_tools_cleanup()
- delete ext_mime_map;
- ext_mime_map = nullptr;
- }
-+
-+void rgw_complete_aio_completion(librados::AioCompletion* c, int r) {
-+ auto pc = c->pc;
-+ librados::CB_AioCompleteAndSafe cb(pc);
-+ cb(r);
-+}
-diff --git a/src/rgw/rgw_tools.h b/src/rgw/rgw_tools.h
-index 28d251c28d6c6..cf586dabea9cf 100644
---- a/src/rgw/rgw_tools.h
-+++ b/src/rgw/rgw_tools.h
-@@ -253,4 +253,9 @@ class RGWDataAccess
-
- using RGWDataAccessRef = std::shared_ptr<RGWDataAccess>;
-
-+/// Complete an AioCompletion. To return error values or otherwise
-+/// satisfy the caller. Useful for making complicated asynchronous
-+/// calls and error handling.
-+void rgw_complete_aio_completion(librados::AioCompletion* c, int r);
-+
- #endif
-
-From af90c013b688d2a83773c5fe3ad82c262a1156cb Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Wed, 6 Jan 2021 03:40:50 -0500
-Subject: [PATCH 11/26] rgw: Lay groundwork for multigenerational datalog
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 27ca609755a2c0e8fd501be46bc20026aa33b93c)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/cls_fifo_legacy.cc | 65 ------------------
- src/rgw/cls_fifo_legacy.h | 65 ++++++++++++++++++
- src/rgw/rgw_datalog.cc | 135 ++++++++++++++++++++++++++++++++++---
- src/rgw/rgw_datalog.h | 36 ++++++++--
- src/rgw/rgw_log_backing.h | 9 +++
- 5 files changed, 232 insertions(+), 78 deletions(-)
-
-diff --git a/src/rgw/cls_fifo_legacy.cc b/src/rgw/cls_fifo_legacy.cc
-index f95b796152d33..3ddb2578d3541 100644
---- a/src/rgw/cls_fifo_legacy.cc
-+++ b/src/rgw/cls_fifo_legacy.cc
-@@ -32,10 +32,6 @@
- #include "cls/fifo/cls_fifo_types.h"
- #include "cls/fifo/cls_fifo_ops.h"
-
--#include "librados/AioCompletionImpl.h"
--
--#include "rgw_tools.h"
--
- #include "cls_fifo_legacy.h"
-
- namespace rgw::cls::fifo {
-@@ -382,67 +378,6 @@ struct partinfo_completion : public lr::ObjectOperationCompletion {
- }
- };
-
--template<typename T>
--struct Completion {
--private:
-- lr::AioCompletion* _cur = nullptr;
-- lr::AioCompletion* _super;
--public:
--
-- using Ptr = std::unique_ptr<T>;
--
-- lr::AioCompletion* cur() const {
-- return _cur;
-- }
-- lr::AioCompletion* super() const {
-- return _super;
-- }
--
-- Completion(lr::AioCompletion* super) : _super(super) {
-- super->pc->get();
-- }
--
-- ~Completion() {
-- if (_super) {
-- _super->pc->put();
-- }
-- if (_cur)
-- _cur->release();
-- _super = nullptr;
-- _cur = nullptr;
-- }
--
-- // The only times that aio_operate can return an error are:
-- // 1. The completion contains a null pointer. This should just
-- // crash, and in our case it does.
-- // 2. An attempt is made to write to a snapshot. RGW doesn't use
-- // snapshots, so we don't care.
-- //
-- // So we will just assert that initiating an Aio operation succeeds
-- // and not worry about recovering.
-- static lr::AioCompletion* call(Ptr&& p) {
-- p->_cur = lr::Rados::aio_create_completion(static_cast<void*>(p.get()),
-- &cb);
-- auto c = p->_cur;
-- p.release();
-- return c;
-- }
-- static void complete(Ptr&& p, int r) {
-- auto c = p->_super;
-- p->_super = nullptr;
-- c->pc->put();
-- rgw_complete_aio_completion(c, r);
-- }
--
-- static void cb(lr::completion_t, void* arg) {
-- auto t = static_cast<T*>(arg);
-- auto r = t->_cur->get_return_value();
-- t->_cur->release();
-- t->_cur = nullptr;
-- t->handle(Ptr(t), r);
-- }
--};
--
- lr::ObjectReadOperation get_part_info(CephContext* cct,
- fifo::part_header* header,
- std::uint64_t tid, int* r = 0)
-diff --git a/src/rgw/cls_fifo_legacy.h b/src/rgw/cls_fifo_legacy.h
-index b6b5f04bb30ad..307abbb198918 100644
---- a/src/rgw/cls_fifo_legacy.h
-+++ b/src/rgw/cls_fifo_legacy.h
-@@ -38,6 +38,10 @@
- #include "cls/fifo/cls_fifo_types.h"
- #include "cls/fifo/cls_fifo_ops.h"
-
-+#include "librados/AioCompletionImpl.h"
-+
-+#include "rgw_tools.h"
-+
- namespace rgw::cls::fifo {
- namespace cb = ceph::buffer;
- namespace fifo = rados::cls::fifo;
-@@ -265,6 +269,67 @@ class FIFO {
- lr::AioCompletion* c //< AIO Completion
- );
- };
-+
-+template<typename T>
-+struct Completion {
-+private:
-+ lr::AioCompletion* _cur = nullptr;
-+ lr::AioCompletion* _super;
-+public:
-+
-+ using Ptr = std::unique_ptr<T>;
-+
-+ lr::AioCompletion* cur() const {
-+ return _cur;
-+ }
-+ lr::AioCompletion* super() const {
-+ return _super;
-+ }
-+
-+ Completion(lr::AioCompletion* super) : _super(super) {
-+ super->pc->get();
-+ }
-+
-+ ~Completion() {
-+ if (_super) {
-+ _super->pc->put();
-+ }
-+ if (_cur)
-+ _cur->release();
-+ _super = nullptr;
-+ _cur = nullptr;
-+ }
-+
-+ // The only times that aio_operate can return an error are:
-+ // 1. The completion contains a null pointer. This should just
-+ // crash, and in our case it does.
-+ // 2. An attempt is made to write to a snapshot. RGW doesn't use
-+ // snapshots, so we don't care.
-+ //
-+ // So we will just assert that initiating an Aio operation succeeds
-+ // and not worry about recovering.
-+ static lr::AioCompletion* call(Ptr&& p) {
-+ p->_cur = lr::Rados::aio_create_completion(static_cast<void*>(p.get()),
-+ &cb);
-+ auto c = p->_cur;
-+ p.release();
-+ return c;
-+ }
-+ static void complete(Ptr&& p, int r) {
-+ auto c = p->_super;
-+ p->_super = nullptr;
-+ rgw_complete_aio_completion(c, r);
-+ }
-+
-+ static void cb(lr::completion_t, void* arg) {
-+ auto t = static_cast<T*>(arg);
-+ auto r = t->_cur->get_return_value();
-+ t->_cur->release();
-+ t->_cur = nullptr;
-+ t->handle(Ptr(t), r);
-+ }
-+};
-+
- }
-
- #endif // CEPH_RGW_CLS_FIFO_LEGACY_H
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index 460ebd105dca8..2b04d530d1c6f 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -383,10 +383,10 @@ int RGWDataChangesLog::start(const RGWZone* _zone,
- try {
- switch (*found) {
- case log_type::omap:
-- be = std::make_unique<RGWDataChangesOmap>(ioctx, *this, 0, num_shards);
-+ bes.set_zero(new RGWDataChangesOmap(ioctx, *this, 0, num_shards));
- break;
- case log_type::fifo:
-- be = std::make_unique<RGWDataChangesFIFO>(ioctx, *this, 0, num_shards);
-+ bes.set_zero(new RGWDataChangesFIFO(ioctx, *this, 0, num_shards));
- break;
- }
- } catch (bs::system_error& e) {
-@@ -396,7 +396,6 @@ int RGWDataChangesLog::start(const RGWZone* _zone,
- return ceph::from_error_code(e.code());
- }
-
-- ceph_assert(be);
- renew_thread = make_named_thread("rgw_dt_lg_renew",
- &RGWDataChangesLog::renew_run, this);
- return 0;
-@@ -426,6 +425,7 @@ int RGWDataChangesLog::renew_entries()
- l.unlock();
-
- auto ut = real_clock::now();
-+ auto be = bes.head();
- for (const auto& bs : entries) {
- auto index = choose_oid(bs);
-
-@@ -592,6 +592,7 @@ int RGWDataChangesLog::add_entry(const RGWBucketInfo& bucket_info, int shard_id)
-
- ldout(cct, 20) << "RGWDataChangesLog::add_entry() sending update with now=" << now << " cur_expiration=" << expiration << dendl;
-
-+ auto be = bes.head();
- ret = be->push(index, now, change.key, std::move(bl));
-
- now = real_clock::now();
-@@ -615,14 +616,44 @@ int RGWDataChangesLog::add_entry(const RGWBucketInfo& bucket_info, int shard_id)
- return ret;
- }
-
-+int DataLogBackends::list(int shard, int max_entries,
-+ std::vector<rgw_data_change_log_entry>& entries,
-+ std::optional<std::string_view> marker,
-+ std::string* out_marker, bool* truncated)
-+{
-+ auto [gen_id, cursor] = cursorgeno(marker);
-+ std::string out_cursor;
-+ while (max_entries > 0) {
-+ std::vector<rgw_data_change_log_entry> gentries;
-+ std::unique_lock l(m);
-+ auto i = lower_bound(gen_id);
-+ if (i == end()) return 0;
-+ auto be = i->second;
-+ auto r = be->list(shard, max_entries, gentries, cursor,
-+ &out_cursor, truncated);
-+ if (r < 0)
-+ return r;
-+
-+ *out_marker = gencursor(gen_id, out_cursor);
-+ for (auto& g : gentries) {
-+ g.log_id = gencursor(gen_id, g.log_id);
-+ }
-+ max_entries -= gentries.size();
-+ std::move(gentries.begin(), gentries.end(),
-+ std::back_inserter(entries));
-+ cursor = {};
-+ ++gen_id;
-+ }
-+ return 0;
-+}
-+
- int RGWDataChangesLog::list_entries(int shard, int max_entries,
- std::vector<rgw_data_change_log_entry>& entries,
- std::optional<std::string_view> marker,
- std::string* out_marker, bool* truncated)
- {
- assert(shard < num_shards);
-- return be->list(shard, max_entries, entries, std::string(marker.value_or("")),
-- out_marker, truncated);
-+ return bes.list(shard, max_entries, entries, marker, out_marker, truncated);
- }
-
- int RGWDataChangesLog::list_entries(int max_entries,
-@@ -653,20 +684,105 @@ int RGWDataChangesLog::list_entries(int max_entries,
- int RGWDataChangesLog::get_info(int shard_id, RGWDataChangesLogInfo *info)
- {
- assert(shard_id < num_shards);
-+ auto be = bes.head();
- return be->get_info(shard_id, info);
- }
-
-+int DataLogBackends::trim_entries(int shard_id, std::string_view marker)
-+{
-+ auto [target_gen, cursor] = cursorgen(marker);
-+ std::unique_lock l(m);
-+ const auto head_gen = (end() - 1)->second->gen_id;
-+ const auto tail_gen = begin()->first;
-+ if (target_gen < tail_gen) return 0;
-+ auto r = 0;
-+ for (auto i = lower_bound(0);
-+ i != end() && i->first <= target_gen && i->first <= head_gen && r >= 0;
-+ i = upper_bound(i->first)) {
-+ auto be = i->second;
-+ l.unlock();
-+ auto c = be->gen_id == target_gen ? cursor : be->max_marker();
-+ r = be->trim(shard_id, c);
-+ l.lock();
-+ };
-+ return r;
-+}
-+
- int RGWDataChangesLog::trim_entries(int shard_id, std::string_view marker)
- {
- assert(shard_id < num_shards);
-- return be->trim(shard_id, marker);
-+ return bes.trim_entries(shard_id, marker);
-+}
-+
-+class GenTrim : public rgw::cls::fifo::Completion<GenTrim> {
-+public:
-+ DataLogBackends* const bes;
-+ const int shard_id;
-+ const uint64_t target_gen;
-+ const std::string cursor;
-+ const uint64_t head_gen;
-+ const uint64_t tail_gen;
-+ boost::intrusive_ptr<RGWDataChangesBE> be;
-+
-+ GenTrim(DataLogBackends* bes, int shard_id, uint64_t target_gen, std::string cursor,
-+ uint64_t head_gen, uint64_t tail_gen,
-+ boost::intrusive_ptr<RGWDataChangesBE>&& be,
-+ lr::AioCompletion* super)
-+ : Completion(super), bes(bes), shard_id(shard_id), target_gen(target_gen),
-+ cursor(std::move(cursor)), head_gen(head_gen), tail_gen(tail_gen),
-+ be(std::move(be)) {}
-+
-+ void handle(Ptr&& p, int r) {
-+ auto gen_id = be->gen_id;
-+ be.reset();
-+ if (r < 0) {
-+ complete(std::move(p), r);
-+ return;
-+ }
-+
-+ {
-+ std::unique_lock l(bes->m);
-+ auto i = bes->upper_bound(gen_id);
-+ if (i == bes->end() || i->first > target_gen || i->first > head_gen) {
-+ l.unlock();
-+ complete(std::move(p), r);
-+ return;
-+ }
-+ be = i->second;
-+ }
-+ auto c = be->gen_id == target_gen ? cursor : be->max_marker();
-+ r = be->trim(shard_id, c, call(std::move(p)));
-+ }
-+};
-+
-+void DataLogBackends::trim_entries(int shard_id, std::string_view marker,
-+ librados::AioCompletion* c)
-+{
-+ auto [target_gen, cursor] = cursorgen(marker);
-+ std::unique_lock l(m);
-+ const auto head_gen = (end() - 1)->second->gen_id;
-+ const auto tail_gen = begin()->first;
-+ if (target_gen < tail_gen) {
-+ l.unlock();
-+ rgw_complete_aio_completion(c, 0);
-+ return;
-+ }
-+ auto be = lower_bound(0)->second;
-+ l.unlock();
-+ auto p = be.get();
-+ auto gt = std::make_unique<GenTrim>(this, shard_id, target_gen,
-+ std::string(cursor), head_gen, tail_gen,
-+ std::move(be), c);
-+
-+ p->trim(shard_id, cursor, GenTrim::call(std::move(gt)));
- }
-
- int RGWDataChangesLog::trim_entries(int shard_id, std::string_view marker,
- librados::AioCompletion* c)
- {
- assert(shard_id < num_shards);
-- return be->trim(shard_id, marker, c);
-+ bes.trim_entries(shard_id, marker, c);
-+ return 0;
- }
-
- bool RGWDataChangesLog::going_down() const
-@@ -720,6 +836,7 @@ void RGWDataChangesLog::mark_modified(int shard_id, const rgw_bucket_shard& bs)
- modified_shards[shard_id].insert(key);
- }
-
--std::string_view RGWDataChangesLog::max_marker() const {
-- return be->max_marker();
-+std::string RGWDataChangesLog::max_marker() const {
-+ return gencursor(std::numeric_limits<uint64_t>::max(),
-+ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
- }
-diff --git a/src/rgw/rgw_datalog.h b/src/rgw/rgw_datalog.h
-index 2a73237b38d2d..0915bebde11cf 100644
---- a/src/rgw/rgw_datalog.h
-+++ b/src/rgw/rgw_datalog.h
-@@ -13,6 +13,8 @@
- #include <vector>
-
- #include <boost/container/flat_map.hpp>
-+#include <boost/smart_ptr/intrusive_ptr.hpp>
-+#include <boost/smart_ptr/intrusive_ref_counter.hpp>
-
- #undef FMT_HEADER_ONLY
- #define FMT_HEADER_ONLY 1
-@@ -119,12 +121,37 @@ class RGWDataChangesLog;
-
- class RGWDataChangesBE;
-
-+class DataLogBackends
-+ : private bc::flat_map<uint64_t, boost::intrusive_ptr<RGWDataChangesBE>> {
-+ friend class GenTrim;
-+
-+ std::mutex m;
-+public:
-+
-+ boost::intrusive_ptr<RGWDataChangesBE> head() {
-+ std::unique_lock l(m);
-+ auto i = end();
-+ --i;
-+ return i->second;
-+ }
-+ int list(int shard, int max_entries,
-+ std::vector<rgw_data_change_log_entry>& entries,
-+ std::optional<std::string_view> marker,
-+ std::string* out_marker, bool* truncated);
-+ int trim_entries(int shard_id, std::string_view marker);
-+ void trim_entries(int shard_id, std::string_view marker,
-+ librados::AioCompletion* c);
-+ void set_zero(RGWDataChangesBE* be) {
-+ emplace(0, be);
-+ }
-+};
-+
- class RGWDataChangesLog {
- CephContext *cct;
- librados::IoCtx ioctx;
- rgw::BucketChangeObserver *observer = nullptr;
- const RGWZone* zone;
-- std::unique_ptr<RGWDataChangesBE> be;
-+ DataLogBackends bes;
-
- const int num_shards;
- std::string get_prefix() {
-@@ -213,16 +240,15 @@ class RGWDataChangesLog {
- bucket_filter = std::move(f);
- }
- // a marker that compares greater than any other
-- std::string_view max_marker() const;
-+ std::string max_marker() const;
- std::string get_oid(uint64_t gen_id, int shard_id) const;
- };
-
--class RGWDataChangesBE {
-+class RGWDataChangesBE : public boost::intrusive_ref_counter<RGWDataChangesBE> {
- protected:
- librados::IoCtx& ioctx;
- CephContext* const cct;
- RGWDataChangesLog& datalog;
-- uint64_t gen_id;
-
- std::string get_oid(int shard_id) {
- return datalog.get_oid(gen_id, shard_id);
-@@ -231,6 +257,8 @@ class RGWDataChangesBE {
- using entries = std::variant<std::list<cls_log_entry>,
- std::vector<ceph::buffer::list>>;
-
-+ const uint64_t gen_id;
-+
- RGWDataChangesBE(librados::IoCtx& ioctx,
- RGWDataChangesLog& datalog,
- uint64_t gen_id)
-diff --git a/src/rgw/rgw_log_backing.h b/src/rgw/rgw_log_backing.h
-index 242bf0e1c00a4..55a3139d11e2b 100644
---- a/src/rgw/rgw_log_backing.h
-+++ b/src/rgw/rgw_log_backing.h
-@@ -244,4 +244,13 @@ cursorgen(std::string_view cursor_) {
- return { *gen_id, cursor };
- }
-
-+inline std::pair<uint64_t, std::string_view>
-+cursorgeno(std::optional<std::string_view> cursor) {
-+ if (cursor) {
-+ return cursorgen(*cursor);
-+ } else {
-+ return { 0, ""s };
-+ }
-+}
-+
- #endif
-
-From 2f94c171859dd938ba02e57a243558b3bb4b219c Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Tue, 26 Jan 2021 01:27:24 -0500
-Subject: [PATCH 12/26] rgw: Clamp FIFO trim to head
-
-Don't try to trim a bunch of parts that don't exist.
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 60b729e32602b7401e15957cef976386281c4ccb)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/cls_fifo_legacy.cc | 72 ++++++++++++++++++++++++++--
- src/test/rgw/test_cls_fifo_legacy.cc | 51 ++++++++++++++++++++
- 2 files changed, 120 insertions(+), 3 deletions(-)
-
-diff --git a/src/rgw/cls_fifo_legacy.cc b/src/rgw/cls_fifo_legacy.cc
-index 3ddb2578d3541..45a3ad505146a 100644
---- a/src/rgw/cls_fifo_legacy.cc
-+++ b/src/rgw/cls_fifo_legacy.cc
-@@ -1701,6 +1701,7 @@ int FIFO::list(int max_entries,
-
- int FIFO::trim(std::string_view markstr, bool exclusive, optional_yield y)
- {
-+ bool overshoot = false;
- auto marker = to_marker(markstr);
- if (!marker) {
- return -EINVAL;
-@@ -1709,6 +1710,25 @@ int FIFO::trim(std::string_view markstr, bool exclusive, optional_yield y)
- auto ofs = marker->ofs;
- std::unique_lock l(m);
- auto tid = ++next_tid;
-+ auto hn = info.head_part_num;
-+ const auto max_part_size = info.params.max_part_size;
-+ if (part_num > hn) {
-+ l.unlock();
-+ auto r = read_meta(tid, y);
-+ if (r < 0) {
-+ return r;
-+ }
-+ l.lock();
-+ auto hn = info.head_part_num;
-+ if (part_num > hn) {
-+ overshoot = true;
-+ part_num = hn;
-+ ofs = max_part_size;
-+ }
-+ }
-+ if (part_num < info.tail_part_num) {
-+ return -ENODATA;
-+ }
- auto pn = info.tail_part_num;
- l.unlock();
- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-@@ -1719,7 +1739,6 @@ int FIFO::trim(std::string_view markstr, bool exclusive, optional_yield y)
- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
- << " pn=" << pn << " tid=" << tid << dendl;
- std::unique_lock l(m);
-- auto max_part_size = info.params.max_part_size;
- l.unlock();
- r = trim_part(pn, max_part_size, std::nullopt, false, tid, y);
- if (r < 0 && r == -ENOENT) {
-@@ -1771,7 +1790,7 @@ int FIFO::trim(std::string_view markstr, bool exclusive, optional_yield y)
- << " canceled too many times, giving up: tid=" << tid << dendl;
- return -EIO;
- }
-- return 0;
-+ return overshoot ? -ENODATA : 0;
- }
-
- struct Trimmer : public Completion<Trimmer> {
-@@ -1782,7 +1801,9 @@ struct Trimmer : public Completion<Trimmer> {
- bool exclusive;
- std::uint64_t tid;
- bool update = false;
-+ bool reread = false;
- bool canceled = false;
-+ bool overshoot = false;
- int retries = 0;
-
- Trimmer(FIFO* fifo, std::int64_t part_num, std::uint64_t ofs, std::int64_t pn,
-@@ -1794,6 +1815,45 @@ struct Trimmer : public Completion<Trimmer> {
- auto cct = fifo->cct;
- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
- << " entering: tid=" << tid << dendl;
-+
-+ if (reread) {
-+ reread = false;
-+ if (r < 0) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " read_meta failed: r="
-+ << r << " tid=" << tid << dendl;
-+ complete(std::move(p), r);
-+ return;
-+ }
-+ std::unique_lock l(fifo->m);
-+ auto hn = fifo->info.head_part_num;
-+ const auto max_part_size = fifo->info.params.max_part_size;
-+ const auto tail_part_num = fifo->info.tail_part_num;
-+ l.unlock();
-+ if (part_num > hn) {
-+ part_num = hn;
-+ ofs = max_part_size;
-+ overshoot = true;
-+ }
-+ if (part_num < tail_part_num) {
-+ complete(std::move(p), -ENODATA);
-+ return;
-+ }
-+ pn = tail_part_num;
-+ if (pn < part_num) {
-+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " pn=" << pn << " tid=" << tid << dendl;
-+ fifo->trim_part(pn++, max_part_size, std::nullopt,
-+ false, tid, call(std::move(p)));
-+ } else {
-+ update = true;
-+ canceled = tail_part_num < part_num;
-+ fifo->trim_part(part_num, ofs, std::nullopt, exclusive, tid,
-+ call(std::move(p)));
-+ }
-+ return;
-+ }
-+
- if (r == -ENOENT) {
- r = 0;
- }
-@@ -1850,7 +1910,7 @@ struct Trimmer : public Completion<Trimmer> {
- .tail_part_num(part_num), objv, &canceled,
- tid, call(std::move(p)));
- } else {
-- complete(std::move(p), 0);
-+ complete(std::move(p), overshoot ? -ENODATA : 0);
- }
- }
- };
-@@ -1860,6 +1920,7 @@ void FIFO::trim(std::string_view markstr, bool exclusive,
- auto marker = to_marker(markstr);
- auto realmark = marker.value_or(::rgw::cls::fifo::marker{});
- std::unique_lock l(m);
-+ const auto hn = info.head_part_num;
- const auto max_part_size = info.params.max_part_size;
- const auto pn = info.tail_part_num;
- const auto part_oid = info.part_oid(pn);
-@@ -1875,6 +1936,11 @@ void FIFO::trim(std::string_view markstr, bool exclusive,
- }
- ++trimmer->pn;
- auto ofs = marker->ofs;
-+ if (marker->num > hn) {
-+ trimmer->reread = true;
-+ read_meta(tid, Trimmer::call(std::move(trimmer)));
-+ return;
-+ }
- if (pn < marker->num) {
- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
- << " pn=" << pn << " tid=" << tid << dendl;
-diff --git a/src/test/rgw/test_cls_fifo_legacy.cc b/src/test/rgw/test_cls_fifo_legacy.cc
-index 69cee5a887405..26d9e9a9253e4 100644
---- a/src/test/rgw/test_cls_fifo_legacy.cc
-+++ b/src/test/rgw/test_cls_fifo_legacy.cc
-@@ -1125,3 +1125,54 @@ TEST_F(AioLegacyFIFO, TestPushBatch)
- auto& info = f->meta();
- ASSERT_EQ(info.head_part_num, 4);
- }
-+
-+TEST_F(LegacyFIFO, TrimAll)
-+{
-+ std::unique_ptr<RCf::FIFO> f;
-+ auto r = RCf::FIFO::create(ioctx, fifo_id, &f, null_yield);
-+ ASSERT_EQ(0, r);
-+ static constexpr auto max_entries = 10u;
-+ for (uint32_t i = 0; i < max_entries; ++i) {
-+ cb::list bl;
-+ encode(i, bl);
-+ r = f->push(bl, null_yield);
-+ ASSERT_EQ(0, r);
-+ }
-+
-+ /* trim one entry */
-+ r = f->trim(RCf::marker::max().to_string(), false, null_yield);
-+ ASSERT_EQ(-ENODATA, r);
-+
-+ std::vector<RCf::list_entry> result;
-+ bool more;
-+ r = f->list(1, std::nullopt, &result, &more, null_yield);
-+ ASSERT_EQ(0, r);
-+ ASSERT_TRUE(result.empty());
-+}
-+
-+TEST_F(LegacyFIFO, AioTrimAll)
-+{
-+ std::unique_ptr<RCf::FIFO> f;
-+ auto r = RCf::FIFO::create(ioctx, fifo_id, &f, null_yield);
-+ ASSERT_EQ(0, r);
-+ static constexpr auto max_entries = 10u;
-+ for (uint32_t i = 0; i < max_entries; ++i) {
-+ cb::list bl;
-+ encode(i, bl);
-+ r = f->push(bl, null_yield);
-+ ASSERT_EQ(0, r);
-+ }
-+
-+ auto c = R::Rados::aio_create_completion();
-+ f->trim(RCf::marker::max().to_string(), false, c);
-+ c->wait_for_complete();
-+ r = c->get_return_value();
-+ c->release();
-+ ASSERT_EQ(-ENODATA, r);
-+
-+ std::vector<RCf::list_entry> result;
-+ bool more;
-+ r = f->list(1, std::nullopt, &result, &more, null_yield);
-+ ASSERT_EQ(0, r);
-+ ASSERT_TRUE(result.empty());
-+}
-
-From d91df95e800f86d95ece8a0d3c84a260a009a1b9 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Tue, 26 Jan 2021 20:07:45 -0500
-Subject: [PATCH 13/26] rgw: Actually pull logbacking_generations into datalog
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit eb0f8ffcc785146a1fb249f4531620787be216ba)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_datalog.cc | 131 +++++++++++++++++++++++++++-----------
- src/rgw/rgw_datalog.h | 26 +++++++-
- src/rgw/rgw_log_backing.h | 2 +
- 3 files changed, 119 insertions(+), 40 deletions(-)
-
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index 2b04d530d1c6f..c64b22d518a9f 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -178,8 +178,8 @@ class RGWDataChangesOmap final : public RGWDataChangesBE {
- lr::ObjectWriteOperation op;
- cls_log_trim(op, {}, {}, {}, std::string(marker));
- auto r = rgw_rados_operate(ioctx, oids[index], &op, null_yield);
-- if (r == -ENOENT) r = 0;
-- if (r < 0) {
-+ if (r == -ENOENT) r = -ENODATA;
-+ if (r < 0 && r != -ENODATA) {
- lderr(cct) << __PRETTY_FUNCTION__
- << ": failed to get info from " << oids[index]
- << cpp_strerror(-r) << dendl;
-@@ -191,7 +191,7 @@ class RGWDataChangesOmap final : public RGWDataChangesBE {
- lr::ObjectWriteOperation op;
- cls_log_trim(op, {}, {}, {}, std::string(marker));
- auto r = ioctx.aio_operate(oids[index], c, &op, 0);
-- if (r == -ENOENT) r = 0;
-+ if (r == -ENOENT) r = -ENODATA;
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
- << ": failed to get info from " << oids[index]
-@@ -333,7 +333,7 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- librados::AioCompletion* c) override {
- int r = 0;
- if (marker == rgw::cls::fifo::marker(0, 0).to_string()) {
-- rgw_complete_aio_completion(c, 0);
-+ rgw_complete_aio_completion(c, -ENODATA);
- } else {
- fifos[index]->trim(marker, false, c);
- }
-@@ -352,6 +352,65 @@ RGWDataChangesLog::RGWDataChangesLog(CephContext* cct)
- prefix(get_prefix()),
- changes(cct->_conf->rgw_data_log_changes_size) {}
-
-+bs::error_code DataLogBackends::handle_init(entries_t e) noexcept {
-+ std::unique_lock l(m);
-+
-+ for (const auto& [gen_id, gen] : e) {
-+ if (gen.empty) {
-+ lderr(datalog.cct)
-+ << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": ERROR: given empty generation: gen_id=" << gen_id << dendl;
-+ }
-+ if (count(gen_id) != 0) {
-+ lderr(datalog.cct)
-+ << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": ERROR: generation already exists: gen_id=" << gen_id << dendl;
-+ }
-+ try {
-+ switch (gen.type) {
-+ case log_type::omap:
-+ emplace(gen_id, new RGWDataChangesOmap(ioctx, datalog, gen_id, shards));
-+ break;
-+ case log_type::fifo:
-+ emplace(gen_id, new RGWDataChangesFIFO(ioctx, datalog, gen_id, shards));
-+ break;
-+ default:
-+ lderr(datalog.cct)
-+ << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": IMPOSSIBLE: invalid log type: gen_id=" << gen_id
-+ << ", type" << gen.type << dendl;
-+ return bs::error_code(EFAULT, bs::system_category());
-+ }
-+ } catch (const bs::system_error& err) {
-+ lderr(datalog.cct)
-+ << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": error setting up backend: gen_id=" << gen_id
-+ << ", err=" << err.what() << dendl;
-+ return err.code();
-+ }
-+ }
-+ return {};
-+}
-+bs::error_code DataLogBackends::handle_new_gens(entries_t e) noexcept {
-+ return handle_init(std::move(e));
-+}
-+bs::error_code DataLogBackends::handle_empty_to(uint64_t new_tail) noexcept {
-+ std::unique_lock l(m);
-+ auto i = cbegin();
-+ if (i->first < new_tail) {
-+ return {};
-+ }
-+ if (new_tail >= (cend() - 1)->first) {
-+ lderr(datalog.cct)
-+ << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": ERROR: attempt to trim head: new_tail=" << new_tail << dendl;
-+ return bs::error_code(EFAULT, bs::system_category());
-+ }
-+ erase(i, upper_bound(new_tail));
-+ return {};
-+}
-+
-+
- int RGWDataChangesLog::start(const RGWZone* _zone,
- const RGWZoneParams& zoneparams,
- librados::Rados* lr)
-@@ -371,31 +430,21 @@ int RGWDataChangesLog::start(const RGWZone* _zone,
- return -r;
- }
-
-- auto found = log_backing_type(ioctx, *defbacking, num_shards,
-- [this](int i) { return get_oid(0, i); },
-- null_yield);
-+ auto besr = logback_generations::init<DataLogBackends>(
-+ ioctx, metadata_log_oid(), [this](uint64_t gen_id, int shard) {
-+ return get_oid(gen_id, shard);
-+ },
-+ num_shards, *defbacking, null_yield, *this);
-
-- if (!found) {
-- lderr(cct) << __PRETTY_FUNCTION__
-- << ": Error when checking log type: "
-- << found.error().message() << dendl;
-- }
-- try {
-- switch (*found) {
-- case log_type::omap:
-- bes.set_zero(new RGWDataChangesOmap(ioctx, *this, 0, num_shards));
-- break;
-- case log_type::fifo:
-- bes.set_zero(new RGWDataChangesFIFO(ioctx, *this, 0, num_shards));
-- break;
-- }
-- } catch (bs::system_error& e) {
-+
-+ if (!besr) {
- lderr(cct) << __PRETTY_FUNCTION__
-- << ": Error when starting backend: "
-- << e.what() << dendl;
-- return ceph::from_error_code(e.code());
-+ << ": Error initializing backends: "
-+ << besr.error().message() << dendl;
-+ return ceph::from_error_code(besr.error());
- }
-
-+ bes = std::move(*besr);
- renew_thread = make_named_thread("rgw_dt_lg_renew",
- &RGWDataChangesLog::renew_run, this);
- return 0;
-@@ -425,7 +474,7 @@ int RGWDataChangesLog::renew_entries()
- l.unlock();
-
- auto ut = real_clock::now();
-- auto be = bes.head();
-+ auto be = bes->head();
- for (const auto& bs : entries) {
- auto index = choose_oid(bs);
-
-@@ -592,7 +641,7 @@ int RGWDataChangesLog::add_entry(const RGWBucketInfo& bucket_info, int shard_id)
-
- ldout(cct, 20) << "RGWDataChangesLog::add_entry() sending update with now=" << now << " cur_expiration=" << expiration << dendl;
-
-- auto be = bes.head();
-+ auto be = bes->head();
- ret = be->push(index, now, change.key, std::move(bl));
-
- now = real_clock::now();
-@@ -634,7 +683,9 @@ int DataLogBackends::list(int shard, int max_entries,
- if (r < 0)
- return r;
-
-- *out_marker = gencursor(gen_id, out_cursor);
-+ if (out_marker && !out_cursor.empty()) {
-+ *out_marker = gencursor(gen_id, out_cursor);
-+ }
- for (auto& g : gentries) {
- g.log_id = gencursor(gen_id, g.log_id);
- }
-@@ -653,7 +704,7 @@ int RGWDataChangesLog::list_entries(int shard, int max_entries,
- std::string* out_marker, bool* truncated)
- {
- assert(shard < num_shards);
-- return bes.list(shard, max_entries, entries, marker, out_marker, truncated);
-+ return bes->list(shard, max_entries, entries, marker, out_marker, truncated);
- }
-
- int RGWDataChangesLog::list_entries(int max_entries,
-@@ -684,8 +735,12 @@ int RGWDataChangesLog::list_entries(int max_entries,
- int RGWDataChangesLog::get_info(int shard_id, RGWDataChangesLogInfo *info)
- {
- assert(shard_id < num_shards);
-- auto be = bes.head();
-- return be->get_info(shard_id, info);
-+ auto be = bes->head();
-+ auto r = be->get_info(shard_id, info);
-+ if (!info->marker.empty()) {
-+ info->marker = gencursor(be->gen_id, info->marker);
-+ }
-+ return r;
- }
-
- int DataLogBackends::trim_entries(int shard_id, std::string_view marker)
-@@ -696,13 +751,13 @@ int DataLogBackends::trim_entries(int shard_id, std::string_view marker)
- const auto tail_gen = begin()->first;
- if (target_gen < tail_gen) return 0;
- auto r = 0;
-- for (auto i = lower_bound(0);
-- i != end() && i->first <= target_gen && i->first <= head_gen && r >= 0;
-- i = upper_bound(i->first)) {
-- auto be = i->second;
-+ for (auto be = lower_bound(0)->second;
-+ be->gen_id <= target_gen && be->gen_id <= head_gen && r >= 0;
-+ be = upper_bound(be->gen_id)->second) {
- l.unlock();
- auto c = be->gen_id == target_gen ? cursor : be->max_marker();
- r = be->trim(shard_id, c);
-+ if (r == -ENODATA && be->gen_id < target_gen) r = 0;
- l.lock();
- };
- return r;
-@@ -711,7 +766,7 @@ int DataLogBackends::trim_entries(int shard_id, std::string_view marker)
- int RGWDataChangesLog::trim_entries(int shard_id, std::string_view marker)
- {
- assert(shard_id < num_shards);
-- return bes.trim_entries(shard_id, marker);
-+ return bes->trim_entries(shard_id, marker);
- }
-
- class GenTrim : public rgw::cls::fifo::Completion<GenTrim> {
-@@ -735,6 +790,8 @@ class GenTrim : public rgw::cls::fifo::Completion<GenTrim> {
- void handle(Ptr&& p, int r) {
- auto gen_id = be->gen_id;
- be.reset();
-+ if (r == -ENOENT) r = -ENODATA;
-+ if (r == -ENODATA && gen_id < target_gen) r = 0;
- if (r < 0) {
- complete(std::move(p), r);
- return;
-@@ -781,7 +838,7 @@ int RGWDataChangesLog::trim_entries(int shard_id, std::string_view marker,
- librados::AioCompletion* c)
- {
- assert(shard_id < num_shards);
-- bes.trim_entries(shard_id, marker, c);
-+ bes->trim_entries(shard_id, marker, c);
- return 0;
- }
-
-diff --git a/src/rgw/rgw_datalog.h b/src/rgw/rgw_datalog.h
-index 0915bebde11cf..e9a768d546c00 100644
---- a/src/rgw/rgw_datalog.h
-+++ b/src/rgw/rgw_datalog.h
-@@ -36,6 +36,7 @@
- #include "cls/log/cls_log_types.h"
-
- #include "rgw_basic_types.h"
-+#include "rgw_log_backing.h"
- #include "rgw_sync_policy.h"
- #include "rgw_zone.h"
- #include "rgw_trim_bilog.h"
-@@ -121,11 +122,22 @@ class RGWDataChangesLog;
-
- class RGWDataChangesBE;
-
--class DataLogBackends
-- : private bc::flat_map<uint64_t, boost::intrusive_ptr<RGWDataChangesBE>> {
-+class DataLogBackends final
-+ : public logback_generations,
-+ private bc::flat_map<uint64_t, boost::intrusive_ptr<RGWDataChangesBE>> {
-+ friend class logback_generations;
- friend class GenTrim;
-
- std::mutex m;
-+ RGWDataChangesLog& datalog;
-+
-+ DataLogBackends(librados::IoCtx& ioctx,
-+ std::string oid,
-+ fu2::unique_function<std::string(
-+ uint64_t, int) const>&& get_oid,
-+ int shards, RGWDataChangesLog& datalog) noexcept
-+ : logback_generations(ioctx, oid, std::move(get_oid),
-+ shards), datalog(datalog) {}
- public:
-
- boost::intrusive_ptr<RGWDataChangesBE> head() {
-@@ -144,20 +156,28 @@ class DataLogBackends
- void set_zero(RGWDataChangesBE* be) {
- emplace(0, be);
- }
-+
-+ bs::error_code handle_init(entries_t e) noexcept override;
-+ bs::error_code handle_new_gens(entries_t e) noexcept override;
-+ bs::error_code handle_empty_to(uint64_t new_tail) noexcept override;
- };
-
- class RGWDataChangesLog {
-+ friend DataLogBackends;
- CephContext *cct;
- librados::IoCtx ioctx;
- rgw::BucketChangeObserver *observer = nullptr;
- const RGWZone* zone;
-- DataLogBackends bes;
-+ std::unique_ptr<DataLogBackends> bes;
-
- const int num_shards;
- std::string get_prefix() {
- auto prefix = cct->_conf->rgw_data_log_obj_prefix;
- return prefix.empty() ? prefix : "data_log"s;
- }
-+ std::string metadata_log_oid() {
-+ return get_prefix() + "generations_metadata"s;
-+ }
- std::string prefix;
-
- ceph::mutex lock = ceph::make_mutex("RGWDataChangesLog::lock");
-diff --git a/src/rgw/rgw_log_backing.h b/src/rgw/rgw_log_backing.h
-index 55a3139d11e2b..ef2583c35b204 100644
---- a/src/rgw/rgw_log_backing.h
-+++ b/src/rgw/rgw_log_backing.h
-@@ -135,6 +135,8 @@ class logback_generations : public librados::WatchCtx2 {
- protected:
- const int shards;
-
-+private:
-+
- uint64_t watchcookie = 0;
-
- obj_version version;
-
-From f1e2564d952c9300dedcf017c3cf869ef6bf8ec8 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Fri, 22 Jan 2021 20:48:39 -0500
-Subject: [PATCH 14/26] rgw: Add and trim datalog generations
-
-This lets us actually change type in mid-stream.
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 32b100d797cdf88648530e0162fd103cf279df31)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_admin.cc | 53 +++++++++++++++
- src/rgw/rgw_datalog.cc | 103 ++++++++++++++++++++++++++++--
- src/rgw/rgw_datalog.h | 8 +++
- src/test/cli/radosgw-admin/help.t | 1 +
- 4 files changed, 158 insertions(+), 7 deletions(-)
-
-diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc
-index f0da7b9573a1c..33c8eae5725be 100644
---- a/src/rgw/rgw_admin.cc
-+++ b/src/rgw/rgw_admin.cc
-@@ -244,6 +244,7 @@ void usage()
- cout << " datalog list list data log\n";
- cout << " datalog trim trim data log\n";
- cout << " datalog status read data log status\n";
-+ cout << " datalog type change datalog type to --log_type={fifo,omap}\n";
- cout << " orphans find deprecated -- init and run search for leaked rados objects (use job-id, pool)\n";
- cout << " orphans finish deprecated -- clean up search for leaked rados objects\n";
- cout << " orphans list-jobs deprecated -- list the current job-ids for orphans search\n";
-@@ -720,6 +721,8 @@ enum class OPT {
- DATALOG_STATUS,
- DATALOG_AUTOTRIM,
- DATALOG_TRIM,
-+ DATALOG_TYPE,
-+ DATALOG_PRUNE,
- REALM_CREATE,
- REALM_DELETE,
- REALM_GET,
-@@ -930,6 +933,8 @@ static SimpleCmd::Commands all_cmds = {
- { "datalog status", OPT::DATALOG_STATUS },
- { "datalog autotrim", OPT::DATALOG_AUTOTRIM },
- { "datalog trim", OPT::DATALOG_TRIM },
-+ { "datalog type", OPT::DATALOG_TYPE },
-+ { "datalog prune", OPT::DATALOG_PRUNE },
- { "realm create", OPT::REALM_CREATE },
- { "realm delete", OPT::REALM_DELETE },
- { "realm get", OPT::REALM_GET },
-@@ -1020,6 +1025,15 @@ BIIndexType get_bi_index_type(const string& type_str) {
- return BIIndexType::Invalid;
- }
-
-+log_type get_log_type(const string& type_str) {
-+ if (strcasecmp(type_str.c_str(), "fifo") == 0)
-+ return log_type::fifo;
-+ if (strcasecmp(type_str.c_str(), "omap") == 0)
-+ return log_type::omap;
-+
-+ return static_cast<log_type>(0xff);
-+}
-+
- void dump_bi_entry(bufferlist& bl, BIIndexType index_type, Formatter *formatter)
- {
- auto iter = bl.cbegin();
-@@ -3145,6 +3159,7 @@ int main(int argc, const char **argv)
- uint64_t min_rewrite_stripe_size = 0;
-
- BIIndexType bi_index_type = BIIndexType::Plain;
-+ std::optional<log_type> opt_log_type;
-
- string job_id;
- int num_shards = 0;
-@@ -3467,6 +3482,14 @@ int main(int argc, const char **argv)
- cerr << "ERROR: invalid bucket index entry type" << std::endl;
- return EINVAL;
- }
-+ } else if (ceph_argparse_witharg(args, i, &val, "--log-type", (char*)NULL)) {
-+ string log_type_str = val;
-+ auto l = get_log_type(log_type_str);
-+ if (l == static_cast<log_type>(0xff)) {
-+ cerr << "ERROR: invalid log type" << std::endl;
-+ return EINVAL;
-+ }
-+ opt_log_type = l;
- } else if (ceph_argparse_binary_flag(args, i, &is_master_int, NULL, "--master", (char*)NULL)) {
- is_master = (bool)is_master_int;
- is_master_set = true;
-@@ -8850,6 +8873,36 @@ int main(int argc, const char **argv)
- }
- }
-
-+ if (opt_cmd == OPT::DATALOG_TYPE) {
-+ if (!opt_log_type) {
-+ std::cerr << "log-type not specified." << std::endl;
-+ return -EINVAL;
-+ }
-+ auto datalog = static_cast<rgw::sal::RGWRadosStore*>(store)->svc()->datalog_rados;
-+ ret = datalog->change_format(*opt_log_type, null_yield);
-+ if (ret < 0) {
-+ cerr << "ERROR: change_format(): " << cpp_strerror(-ret) << std::endl;
-+ return -ret;
-+ }
-+ }
-+
-+ if (opt_cmd == OPT::DATALOG_PRUNE) {
-+ auto datalog = static_cast<rgw::sal::RGWRadosStore*>(store)->svc()->datalog_rados;
-+ std::optional<uint64_t> through;
-+ ret = datalog->trim_generations(through);
-+
-+ if (ret < 0) {
-+ cerr << "ERROR: trim_generations(): " << cpp_strerror(-ret) << std::endl;
-+ return -ret;
-+ }
-+
-+ if (through) {
-+ std::cout << "Pruned " << *through << " empty generations." << std::endl;
-+ } else {
-+ std::cout << "No empty generations." << std::endl;
-+ }
-+ }
-+
- bool quota_op = (opt_cmd == OPT::QUOTA_SET || opt_cmd == OPT::QUOTA_ENABLE || opt_cmd == OPT::QUOTA_DISABLE);
-
- if (quota_op) {
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index c64b22d518a9f..6182ae91909e4 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -202,6 +202,29 @@ class RGWDataChangesOmap final : public RGWDataChangesBE {
- std::string_view max_marker() const override {
- return "99999999"sv;
- }
-+ int is_empty() override {
-+ for (auto shard = 0u; shard < oids.size(); ++shard) {
-+ std::list<cls_log_entry> log_entries;
-+ lr::ObjectReadOperation op;
-+ std::string out_marker;
-+ bool truncated;
-+ cls_log_list(op, {}, {}, {}, 1, log_entries, &out_marker, &truncated);
-+ auto r = rgw_rados_operate(ioctx, oids[shard], &op, nullptr, null_yield);
-+ if (r == -ENOENT) {
-+ continue;
-+ }
-+ if (r < 0) {
-+ lderr(cct) << __PRETTY_FUNCTION__
-+ << ": failed to list " << oids[shard]
-+ << cpp_strerror(-r) << dendl;
-+ return r;
-+ }
-+ if (!log_entries.empty()) {
-+ return 0;
-+ }
-+ }
-+ return 1;
-+ }
- };
-
- class RGWDataChangesFIFO final : public RGWDataChangesBE {
-@@ -344,6 +367,24 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- rgw::cls::fifo::marker::max().to_string();
- return std::string_view(mm);
- }
-+ int is_empty() override {
-+ std::vector<rgw::cls::fifo::list_entry> log_entries;
-+ bool more = false;
-+ for (auto shard = 0u; shard < fifos.size(); ++shard) {
-+ auto r = fifos[shard]->list(1, {}, &log_entries, &more,
-+ null_yield);
-+ if (r < 0) {
-+ lderr(cct) << __PRETTY_FUNCTION__
-+ << ": unable to list FIFO: " << get_oid(shard)
-+ << ": " << cpp_strerror(-r) << dendl;
-+ return r;
-+ }
-+ if (!log_entries.empty()) {
-+ return 0;
-+ }
-+ }
-+ return 1;
-+ }
- };
-
- RGWDataChangesLog::RGWDataChangesLog(CephContext* cct)
-@@ -781,7 +822,7 @@ class GenTrim : public rgw::cls::fifo::Completion<GenTrim> {
-
- GenTrim(DataLogBackends* bes, int shard_id, uint64_t target_gen, std::string cursor,
- uint64_t head_gen, uint64_t tail_gen,
-- boost::intrusive_ptr<RGWDataChangesBE>&& be,
-+ boost::intrusive_ptr<RGWDataChangesBE> be,
- lr::AioCompletion* super)
- : Completion(super), bes(bes), shard_id(shard_id), target_gen(target_gen),
- cursor(std::move(cursor)), head_gen(head_gen), tail_gen(tail_gen),
-@@ -792,6 +833,7 @@ class GenTrim : public rgw::cls::fifo::Completion<GenTrim> {
- be.reset();
- if (r == -ENOENT) r = -ENODATA;
- if (r == -ENODATA && gen_id < target_gen) r = 0;
-+ r = 0;
- if (r < 0) {
- complete(std::move(p), r);
- return;
-@@ -808,7 +850,7 @@ class GenTrim : public rgw::cls::fifo::Completion<GenTrim> {
- be = i->second;
- }
- auto c = be->gen_id == target_gen ? cursor : be->max_marker();
-- r = be->trim(shard_id, c, call(std::move(p)));
-+ be->trim(shard_id, c, call(std::move(p)));
- }
- };
-
-@@ -821,19 +863,58 @@ void DataLogBackends::trim_entries(int shard_id, std::string_view marker,
- const auto tail_gen = begin()->first;
- if (target_gen < tail_gen) {
- l.unlock();
-- rgw_complete_aio_completion(c, 0);
-+ rgw_complete_aio_completion(c, -ENODATA);
- return;
- }
-- auto be = lower_bound(0)->second;
-+ auto be = begin()->second;
- l.unlock();
-- auto p = be.get();
- auto gt = std::make_unique<GenTrim>(this, shard_id, target_gen,
- std::string(cursor), head_gen, tail_gen,
-- std::move(be), c);
-+ be, c);
-+
-+ auto cc = be->gen_id == target_gen ? cursor : be->max_marker();
-+ be->trim(shard_id, cc, GenTrim::call(std::move(gt)));
-+}
-+
-+int DataLogBackends::trim_generations(std::optional<uint64_t>& through) {
-+ if (size() == 1) {
-+ return 0;
-+ }
-
-- p->trim(shard_id, cursor, GenTrim::call(std::move(gt)));
-+ std::vector<mapped_type> candidates;
-+ {
-+ std::scoped_lock l(m);
-+ auto e = cend() - 1;
-+ for (auto i = cbegin(); i < e; ++i) {
-+ candidates.push_back(i->second);
-+ }
-+ }
-+
-+ std::optional<uint64_t> highest;
-+ for (auto& be : candidates) {
-+ auto r = be->is_empty();
-+ if (r < 0) {
-+ return r;
-+ } else if (r == 1) {
-+ highest = be->gen_id;
-+ } else {
-+ break;
-+ }
-+ }
-+
-+ through = highest;
-+ if (!highest) {
-+ return 0;
-+ }
-+ auto ec = empty_to(*highest, null_yield);
-+ if (ec) {
-+ return ceph::from_error_code(ec);
-+ }
-+
-+ return ceph::from_error_code(remove_empty(null_yield));
- }
-
-+
- int RGWDataChangesLog::trim_entries(int shard_id, std::string_view marker,
- librados::AioCompletion* c)
- {
-@@ -897,3 +978,11 @@ std::string RGWDataChangesLog::max_marker() const {
- return gencursor(std::numeric_limits<uint64_t>::max(),
- "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
- }
-+
-+int RGWDataChangesLog::change_format(log_type type, optional_yield y) {
-+ return ceph::from_error_code(bes->new_backing(type, y));
-+}
-+
-+int RGWDataChangesLog::trim_generations(std::optional<uint64_t>& through) {
-+ return bes->trim_generations(through);
-+}
-diff --git a/src/rgw/rgw_datalog.h b/src/rgw/rgw_datalog.h
-index e9a768d546c00..5886d51dac174 100644
---- a/src/rgw/rgw_datalog.h
-+++ b/src/rgw/rgw_datalog.h
-@@ -160,6 +160,8 @@ class DataLogBackends final
- bs::error_code handle_init(entries_t e) noexcept override;
- bs::error_code handle_new_gens(entries_t e) noexcept override;
- bs::error_code handle_empty_to(uint64_t new_tail) noexcept override;
-+
-+ int trim_generations(std::optional<uint64_t>& through);
- };
-
- class RGWDataChangesLog {
-@@ -262,6 +264,10 @@ class RGWDataChangesLog {
- // a marker that compares greater than any other
- std::string max_marker() const;
- std::string get_oid(uint64_t gen_id, int shard_id) const;
-+
-+
-+ int change_format(log_type type, optional_yield y);
-+ int trim_generations(std::optional<uint64_t>& through);
- };
-
- class RGWDataChangesBE : public boost::intrusive_ref_counter<RGWDataChangesBE> {
-@@ -303,6 +309,8 @@ class RGWDataChangesBE : public boost::intrusive_ref_counter<RGWDataChangesBE> {
- virtual int trim(int index, std::string_view marker,
- librados::AioCompletion* c) = 0;
- virtual std::string_view max_marker() const = 0;
-+ // 1 on empty, 0 on non-empty, negative on error.
-+ virtual int is_empty() = 0;
- };
-
-
-diff --git a/src/test/cli/radosgw-admin/help.t b/src/test/cli/radosgw-admin/help.t
-index 490499f24a029..c63c63cb55e2c 100644
---- a/src/test/cli/radosgw-admin/help.t
-+++ b/src/test/cli/radosgw-admin/help.t
-@@ -138,6 +138,7 @@
- datalog list list data log
- datalog trim trim data log
- datalog status read data log status
-+ datalog type change datalog type to --log_type={fifo,omap}
- orphans find deprecated -- init and run search for leaked rados objects (use job-id, pool)
- orphans finish deprecated -- clean up search for leaked rados objects
- orphans list-jobs deprecated -- list the current job-ids for orphans search
-
-From 176b7f12bc45f17c610bcbec29d58078b32592b9 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Tue, 26 Jan 2021 12:24:41 -0500
-Subject: [PATCH 15/26] cls/fifo: Don't error in the log if we're being probed
- for existence
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 4a2575783a050f27b22b7bfe4364520bf29fc6a5)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/cls/fifo/cls_fifo.cc | 10 +++++++---
- 1 file changed, 7 insertions(+), 3 deletions(-)
-
-diff --git a/src/cls/fifo/cls_fifo.cc b/src/cls/fifo/cls_fifo.cc
-index db936078e8c3d..fc89a20e6b2bf 100644
---- a/src/cls/fifo/cls_fifo.cc
-+++ b/src/cls/fifo/cls_fifo.cc
-@@ -162,7 +162,7 @@ int write_part_header(cls_method_context_t hctx,
-
- int read_header(cls_method_context_t hctx,
- std::optional<objv> objv,
-- info* info)
-+ info* info, bool get_info = false)
- {
- std::uint64_t size;
-
-@@ -180,7 +180,11 @@ int read_header(cls_method_context_t hctx,
- }
-
- if (r == 0) {
-- CLS_ERR("ERROR: %s: Zero length object, returning ENODATA", __PRETTY_FUNCTION__);
-+ if (get_info) {
-+ CLS_LOG(5, "%s: Zero length object, likely probe, returning ENODATA", __PRETTY_FUNCTION__);
-+ } else {
-+ CLS_ERR("ERROR: %s: Zero length object, returning ENODATA", __PRETTY_FUNCTION__);
-+ }
- return -ENODATA;
- }
-
-@@ -366,7 +370,7 @@ int get_meta(cls_method_context_t hctx, ceph::buffer::list* in,
- }
-
- op::get_meta_reply reply;
-- int r = read_header(hctx, op.version, &reply.info);
-+ int r = read_header(hctx, op.version, &reply.info, true);
- if (r < 0) {
- return r;
- }
-
-From f70374f71fe4e715f6221d34aee268ed601b17b8 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Sat, 21 Nov 2020 19:34:07 -0500
-Subject: [PATCH 16/26] rgw: Add LazyFIFO to keep from blasting an op-per-shard
- on startup
-
-LazyFIFO opens the FIFO on first access.
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 1cc4a0a4e274700b4ae044db125a8cb3a64253a2)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_log_backing.h | 135 ++++++++++++++++++++++++++++++++++++++
- 1 file changed, 135 insertions(+)
-
-diff --git a/src/rgw/rgw_log_backing.h b/src/rgw/rgw_log_backing.h
-index ef2583c35b204..cd677764c5795 100644
---- a/src/rgw/rgw_log_backing.h
-+++ b/src/rgw/rgw_log_backing.h
-@@ -32,6 +32,8 @@
- namespace bc = boost::container;
- namespace bs = boost::system;
-
-+#include "cls_fifo_legacy.h"
-+
- /// Type of log backing, stored in the mark used in the quick check,
- /// and passed to checking functions.
- enum class log_type {
-@@ -255,4 +257,137 @@ cursorgeno(std::optional<std::string_view> cursor) {
- }
- }
-
-+class LazyFIFO {
-+ librados::IoCtx& ioctx;
-+ std::string oid;
-+ std::mutex m;
-+ std::unique_ptr<rgw::cls::fifo::FIFO> fifo;
-+
-+ int lazy_init(optional_yield y) {
-+ std::unique_lock l(m);
-+ if (fifo) return 0;
-+ auto r = rgw::cls::fifo::FIFO::create(ioctx, oid, &fifo, y);
-+ if (r) {
-+ fifo.reset();
-+ }
-+ return r;
-+ }
-+
-+public:
-+
-+ LazyFIFO(librados::IoCtx& ioctx, std::string oid)
-+ : ioctx(ioctx), oid(std::move(oid)) {}
-+
-+ int read_meta(optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ return fifo->read_meta(y);
-+ }
-+
-+ int meta(rados::cls::fifo::info& info, optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ info = fifo->meta();
-+ return 0;
-+ }
-+
-+ int get_part_layout_info(std::uint32_t& part_header_size,
-+ std::uint32_t& part_entry_overhead,
-+ optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ std::tie(part_header_size, part_entry_overhead)
-+ = fifo->get_part_layout_info();
-+ return 0;
-+ }
-+
-+ int push(const ceph::buffer::list& bl,
-+ optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ return fifo->push(bl, y);
-+ }
-+
-+ int push(ceph::buffer::list& bl,
-+ librados::AioCompletion* c,
-+ optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ fifo->push(bl, c);
-+ return 0;
-+ }
-+
-+ int push(const std::vector<ceph::buffer::list>& data_bufs,
-+ optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ return fifo->push(data_bufs, y);
-+ }
-+
-+ int push(const std::vector<ceph::buffer::list>& data_bufs,
-+ librados::AioCompletion* c,
-+ optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ fifo->push(data_bufs, c);
-+ return 0;
-+ }
-+
-+ int list(int max_entries, std::optional<std::string_view> markstr,
-+ std::vector<rgw::cls::fifo::list_entry>* out,
-+ bool* more, optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ return fifo->list(max_entries, markstr, out, more, y);
-+ }
-+
-+ int list(int max_entries, std::optional<std::string_view> markstr,
-+ std::vector<rgw::cls::fifo::list_entry>* out, bool* more,
-+ librados::AioCompletion* c, optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ fifo->list(max_entries, markstr, out, more, c);
-+ return 0;
-+ }
-+
-+ int trim(std::string_view markstr, bool exclusive, optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ return fifo->trim(markstr, exclusive, y);
-+ }
-+
-+ int trim(std::string_view markstr, bool exclusive, librados::AioCompletion* c,
-+ optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ fifo->trim(markstr, exclusive, c);
-+ return 0;
-+ }
-+
-+ int get_part_info(int64_t part_num, rados::cls::fifo::part_header* header,
-+ optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ return fifo->get_part_info(part_num, header, y);
-+ }
-+
-+ int get_part_info(int64_t part_num, rados::cls::fifo::part_header* header,
-+ librados::AioCompletion* c, optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ fifo->get_part_info(part_num, header, c);
-+ return 0;
-+ }
-+
-+ int get_head_info(fu2::unique_function<
-+ void(int r, rados::cls::fifo::part_header&&)>&& f,
-+ librados::AioCompletion* c,
-+ optional_yield y) {
-+ auto r = lazy_init(y);
-+ if (r < 0) return r;
-+ fifo->get_head_info(std::move(f), c);
-+ return 0;
-+ }
-+};
-+
- #endif
-
-From ce249836e01aacd8024584be666455c299d38172 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Sat, 21 Nov 2020 23:06:38 -0500
-Subject: [PATCH 17/26] rgw: Use LazyFIFO in data changes log
-
-That way we don't start sending ops to open a FIFO until we need it.
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 12939a258f8c627d1b7b23c0b9d7c22e98e69d89)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_datalog.cc | 47 ++++++++++++++++++------------------------
- 1 file changed, 20 insertions(+), 27 deletions(-)
-
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index 6182ae91909e4..3ecab432646c1 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -4,6 +4,7 @@
- #include <vector>
-
- #include "common/debug.h"
-+#include "common/containers.h"
- #include "common/errno.h"
- #include "common/error_code.h"
-
-@@ -24,6 +25,8 @@ static constexpr auto dout_subsys = ceph_subsys_rgw;
- namespace bs = boost::system;
- namespace lr = librados;
-
-+using ceph::containers::tiny_vector;
-+
- void rgw_data_change::dump(ceph::Formatter *f) const
- {
- std::string type;
-@@ -229,27 +232,16 @@ class RGWDataChangesOmap final : public RGWDataChangesBE {
-
- class RGWDataChangesFIFO final : public RGWDataChangesBE {
- using centries = std::vector<ceph::buffer::list>;
-- std::vector<std::unique_ptr<rgw::cls::fifo::FIFO>> fifos;
-+ tiny_vector<LazyFIFO> fifos;
-
- public:
- RGWDataChangesFIFO(lr::IoCtx& ioctx,
- RGWDataChangesLog& datalog,
- uint64_t gen_id, int shards)
-- : RGWDataChangesBE(ioctx, datalog, gen_id) {
-- fifos.resize(shards);
-- for (auto i = 0; i < shards; ++i) {
-- auto r = rgw::cls::fifo::FIFO::create(ioctx, get_oid(i),
-- &fifos[i], null_yield);
-- if (r < 0) {
-- throw bs::system_error(ceph::to_error_code(r));
-- }
-- }
-- ceph_assert(fifos.size() == unsigned(shards));
-- ceph_assert(std::none_of(fifos.cbegin(), fifos.cend(),
-- [](const auto& p) {
-- return p == nullptr;
-- }));
-- }
-+ : RGWDataChangesBE(ioctx, datalog, gen_id),
-+ fifos(shards, [&ioctx, this](std::size_t i, auto emplacer) {
-+ emplacer.emplace(ioctx, get_oid(i));
-+ }) {}
- ~RGWDataChangesFIFO() override = default;
- void prepare(ceph::real_time, const std::string&,
- ceph::buffer::list&& entry, entries& out) override {
-@@ -260,7 +252,7 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- std::get<centries>(out).push_back(std::move(entry));
- }
- int push(int index, entries&& items) override {
-- auto r = fifos[index]->push(std::get<centries>(items), null_yield);
-+ auto r = fifos[index].push(std::get<centries>(items), null_yield);
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
- << ": unable to push to FIFO: " << get_oid(index)
-@@ -271,7 +263,7 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- int push(int index, ceph::real_time,
- const std::string&,
- ceph::buffer::list&& bl) override {
-- auto r = fifos[index]->push(std::move(bl), null_yield);
-+ auto r = fifos[index].push(std::move(bl), null_yield);
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
- << ": unable to push to FIFO: " << get_oid(index)
-@@ -285,8 +277,8 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- std::string* out_marker, bool* truncated) override {
- std::vector<rgw::cls::fifo::list_entry> log_entries;
- bool more = false;
-- auto r = fifos[index]->list(max_entries, marker, &log_entries, &more,
-- null_yield);
-+ auto r = fifos[index].list(max_entries, marker, &log_entries, &more,
-+ null_yield);
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
- << ": unable to list FIFO: " << get_oid(index)
-@@ -317,14 +309,15 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- }
- int get_info(int index, RGWDataChangesLogInfo *info) override {
- auto& fifo = fifos[index];
-- auto r = fifo->read_meta(null_yield);
-+ auto r = fifo.read_meta(null_yield);
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
- << ": unable to get FIFO metadata: " << get_oid(index)
- << ": " << cpp_strerror(-r) << dendl;
- return r;
- }
-- auto m = fifo->meta();
-+ rados::cls::fifo::info m;
-+ fifo.meta(m, null_yield);
- auto p = m.head_part_num;
- if (p < 0) {
- info->marker = rgw::cls::fifo::marker{}.to_string();
-@@ -332,7 +325,7 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- return 0;
- }
- rgw::cls::fifo::part_info h;
-- r = fifo->get_part_info(p, &h, null_yield);
-+ r = fifo.get_part_info(p, &h, null_yield);
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
- << ": unable to get part info: " << get_oid(index) << "/" << p
-@@ -344,7 +337,7 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- return 0;
- }
- int trim(int index, std::string_view marker) override {
-- auto r = fifos[index]->trim(marker, false, null_yield);
-+ auto r = fifos[index].trim(marker, false, null_yield);
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
- << ": unable to trim FIFO: " << get_oid(index)
-@@ -358,7 +351,7 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- if (marker == rgw::cls::fifo::marker(0, 0).to_string()) {
- rgw_complete_aio_completion(c, -ENODATA);
- } else {
-- fifos[index]->trim(marker, false, c);
-+ fifos[index].trim(marker, false, c, null_yield);
- }
- return r;
- }
-@@ -371,8 +364,8 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- std::vector<rgw::cls::fifo::list_entry> log_entries;
- bool more = false;
- for (auto shard = 0u; shard < fifos.size(); ++shard) {
-- auto r = fifos[shard]->list(1, {}, &log_entries, &more,
-- null_yield);
-+ auto r = fifos[shard].list(1, {}, &log_entries, &more,
-+ null_yield);
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__
- << ": unable to list FIFO: " << get_oid(shard)
-
-From ad5a2fadf0fb16d4fc3066811fe11fc53c868263 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Tue, 26 Jan 2021 20:30:58 -0500
-Subject: [PATCH 18/26] rgw: Prune datalog generations in the renew loop
-
-Every 150 times through, which is a bit less than an hour between runs
-by default.
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 8f4291291b0dea4b4701894da0775149266a1373)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-
-Conflicts:
- src/rgw/rgw_datalog.cc
----
- src/rgw/rgw_datalog.cc | 21 +++++++++++++++++++++
- 1 file changed, 21 insertions(+)
-
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index 3ecab432646c1..d81d955ef6f17 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -930,6 +930,8 @@ RGWDataChangesLog::~RGWDataChangesLog() {
- }
-
- void RGWDataChangesLog::renew_run() {
-+ static constexpr auto runs_per_prune = 150;
-+ auto run = 0;
- for (;;) {
- dout(2) << "RGWDataChangesLog::ChangesRenewThread: start" << dendl;
- int r = renew_entries();
-@@ -940,6 +942,25 @@ void RGWDataChangesLog::renew_run() {
- if (going_down())
- break;
-
-+ if (run == runs_per_prune) {
-+ std::optional<uint64_t> through;
-+ dout(2) << "RGWDataChangesLog::ChangesRenewThread: pruning old generations" << dendl;
-+ trim_generations(through);
-+ if (r < 0) {
-+ derr << "RGWDataChangesLog::ChangesRenewThread: failed pruning r="
-+ << r << dendl;
-+ } else if (through) {
-+ dout(2) << "RGWDataChangesLog::ChangesRenewThread: pruned generations "
-+ << "through " << *through << "." << dendl;
-+ } else {
-+ dout(2) << "RGWDataChangesLog::ChangesRenewThread: nothing to prune."
-+ << dendl;
-+ }
-+ run = 0;
-+ } else {
-+ ++run;
-+ }
-+
- int interval = cct->_conf->rgw_data_log_window * 3 / 4;
- std::unique_lock locker{renew_lock};
- renew_cond.wait_for(locker, std::chrono::seconds(interval));
-
-From 0a2bee7e18367fbb1be73ece26e1a6efb099c161 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Tue, 2 Feb 2021 14:09:52 -0500
-Subject: [PATCH 19/26] rgw: Fix cursor handling in DataLogBackends::list
-
-Don't assume that the lowest generation not greater than the requested
-generation actually is the requested generation.
-
-(Also don't hold the lock after we get a backend.)
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit d7739178e994ce84886d297a29f2250e4bd78daa)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_datalog.cc | 15 +++++++++++----
- 1 file changed, 11 insertions(+), 4 deletions(-)
-
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index d81d955ef6f17..1db5eb86d62e1 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -704,7 +704,8 @@ int DataLogBackends::list(int shard, int max_entries,
- std::optional<std::string_view> marker,
- std::string* out_marker, bool* truncated)
- {
-- auto [gen_id, cursor] = cursorgeno(marker);
-+ const auto [start_id, start_cursor] = cursorgeno(marker);
-+ auto gen_id = start_id;
- std::string out_cursor;
- while (max_entries > 0) {
- std::vector<rgw_data_change_log_entry> gentries;
-@@ -712,7 +713,10 @@ int DataLogBackends::list(int shard, int max_entries,
- auto i = lower_bound(gen_id);
- if (i == end()) return 0;
- auto be = i->second;
-- auto r = be->list(shard, max_entries, gentries, cursor,
-+ l.unlock();
-+ gen_id = be->gen_id;
-+ auto r = be->list(shard, max_entries, gentries,
-+ gen_id == start_id ? start_cursor : std::string{},
- &out_cursor, truncated);
- if (r < 0)
- return r;
-@@ -723,10 +727,13 @@ int DataLogBackends::list(int shard, int max_entries,
- for (auto& g : gentries) {
- g.log_id = gencursor(gen_id, g.log_id);
- }
-- max_entries -= gentries.size();
-+ if (gentries.size() > max_entries)
-+ max_entries = 0;
-+ else
-+ max_entries -= gentries.size();
-+
- std::move(gentries.begin(), gentries.end(),
- std::back_inserter(entries));
-- cursor = {};
- ++gen_id;
- }
- return 0;
-
-From 4a6a7b3900ca4d1e14423d1ac07a0be60edb0ad0 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Thu, 4 Feb 2021 15:48:56 -0500
-Subject: [PATCH 20/26] rgw: Don't swallow errors in datalog async trim
-
-Typo and misleading indentation.
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit e97de55f46bbe67b523abfb4c30c50f1547f2601)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_datalog.cc | 16 ++++++++++------
- 1 file changed, 10 insertions(+), 6 deletions(-)
-
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index 1db5eb86d62e1..0b68c45a13e8d 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -798,7 +798,10 @@ int DataLogBackends::trim_entries(int shard_id, std::string_view marker)
- l.unlock();
- auto c = be->gen_id == target_gen ? cursor : be->max_marker();
- r = be->trim(shard_id, c);
-- if (r == -ENODATA && be->gen_id < target_gen) r = 0;
-+ if (r == -ENOENT)
-+ r = -ENODATA;
-+ if (r == -ENODATA && be->gen_id < target_gen)
-+ r = 0;
- l.lock();
- };
- return r;
-@@ -820,8 +823,8 @@ class GenTrim : public rgw::cls::fifo::Completion<GenTrim> {
- const uint64_t tail_gen;
- boost::intrusive_ptr<RGWDataChangesBE> be;
-
-- GenTrim(DataLogBackends* bes, int shard_id, uint64_t target_gen, std::string cursor,
-- uint64_t head_gen, uint64_t tail_gen,
-+ GenTrim(DataLogBackends* bes, int shard_id, uint64_t target_gen,
-+ std::string cursor, uint64_t head_gen, uint64_t tail_gen,
- boost::intrusive_ptr<RGWDataChangesBE> be,
- lr::AioCompletion* super)
- : Completion(super), bes(bes), shard_id(shard_id), target_gen(target_gen),
-@@ -831,8 +834,9 @@ class GenTrim : public rgw::cls::fifo::Completion<GenTrim> {
- void handle(Ptr&& p, int r) {
- auto gen_id = be->gen_id;
- be.reset();
-- if (r == -ENOENT) r = -ENODATA;
-- if (r == -ENODATA && gen_id < target_gen) r = 0;
-+ if (r == -ENOENT)
-+ r = -ENODATA;
-+ if (r == -ENODATA && gen_id < target_gen)
- r = 0;
- if (r < 0) {
- complete(std::move(p), r);
-@@ -844,7 +848,7 @@ class GenTrim : public rgw::cls::fifo::Completion<GenTrim> {
- auto i = bes->upper_bound(gen_id);
- if (i == bes->end() || i->first > target_gen || i->first > head_gen) {
- l.unlock();
-- complete(std::move(p), r);
-+ complete(std::move(p), -ENODATA);
- return;
- }
- be = i->second;
-
-From 262466609208e81f8fe54560fd07a81a4b78cd68 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Tue, 9 Feb 2021 18:10:50 -0500
-Subject: [PATCH 21/26] rgw: Leave the zero'th shard of the zero'th generation
- for cls_lock
-
-Since data sync locks that object, instead of deleting it, truncate
-the object and clear the omap.
-
-(cls_lock uses xattrs.)
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 0d4e0abb8a699417ea75a6cd390786189ab964eb)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_log_backing.cc | 16 +++++++++++++---
- src/rgw/rgw_log_backing.h | 1 +
- 2 files changed, 14 insertions(+), 3 deletions(-)
-
-diff --git a/src/rgw/rgw_log_backing.cc b/src/rgw/rgw_log_backing.cc
-index eab60e672b9e8..67fc925586919 100644
---- a/src/rgw/rgw_log_backing.cc
-+++ b/src/rgw/rgw_log_backing.cc
-@@ -168,6 +168,7 @@ log_backing_type(librados::IoCtx& ioctx,
- bs::error_code log_remove(librados::IoCtx& ioctx,
- int shards,
- const fu2::unique_function<std::string(int) const>& get_oid,
-+ bool leave_zero,
- optional_yield y)
- {
- bs::error_code ec;
-@@ -204,7 +205,16 @@ bs::error_code log_remove(librados::IoCtx& ioctx,
- << ", r=" << r << dendl;
- }
- librados::ObjectWriteOperation op;
-- op.remove();
-+ if (i == 0 && leave_zero) {
-+ // Leave shard 0 in existence, but remove contents and
-+ // omap. cls_lock stores things in the xattrs. And sync needs to
-+ // rendezvous with locks on generation 0 shard 0.
-+ op.omap_set_header({});
-+ op.omap_clear();
-+ op.truncate(0);
-+ } else {
-+ op.remove();
-+ }
- r = rgw_rados_operate(ioctx, oid, &op, null_yield);
- if (r < 0 && r != -ENOENT) {
- if (!ec)
-@@ -291,7 +301,7 @@ bs::error_code logback_generations::setup(log_type def,
- auto ec = log_remove(ioctx, shards,
- [this](int shard) {
- return this->get_oid(0, shard);
-- }, y);
-+ }, true, y);
- if (ec) return ec;
- }
- std::unique_lock lock(m);
-@@ -631,7 +641,7 @@ bs::error_code logback_generations::remove_empty(optional_yield y) noexcept {
- auto ec = log_remove(ioctx, shards,
- [this, gen_id](int shard) {
- return this->get_oid(gen_id, shard);
-- }, y);
-+ }, (gen_id == 0), y);
- if (ec) {
- return ec;
- }
-diff --git a/src/rgw/rgw_log_backing.h b/src/rgw/rgw_log_backing.h
-index cd677764c5795..e592bc29b2bcf 100644
---- a/src/rgw/rgw_log_backing.h
-+++ b/src/rgw/rgw_log_backing.h
-@@ -88,6 +88,7 @@ bs::error_code log_remove(librados::IoCtx& ioctx,
- /// A function taking a shard number and
- /// returning an oid.
- const fu2::unique_function<std::string(int) const>& get_oid,
-+ bool leave_zero,
- optional_yield y);
-
-
-
-From 497c4231beec9caa79d815d571f511040784bbb8 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Wed, 10 Feb 2021 16:18:09 -0500
-Subject: [PATCH 22/26] rgw: Wait until a generation has been empty for an hour
- to delete
-
-This fixes a problem where, while the backing handle remains allocated
-while a call completes, the objects it depends on may be deleted
-behind it.
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 7018c25d47edf7e12b581f7f28c2549fe73bde15)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_datalog.cc | 2 +-
- src/rgw/rgw_log_backing.cc | 37 +++++++++++++++++++++-----------
- src/rgw/rgw_log_backing.h | 8 +++----
- src/test/rgw/test_log_backing.cc | 24 ++++++++++-----------
- 4 files changed, 42 insertions(+), 29 deletions(-)
-
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index 0b68c45a13e8d..184d0713fb2a9 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -390,7 +390,7 @@ bs::error_code DataLogBackends::handle_init(entries_t e) noexcept {
- std::unique_lock l(m);
-
- for (const auto& [gen_id, gen] : e) {
-- if (gen.empty) {
-+ if (gen.pruned) {
- lderr(datalog.cct)
- << __PRETTY_FUNCTION__ << ":" << __LINE__
- << ": ERROR: given empty generation: gen_id=" << gen_id << dendl;
-diff --git a/src/rgw/rgw_log_backing.cc b/src/rgw/rgw_log_backing.cc
-index 67fc925586919..8ce88aa21414f 100644
---- a/src/rgw/rgw_log_backing.cc
-+++ b/src/rgw/rgw_log_backing.cc
-@@ -583,7 +583,7 @@ bs::error_code logback_generations::empty_to(uint64_t gen_id,
- }
- for (auto i = es.begin(); i < ei; ++i) {
- newtail = i->first;
-- i->second.empty = true;
-+ i->second.pruned = ceph::real_clock::now();
- }
- ec = write(std::move(es), std::move(l), y);
- ++tries;
-@@ -626,31 +626,44 @@ bs::error_code logback_generations::remove_empty(optional_yield y) noexcept {
- entries_t new_entries;
- std::unique_lock l(m);
- ceph_assert(!entries_.empty());
-- auto i = lowest_nomempty(entries_);
-- if (i == entries_.begin()) {
-- return {};
-+ {
-+ auto i = lowest_nomempty(entries_);
-+ if (i == entries_.begin()) {
-+ return {};
-+ }
- }
-- auto ln = i->first;
- entries_t es;
-- std::copy(entries_.cbegin(), i,
-- std::inserter(es, es.end()));
-+ auto now = ceph::real_clock::now();
- l.unlock();
- do {
-+ std::copy_if(entries_.cbegin(), entries_.cend(),
-+ std::inserter(es, es.end()),
-+ [now](const auto& e) {
-+ if (!e.second.pruned)
-+ return false;
-+
-+ auto pruned = *e.second.pruned;
-+ return (now - pruned) >= 1h;
-+ });
-+ auto es2 = entries_;
- for (const auto& [gen_id, e] : es) {
-- ceph_assert(e.empty);
-+ ceph_assert(e.pruned);
- auto ec = log_remove(ioctx, shards,
- [this, gen_id](int shard) {
- return this->get_oid(gen_id, shard);
- }, (gen_id == 0), y);
- if (ec) {
-- return ec;
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": Error pruning: gen_id=" << gen_id
-+ << " ec=" << ec.message() << dendl;
-+ }
-+ if (auto i = es2.find(gen_id); i != es2.end()) {
-+ es2.erase(i);
- }
- }
- l.lock();
-- i = entries_.find(ln);
- es.clear();
-- std::copy(i, entries_.cend(), std::inserter(es, es.end()));
-- ec = write(std::move(es), std::move(l), y);
-+ ec = write(std::move(es2), std::move(l), y);
- ++tries;
- } while (ec == bs::errc::operation_canceled &&
- tries < max_tries);
-diff --git a/src/rgw/rgw_log_backing.h b/src/rgw/rgw_log_backing.h
-index e592bc29b2bcf..d5996049e5873 100644
---- a/src/rgw/rgw_log_backing.h
-+++ b/src/rgw/rgw_log_backing.h
-@@ -95,13 +95,13 @@ bs::error_code log_remove(librados::IoCtx& ioctx,
- struct logback_generation {
- uint64_t gen_id = 0;
- log_type type;
-- bool empty = false;
-+ std::optional<ceph::real_time> pruned;
-
- void encode(ceph::buffer::list& bl) const {
- ENCODE_START(1, 1, bl);
- encode(gen_id, bl);
- encode(type, bl);
-- encode(empty, bl);
-+ encode(pruned, bl);
- ENCODE_FINISH(bl);
- }
-
-@@ -109,7 +109,7 @@ struct logback_generation {
- DECODE_START(1, bl);
- decode(gen_id, bl);
- decode(type, bl);
-- decode(empty, bl);
-+ decode(pruned, bl);
- DECODE_FINISH(bl);
- }
- };
-@@ -157,7 +157,7 @@ class logback_generations : public librados::WatchCtx2 {
- auto lowest_nomempty(const entries_t& es) {
- return std::find_if(es.begin(), es.end(),
- [](const auto& e) {
-- return !e.second.empty;
-+ return !e.second.pruned;
- });
- }
-
-diff --git a/src/test/rgw/test_log_backing.cc b/src/test/rgw/test_log_backing.cc
-index 166de2dd8242c..95f1e613936b0 100644
---- a/src/test/rgw/test_log_backing.cc
-+++ b/src/test/rgw/test_log_backing.cc
-@@ -241,7 +241,7 @@ TEST_F(LogBacking, GenerationSingle)
-
- ASSERT_EQ(0, lg->got_entries[0].gen_id);
- ASSERT_EQ(log_type::fifo, lg->got_entries[0].type);
-- ASSERT_FALSE(lg->got_entries[0].empty);
-+ ASSERT_FALSE(lg->got_entries[0].pruned);
-
- auto ec = lg->empty_to(0, null_yield);
- ASSERT_TRUE(ec);
-@@ -258,7 +258,7 @@ TEST_F(LogBacking, GenerationSingle)
-
- ASSERT_EQ(0, lg->got_entries[0].gen_id);
- ASSERT_EQ(log_type::fifo, lg->got_entries[0].type);
-- ASSERT_FALSE(lg->got_entries[0].empty);
-+ ASSERT_FALSE(lg->got_entries[0].pruned);
-
- lg->got_entries.clear();
-
-@@ -268,7 +268,7 @@ TEST_F(LogBacking, GenerationSingle)
- ASSERT_EQ(1, lg->got_entries.size());
- ASSERT_EQ(1, lg->got_entries[1].gen_id);
- ASSERT_EQ(log_type::omap, lg->got_entries[1].type);
-- ASSERT_FALSE(lg->got_entries[1].empty);
-+ ASSERT_FALSE(lg->got_entries[1].pruned);
-
- lg.reset();
-
-@@ -280,11 +280,11 @@ TEST_F(LogBacking, GenerationSingle)
- ASSERT_EQ(2, lg->got_entries.size());
- ASSERT_EQ(0, lg->got_entries[0].gen_id);
- ASSERT_EQ(log_type::fifo, lg->got_entries[0].type);
-- ASSERT_FALSE(lg->got_entries[0].empty);
-+ ASSERT_FALSE(lg->got_entries[0].pruned);
-
- ASSERT_EQ(1, lg->got_entries[1].gen_id);
- ASSERT_EQ(log_type::omap, lg->got_entries[1].type);
-- ASSERT_FALSE(lg->got_entries[1].empty);
-+ ASSERT_FALSE(lg->got_entries[1].pruned);
-
- ec = lg->empty_to(0, null_yield);
- ASSERT_FALSE(ec);
-@@ -301,7 +301,7 @@ TEST_F(LogBacking, GenerationSingle)
- ASSERT_EQ(1, lg->got_entries.size());
- ASSERT_EQ(1, lg->got_entries[1].gen_id);
- ASSERT_EQ(log_type::omap, lg->got_entries[1].type);
-- ASSERT_FALSE(lg->got_entries[1].empty);
-+ ASSERT_FALSE(lg->got_entries[1].pruned);
-
- ec = lg->remove_empty(null_yield);
- ASSERT_FALSE(ec);
-@@ -311,7 +311,7 @@ TEST_F(LogBacking, GenerationSingle)
-
- ASSERT_EQ(1, entries[1].gen_id);
- ASSERT_EQ(log_type::omap, entries[1].type);
-- ASSERT_FALSE(entries[1].empty);
-+ ASSERT_FALSE(entries[1].pruned);
-
- lg.reset();
- }
-@@ -329,7 +329,7 @@ TEST_F(LogBacking, GenerationWN)
- ASSERT_EQ(1, lg1->got_entries.size());
- ASSERT_EQ(1, lg1->got_entries[1].gen_id);
- ASSERT_EQ(log_type::omap, lg1->got_entries[1].type);
-- ASSERT_FALSE(lg1->got_entries[1].empty);
-+ ASSERT_FALSE(lg1->got_entries[1].pruned);
-
- lg1->got_entries.clear();
-
-@@ -342,11 +342,11 @@ TEST_F(LogBacking, GenerationWN)
-
- ASSERT_EQ(0, lg2->got_entries[0].gen_id);
- ASSERT_EQ(log_type::fifo, lg2->got_entries[0].type);
-- ASSERT_FALSE(lg2->got_entries[0].empty);
-+ ASSERT_FALSE(lg2->got_entries[0].pruned);
-
- ASSERT_EQ(1, lg2->got_entries[1].gen_id);
- ASSERT_EQ(log_type::omap, lg2->got_entries[1].type);
-- ASSERT_FALSE(lg2->got_entries[1].empty);
-+ ASSERT_FALSE(lg2->got_entries[1].pruned);
-
- lg2->got_entries.clear();
-
-@@ -356,12 +356,12 @@ TEST_F(LogBacking, GenerationWN)
- ASSERT_EQ(1, lg1->got_entries.size());
- ASSERT_EQ(2, lg1->got_entries[2].gen_id);
- ASSERT_EQ(log_type::fifo, lg1->got_entries[2].type);
-- ASSERT_FALSE(lg1->got_entries[2].empty);
-+ ASSERT_FALSE(lg1->got_entries[2].pruned);
-
- ASSERT_EQ(1, lg2->got_entries.size());
- ASSERT_EQ(2, lg2->got_entries[2].gen_id);
- ASSERT_EQ(log_type::fifo, lg2->got_entries[2].type);
-- ASSERT_FALSE(lg2->got_entries[2].empty);
-+ ASSERT_FALSE(lg2->got_entries[2].pruned);
-
- lg1->got_entries.clear();
- lg2->got_entries.clear();
-
-From 73d6d04e7c8984ed00c82e93abcab58af81fe664 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Wed, 10 Feb 2021 17:09:02 -0500
-Subject: [PATCH 23/26] rgw: Try to prune empties even if no empties found
-
-Since we won't actually delete empties until much later.
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 9bd9b7659fdb7a1a01d5e1523f0d461dbf5eaafe)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_datalog.cc | 54 ++++++++++++++++++++----------------------
- 1 file changed, 26 insertions(+), 28 deletions(-)
-
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index 184d0713fb2a9..93a27a5639d05 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -881,38 +881,36 @@ void DataLogBackends::trim_entries(int shard_id, std::string_view marker,
- }
-
- int DataLogBackends::trim_generations(std::optional<uint64_t>& through) {
-- if (size() == 1) {
-- return 0;
-- }
--
-- std::vector<mapped_type> candidates;
-- {
-- std::scoped_lock l(m);
-- auto e = cend() - 1;
-- for (auto i = cbegin(); i < e; ++i) {
-- candidates.push_back(i->second);
-+ if (size() != 1) {
-+ std::vector<mapped_type> candidates;
-+ {
-+ std::scoped_lock l(m);
-+ auto e = cend() - 1;
-+ for (auto i = cbegin(); i < e; ++i) {
-+ candidates.push_back(i->second);
-+ }
- }
-- }
-
-- std::optional<uint64_t> highest;
-- for (auto& be : candidates) {
-- auto r = be->is_empty();
-- if (r < 0) {
-- return r;
-- } else if (r == 1) {
-- highest = be->gen_id;
-- } else {
-- break;
-+ std::optional<uint64_t> highest;
-+ for (auto& be : candidates) {
-+ auto r = be->is_empty();
-+ if (r < 0) {
-+ return r;
-+ } else if (r == 1) {
-+ highest = be->gen_id;
-+ } else {
-+ break;
-+ }
- }
-- }
-
-- through = highest;
-- if (!highest) {
-- return 0;
-- }
-- auto ec = empty_to(*highest, null_yield);
-- if (ec) {
-- return ceph::from_error_code(ec);
-+ through = highest;
-+ if (!highest) {
-+ return 0;
-+ }
-+ auto ec = empty_to(*highest, null_yield);
-+ if (ec) {
-+ return ceph::from_error_code(ec);
-+ }
- }
-
- return ceph::from_error_code(remove_empty(null_yield));
-
-From 7e80b7403878b3c13d62f2f9bfe9c3c13a266500 Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Thu, 11 Feb 2021 18:27:33 -0500
-Subject: [PATCH 24/26] rgw: Make empty datalog fifo markers empty strings
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 4e3a7d5476fa2dd4b9825f4d546c42819f93c7cc)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_datalog.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/rgw/rgw_datalog.cc b/src/rgw/rgw_datalog.cc
-index 93a27a5639d05..cb5cba7269fb1 100644
---- a/src/rgw/rgw_datalog.cc
-+++ b/src/rgw/rgw_datalog.cc
-@@ -320,7 +320,7 @@ class RGWDataChangesFIFO final : public RGWDataChangesBE {
- fifo.meta(m, null_yield);
- auto p = m.head_part_num;
- if (p < 0) {
-- info->marker = rgw::cls::fifo::marker{}.to_string();
-+ info->marker = ""s;
- info->last_update = ceph::real_clock::zero();
- return 0;
- }
-
-From c3039ccdafe8350c29f18fbfdd79b096cb1f0a0d Mon Sep 17 00:00:00 2001
-From: "Adam C. Emerson" <aemerson(a)redhat.com>
-Date: Mon, 8 Mar 2021 15:17:53 -0500
-Subject: [PATCH 25/26] rgw: Fix probe failure on OSDs not suporting FIFO.
-
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
-(cherry picked from commit 4e9ec426b15fe60c5b0154980f808076e166dd02)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_log_backing.cc | 64 ++++++++++++++++++++++++--------------
- 1 file changed, 40 insertions(+), 24 deletions(-)
-
-diff --git a/src/rgw/rgw_log_backing.cc b/src/rgw/rgw_log_backing.cc
-index 8ce88aa21414f..c3037e13048bb 100644
---- a/src/rgw/rgw_log_backing.cc
-+++ b/src/rgw/rgw_log_backing.cc
-@@ -31,7 +31,8 @@ inline std::ostream& operator <<(std::ostream& m, const shard_check& t) {
- namespace {
- /// Return the shard type, and a bool to see whether it has entries.
- std::pair<shard_check, bool>
--probe_shard(librados::IoCtx& ioctx, const std::string& oid, optional_yield y)
-+probe_shard(librados::IoCtx& ioctx, const std::string& oid,
-+ bool& fifo_unsupported, optional_yield y)
- {
- auto cct = static_cast<CephContext*>(ioctx.cct());
- bool omap = false;
-@@ -53,32 +54,38 @@ probe_shard(librados::IoCtx& ioctx, const std::string& oid, optional_yield y)
- if (header != cls_log_header{})
- omap = true;
- }
-- std::unique_ptr<rgw::cls::fifo::FIFO> fifo;
-- auto r = rgw::cls::fifo::FIFO::open(ioctx, oid,
-- &fifo, y,
-- std::nullopt, true);
-- if (r < 0 && !(r == -ENOENT || r == -ENODATA)) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " error probing for fifo: r=" << r
-- << ", oid=" << oid << dendl;
-- return { shard_check::corrupt, {} };
-- }
-- if (fifo && omap) {
-- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << " fifo and omap found: oid=" << oid << dendl;
-- return { shard_check::corrupt, {} };
-- }
-- if (fifo) {
-- bool more = false;
-- std::vector<rgw::cls::fifo::list_entry> entries;
-- r = fifo->list(1, nullopt, &entries, &more, y);
-- if (r < 0) {
-+ if (!fifo_unsupported) {
-+ std::unique_ptr<rgw::cls::fifo::FIFO> fifo;
-+ auto r = rgw::cls::fifo::FIFO::open(ioctx, oid,
-+ &fifo, y,
-+ std::nullopt, true);
-+ if (r < 0 && !(r == -ENOENT || r == -ENODATA || r == -EPERM)) {
- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-- << ": unable to list entries: r=" << r
-+ << " error probing for fifo: r=" << r
- << ", oid=" << oid << dendl;
- return { shard_check::corrupt, {} };
- }
-- return { shard_check::fifo, !entries.empty() };
-+ if (fifo && omap) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " fifo and omap found: oid=" << oid << dendl;
-+ return { shard_check::corrupt, {} };
-+ }
-+ if (fifo) {
-+ bool more = false;
-+ std::vector<rgw::cls::fifo::list_entry> entries;
-+ r = fifo->list(1, nullopt, &entries, &more, y);
-+ if (r < 0) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << ": unable to list entries: r=" << r
-+ << ", oid=" << oid << dendl;
-+ return { shard_check::corrupt, {} };
-+ }
-+ return { shard_check::fifo, !entries.empty() };
-+ }
-+ if (r == -EPERM) {
-+ // Returned by OSD id CLS module not loaded.
-+ fifo_unsupported = true;
-+ }
- }
- if (omap) {
- std::list<cls_log_entry> entries;
-@@ -105,10 +112,17 @@ tl::expected<log_type, bs::error_code>
- handle_dne(librados::IoCtx& ioctx,
- log_type def,
- std::string oid,
-+ bool fifo_unsupported,
- optional_yield y)
- {
- auto cct = static_cast<CephContext*>(ioctx.cct());
- if (def == log_type::fifo) {
-+ if (fifo_unsupported) {
-+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
-+ << " WARNING: FIFO set as default but not supported by OSD. "
-+ << "Falling back to OMAP." << dendl;
-+ return log_type::omap;
-+ }
- std::unique_ptr<rgw::cls::fifo::FIFO> fifo;
- auto r = rgw::cls::fifo::FIFO::create(ioctx, oid,
- &fifo, y,
-@@ -133,8 +147,9 @@ log_backing_type(librados::IoCtx& ioctx,
- {
- auto cct = static_cast<CephContext*>(ioctx.cct());
- auto check = shard_check::dne;
-+ bool fifo_unsupported = false;
- for (int i = 0; i < shards; ++i) {
-- auto [c, e] = probe_shard(ioctx, get_oid(i), y);
-+ auto [c, e] = probe_shard(ioctx, get_oid(i), fifo_unsupported, y);
- if (c == shard_check::corrupt)
- return tl::unexpected(bs::error_code(EIO, bs::system_category()));
- if (c == shard_check::dne) continue;
-@@ -160,6 +175,7 @@ log_backing_type(librados::IoCtx& ioctx,
- return handle_dne(ioctx,
- def,
- get_oid(0),
-+ fifo_unsupported,
- y);
-
- return (check == shard_check::fifo ? log_type::fifo : log_type::omap);
-
-From 9fcde9e37bb1e954ef837d12ba03387d63d4b020 Mon Sep 17 00:00:00 2001
-From: Yuval Lifshitz <ylifshit(a)redhat.com>
-Date: Sun, 4 Apr 2021 17:19:03 +0300
-Subject: [PATCH 26/26] rgw/multisite: handle case when empty marker is
- provided
-
-marker is potional, however, it may also be provided empty
-
-Fixes: https://tracker.ceph.com/issues/50135
-
-Signed-off-by: Yuval Lifshitz <ylifshit(a)redhat.com>
-(cherry picked from commit fccf75eee3750a3654d2a2b1e3aa379edcfd8c8d)
-Signed-off-by: Adam C. Emerson <aemerson(a)redhat.com>
----
- src/rgw/rgw_log_backing.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/rgw/rgw_log_backing.h b/src/rgw/rgw_log_backing.h
-index d5996049e5873..6f755efb46389 100644
---- a/src/rgw/rgw_log_backing.h
-+++ b/src/rgw/rgw_log_backing.h
-@@ -251,7 +251,7 @@ cursorgen(std::string_view cursor_) {
-
- inline std::pair<uint64_t, std::string_view>
- cursorgeno(std::optional<std::string_view> cursor) {
-- if (cursor) {
-+ if (cursor && !cursor->empty()) {
- return cursorgen(*cursor);
- } else {
- return { 0, ""s };
diff --git a/ceph.spec b/ceph.spec
index 0d3546f..fcce61c 100644
--- a/ceph.spec
+++ b/ceph.spec
@@ -26,7 +26,7 @@
%bcond_with zbd
%bcond_with cmake_verbose_logging
%bcond_without ceph_test_package
-%ifarch s390 s390x
+%ifarch s390
%bcond_with tcmalloc
%else
%bcond_without tcmalloc
@@ -125,7 +125,7 @@
# main package definition
#################################################################################
Name: ceph
-Version: 16.2.1
+Version: 16.2.2
Release: 1%{?dist}
%if 0%{?fedora} || 0%{?rhel}
Epoch: 2
@@ -146,14 +146,12 @@ Source0: %{?_remote_tarball_prefix}ceph-%{version}.tar.gz
Patch0001: 0001-src-common-crc32c_intel_fast.patch
Patch0002: 0002-src-common-CMakeLists.txt.patch
Patch0003: 0003-src-common-bitstr.h.patch
-Patch0004: 0004-src-CMakeLists.txt.patch
Patch0006: 0006-src-blk-CMakeLists.txt.patch
Patch0007: 0007-src-test-neorados-CMakeLists.txt.patch
Patch0008: 0008-cmake-modules-Finduring.cmake.patch
Patch0009: 0009-librgw-notifications-initialize-kafka-and-amqp.patch
Patch0010: 0010-os-bluestore-strip-trailing-slash-for-directory-list.patch
Patch0011: 0011-src-test-rgw-amqp_mock.cc.patch
-Patch0012: 0012-rgw.patch
# Source1: cmake-modules-BuildBoost.cmake.noautopatch
# ceph 14.0.1 does not support 32-bit architectures, bugs #1727788, #1727787
ExcludeArch: i686 armv7hl
@@ -188,8 +186,12 @@ BuildRequires: gcc-c++
%endif
BuildRequires: gdbm
%if 0%{with tcmalloc}
-%if 0%{?fedora} || 0%{?rhel}
-BuildRequires: gperftools-devel >= 2.6.1
+# libprofiler did not build on ppc64le until 2.7.90
+%if 0%{?fedora} || 0%{?rhel} >= 8
+BuildRequires: gperftools-devel >= 2.7.90
+%endif
+%if 0%{?rhel} && 0%{?rhel} < 8
+BuildRequires: gperftools-devel >= 2.6.1
%endif
%if 0%{?suse_version}
BuildRequires: gperftools-devel >= 2.4
@@ -347,6 +349,7 @@ BuildRequires: lz4-devel >= 1.7
# distro-conditional make check dependencies
%if 0%{with make_check}
%if 0%{?fedora} || 0%{?rhel}
+BuildRequires: golang-github-prometheus
BuildRequires: libtool-ltdl-devel
BuildRequires: xmlsec1
BuildRequires: xmlsec1-devel
@@ -363,6 +366,7 @@ BuildRequires: python%{python3_pkgversion}-werkzeug
BuildRequires: python%{python3_pkgversion}-pyOpenSSL
%endif
%if 0%{?suse_version}
+BuildRequires: golang-github-prometheus-prometheus
BuildRequires: libxmlsec1-1
BuildRequires: libxmlsec1-nss1
BuildRequires: libxmlsec1-openssl1
@@ -444,7 +448,7 @@ Requires: python%{python3_pkgversion}-setuptools
Requires: util-linux
Requires: xfsprogs
Requires: which
-%if 0%{?fedora} || 0%{?rhel}
+%if 0%{?rhel} && 0%{?rhel} < 8
# The following is necessary due to tracker 36508 and can be removed once the
# associated upstream bugs are resolved.
%if 0%{with tcmalloc}
@@ -728,6 +732,7 @@ Summary: Ceph daemon for immutable object cache
%if 0%{?suse_version}
Group: System/Filesystems
%endif
+Requires: ceph-base = %{_epoch_prefix}%{version}-%{release}
Requires: librados2 = %{_epoch_prefix}%{version}-%{release}
%description immutable-object-cache
Daemon for immutable object cache.
@@ -2494,6 +2499,9 @@ exit 0
%config %{_sysconfdir}/prometheus/ceph/ceph_default_alerts.yml
%changelog
+* Wed May 5 2021 Kaleb S. KEITHLEY <kkeithle[at]redhat.com> - 2:16.2.2-1
+- 16.2.2 GA
+
* Tue Apr 20 2021 Kaleb S. KEITHLEY <kkeithle[at]redhat.com> - 2:16.2.1-1
- 16.2.1 GA
diff --git a/sources b/sources
index 3de5593..adc6360 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (ceph-16.2.1.tar.gz) = 42e404aa41565485dc4c08b66efb3de719adee72cfc535586992e15ab4601bfbd909ef61abf412badbbfa7ef13bf91a7c0576fbbf3f9f687bc7b465b21a8c416
+SHA512 (ceph-16.2.2.tar.gz) = 4269fe07821400655c5cfcc2828b4a39a0adc81ef0045d86b50b539c13c151c9ace9710fe365bbf2de7e5134e03c45c88f19f4adcb7c4d608eab4b9580da113c
commit 78e076b5afe9c86d02d40e39be312d9c7e2c7bab
Author: Kaleb S. KEITHLEY <kkeithle(a)redhat.com>
Date: Tue Apr 20 08:34:14 2021 -0400
16.2.1 GA
Signed-off-by: Kaleb S. KEITHLEY <kkeithle(a)redhat.com>
diff --git a/ceph.spec b/ceph.spec
index 5b81d7f..0d3546f 100644
--- a/ceph.spec
+++ b/ceph.spec
@@ -125,8 +125,8 @@
# main package definition
#################################################################################
Name: ceph
-Version: 16.2.0
-Release: 3%{?dist}
+Version: 16.2.1
+Release: 1%{?dist}
%if 0%{?fedora} || 0%{?rhel}
Epoch: 2
%endif
@@ -154,7 +154,7 @@ Patch0009: 0009-librgw-notifications-initialize-kafka-and-amqp.patch
Patch0010: 0010-os-bluestore-strip-trailing-slash-for-directory-list.patch
Patch0011: 0011-src-test-rgw-amqp_mock.cc.patch
Patch0012: 0012-rgw.patch
-Source1: cmake-modules-BuildBoost.cmake.noautopatch
+# Source1: cmake-modules-BuildBoost.cmake.noautopatch
# ceph 14.0.1 does not support 32-bit architectures, bugs #1727788, #1727787
ExcludeArch: i686 armv7hl
%if 0%{?suse_version}
@@ -1224,9 +1224,9 @@ This package provides Ceph default alerts for Prometheus.
#################################################################################
%prep
%autosetup -p1
-%ifarch x86_64
-patch -p1 < %{SOURCE1}
-%endif
+# %%ifarch x86_64
+# patch -p1 < %{SOURCE1}
+# %%endif
%build
# LTO can be enabled as soon as the following GCC bug is fixed:
@@ -2494,6 +2494,9 @@ exit 0
%config %{_sysconfdir}/prometheus/ceph/ceph_default_alerts.yml
%changelog
+* Tue Apr 20 2021 Kaleb S. KEITHLEY <kkeithle[at]redhat.com> - 2:16.2.1-1
+- 16.2.1 GA
+
* Wed Apr 14 2021 Richard W.M. Jones <rjones(a)redhat.com> - 2:16.2.0-3
- Rebuild for updated liburing.
diff --git a/sources b/sources
index dbd8960..3de5593 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (ceph-16.2.0.tar.gz) = aeb9a91c33221c64ea24603dc88cab346bf0abdf0d41ff85c2e1cf134130737ec1fab1246be0a2fa3af8a655ae1dabb69688855f229f54438e60cb8098175b8e
+SHA512 (ceph-16.2.1.tar.gz) = 42e404aa41565485dc4c08b66efb3de719adee72cfc535586992e15ab4601bfbd909ef61abf412badbbfa7ef13bf91a7c0576fbbf3f9f687bc7b465b21a8c416
2 years, 11 months
Architecture specific change in rpms/glibc.git
by githook-noreply@fedoraproject.org
The package rpms/glibc.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/glibc.git/commit/?id=fe601617f6a6....
Change:
-%ifarch %{debuginfocommonarches}
Thanks.
Full change:
============
commit fe601617f6a62d23cec4213d5585f30d0e380144
Author: Florian Weimer <fweimer(a)redhat.com>
Date: Thu Apr 29 17:56:01 2021 +0200
Switch to the distribution debuginfo generation mechanism
This needs a wrapper script around find-debuginfo.sh, so that
ld.so is not stripped.
This commit resolves debuginfo file conflicts (#1886295) because
the ldconfig debuginfo file now includes the architecture name.
All debugging information is preserved in ld.so (#1905611). With
the distribution defaults, we strip all binaries again (#1661510).
diff --git a/glibc.spec b/glibc.spec
index 07ea82e..39eb37e 100644
--- a/glibc.spec
+++ b/glibc.spec
@@ -84,12 +84,6 @@
%define need_headers_package 0
%endif
-##############################################################################
-# If the debug information is split into two packages, the core debuginfo
-# package and the common debuginfo package then the arch should be listed
-# here. If the arch is not listed here then a single core debuginfo package
-# will be created for the architecture.
-%define debuginfocommonarches %{biarcharches} alpha alphaev6
##############################################################################
# %%package glibc - The GNU C Library (glibc) core package.
##############################################################################
@@ -130,10 +124,25 @@ Source0: %{?glibc_release_url}%{glibcsrcdir}.tar.xz
Source1: nscd.conf
Source2: bench.mk
Source3: glibc-bench-compare
+Source10: wrap-find-debuginfo.sh
Source11: parse-SUPPORTED.py
# Include in the source RPM for reference.
Source12: ChangeLog.old
+######################################################################
+# Activate the wrapper script for debuginfo generation, by rewriting
+# the definition of __debug_install_post.
+%{lua:
+local wrapper = rpm.expand("%{SOURCE10}")
+local ldso = rpm.expand("%{glibc_sysroot}/%{_lib}/ld-%{VERSION}.so")
+local original = rpm.expand("%{macrobody:__debug_install_post}")
+-- Strip leading newline. It confuses the macro redefinition.
+-- Avoid embedded newlines that confuse the macro definition.
+original = original:match("^%s*(.-)%s*$"):gsub("\\\n", "")
+rpm.define("__debug_install_post bash " .. wrapper
+ .. " " .. ldso .. " " .. original)
+}
+
##############################################################################
# Patches:
# - See each individual patch file for origin and upstream status.
@@ -284,11 +293,6 @@ BuildRequires: binutils >= 2.30-17
# Earlier releases have broken support for IRELATIVE relocations
Conflicts: prelink < 0.4.2
-%if 0%{?_enable_debug_packages}
-BuildRequires: elfutils >= 0.72
-BuildRequires: rpm >= 4.2-0.56
-%endif
-
%if %{without bootstrap}
%if %{with testsuite}
# The testsuite builds static C++ binaries that require a C++ compiler,
@@ -952,59 +956,6 @@ which can be helpful during program debugging.
If unsure if you need this, don't install this package.
-##############################################################################
-# glibc core "debuginfo" sub-package
-##############################################################################
-%if 0%{?_enable_debug_packages}
-%define debug_package %{nil}
-%define __debug_install_post %{nil}
-%global __debug_package 1
-# Disable thew new features that glibc packages don't use.
-%undefine _debugsource_packages
-%undefine _debuginfo_subpackages
-%undefine _unique_debug_names
-%undefine _unique_debug_srcs
-
-%package debuginfo
-Summary: Debug information for package %{name}
-AutoReqProv: no
-%ifarch %{debuginfocommonarches}
-Requires: glibc-debuginfo-common = %{version}-%{release}
-%else
-%ifarch %{ix86} %{sparc}
-Obsoletes: glibc-debuginfo-common
-%endif
-%endif
-
-%description debuginfo
-This package provides debug information for package %{name}.
-Debug information is useful when developing applications that use this
-package or when debugging this package.
-
-This package also contains static standard C libraries with
-debugging information. You need this only if you want to step into
-C library routines during debugging programs statically linked against
-one or more of the standard C libraries.
-To use this debugging information, you need to link binaries
-with -static -L%{_prefix}/lib/debug%{_libdir} compiler options.
-
-##############################################################################
-# glibc common "debuginfo-common" sub-package
-##############################################################################
-%ifarch %{debuginfocommonarches}
-
-%package debuginfo-common
-Summary: Debug information for package %{name}
-AutoReqProv: no
-
-%description debuginfo-common
-This package provides debug information for package %{name}.
-Debug information is useful when developing applications that use this
-package or when debugging this package.
-
-%endif
-%endif
-
%if %{with benchtests}
%package benchtests
Summary: Benchmarking binaries and scripts for %{name}
@@ -1436,21 +1387,6 @@ truncate -s 0 %{glibc_sysroot}/etc/gai.conf
truncate -s 0 %{glibc_sysroot}%{_libdir}/gconv/gconv-modules.cache
chmod 644 %{glibc_sysroot}%{_libdir}/gconv/gconv-modules.cache
-##############################################################################
-# Install debug copies of unstripped static libraries
-# - This step must be last in order to capture any additional static
-# archives we might have added.
-##############################################################################
-
-# If we are building a debug package then copy all of the static archives
-# into the debug directory to keep them as unstripped copies.
-%if 0%{?_enable_debug_packages}
-mkdir -p %{glibc_sysroot}%{_prefix}/lib/debug%{_libdir}
-cp -a %{glibc_sysroot}%{_libdir}/*.a \
- %{glibc_sysroot}%{_prefix}/lib/debug%{_libdir}/
-rm -f %{glibc_sysroot}%{_prefix}/lib/debug%{_libdir}/*_p.a
-%endif
-
# Remove any zoneinfo files; they are maintained by tzdata.
rm -rf %{glibc_sysroot}%{_prefix}/share/zoneinfo
@@ -1586,11 +1522,6 @@ ar cr %{glibc_sysroot}%{_prefix}/%{_lib}/libpthread_nonshared.a
# - File list with the .so symbolic links for NSS packages.
# * compat-libpthread-nonshared.filelist.
# - File list for compat-libpthread-nonshared subpackage.
-# * debuginfo.filelist
-# - Files for the glibc debuginfo package.
-# * debuginfocommon.filelist
-# - Files for the glibc common debuginfo package.
-#
# Create the main file lists. This way we can append to any one of them later
# wihtout having to create it. Note these are removed at the start of the
@@ -1609,8 +1540,6 @@ touch nss_db.filelist
touch nss_hesiod.filelist
touch nss-devel.filelist
touch compat-libpthread-nonshared.filelist
-touch debuginfo.filelist
-touch debuginfocommon.filelist
###############################################################################
# Master file list, excluding a few things.
@@ -1873,99 +1802,6 @@ echo "%{_prefix}/libexec/glibc-benchtests/validate_benchout.py*" >> benchtests.f
###############################################################################
echo "%{_libdir}/libpthread_nonshared.a" >> compat-libpthread-nonshared.filelist
-###############################################################################
-# glibc-debuginfocommon, and glibc-debuginfo
-###############################################################################
-
-%if 0%{?_enable_debug_packages}
-find_debuginfo_args='--strict-build-id -g -i'
-%ifarch %{debuginfocommonarches}
-find_debuginfo_args="$find_debuginfo_args \
- -l common.filelist \
- -l utils.filelist \
- -l nscd.filelist \
- -p '.*/(sbin|libexec)/.*' \
- -o debuginfocommon.filelist \
- -l nss_db.filelist -l nss_hesiod.filelist \
- -l libnsl.filelist -l glibc.filelist \
-%if %{with benchtests}
- -l benchtests.filelist
-%endif
- "
-%endif
-
-/usr/lib/rpm/find-debuginfo.sh $find_debuginfo_args -o debuginfo.filelist
-
-# List all of the *.a archives in the debug directory.
-list_debug_archives()
-{
- local dir=%{_prefix}/lib/debug%{_libdir}
- find %{glibc_sysroot}$dir -name "*.a" -printf "$dir/%%P\n"
-}
-
-%ifarch %{debuginfocommonarches}
-
-# Remove the source files from the common package debuginfo.
-sed -i '\#^%{glibc_sysroot}%{_prefix}/src/debug/#d' debuginfocommon.filelist
-
-# Create a list of all of the source files we copied to the debug directory.
-find %{glibc_sysroot}%{_prefix}/src/debug \
- \( -type d -printf '%%%%dir ' \) , \
- -printf '%{_prefix}/src/debug/%%P\n' > debuginfocommon.sources
-
-%ifarch %{biarcharches}
-
-# Add the source files to the core debuginfo package.
-cat debuginfocommon.sources >> debuginfo.filelist
-
-%else
-
-%ifarch %{ix86}
-%define basearch i686
-%endif
-%ifarch sparc sparcv9
-%define basearch sparc
-%endif
-
-# The auxarches get only these few source files.
-auxarches_debugsources=\
-'/(generic|linux|%{basearch}|nptl(_db)?)/|/%{glibcsrcdir}/build|/dl-osinfo\.h'
-
-# Place the source files into the core debuginfo pakcage.
-egrep "$auxarches_debugsources" debuginfocommon.sources >> debuginfo.filelist
-
-# Remove the source files from the common debuginfo package.
-egrep -v "$auxarches_debugsources" \
- debuginfocommon.sources >> debuginfocommon.filelist
-
-%endif
-
-# Add the list of *.a archives in the debug directory to
-# the common debuginfo package.
-list_debug_archives >> debuginfocommon.filelist
-
-%endif
-
-# Remove some common directories from the common package debuginfo so that we
-# don't end up owning them.
-exclude_common_dirs()
-{
- exclude_dirs="%{_prefix}/src/debug"
- exclude_dirs="$exclude_dirs $(echo %{_prefix}/lib/debug{,/%{_lib},/bin,/sbin})"
- exclude_dirs="$exclude_dirs $(echo %{_prefix}/lib/debug%{_prefix}{,/%{_lib},/libexec,/bin,/sbin})"
-
- for d in $(echo $exclude_dirs | sed 's/ /\n/g'); do
- sed -i "\|^%%dir $d/\?$|d" $1
- done
-}
-
-%ifarch %{debuginfocommonarches}
-exclude_common_dirs debuginfocommon.filelist
-%endif
-exclude_common_dirs debuginfo.filelist
-
-%endif
-
##############################################################################
# Run the glibc testsuite
##############################################################################
@@ -2327,13 +2163,6 @@ fi
%files -f libnsl.filelist -n libnsl
/%{_lib}/libnsl.so.1
-%if 0%{?_enable_debug_packages}
-%files debuginfo -f debuginfo.filelist
-%ifarch %{debuginfocommonarches}
-%files debuginfo-common -f debuginfocommon.filelist
-%endif
-%endif
-
%if %{with benchtests}
%files benchtests -f benchtests.filelist
%endif
diff --git a/wrap-find-debuginfo.sh b/wrap-find-debuginfo.sh
new file mode 100644
index 0000000..5ace7e6
--- /dev/null
+++ b/wrap-find-debuginfo.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+# Wrapper script for find-debuginfo.sh
+#
+# Usage:
+# wrap-find-debuginfo.sh LDSO-PATH SCRIPT-PATH SCRIPT-ARGS...
+#
+# The wrapper saves the original versions of the file at LDSO-PATH,
+# invokes SCRIPT-PATH with SCRIPT-ARGS, and then restores the
+# LDSO-PATH file. As a result, LDSO-PATH has unchanged debuginfo even
+# after debuginfo extraction.
+
+set -ex
+
+ldso_tmp="$(mktemp)"
+
+cleanup () {
+ rm -f "$ldso_tmp"
+}
+trap cleanup 0
+
+ldso_path="$1"
+shift
+script_path="$1"
+shift
+
+# Preserve the original file.
+cp "$ldso_path" "$ldso_tmp"
+
+# Run the debuginfo extraction.
+"$script_path" "$@"
+
+# Restore the original file.
+cp "$ldso_tmp" "$ldso_path"
+
+# Reduce the size of notes. Primarily for annobin.
+objcopy --merge-notes "$ldso_path"
+
+# Rewrite the source file paths to match the extracted locations.
+# First compute the arguments for invoking debugedit. See
+# find-debuginfo.sh.
+debug_dest_name="/usr/src/debug"
+last_arg=
+while true ; do
+ arg="$1"
+ shift || break
+ case "$arg" in
+ (--unique-debug-src-base)
+ debug_dest_name="/usr/src/debug/$1"
+ shift
+ ;;
+ (-*)
+ ;;
+ (*)
+ last_arg="$arg"
+ ;;
+ esac
+done
+debug_base_name=${last_arg:-$RPM_BUILD_ROOT}
+/usr/lib/rpm/debugedit -b "$debug_base_name" -d "$debug_dest_name" -n \
+ $ldso_path
+
+# Apply single-file DWARF optimization.
+dwz $ldso_path
2 years, 11 months
[Report] Packages Restricting Arches
by root
List of packages currently excluding arches (1974)
===========================================
- 0ad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- 90-Second-Portraits
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- GoldenCheetah
ExclusiveArch: %{qt5_qtwebengine_arches}
- GtkAda
ExclusiveArch: %{GPRbuild_arches}
- GtkAda3
ExclusiveArch: %{GPRbuild_arches}
- OpenImageIO
ExclusiveArch: x86_64 ppc64le
- PragmARC
ExclusiveArch: %{GPRbuild_arches}
- R-V8
ExclusiveArch: %{nodejs_arches}
- RdRand
ExclusiveArch: %{ix86} x86_64
- RediSearch
ExclusiveArch: x86_64
- SLOF
ExclusiveArch: ppc64le
- YafaRay
ExclusiveArch: %{ix86} x86_64
- aboot
ExclusiveArch: alpha
- accel-config
ExclusiveArch: %{ix86} x86_64
- acpid
ExclusiveArch: ia64 x86_64 %{ix86} %{arm} aarch64
- ahven
ExclusiveArch: %{GPRbuild_arches}
- algobox
ExclusiveArch: %{qt5_qtwebengine_arches}
- alleyoop
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x %{arm} aarch64
- american-fuzzy-lop
ExclusiveArch: %{ix86} x86_64
- anet
ExclusiveArch: %{GPRbuild_arches}
- anki
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- apmd
ExclusiveArch: %{ix86}
- appstream-generator
ExclusiveArch: %{ldc_arches}
- arduino
ExclusiveArch: %{go_arches}
- arm-trusted-firmware
ExclusiveArch: aarch64
- aunit
ExclusiveArch: %GPRbuild_arches
- avgtime
ExclusiveArch: %{ldc_arches}
- aws
ExclusiveArch: %GPRbuild_arches
- bcal
ExclusiveArch: x86_64 aarch64 ia64 ppc64 ppc64le s390x
- bcc
ExclusiveArch: x86_64 %{power64} aarch64 s390x armv7hl
- bcm283x-firmware
ExclusiveArch: %{arm} aarch64
- berusky2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{mips}
- biosdevname
ExclusiveArch: %{ix86} x86_64
- blender
ExclusiveArch: x86_64 aarch64 ppc64le
- bless
ExclusiveArch: %mono_arches
- bpftrace
ExclusiveArch: x86_64 %{power64} aarch64 s390x
- calamares
ExclusiveArch: %{ix86} x86_64
- calibre
ExclusiveArch: %{qt5_qtwebengine_arches}
- ccdciel
ExclusiveArch: %{fpc_arches}
- cdcollect
ExclusiveArch: %{mono_arches}
- ceph
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- chromium
ExclusiveArch: x86_64 i686
ExclusiveArch: x86_64 i686 aarch64
- cjdns
ExclusiveArch: %{nodejs_arches}
- clevis-pin-tpm2
ExclusiveArch: %{rust_arches}
- cmospwd
ExclusiveArch: %{ix86} x86_64
- cmrt
ExclusiveArch: %{ix86} x86_64 ia64
- coffee-script
ExclusiveArch: %{nodejs_arches} noarch
- colorful
ExclusiveArch: %{fpc_arches}
- cpu-x
ExclusiveArch: i686 x86_64
- cpufetch
ExclusiveArch: %{arm} aarch64 x86_64
- cpuid
ExclusiveArch: %{ix86} x86_64
- cqrlog
ExclusiveArch: %{fpc_arches}
- crash
ExclusiveArch: %{ix86} ia64 x86_64 ppc ppc64 s390 s390x %{arm} aarch64 ppc64le
- crash-gcore-command
ExclusiveArch: aarch64 ppc64le x86_64
- crash-trace-command
ExclusiveArch: aarch64 ppc64le s390x x86_64
- criu
ExclusiveArch: x86_64 %{arm} ppc64le aarch64 s390x
- cryptlib
ExclusiveArch: x86_64 %{ix86} aarch64 ppc64 ppc64le
- cryptobone
ExclusiveArch: x86_64 %{ix86} ppc64 ppc64le aarch64
- daq
ExclusiveArch: x86_64 aarch64
- darktable
ExclusiveArch: x86_64 aarch64
ExclusiveArch: x86_64 ppc64le
- dbus-parsec
ExclusiveArch: %{rust_arches}
- dbus-sharp
ExclusiveArch: %mono_arches
- dbus-sharp-glib
ExclusiveArch: %mono_arches
- dbxtool
ExclusiveArch: i386 x86_64 aarch64
- deepin-daemon
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- deepin-desktop-schemas
ExclusiveArch: %{go_arches}
- dlm
ExclusiveArch: i686 x86_64
- dmidecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- dmtcp
ExclusiveArch: x86_64 aarch64
- docker-distribution
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- dolphin-emu
ExclusiveArch: x86_64 aarch64 ppc64le
- dotnet-build-reference-packages
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- dotnet3.1
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- dotnet5.0
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- dotnet5.0-build-reference-packages
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- doublecmd
ExclusiveArch: %{ix86} x86_64
- dpdk
ExclusiveArch: x86_64 i686 aarch64 ppc64le
- dssi-vst
ExclusiveArch: %{ix86} x86_64
- dyninst
ExclusiveArch: %{ix86} x86_64 ppc64le aarch64
- e3
ExclusiveArch: %{ix86} x86_64
- edk2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
ExclusiveArch: x86_64 aarch64
- efibootmgr
ExclusiveArch: %{efi}
- efifs
ExclusiveArch: %{efi}
- efitools
ExclusiveArch: %{efi}
- efivar
ExclusiveArch: %{efi}
- elk
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86} aarch64 %{arm} %{power64}
- emacs-slime
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- embree
ExclusiveArch: x86_64
- enki
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- envytools
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- eric
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- eth-tools
ExclusiveArch: x86_64
- extlinux-bootloader
ExclusiveArch: %{arm} aarch64
- fcitx-libpinyin
ExclusiveArch: %{qt5_qtwebengine_arches}
- fedora-dockerfiles
ExclusiveArch: %{go_arches}
- fes
ExclusiveArch: %{ix86} x86_64
- flannel
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- florist
ExclusiveArch: %{GPRbuild_arches}
- fpc
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64 ppc64le
- frescobaldi
ExclusiveArch: %{qt5_qtwebengine_arches}
- frysk
ExclusiveArch: %{ix86} x86_64 ppc64
- fwts
ExclusiveArch: x86_64 %{arm} aarch64 s390x riscv64 %{power64}
- fwupd-efi
ExclusiveArch: x86_64 aarch64
- fx
ExclusiveArch: %{nodejs_arches} noarch
- ga
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- gbrainy
ExclusiveArch: %mono_arches
- gdata-sharp
ExclusiveArch: %mono_arches
- gdb-exploitable
ExclusiveArch: x86_64 i386
ExclusiveArch: x86_64 noarch
- gearhead1
ExclusiveArch: %{fpc_arches}
- gela-asis
ExclusiveArch: %GPRbuild_arches
- ghdl
ExclusiveArch: %{GNAT_arches}
- ghostwriter
ExclusiveArch: %{qt5_qtwebengine_arches}
- gio-sharp
ExclusiveArch: %mono_arches
- gir-to-d
ExclusiveArch: %{ldc_arches}
- git-octopus
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- gitqlient
ExclusiveArch: %{qt5_qtwebengine_arches}
- giver
ExclusiveArch: %{mono_arches}
- gkeyfile-sharp
ExclusiveArch: %mono_arches
- glibc32
ExclusiveArch: x86_64
- glibd
ExclusiveArch: %{ldc_arches}
- gmqcc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- gnatcoll
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-bindings
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-db
ExclusiveArch: %{GPRbuild_arches}
- gnome-boxes
ExclusiveArch: x86_64
- gnome-desktop-sharp
ExclusiveArch: %mono_arches
- gnome-do
ExclusiveArch: %mono_arches
- gnome-guitar
ExclusiveArch: %{mono_arches}
- gnome-keyring-sharp
ExclusiveArch: %mono_arches
- gnome-rdp
ExclusiveArch: %{mono_arches}
- gnome-sharp
ExclusiveArch: %mono_arches
- gnome-subtitles
ExclusiveArch: %mono_arches
- gnu-efi
ExclusiveArch: %{efi}
- go-bindata
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- go-compilers
ExclusiveArch: %{go_arches}
- go-rpm-macros
ExclusiveArch: %{golang_arches} %{gccgo_arches}
- godep
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang
ExclusiveArch: %{golang_arches}
- gomtree
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- gotun
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: x86_64
- goverlay
ExclusiveArch: %{fpc_arches}
- gprbuild
ExclusiveArch: %{GPRbuild_arches} %{bootstrap_arch}
- gprolog
ExclusiveArch: x86_64 %{ix86} ppc alpha
- grafana
ExclusiveArch: %{grafana_arches}
- grafana-pcp
ExclusiveArch: %{grafanapcp_arches}
- gtk-sharp-beans
ExclusiveArch: %mono_arches
- gtk-sharp2
ExclusiveArch: %mono_arches
- gtk-sharp3
ExclusiveArch: %{mono_arches}
- gtkd
ExclusiveArch: %{ldc_arches}
- gudev-sharp
ExclusiveArch: %mono_arches
- guestfs-tools
ExclusiveArch: %{kernel_arches}
- hedgewars
ExclusiveArch: %{fpc_arches}
- hsakmt
ExclusiveArch: x86_64 aarch64
- hyena
ExclusiveArch: %{mono_arches}
- hyperscan
ExclusiveArch: x86_64
- hyperv-daemons
ExclusiveArch: i686 x86_64
- i3status-rs
ExclusiveArch: %{rust_arches}
- icaro
ExclusiveArch: %{ix86} x86_64 noarch
- ignition
ExclusiveArch: %{go_arches}
- imvirt
ExclusiveArch: %{ix86} x86_64 ia64
- indistarter
ExclusiveArch: %{fpc_arches}
- infinipath-psm
ExclusiveArch: x86_64
- intel-cmt-cat
ExclusiveArch: x86_64 i686 i586
ExclusiveArch: x86_64 i686 i586
- intel-gmmlib
ExclusiveArch: x86_64 i686
- intel-ipp-crypto-mb
ExclusiveArch: x86_64
ExclusiveArch: x86_64
- intel-ipsec-mb
ExclusiveArch: x86_64
ExclusiveArch: x86_64
- intel-mediasdk
ExclusiveArch: x86_64
- intel-undervolt
ExclusiveArch: i386 x86_64
- ioport
ExclusiveArch: %{ix86} x86_64
- ipmctl
ExclusiveArch: x86_64
- ipw2100-firmware
ExclusiveArch: noarch i386 x86_64
- ipw2200-firmware
ExclusiveArch: noarch i386 x86_64
- ispc
ExclusiveArch: x86_64 aarch64
- iucode-tool
ExclusiveArch: %{ix86} x86_64
- iyfct
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- java-1.8.0-openjdk-aarch32
ExclusiveArch: %{arm}
- keepass
ExclusiveArch: %{mono_arches}
- kernel
ExclusiveArch: x86_64 s390x %{arm} aarch64 ppc64le
ExclusiveArch: noarch i386 i686 x86_64 s390x %{arm} aarch64 ppc64le
- keyring-ima-signer
ExclusiveArch: %{rust_arches}
- kf5-akonadi-search
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-audiocd-kio
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kalarmcal
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kblog
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kcalendarcore
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kcalendarutils
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kitinerary
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kmailtransport
ExclusiveArch: x86_64 %{arm}
- kf5-ktnef
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-libkdcraw
ExclusiveArch: x86_64 ppc64le %{arm}
- kicad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- kiwix-desktop
ExclusiveArch: %{qt5_qtwebengine_arches}
- knot-resolver
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- knotes
ExclusiveArch: x86_64 %{arm}
- kompose
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 s390x
- kubernetes
ExclusiveArch: x86_64 aarch64 ppc64le s390x %{arm}
- lazarus
ExclusiveArch: %{fpc_arches}
- lazpaint
ExclusiveArch: %{fpc_arches}
- ldc
ExclusiveArch: %{ldc_arches}
- libbsr
ExclusiveArch: %{power64}
- libclc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{power64} s390x
- libcxl
ExclusiveArch: %{power64}
- libdfp
ExclusiveArch: ppc ppc64 ppc64le s390 s390x x86_64
- libdispatch
ExclusiveArch: x86_64 aarch64
- libguestfs
ExclusiveArch: %{kernel_arches}
- libica
ExclusiveArch: s390 s390x
- libipt
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- libnxz
ExclusiveArch: ppc64le
- libocxl
ExclusiveArch: ppc64le
- libpmemobj-cpp
ExclusiveArch: x86_64
- libpsm2
ExclusiveArch: x86_64
- libquentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- libretro-desmume2015
ExclusiveArch: i686 x86_64
- librtas
ExclusiveArch: %{power64}
- libservicelog
ExclusiveArch: ppc %{power64}
- libsmbios
ExclusiveArch: x86_64 %{ix86}
- libunwind
ExclusiveArch: %{arm} aarch64 hppa ia64 mips ppc %{power64} s390x %{ix86} x86_64
- libva-intel-hybrid-driver
ExclusiveArch: %{ix86} x86_64 ia64
- libvma
ExclusiveArch: x86_64 ppc64le ppc64 aarch64
- libvmi
ExclusiveArch: x86_64
- libvpd
ExclusiveArch: %{power64}
- libxsmm
ExclusiveArch: x86_64
- libzfcphbaapi
ExclusiveArch: s390 s390x
- lightdm
ExclusiveArch: x86_64 ppc64le
- log4net
ExclusiveArch: %mono_arches
- lrmi
ExclusiveArch: %{ix86}
- lsvpd
ExclusiveArch: %{power64}
- luajit
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 s390x ppc64le
- luxcorerender
ExclusiveArch: x86_64
- mactel-boot
ExclusiveArch: x86_64
- manifest-tool
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- mantle
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- marked
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- matreshka
ExclusiveArch: %GPRbuild_arches
- maxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- mbpfan
ExclusiveArch: x86_64
- mcelog
ExclusiveArch: i686 x86_64
- mediaconch
ExclusiveArch: %{qt5_qtwebengine_arches}
- mellowplayer
ExclusiveArch: %{qt5_qtwebengine_arches}
- memkind
ExclusiveArch: x86_64 ppc64 ppc64le s390x aarch64
- memtest86+
ExclusiveArch: %{ix86} x86_64
- mesos
ExclusiveArch: x86_64
- microcode_ctl
ExclusiveArch: %{ix86} x86_64
- micropython
ExclusiveArch: %{arm} %{ix86} x86_64
- mine_detector
ExclusiveArch: %{GPRbuild_arches}
- minetest
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- mingw-wine-gecko
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- mirrorlist-server
ExclusiveArch: %{rust_arches}
- mkbootdisk
ExclusiveArch: %{ix86} sparc sparc64 x86_64
- mod_mono
ExclusiveArch: %mono_arches
- module-build-service
ExclusiveArch: %{ix86} x86_64 noarch
- mokutil
ExclusiveArch: %{ix86} x86_64 aarch64 %{arm}
- mono
ExclusiveArch: %mono_arches
- mono-addins
ExclusiveArch: %mono_arches
- mono-basic
ExclusiveArch: %{mono_arches}
- mono-bouncycastle
ExclusiveArch: %mono_arches
- mono-cecil
ExclusiveArch: %mono_arches
- mono-cecil-flowanalysis
ExclusiveArch: %mono_arches
- mono-reflection
ExclusiveArch: %mono_arches
- mono-tools
ExclusiveArch: %mono_arches
- mono-zeroconf
ExclusiveArch: %mono_arches
- monobristol
ExclusiveArch: %{mono_arches}
- monodevelop
ExclusiveArch: %mono_arches
- monodevelop-debugger-gdb
ExclusiveArch: %{mono_arches}
- monosim
ExclusiveArch: %mono_arches
- mrrescue
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- msr-tools
ExclusiveArch: %{ix86} x86_64
- mustache-d
ExclusiveArch: %{ldc_arches}
- mysql-connector-net
ExclusiveArch: %{mono_arches}
- nant
ExclusiveArch: %mono_arches
- nativejit
ExclusiveArch: x86_64
- nbc
ExclusiveArch: %{fpc_arches}
- nbdkit
ExclusiveArch: x86_64
- ndesk-dbus
ExclusiveArch: %{mono_arches}
- ndesk-dbus-glib
ExclusiveArch: %{mono_arches}
- newsflash
ExclusiveArch: %{rust_arches}
- newtonsoft-json
ExclusiveArch: %{mono_arches}
- nispor
ExclusiveArch: %{rust_arches}
- nodejs
ExclusiveArch: %{nodejs_arches}
- nodejs-acorn-object-spread
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-backbone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-buble
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-colors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-generic-pool
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-linefix
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-nodemon
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-packaging
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-replace-require-self
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-supervisor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-svgo
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tape
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-typescript
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-underscore
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- notify-sharp
ExclusiveArch: %{mono_arches}
- notify-sharp3
ExclusiveArch: %{mono_arches}
- npm-name-cli
ExclusiveArch: %{nodejs_arches} noarch
- nuget
ExclusiveArch: %{mono_arches}
- numatop
ExclusiveArch: x86_64 ppc64le
- nunit
ExclusiveArch: %{mono_arches}
- nunit2
ExclusiveArch: %{mono_arches}
- nvml
ExclusiveArch: x86_64 ppc64le
- nwchem
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- obs-service-rust2rpm
ExclusiveArch: %{rust_arches} noarch
- oci-kvm-hook
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- oci-seccomp-bpf-hook
ExclusiveArch: x86_64 %%{power64} aarch64 s390x armv7hl
- oci-umount
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x %{mips}
- oidn
ExclusiveArch: x86_64
- olpc-kbdshim
ExclusiveArch: %{ix86} %{arm}
- olpc-netutils
ExclusiveArch: %{ix86} %{arm}
- olpc-utils
ExclusiveArch: %{ix86} %{arm}
- onednn
ExclusiveArch: x86_64 aarch64 ppc64le
- onedrive
ExclusiveArch: %{ldc_arches}
- opae
ExclusiveArch: x86_64
- opal-prd
ExclusiveArch: ppc64le
- open-vm-tools
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64
- openblas
ExclusiveArch: %{openblas_arches}
- openjfx
ExclusiveArch: x86_64
- openjfx8
ExclusiveArch: x86_64
- openlibm
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 %{power64}
- openni
ExclusiveArch: %{ix86} x86_64 %{arm}
- openni-primesense
ExclusiveArch: %{ix86} x86_64 %{arm}
- openshadinglanguage
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- openssl-ibmca
ExclusiveArch: s390 s390x
- origin
ExclusiveArch: %{go_arches}
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- orion
ExclusiveArch: %{qt5_qtwebengine_arches}
- orthorobot
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- paflib
ExclusiveArch: ppc %{power64}
- parsec
ExclusiveArch: %{rust_arches}
- parsec-tool
ExclusiveArch: %{rust_arches}
- pcc
ExclusiveArch: %{ix86} x86_64
- pcmciautils
ExclusiveArch: %{ix86} x86_64 ia64 ppc ppc64 %{arm}
- pdbg
ExclusiveArch: ppc64le
- pdfmod
ExclusiveArch: %mono_arches
- perl-Dumbbench
ExclusiveArch: %{ix86} x86_64 noarch
- perl-Parse-DMIDecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- pesign
ExclusiveArch: %{ix86} x86_64 ia64 aarch64 %{arm}
- pesign-test-app
ExclusiveArch: x86_64
- pinta
ExclusiveArch: %mono_arches
- pioneer
ExclusiveArch: %{ix86} x86_64
- playonlinux
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- pmdk-convert
ExclusiveArch: x86_64
- pmemkv
ExclusiveArch: x86_64
- poppler-sharp
ExclusiveArch: %mono_arches
- popub
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- powerpc-utils
ExclusiveArch: ppc %{power64}
- ppc64-diag
ExclusiveArch: ppc %{power64}
- psi-plus
ExclusiveArch: %{qt5_qtwebengine_arches}
- pveclib
ExclusiveArch: ppc %{power64}
- pvs-sbcl
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- pyqtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- python-cryptography
ExclusiveArch: %{rust_arches}
- python-etcd
ExclusiveArch: noarch %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- python-healpy
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-javabridge
ExclusiveArch: i686 x86_64
- python-openoffice
ExclusiveArch: noarch x86_64
- python-pymoc
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-rpi-gpio
ExclusiveArch: %{arm} aarch64
- python-setuptools-rust
ExclusiveArch: %{rust_arches}
- q4wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- qcint
ExclusiveArch: x86_64
- qclib
ExclusiveArch: s390 s390x
- qemu-sanity-check
ExclusiveArch: %{kernel_arches}
- qevercloud
ExclusiveArch: %{qt5_qtwebengine_arches}
- qmapshack
ExclusiveArch: %{qt5_qtwebengine_arches}
- qt4pas
ExclusiveArch: %{fpc_arches}
- qt5-qtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- quantum-espresso
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86}
- quentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- rear
ExclusiveArch: %ix86 x86_64 ppc ppc64 ppc64le ia64
- redhat-lsb
ExclusiveArch: %{ix86} ia64 x86_64 ppc ppc64 s390 s390x %{arm} aarch64 ppc64le
- renderdoc
ExclusiveArch: x86_64
- reptyr
ExclusiveArch: %{ix86} x86_64 %{arm}
- rescene
ExclusiveArch: %{mono_arches}
- restsharp
ExclusiveArch: %{mono_arches}
- rhythmbox-alternative-toolbar
ExclusiveArch: %{ix86} %{arm} x86_64 ppc64 ppc64le
- rmd
ExclusiveArch: %{ix86} x86_64
- rocm-runtime
ExclusiveArch: x86_64 aarch64
- rocminfo
ExclusiveArch: x86_64 aarch64
- rpm-ostree
ExclusiveArch: %{rust_arches}
- rr
ExclusiveArch: %{ix86} x86_64
- rssguard
ExclusiveArch: %{qt5_qtwebengine_arches}
- rubygem-childprocess
ExclusiveArch: %{ix86} x86_64 noarch
- runc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le %{mips} s390x
- rust
ExclusiveArch: %{rust_arches}
- rust-ab_glyph_rasterizer
ExclusiveArch: %{rust_arches}
- rust-abomonation
ExclusiveArch: %{rust_arches}
- rust-actix
ExclusiveArch: %{rust_arches}
- rust-actix-codec
ExclusiveArch: %{rust_arches}
- rust-actix-connect
ExclusiveArch: %{rust_arches}
- rust-actix-files
ExclusiveArch: %{rust_arches}
- rust-actix-http
ExclusiveArch: %{rust_arches}
- rust-actix-macros
ExclusiveArch: %{rust_arches}
- rust-actix-router
ExclusiveArch: %{rust_arches}
- rust-actix-rt
ExclusiveArch: %{rust_arches}
- rust-actix-server
ExclusiveArch: %{rust_arches}
- rust-actix-server-config
ExclusiveArch: %{rust_arches}
- rust-actix-service
ExclusiveArch: %{rust_arches}
- rust-actix-testing
ExclusiveArch: %{rust_arches}
- rust-actix-threadpool
ExclusiveArch: %{rust_arches}
- rust-actix-tls
ExclusiveArch: %{rust_arches}
- rust-actix-utils
ExclusiveArch: %{rust_arches}
- rust-actix-web
ExclusiveArch: %{rust_arches}
- rust-actix-web-codegen
ExclusiveArch: %{rust_arches}
- rust-actix_derive
ExclusiveArch: %{rust_arches}
- rust-addr2line
ExclusiveArch: %{rust_arches}
- rust-adler
ExclusiveArch: %{rust_arches}
- rust-adler32
ExclusiveArch: %{rust_arches}
- rust-aead
ExclusiveArch: %{rust_arches}
- rust-aes
ExclusiveArch: %{rust_arches}
- rust-aes-gcm
ExclusiveArch: %{rust_arches}
- rust-aes-soft
ExclusiveArch: %{rust_arches}
- rust-afterburn
ExclusiveArch: %{rust_arches}
- rust-ahash
ExclusiveArch: %{rust_arches}
- rust-ahash0.4
ExclusiveArch: %{rust_arches}
- rust-aho-corasick
ExclusiveArch: %{rust_arches}
- rust-alacritty
ExclusiveArch: %{rust_arches}
- rust-alacritty_config_derive
ExclusiveArch: %{rust_arches}
- rust-alacritty_terminal
ExclusiveArch: %{rust_arches}
- rust-alga
ExclusiveArch: %{rust_arches}
- rust-alga_derive
ExclusiveArch: %{rust_arches}
- rust-alloc-no-stdlib
ExclusiveArch: %{rust_arches}
- rust-alloc-stdlib
ExclusiveArch: %{rust_arches}
- rust-alphanumeric-sort
ExclusiveArch: %{rust_arches}
- rust-ammonia
ExclusiveArch: %{rust_arches}
- rust-andrew
ExclusiveArch: %{rust_arches}
- rust-ansi_colours
ExclusiveArch: %{rust_arches}
- rust-ansi_term
ExclusiveArch: %{rust_arches}
- rust-ansi_term0.11
ExclusiveArch: %{rust_arches}
- rust-antidote
ExclusiveArch: %{rust_arches}
- rust-anyhow
ExclusiveArch: %{rust_arches}
- rust-anymap
ExclusiveArch: %{rust_arches}
- rust-aom-sys
ExclusiveArch: %{rust_arches}
- rust-app_dirs
ExclusiveArch: %{rust_arches}
- rust-approx
ExclusiveArch: %{rust_arches}
- rust-arbitrary
ExclusiveArch: %{rust_arches}
- rust-arbitrary0.4
ExclusiveArch: %{rust_arches}
- rust-arc-swap
ExclusiveArch: %{rust_arches}
- rust-arg_enum_proc_macro
ExclusiveArch: %{rust_arches}
- rust-argparse
ExclusiveArch: %{rust_arches}
- rust-array-init
ExclusiveArch: %{rust_arches}
- rust-arraydeque
ExclusiveArch: %{rust_arches}
- rust-arrayref
ExclusiveArch: %{rust_arches}
- rust-arrayvec
ExclusiveArch: %{rust_arches}
- rust-article_scraper
ExclusiveArch: %{rust_arches}
- rust-ascii
ExclusiveArch: %{rust_arches}
- rust-ascii-canvas
ExclusiveArch: %{rust_arches}
- rust-askalono
ExclusiveArch: %{rust_arches}
- rust-askalono-cli
ExclusiveArch: %{rust_arches}
- rust-askama
ExclusiveArch: %{rust_arches}
- rust-askama_derive
ExclusiveArch: %{rust_arches}
- rust-askama_escape
ExclusiveArch: %{rust_arches}
- rust-askama_shared
ExclusiveArch: %{rust_arches}
- rust-assert-json-diff
ExclusiveArch: %{rust_arches}
- rust-assert_approx_eq
ExclusiveArch: %{rust_arches}
- rust-assert_cli
ExclusiveArch: %{rust_arches}
- rust-assert_cmd
ExclusiveArch: %{rust_arches}
- rust-assert_fs
ExclusiveArch: %{rust_arches}
- rust-assert_matches
ExclusiveArch: %{rust_arches}
- rust-assign
ExclusiveArch: %{rust_arches}
- rust-async-attributes
ExclusiveArch: %{rust_arches}
- rust-async-compression
ExclusiveArch: %{rust_arches}
- rust-async-io
ExclusiveArch: %{rust_arches}
- rust-async-task
ExclusiveArch: %{rust_arches}
- rust-async-trait
ExclusiveArch: %{rust_arches}
- rust-asyncgit
ExclusiveArch: %{rust_arches}
- rust-atk
ExclusiveArch: %{rust_arches}
- rust-atk-sys
ExclusiveArch: %{rust_arches}
- rust-atom
ExclusiveArch: %{rust_arches}
- rust-atomicwrites
ExclusiveArch: %{rust_arches}
- rust-attohttpc
ExclusiveArch: %{rust_arches}
- rust-atty
ExclusiveArch: %{rust_arches}
- rust-autocfg
ExclusiveArch: %{rust_arches}
- rust-av-metrics
ExclusiveArch: %{rust_arches}
- rust-average
ExclusiveArch: %{rust_arches}
- rust-awc
ExclusiveArch: %{rust_arches}
- rust-backtrace
ExclusiveArch: %{rust_arches}
- rust-backtrace-sys
ExclusiveArch: %{rust_arches}
- rust-base100
ExclusiveArch: %{rust_arches}
- rust-base64
ExclusiveArch: %{rust_arches}
- rust-base64-0.10
ExclusiveArch: %{rust_arches}
- rust-base64-0.11
ExclusiveArch: %{rust_arches}
- rust-base64_0.12
ExclusiveArch: %{rust_arches}
- rust-bat
ExclusiveArch: %{rust_arches}
- rust-battery
ExclusiveArch: %{rust_arches}
- rust-bencher
ExclusiveArch: %{rust_arches}
- rust-better-panic
ExclusiveArch: %{rust_arches}
- rust-bincode
ExclusiveArch: %{rust_arches}
- rust-bincode0.8
ExclusiveArch: %{rust_arches}
- rust-bindgen
ExclusiveArch: %{rust_arches}
- rust-binfarce
ExclusiveArch: %{rust_arches}
- rust-biscuit
ExclusiveArch: %{rust_arches}
- rust-bit-set
ExclusiveArch: %{rust_arches}
- rust-bit-vec
ExclusiveArch: %{rust_arches}
- rust-bitfield
ExclusiveArch: %{rust_arches}
- rust-bitflags
ExclusiveArch: %{rust_arches}
- rust-bitmaps
ExclusiveArch: %{rust_arches}
- rust-bitstream-io
ExclusiveArch: %{rust_arches}
- rust-bitvec
ExclusiveArch: %{rust_arches}
- rust-blake2
ExclusiveArch: %{rust_arches}
- rust-blobby
ExclusiveArch: %{rust_arches}
- rust-blobby0.1
ExclusiveArch: %{rust_arches}
- rust-block-buffer
ExclusiveArch: %{rust_arches}
- rust-block-buffer0.7
ExclusiveArch: %{rust_arches}
- rust-block-modes
ExclusiveArch: %{rust_arches}
- rust-block-padding
ExclusiveArch: %{rust_arches}
- rust-blsctl
ExclusiveArch: %{rust_arches}
- rust-bodhi
ExclusiveArch: %{rust_arches}
- rust-bodhi-cli
ExclusiveArch: %{rust_arches}
- rust-bootupd
ExclusiveArch: x86_64 aarch64
- rust-box_drawing
ExclusiveArch: %{rust_arches}
- rust-brev
ExclusiveArch: %{rust_arches}
- rust-brotli
ExclusiveArch: %{rust_arches}
- rust-brotli-decompressor
ExclusiveArch: %{rust_arches}
- rust-brotli-sys
ExclusiveArch: %{rust_arches}
- rust-brotli2
ExclusiveArch: %{rust_arches}
- rust-bstr
ExclusiveArch: %{rust_arches}
- rust-buf-min
ExclusiveArch: %{rust_arches}
- rust-buf_redux
ExclusiveArch: %{rust_arches}
- rust-buffered-reader
ExclusiveArch: %{rust_arches}
- rust-bufsize
ExclusiveArch: %{rust_arches}
- rust-bufstream
ExclusiveArch: %{rust_arches}
- rust-build-env
ExclusiveArch: %{rust_arches}
- rust-build_const
ExclusiveArch: %{rust_arches}
- rust-bumpalo
ExclusiveArch: %{rust_arches}
- rust-byte-tools
ExclusiveArch: %{rust_arches}
- rust-byte-unit
ExclusiveArch: %{rust_arches}
- rust-byte-unit3
ExclusiveArch: %{rust_arches}
- rust-bytecount
ExclusiveArch: %{rust_arches}
- rust-bytelines
ExclusiveArch: %{rust_arches}
- rust-bytemuck
ExclusiveArch: %{rust_arches}
- rust-bytemuck_derive
ExclusiveArch: %{rust_arches}
- rust-byteorder
ExclusiveArch: %{rust_arches}
- rust-bytes
ExclusiveArch: %{rust_arches}
- rust-bytes0.4
ExclusiveArch: %{rust_arches}
- rust-bytes0.5
ExclusiveArch: %{rust_arches}
- rust-bytes0.6
ExclusiveArch: %{rust_arches}
- rust-bytesize
ExclusiveArch: %{rust_arches}
- rust-bytestring
ExclusiveArch: %{rust_arches}
- rust-bzip2
ExclusiveArch: %{rust_arches}
- rust-bzip2-sys
ExclusiveArch: %{rust_arches}
- rust-c_vec
ExclusiveArch: %{rust_arches}
- rust-cache-padded
ExclusiveArch: %{rust_arches}
- rust-cairo-rs
ExclusiveArch: %{rust_arches}
- rust-cairo-sys-rs
ExclusiveArch: %{rust_arches}
- rust-calloop
ExclusiveArch: %{rust_arches}
- rust-capnp
ExclusiveArch: %{rust_arches}
- rust-capnp-futures
ExclusiveArch: %{rust_arches}
- rust-capnp-rpc
ExclusiveArch: %{rust_arches}
- rust-caps
ExclusiveArch: %{rust_arches}
- rust-cargo
ExclusiveArch: %{rust_arches}
- rust-cargo-bloat
ExclusiveArch: %{rust_arches}
- rust-cargo-c
ExclusiveArch: %{rust_arches}
- rust-cargo-husky
ExclusiveArch: %{rust_arches}
- rust-cargo-insta
ExclusiveArch: %{rust_arches}
- rust-cargo-platform
ExclusiveArch: %{rust_arches}
- rust-cargo-readme
ExclusiveArch: %{rust_arches}
- rust-cargo_metadata
ExclusiveArch: %{rust_arches}
- rust-case
ExclusiveArch: %{rust_arches}
- rust-cassowary
ExclusiveArch: %{rust_arches}
- rust-cast
ExclusiveArch: %{rust_arches}
- rust-cbindgen
ExclusiveArch: %{rust_arches}
- rust-cc
ExclusiveArch: %{rust_arches}
- rust-cedarwood
ExclusiveArch: %{rust_arches}
- rust-cexpr
ExclusiveArch: %{rust_arches}
- rust-cfg-if
ExclusiveArch: %{rust_arches}
- rust-cfg-if0.1
ExclusiveArch: %{rust_arches}
- rust-chainerror
ExclusiveArch: %{rust_arches}
- rust-charset
ExclusiveArch: %{rust_arches}
- rust-chbs
ExclusiveArch: %{rust_arches}
- rust-checked_int_cast
ExclusiveArch: %{rust_arches}
- rust-choosier
ExclusiveArch: %{rust_arches}
- rust-chrono
ExclusiveArch: %{rust_arches}
- rust-chrono-humanize
ExclusiveArch: %{rust_arches}
- rust-chrono-tz
ExclusiveArch: %{rust_arches}
- rust-chunked_transfer
ExclusiveArch: %{rust_arches}
- rust-cipher
ExclusiveArch: %{rust_arches}
- rust-clang-sys
ExclusiveArch: %{rust_arches}
- rust-clap
ExclusiveArch: %{rust_arches}
- rust-clap2
ExclusiveArch: %{rust_arches}
- rust-clap_derive
ExclusiveArch: %{rust_arches}
- rust-clicolors-control
ExclusiveArch: %{rust_arches}
- rust-cmake
ExclusiveArch: %{rust_arches}
- rust-codespan-reporting
ExclusiveArch: %{rust_arches}
- rust-codicon
ExclusiveArch: %{rust_arches}
- rust-color-backtrace
ExclusiveArch: %{rust_arches}
- rust-color_quant
ExclusiveArch: %{rust_arches}
- rust-colored
ExclusiveArch: %{rust_arches}
- rust-colored1
ExclusiveArch: %{rust_arches}
- rust-colored_json
ExclusiveArch: %{rust_arches}
- rust-colorful
ExclusiveArch: %{rust_arches}
- rust-compiletest_rs
ExclusiveArch: %{rust_arches}
- rust-comrak
ExclusiveArch: %{rust_arches}
- rust-concurrent-queue
ExclusiveArch: %{rust_arches}
- rust-config
ExclusiveArch: %{rust_arches}
- rust-configparser
ExclusiveArch: %{rust_arches}
- rust-confy
ExclusiveArch: %{rust_arches}
- rust-console
ExclusiveArch: %{rust_arches}
- rust-console0.11
ExclusiveArch: %{rust_arches}
- rust-console0.12
ExclusiveArch: %{rust_arches}
- rust-console0.13
ExclusiveArch: %{rust_arches}
- rust-console0.9
ExclusiveArch: %{rust_arches}
- rust-const-cstr
ExclusiveArch: %{rust_arches}
- rust-const-random
ExclusiveArch: %{rust_arches}
- rust-const-random-macro
ExclusiveArch: %{rust_arches}
- rust-const_fn
ExclusiveArch: %{rust_arches}
- rust-content_inspector
ExclusiveArch: %{rust_arches}
- rust-conv
ExclusiveArch: %{rust_arches}
- rust-cookie
ExclusiveArch: %{rust_arches}
- rust-cookie_store
ExclusiveArch: %{rust_arches}
- rust-copydeps
ExclusiveArch: %{rust_arches}
- rust-copyless
ExclusiveArch: %{rust_arches}
- rust-copypasta
ExclusiveArch: %{rust_arches}
- rust-coreos-installer
ExclusiveArch: %{rust_arches}
- rust-cpio
ExclusiveArch: %{rust_arches}
- rust-cpp_demangle
ExclusiveArch: %{rust_arches}
- rust-cpuid-bool
ExclusiveArch: %{rust_arches}
- rust-cpython
ExclusiveArch: %{rust_arches}
- rust-crates-io
ExclusiveArch: %{rust_arches}
- rust-crc
ExclusiveArch: %{rust_arches}
- rust-crc-any
ExclusiveArch: %{rust_arches}
- rust-crc-core
ExclusiveArch: %{rust_arches}
- rust-crc32fast
ExclusiveArch: %{rust_arches}
- rust-criterion
ExclusiveArch: %{rust_arches}
- rust-criterion-plot
ExclusiveArch: %{rust_arches}
- rust-crossbeam
ExclusiveArch: %{rust_arches}
- rust-crossbeam-channel
ExclusiveArch: %{rust_arches}
- rust-crossbeam-channel0.4
ExclusiveArch: %{rust_arches}
- rust-crossbeam-deque
ExclusiveArch: %{rust_arches}
- rust-crossbeam-deque0.7
ExclusiveArch: %{rust_arches}
- rust-crossbeam-epoch
ExclusiveArch: %{rust_arches}
- rust-crossbeam-epoch0.8
ExclusiveArch: %{rust_arches}
- rust-crossbeam-queue
ExclusiveArch: %{rust_arches}
- rust-crossbeam-queue0.2
ExclusiveArch: %{rust_arches}
- rust-crossbeam-utils
ExclusiveArch: %{rust_arches}
- rust-crossbeam-utils0.7
ExclusiveArch: %{rust_arches}
- rust-crossbeam0.7
ExclusiveArch: %{rust_arches}
- rust-crossfont
ExclusiveArch: %{rust_arches}
- rust-crossterm
ExclusiveArch: %{rust_arches}
- rust-crossterm0.17
ExclusiveArch: %{rust_arches}
- rust-crossterm0.18
ExclusiveArch: %{rust_arches}
- rust-crosstermion
ExclusiveArch: %{rust_arches}
- rust-crunchy
ExclusiveArch: %{rust_arches}
- rust-crypto-hash
ExclusiveArch: %{rust_arches}
- rust-crypto-mac
ExclusiveArch: %{rust_arches}
- rust-crypto-mac0.8
ExclusiveArch: %{rust_arches}
- rust-cryptoki
ExclusiveArch: %{rust_arches}
- rust-cryptoki-sys
ExclusiveArch: %{rust_arches}
- rust-cryptovec
ExclusiveArch: %{rust_arches}
- rust-cssparser
ExclusiveArch: %{rust_arches}
- rust-cssparser-macros
ExclusiveArch: %{rust_arches}
- rust-cstr-argument
ExclusiveArch: %{rust_arches}
- rust-csv
ExclusiveArch: %{rust_arches}
- rust-csv-core
ExclusiveArch: %{rust_arches}
- rust-ctor
ExclusiveArch: %{rust_arches}
- rust-ctr
ExclusiveArch: %{rust_arches}
- rust-ctrlc
ExclusiveArch: %{rust_arches}
- rust-cty
ExclusiveArch: %{rust_arches}
- rust-curl
ExclusiveArch: %{rust_arches}
- rust-curl-sys
ExclusiveArch: %{rust_arches}
- rust-custom_derive
ExclusiveArch: %{rust_arches}
- rust-cxx
ExclusiveArch: %{rust_arches}
- rust-cxx-build
ExclusiveArch: %{rust_arches}
- rust-cxx-gen
ExclusiveArch: %{rust_arches}
- rust-cxxbridge-flags
ExclusiveArch: %{rust_arches}
- rust-cxxbridge-macro
ExclusiveArch: %{rust_arches}
- rust-darling
ExclusiveArch: %{rust_arches}
- rust-darling_core
ExclusiveArch: %{rust_arches}
- rust-darling_macro
ExclusiveArch: %{rust_arches}
- rust-dashmap
ExclusiveArch: %{rust_arches}
- rust-dashmap3
ExclusiveArch: %{rust_arches}
- rust-data-encoding
ExclusiveArch: %{rust_arches}
- rust-data-url
ExclusiveArch: %{rust_arches}
- rust-datetime
ExclusiveArch: %{rust_arches}
- rust-dav1d-sys
ExclusiveArch: %{rust_arches}
- rust-dbus
ExclusiveArch: %{rust_arches}
- rust-dbus-codegen
ExclusiveArch: %{rust_arches}
- rust-dbus-crossroads
ExclusiveArch: %{rust_arches}
- rust-dbus-tokio
ExclusiveArch: %{rust_arches}
- rust-dbus-tree
ExclusiveArch: %{rust_arches}
- rust-dbus0.8
ExclusiveArch: %{rust_arches}
- rust-debug-helper
ExclusiveArch: %{rust_arches}
- rust-decimal
ExclusiveArch: %{rust_arches}
- rust-deflate
ExclusiveArch: %{rust_arches}
- rust-defmac
ExclusiveArch: %{rust_arches}
- rust-delta_e
ExclusiveArch: %{rust_arches}
- rust-derivative
ExclusiveArch: %{rust_arches}
- rust-derive-new
ExclusiveArch: %{rust_arches}
- rust-derive_arbitrary
ExclusiveArch: %{rust_arches}
- rust-derive_arbitrary0.4
ExclusiveArch: %{rust_arches}
- rust-derive_builder
ExclusiveArch: %{rust_arches}
- rust-derive_builder_core
ExclusiveArch: %{rust_arches}
- rust-derive_builder_core0.9
ExclusiveArch: %{rust_arches}
- rust-derive_more
ExclusiveArch: %{rust_arches}
- rust-des
ExclusiveArch: %{rust_arches}
- rust-desed
ExclusiveArch: %{rust_arches}
- rust-deunicode
ExclusiveArch: %{rust_arches}
- rust-devicemapper
ExclusiveArch: %{rust_arches}
- rust-dialoguer
ExclusiveArch: %{rust_arches}
- rust-diesel
ExclusiveArch: %{rust_arches}
- rust-diesel_derives
ExclusiveArch: %{rust_arches}
- rust-diesel_migrations
ExclusiveArch: %{rust_arches}
- rust-diff
ExclusiveArch: %{rust_arches}
- rust-difference
ExclusiveArch: %{rust_arches}
- rust-diffus
ExclusiveArch: %{rust_arches}
- rust-diffus-derive
ExclusiveArch: %{rust_arches}
- rust-digest
ExclusiveArch: %{rust_arches}
- rust-digest0.8
ExclusiveArch: %{rust_arches}
- rust-directories
ExclusiveArch: %{rust_arches}
- rust-dirs
ExclusiveArch: %{rust_arches}
- rust-dirs-next
ExclusiveArch: %{rust_arches}
- rust-dirs-sys
ExclusiveArch: %{rust_arches}
- rust-dirs-sys-next
ExclusiveArch: %{rust_arches}
- rust-dirs2
ExclusiveArch: %{rust_arches}
- rust-diskonaut
ExclusiveArch: %{rust_arches}
- rust-dissimilar
ExclusiveArch: %{rust_arches}
- rust-dlib
ExclusiveArch: %{rust_arches}
- rust-dlv-list
ExclusiveArch: %{rust_arches}
- rust-dns-lookup
ExclusiveArch: %{rust_arches}
- rust-dns-parser
ExclusiveArch: %{rust_arches}
- rust-doc-comment
ExclusiveArch: %{rust_arches}
- rust-docmatic
ExclusiveArch: %{rust_arches}
- rust-docopt
ExclusiveArch: %{rust_arches}
- rust-dotenv
ExclusiveArch: %{rust_arches}
- rust-downcast-rs
ExclusiveArch: %{rust_arches}
- rust-dtoa
ExclusiveArch: %{rust_arches}
- rust-dtoa-short
ExclusiveArch: %{rust_arches}
- rust-dua-cli
ExclusiveArch: %{rust_arches}
- rust-duct
ExclusiveArch: %{rust_arches}
- rust-dummy
ExclusiveArch: %{rust_arches}
- rust-dunce
ExclusiveArch: %{rust_arches}
- rust-dutree
ExclusiveArch: %{rust_arches}
- rust-dyn-clone
ExclusiveArch: %{rust_arches}
- rust-easy-parallel
ExclusiveArch: %{rust_arches}
- rust-edit-distance
ExclusiveArch: %{rust_arches}
- rust-either
ExclusiveArch: %{rust_arches}
- rust-elasticlunr-rs
ExclusiveArch: %{rust_arches}
- rust-ena
ExclusiveArch: %{rust_arches}
- rust-encode_unicode
ExclusiveArch: %{rust_arches}
- rust-encoding
ExclusiveArch: %{rust_arches}
- rust-encoding-index-japanese
ExclusiveArch: %{rust_arches}
- rust-encoding-index-korean
ExclusiveArch: %{rust_arches}
- rust-encoding-index-simpchinese
ExclusiveArch: %{rust_arches}
- rust-encoding-index-singlebyte
ExclusiveArch: %{rust_arches}
- rust-encoding-index-tradchinese
ExclusiveArch: %{rust_arches}
- rust-encoding_index_tests
ExclusiveArch: %{rust_arches}
- rust-encoding_rs
ExclusiveArch: %{rust_arches}
- rust-encoding_rs_io
ExclusiveArch: %{rust_arches}
- rust-entities
ExclusiveArch: %{rust_arches}
- rust-enum-as-inner
ExclusiveArch: %{rust_arches}
- rust-enum-repr
ExclusiveArch: %{rust_arches}
- rust-enum_primitive
ExclusiveArch: %{rust_arches}
- rust-enumflags2
ExclusiveArch: %{rust_arches}
- rust-enumflags2_derive
ExclusiveArch: %{rust_arches}
- rust-env_logger
ExclusiveArch: %{rust_arches}
- rust-env_logger0.4
ExclusiveArch: %{rust_arches}
- rust-env_logger0.5
ExclusiveArch: %{rust_arches}
- rust-env_logger0.6
ExclusiveArch: %{rust_arches}
- rust-env_logger0.7
ExclusiveArch: %{rust_arches}
- rust-environment
ExclusiveArch: %{rust_arches}
- rust-envsubst
ExclusiveArch: %{rust_arches}
- rust-erased-serde
ExclusiveArch: %{rust_arches}
- rust-err-derive
ExclusiveArch: %{rust_arches}
- rust-errln
ExclusiveArch: %{rust_arches}
- rust-errno
ExclusiveArch: %{rust_arches}
- rust-error-chain
ExclusiveArch: %{rust_arches}
- rust-escaper
ExclusiveArch: %{rust_arches}
- rust-escargot
ExclusiveArch: %{rust_arches}
- rust-euclid
ExclusiveArch: %{rust_arches}
- rust-exa
ExclusiveArch: %{rust_arches}
- rust-expat-sys
ExclusiveArch: %{rust_arches}
- rust-extend
ExclusiveArch: %{rust_arches}
- rust-extprim
ExclusiveArch: %{rust_arches}
- rust-extprim_literals_macros
ExclusiveArch: %{rust_arches}
- rust-fail
ExclusiveArch: %{rust_arches}
- rust-failure
ExclusiveArch: %{rust_arches}
- rust-failure-tools
ExclusiveArch: %{rust_arches}
- rust-failure_derive
ExclusiveArch: %{rust_arches}
- rust-fake
ExclusiveArch: %{rust_arches}
- rust-fake-simd
ExclusiveArch: %{rust_arches}
- rust-fake_clock
ExclusiveArch: %{rust_arches}
- rust-fallible-iterator
ExclusiveArch: %{rust_arches}
- rust-fallible-streaming-iterator
ExclusiveArch: %{rust_arches}
- rust-fastrand
ExclusiveArch: %{rust_arches}
- rust-fbthrift_codegen_includer_proc_macro
ExclusiveArch: %{rust_arches}
- rust-fd-find
ExclusiveArch: %{rust_arches}
- rust-fdlimit
ExclusiveArch: %{rust_arches}
- rust-fedora
ExclusiveArch: %{rust_arches}
- rust-fedora-coreos-pinger
ExclusiveArch: %{rust_arches}
- rust-fedora-update-feedback
ExclusiveArch: %{rust_arches}
- rust-feed-rs
ExclusiveArch: %{rust_arches}
- rust-feedbin_api
ExclusiveArch: %{rust_arches}
- rust-feedly_api
ExclusiveArch: %{rust_arches}
- rust-fern
ExclusiveArch: %{rust_arches}
- rust-fever_api
ExclusiveArch: %{rust_arches}
- rust-ffsend
ExclusiveArch: %{rust_arches}
- rust-ffsend-api
ExclusiveArch: %{rust_arches}
- rust-filesize
ExclusiveArch: %{rust_arches}
- rust-filetime
ExclusiveArch: %{rust_arches}
- rust-findshlibs
ExclusiveArch: %{rust_arches}
- rust-fixedbitset
ExclusiveArch: %{rust_arches}
- rust-flame
ExclusiveArch: %{rust_arches}
- rust-flate2
ExclusiveArch: %{rust_arches}
- rust-float-cmp
ExclusiveArch: %{rust_arches}
- rust-float-cmp0.6
ExclusiveArch: %{rust_arches}
- rust-float-ord
ExclusiveArch: %{rust_arches}
- rust-flume
ExclusiveArch: %{rust_arches}
- rust-fnv
ExclusiveArch: %{rust_arches}
- rust-font-kit
ExclusiveArch: %{rust_arches}
- rust-foreign-types
ExclusiveArch: %{rust_arches}
- rust-foreign-types-macros
ExclusiveArch: %{rust_arches}
- rust-foreign-types-shared
ExclusiveArch: %{rust_arches}
- rust-foreign-types-shared0.1
ExclusiveArch: %{rust_arches}
- rust-foreign-types0.3
ExclusiveArch: %{rust_arches}
- rust-form_urlencoded
ExclusiveArch: %{rust_arches}
- rust-fragile
ExclusiveArch: %{rust_arches}
- rust-freetype
ExclusiveArch: %{rust_arches}
- rust-freetype-rs
ExclusiveArch: %{rust_arches}
- rust-freetype-sys
ExclusiveArch: %{rust_arches}
- rust-fs2
ExclusiveArch: %{rust_arches}
- rust-fs_extra
ExclusiveArch: %{rust_arches}
- rust-funty
ExclusiveArch: %{rust_arches}
- rust-fuse
ExclusiveArch: %{rust_arches}
- rust-futf
ExclusiveArch: %{rust_arches}
- rust-futures
ExclusiveArch: %{rust_arches}
- rust-futures-channel
ExclusiveArch: %{rust_arches}
- rust-futures-core
ExclusiveArch: %{rust_arches}
- rust-futures-cpupool
ExclusiveArch: %{rust_arches}
- rust-futures-executor
ExclusiveArch: %{rust_arches}
- rust-futures-io
ExclusiveArch: %{rust_arches}
- rust-futures-lite
ExclusiveArch: %{rust_arches}
- rust-futures-macro
ExclusiveArch: %{rust_arches}
- rust-futures-sink
ExclusiveArch: %{rust_arches}
- rust-futures-task
ExclusiveArch: %{rust_arches}
- rust-futures-timer
ExclusiveArch: %{rust_arches}
- rust-futures-util
ExclusiveArch: %{rust_arches}
- rust-futures0.1
ExclusiveArch: %{rust_arches}
- rust-fuzzy-matcher
ExclusiveArch: %{rust_arches}
- rust-fxhash
ExclusiveArch: %{rust_arches}
- rust-gcsf
ExclusiveArch: %{rust_arches}
- rust-gdk
ExclusiveArch: %{rust_arches}
- rust-gdk-pixbuf
ExclusiveArch: %{rust_arches}
- rust-gdk-pixbuf-sys
ExclusiveArch: %{rust_arches}
- rust-gdk-sys
ExclusiveArch: %{rust_arches}
- rust-generic-array
ExclusiveArch: %{rust_arches}
- rust-generic-array0.12
ExclusiveArch: %{rust_arches}
- rust-getch
ExclusiveArch: %{rust_arches}
- rust-gethostname
ExclusiveArch: %{rust_arches}
- rust-getopts
ExclusiveArch: %{rust_arches}
- rust-getrandom
ExclusiveArch: %{rust_arches}
- rust-getrandom0.1
ExclusiveArch: %{rust_arches}
- rust-gettext-rs
ExclusiveArch: %{rust_arches}
- rust-gettext-sys
ExclusiveArch: %{rust_arches}
- rust-ghash
ExclusiveArch: %{rust_arches}
- rust-ghost
ExclusiveArch: %{rust_arches}
- rust-gif
ExclusiveArch: %{rust_arches}
- rust-gif0.10
ExclusiveArch: %{rust_arches}
- rust-gimli
ExclusiveArch: %{rust_arches}
- rust-gio
ExclusiveArch: %{rust_arches}
- rust-gio-sys
ExclusiveArch: %{rust_arches}
- rust-gir-format-check
ExclusiveArch: %{rust_arches}
- rust-git-delta
ExclusiveArch: %{rust_arches}
- rust-git2
ExclusiveArch: %{rust_arches}
- rust-git2-curl
ExclusiveArch: %{rust_arches}
- rust-gitui
ExclusiveArch: %{rust_arches}
- rust-gl_generator
ExclusiveArch: %{rust_arches}
- rust-glib
ExclusiveArch: %{rust_arches}
- rust-glib-macros
ExclusiveArch: %{rust_arches}
- rust-glib-sys
ExclusiveArch: %{rust_arches}
- rust-glob
ExclusiveArch: %{rust_arches}
- rust-globset
ExclusiveArch: %{rust_arches}
- rust-globwalk
ExclusiveArch: %{rust_arches}
- rust-glutin
ExclusiveArch: %{rust_arches}
- rust-glutin_egl_sys
ExclusiveArch: %{rust_arches}
- rust-glutin_glx_sys
ExclusiveArch: %{rust_arches}
- rust-gobject-sys
ExclusiveArch: %{rust_arches}
- rust-goblin
ExclusiveArch: %{rust_arches}
- rust-google-drive3-fork
ExclusiveArch: %{rust_arches}
- rust-gptman
ExclusiveArch: %{rust_arches}
- rust-grep
ExclusiveArch: %{rust_arches}
- rust-grep-cli
ExclusiveArch: %{rust_arches}
- rust-grep-matcher
ExclusiveArch: %{rust_arches}
- rust-grep-pcre2
ExclusiveArch: %{rust_arches}
- rust-grep-printer
ExclusiveArch: %{rust_arches}
- rust-grep-regex
ExclusiveArch: %{rust_arches}
- rust-grep-searcher
ExclusiveArch: %{rust_arches}
- rust-groupable
ExclusiveArch: %{rust_arches}
- rust-gspell
ExclusiveArch: %{rust_arches}
- rust-gspell-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer
ExclusiveArch: %{rust_arches}
- rust-gstreamer-audio
ExclusiveArch: %{rust_arches}
- rust-gstreamer-audio-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-base
ExclusiveArch: %{rust_arches}
- rust-gstreamer-base-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-editing-services
ExclusiveArch: %{rust_arches}
- rust-gstreamer-editing-services-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-pbutils
ExclusiveArch: %{rust_arches}
- rust-gstreamer-pbutils-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-player
ExclusiveArch: %{rust_arches}
- rust-gstreamer-player-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-video
ExclusiveArch: %{rust_arches}
- rust-gstreamer-video-sys
ExclusiveArch: %{rust_arches}
- rust-gtk
ExclusiveArch: %{rust_arches}
- rust-gtk-macros
ExclusiveArch: %{rust_arches}
- rust-gtk-rs-lgpl-docs
ExclusiveArch: %{rust_arches}
- rust-gtk-source-sys
ExclusiveArch: %{rust_arches}
- rust-gtk-sys
ExclusiveArch: %{rust_arches}
- rust-gzip-header
ExclusiveArch: %{rust_arches}
- rust-h2
ExclusiveArch: %{rust_arches}
- rust-h2_0.2
ExclusiveArch: %{rust_arches}
- rust-half
ExclusiveArch: %{rust_arches}
- rust-hamcrest
ExclusiveArch: %{rust_arches}
- rust-handlebars
ExclusiveArch: %{rust_arches}
- rust-hashbrown
ExclusiveArch: %{rust_arches}
- rust-hashlink
ExclusiveArch: %{rust_arches}
- rust-headers
ExclusiveArch: %{rust_arches}
- rust-headers-core
ExclusiveArch: %{rust_arches}
- rust-headers-derive
ExclusiveArch: %{rust_arches}
- rust-heapsize
ExclusiveArch: %{rust_arches}
- rust-heatseeker
ExclusiveArch: %{rust_arches}
- rust-heck
ExclusiveArch: %{rust_arches}
- rust-hex
ExclusiveArch: %{rust_arches}
- rust-hex-literal
ExclusiveArch: %{rust_arches}
- rust-hex-literal-impl
ExclusiveArch: %{rust_arches}
- rust-hex-literal0.2
ExclusiveArch: %{rust_arches}
- rust-hexyl
ExclusiveArch: %{rust_arches}
- rust-hkdf
ExclusiveArch: %{rust_arches}
- rust-hmac
ExclusiveArch: %{rust_arches}
- rust-home
ExclusiveArch: %{rust_arches}
- rust-horrorshow
ExclusiveArch: %{rust_arches}
- rust-hostname
ExclusiveArch: %{rust_arches}
- rust-hostname-validator
ExclusiveArch: %{rust_arches}
- rust-html2pango
ExclusiveArch: %{rust_arches}
- rust-html5ever
ExclusiveArch: %{rust_arches}
- rust-http
ExclusiveArch: %{rust_arches}
- rust-http-body
ExclusiveArch: %{rust_arches}
- rust-http-body0.3
ExclusiveArch: %{rust_arches}
- rust-http0.1
ExclusiveArch: %{rust_arches}
- rust-httparse
ExclusiveArch: %{rust_arches}
- rust-httpdate
ExclusiveArch: %{rust_arches}
- rust-human-sort
ExclusiveArch: %{rust_arches}
- rust-humansize
ExclusiveArch: %{rust_arches}
- rust-humantime
ExclusiveArch: %{rust_arches}
- rust-humantime-serde
ExclusiveArch: %{rust_arches}
- rust-humantime1
ExclusiveArch: %{rust_arches}
- rust-hyper
ExclusiveArch: %{rust_arches}
- rust-hyper-native-tls
ExclusiveArch: %{rust_arches}
- rust-hyper-staticfile
ExclusiveArch: %{rust_arches}
- rust-hyper-tls
ExclusiveArch: %{rust_arches}
- rust-hyper-tls0.4
ExclusiveArch: %{rust_arches}
- rust-hyper0.10
ExclusiveArch: %{rust_arches}
- rust-hyper0.13
ExclusiveArch: %{rust_arches}
- rust-hyperfine
ExclusiveArch: %{rust_arches}
- rust-i3ipc
ExclusiveArch: %{rust_arches}
- rust-id_tree
ExclusiveArch: %{rust_arches}
- rust-ident_case
ExclusiveArch: %{rust_arches}
- rust-idna
ExclusiveArch: %{rust_arches}
- rust-idna0.1
ExclusiveArch: %{rust_arches}
- rust-ignore
ExclusiveArch: %{rust_arches}
- rust-im-rc
ExclusiveArch: %{rust_arches}
- rust-image
ExclusiveArch: %{rust_arches}
- rust-imgref
ExclusiveArch: %{rust_arches}
- rust-indexmap
ExclusiveArch: %{rust_arches}
- rust-indicatif
ExclusiveArch: %{rust_arches}
- rust-indoc
ExclusiveArch: %{rust_arches}
- rust-inflate
ExclusiveArch: %{rust_arches}
- rust-inotify
ExclusiveArch: %{rust_arches}
- rust-inotify-sys
ExclusiveArch: %{rust_arches}
- rust-input_buffer
ExclusiveArch: %{rust_arches}
- rust-insta
ExclusiveArch: %{rust_arches}
- rust-instant
ExclusiveArch: %{rust_arches}
- rust-interpolate_name
ExclusiveArch: %{rust_arches}
- rust-intervaltree
ExclusiveArch: %{rust_arches}
- rust-invalidstring
ExclusiveArch: %{rust_arches}
- rust-inventory
ExclusiveArch: %{rust_arches}
- rust-inventory-impl
ExclusiveArch: %{rust_arches}
- rust-iocuddle
ExclusiveArch: %{rust_arches}
- rust-iovec
ExclusiveArch: %{rust_arches}
- rust-ipnet
ExclusiveArch: %{rust_arches}
- rust-ipnetwork
ExclusiveArch: %{rust_arches}
- rust-iron
ExclusiveArch: %{rust_arches}
- rust-isahc
ExclusiveArch: %{rust_arches}
- rust-iso8601
ExclusiveArch: %{rust_arches}
- rust-iter-read
ExclusiveArch: %{rust_arches}
- rust-itertools
ExclusiveArch: %{rust_arches}
- rust-itertools-num
ExclusiveArch: %{rust_arches}
- rust-itertools0.8
ExclusiveArch: %{rust_arches}
- rust-itertools0.9
ExclusiveArch: %{rust_arches}
- rust-itoa
ExclusiveArch: %{rust_arches}
- rust-ivf
ExclusiveArch: %{rust_arches}
- rust-javascriptcore-rs
ExclusiveArch: %{rust_arches}
- rust-javascriptcore-rs-sys
ExclusiveArch: %{rust_arches}
- rust-jetscii
ExclusiveArch: %{rust_arches}
- rust-jieba-rs
ExclusiveArch: %{rust_arches}
- rust-jobserver
ExclusiveArch: %{rust_arches}
- rust-jpeg-decoder
ExclusiveArch: %{rust_arches}
- rust-jql
ExclusiveArch: %{rust_arches}
- rust-js-sys
ExclusiveArch: %{rust_arches}
- rust-js_int
ExclusiveArch: %{rust_arches}
- rust-json
ExclusiveArch: %{rust_arches}
- rust-jwalk
ExclusiveArch: %{rust_arches}
- rust-keccak
ExclusiveArch: %{rust_arches}
- rust-khronos_api
ExclusiveArch: %{rust_arches}
- rust-kstring
ExclusiveArch: %{rust_arches}
- rust-kv-log-macro
ExclusiveArch: %{rust_arches}
- rust-lab
ExclusiveArch: %{rust_arches}
- rust-lalrpop
ExclusiveArch: %{rust_arches}
- rust-lalrpop-util
ExclusiveArch: %{rust_arches}
- rust-language-tags
ExclusiveArch: %{rust_arches}
- rust-lazy-init
ExclusiveArch: %{rust_arches}
- rust-lazy_static
ExclusiveArch: %{rust_arches}
- rust-lazycell
ExclusiveArch: %{rust_arches}
- rust-leb128
ExclusiveArch: %{rust_arches}
- rust-letter-avatar
ExclusiveArch: %{rust_arches}
- rust-lexical-core
ExclusiveArch: %{rust_arches}
- rust-libc
ExclusiveArch: %{rust_arches}
- rust-libcryptsetup-rs
ExclusiveArch: %{rust_arches}
- rust-libcryptsetup-rs-sys
ExclusiveArch: %{rust_arches}
- rust-libdbus-sys
ExclusiveArch: %{rust_arches}
- rust-libflate
ExclusiveArch: %{rust_arches}
- rust-libflate_lz77
ExclusiveArch: %{rust_arches}
- rust-libgit2-sys
ExclusiveArch: %{rust_arches}
- rust-libhandy
ExclusiveArch: %{rust_arches}
- rust-libhandy-sys
ExclusiveArch: %{rust_arches}
- rust-libloading
ExclusiveArch: %{rust_arches}
- rust-libloading0.6
ExclusiveArch: %{rust_arches}
- rust-libm
ExclusiveArch: %{rust_arches}
- rust-libmount
ExclusiveArch: %{rust_arches}
- rust-libnotcurses-sys
ExclusiveArch: %{rust_arches}
- rust-liboverdrop
ExclusiveArch: %{rust_arches}
- rust-libpulse-binding
ExclusiveArch: %{rust_arches}
- rust-libpulse-sys
ExclusiveArch: %{rust_arches}
- rust-libslirp
ExclusiveArch: %{rust_arches}
- rust-libslirp-sys
ExclusiveArch: %{rust_arches}
- rust-libsqlite3-sys
ExclusiveArch: %{rust_arches}
- rust-libssh2-sys
ExclusiveArch: %{rust_arches}
- rust-libsystemd
ExclusiveArch: %{rust_arches}
- rust-libsystemd-sys
ExclusiveArch: %{rust_arches}
- rust-libudev
ExclusiveArch: %{rust_arches}
- rust-libudev-sys
ExclusiveArch: %{rust_arches}
- rust-libxml
ExclusiveArch: %{rust_arches}
- rust-libz-sys
ExclusiveArch: %{rust_arches}
- rust-line-wrap
ExclusiveArch: %{rust_arches}
- rust-line_drawing
ExclusiveArch: %{rust_arches}
- rust-link-cplusplus
ExclusiveArch: %{rust_arches}
- rust-linked-hash-map
ExclusiveArch: %{rust_arches}
- rust-linkify
ExclusiveArch: %{rust_arches}
- rust-lipsum
ExclusiveArch: %{rust_arches}
- rust-liquid
ExclusiveArch: %{rust_arches}
- rust-liquid-core
ExclusiveArch: %{rust_arches}
- rust-liquid-derive
ExclusiveArch: %{rust_arches}
- rust-liquid-lib
ExclusiveArch: %{rust_arches}
- rust-listenfd
ExclusiveArch: %{rust_arches}
- rust-lmdb
ExclusiveArch: %{rust_arches}
- rust-lmdb-sys
ExclusiveArch: %{rust_arches}
- rust-locale
ExclusiveArch: %{rust_arches}
- rust-locale_config
ExclusiveArch: %{rust_arches}
- rust-lock_api
ExclusiveArch: %{rust_arches}
- rust-lockfree
ExclusiveArch: %{rust_arches}
- rust-log
ExclusiveArch: %{rust_arches}
- rust-log-mdc
ExclusiveArch: %{rust_arches}
- rust-log-panics
ExclusiveArch: %{rust_arches}
- rust-log0.3
ExclusiveArch: %{rust_arches}
- rust-log4rs
ExclusiveArch: %{rust_arches}
- rust-loggerv
ExclusiveArch: %{rust_arches}
- rust-loopdev
ExclusiveArch: %{rust_arches}
- rust-lru-cache
ExclusiveArch: %{rust_arches}
- rust-lru_time_cache
ExclusiveArch: %{rust_arches}
- rust-lscolors
ExclusiveArch: %{rust_arches}
- rust-lsd
ExclusiveArch: %{rust_arches}
- rust-lzma-sys
ExclusiveArch: %{rust_arches}
- rust-lzw
ExclusiveArch: %{rust_arches}
- rust-mac
ExclusiveArch: %{rust_arches}
- rust-macro-attr
ExclusiveArch: %{rust_arches}
- rust-magic-crypt
ExclusiveArch: %{rust_arches}
- rust-maildir
ExclusiveArch: %{rust_arches}
- rust-mailparse
ExclusiveArch: %{rust_arches}
- rust-man
ExclusiveArch: %{rust_arches}
- rust-maplit
ExclusiveArch: %{rust_arches}
- rust-markup5ever
ExclusiveArch: %{rust_arches}
- rust-markup5ever_rcdom
ExclusiveArch: %{rust_arches}
- rust-match_cfg
ExclusiveArch: %{rust_arches}
- rust-matches
ExclusiveArch: %{rust_arches}
- rust-matrixmultiply
ExclusiveArch: %{rust_arches}
- rust-maxminddb
ExclusiveArch: %{rust_arches}
- rust-maybe-uninit
ExclusiveArch: %{rust_arches}
- rust-mbox
ExclusiveArch: %{rust_arches}
- rust-mbrman
ExclusiveArch: %{rust_arches}
- rust-md-5
ExclusiveArch: %{rust_arches}
- rust-md5
ExclusiveArch: %{rust_arches}
- rust-mdl
ExclusiveArch: %{rust_arches}
- rust-memchr
ExclusiveArch: %{rust_arches}
- rust-memmap
ExclusiveArch: %{rust_arches}
- rust-memmap2
ExclusiveArch: %{rust_arches}
- rust-memoffset
ExclusiveArch: %{rust_arches}
- rust-memoffset0.5
ExclusiveArch: %{rust_arches}
- rust-memsec
ExclusiveArch: %{rust_arches}
- rust-metadeps
ExclusiveArch: %{rust_arches}
- rust-migrations_internals
ExclusiveArch: %{rust_arches}
- rust-migrations_macros
ExclusiveArch: %{rust_arches}
- rust-mime
ExclusiveArch: %{rust_arches}
- rust-mime-sniffer
ExclusiveArch: %{rust_arches}
- rust-mime0.2
ExclusiveArch: %{rust_arches}
- rust-mime_guess
ExclusiveArch: %{rust_arches}
- rust-mime_guess1
ExclusiveArch: %{rust_arches}
- rust-miniflux_api
ExclusiveArch: %{rust_arches}
- rust-minify-html
ExclusiveArch: %{rust_arches}
- rust-miniz-sys
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide0.3
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide_c_api
ExclusiveArch: %{rust_arches}
- rust-mint
ExclusiveArch: %{rust_arches}
- rust-mio
ExclusiveArch: %{rust_arches}
- rust-mio-extras
ExclusiveArch: %{rust_arches}
- rust-mio-uds
ExclusiveArch: %{rust_arches}
- rust-mio0.6
ExclusiveArch: %{rust_arches}
- rust-mktemp
ExclusiveArch: %{rust_arches}
- rust-mnt
ExclusiveArch: %{rust_arches}
- rust-mockito
ExclusiveArch: %{rust_arches}
- rust-modifier
ExclusiveArch: %{rust_arches}
- rust-more-asserts
ExclusiveArch: %{rust_arches}
- rust-muldiv
ExclusiveArch: %{rust_arches}
- rust-multimap
ExclusiveArch: %{rust_arches}
- rust-multipart
ExclusiveArch: %{rust_arches}
- rust-mustache
ExclusiveArch: %{rust_arches}
- rust-nasm-rs
ExclusiveArch: %{rust_arches}
- rust-native-tls
ExclusiveArch: %{rust_arches}
- rust-natord
ExclusiveArch: %{rust_arches}
- rust-nb-connect
ExclusiveArch: %{rust_arches}
- rust-net2
ExclusiveArch: %{rust_arches}
- rust-netlink-packet-core
ExclusiveArch: %{rust_arches}
- rust-netlink-packet-route
ExclusiveArch: %{rust_arches}
- rust-netlink-packet-utils
ExclusiveArch: %{rust_arches}
- rust-netlink-proto
ExclusiveArch: %{rust_arches}
- rust-netlink-sys
ExclusiveArch: %{rust_arches}
- rust-netmap_sys
ExclusiveArch: %{rust_arches}
- rust-nettle
ExclusiveArch: %{rust_arches}
- rust-nettle-sys
ExclusiveArch: %{rust_arches}
- rust-new_debug_unreachable
ExclusiveArch: %{rust_arches}
- rust-news-flash
ExclusiveArch: %{rust_arches}
- rust-newsblur_api
ExclusiveArch: %{rust_arches}
- rust-newtype_derive
ExclusiveArch: %{rust_arches}
- rust-nickel
ExclusiveArch: %{rust_arches}
- rust-nix
ExclusiveArch: %{rust_arches}
- rust-nix0.14
ExclusiveArch: %{rust_arches}
- rust-nix0.17
ExclusiveArch: %{rust_arches}
- rust-nix0.18
ExclusiveArch: %{rust_arches}
- rust-no-panic
ExclusiveArch: %{rust_arches}
- rust-nodrop
ExclusiveArch: %{rust_arches}
- rust-nom
ExclusiveArch: %{rust_arches}
- rust-nom4
ExclusiveArch: %{rust_arches}
- rust-nom5
ExclusiveArch: %{rust_arches}
- rust-noop_proc_macro
ExclusiveArch: %{rust_arches}
- rust-normalize-line-endings
ExclusiveArch: %{rust_arches}
- rust-notify
ExclusiveArch: %{rust_arches}
- rust-notify-rust
ExclusiveArch: %{rust_arches}
- rust-num
ExclusiveArch: %{rust_arches}
- rust-num-bigint
ExclusiveArch: %{rust_arches}
- rust-num-bigint-dig
ExclusiveArch: %{rust_arches}
- rust-num-complex
ExclusiveArch: %{rust_arches}
- rust-num-derive
ExclusiveArch: %{rust_arches}
- rust-num-integer
ExclusiveArch: %{rust_arches}
- rust-num-iter
ExclusiveArch: %{rust_arches}
- rust-num-rational
ExclusiveArch: %{rust_arches}
- rust-num-traits
ExclusiveArch: %{rust_arches}
- rust-num-traits0.1
ExclusiveArch: %{rust_arches}
- rust-num_cpus
ExclusiveArch: %{rust_arches}
- rust-number_prefix
ExclusiveArch: %{rust_arches}
- rust-numtoa
ExclusiveArch: %{rust_arches}
- rust-oauth2
ExclusiveArch: %{rust_arches}
- rust-obfstr
ExclusiveArch: %{rust_arches}
- rust-object
ExclusiveArch: %{rust_arches}
- rust-odds
ExclusiveArch: %{rust_arches}
- rust-oid
ExclusiveArch: %{rust_arches}
- rust-once_cell
ExclusiveArch: %{rust_arches}
- rust-onig
ExclusiveArch: %{rust_arches}
- rust-onig_sys
ExclusiveArch: %{rust_arches}
- rust-oorandom
ExclusiveArch: %{rust_arches}
- rust-opaque-debug
ExclusiveArch: %{rust_arches}
- rust-open
ExclusiveArch: %{rust_arches}
- rust-openat
ExclusiveArch: %{rust_arches}
- rust-openat-ext
ExclusiveArch: %{rust_arches}
- rust-opener
ExclusiveArch: %{rust_arches}
- rust-openssh-keys
ExclusiveArch: %{rust_arches}
- rust-openssl
ExclusiveArch: %{rust_arches}
- rust-openssl-probe
ExclusiveArch: %{rust_arches}
- rust-openssl-sys
ExclusiveArch: %{rust_arches}
- rust-ord_subset
ExclusiveArch: %{rust_arches}
- rust-ordered-float
ExclusiveArch: %{rust_arches}
- rust-ordered-multimap
ExclusiveArch: %{rust_arches}
- rust-os_info
ExclusiveArch: %{rust_arches}
- rust-os_pipe
ExclusiveArch: %{rust_arches}
- rust-os_str_bytes
ExclusiveArch: %{rust_arches}
- rust-osmesa-sys
ExclusiveArch: %{rust_arches}
- rust-osstrtools
ExclusiveArch: %{rust_arches}
- rust-ostree
ExclusiveArch: %{rust_arches}
- rust-ostree-sys
ExclusiveArch: %{rust_arches}
- rust-owned-alloc
ExclusiveArch: %{rust_arches}
- rust-owned_ttf_parser
ExclusiveArch: %{rust_arches}
- rust-owning_ref
ExclusiveArch: %{rust_arches}
- rust-packaging
ExclusiveArch: %{rust_arches}
- rust-pad
ExclusiveArch: %{rust_arches}
- rust-pager
ExclusiveArch: %{rust_arches}
- rust-palette
ExclusiveArch: %{rust_arches}
- rust-palette_derive
ExclusiveArch: %{rust_arches}
- rust-pango
ExclusiveArch: %{rust_arches}
- rust-pango-sys
ExclusiveArch: %{rust_arches}
- rust-pangocairo
ExclusiveArch: %{rust_arches}
- rust-pangocairo-sys
ExclusiveArch: %{rust_arches}
- rust-parity-wasm
ExclusiveArch: %{rust_arches}
- rust-parking
ExclusiveArch: %{rust_arches}
- rust-parking_lot
ExclusiveArch: %{rust_arches}
- rust-parking_lot_core
ExclusiveArch: %{rust_arches}
- rust-parse-zoneinfo
ExclusiveArch: %{rust_arches}
- rust-parse_cfg
ExclusiveArch: %{rust_arches}
- rust-parsec-client
ExclusiveArch: %{rust_arches}
- rust-parsec-interface
ExclusiveArch: %{rust_arches}
- rust-partial-io
ExclusiveArch: %{rust_arches}
- rust-paste
ExclusiveArch: %{rust_arches}
- rust-paste-impl
ExclusiveArch: %{rust_arches}
- rust-path-absolutize
ExclusiveArch: %{rust_arches}
- rust-path-dedot
ExclusiveArch: %{rust_arches}
- rust-path-slash
ExclusiveArch: %{rust_arches}
- rust-pathdiff
ExclusiveArch: %{rust_arches}
- rust-pathfinder_geometry
ExclusiveArch: %{rust_arches}
- rust-pathfinder_simd
ExclusiveArch: %{rust_arches}
- rust-pbr
ExclusiveArch: %{rust_arches}
- rust-pcap
ExclusiveArch: %{rust_arches}
- rust-pcre2
ExclusiveArch: %{rust_arches}
- rust-pcre2-sys
ExclusiveArch: %{rust_arches}
- rust-peeking_take_while
ExclusiveArch: %{rust_arches}
- rust-peg
ExclusiveArch: %{rust_arches}
- rust-peg-macros
ExclusiveArch: %{rust_arches}
- rust-peg-runtime
ExclusiveArch: %{rust_arches}
- rust-peg0.5
ExclusiveArch: %{rust_arches}
- rust-pem
ExclusiveArch: %{rust_arches}
- rust-percent-encoding
ExclusiveArch: %{rust_arches}
- rust-percent-encoding1
ExclusiveArch: %{rust_arches}
- rust-peresil
ExclusiveArch: %{rust_arches}
- rust-permutate
ExclusiveArch: %{rust_arches}
- rust-permutohedron
ExclusiveArch: %{rust_arches}
- rust-pest
ExclusiveArch: %{rust_arches}
- rust-pest_derive
ExclusiveArch: %{rust_arches}
- rust-pest_generator
ExclusiveArch: %{rust_arches}
- rust-pest_meta
ExclusiveArch: %{rust_arches}
- rust-petgraph
ExclusiveArch: %{rust_arches}
- rust-phf
ExclusiveArch: %{rust_arches}
- rust-phf0.7
ExclusiveArch: %{rust_arches}
- rust-phf_codegen
ExclusiveArch: %{rust_arches}
- rust-phf_codegen0.7
ExclusiveArch: %{rust_arches}
- rust-phf_generator
ExclusiveArch: %{rust_arches}
- rust-phf_generator0.7
ExclusiveArch: %{rust_arches}
- rust-phf_macros
ExclusiveArch: %{rust_arches}
- rust-phf_macros0.7
ExclusiveArch: %{rust_arches}
- rust-phf_shared
ExclusiveArch: %{rust_arches}
- rust-phf_shared0.7
ExclusiveArch: %{rust_arches}
- rust-picky-asn1
ExclusiveArch: %{rust_arches}
- rust-picky-asn1-der
ExclusiveArch: %{rust_arches}
- rust-picky-asn1-x509
ExclusiveArch: %{rust_arches}
- rust-pico-args
ExclusiveArch: %{rust_arches}
- rust-pin-project
ExclusiveArch: %{rust_arches}
- rust-pin-project-internal
ExclusiveArch: %{rust_arches}
- rust-pin-project-internal0.4
ExclusiveArch: %{rust_arches}
- rust-pin-project-lite
ExclusiveArch: %{rust_arches}
- rust-pin-project-lite0.1
ExclusiveArch: %{rust_arches}
- rust-pin-project0.4
ExclusiveArch: %{rust_arches}
- rust-pin-utils
ExclusiveArch: %{rust_arches}
- rust-pipe
ExclusiveArch: %{rust_arches}
- rust-piper
ExclusiveArch: %{rust_arches}
- rust-pkcs11
ExclusiveArch: %{rust_arches}
- rust-pkg-config
ExclusiveArch: %{rust_arches}
- rust-plain
ExclusiveArch: %{rust_arches}
- rust-platform-dirs
ExclusiveArch: %{rust_arches}
- rust-platforms
ExclusiveArch: %{rust_arches}
- rust-plist
ExclusiveArch: %{rust_arches}
- rust-plotters
ExclusiveArch: %{rust_arches}
- rust-plugin
ExclusiveArch: %{rust_arches}
- rust-pnet_base
ExclusiveArch: %{rust_arches}
- rust-pnet_datalink
ExclusiveArch: %{rust_arches}
- rust-pnet_sys
ExclusiveArch: %{rust_arches}
- rust-png
ExclusiveArch: %{rust_arches}
- rust-podio
ExclusiveArch: %{rust_arches}
- rust-polling
ExclusiveArch: %{rust_arches}
- rust-polyval
ExclusiveArch: %{rust_arches}
- rust-pommes
ExclusiveArch: %{rust_arches}
- rust-ppv-lite86
ExclusiveArch: %{rust_arches}
- rust-pq-sys
ExclusiveArch: %{rust_arches}
- rust-precomputed-hash
ExclusiveArch: %{rust_arches}
- rust-predicates
ExclusiveArch: %{rust_arches}
- rust-predicates-core
ExclusiveArch: %{rust_arches}
- rust-predicates-tree
ExclusiveArch: %{rust_arches}
- rust-pretty-git-prompt
ExclusiveArch: %{rust_arches}
- rust-pretty-hex
ExclusiveArch: %{rust_arches}
- rust-pretty_assertions
ExclusiveArch: %{rust_arches}
- rust-pretty_assertions0.6
ExclusiveArch: %{rust_arches}
- rust-pretty_env_logger
ExclusiveArch: %{rust_arches}
- rust-prettytable-rs
ExclusiveArch: %{rust_arches}
- rust-proc-macro-crate
ExclusiveArch: %{rust_arches}
- rust-proc-macro-error
ExclusiveArch: %{rust_arches}
- rust-proc-macro-error-attr
ExclusiveArch: %{rust_arches}
- rust-proc-macro-hack
ExclusiveArch: %{rust_arches}
- rust-proc-macro-nested
ExclusiveArch: %{rust_arches}
- rust-proc-macro2
ExclusiveArch: %{rust_arches}
- rust-proc-macro2-0.4
ExclusiveArch: %{rust_arches}
- rust-proc-quote
ExclusiveArch: %{rust_arches}
- rust-proc-quote-impl
ExclusiveArch: %{rust_arches}
- rust-procedural-masquerade
ExclusiveArch: %{rust_arches}
- rust-process_path
ExclusiveArch: %{rust_arches}
- rust-procfs
ExclusiveArch: %{rust_arches}
- rust-procfs0.8
ExclusiveArch: %{rust_arches}
- rust-procs
ExclusiveArch: %{rust_arches}
- rust-progress-streams
ExclusiveArch: %{rust_arches}
- rust-prometheus
ExclusiveArch: %{rust_arches}
- rust-proptest
ExclusiveArch: %{rust_arches}
- rust-proptest-derive
ExclusiveArch: %{rust_arches}
- rust-prost
ExclusiveArch: %{rust_arches}
- rust-prost-build
ExclusiveArch: %{rust_arches}
- rust-prost-derive
ExclusiveArch: %{rust_arches}
- rust-prost-types
ExclusiveArch: %{rust_arches}
- rust-protobuf
ExclusiveArch: %{rust_arches}
- rust-protobuf-codegen
ExclusiveArch: %{rust_arches}
- rust-protobuf-codegen-pure
ExclusiveArch: %{rust_arches}
- rust-protoc
ExclusiveArch: %{rust_arches}
- rust-protoc-rust
ExclusiveArch: %{rust_arches}
- rust-psa-crypto
ExclusiveArch: %{rust_arches}
- rust-psa-crypto-sys
ExclusiveArch: %{rust_arches}
- rust-psm
ExclusiveArch: %{rust_arches}
- rust-psutil
ExclusiveArch: %{rust_arches}
- rust-publicsuffix
ExclusiveArch: %{rust_arches}
- rust-pulldown-cmark
ExclusiveArch: %{rust_arches}
- rust-pulse
ExclusiveArch: %{rust_arches}
- rust-pure-rust-locales
ExclusiveArch: %{rust_arches}
- rust-pyo3
ExclusiveArch: %{rust_arches}
- rust-pyo3-macros
ExclusiveArch: %{rust_arches}
- rust-pyo3-macros-backend
ExclusiveArch: %{rust_arches}
- rust-python3-sys
ExclusiveArch: %{rust_arches}
- rust-qr2term
ExclusiveArch: %{rust_arches}
- rust-qrcode
ExclusiveArch: %{rust_arches}
- rust-qstring
ExclusiveArch: %{rust_arches}
- rust-quick-error
ExclusiveArch: %{rust_arches}
- rust-quick-error1
ExclusiveArch: %{rust_arches}
- rust-quick-xml
ExclusiveArch: %{rust_arches}
- rust-quickcheck
ExclusiveArch: %{rust_arches}
- rust-quickcheck0.6
ExclusiveArch: %{rust_arches}
- rust-quickcheck0.9
ExclusiveArch: %{rust_arches}
- rust-quickcheck_macros
ExclusiveArch: %{rust_arches}
- rust-quickersort
ExclusiveArch: %{rust_arches}
- rust-quote
ExclusiveArch: %{rust_arches}
- rust-quote0.3
ExclusiveArch: %{rust_arches}
- rust-quote0.6
ExclusiveArch: %{rust_arches}
- rust-quoted_printable
ExclusiveArch: %{rust_arches}
- rust-r2d2
ExclusiveArch: %{rust_arches}
- rust-radium
ExclusiveArch: %{rust_arches}
- rust-rand
ExclusiveArch: %{rust_arches}
- rust-rand0.4
ExclusiveArch: %{rust_arches}
- rust-rand0.5
ExclusiveArch: %{rust_arches}
- rust-rand0.6
ExclusiveArch: %{rust_arches}
- rust-rand0.7
ExclusiveArch: %{rust_arches}
- rust-rand_chacha
ExclusiveArch: %{rust_arches}
- rust-rand_chacha0.1
ExclusiveArch: %{rust_arches}
- rust-rand_chacha0.2
ExclusiveArch: %{rust_arches}
- rust-rand_core
ExclusiveArch: %{rust_arches}
- rust-rand_core0.3
ExclusiveArch: %{rust_arches}
- rust-rand_core0.4
ExclusiveArch: %{rust_arches}
- rust-rand_core0.5
ExclusiveArch: %{rust_arches}
- rust-rand_distr
ExclusiveArch: %{rust_arches}
- rust-rand_distr0.2
ExclusiveArch: %{rust_arches}
- rust-rand_hc
ExclusiveArch: %{rust_arches}
- rust-rand_hc0.1
ExclusiveArch: %{rust_arches}
- rust-rand_isaac
ExclusiveArch: %{rust_arches}
- rust-rand_isaac0.1
ExclusiveArch: %{rust_arches}
- rust-rand_jitter
ExclusiveArch: %{rust_arches}
- rust-rand_jitter0.1
ExclusiveArch: %{rust_arches}
- rust-rand_os
ExclusiveArch: %{rust_arches}
- rust-rand_os0.1
ExclusiveArch: %{rust_arches}
- rust-rand_pcg
ExclusiveArch: %{rust_arches}
- rust-rand_pcg0.1
ExclusiveArch: %{rust_arches}
- rust-rand_pcg0.2
ExclusiveArch: %{rust_arches}
- rust-rand_xorshift
ExclusiveArch: %{rust_arches}
- rust-rand_xorshift0.1
ExclusiveArch: %{rust_arches}
- rust-rand_xoshiro
ExclusiveArch: %{rust_arches}
- rust-random-fast-rng
ExclusiveArch: %{rust_arches}
- rust-random-trait
ExclusiveArch: %{rust_arches}
- rust-randomize
ExclusiveArch: %{rust_arches}
- rust-rav1e
ExclusiveArch: %{rust_arches}
- rust-raw-window-handle
ExclusiveArch: %{rust_arches}
- rust-rawpointer
ExclusiveArch: %{rust_arches}
- rust-rawslice
ExclusiveArch: %{rust_arches}
- rust-rayon
ExclusiveArch: %{rust_arches}
- rust-rayon-core
ExclusiveArch: %{rust_arches}
- rust-readability-fork
ExclusiveArch: %{rust_arches}
- rust-readwrite
ExclusiveArch: %{rust_arches}
- rust-recycler
ExclusiveArch: %{rust_arches}
- rust-ref-cast
ExclusiveArch: %{rust_arches}
- rust-ref-cast-impl
ExclusiveArch: %{rust_arches}
- rust-regex
ExclusiveArch: %{rust_arches}
- rust-regex-automata
ExclusiveArch: %{rust_arches}
- rust-regex-syntax
ExclusiveArch: %{rust_arches}
- rust-region
ExclusiveArch: %{rust_arches}
- rust-relative-path
ExclusiveArch: %{rust_arches}
- rust-relay
ExclusiveArch: %{rust_arches}
- rust-remove_dir_all
ExclusiveArch: %{rust_arches}
- rust-reqwest
ExclusiveArch: %{rust_arches}
- rust-reqwest0.10
ExclusiveArch: %{rust_arches}
- rust-resize
ExclusiveArch: %{rust_arches}
- rust-resolv-conf
ExclusiveArch: %{rust_arches}
- rust-restson
ExclusiveArch: %{rust_arches}
- rust-retry
ExclusiveArch: %{rust_arches}
- rust-rgb
ExclusiveArch: %{rust_arches}
- rust-ring
ExclusiveArch: %{rust_arches}
- rust-ripgrep
ExclusiveArch: %{rust_arches}
- rust-rle-decode-fast
ExclusiveArch: %{rust_arches}
- rust-rmp
ExclusiveArch: %{rust_arches}
- rust-rmp-serde
ExclusiveArch: %{rust_arches}
- rust-roff
ExclusiveArch: %{rust_arches}
- rust-ron
ExclusiveArch: %{rust_arches}
- rust-roxmltree
ExclusiveArch: %{rust_arches}
- rust-rpassword
ExclusiveArch: %{rust_arches}
- rust-rpick
ExclusiveArch: %{rust_arches}
- rust-rsa
ExclusiveArch: %{rust_arches}
- rust-rspec
ExclusiveArch: %{rust_arches}
- rust-rtnetlink
ExclusiveArch: %{rust_arches}
- rust-ruma
ExclusiveArch: %{rust_arches}
- rust-ruma-api
ExclusiveArch: %{rust_arches}
- rust-ruma-api-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-appservice-api
ExclusiveArch: %{rust_arches}
- rust-ruma-client-api
ExclusiveArch: %{rust_arches}
- rust-ruma-common
ExclusiveArch: %{rust_arches}
- rust-ruma-events
ExclusiveArch: %{rust_arches}
- rust-ruma-events-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-federation-api
ExclusiveArch: %{rust_arches}
- rust-ruma-identifiers
ExclusiveArch: %{rust_arches}
- rust-ruma-identifiers-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-identifiers-validation
ExclusiveArch: %{rust_arches}
- rust-ruma-identity-service-api
ExclusiveArch: %{rust_arches}
- rust-ruma-push-gateway-api
ExclusiveArch: %{rust_arches}
- rust-ruma-serde
ExclusiveArch: %{rust_arches}
- rust-ruma-serde-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-signatures
ExclusiveArch: %{rust_arches}
- rust-rusqlite
ExclusiveArch: %{rust_arches}
- rust-rust-embed
ExclusiveArch: %{rust_arches}
- rust-rust-embed-impl
ExclusiveArch: %{rust_arches}
- rust-rust-embed-utils
ExclusiveArch: %{rust_arches}
- rust-rust-ini
ExclusiveArch: %{rust_arches}
- rust-rust-stemmers
ExclusiveArch: %{rust_arches}
- rust-rust_decimal
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_normal_macro
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_proc_macro
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_sys
ExclusiveArch: %{rust_arches}
- rust-rustc-demangle
ExclusiveArch: %{rust_arches}
- rust-rustc-hash
ExclusiveArch: %{rust_arches}
- rust-rustc-serialize
ExclusiveArch: %{rust_arches}
- rust-rustc-test
ExclusiveArch: %{rust_arches}
- rust-rustc_tools_util
ExclusiveArch: %{rust_arches}
- rust-rustc_version
ExclusiveArch: %{rust_arches}
- rust-rustdoc-stripper
ExclusiveArch: %{rust_arches}
- rust-rustfilt
ExclusiveArch: %{rust_arches}
- rust-rustfix
ExclusiveArch: %{rust_arches}
- rust-rustio
ExclusiveArch: %{rust_arches}
- rust-rusttype
ExclusiveArch: %{rust_arches}
- rust-rustversion
ExclusiveArch: %{rust_arches}
- rust-rusty-fork
ExclusiveArch: %{rust_arches}
- rust-rustyline
ExclusiveArch: %{rust_arches}
- rust-rustyline-derive
ExclusiveArch: %{rust_arches}
- rust-ryu
ExclusiveArch: %{rust_arches}
- rust-safe-transmute
ExclusiveArch: %{rust_arches}
- rust-safemem
ExclusiveArch: %{rust_arches}
- rust-same-file
ExclusiveArch: %{rust_arches}
- rust-sass-rs
ExclusiveArch: %{rust_arches}
- rust-sass-sys
ExclusiveArch: %{rust_arches}
- rust-scan_fmt
ExclusiveArch: %{rust_arches}
- rust-scheduled-thread-pool
ExclusiveArch: %{rust_arches}
- rust-scoped-tls
ExclusiveArch: %{rust_arches}
- rust-scoped-tls-hkt
ExclusiveArch: %{rust_arches}
- rust-scoped_threadpool
ExclusiveArch: %{rust_arches}
- rust-scopeguard
ExclusiveArch: %{rust_arches}
- rust-scopetime
ExclusiveArch: %{rust_arches}
- rust-scratch
ExclusiveArch: %{rust_arches}
- rust-scroll
ExclusiveArch: %{rust_arches}
- rust-scroll_derive
ExclusiveArch: %{rust_arches}
- rust-sct
ExclusiveArch: %{rust_arches}
- rust-sd
ExclusiveArch: %{rust_arches}
- rust-sd-notify
ExclusiveArch: %{rust_arches}
- rust-seahash
ExclusiveArch: %{rust_arches}
- rust-seahash3
ExclusiveArch: %{rust_arches}
- rust-secrecy
ExclusiveArch: %{rust_arches}
- rust-secret-service
ExclusiveArch: %{rust_arches}
- rust-semver
ExclusiveArch: %{rust_arches}
- rust-semver-parser
ExclusiveArch: %{rust_arches}
- rust-semver-parser0.7
ExclusiveArch: %{rust_arches}
- rust-semver-parser0.9
ExclusiveArch: %{rust_arches}
- rust-semver0.10
ExclusiveArch: %{rust_arches}
- rust-semver0.9
ExclusiveArch: %{rust_arches}
- rust-sequoia-autocrypt
ExclusiveArch: %{rust_arches}
- rust-sequoia-ipc
ExclusiveArch: %{rust_arches}
- rust-sequoia-keyring-linter
ExclusiveArch: %{rust_arches}
- rust-sequoia-net
ExclusiveArch: %{rust_arches}
- rust-sequoia-octopus-librnp
ExclusiveArch: %{rust_arches}
- rust-sequoia-openpgp
ExclusiveArch: %{rust_arches}
- rust-sequoia-sop
ExclusiveArch: %{rust_arches}
- rust-sequoia-sq
ExclusiveArch: %{rust_arches}
- rust-sequoia-sqv
ExclusiveArch: %{rust_arches}
- rust-serde
ExclusiveArch: %{rust_arches}
- rust-serde-big-array
ExclusiveArch: %{rust_arches}
- rust-serde-pickle
ExclusiveArch: %{rust_arches}
- rust-serde-value
ExclusiveArch: %{rust_arches}
- rust-serde-xml-rs
ExclusiveArch: %{rust_arches}
- rust-serde_bytes
ExclusiveArch: %{rust_arches}
- rust-serde_cbor
ExclusiveArch: %{rust_arches}
- rust-serde_derive
ExclusiveArch: %{rust_arches}
- rust-serde_ignored
ExclusiveArch: %{rust_arches}
- rust-serde_json
ExclusiveArch: %{rust_arches}
- rust-serde_repr
ExclusiveArch: %{rust_arches}
- rust-serde_stacker
ExclusiveArch: %{rust_arches}
- rust-serde_test
ExclusiveArch: %{rust_arches}
- rust-serde_url_params
ExclusiveArch: %{rust_arches}
- rust-serde_urlencoded
ExclusiveArch: %{rust_arches}
- rust-serde_urlencoded0.6
ExclusiveArch: %{rust_arches}
- rust-serde_with_macros
ExclusiveArch: %{rust_arches}
- rust-serde_yaml
ExclusiveArch: %{rust_arches}
- rust-serial_test
ExclusiveArch: %{rust_arches}
- rust-serial_test_derive
ExclusiveArch: %{rust_arches}
- rust-servo-fontconfig
ExclusiveArch: %{rust_arches}
- rust-servo-fontconfig-sys
ExclusiveArch: %{rust_arches}
- rust-sev
ExclusiveArch: %{rust_arches}
- rust-sevctl
ExclusiveArch: %{rust_arches}
- rust-sha-1
ExclusiveArch: %{rust_arches}
- rust-sha1
ExclusiveArch: %{rust_arches}
- rust-sha1collisiondetection
ExclusiveArch: %{rust_arches}
- rust-sha2
ExclusiveArch: %{rust_arches}
- rust-sha3
ExclusiveArch: %{rust_arches}
- rust-shared_child
ExclusiveArch: %{rust_arches}
- rust-shared_library
ExclusiveArch: %{rust_arches}
- rust-shell-escape
ExclusiveArch: %{rust_arches}
- rust-shell-words
ExclusiveArch: %{rust_arches}
- rust-shellexpand
ExclusiveArch: %{rust_arches}
- rust-shlex
ExclusiveArch: %{rust_arches}
- rust-signal-hook
ExclusiveArch: %{rust_arches}
- rust-signal-hook-registry
ExclusiveArch: %{rust_arches}
- rust-signal-hook0.1
ExclusiveArch: %{rust_arches}
- rust-silver
ExclusiveArch: %{rust_arches}
- rust-simd_helpers
ExclusiveArch: %{rust_arches}
- rust-simple_asn1
ExclusiveArch: %{rust_arches}
- rust-simple_logger
ExclusiveArch: %{rust_arches}
- rust-simplelog
ExclusiveArch: %{rust_arches}
- rust-siphasher
ExclusiveArch: %{rust_arches}
- rust-size
ExclusiveArch: %{rust_arches}
- rust-sized-chunks
ExclusiveArch: %{rust_arches}
- rust-skeptic
ExclusiveArch: %{rust_arches}
- rust-skim
ExclusiveArch: %{rust_arches}
- rust-slab
ExclusiveArch: %{rust_arches}
- rust-slash-formatter
ExclusiveArch: %{rust_arches}
- rust-slice-deque
ExclusiveArch: %{rust_arches}
- rust-slog
ExclusiveArch: %{rust_arches}
- rust-slog-async
ExclusiveArch: %{rust_arches}
- rust-slog-scope
ExclusiveArch: %{rust_arches}
- rust-slog-term
ExclusiveArch: %{rust_arches}
- rust-slotmap
ExclusiveArch: %{rust_arches}
- rust-slug
ExclusiveArch: %{rust_arches}
- rust-sluice
ExclusiveArch: %{rust_arches}
- rust-smallvec
ExclusiveArch: %{rust_arches}
- rust-smart-default
ExclusiveArch: %{rust_arches}
- rust-smawk
ExclusiveArch: %{rust_arches}
- rust-smithay-client-toolkit
ExclusiveArch: %{rust_arches}
- rust-smithay-clipboard
ExclusiveArch: %{rust_arches}
- rust-snafu
ExclusiveArch: %{rust_arches}
- rust-snafu-derive
ExclusiveArch: %{rust_arches}
- rust-snake_case
ExclusiveArch: %{rust_arches}
- rust-snowflake
ExclusiveArch: %{rust_arches}
- rust-socket2
ExclusiveArch: %{rust_arches}
- rust-socket2_0.3
ExclusiveArch: %{rust_arches}
- rust-soup-sys
ExclusiveArch: %{rust_arches}
- rust-sourceview
ExclusiveArch: %{rust_arches}
- rust-spin
ExclusiveArch: %{rust_arches}
- rust-spin_on
ExclusiveArch: %{rust_arches}
- rust-spinning_top
ExclusiveArch: %{rust_arches}
- rust-spmc
ExclusiveArch: %{rust_arches}
- rust-ssh-key-dir
ExclusiveArch: %{rust_arches}
- rust-stable_deref_trait
ExclusiveArch: %{rust_arches}
- rust-stacker
ExclusiveArch: %{rust_arches}
- rust-standback
ExclusiveArch: %{rust_arches}
- rust-starship
ExclusiveArch: %{rust_arches}
- rust-starship_module_config_derive
ExclusiveArch: %{rust_arches}
- rust-static_assertions
ExclusiveArch: %{rust_arches}
- rust-statistical
ExclusiveArch: %{rust_arches}
- rust-stb_truetype
ExclusiveArch: %{rust_arches}
- rust-streaming-stats
ExclusiveArch: %{rust_arches}
- rust-string
ExclusiveArch: %{rust_arches}
- rust-string_cache
ExclusiveArch: %{rust_arches}
- rust-string_cache_codegen
ExclusiveArch: %{rust_arches}
- rust-string_cache_shared
ExclusiveArch: %{rust_arches}
- rust-strings
ExclusiveArch: %{rust_arches}
- rust-strip-ansi-escapes
ExclusiveArch: %{rust_arches}
- rust-strsim
ExclusiveArch: %{rust_arches}
- rust-structopt
ExclusiveArch: %{rust_arches}
- rust-structopt-derive
ExclusiveArch: %{rust_arches}
- rust-structopt-derive0.2
ExclusiveArch: %{rust_arches}
- rust-structopt0.2
ExclusiveArch: %{rust_arches}
- rust-strum
ExclusiveArch: %{rust_arches}
- rust-strum_macros
ExclusiveArch: %{rust_arches}
- rust-subtle
ExclusiveArch: %{rust_arches}
- rust-sudo_plugin
ExclusiveArch: %{rust_arches}
- rust-sudo_plugin-sys
ExclusiveArch: %{rust_arches}
- rust-sval
ExclusiveArch: %{rust_arches}
- rust-sval_derive
ExclusiveArch: %{rust_arches}
- rust-svg_metadata
ExclusiveArch: %{rust_arches}
- rust-sxd-document
ExclusiveArch: %{rust_arches}
- rust-syn
ExclusiveArch: %{rust_arches}
- rust-syn-mid
ExclusiveArch: %{rust_arches}
- rust-syn0.15
ExclusiveArch: %{rust_arches}
- rust-synom
ExclusiveArch: %{rust_arches}
- rust-synstructure
ExclusiveArch: %{rust_arches}
- rust-syntect
ExclusiveArch: %{rust_arches}
- rust-sys-info
ExclusiveArch: %{rust_arches}
- rust-sysinfo
ExclusiveArch: %{rust_arches}
- rust-system-deps
ExclusiveArch: %{rust_arches}
- rust-systemd
ExclusiveArch: %{rust_arches}
- rust-tabwriter
ExclusiveArch: %{rust_arches}
- rust-take
ExclusiveArch: %{rust_arches}
- rust-take_mut
ExclusiveArch: %{rust_arches}
- rust-tap
ExclusiveArch: %{rust_arches}
- rust-tar
ExclusiveArch: %{rust_arches}
- rust-target-lexicon
ExclusiveArch: %{rust_arches}
- rust-tealdeer
ExclusiveArch: %{rust_arches}
- rust-teloxide
ExclusiveArch: %{rust_arches}
- rust-teloxide-macros
ExclusiveArch: %{rust_arches}
- rust-tempdir
ExclusiveArch: %{rust_arches}
- rust-tempfile
ExclusiveArch: %{rust_arches}
- rust-tendril
ExclusiveArch: %{rust_arches}
- rust-tera
ExclusiveArch: %{rust_arches}
- rust-term
ExclusiveArch: %{rust_arches}
- rust-term_grid
ExclusiveArch: %{rust_arches}
- rust-term_size
ExclusiveArch: %{rust_arches}
- rust-termcolor
ExclusiveArch: %{rust_arches}
- rust-terminal_size
ExclusiveArch: %{rust_arches}
- rust-terminfo
ExclusiveArch: %{rust_arches}
- rust-termion
ExclusiveArch: %{rust_arches}
- rust-termios
ExclusiveArch: %{rust_arches}
- rust-test-assembler
ExclusiveArch: %{rust_arches}
- rust-tester
ExclusiveArch: %{rust_arches}
- rust-testing_logger
ExclusiveArch: %{rust_arches}
- rust-textwrap
ExclusiveArch: %{rust_arches}
- rust-textwrap0.11
ExclusiveArch: %{rust_arches}
- rust-textwrap0.12
ExclusiveArch: %{rust_arches}
- rust-thiserror
ExclusiveArch: %{rust_arches}
- rust-thiserror-impl
ExclusiveArch: %{rust_arches}
- rust-thread-id
ExclusiveArch: %{rust_arches}
- rust-thread-scoped
ExclusiveArch: %{rust_arches}
- rust-thread_local
ExclusiveArch: %{rust_arches}
- rust-threadpool
ExclusiveArch: %{rust_arches}
- rust-tiff
ExclusiveArch: %{rust_arches}
- rust-tiger-digest
ExclusiveArch: %{rust_arches}
- rust-time
ExclusiveArch: %{rust_arches}
- rust-time-macros
ExclusiveArch: %{rust_arches}
- rust-time-macros-impl
ExclusiveArch: %{rust_arches}
- rust-time0.1
ExclusiveArch: %{rust_arches}
- rust-timebomb
ExclusiveArch: %{rust_arches}
- rust-timer
ExclusiveArch: %{rust_arches}
- rust-timerfd
ExclusiveArch: %{rust_arches}
- rust-tiny-keccak
ExclusiveArch: %{rust_arches}
- rust-tiny_http
ExclusiveArch: %{rust_arches}
- rust-tinytemplate
ExclusiveArch: %{rust_arches}
- rust-tinyvec
ExclusiveArch: %{rust_arches}
- rust-tinyvec_macros
ExclusiveArch: %{rust_arches}
- rust-tokei
ExclusiveArch: %{rust_arches}
- rust-tokio
ExclusiveArch: %{rust_arches}
- rust-tokio-codec
ExclusiveArch: %{rust_arches}
- rust-tokio-core
ExclusiveArch: %{rust_arches}
- rust-tokio-current-thread
ExclusiveArch: %{rust_arches}
- rust-tokio-executor
ExclusiveArch: %{rust_arches}
- rust-tokio-fs
ExclusiveArch: %{rust_arches}
- rust-tokio-io
ExclusiveArch: %{rust_arches}
- rust-tokio-io-pool
ExclusiveArch: %{rust_arches}
- rust-tokio-macros
ExclusiveArch: %{rust_arches}
- rust-tokio-macros0.2
ExclusiveArch: %{rust_arches}
- rust-tokio-mock-task
ExclusiveArch: %{rust_arches}
- rust-tokio-native-tls
ExclusiveArch: %{rust_arches}
- rust-tokio-openssl
ExclusiveArch: %{rust_arches}
- rust-tokio-openssl0.4
ExclusiveArch: %{rust_arches}
- rust-tokio-reactor
ExclusiveArch: %{rust_arches}
- rust-tokio-socks
ExclusiveArch: %{rust_arches}
- rust-tokio-socks0.3
ExclusiveArch: %{rust_arches}
- rust-tokio-stream
ExclusiveArch: %{rust_arches}
- rust-tokio-sync
ExclusiveArch: %{rust_arches}
- rust-tokio-tcp
ExclusiveArch: %{rust_arches}
- rust-tokio-test
ExclusiveArch: %{rust_arches}
- rust-tokio-threadpool
ExclusiveArch: %{rust_arches}
- rust-tokio-timer
ExclusiveArch: %{rust_arches}
- rust-tokio-tls
ExclusiveArch: %{rust_arches}
- rust-tokio-tls0.2
ExclusiveArch: %{rust_arches}
- rust-tokio-tungstenite
ExclusiveArch: %{rust_arches}
- rust-tokio-udp
ExclusiveArch: %{rust_arches}
- rust-tokio-uds
ExclusiveArch: %{rust_arches}
- rust-tokio-util
ExclusiveArch: %{rust_arches}
- rust-tokio-util0.2
ExclusiveArch: %{rust_arches}
- rust-tokio-util0.3
ExclusiveArch: %{rust_arches}
- rust-tokio0.1
ExclusiveArch: %{rust_arches}
- rust-tokio0.2
ExclusiveArch: %{rust_arches}
- rust-toml
ExclusiveArch: %{rust_arches}
- rust-toml0.4
ExclusiveArch: %{rust_arches}
- rust-tower-layer
ExclusiveArch: %{rust_arches}
- rust-tower-service
ExclusiveArch: %{rust_arches}
- rust-tower-test
ExclusiveArch: %{rust_arches}
- rust-tower-util
ExclusiveArch: %{rust_arches}
- rust-tpm2-policy
ExclusiveArch: %{rust_arches}
- rust-tracing
ExclusiveArch: %{rust_arches}
- rust-tracing-attributes
ExclusiveArch: %{rust_arches}
- rust-tracing-core
ExclusiveArch: %{rust_arches}
- rust-tracing-futures
ExclusiveArch: %{rust_arches}
- rust-traitobject
ExclusiveArch: %{rust_arches}
- rust-treebitmap
ExclusiveArch: %{rust_arches}
- rust-treeline
ExclusiveArch: %{rust_arches}
- rust-trust-dns-native-tls
ExclusiveArch: %{rust_arches}
- rust-trust-dns-native-tls0.19
ExclusiveArch: %{rust_arches}
- rust-trust-dns-openssl
ExclusiveArch: %{rust_arches}
- rust-trust-dns-openssl0.19
ExclusiveArch: %{rust_arches}
- rust-trust-dns-proto
ExclusiveArch: %{rust_arches}
- rust-trust-dns-proto0.19
ExclusiveArch: %{rust_arches}
- rust-trust-dns-resolver
ExclusiveArch: %{rust_arches}
- rust-trust-dns-resolver0.19
ExclusiveArch: %{rust_arches}
- rust-try-lock
ExclusiveArch: %{rust_arches}
- rust-try_from
ExclusiveArch: %{rust_arches}
- rust-try_or
ExclusiveArch: %{rust_arches}
- rust-trybuild
ExclusiveArch: %{rust_arches}
- rust-tss-esapi
ExclusiveArch: %{rust_arches}
- rust-tss-esapi-sys
ExclusiveArch: %{rust_arches}
- rust-ttf-parser
ExclusiveArch: %{rust_arches}
- rust-tui
ExclusiveArch: %{rust_arches}
- rust-tui-react
ExclusiveArch: %{rust_arches}
- rust-tui0.11
ExclusiveArch: %{rust_arches}
- rust-tui0.9
ExclusiveArch: %{rust_arches}
- rust-tuikit
ExclusiveArch: %{rust_arches}
- rust-tungstenite
ExclusiveArch: %{rust_arches}
- rust-twoway
ExclusiveArch: %{rust_arches}
- rust-typeable
ExclusiveArch: %{rust_arches}
- rust-typed-arena
ExclusiveArch: %{rust_arches}
- rust-typemap
ExclusiveArch: %{rust_arches}
- rust-typenum
ExclusiveArch: %{rust_arches}
- rust-typetag-impl
ExclusiveArch: %{rust_arches}
- rust-ucd-parse
ExclusiveArch: %{rust_arches}
- rust-ucd-trie
ExclusiveArch: %{rust_arches}
- rust-ucd-util
ExclusiveArch: %{rust_arches}
- rust-unchecked-index
ExclusiveArch: %{rust_arches}
- rust-unescape
ExclusiveArch: %{rust_arches}
- rust-unic-char-property
ExclusiveArch: %{rust_arches}
- rust-unic-char-range
ExclusiveArch: %{rust_arches}
- rust-unic-common
ExclusiveArch: %{rust_arches}
- rust-unic-segment
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-category
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-common
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-segment
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-version
ExclusiveArch: %{rust_arches}
- rust-unicase
ExclusiveArch: %{rust_arches}
- rust-unicase1
ExclusiveArch: %{rust_arches}
- rust-unicode-bidi
ExclusiveArch: %{rust_arches}
- rust-unicode-normalization
ExclusiveArch: %{rust_arches}
- rust-unicode-segmentation
ExclusiveArch: %{rust_arches}
- rust-unicode-width
ExclusiveArch: %{rust_arches}
- rust-unicode-xid
ExclusiveArch: %{rust_arches}
- rust-unicode-xid0.1
ExclusiveArch: %{rust_arches}
- rust-unicode_categories
ExclusiveArch: %{rust_arches}
- rust-unindent
ExclusiveArch: %{rust_arches}
- rust-universal-hash
ExclusiveArch: %{rust_arches}
- rust-unix_socket
ExclusiveArch: %{rust_arches}
- rust-unreachable
ExclusiveArch: %{rust_arches}
- rust-unsafe-any
ExclusiveArch: %{rust_arches}
- rust-untrusted
ExclusiveArch: %{rust_arches}
- rust-uom
ExclusiveArch: %{rust_arches}
- rust-url
ExclusiveArch: %{rust_arches}
- rust-url1
ExclusiveArch: %{rust_arches}
- rust-url_serde
ExclusiveArch: %{rust_arches}
- rust-urlencoding
ExclusiveArch: %{rust_arches}
- rust-urlocator
ExclusiveArch: %{rust_arches}
- rust-urlshortener
ExclusiveArch: %{rust_arches}
- rust-users
ExclusiveArch: %{rust_arches}
- rust-users0.10
ExclusiveArch: %{rust_arches}
- rust-utf-8
ExclusiveArch: %{rust_arches}
- rust-utf8-cstr
ExclusiveArch: %{rust_arches}
- rust-utf8-ranges
ExclusiveArch: %{rust_arches}
- rust-utf8-width
ExclusiveArch: %{rust_arches}
- rust-utf8parse
ExclusiveArch: %{rust_arches}
- rust-uuid
ExclusiveArch: %{rust_arches}
- rust-uuid0.7
ExclusiveArch: %{rust_arches}
- rust-v_escape
ExclusiveArch: %{rust_arches}
- rust-v_escape_derive
ExclusiveArch: %{rust_arches}
- rust-v_frame
ExclusiveArch: %{rust_arches}
- rust-v_htmlescape
ExclusiveArch: %{rust_arches}
- rust-varlink
ExclusiveArch: %{rust_arches}
- rust-varlink-cli
ExclusiveArch: %{rust_arches}
- rust-varlink_generator
ExclusiveArch: %{rust_arches}
- rust-varlink_parser
ExclusiveArch: %{rust_arches}
- rust-varlink_stdinterfaces
ExclusiveArch: %{rust_arches}
- rust-vec-arena
ExclusiveArch: %{rust_arches}
- rust-vec_map
ExclusiveArch: %{rust_arches}
- rust-vergen
ExclusiveArch: %{rust_arches}
- rust-version
ExclusiveArch: %{rust_arches}
- rust-version-compare
ExclusiveArch: %{rust_arches}
- rust-version-sync
ExclusiveArch: %{rust_arches}
- rust-version-sync0.8
ExclusiveArch: %{rust_arches}
- rust-version_check
ExclusiveArch: %{rust_arches}
- rust-vmm-sys-util
ExclusiveArch: x86_64 aarch64 ppc64le
- rust-vmw_backdoor
ExclusiveArch: %{rust_arches}
- rust-void
ExclusiveArch: %{rust_arches}
- rust-vte
ExclusiveArch: %{rust_arches}
- rust-vte0.3
ExclusiveArch: %{rust_arches}
- rust-vte_generate_state_changes
ExclusiveArch: %{rust_arches}
- rust-wait-timeout
ExclusiveArch: %{rust_arches}
- rust-waker-fn
ExclusiveArch: %{rust_arches}
- rust-walkdir
ExclusiveArch: %{rust_arches}
- rust-want
ExclusiveArch: %{rust_arches}
- rust-warp
ExclusiveArch: %{rust_arches}
- rust-warp0.2
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-backend
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-macro
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-macro-support
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-shared
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-test-macro
ExclusiveArch: %{rust_arches}
- rust-wayland-client
ExclusiveArch: %{rust_arches}
- rust-wayland-commons
ExclusiveArch: %{rust_arches}
- rust-wayland-cursor
ExclusiveArch: %{rust_arches}
- rust-wayland-egl
ExclusiveArch: %{rust_arches}
- rust-wayland-protocols
ExclusiveArch: %{rust_arches}
- rust-wayland-scanner
ExclusiveArch: %{rust_arches}
- rust-wayland-server
ExclusiveArch: %{rust_arches}
- rust-wayland-sys
ExclusiveArch: %{rust_arches}
- rust-web-sys
ExclusiveArch: %{rust_arches}
- rust-webbrowser
ExclusiveArch: %{rust_arches}
- rust-webkit2gtk
ExclusiveArch: %{rust_arches}
- rust-webkit2gtk-sys
ExclusiveArch: %{rust_arches}
- rust-websocket
ExclusiveArch: %{rust_arches}
- rust-websocket-base
ExclusiveArch: %{rust_arches}
- rust-weezl
ExclusiveArch: %{rust_arches}
- rust-which
ExclusiveArch: %{rust_arches}
- rust-wild
ExclusiveArch: %{rust_arches}
- rust-wildmatch
ExclusiveArch: %{rust_arches}
- rust-winit
ExclusiveArch: %{rust_arches}
- rust-ws
ExclusiveArch: %{rust_arches}
- rust-wyz
ExclusiveArch: %{rust_arches}
- rust-x11
ExclusiveArch: %{rust_arches}
- rust-x11-clipboard
ExclusiveArch: %{rust_arches}
- rust-x11-dl
ExclusiveArch: %{rust_arches}
- rust-xattr
ExclusiveArch: %{rust_arches}
- rust-xcb
ExclusiveArch: %{rust_arches}
- rust-xcursor
ExclusiveArch: %{rust_arches}
- rust-xdg
ExclusiveArch: %{rust_arches}
- rust-xkbcommon
ExclusiveArch: %{rust_arches}
- rust-xml-rs
ExclusiveArch: %{rust_arches}
- rust-xml5ever
ExclusiveArch: %{rust_arches}
- rust-xmlparser
ExclusiveArch: %{rust_arches}
- rust-xz2
ExclusiveArch: %{rust_arches}
- rust-y4m
ExclusiveArch: %{rust_arches}
- rust-yaml-rust
ExclusiveArch: %{rust_arches}
- rust-yaml-rust0.3
ExclusiveArch: %{rust_arches}
- rust-ybaas
ExclusiveArch: %{rust_arches}
- rust-ytop
ExclusiveArch: %{rust_arches}
- rust-yubibomb
ExclusiveArch: %{rust_arches}
- rust-yup-oauth2
ExclusiveArch: %{rust_arches}
- rust-zbase32
ExclusiveArch: %{rust_arches}
- rust-zbus
ExclusiveArch: %{rust_arches}
- rust-zbus_macros
ExclusiveArch: %{rust_arches}
- rust-zeroize
ExclusiveArch: %{rust_arches}
- rust-zeroize_derive
ExclusiveArch: %{rust_arches}
- rust-zincati
ExclusiveArch: %{rust_arches}
- rust-zip
ExclusiveArch: %{rust_arches}
- rust-zoneinfo_compiled
ExclusiveArch: %{rust_arches}
- rust-zoxide
ExclusiveArch: %{rust_arches}
- rust-zram-generator
ExclusiveArch: %{rust_arches}
- rust-zstd
ExclusiveArch: %{rust_arches}
- rust-zstd-safe
ExclusiveArch: %{rust_arches}
- rust-zstd-sys
ExclusiveArch: %{rust_arches}
- rust-zvariant
ExclusiveArch: %{rust_arches}
- rust-zvariant_derive
ExclusiveArch: %{rust_arches}
- s390utils
ExclusiveArch: s390 s390x
- safetyblanket
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- sagemath
ExclusiveArch: aarch64 %{ix86} x86_64 ppc sparcv9
- sbcl
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- sbd
ExclusiveArch: i686 x86_64 s390x aarch64 ppc64le
- sbsigntools
ExclusiveArch: x86_64 aarch64 %{arm} %{ix86}
- seabios
ExclusiveArch: x86_64
- seadrive-gui
ExclusiveArch: %{qt5_qtwebengine_arches}
- seafile-client
ExclusiveArch: %{qt5_qtwebengine_arches}
- seamonkey
ExclusiveArch: x86_64
- seqan3
ExclusiveArch: %{power64} x86_64 aarch64
- servicelog
ExclusiveArch: ppc %{power64}
- sgabios
ExclusiveArch: %{ix86} x86_64
- sharpfont
ExclusiveArch: %mono_arches
- sharpziplib
ExclusiveArch: %{mono_arches}
- shim
ExclusiveArch: %{efi}
- shim-unsigned-aarch64
ExclusiveArch: aarch64
- shim-unsigned-x64
ExclusiveArch: x86_64
- sigul
ExclusiveArch: x86_64
- skychart
ExclusiveArch: %{fpc_arches}
- snapd
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- soup-sharp
ExclusiveArch: %{mono_arches}
- sparkleshare
ExclusiveArch: %{mono_arches}
- spicctrl
ExclusiveArch: %{ix86} x86_64
- spice
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- springlobby
ExclusiveArch: %{ix86} x86_64
- squeekboard
ExclusiveArch: %{rust_arches}
- startdde
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- statsd
ExclusiveArch: %{nodejs_arches} noarch
- stratis-cli
ExclusiveArch: %{rust_arches} noarch
- stratisd
ExclusiveArch: %{rust_arches}
- stripesnoop
ExclusiveArch: %{ix86} x86_64
- supercollider
ExclusiveArch: %{qt5_qtwebengine_arches}
- supermin
ExclusiveArch: %{kernel_arches}
- svt-av1
ExclusiveArch: x86_64
- svt-vp9
ExclusiveArch: x86_64
- swift-lang
ExclusiveArch: x86_64 aarch64
- sysbench
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64le s390x
- syslinux
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- taglib-sharp
ExclusiveArch: %{mono_arches}
- tarantool
ExclusiveArch: %{ix86} x86_64
- tboot
ExclusiveArch: %{ix86} x86_64
- tdlib
ExclusiveArch: x86_64
- templates_parser
ExclusiveArch: %GPRbuild_arches
- ternimal
ExclusiveArch: %{rust_arches}
- testcloud
ExclusiveArch: %{kernel_arches} noarch
- themonospot-base
ExclusiveArch: %mono_arches
- themonospot-console
ExclusiveArch: %mono_arches
- themonospot-gui-gtk
ExclusiveArch: %mono_arches
- themonospot-plugin-avi
ExclusiveArch: %mono_arches
- themonospot-plugin-mkv
ExclusiveArch: %mono_arches
- thermald
ExclusiveArch: %{ix86} x86_64
- tilix
ExclusiveArch: %{ldc_arches}
- tmux-top
ExclusiveArch: %{go_arches}
- tomboy
ExclusiveArch: %{mono_arches}
- topojson-client
ExclusiveArch: %{nodejs_arches} noarch
- topojson-server
ExclusiveArch: %{nodejs_arches} noarch
- topojson-simplify
ExclusiveArch: %{nodejs_arches} noarch
- torbrowser-launcher
ExclusiveArch: %{ix86} x86_64
- tuned-profiles-nfv-host-bin
ExclusiveArch: %{ix86} x86_64
- uClibc
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
- ucx
ExclusiveArch: aarch64 ppc64le x86_64
- ugene
ExclusiveArch: %{ix86} x86_64
- uglify-js
ExclusiveArch: %{nodejs_arches} noarch
- uglify-js1
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- unetbootin
ExclusiveArch: %{ix86} x86_64
- ursa-major
ExclusiveArch: noarch aarch64 ppc64le s390x x86_64
- v8-314
ExclusiveArch: %{ix86} x86_64 %{arm} mips mipsel ppc ppc64
- valgrind
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x armv7hl aarch64
- vboot-utils
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- vim-go
ExclusiveArch: %{?golang_arches}%{!?golang_arches:%{ix86} x86_64 %{arm}}
- virt-p2v
ExclusiveArch: x86_64
- virt-v2v
ExclusiveArch: x86_64
- virtualbox-guest-additions
ExclusiveArch: i686 x86_64
- vkd3d
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- vmaf
ExclusiveArch: x86_64
- vmem
ExclusiveArch: x86_64
- vmemcache
ExclusiveArch: x86_64 ppc64 ppc64le s390x aarch64
- vrq
ExclusiveArch: %{ix86} x86_64
- warsow
ExclusiveArch: %{ix86} x86_64 %{arm}
- warsow-data
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{ix86} x86_64 %{arm}
- webkit2-sharp
ExclusiveArch: %mono_arches
- wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
ExclusiveArch: %{ix86} %{arm}
- wine-dxvk
ExclusiveArch: %{ix86} x86_64
- winetricks
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- wxMaxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
- x2goclient
ExclusiveArch: x86_64
- xe-guest-utilities-latest
ExclusiveArch: %{ix86} x86_64
- xen
ExclusiveArch: %{ix86} x86_64 armv7hl aarch64
- xmlada
ExclusiveArch: %{GPRbuild_arches}
- xorg-x11-drv-armsoc
ExclusiveArch: %{arm} aarch64
- xorg-x11-drv-intel
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-openchrome
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vesa
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vmware
ExclusiveArch: %{ix86} x86_64 ia64
- xsp
ExclusiveArch: %mono_arches
- yarnpkg
ExclusiveArch: %{nodejs_arches} noarch
- zeromq-ada
ExclusiveArch: %{GPRbuild_arches}
- zlib-ada
ExclusiveArch: %{GPRbuild_arches}
- zlib-ng
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
- zola
ExclusiveArch: %{rust_arches}
2 years, 11 months
Architecture specific change in rpms/gambas3.git
by githook-noreply@fedoraproject.org
The package rpms/gambas3.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/gambas3.git/commit/?id=2d25d07150....
Change:
+%ifnarch ppc64le s390x
Thanks.
Full change:
============
commit 2d25d0715076b44082090cba41fd6d56d3ff25cb
Author: Tom spot Callaway <spot(a)fedoraproject.org>
Date: Wed May 5 12:41:28 2021 -0400
no qt5-webview subpackage for ppc64le/s390x because no qt5-qtwebengine-devel there
diff --git a/gambas3.spec b/gambas3.spec
index 64a4092..6bf30c7 100644
--- a/gambas3.spec
+++ b/gambas3.spec
@@ -31,7 +31,10 @@ BuildRequires: imlib2-devel, qt-webkit-devel, gsl-devel
BuildRequires: libtool, ncurses-devel, libX11-devel
BuildRequires: gmime-devel, libgnome-keyring-devel
BuildRequires: qt5-qtsvg-devel, qt5-qtbase-devel, qt5-qtx11extras-devel, qt5-qtwebkit-devel
-BuildRequires: qt5-qtwebengine-devel, poppler-cpp-devel
+%ifnarch ppc64le s390x
+BuildRequires: qt5-qtwebengine-devel
+%endif
+BuildRequires: poppler-cpp-devel
# We need this since linux/videodev.h is dead
BuildRequires: libv4l-devel
BuildRequires: openssl-devel, gmp-devel, glew-devel
@@ -1563,9 +1566,11 @@ install -m 0644 -p main/mime/application-x-gambas3.xml %{buildroot}%{_datadir}/m
%{_datadir}/%{name}/control/gb.qt5.webkit*
%{_datadir}/%{name}/info/gb.qt5.webkit.*
+%ifnarch ppc64le s390x
%files gb-qt5-webview
%{_libdir}/%{name}/gb.qt5.webview.*
%{_datadir}/%{name}/info/gb.qt5.webview.*
+%endif
%files gb-qt5-x11
%{_libdir}/%{name}/gb.qt5.x11.*
commit 9c989dec1451779bf47091c6b2babe348b1aef1c
Author: Tom spot Callaway <spot(a)fedoraproject.org>
Date: Wed May 5 11:11:19 2021 -0400
fix missing BR
diff --git a/gambas3.spec b/gambas3.spec
index a2d84b7..64a4092 100644
--- a/gambas3.spec
+++ b/gambas3.spec
@@ -31,6 +31,7 @@ BuildRequires: imlib2-devel, qt-webkit-devel, gsl-devel
BuildRequires: libtool, ncurses-devel, libX11-devel
BuildRequires: gmime-devel, libgnome-keyring-devel
BuildRequires: qt5-qtsvg-devel, qt5-qtbase-devel, qt5-qtx11extras-devel, qt5-qtwebkit-devel
+BuildRequires: qt5-qtwebengine-devel, poppler-cpp-devel
# We need this since linux/videodev.h is dead
BuildRequires: libv4l-devel
BuildRequires: openssl-devel, gmp-devel, glew-devel
commit 771d479da7f2710e53df2bdbba32cfe6a46ed418
Author: Tom spot Callaway <spot(a)fedoraproject.org>
Date: Wed May 5 10:13:17 2021 -0400
3.16.0
diff --git a/.gitignore b/.gitignore
index 50ae2d0..dcf3aa9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,3 +40,4 @@
/gambas-3.15.0.tar.bz2
/gambas-3.15.1.tar.bz2
/gambas-3.15.2.tar.bz2
+/gambas-3.16.0.tar.bz2
diff --git a/gambas3-3.15.2-poppler-splash.patch b/gambas3-3.15.2-poppler-splash.patch
deleted file mode 100644
index dee5a58..0000000
--- a/gambas3-3.15.2-poppler-splash.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- gambas-3.15.2/gb.poppler/configure.ac
-+++ gambas-3.15.2/gb.poppler/configure.ac
-@@ -9,6 +9,6 @@ GB_COMPONENT_PKG_CONFIG(
- POPPLER,
- gb.poppler,
- [src],
-- 'poppler >= 0.20' poppler-splash poppler-glib)
-+ 'poppler >= 0.20' poppler-glib)
- AC_OUTPUT( Makefile src/Makefile )
- GB_PRINT_MESSAGES
diff --git a/gambas3.spec b/gambas3.spec
index 8f108d7..a2d84b7 100644
--- a/gambas3.spec
+++ b/gambas3.spec
@@ -7,8 +7,8 @@
Name: gambas3
Summary: IDE based on a basic interpreter with object extensions
-Version: 3.15.2
-Release: 5%{?dist}
+Version: 3.16.0
+Release: 1%{?dist}
License: GPL+
URL: http://gambas.sourceforge.net/
Source0: https://gitlab.com/gambas/gambas/-/archive/%{version}/gambas-%{version}.t...
@@ -28,7 +28,7 @@ BuildRequires: xdg-utils, glibc-devel, libffi-devel
BuildRequires: cairo-devel, qt4-devel, dbus-devel, libXcursor-devel
BuildRequires: SDL_ttf-devel, sqlite2-devel, glew-devel
BuildRequires: imlib2-devel, qt-webkit-devel, gsl-devel
-BuildRequires: libtool, ncurses-devel
+BuildRequires: libtool, ncurses-devel, libX11-devel
BuildRequires: gmime-devel, libgnome-keyring-devel
BuildRequires: qt5-qtsvg-devel, qt5-qtbase-devel, qt5-qtx11extras-devel, qt5-qtwebkit-devel
# We need this since linux/videodev.h is dead
@@ -37,6 +37,7 @@ BuildRequires: openssl-devel, gmp-devel, glew-devel
BuildRequires: gstreamer1-plugins-base-devel gstreamer1-devel
BuildRequires: openal-soft-devel, alure-devel
BuildRequires: pkgconfig(x11), pkgconfig(gl)
+BuildRequires: pkgconfig(webkit2gtk-4.0), pkgconfig(libzstd)
# Something on arm is pulling this in...
BuildRequires: dumb-devel
BuildRequires: fluidsynth-devel
@@ -48,7 +49,6 @@ BuildRequires: make
Patch1: %{name}-3.12.2-nolintl.patch
Patch2: %{name}-3.12.2-noliconv.patch
Patch5: %{name}-3.14.1-gst1.patch
-Patch6: %{name}-3.15.2-poppler-splash.patch
%description
Gambas3 is a free development environment based on a Basic interpreter
@@ -62,55 +62,58 @@ on...
Summary: Runtime environment for Gambas3
Provides: %{name}-gb-gui = %{version}-%{release}
Obsoletes: %{name}-gb-gui <= 3.4
+Provides: %{name}-gb-test = %{version}-%{release}
+Obsoletes: %{name}-gb-test <= 3.15.2
%description runtime
Gambas3 is a free development environment based on a Basic interpreter
with object extensions, like Visual Basic. This package contains the
runtime components necessary to run programs designed in Gambas3.
-%package devel
+%package dev-tools
Summary: Development environment for Gambas3
Requires: %{name}-runtime = %{version}-%{release}
+Provides: %{name}-devel = %{version}-%{release}
+Obsoletes: %{name}-devel <= 3.15.2
-%description devel
-The gambas3-devel package contains the tools needed to compile Gambas3
+%description dev-tools
+The gambas3-dev-tools package contains the tools needed to compile Gambas3
projects without having to install the complete development environment
(gambas3-ide).
%package scripter
Summary: Scripter program that allows the creation of Gambas3 scripts
Requires: %{name}-runtime = %{version}-%{release}
-Requires: %{name}-devel = %{version}-%{release}
+Requires: %{name}-dev-tools = %{version}-%{release}
+Requires: %{name}-gb-pcre = %{version}-%{release}
%description scripter
This package includes the scripter program that allows the user to
write script files in Gambas.
+%package gui
+Summary: Virtual package for Gambas3 packages that just need a gui
+Requires: (gambas3-gb-qt4 = %{version}-%{release} or gambas3-gb-qt5 = %{version}-%{release} or gambas3-gb-gtk = %{version}-%{release} or gambas3-gb-gtk3 = %{version}-%{release})
+
+%description gui
+This package is a virtual package that depends on one of the following
+packages: gambas3-gb-qt4, gambas3-gb-qt5, gambas3-gb-gtk, gambas3-gb-gtk3.
+It is used as a dependency for packages that requires any GUI package (like
+gambas3-gb-form).
+
%package ide
Summary: The complete Gambas3 Development Environment
License: GPL+
Provides: %{name} = %{version}-%{release}
-Requires: tar, gzip, rpm-build, gettext
+Requires: tar, gzip, rpm-build, gettext, wget
+Recommends: pngquant, translate-shell, git, subversion
Requires: %{name}-runtime = %{version}-%{release}
-Requires: %{name}-devel = %{version}-%{release}
-Requires: %{name}-gb-args = %{version}-%{release}
-Requires: %{name}-gb-cairo = %{version}-%{release}
-Requires: %{name}-gb-chart = %{version}-%{release}
+Requires: %{name}-dev-tools = %{version}-%{release}
Requires: %{name}-gb-clipper = %{version}-%{release}
-Requires: %{name}-gb-complex = %{version}-%{release}
-Requires: %{name}-gb-compress = %{version}-%{release}
-Requires: %{name}-gb-crypt = %{version}-%{release}
-Requires: %{name}-gb-data = %{version}-%{release}
Requires: %{name}-gb-db = %{version}-%{release}
Requires: %{name}-gb-db-form = %{version}-%{release}
-Requires: %{name}-gb-db-mysql = %{version}-%{release}
-Requires: %{name}-gb-db-odbc = %{version}-%{release}
-Requires: %{name}-gb-db-postgresql = %{version}-%{release}
-Requires: %{name}-gb-db-sqlite2 = %{version}-%{release}
-Requires: %{name}-gb-db-sqlite3 = %{version}-%{release}
-Requires: %{name}-gb-dbus = %{version}-%{release}
Requires: %{name}-gb-desktop = %{version}-%{release}
-Requires: %{name}-gb-desktop-gnome = %{version}-%{release}
+Requires: %{name}-gb-desktop-x11 = %{version}-%{release}
Requires: %{name}-gb-eval-highlight = %{version}-%{release}
Requires: %{name}-gb-form = %{version}-%{release}
Requires: %{name}-gb-form-dialog = %{version}-%{release}
@@ -119,92 +122,27 @@ Requires: %{name}-gb-form-mdi = %{version}-%{release}
Requires: %{name}-gb-form-print = %{version}-%{release}
Requires: %{name}-gb-form-stock = %{version}-%{release}
Requires: %{name}-gb-form-terminal = %{version}-%{release}
-Requires: %{name}-gb-gmp = %{version}-%{release}
-Requires: %{name}-gb-gsl = %{version}-%{release}
-Requires: %{name}-gb-gtk = %{version}-%{release}
-%if %{gtkopengl}
-Requires: %{name}-gb-gtk-opengl = %{version}-%{release}
-%else
-Provides: %{name}-gb-gtk-opengl = %{version}-%{release}
-Obsoletes: %{name}-gb-gtk-opengl < 3.14.3-4
-%endif
-Requires: %{name}-gb-gtk3 = %{version}-%{release}
-Requires: %{name}-gb-httpd = %{version}-%{release}
Requires: %{name}-gb-image = %{version}-%{release}
-Requires: %{name}-gb-image-effect = %{version}-%{release}
-Requires: %{name}-gb-image-imlib = %{version}-%{release}
-Requires: %{name}-gb-image-io = %{version}-%{release}
-Requires: %{name}-gb-inotify = %{version}-%{release}
-%if %{enablejit}
+# This isn't stated as a requirement upstream, but it clearly needed it in my testing
+%if 0%{enablejit}
Requires: %{name}-gb-jit = %{version}-%{release}
-%else
-# This is a lie, but we want to clean it out when we're going.
-Provides: %{name}-gb-jit = %{version}-%{release}
-Obsoletes: %{name}-gb-jit < 3.7.1
%endif
-Requires: %{name}-gb-libxml = %{version}-%{release}
-Requires: %{name}-gb-logging = %{version}-%{release}
-Requires: %{name}-gb-map = %{version}-%{release}
Requires: %{name}-gb-markdown = %{version}-%{release}
-Requires: %{name}-gb-media = %{version}-%{release}
-Requires: %{name}-gb-media-form = %{version}-%{release}
-Requires: %{name}-gb-memcached = %{version}-%{release}
-Requires: %{name}-gb-mime = %{version}-%{release}
-Requires: %{name}-gb-mysql = %{version}-%{release}
-Requires: %{name}-gb-ncurses = %{version}-%{release}
Requires: %{name}-gb-net = %{version}-%{release}
Requires: %{name}-gb-net-curl = %{version}-%{release}
-Requires: %{name}-gb-net-pop3 = %{version}-%{release}
-Requires: %{name}-gb-net-smtp = %{version}-%{release}
-Requires: %{name}-gb-openal = %{version}-%{release}
-Requires: %{name}-gb-opengl = %{version}-%{release}
-Requires: %{name}-gb-opengl-glu = %{version}-%{release}
-Requires: %{name}-gb-opengl-glsl = %{version}-%{release}
-Requires: %{name}-gb-opengl-sge = %{version}-%{release}
-Requires: %{name}-gb-openssl = %{version}-%{release}
-Requires: %{name}-gb-option = %{version}-%{release}
-Requires: %{name}-gb-pcre = %{version}-%{release}
-Requires: %{name}-gb-pdf = %{version}-%{release}
-Requires: %{name}-gb-poppler = %{version}-%{release}
-Requires: %{name}-gb-qt4 = %{version}-%{release}
-Requires: %{name}-gb-qt4-ext = %{version}-%{release}
-Requires: %{name}-gb-qt4-opengl = %{version}-%{release}
-Requires: %{name}-gb-qt4-webkit = %{version}-%{release}
-Requires: %{name}-gb-qt5 = %{version}-%{release}
-Requires: %{name}-gb-qt5-ext = %{version}-%{release}
-Requires: %{name}-gb-qt5-opengl = %{version}-%{release}
-Requires: %{name}-gb-qt5-webkit = %{version}-%{release}
-Requires: %{name}-gb-report = %{version}-%{release}
-Requires: %{name}-gb-report2 = %{version}-%{release}
-Requires: %{name}-gb-scanner = %{version}-%{release}
-Requires: %{name}-gb-sdl = %{version}-%{release}
-Requires: %{name}-gb-sdl-sound = %{version}-%{release}
-Requires: %{name}-gb-sdl2 = %{version}-%{release}
-Requires: %{name}-gb-sdl2-audio = %{version}-%{release}
Requires: %{name}-gb-settings = %{version}-%{release}
Requires: %{name}-gb-signal = %{version}-%{release}
Requires: %{name}-gb-term = %{version}-%{release}
-Requires: %{name}-gb-test = %{version}-%{release}
Requires: %{name}-gb-util = %{version}-%{release}
-Requires: %{name}-gb-util-web = %{version}-%{release}
-Requires: %{name}-gb-v4l = %{version}-%{release}
-Requires: %{name}-gb-vb = %{version}-%{release}
-Requires: %{name}-gb-web = %{version}-%{release}
-Requires: %{name}-gb-web-feed = %{version}-%{release}
-Requires: %{name}-gb-web-form = %{version}-%{release}
-Requires: %{name}-gb-web-gui = %{version}-%{release}
-Requires: %{name}-gb-xml = %{version}-%{release}
-Requires: %{name}-gb-xml-html = %{version}-%{release}
-Requires: %{name}-gb-xml-rpc = %{version}-%{release}
-Requires: %{name}-gb-xml-xslt = %{version}-%{release}
-# This is a lie, but we need to cleanup
-Provides: %{name}-examples = %{version}-%{release}
-Obsoletes: %{name}-examples <= 3.7.0
+# Technically, this is either gambas3-gb-qt4-webview or gambas3-gb-qt5-webview or gambas3-gb-gtk3-webview
+# Since Fedora is GNOME by default, we go with the gtk3
+Requires: %{name}-gb-gtk3-webview = %{version}-%{release}
+# Since Fedora is wayland by default...
+Requires: %{name}-gb-gtk3-wayland = %{version}-%{release}
%description ide
-This package includes the complete Gambas3 Development Environment and the
-database manager. Installing this package will give you all of the Gambas3
-components.
+This package includes the complete Gambas3 Development Environment.
+It pulls in the Gambas3 components necessary for the IDE to function.
%package gb-args
Summary: Gambas3 component package for args
@@ -216,6 +154,7 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-cairo
Summary: Gambas3 component package for cairo
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-image = %{version}-%{release}
%description gb-cairo
%{summary}
@@ -249,6 +188,30 @@ Requires: %{name}-runtime = %{version}-%{release}
%description gb-compress
%{summary}
+%package gb-compress-bzlib2
+Summary: Gambas3 component package for compress-bzlib2
+Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-compress = %{version}-%{release}
+
+%description gb-compress-bzlib2
+%{summary}
+
+%package gb-compress-zlib
+Summary: Gambas3 component package for compress-zlib
+Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-compress = %{version}-%{release}
+
+%description gb-compress-zlib
+%{summary}
+
+%package gb-compress-zstd
+Summary: Gambas3 component package for compress-zstd
+Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-compress = %{version}-%{release}
+
+%description gb-compress-zstd
+%{summary}
+
%package gb-crypt
Summary: Gambas3 component package for crypt
Requires: %{name}-runtime = %{version}-%{release}
@@ -322,16 +285,27 @@ Requires: %{name}-gb-db = %{version}-%{release}
%package gb-desktop
Summary: Gambas3 component package for desktop
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-image = %{version}-%{release}
%description gb-desktop
%{summary}
-%package gb-desktop-gnome
-Summary: Gambas3 component package for GNOME Desktop
+%package gb-desktop-gnome-keyring
+Summary: Gambas3 component package for GNOME Desktop Keyring
Requires: %{name}-runtime = %{version}-%{release}
Requires: %{name}-gb-desktop = %{version}-%{release}
+Provides: %{name}-gb-desktop-gnome = %{version}-%{release}
+Obsoletes: %{name}-gb-desktop-gnome <= 3.15.2
-%description gb-desktop-gnome
+%description gb-desktop-gnome-keyring
+%{summary}
+
+%package gb-desktop-x11
+Summary: Gambas3 component package for X11 desktop
+Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-image = %{version}-%{release}
+
+%description gb-desktop-x11
%{summary}
%package gb-dbus
@@ -351,6 +325,7 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-form
Summary: Gambas3 component package for form
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gui = %{version}-%{release}
%description gb-form
%{summary}
@@ -366,6 +341,8 @@ Requires: %{name}-gb-form = %{version}-%{release}
%package gb-form-editor
Summary: Gambas3 component package for form-editor
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-eval-highlight = %{version}-%{release}
+Requires: %{name}-gb-util = %{version}-%{release}
Requires: %{name}-gb-form = %{version}-%{release}
%description gb-form-editor
@@ -399,6 +376,7 @@ Requires: %{name}-runtime = %{version}-%{release}
Summary: Gambas3 component package for form-terminal
Requires: %{name}-runtime = %{version}-%{release}
Requires: %{name}-gb-form = %{version}-%{release}
+Requires: %{name}-gui = %{version}-%{release}
%description gb-form-terminal
%{summary}
@@ -420,6 +398,7 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-gtk
Summary: Gambas3 component package for gtk
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-image = %{version}-%{release}
%description gb-gtk
%{summary}
@@ -438,10 +417,37 @@ Requires: %{name}-gb-opengl = %{version}-%{release}
%package gb-gtk3
Summary: Gambas3 component package for gtk3
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-image = %{version}-%{release}
%description gb-gtk3
%{summary}.
+%package gb-gtk3-wayland
+Summary: Gambas3 component package for gtk3-wayland
+Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-gtk3 = %{version}-%{release}
+Requires: %{name}-gb-qt5 = %{version}-%{release}
+
+%description gb-gtk3-wayland
+%{summary}.
+
+%package gb-gtk3-webview
+Summary: Gambas3 component package for gtk3-webview
+Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-gtk3 = %{version}-%{release}
+
+%description gb-gtk3-webview
+%{summary}.
+
+%package gb-gtk3-x11
+Summary: Gambas3 component package for gtk3-x11
+Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-gtk3 = %{version}-%{release}
+Requires: %{name}-gb-qt5 = %{version}-%{release}
+
+%description gb-gtk3-x11
+%{summary}.
+
%package gb-httpd
Summary: Gambas3 component package for httpd
Requires: %{name}-runtime = %{version}-%{release}
@@ -492,6 +498,7 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-jit
Summary: Gambas3 component package for jit
Requires: %{name}-runtime = %{version}-%{release}
+Requires: gcc
%description gb-jit
%{summary}
@@ -514,6 +521,8 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-map
Summary: Gambas3 component package for map
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-net-curl = %{version}-%{release}
+Requires: %{name}-gb-net = %{version}-%{release}
%description gb-map
%{summary}.
@@ -528,6 +537,7 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-media
Summary: Gambas3 component package for media
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-image = %{version}-%{release}
%description gb-media
%{summary}
@@ -536,6 +546,7 @@ Requires: %{name}-runtime = %{version}-%{release}
Summary: Gambas3 component package for media-form
Requires: %{name}-gb-media = %{version}-%{release}
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gui = %{version}-%{release}
%description gb-media-form
%{summary}
@@ -543,6 +554,7 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-memcached
Summary: Gambas3 component package for memcached
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-net = %{version}-%{release}
%description gb-memcached
%{summary}.
@@ -597,6 +609,7 @@ Requires: %{name}-gb-mime = %{version}-%{release}
%package gb-net-smtp
Summary: Gambas3 component package for net-smtp
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-net = %{version}-%{release}
%description gb-net-smtp
%{summary}
@@ -611,6 +624,7 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-opengl
Summary: Gambas3 component package for opengl
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-image = %{version}-%{release}
%description gb-opengl
%{summary}
@@ -663,6 +677,7 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-pdf
Summary: Gambas3 component package for pdf
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-image = %{version}-%{release}
%description gb-pdf
%{summary}
@@ -670,6 +685,7 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-poppler
Summary: Gambas3 component package for poppler
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-image = %{version}-%{release}
%description gb-poppler
%{summary}
@@ -677,6 +693,7 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-qt4
Summary: Gambas3 component package for qt4
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-image = %{version}-%{release}
%description gb-qt4
%{summary}
@@ -706,9 +723,18 @@ Requires: %{name}-gb-qt4 = %{version}-%{release}
%description gb-qt4-webkit
%{summary}
+%package gb-qt4-webview
+Summary: Gambas3 component package for qt4-webview
+Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-qt4 = %{version}-%{release}
+
+%description gb-qt4-webview
+%{summary}
+
%package gb-qt5
Summary: Gambas3 component package for qt5
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-image = %{version}-%{release}
%description gb-qt5
%{summary}
@@ -730,6 +756,14 @@ Requires: %{name}-gb-opengl = %{version}-%{release}
%description gb-qt5-opengl
%{summary}
+%package gb-qt5-wayland
+Summary: Gambas3 component package for qt5-wayland
+Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-qt5 = %{version}-%{release}
+
+%description gb-qt5-wayland
+%{summary}
+
%package gb-qt5-webkit
Summary: Gambas3 component package for qt5-webkit
Requires: %{name}-runtime = %{version}-%{release}
@@ -738,10 +772,26 @@ Requires: %{name}-gb-qt5 = %{version}-%{release}
%description gb-qt5-webkit
%{summary}
+%package gb-qt5-webview
+Summary: Gambas3 component package for qt5-webview
+Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-qt5 = %{version}-%{release}
+
+%description gb-qt5-webview
+%{summary}
+
+%package gb-qt5-x11
+Summary: Gambas3 component package for qt5-x11
+Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-qt5 = %{version}-%{release}
+
+%description gb-qt5-x11
+%{summary}
%package gb-report
Summary: Gambas3 component package for report
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-form = %{version}-%{release}
%description gb-report
%{summary}
@@ -749,6 +799,7 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-report2
Summary: Gambas3 component package for report2
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-form = %{version}-%{release}
%description gb-report2
%{summary}
@@ -763,6 +814,8 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-sdl
Summary: Gambas3 component package for sdl
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-image = %{version}-%{release}
+Requires: %{name}-gb-image-io = %{version}-%{release}
Requires: dejavu-sans-fonts
%description gb-sdl
@@ -778,6 +831,7 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-sdl2
Summary: Gambas3 component for sdl2
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-image = %{version}-%{release}
%description gb-sdl2
%{summary}
@@ -810,11 +864,11 @@ Requires: %{name}-runtime = %{version}-%{release}
%description gb-term
%{summary}
-%package gb-test
-Summary: Gambas3 component package for unit tests
-Requires: %{name}-runtime = %{version}-%{release}
+%package gb-term-form
+Summary: Gambas3 component package for term-form
+Requires: %{name}-runtime = %{version}-%{release}
-%description gb-test
+%description gb-term-form
%{summary}
%package gb-util
@@ -834,6 +888,7 @@ Requires: %{name}-runtime = %{version}-%{release}
%package gb-v4l
Summary: Gambas3 component package for v4l
Requires: %{name}-runtime = %{version}-%{release}
+Requires: %{name}-gb-image = %{version}-%{release}
%description gb-v4l
%{summary}
@@ -856,6 +911,8 @@ Requires: %{name}-runtime = %{version}-%{release}
Summary: Gambas3 component package for web-feed
Requires: %{name}-runtime = %{version}-%{release}
Requires: %{name}-gb-web = %{version}-%{release}
+Requires: %{name}-gb-xml = %{version}-%{release}
+Requires: %{name}-gb-util = %{version}-%{release}
%description gb-web-feed
%{summary}
@@ -864,6 +921,8 @@ Requires: %{name}-gb-web = %{version}-%{release}
Summary: Gambas3 component package for web-form
Requires: %{name}-runtime = %{version}-%{release}
Requires: %{name}-gb-web = %{version}-%{release}
+Requires: %{name}-gb-util-web = %{version}-%{release}
+Requires: %{name}-gb-util = %{version}-%{release}
%description gb-web-form
%{summary}
@@ -872,6 +931,9 @@ Requires: %{name}-gb-web = %{version}-%{release}
Summary: Gambas3 component package for web-gui
Requires: %{name}-runtime = %{version}-%{release}
Requires: %{name}-gb-web = %{version}-%{release}
+Requires: %{name}-gb-util = %{version}-%{release}
+Requires: %{name}-gb-util-web = %{version}-%{release}
+Requires: %{name}-gb-signal = %{version}-%{release}
%description gb-web-gui
%{summary}
@@ -895,7 +957,6 @@ Requires: %{name}-gb-xml = %{version}-%{release}
%package gb-xml-rpc
Summary: Gambas3 component package for xml.rpc
Requires: %{name}-runtime = %{version}-%{release}
-Requires: %{name}-gb-xml = %{version}-%{release}
%description gb-xml-rpc
%{summary}
@@ -913,7 +974,6 @@ Requires: %{name}-gb-xml = %{version}-%{release}
%patch1 -p1 -b .nolintl
%patch2 -p1 -b .noliconv
%patch5 -p1 -b .gst1
-%patch6 -p1 -b .poppler-splash
for i in `find . |grep acinclude.m4`; do
sed -i 's|$AM_CFLAGS -O3|$AM_CFLAGS|g' $i
sed -i 's|$AM_CXXFLAGS -Os -fno-omit-frame-pointer|$AM_CXXFLAGS|g' $i
@@ -1032,6 +1092,7 @@ install -m 0644 -p main/mime/application-x-gambas3.xml %{buildroot}%{_datadir}/m
%{_libdir}/%{name}/gb.eval.*
%{_libdir}/%{name}/gb.geom.*
%{_libdir}/%{name}/gb.gui.*
+%{_libdir}/%{name}/gb.test.*
%{_bindir}/gbr3
%{_bindir}/gbx3
%{_datadir}/pixmaps/%{name}.png
@@ -1044,14 +1105,12 @@ install -m 0644 -p main/mime/application-x-gambas3.xml %{buildroot}%{_datadir}/m
%{_datadir}/%{name}/info/gb.gui.*
%{_datadir}/%{name}/info/gb.info
%{_datadir}/%{name}/info/gb.list
-%dir %{_datadir}/%{name}/icons/
-%{_datadir}/%{name}/icons/application-x-gambas3.png
+%{_datadir}/%{name}/info/gb.test.*
%{_datadir}/mime/packages/application-x-gambas3.xml
-%{_datadir}/%{name}/icons/application-x-gambasserverpage.png
%{_mandir}/man1/gbr3.*
%{_mandir}/man1/gbx3.*
-%files devel
+%files dev-tools
%license COPYING
%{_bindir}/gbc3
%{_bindir}/gba3
@@ -1067,11 +1126,12 @@ install -m 0644 -p main/mime/application-x-gambas3.xml %{buildroot}%{_datadir}/m
%{_bindir}/gbs3
%{_bindir}/gbs3.gambas
%{_bindir}/gbw3
-%{_datadir}/%{name}/icons/application-x-gambasscript.png
%{_datadir}/mime/packages/application-x-gambasscript.xml
%{_mandir}/man1/gbs3.*
%{_mandir}/man1/gbw3.*
+%files gui
+
%files ide
%{_bindir}/%{name}
%{_bindir}/%{name}.gambas
@@ -1103,8 +1163,23 @@ install -m 0644 -p main/mime/application-x-gambas3.xml %{buildroot}%{_datadir}/m
%{_datadir}/%{name}/info/gb.complex.*
%files gb-compress
-%{_libdir}/%{name}/gb.compress.*
-%{_datadir}/%{name}/info/gb.compress.*
+%{_libdir}/%{name}/gb.compress.component
+%{_libdir}/%{name}/gb.compress.la
+%{_libdir}/%{name}/gb.compress.so*
+%{_datadir}/%{name}/info/gb.compress.info
+%{_datadir}/%{name}/info/gb.compress.list
+
+%files gb-compress-bzlib2
+%{_libdir}/%{name}/gb.compress.bzlib2.*
+%{_datadir}/%{name}/info/gb.compress.bzlib2.*
+
+%files gb-compress-zlib
+%{_libdir}/%{name}/gb.compress.zlib.*
+%{_datadir}/%{name}/info/gb.compress.zlib.*
+
+%files gb-compress-zstd
+%{_libdir}/%{name}/gb.compress.zstd.*
+%{_datadir}/%{name}/info/gb.compress.zstd.*
%files gb-crypt
%{_libdir}/%{name}/gb.crypt.*
@@ -1153,12 +1228,20 @@ install -m 0644 -p main/mime/application-x-gambas3.xml %{buildroot}%{_datadir}/m
%files gb-desktop
%{_libdir}/%{name}/gb.desktop.*
-%exclude %{_libdir}/%{name}/gb.desktop.gnome.*
+%exclude %{_libdir}/%{name}/gb.desktop.gnome.keyring.*
+%exclude %{_libdir}/%{name}/gb.desktop.x11.*
%{_datadir}/%{name}/control/gb.desktop/
+%exclude %{_datadir}/%{name}/info/gb.desktop.gnome.keyring.*
+%exclude %{_datadir}/%{name}/info/gb.desktop.x11.*
%{_datadir}/%{name}/info/gb.desktop.*
-%files gb-desktop-gnome
-%{_libdir}/%{name}/gb.desktop.gnome.*
+%files gb-desktop-gnome-keyring
+%{_libdir}/%{name}/gb.desktop.gnome.keyring.*
+%{_datadir}/%{name}/info/gb.desktop.gnome.keyring.*
+
+%files gb-desktop-x11
+%{_libdir}/%{name}/gb.desktop.x11.*
+%{_datadir}/%{name}/info/gb.desktop.x11.*
%files gb-eval-highlight
%{_libdir}/%{name}/gb.eval.highlight.*
@@ -1245,6 +1328,28 @@ install -m 0644 -p main/mime/application-x-gambas3.xml %{buildroot}%{_datadir}/m
%{_datadir}/%{name}/info/gb.gtk3.info
%{_datadir}/%{name}/info/gb.gtk3.list
+%files gb-gtk3-wayland
+%{_libdir}/%{name}/gb.gtk3.wayland.component
+%{_libdir}/%{name}/gb.gtk3.wayland.so*
+%{_libdir}/%{name}/gb.gtk3.wayland.la
+%{_datadir}/%{name}/info/gb.gtk3.wayland.info
+%{_datadir}/%{name}/info/gb.gtk3.wayland.list
+
+%files gb-gtk3-webview
+%{_libdir}/%{name}/gb.gtk3.webview.component
+%{_libdir}/%{name}/gb.gtk3.webview.so*
+%{_libdir}/%{name}/gb.gtk3.webview.la
+%{_datadir}/%{name}/info/gb.gtk3.webview.info
+%{_datadir}/%{name}/info/gb.gtk3.webview.list
+
+%files gb-gtk3-x11
+%{_libdir}/%{name}/gb.gtk3.x11.component
+%{_libdir}/%{name}/gb.gtk3.x11.so*
+%{_libdir}/%{name}/gb.gtk3.x11.la
+%{_datadir}/%{name}/info/gb.gtk3.x11.info
+%{_datadir}/%{name}/info/gb.gtk3.x11.list
+
+
%files gb-httpd
%{_libdir}/%{name}/gb.httpd.*
%{_datadir}/%{name}/info/gb.httpd.*
@@ -1428,6 +1533,10 @@ install -m 0644 -p main/mime/application-x-gambas3.xml %{buildroot}%{_datadir}/m
%{_datadir}/%{name}/control/gb.qt4.webkit*
%{_datadir}/%{name}/info/gb.qt4.webkit.*
+%files gb-qt4-webview
+%{_libdir}/%{name}/gb.qt4.webview.*
+%{_datadir}/%{name}/info/gb.qt4.webview.*
+
%files gb-qt5
%{_libdir}/%{name}/gb.qt5.component
# %%{_libdir}/%%{name}/gb.qt5.gambas
@@ -1444,11 +1553,23 @@ install -m 0644 -p main/mime/application-x-gambas3.xml %{buildroot}%{_datadir}/m
%{_libdir}/%{name}/gb.qt5.opengl.*
%{_datadir}/%{name}/info/gb.qt5.opengl.*
+%files gb-qt5-wayland
+%{_libdir}/%{name}/gb.qt5.wayland.*
+%{_datadir}/%{name}/info/gb.qt5.wayland.*
+
%files gb-qt5-webkit
%{_libdir}/%{name}/gb.qt5.webkit.*
%{_datadir}/%{name}/control/gb.qt5.webkit*
%{_datadir}/%{name}/info/gb.qt5.webkit.*
+%files gb-qt5-webview
+%{_libdir}/%{name}/gb.qt5.webview.*
+%{_datadir}/%{name}/info/gb.qt5.webview.*
+
+%files gb-qt5-x11
+%{_libdir}/%{name}/gb.qt5.x11.*
+%{_datadir}/%{name}/info/gb.qt5.x11.*
+
%files gb-report
%{_libdir}/%{name}/gb.report.*
%{_datadir}/%{name}/control/gb.report/
@@ -1501,14 +1622,17 @@ install -m 0644 -p main/mime/application-x-gambas3.xml %{buildroot}%{_datadir}/m
%{_datadir}/%{name}/info/gb.signal.*
%files gb-term
+%exclude %{_libdir}/%{name}/gb.term.form.*
%{_libdir}/%{name}/gb.term.*
+%exclude %{_datadir}/%{name}/control/gb.term.form*
%{_datadir}/%{name}/control/gb.term.*
+%exclude %{_datadir}/%{name}/info/gb.term.form.*
%{_datadir}/%{name}/info/gb.term.*
-%files gb-test
-%{_libdir}/%{name}/gb.test.*
-%{_datadir}/%{name}/info/gb.test.info
-%{_datadir}/%{name}/info/gb.test.list
+%files gb-term-form
+%{_libdir}/%{name}/gb.term.form.*
+%{_datadir}/%{name}/control/gb.term.form*
+%{_datadir}/%{name}/info/gb.term.form.*
%files gb-util
%{_libdir}/%{name}/gb.util.component
@@ -1580,6 +1704,10 @@ install -m 0644 -p main/mime/application-x-gambas3.xml %{buildroot}%{_datadir}/m
%{_datadir}/%{name}/info/gb.xml.xslt.*
%changelog
+* Tue May 4 2021 Tom Callaway <spot(a)fedoraproject.org> - 3.16.0-1
+- update to 3.16.0
+- adjust package to meet new upstream rules
+
* Mon Feb 08 2021 Pavel Raiskup <praiskup(a)redhat.com> - 3.15.2-5
- rebuild for libpq ABI fix rhbz#1908268
diff --git a/sources b/sources
index 6cef691..9702438 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (gambas-3.15.2.tar.bz2) = c1ccc08f24380fcf74c83c4b88edb30461e4116e133b3ad9903ae0c4e67a2c2a4968c0ad482b505dd853c59001dff3b28207abce2fa841842b3f523c79c348c4
+SHA512 (gambas-3.16.0.tar.bz2) = e4bf89228d1bad85cf9940b9aeebaa375d8833e2519e1ca3d45be1fe44c2226528a95e25c4f060f3ed28fe223c1c80b678deabde8c40d81a32b8842addd2b2aa
2 years, 11 months
Architecture specific change in rpms/nbdkit.git
by githook-noreply@fedoraproject.org
The package rpms/nbdkit.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/nbdkit.git/commit/?id=54b225aed23....
Change:
+%ifnarch riscv64 s390 s390x
Thanks.
Full change:
============
commit 54b225aed234be0d92e1c3c490eda7997efb657e
Author: Richard W.M. Jones <rjones(a)redhat.com>
Date: Wed May 5 13:05:40 2021 +0100
New upstream version 1.25.7.
Disable libguestfs tests on riscv64.
diff --git a/nbdkit.spec b/nbdkit.spec
index 35e0627..00c9f9f 100644
--- a/nbdkit.spec
+++ b/nbdkit.spec
@@ -1,8 +1,14 @@
%global _hardened_build 1
%ifarch %{kernel_arches}
-# ... except that it doesn't work on s390, so:
-%ifnarch s390 s390x
+# riscv64 tests fail with
+# qemu-system-riscv64: invalid accelerator kvm
+# qemu-system-riscv64: falling back to tcg
+# qemu-system-riscv64: unable to find CPU model 'host'
+# This seems to require changes in libguestfs and/or qemu to support
+# -cpu max or -cpu virt.
+# s390x builders can't run libguestfs
+%ifnarch riscv64 s390 s390x
%global have_libguestfs 1
%endif
%endif
@@ -44,7 +50,7 @@ ExclusiveArch: x86_64
%global source_directory 1.25-development
Name: nbdkit
-Version: 1.25.6
+Version: 1.25.7
Release: 1%{?dist}
Summary: NBD server
@@ -1217,6 +1223,10 @@ export LIBGUESTFS_TRACE=1
%changelog
+* Wed May 05 2021 Richard W.M. Jones <rjones(a)redhat.com> - 1.25.7-1
+- New upstream version 1.25.7.
+- Disable libguestfs tests on riscv64.
+
* Sat Apr 10 2021 Richard W.M. Jones <rjones(a)redhat.com> - 1.25.6-1
- New upstream version 1.25.6.
diff --git a/sources b/sources
index 22a1133..db5b068 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
-SHA512 (nbdkit-1.25.6.tar.gz) = 127234467e6a13718c9f6f5581f7e26f98f8478d40717f53a00309fa29c16879da3e91c93e5e5dacbe769ca399f80a021ed37dd8be9da8b5a8f8617459c77b66
-SHA512 (nbdkit-1.25.6.tar.gz.sig) = 2ab74a238f419aad808193cd2f76742a943cbfcd0f2748f519261cd496b2a45b905ffb64559ff59b99136174dc7ea56e320688787a08a51cd166dbb3dfa087fc
+SHA512 (nbdkit-1.25.7.tar.gz) = a4ff0045971bddb89ace27968f4248c1302fbc9aa7e19a417f3bb79e78c531cf9a561c5dccb66580378a0f6b2bbe7b344ba7a6eb88e3bc3bf2dedb275bfeafff
+SHA512 (nbdkit-1.25.7.tar.gz.sig) = f28c2aeaaa142767408d537d3e01437c24385c22e6a20cccb76edd6c9edc3fb82dc835cf65dcc4718bed90e31c458bbfe3b205bb3557013ed2ae2164321b080d
2 years, 11 months
[Report] Packages Restricting Arches
by root
List of packages currently excluding arches (1974)
===========================================
- 0ad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- 90-Second-Portraits
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- GoldenCheetah
ExclusiveArch: %{qt5_qtwebengine_arches}
- GtkAda
ExclusiveArch: %{GPRbuild_arches}
- GtkAda3
ExclusiveArch: %{GPRbuild_arches}
- OpenImageIO
ExclusiveArch: x86_64 ppc64le
- PragmARC
ExclusiveArch: %{GPRbuild_arches}
- R-V8
ExclusiveArch: %{nodejs_arches}
- RdRand
ExclusiveArch: %{ix86} x86_64
- RediSearch
ExclusiveArch: x86_64
- SLOF
ExclusiveArch: ppc64le
- YafaRay
ExclusiveArch: %{ix86} x86_64
- aboot
ExclusiveArch: alpha
- accel-config
ExclusiveArch: %{ix86} x86_64
- acpid
ExclusiveArch: ia64 x86_64 %{ix86} %{arm} aarch64
- ahven
ExclusiveArch: %{GPRbuild_arches}
- algobox
ExclusiveArch: %{qt5_qtwebengine_arches}
- alleyoop
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x %{arm} aarch64
- american-fuzzy-lop
ExclusiveArch: %{ix86} x86_64
- anet
ExclusiveArch: %{GPRbuild_arches}
- anki
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- apmd
ExclusiveArch: %{ix86}
- appstream-generator
ExclusiveArch: %{ldc_arches}
- arduino
ExclusiveArch: %{go_arches}
- arm-trusted-firmware
ExclusiveArch: aarch64
- aunit
ExclusiveArch: %GPRbuild_arches
- avgtime
ExclusiveArch: %{ldc_arches}
- aws
ExclusiveArch: %GPRbuild_arches
- bcal
ExclusiveArch: x86_64 aarch64 ia64 ppc64 ppc64le s390x
- bcc
ExclusiveArch: x86_64 %{power64} aarch64 s390x armv7hl
- bcm283x-firmware
ExclusiveArch: %{arm} aarch64
- berusky2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{mips}
- biosdevname
ExclusiveArch: %{ix86} x86_64
- blender
ExclusiveArch: x86_64 aarch64 ppc64le
- bless
ExclusiveArch: %mono_arches
- bpftrace
ExclusiveArch: x86_64 %{power64} aarch64 s390x
- calamares
ExclusiveArch: %{ix86} x86_64
- calibre
ExclusiveArch: %{qt5_qtwebengine_arches}
- ccdciel
ExclusiveArch: %{fpc_arches}
- cdcollect
ExclusiveArch: %{mono_arches}
- ceph
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- chromium
ExclusiveArch: x86_64 i686
ExclusiveArch: x86_64 i686 aarch64
- cjdns
ExclusiveArch: %{nodejs_arches}
- clevis-pin-tpm2
ExclusiveArch: %{rust_arches}
- cmospwd
ExclusiveArch: %{ix86} x86_64
- cmrt
ExclusiveArch: %{ix86} x86_64 ia64
- coffee-script
ExclusiveArch: %{nodejs_arches} noarch
- colorful
ExclusiveArch: %{fpc_arches}
- cpu-x
ExclusiveArch: i686 x86_64
- cpufetch
ExclusiveArch: %{arm} aarch64 x86_64
- cpuid
ExclusiveArch: %{ix86} x86_64
- cqrlog
ExclusiveArch: %{fpc_arches}
- crash
ExclusiveArch: %{ix86} ia64 x86_64 ppc ppc64 s390 s390x %{arm} aarch64 ppc64le
- crash-gcore-command
ExclusiveArch: aarch64 ppc64le x86_64
- crash-trace-command
ExclusiveArch: aarch64 ppc64le s390x x86_64
- criu
ExclusiveArch: x86_64 %{arm} ppc64le aarch64 s390x
- cryptlib
ExclusiveArch: x86_64 %{ix86} aarch64 ppc64 ppc64le
- cryptobone
ExclusiveArch: x86_64 %{ix86} ppc64 ppc64le aarch64
- daq
ExclusiveArch: x86_64 aarch64
- darktable
ExclusiveArch: x86_64 aarch64
ExclusiveArch: x86_64 ppc64le
- dbus-parsec
ExclusiveArch: %{rust_arches}
- dbus-sharp
ExclusiveArch: %mono_arches
- dbus-sharp-glib
ExclusiveArch: %mono_arches
- dbxtool
ExclusiveArch: i386 x86_64 aarch64
- deepin-daemon
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- deepin-desktop-schemas
ExclusiveArch: %{go_arches}
- dlm
ExclusiveArch: i686 x86_64
- dmidecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- dmtcp
ExclusiveArch: x86_64 aarch64
- docker-distribution
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- dolphin-emu
ExclusiveArch: x86_64 aarch64 ppc64le
- dotnet-build-reference-packages
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- dotnet3.1
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- dotnet5.0
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- dotnet5.0-build-reference-packages
ExclusiveArch: aarch64 x86_64
ExclusiveArch: x86_64
- doublecmd
ExclusiveArch: %{ix86} x86_64
- dpdk
ExclusiveArch: x86_64 i686 aarch64 ppc64le
- dssi-vst
ExclusiveArch: %{ix86} x86_64
- dyninst
ExclusiveArch: %{ix86} x86_64 ppc64le aarch64
- e3
ExclusiveArch: %{ix86} x86_64
- edk2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
ExclusiveArch: x86_64 aarch64
- efibootmgr
ExclusiveArch: %{efi}
- efifs
ExclusiveArch: %{efi}
- efitools
ExclusiveArch: %{efi}
- efivar
ExclusiveArch: %{efi}
- elk
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86} aarch64 %{arm} %{power64}
- emacs-slime
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- embree
ExclusiveArch: x86_64
- enki
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- envytools
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- eric
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- eth-tools
ExclusiveArch: x86_64
- extlinux-bootloader
ExclusiveArch: %{arm} aarch64
- fcitx-libpinyin
ExclusiveArch: %{qt5_qtwebengine_arches}
- fedora-dockerfiles
ExclusiveArch: %{go_arches}
- fes
ExclusiveArch: %{ix86} x86_64
- flannel
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- florist
ExclusiveArch: %{GPRbuild_arches}
- fpc
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64 ppc64le
- frescobaldi
ExclusiveArch: %{qt5_qtwebengine_arches}
- frysk
ExclusiveArch: %{ix86} x86_64 ppc64
- fwts
ExclusiveArch: x86_64 %{arm} aarch64 s390x riscv64 %{power64}
- fwupd-efi
ExclusiveArch: x86_64 aarch64
- fx
ExclusiveArch: %{nodejs_arches} noarch
- ga
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- gbrainy
ExclusiveArch: %mono_arches
- gdata-sharp
ExclusiveArch: %mono_arches
- gdb-exploitable
ExclusiveArch: x86_64 i386
ExclusiveArch: x86_64 noarch
- gearhead1
ExclusiveArch: %{fpc_arches}
- gela-asis
ExclusiveArch: %GPRbuild_arches
- ghdl
ExclusiveArch: %{GNAT_arches}
- ghostwriter
ExclusiveArch: %{qt5_qtwebengine_arches}
- gio-sharp
ExclusiveArch: %mono_arches
- gir-to-d
ExclusiveArch: %{ldc_arches}
- git-octopus
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- gitqlient
ExclusiveArch: %{qt5_qtwebengine_arches}
- giver
ExclusiveArch: %{mono_arches}
- gkeyfile-sharp
ExclusiveArch: %mono_arches
- glibc32
ExclusiveArch: x86_64
- glibd
ExclusiveArch: %{ldc_arches}
- gmqcc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- gnatcoll
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-bindings
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-db
ExclusiveArch: %{GPRbuild_arches}
- gnome-boxes
ExclusiveArch: x86_64
- gnome-desktop-sharp
ExclusiveArch: %mono_arches
- gnome-do
ExclusiveArch: %mono_arches
- gnome-guitar
ExclusiveArch: %{mono_arches}
- gnome-keyring-sharp
ExclusiveArch: %mono_arches
- gnome-rdp
ExclusiveArch: %{mono_arches}
- gnome-sharp
ExclusiveArch: %mono_arches
- gnome-subtitles
ExclusiveArch: %mono_arches
- gnu-efi
ExclusiveArch: %{efi}
- go-bindata
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- go-compilers
ExclusiveArch: %{go_arches}
- go-rpm-macros
ExclusiveArch: %{golang_arches} %{gccgo_arches}
- godep
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang
ExclusiveArch: %{golang_arches}
- gomtree
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- gotun
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: x86_64
- goverlay
ExclusiveArch: %{fpc_arches}
- gprbuild
ExclusiveArch: %{GPRbuild_arches} %{bootstrap_arch}
- gprolog
ExclusiveArch: x86_64 %{ix86} ppc alpha
- grafana
ExclusiveArch: %{grafana_arches}
- grafana-pcp
ExclusiveArch: %{grafanapcp_arches}
- gtk-sharp-beans
ExclusiveArch: %mono_arches
- gtk-sharp2
ExclusiveArch: %mono_arches
- gtk-sharp3
ExclusiveArch: %{mono_arches}
- gtkd
ExclusiveArch: %{ldc_arches}
- gudev-sharp
ExclusiveArch: %mono_arches
- guestfs-tools
ExclusiveArch: %{kernel_arches}
- hedgewars
ExclusiveArch: %{fpc_arches}
- hsakmt
ExclusiveArch: x86_64 aarch64
- hyena
ExclusiveArch: %{mono_arches}
- hyperscan
ExclusiveArch: x86_64
- hyperv-daemons
ExclusiveArch: i686 x86_64
- i3status-rs
ExclusiveArch: %{rust_arches}
- icaro
ExclusiveArch: %{ix86} x86_64 noarch
- ignition
ExclusiveArch: %{go_arches}
- imvirt
ExclusiveArch: %{ix86} x86_64 ia64
- indistarter
ExclusiveArch: %{fpc_arches}
- infinipath-psm
ExclusiveArch: x86_64
- intel-cmt-cat
ExclusiveArch: x86_64 i686 i586
ExclusiveArch: x86_64 i686 i586
- intel-gmmlib
ExclusiveArch: x86_64 i686
- intel-ipp-crypto-mb
ExclusiveArch: x86_64
ExclusiveArch: x86_64
- intel-ipsec-mb
ExclusiveArch: x86_64
ExclusiveArch: x86_64
- intel-mediasdk
ExclusiveArch: x86_64
- intel-undervolt
ExclusiveArch: i386 x86_64
- ioport
ExclusiveArch: %{ix86} x86_64
- ipmctl
ExclusiveArch: x86_64
- ipw2100-firmware
ExclusiveArch: noarch i386 x86_64
- ipw2200-firmware
ExclusiveArch: noarch i386 x86_64
- ispc
ExclusiveArch: x86_64 aarch64
- iucode-tool
ExclusiveArch: %{ix86} x86_64
- iyfct
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- java-1.8.0-openjdk-aarch32
ExclusiveArch: %{arm}
- keepass
ExclusiveArch: %{mono_arches}
- kernel
ExclusiveArch: x86_64 s390x %{arm} aarch64 ppc64le
ExclusiveArch: noarch i386 i686 x86_64 s390x %{arm} aarch64 ppc64le
- keyring-ima-signer
ExclusiveArch: %{rust_arches}
- kf5-akonadi-search
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-audiocd-kio
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kalarmcal
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kblog
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kcalendarcore
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kcalendarutils
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kitinerary
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kmailtransport
ExclusiveArch: x86_64 %{arm}
- kf5-ktnef
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-libkdcraw
ExclusiveArch: x86_64 ppc64le %{arm}
- kicad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- kiwix-desktop
ExclusiveArch: %{qt5_qtwebengine_arches}
- knot-resolver
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- knotes
ExclusiveArch: x86_64 %{arm}
- kompose
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 s390x
- kubernetes
ExclusiveArch: x86_64 aarch64 ppc64le s390x %{arm}
- lazarus
ExclusiveArch: %{fpc_arches}
- lazpaint
ExclusiveArch: %{fpc_arches}
- ldc
ExclusiveArch: %{ldc_arches}
- libbsr
ExclusiveArch: %{power64}
- libclc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{power64} s390x
- libcxl
ExclusiveArch: %{power64}
- libdfp
ExclusiveArch: ppc ppc64 ppc64le s390 s390x x86_64
- libdispatch
ExclusiveArch: x86_64 aarch64
- libguestfs
ExclusiveArch: %{kernel_arches}
- libica
ExclusiveArch: s390 s390x
- libipt
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- libnxz
ExclusiveArch: ppc64le
- libocxl
ExclusiveArch: ppc64le
- libpmemobj-cpp
ExclusiveArch: x86_64
- libpsm2
ExclusiveArch: x86_64
- libquentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- libretro-desmume2015
ExclusiveArch: i686 x86_64
- librtas
ExclusiveArch: %{power64}
- libservicelog
ExclusiveArch: ppc %{power64}
- libsmbios
ExclusiveArch: x86_64 %{ix86}
- libunwind
ExclusiveArch: %{arm} aarch64 hppa ia64 mips ppc %{power64} s390x %{ix86} x86_64
- libva-intel-hybrid-driver
ExclusiveArch: %{ix86} x86_64 ia64
- libvma
ExclusiveArch: x86_64 ppc64le ppc64 aarch64
- libvmi
ExclusiveArch: x86_64
- libvpd
ExclusiveArch: %{power64}
- libxsmm
ExclusiveArch: x86_64
- libzfcphbaapi
ExclusiveArch: s390 s390x
- lightdm
ExclusiveArch: x86_64 ppc64le
- log4net
ExclusiveArch: %mono_arches
- lrmi
ExclusiveArch: %{ix86}
- lsvpd
ExclusiveArch: %{power64}
- luajit
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 s390x ppc64le
- luxcorerender
ExclusiveArch: x86_64
- mactel-boot
ExclusiveArch: x86_64
- manifest-tool
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- mantle
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- marked
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- matreshka
ExclusiveArch: %GPRbuild_arches
- maxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- mbpfan
ExclusiveArch: x86_64
- mcelog
ExclusiveArch: i686 x86_64
- mediaconch
ExclusiveArch: %{qt5_qtwebengine_arches}
- mellowplayer
ExclusiveArch: %{qt5_qtwebengine_arches}
- memkind
ExclusiveArch: x86_64 ppc64 ppc64le s390x aarch64
- memtest86+
ExclusiveArch: %{ix86} x86_64
- mesos
ExclusiveArch: x86_64
- microcode_ctl
ExclusiveArch: %{ix86} x86_64
- micropython
ExclusiveArch: %{arm} %{ix86} x86_64
- mine_detector
ExclusiveArch: %{GPRbuild_arches}
- minetest
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- mingw-wine-gecko
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- mirrorlist-server
ExclusiveArch: %{rust_arches}
- mkbootdisk
ExclusiveArch: %{ix86} sparc sparc64 x86_64
- mod_mono
ExclusiveArch: %mono_arches
- module-build-service
ExclusiveArch: %{ix86} x86_64 noarch
- mokutil
ExclusiveArch: %{ix86} x86_64 aarch64 %{arm}
- mono
ExclusiveArch: %mono_arches
- mono-addins
ExclusiveArch: %mono_arches
- mono-basic
ExclusiveArch: %{mono_arches}
- mono-bouncycastle
ExclusiveArch: %mono_arches
- mono-cecil
ExclusiveArch: %mono_arches
- mono-cecil-flowanalysis
ExclusiveArch: %mono_arches
- mono-reflection
ExclusiveArch: %mono_arches
- mono-tools
ExclusiveArch: %mono_arches
- mono-zeroconf
ExclusiveArch: %mono_arches
- monobristol
ExclusiveArch: %{mono_arches}
- monodevelop
ExclusiveArch: %mono_arches
- monodevelop-debugger-gdb
ExclusiveArch: %{mono_arches}
- monosim
ExclusiveArch: %mono_arches
- mrrescue
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- msr-tools
ExclusiveArch: %{ix86} x86_64
- mustache-d
ExclusiveArch: %{ldc_arches}
- mysql-connector-net
ExclusiveArch: %{mono_arches}
- nant
ExclusiveArch: %mono_arches
- nativejit
ExclusiveArch: x86_64
- nbc
ExclusiveArch: %{fpc_arches}
- nbdkit
ExclusiveArch: x86_64
- ndesk-dbus
ExclusiveArch: %{mono_arches}
- ndesk-dbus-glib
ExclusiveArch: %{mono_arches}
- newsflash
ExclusiveArch: %{rust_arches}
- newtonsoft-json
ExclusiveArch: %{mono_arches}
- nispor
ExclusiveArch: %{rust_arches}
- nodejs
ExclusiveArch: %{nodejs_arches}
- nodejs-acorn-object-spread
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-backbone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-buble
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-colors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-generic-pool
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-linefix
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-nodemon
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-packaging
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-replace-require-self
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-supervisor
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-svgo
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-tape
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-typescript
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-underscore
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- notify-sharp
ExclusiveArch: %{mono_arches}
- notify-sharp3
ExclusiveArch: %{mono_arches}
- npm-name-cli
ExclusiveArch: %{nodejs_arches} noarch
- nuget
ExclusiveArch: %{mono_arches}
- numatop
ExclusiveArch: x86_64 ppc64le
- nunit
ExclusiveArch: %{mono_arches}
- nunit2
ExclusiveArch: %{mono_arches}
- nvml
ExclusiveArch: x86_64 ppc64le
- nwchem
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- obs-service-rust2rpm
ExclusiveArch: %{rust_arches} noarch
- oci-kvm-hook
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- oci-seccomp-bpf-hook
ExclusiveArch: x86_64 %%{power64} aarch64 s390x armv7hl
- oci-umount
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x %{mips}
- oidn
ExclusiveArch: x86_64
- olpc-kbdshim
ExclusiveArch: %{ix86} %{arm}
- olpc-netutils
ExclusiveArch: %{ix86} %{arm}
- olpc-utils
ExclusiveArch: %{ix86} %{arm}
- onednn
ExclusiveArch: x86_64 aarch64 ppc64le
- onedrive
ExclusiveArch: %{ldc_arches}
- opae
ExclusiveArch: x86_64
- opal-prd
ExclusiveArch: ppc64le
- open-vm-tools
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64
- openblas
ExclusiveArch: %{openblas_arches}
- openjfx
ExclusiveArch: x86_64
- openjfx8
ExclusiveArch: x86_64
- openlibm
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 %{power64}
- openni
ExclusiveArch: %{ix86} x86_64 %{arm}
- openni-primesense
ExclusiveArch: %{ix86} x86_64 %{arm}
- openshadinglanguage
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- openssl-ibmca
ExclusiveArch: s390 s390x
- origin
ExclusiveArch: %{go_arches}
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- orion
ExclusiveArch: %{qt5_qtwebengine_arches}
- orthorobot
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- paflib
ExclusiveArch: ppc %{power64}
- parsec
ExclusiveArch: %{rust_arches}
- parsec-tool
ExclusiveArch: %{rust_arches}
- pcc
ExclusiveArch: %{ix86} x86_64
- pcmciautils
ExclusiveArch: %{ix86} x86_64 ia64 ppc ppc64 %{arm}
- pdbg
ExclusiveArch: ppc64le
- pdfmod
ExclusiveArch: %mono_arches
- perl-Dumbbench
ExclusiveArch: %{ix86} x86_64 noarch
- perl-Parse-DMIDecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- pesign
ExclusiveArch: %{ix86} x86_64 ia64 aarch64 %{arm}
- pesign-test-app
ExclusiveArch: x86_64
- pinta
ExclusiveArch: %mono_arches
- pioneer
ExclusiveArch: %{ix86} x86_64
- playonlinux
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- pmdk-convert
ExclusiveArch: x86_64
- pmemkv
ExclusiveArch: x86_64
- poppler-sharp
ExclusiveArch: %mono_arches
- popub
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- powerpc-utils
ExclusiveArch: ppc %{power64}
- ppc64-diag
ExclusiveArch: ppc %{power64}
- psi-plus
ExclusiveArch: %{qt5_qtwebengine_arches}
- pveclib
ExclusiveArch: ppc %{power64}
- pvs-sbcl
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- pyqtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- python-cryptography
ExclusiveArch: %{rust_arches}
- python-etcd
ExclusiveArch: noarch %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- python-healpy
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-javabridge
ExclusiveArch: i686 x86_64
- python-openoffice
ExclusiveArch: noarch x86_64
- python-pymoc
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-rpi-gpio
ExclusiveArch: %{arm} aarch64
- python-setuptools-rust
ExclusiveArch: %{rust_arches}
- q4wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- qcint
ExclusiveArch: x86_64
- qclib
ExclusiveArch: s390 s390x
- qemu-sanity-check
ExclusiveArch: %{kernel_arches}
- qevercloud
ExclusiveArch: %{qt5_qtwebengine_arches}
- qmapshack
ExclusiveArch: %{qt5_qtwebengine_arches}
- qt4pas
ExclusiveArch: %{fpc_arches}
- qt5-qtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- quantum-espresso
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86}
- quentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- rear
ExclusiveArch: %ix86 x86_64 ppc ppc64 ppc64le ia64
- redhat-lsb
ExclusiveArch: %{ix86} ia64 x86_64 ppc ppc64 s390 s390x %{arm} aarch64 ppc64le
- renderdoc
ExclusiveArch: x86_64
- reptyr
ExclusiveArch: %{ix86} x86_64 %{arm}
- rescene
ExclusiveArch: %{mono_arches}
- restsharp
ExclusiveArch: %{mono_arches}
- rhythmbox-alternative-toolbar
ExclusiveArch: %{ix86} %{arm} x86_64 ppc64 ppc64le
- rmd
ExclusiveArch: %{ix86} x86_64
- rocm-runtime
ExclusiveArch: x86_64 aarch64
- rocminfo
ExclusiveArch: x86_64 aarch64
- rpm-ostree
ExclusiveArch: %{rust_arches}
- rr
ExclusiveArch: %{ix86} x86_64
- rssguard
ExclusiveArch: %{qt5_qtwebengine_arches}
- rubygem-childprocess
ExclusiveArch: %{ix86} x86_64 noarch
- runc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le %{mips} s390x
- rust
ExclusiveArch: %{rust_arches}
- rust-ab_glyph_rasterizer
ExclusiveArch: %{rust_arches}
- rust-abomonation
ExclusiveArch: %{rust_arches}
- rust-actix
ExclusiveArch: %{rust_arches}
- rust-actix-codec
ExclusiveArch: %{rust_arches}
- rust-actix-connect
ExclusiveArch: %{rust_arches}
- rust-actix-files
ExclusiveArch: %{rust_arches}
- rust-actix-http
ExclusiveArch: %{rust_arches}
- rust-actix-macros
ExclusiveArch: %{rust_arches}
- rust-actix-router
ExclusiveArch: %{rust_arches}
- rust-actix-rt
ExclusiveArch: %{rust_arches}
- rust-actix-server
ExclusiveArch: %{rust_arches}
- rust-actix-server-config
ExclusiveArch: %{rust_arches}
- rust-actix-service
ExclusiveArch: %{rust_arches}
- rust-actix-testing
ExclusiveArch: %{rust_arches}
- rust-actix-threadpool
ExclusiveArch: %{rust_arches}
- rust-actix-tls
ExclusiveArch: %{rust_arches}
- rust-actix-utils
ExclusiveArch: %{rust_arches}
- rust-actix-web
ExclusiveArch: %{rust_arches}
- rust-actix-web-codegen
ExclusiveArch: %{rust_arches}
- rust-actix_derive
ExclusiveArch: %{rust_arches}
- rust-addr2line
ExclusiveArch: %{rust_arches}
- rust-adler
ExclusiveArch: %{rust_arches}
- rust-adler32
ExclusiveArch: %{rust_arches}
- rust-aead
ExclusiveArch: %{rust_arches}
- rust-aes
ExclusiveArch: %{rust_arches}
- rust-aes-gcm
ExclusiveArch: %{rust_arches}
- rust-aes-soft
ExclusiveArch: %{rust_arches}
- rust-afterburn
ExclusiveArch: %{rust_arches}
- rust-ahash
ExclusiveArch: %{rust_arches}
- rust-ahash0.4
ExclusiveArch: %{rust_arches}
- rust-aho-corasick
ExclusiveArch: %{rust_arches}
- rust-alacritty
ExclusiveArch: %{rust_arches}
- rust-alacritty_config_derive
ExclusiveArch: %{rust_arches}
- rust-alacritty_terminal
ExclusiveArch: %{rust_arches}
- rust-alga
ExclusiveArch: %{rust_arches}
- rust-alga_derive
ExclusiveArch: %{rust_arches}
- rust-alloc-no-stdlib
ExclusiveArch: %{rust_arches}
- rust-alloc-stdlib
ExclusiveArch: %{rust_arches}
- rust-alphanumeric-sort
ExclusiveArch: %{rust_arches}
- rust-ammonia
ExclusiveArch: %{rust_arches}
- rust-andrew
ExclusiveArch: %{rust_arches}
- rust-ansi_colours
ExclusiveArch: %{rust_arches}
- rust-ansi_term
ExclusiveArch: %{rust_arches}
- rust-ansi_term0.11
ExclusiveArch: %{rust_arches}
- rust-antidote
ExclusiveArch: %{rust_arches}
- rust-anyhow
ExclusiveArch: %{rust_arches}
- rust-anymap
ExclusiveArch: %{rust_arches}
- rust-aom-sys
ExclusiveArch: %{rust_arches}
- rust-app_dirs
ExclusiveArch: %{rust_arches}
- rust-approx
ExclusiveArch: %{rust_arches}
- rust-arbitrary
ExclusiveArch: %{rust_arches}
- rust-arbitrary0.4
ExclusiveArch: %{rust_arches}
- rust-arc-swap
ExclusiveArch: %{rust_arches}
- rust-arg_enum_proc_macro
ExclusiveArch: %{rust_arches}
- rust-argparse
ExclusiveArch: %{rust_arches}
- rust-array-init
ExclusiveArch: %{rust_arches}
- rust-arraydeque
ExclusiveArch: %{rust_arches}
- rust-arrayref
ExclusiveArch: %{rust_arches}
- rust-arrayvec
ExclusiveArch: %{rust_arches}
- rust-article_scraper
ExclusiveArch: %{rust_arches}
- rust-ascii
ExclusiveArch: %{rust_arches}
- rust-ascii-canvas
ExclusiveArch: %{rust_arches}
- rust-askalono
ExclusiveArch: %{rust_arches}
- rust-askalono-cli
ExclusiveArch: %{rust_arches}
- rust-askama
ExclusiveArch: %{rust_arches}
- rust-askama_derive
ExclusiveArch: %{rust_arches}
- rust-askama_escape
ExclusiveArch: %{rust_arches}
- rust-askama_shared
ExclusiveArch: %{rust_arches}
- rust-assert-json-diff
ExclusiveArch: %{rust_arches}
- rust-assert_approx_eq
ExclusiveArch: %{rust_arches}
- rust-assert_cli
ExclusiveArch: %{rust_arches}
- rust-assert_cmd
ExclusiveArch: %{rust_arches}
- rust-assert_fs
ExclusiveArch: %{rust_arches}
- rust-assert_matches
ExclusiveArch: %{rust_arches}
- rust-assign
ExclusiveArch: %{rust_arches}
- rust-async-attributes
ExclusiveArch: %{rust_arches}
- rust-async-compression
ExclusiveArch: %{rust_arches}
- rust-async-io
ExclusiveArch: %{rust_arches}
- rust-async-task
ExclusiveArch: %{rust_arches}
- rust-async-trait
ExclusiveArch: %{rust_arches}
- rust-asyncgit
ExclusiveArch: %{rust_arches}
- rust-atk
ExclusiveArch: %{rust_arches}
- rust-atk-sys
ExclusiveArch: %{rust_arches}
- rust-atom
ExclusiveArch: %{rust_arches}
- rust-atomicwrites
ExclusiveArch: %{rust_arches}
- rust-attohttpc
ExclusiveArch: %{rust_arches}
- rust-atty
ExclusiveArch: %{rust_arches}
- rust-autocfg
ExclusiveArch: %{rust_arches}
- rust-av-metrics
ExclusiveArch: %{rust_arches}
- rust-average
ExclusiveArch: %{rust_arches}
- rust-awc
ExclusiveArch: %{rust_arches}
- rust-backtrace
ExclusiveArch: %{rust_arches}
- rust-backtrace-sys
ExclusiveArch: %{rust_arches}
- rust-base100
ExclusiveArch: %{rust_arches}
- rust-base64
ExclusiveArch: %{rust_arches}
- rust-base64-0.10
ExclusiveArch: %{rust_arches}
- rust-base64-0.11
ExclusiveArch: %{rust_arches}
- rust-base64_0.12
ExclusiveArch: %{rust_arches}
- rust-bat
ExclusiveArch: %{rust_arches}
- rust-battery
ExclusiveArch: %{rust_arches}
- rust-bencher
ExclusiveArch: %{rust_arches}
- rust-better-panic
ExclusiveArch: %{rust_arches}
- rust-bincode
ExclusiveArch: %{rust_arches}
- rust-bincode0.8
ExclusiveArch: %{rust_arches}
- rust-bindgen
ExclusiveArch: %{rust_arches}
- rust-binfarce
ExclusiveArch: %{rust_arches}
- rust-biscuit
ExclusiveArch: %{rust_arches}
- rust-bit-set
ExclusiveArch: %{rust_arches}
- rust-bit-vec
ExclusiveArch: %{rust_arches}
- rust-bitfield
ExclusiveArch: %{rust_arches}
- rust-bitflags
ExclusiveArch: %{rust_arches}
- rust-bitmaps
ExclusiveArch: %{rust_arches}
- rust-bitstream-io
ExclusiveArch: %{rust_arches}
- rust-bitvec
ExclusiveArch: %{rust_arches}
- rust-blake2
ExclusiveArch: %{rust_arches}
- rust-blobby
ExclusiveArch: %{rust_arches}
- rust-blobby0.1
ExclusiveArch: %{rust_arches}
- rust-block-buffer
ExclusiveArch: %{rust_arches}
- rust-block-buffer0.7
ExclusiveArch: %{rust_arches}
- rust-block-modes
ExclusiveArch: %{rust_arches}
- rust-block-padding
ExclusiveArch: %{rust_arches}
- rust-blsctl
ExclusiveArch: %{rust_arches}
- rust-bodhi
ExclusiveArch: %{rust_arches}
- rust-bodhi-cli
ExclusiveArch: %{rust_arches}
- rust-bootupd
ExclusiveArch: x86_64 aarch64
- rust-box_drawing
ExclusiveArch: %{rust_arches}
- rust-brev
ExclusiveArch: %{rust_arches}
- rust-brotli
ExclusiveArch: %{rust_arches}
- rust-brotli-decompressor
ExclusiveArch: %{rust_arches}
- rust-brotli-sys
ExclusiveArch: %{rust_arches}
- rust-brotli2
ExclusiveArch: %{rust_arches}
- rust-bstr
ExclusiveArch: %{rust_arches}
- rust-buf-min
ExclusiveArch: %{rust_arches}
- rust-buf_redux
ExclusiveArch: %{rust_arches}
- rust-buffered-reader
ExclusiveArch: %{rust_arches}
- rust-bufsize
ExclusiveArch: %{rust_arches}
- rust-bufstream
ExclusiveArch: %{rust_arches}
- rust-build-env
ExclusiveArch: %{rust_arches}
- rust-build_const
ExclusiveArch: %{rust_arches}
- rust-bumpalo
ExclusiveArch: %{rust_arches}
- rust-byte-tools
ExclusiveArch: %{rust_arches}
- rust-byte-unit
ExclusiveArch: %{rust_arches}
- rust-byte-unit3
ExclusiveArch: %{rust_arches}
- rust-bytecount
ExclusiveArch: %{rust_arches}
- rust-bytelines
ExclusiveArch: %{rust_arches}
- rust-bytemuck
ExclusiveArch: %{rust_arches}
- rust-bytemuck_derive
ExclusiveArch: %{rust_arches}
- rust-byteorder
ExclusiveArch: %{rust_arches}
- rust-bytes
ExclusiveArch: %{rust_arches}
- rust-bytes0.4
ExclusiveArch: %{rust_arches}
- rust-bytes0.5
ExclusiveArch: %{rust_arches}
- rust-bytes0.6
ExclusiveArch: %{rust_arches}
- rust-bytesize
ExclusiveArch: %{rust_arches}
- rust-bytestring
ExclusiveArch: %{rust_arches}
- rust-bzip2
ExclusiveArch: %{rust_arches}
- rust-bzip2-sys
ExclusiveArch: %{rust_arches}
- rust-c_vec
ExclusiveArch: %{rust_arches}
- rust-cache-padded
ExclusiveArch: %{rust_arches}
- rust-cairo-rs
ExclusiveArch: %{rust_arches}
- rust-cairo-sys-rs
ExclusiveArch: %{rust_arches}
- rust-calloop
ExclusiveArch: %{rust_arches}
- rust-capnp
ExclusiveArch: %{rust_arches}
- rust-capnp-futures
ExclusiveArch: %{rust_arches}
- rust-capnp-rpc
ExclusiveArch: %{rust_arches}
- rust-caps
ExclusiveArch: %{rust_arches}
- rust-cargo
ExclusiveArch: %{rust_arches}
- rust-cargo-bloat
ExclusiveArch: %{rust_arches}
- rust-cargo-c
ExclusiveArch: %{rust_arches}
- rust-cargo-husky
ExclusiveArch: %{rust_arches}
- rust-cargo-insta
ExclusiveArch: %{rust_arches}
- rust-cargo-platform
ExclusiveArch: %{rust_arches}
- rust-cargo-readme
ExclusiveArch: %{rust_arches}
- rust-cargo_metadata
ExclusiveArch: %{rust_arches}
- rust-case
ExclusiveArch: %{rust_arches}
- rust-cassowary
ExclusiveArch: %{rust_arches}
- rust-cast
ExclusiveArch: %{rust_arches}
- rust-cbindgen
ExclusiveArch: %{rust_arches}
- rust-cc
ExclusiveArch: %{rust_arches}
- rust-cedarwood
ExclusiveArch: %{rust_arches}
- rust-cexpr
ExclusiveArch: %{rust_arches}
- rust-cfg-if
ExclusiveArch: %{rust_arches}
- rust-cfg-if0.1
ExclusiveArch: %{rust_arches}
- rust-chainerror
ExclusiveArch: %{rust_arches}
- rust-charset
ExclusiveArch: %{rust_arches}
- rust-chbs
ExclusiveArch: %{rust_arches}
- rust-checked_int_cast
ExclusiveArch: %{rust_arches}
- rust-choosier
ExclusiveArch: %{rust_arches}
- rust-chrono
ExclusiveArch: %{rust_arches}
- rust-chrono-humanize
ExclusiveArch: %{rust_arches}
- rust-chrono-tz
ExclusiveArch: %{rust_arches}
- rust-chunked_transfer
ExclusiveArch: %{rust_arches}
- rust-cipher
ExclusiveArch: %{rust_arches}
- rust-clang-sys
ExclusiveArch: %{rust_arches}
- rust-clap
ExclusiveArch: %{rust_arches}
- rust-clap2
ExclusiveArch: %{rust_arches}
- rust-clap_derive
ExclusiveArch: %{rust_arches}
- rust-clicolors-control
ExclusiveArch: %{rust_arches}
- rust-cmake
ExclusiveArch: %{rust_arches}
- rust-codespan-reporting
ExclusiveArch: %{rust_arches}
- rust-codicon
ExclusiveArch: %{rust_arches}
- rust-color-backtrace
ExclusiveArch: %{rust_arches}
- rust-color_quant
ExclusiveArch: %{rust_arches}
- rust-colored
ExclusiveArch: %{rust_arches}
- rust-colored1
ExclusiveArch: %{rust_arches}
- rust-colored_json
ExclusiveArch: %{rust_arches}
- rust-colorful
ExclusiveArch: %{rust_arches}
- rust-compiletest_rs
ExclusiveArch: %{rust_arches}
- rust-comrak
ExclusiveArch: %{rust_arches}
- rust-concurrent-queue
ExclusiveArch: %{rust_arches}
- rust-config
ExclusiveArch: %{rust_arches}
- rust-configparser
ExclusiveArch: %{rust_arches}
- rust-confy
ExclusiveArch: %{rust_arches}
- rust-console
ExclusiveArch: %{rust_arches}
- rust-console0.11
ExclusiveArch: %{rust_arches}
- rust-console0.12
ExclusiveArch: %{rust_arches}
- rust-console0.13
ExclusiveArch: %{rust_arches}
- rust-console0.9
ExclusiveArch: %{rust_arches}
- rust-const-cstr
ExclusiveArch: %{rust_arches}
- rust-const-random
ExclusiveArch: %{rust_arches}
- rust-const-random-macro
ExclusiveArch: %{rust_arches}
- rust-const_fn
ExclusiveArch: %{rust_arches}
- rust-content_inspector
ExclusiveArch: %{rust_arches}
- rust-conv
ExclusiveArch: %{rust_arches}
- rust-cookie
ExclusiveArch: %{rust_arches}
- rust-cookie_store
ExclusiveArch: %{rust_arches}
- rust-copydeps
ExclusiveArch: %{rust_arches}
- rust-copyless
ExclusiveArch: %{rust_arches}
- rust-copypasta
ExclusiveArch: %{rust_arches}
- rust-coreos-installer
ExclusiveArch: %{rust_arches}
- rust-cpio
ExclusiveArch: %{rust_arches}
- rust-cpp_demangle
ExclusiveArch: %{rust_arches}
- rust-cpuid-bool
ExclusiveArch: %{rust_arches}
- rust-cpython
ExclusiveArch: %{rust_arches}
- rust-crates-io
ExclusiveArch: %{rust_arches}
- rust-crc
ExclusiveArch: %{rust_arches}
- rust-crc-any
ExclusiveArch: %{rust_arches}
- rust-crc-core
ExclusiveArch: %{rust_arches}
- rust-crc32fast
ExclusiveArch: %{rust_arches}
- rust-criterion
ExclusiveArch: %{rust_arches}
- rust-criterion-plot
ExclusiveArch: %{rust_arches}
- rust-crossbeam
ExclusiveArch: %{rust_arches}
- rust-crossbeam-channel
ExclusiveArch: %{rust_arches}
- rust-crossbeam-channel0.4
ExclusiveArch: %{rust_arches}
- rust-crossbeam-deque
ExclusiveArch: %{rust_arches}
- rust-crossbeam-deque0.7
ExclusiveArch: %{rust_arches}
- rust-crossbeam-epoch
ExclusiveArch: %{rust_arches}
- rust-crossbeam-epoch0.8
ExclusiveArch: %{rust_arches}
- rust-crossbeam-queue
ExclusiveArch: %{rust_arches}
- rust-crossbeam-queue0.2
ExclusiveArch: %{rust_arches}
- rust-crossbeam-utils
ExclusiveArch: %{rust_arches}
- rust-crossbeam-utils0.7
ExclusiveArch: %{rust_arches}
- rust-crossbeam0.7
ExclusiveArch: %{rust_arches}
- rust-crossfont
ExclusiveArch: %{rust_arches}
- rust-crossterm
ExclusiveArch: %{rust_arches}
- rust-crossterm0.17
ExclusiveArch: %{rust_arches}
- rust-crossterm0.18
ExclusiveArch: %{rust_arches}
- rust-crosstermion
ExclusiveArch: %{rust_arches}
- rust-crunchy
ExclusiveArch: %{rust_arches}
- rust-crypto-hash
ExclusiveArch: %{rust_arches}
- rust-crypto-mac
ExclusiveArch: %{rust_arches}
- rust-crypto-mac0.8
ExclusiveArch: %{rust_arches}
- rust-cryptoki
ExclusiveArch: %{rust_arches}
- rust-cryptoki-sys
ExclusiveArch: %{rust_arches}
- rust-cryptovec
ExclusiveArch: %{rust_arches}
- rust-cssparser
ExclusiveArch: %{rust_arches}
- rust-cssparser-macros
ExclusiveArch: %{rust_arches}
- rust-cstr-argument
ExclusiveArch: %{rust_arches}
- rust-csv
ExclusiveArch: %{rust_arches}
- rust-csv-core
ExclusiveArch: %{rust_arches}
- rust-ctor
ExclusiveArch: %{rust_arches}
- rust-ctr
ExclusiveArch: %{rust_arches}
- rust-ctrlc
ExclusiveArch: %{rust_arches}
- rust-cty
ExclusiveArch: %{rust_arches}
- rust-curl
ExclusiveArch: %{rust_arches}
- rust-curl-sys
ExclusiveArch: %{rust_arches}
- rust-custom_derive
ExclusiveArch: %{rust_arches}
- rust-cxx
ExclusiveArch: %{rust_arches}
- rust-cxx-build
ExclusiveArch: %{rust_arches}
- rust-cxx-gen
ExclusiveArch: %{rust_arches}
- rust-cxxbridge-flags
ExclusiveArch: %{rust_arches}
- rust-cxxbridge-macro
ExclusiveArch: %{rust_arches}
- rust-darling
ExclusiveArch: %{rust_arches}
- rust-darling_core
ExclusiveArch: %{rust_arches}
- rust-darling_macro
ExclusiveArch: %{rust_arches}
- rust-dashmap
ExclusiveArch: %{rust_arches}
- rust-dashmap3
ExclusiveArch: %{rust_arches}
- rust-data-encoding
ExclusiveArch: %{rust_arches}
- rust-data-url
ExclusiveArch: %{rust_arches}
- rust-datetime
ExclusiveArch: %{rust_arches}
- rust-dav1d-sys
ExclusiveArch: %{rust_arches}
- rust-dbus
ExclusiveArch: %{rust_arches}
- rust-dbus-codegen
ExclusiveArch: %{rust_arches}
- rust-dbus-crossroads
ExclusiveArch: %{rust_arches}
- rust-dbus-tokio
ExclusiveArch: %{rust_arches}
- rust-dbus-tree
ExclusiveArch: %{rust_arches}
- rust-dbus0.8
ExclusiveArch: %{rust_arches}
- rust-debug-helper
ExclusiveArch: %{rust_arches}
- rust-decimal
ExclusiveArch: %{rust_arches}
- rust-deflate
ExclusiveArch: %{rust_arches}
- rust-defmac
ExclusiveArch: %{rust_arches}
- rust-delta_e
ExclusiveArch: %{rust_arches}
- rust-derivative
ExclusiveArch: %{rust_arches}
- rust-derive-new
ExclusiveArch: %{rust_arches}
- rust-derive_arbitrary
ExclusiveArch: %{rust_arches}
- rust-derive_arbitrary0.4
ExclusiveArch: %{rust_arches}
- rust-derive_builder
ExclusiveArch: %{rust_arches}
- rust-derive_builder_core
ExclusiveArch: %{rust_arches}
- rust-derive_builder_core0.9
ExclusiveArch: %{rust_arches}
- rust-derive_more
ExclusiveArch: %{rust_arches}
- rust-des
ExclusiveArch: %{rust_arches}
- rust-desed
ExclusiveArch: %{rust_arches}
- rust-deunicode
ExclusiveArch: %{rust_arches}
- rust-devicemapper
ExclusiveArch: %{rust_arches}
- rust-dialoguer
ExclusiveArch: %{rust_arches}
- rust-diesel
ExclusiveArch: %{rust_arches}
- rust-diesel_derives
ExclusiveArch: %{rust_arches}
- rust-diesel_migrations
ExclusiveArch: %{rust_arches}
- rust-diff
ExclusiveArch: %{rust_arches}
- rust-difference
ExclusiveArch: %{rust_arches}
- rust-diffus
ExclusiveArch: %{rust_arches}
- rust-diffus-derive
ExclusiveArch: %{rust_arches}
- rust-digest
ExclusiveArch: %{rust_arches}
- rust-digest0.8
ExclusiveArch: %{rust_arches}
- rust-directories
ExclusiveArch: %{rust_arches}
- rust-dirs
ExclusiveArch: %{rust_arches}
- rust-dirs-next
ExclusiveArch: %{rust_arches}
- rust-dirs-sys
ExclusiveArch: %{rust_arches}
- rust-dirs-sys-next
ExclusiveArch: %{rust_arches}
- rust-dirs2
ExclusiveArch: %{rust_arches}
- rust-diskonaut
ExclusiveArch: %{rust_arches}
- rust-dissimilar
ExclusiveArch: %{rust_arches}
- rust-dlib
ExclusiveArch: %{rust_arches}
- rust-dlv-list
ExclusiveArch: %{rust_arches}
- rust-dns-lookup
ExclusiveArch: %{rust_arches}
- rust-dns-parser
ExclusiveArch: %{rust_arches}
- rust-doc-comment
ExclusiveArch: %{rust_arches}
- rust-docmatic
ExclusiveArch: %{rust_arches}
- rust-docopt
ExclusiveArch: %{rust_arches}
- rust-dotenv
ExclusiveArch: %{rust_arches}
- rust-downcast-rs
ExclusiveArch: %{rust_arches}
- rust-dtoa
ExclusiveArch: %{rust_arches}
- rust-dtoa-short
ExclusiveArch: %{rust_arches}
- rust-dua-cli
ExclusiveArch: %{rust_arches}
- rust-duct
ExclusiveArch: %{rust_arches}
- rust-dummy
ExclusiveArch: %{rust_arches}
- rust-dunce
ExclusiveArch: %{rust_arches}
- rust-dutree
ExclusiveArch: %{rust_arches}
- rust-dyn-clone
ExclusiveArch: %{rust_arches}
- rust-easy-parallel
ExclusiveArch: %{rust_arches}
- rust-edit-distance
ExclusiveArch: %{rust_arches}
- rust-either
ExclusiveArch: %{rust_arches}
- rust-elasticlunr-rs
ExclusiveArch: %{rust_arches}
- rust-ena
ExclusiveArch: %{rust_arches}
- rust-encode_unicode
ExclusiveArch: %{rust_arches}
- rust-encoding
ExclusiveArch: %{rust_arches}
- rust-encoding-index-japanese
ExclusiveArch: %{rust_arches}
- rust-encoding-index-korean
ExclusiveArch: %{rust_arches}
- rust-encoding-index-simpchinese
ExclusiveArch: %{rust_arches}
- rust-encoding-index-singlebyte
ExclusiveArch: %{rust_arches}
- rust-encoding-index-tradchinese
ExclusiveArch: %{rust_arches}
- rust-encoding_index_tests
ExclusiveArch: %{rust_arches}
- rust-encoding_rs
ExclusiveArch: %{rust_arches}
- rust-encoding_rs_io
ExclusiveArch: %{rust_arches}
- rust-entities
ExclusiveArch: %{rust_arches}
- rust-enum-as-inner
ExclusiveArch: %{rust_arches}
- rust-enum-repr
ExclusiveArch: %{rust_arches}
- rust-enum_primitive
ExclusiveArch: %{rust_arches}
- rust-enumflags2
ExclusiveArch: %{rust_arches}
- rust-enumflags2_derive
ExclusiveArch: %{rust_arches}
- rust-env_logger
ExclusiveArch: %{rust_arches}
- rust-env_logger0.4
ExclusiveArch: %{rust_arches}
- rust-env_logger0.5
ExclusiveArch: %{rust_arches}
- rust-env_logger0.6
ExclusiveArch: %{rust_arches}
- rust-env_logger0.7
ExclusiveArch: %{rust_arches}
- rust-environment
ExclusiveArch: %{rust_arches}
- rust-envsubst
ExclusiveArch: %{rust_arches}
- rust-erased-serde
ExclusiveArch: %{rust_arches}
- rust-err-derive
ExclusiveArch: %{rust_arches}
- rust-errln
ExclusiveArch: %{rust_arches}
- rust-errno
ExclusiveArch: %{rust_arches}
- rust-error-chain
ExclusiveArch: %{rust_arches}
- rust-escaper
ExclusiveArch: %{rust_arches}
- rust-escargot
ExclusiveArch: %{rust_arches}
- rust-euclid
ExclusiveArch: %{rust_arches}
- rust-exa
ExclusiveArch: %{rust_arches}
- rust-expat-sys
ExclusiveArch: %{rust_arches}
- rust-extend
ExclusiveArch: %{rust_arches}
- rust-extprim
ExclusiveArch: %{rust_arches}
- rust-extprim_literals_macros
ExclusiveArch: %{rust_arches}
- rust-fail
ExclusiveArch: %{rust_arches}
- rust-failure
ExclusiveArch: %{rust_arches}
- rust-failure-tools
ExclusiveArch: %{rust_arches}
- rust-failure_derive
ExclusiveArch: %{rust_arches}
- rust-fake
ExclusiveArch: %{rust_arches}
- rust-fake-simd
ExclusiveArch: %{rust_arches}
- rust-fake_clock
ExclusiveArch: %{rust_arches}
- rust-fallible-iterator
ExclusiveArch: %{rust_arches}
- rust-fallible-streaming-iterator
ExclusiveArch: %{rust_arches}
- rust-fastrand
ExclusiveArch: %{rust_arches}
- rust-fbthrift_codegen_includer_proc_macro
ExclusiveArch: %{rust_arches}
- rust-fd-find
ExclusiveArch: %{rust_arches}
- rust-fdlimit
ExclusiveArch: %{rust_arches}
- rust-fedora
ExclusiveArch: %{rust_arches}
- rust-fedora-coreos-pinger
ExclusiveArch: %{rust_arches}
- rust-fedora-update-feedback
ExclusiveArch: %{rust_arches}
- rust-feed-rs
ExclusiveArch: %{rust_arches}
- rust-feedbin_api
ExclusiveArch: %{rust_arches}
- rust-feedly_api
ExclusiveArch: %{rust_arches}
- rust-fern
ExclusiveArch: %{rust_arches}
- rust-fever_api
ExclusiveArch: %{rust_arches}
- rust-ffsend
ExclusiveArch: %{rust_arches}
- rust-ffsend-api
ExclusiveArch: %{rust_arches}
- rust-filesize
ExclusiveArch: %{rust_arches}
- rust-filetime
ExclusiveArch: %{rust_arches}
- rust-findshlibs
ExclusiveArch: %{rust_arches}
- rust-fixedbitset
ExclusiveArch: %{rust_arches}
- rust-flame
ExclusiveArch: %{rust_arches}
- rust-flate2
ExclusiveArch: %{rust_arches}
- rust-float-cmp
ExclusiveArch: %{rust_arches}
- rust-float-cmp0.6
ExclusiveArch: %{rust_arches}
- rust-float-ord
ExclusiveArch: %{rust_arches}
- rust-flume
ExclusiveArch: %{rust_arches}
- rust-fnv
ExclusiveArch: %{rust_arches}
- rust-font-kit
ExclusiveArch: %{rust_arches}
- rust-foreign-types
ExclusiveArch: %{rust_arches}
- rust-foreign-types-macros
ExclusiveArch: %{rust_arches}
- rust-foreign-types-shared
ExclusiveArch: %{rust_arches}
- rust-foreign-types-shared0.1
ExclusiveArch: %{rust_arches}
- rust-foreign-types0.3
ExclusiveArch: %{rust_arches}
- rust-form_urlencoded
ExclusiveArch: %{rust_arches}
- rust-fragile
ExclusiveArch: %{rust_arches}
- rust-freetype
ExclusiveArch: %{rust_arches}
- rust-freetype-rs
ExclusiveArch: %{rust_arches}
- rust-freetype-sys
ExclusiveArch: %{rust_arches}
- rust-fs2
ExclusiveArch: %{rust_arches}
- rust-fs_extra
ExclusiveArch: %{rust_arches}
- rust-funty
ExclusiveArch: %{rust_arches}
- rust-fuse
ExclusiveArch: %{rust_arches}
- rust-futf
ExclusiveArch: %{rust_arches}
- rust-futures
ExclusiveArch: %{rust_arches}
- rust-futures-channel
ExclusiveArch: %{rust_arches}
- rust-futures-core
ExclusiveArch: %{rust_arches}
- rust-futures-cpupool
ExclusiveArch: %{rust_arches}
- rust-futures-executor
ExclusiveArch: %{rust_arches}
- rust-futures-io
ExclusiveArch: %{rust_arches}
- rust-futures-lite
ExclusiveArch: %{rust_arches}
- rust-futures-macro
ExclusiveArch: %{rust_arches}
- rust-futures-sink
ExclusiveArch: %{rust_arches}
- rust-futures-task
ExclusiveArch: %{rust_arches}
- rust-futures-timer
ExclusiveArch: %{rust_arches}
- rust-futures-util
ExclusiveArch: %{rust_arches}
- rust-futures0.1
ExclusiveArch: %{rust_arches}
- rust-fuzzy-matcher
ExclusiveArch: %{rust_arches}
- rust-fxhash
ExclusiveArch: %{rust_arches}
- rust-gcsf
ExclusiveArch: %{rust_arches}
- rust-gdk
ExclusiveArch: %{rust_arches}
- rust-gdk-pixbuf
ExclusiveArch: %{rust_arches}
- rust-gdk-pixbuf-sys
ExclusiveArch: %{rust_arches}
- rust-gdk-sys
ExclusiveArch: %{rust_arches}
- rust-generic-array
ExclusiveArch: %{rust_arches}
- rust-generic-array0.12
ExclusiveArch: %{rust_arches}
- rust-getch
ExclusiveArch: %{rust_arches}
- rust-gethostname
ExclusiveArch: %{rust_arches}
- rust-getopts
ExclusiveArch: %{rust_arches}
- rust-getrandom
ExclusiveArch: %{rust_arches}
- rust-getrandom0.1
ExclusiveArch: %{rust_arches}
- rust-gettext-rs
ExclusiveArch: %{rust_arches}
- rust-gettext-sys
ExclusiveArch: %{rust_arches}
- rust-ghash
ExclusiveArch: %{rust_arches}
- rust-ghost
ExclusiveArch: %{rust_arches}
- rust-gif
ExclusiveArch: %{rust_arches}
- rust-gif0.10
ExclusiveArch: %{rust_arches}
- rust-gimli
ExclusiveArch: %{rust_arches}
- rust-gio
ExclusiveArch: %{rust_arches}
- rust-gio-sys
ExclusiveArch: %{rust_arches}
- rust-gir-format-check
ExclusiveArch: %{rust_arches}
- rust-git-delta
ExclusiveArch: %{rust_arches}
- rust-git2
ExclusiveArch: %{rust_arches}
- rust-git2-curl
ExclusiveArch: %{rust_arches}
- rust-gitui
ExclusiveArch: %{rust_arches}
- rust-gl_generator
ExclusiveArch: %{rust_arches}
- rust-glib
ExclusiveArch: %{rust_arches}
- rust-glib-macros
ExclusiveArch: %{rust_arches}
- rust-glib-sys
ExclusiveArch: %{rust_arches}
- rust-glob
ExclusiveArch: %{rust_arches}
- rust-globset
ExclusiveArch: %{rust_arches}
- rust-globwalk
ExclusiveArch: %{rust_arches}
- rust-glutin
ExclusiveArch: %{rust_arches}
- rust-glutin_egl_sys
ExclusiveArch: %{rust_arches}
- rust-glutin_glx_sys
ExclusiveArch: %{rust_arches}
- rust-gobject-sys
ExclusiveArch: %{rust_arches}
- rust-goblin
ExclusiveArch: %{rust_arches}
- rust-google-drive3-fork
ExclusiveArch: %{rust_arches}
- rust-gptman
ExclusiveArch: %{rust_arches}
- rust-grep
ExclusiveArch: %{rust_arches}
- rust-grep-cli
ExclusiveArch: %{rust_arches}
- rust-grep-matcher
ExclusiveArch: %{rust_arches}
- rust-grep-pcre2
ExclusiveArch: %{rust_arches}
- rust-grep-printer
ExclusiveArch: %{rust_arches}
- rust-grep-regex
ExclusiveArch: %{rust_arches}
- rust-grep-searcher
ExclusiveArch: %{rust_arches}
- rust-groupable
ExclusiveArch: %{rust_arches}
- rust-gspell
ExclusiveArch: %{rust_arches}
- rust-gspell-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer
ExclusiveArch: %{rust_arches}
- rust-gstreamer-audio
ExclusiveArch: %{rust_arches}
- rust-gstreamer-audio-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-base
ExclusiveArch: %{rust_arches}
- rust-gstreamer-base-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-editing-services
ExclusiveArch: %{rust_arches}
- rust-gstreamer-editing-services-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-pbutils
ExclusiveArch: %{rust_arches}
- rust-gstreamer-pbutils-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-player
ExclusiveArch: %{rust_arches}
- rust-gstreamer-player-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-sys
ExclusiveArch: %{rust_arches}
- rust-gstreamer-video
ExclusiveArch: %{rust_arches}
- rust-gstreamer-video-sys
ExclusiveArch: %{rust_arches}
- rust-gtk
ExclusiveArch: %{rust_arches}
- rust-gtk-macros
ExclusiveArch: %{rust_arches}
- rust-gtk-rs-lgpl-docs
ExclusiveArch: %{rust_arches}
- rust-gtk-source-sys
ExclusiveArch: %{rust_arches}
- rust-gtk-sys
ExclusiveArch: %{rust_arches}
- rust-gzip-header
ExclusiveArch: %{rust_arches}
- rust-h2
ExclusiveArch: %{rust_arches}
- rust-h2_0.2
ExclusiveArch: %{rust_arches}
- rust-half
ExclusiveArch: %{rust_arches}
- rust-hamcrest
ExclusiveArch: %{rust_arches}
- rust-handlebars
ExclusiveArch: %{rust_arches}
- rust-hashbrown
ExclusiveArch: %{rust_arches}
- rust-hashlink
ExclusiveArch: %{rust_arches}
- rust-headers
ExclusiveArch: %{rust_arches}
- rust-headers-core
ExclusiveArch: %{rust_arches}
- rust-headers-derive
ExclusiveArch: %{rust_arches}
- rust-heapsize
ExclusiveArch: %{rust_arches}
- rust-heatseeker
ExclusiveArch: %{rust_arches}
- rust-heck
ExclusiveArch: %{rust_arches}
- rust-hex
ExclusiveArch: %{rust_arches}
- rust-hex-literal
ExclusiveArch: %{rust_arches}
- rust-hex-literal-impl
ExclusiveArch: %{rust_arches}
- rust-hex-literal0.2
ExclusiveArch: %{rust_arches}
- rust-hexyl
ExclusiveArch: %{rust_arches}
- rust-hkdf
ExclusiveArch: %{rust_arches}
- rust-hmac
ExclusiveArch: %{rust_arches}
- rust-home
ExclusiveArch: %{rust_arches}
- rust-horrorshow
ExclusiveArch: %{rust_arches}
- rust-hostname
ExclusiveArch: %{rust_arches}
- rust-hostname-validator
ExclusiveArch: %{rust_arches}
- rust-html2pango
ExclusiveArch: %{rust_arches}
- rust-html5ever
ExclusiveArch: %{rust_arches}
- rust-http
ExclusiveArch: %{rust_arches}
- rust-http-body
ExclusiveArch: %{rust_arches}
- rust-http-body0.3
ExclusiveArch: %{rust_arches}
- rust-http0.1
ExclusiveArch: %{rust_arches}
- rust-httparse
ExclusiveArch: %{rust_arches}
- rust-httpdate
ExclusiveArch: %{rust_arches}
- rust-human-sort
ExclusiveArch: %{rust_arches}
- rust-humansize
ExclusiveArch: %{rust_arches}
- rust-humantime
ExclusiveArch: %{rust_arches}
- rust-humantime-serde
ExclusiveArch: %{rust_arches}
- rust-humantime1
ExclusiveArch: %{rust_arches}
- rust-hyper
ExclusiveArch: %{rust_arches}
- rust-hyper-native-tls
ExclusiveArch: %{rust_arches}
- rust-hyper-staticfile
ExclusiveArch: %{rust_arches}
- rust-hyper-tls
ExclusiveArch: %{rust_arches}
- rust-hyper-tls0.4
ExclusiveArch: %{rust_arches}
- rust-hyper0.10
ExclusiveArch: %{rust_arches}
- rust-hyper0.13
ExclusiveArch: %{rust_arches}
- rust-hyperfine
ExclusiveArch: %{rust_arches}
- rust-i3ipc
ExclusiveArch: %{rust_arches}
- rust-id_tree
ExclusiveArch: %{rust_arches}
- rust-ident_case
ExclusiveArch: %{rust_arches}
- rust-idna
ExclusiveArch: %{rust_arches}
- rust-idna0.1
ExclusiveArch: %{rust_arches}
- rust-ignore
ExclusiveArch: %{rust_arches}
- rust-im-rc
ExclusiveArch: %{rust_arches}
- rust-image
ExclusiveArch: %{rust_arches}
- rust-imgref
ExclusiveArch: %{rust_arches}
- rust-indexmap
ExclusiveArch: %{rust_arches}
- rust-indicatif
ExclusiveArch: %{rust_arches}
- rust-indoc
ExclusiveArch: %{rust_arches}
- rust-inflate
ExclusiveArch: %{rust_arches}
- rust-inotify
ExclusiveArch: %{rust_arches}
- rust-inotify-sys
ExclusiveArch: %{rust_arches}
- rust-input_buffer
ExclusiveArch: %{rust_arches}
- rust-insta
ExclusiveArch: %{rust_arches}
- rust-instant
ExclusiveArch: %{rust_arches}
- rust-interpolate_name
ExclusiveArch: %{rust_arches}
- rust-intervaltree
ExclusiveArch: %{rust_arches}
- rust-invalidstring
ExclusiveArch: %{rust_arches}
- rust-inventory
ExclusiveArch: %{rust_arches}
- rust-inventory-impl
ExclusiveArch: %{rust_arches}
- rust-iocuddle
ExclusiveArch: %{rust_arches}
- rust-iovec
ExclusiveArch: %{rust_arches}
- rust-ipnet
ExclusiveArch: %{rust_arches}
- rust-ipnetwork
ExclusiveArch: %{rust_arches}
- rust-iron
ExclusiveArch: %{rust_arches}
- rust-isahc
ExclusiveArch: %{rust_arches}
- rust-iso8601
ExclusiveArch: %{rust_arches}
- rust-iter-read
ExclusiveArch: %{rust_arches}
- rust-itertools
ExclusiveArch: %{rust_arches}
- rust-itertools-num
ExclusiveArch: %{rust_arches}
- rust-itertools0.8
ExclusiveArch: %{rust_arches}
- rust-itertools0.9
ExclusiveArch: %{rust_arches}
- rust-itoa
ExclusiveArch: %{rust_arches}
- rust-ivf
ExclusiveArch: %{rust_arches}
- rust-javascriptcore-rs
ExclusiveArch: %{rust_arches}
- rust-javascriptcore-rs-sys
ExclusiveArch: %{rust_arches}
- rust-jetscii
ExclusiveArch: %{rust_arches}
- rust-jieba-rs
ExclusiveArch: %{rust_arches}
- rust-jobserver
ExclusiveArch: %{rust_arches}
- rust-jpeg-decoder
ExclusiveArch: %{rust_arches}
- rust-jql
ExclusiveArch: %{rust_arches}
- rust-js-sys
ExclusiveArch: %{rust_arches}
- rust-js_int
ExclusiveArch: %{rust_arches}
- rust-json
ExclusiveArch: %{rust_arches}
- rust-jwalk
ExclusiveArch: %{rust_arches}
- rust-keccak
ExclusiveArch: %{rust_arches}
- rust-khronos_api
ExclusiveArch: %{rust_arches}
- rust-kstring
ExclusiveArch: %{rust_arches}
- rust-kv-log-macro
ExclusiveArch: %{rust_arches}
- rust-lab
ExclusiveArch: %{rust_arches}
- rust-lalrpop
ExclusiveArch: %{rust_arches}
- rust-lalrpop-util
ExclusiveArch: %{rust_arches}
- rust-language-tags
ExclusiveArch: %{rust_arches}
- rust-lazy-init
ExclusiveArch: %{rust_arches}
- rust-lazy_static
ExclusiveArch: %{rust_arches}
- rust-lazycell
ExclusiveArch: %{rust_arches}
- rust-leb128
ExclusiveArch: %{rust_arches}
- rust-letter-avatar
ExclusiveArch: %{rust_arches}
- rust-lexical-core
ExclusiveArch: %{rust_arches}
- rust-libc
ExclusiveArch: %{rust_arches}
- rust-libcryptsetup-rs
ExclusiveArch: %{rust_arches}
- rust-libcryptsetup-rs-sys
ExclusiveArch: %{rust_arches}
- rust-libdbus-sys
ExclusiveArch: %{rust_arches}
- rust-libflate
ExclusiveArch: %{rust_arches}
- rust-libflate_lz77
ExclusiveArch: %{rust_arches}
- rust-libgit2-sys
ExclusiveArch: %{rust_arches}
- rust-libhandy
ExclusiveArch: %{rust_arches}
- rust-libhandy-sys
ExclusiveArch: %{rust_arches}
- rust-libloading
ExclusiveArch: %{rust_arches}
- rust-libloading0.6
ExclusiveArch: %{rust_arches}
- rust-libm
ExclusiveArch: %{rust_arches}
- rust-libmount
ExclusiveArch: %{rust_arches}
- rust-libnotcurses-sys
ExclusiveArch: %{rust_arches}
- rust-liboverdrop
ExclusiveArch: %{rust_arches}
- rust-libpulse-binding
ExclusiveArch: %{rust_arches}
- rust-libpulse-sys
ExclusiveArch: %{rust_arches}
- rust-libslirp
ExclusiveArch: %{rust_arches}
- rust-libslirp-sys
ExclusiveArch: %{rust_arches}
- rust-libsqlite3-sys
ExclusiveArch: %{rust_arches}
- rust-libssh2-sys
ExclusiveArch: %{rust_arches}
- rust-libsystemd
ExclusiveArch: %{rust_arches}
- rust-libsystemd-sys
ExclusiveArch: %{rust_arches}
- rust-libudev
ExclusiveArch: %{rust_arches}
- rust-libudev-sys
ExclusiveArch: %{rust_arches}
- rust-libxml
ExclusiveArch: %{rust_arches}
- rust-libz-sys
ExclusiveArch: %{rust_arches}
- rust-line-wrap
ExclusiveArch: %{rust_arches}
- rust-line_drawing
ExclusiveArch: %{rust_arches}
- rust-link-cplusplus
ExclusiveArch: %{rust_arches}
- rust-linked-hash-map
ExclusiveArch: %{rust_arches}
- rust-linkify
ExclusiveArch: %{rust_arches}
- rust-lipsum
ExclusiveArch: %{rust_arches}
- rust-liquid
ExclusiveArch: %{rust_arches}
- rust-liquid-core
ExclusiveArch: %{rust_arches}
- rust-liquid-derive
ExclusiveArch: %{rust_arches}
- rust-liquid-lib
ExclusiveArch: %{rust_arches}
- rust-listenfd
ExclusiveArch: %{rust_arches}
- rust-lmdb
ExclusiveArch: %{rust_arches}
- rust-lmdb-sys
ExclusiveArch: %{rust_arches}
- rust-locale
ExclusiveArch: %{rust_arches}
- rust-locale_config
ExclusiveArch: %{rust_arches}
- rust-lock_api
ExclusiveArch: %{rust_arches}
- rust-lockfree
ExclusiveArch: %{rust_arches}
- rust-log
ExclusiveArch: %{rust_arches}
- rust-log-mdc
ExclusiveArch: %{rust_arches}
- rust-log-panics
ExclusiveArch: %{rust_arches}
- rust-log0.3
ExclusiveArch: %{rust_arches}
- rust-log4rs
ExclusiveArch: %{rust_arches}
- rust-loggerv
ExclusiveArch: %{rust_arches}
- rust-loopdev
ExclusiveArch: %{rust_arches}
- rust-lru-cache
ExclusiveArch: %{rust_arches}
- rust-lru_time_cache
ExclusiveArch: %{rust_arches}
- rust-lscolors
ExclusiveArch: %{rust_arches}
- rust-lsd
ExclusiveArch: %{rust_arches}
- rust-lzma-sys
ExclusiveArch: %{rust_arches}
- rust-lzw
ExclusiveArch: %{rust_arches}
- rust-mac
ExclusiveArch: %{rust_arches}
- rust-macro-attr
ExclusiveArch: %{rust_arches}
- rust-magic-crypt
ExclusiveArch: %{rust_arches}
- rust-maildir
ExclusiveArch: %{rust_arches}
- rust-mailparse
ExclusiveArch: %{rust_arches}
- rust-man
ExclusiveArch: %{rust_arches}
- rust-maplit
ExclusiveArch: %{rust_arches}
- rust-markup5ever
ExclusiveArch: %{rust_arches}
- rust-markup5ever_rcdom
ExclusiveArch: %{rust_arches}
- rust-match_cfg
ExclusiveArch: %{rust_arches}
- rust-matches
ExclusiveArch: %{rust_arches}
- rust-matrixmultiply
ExclusiveArch: %{rust_arches}
- rust-maxminddb
ExclusiveArch: %{rust_arches}
- rust-maybe-uninit
ExclusiveArch: %{rust_arches}
- rust-mbox
ExclusiveArch: %{rust_arches}
- rust-mbrman
ExclusiveArch: %{rust_arches}
- rust-md-5
ExclusiveArch: %{rust_arches}
- rust-md5
ExclusiveArch: %{rust_arches}
- rust-mdl
ExclusiveArch: %{rust_arches}
- rust-memchr
ExclusiveArch: %{rust_arches}
- rust-memmap
ExclusiveArch: %{rust_arches}
- rust-memmap2
ExclusiveArch: %{rust_arches}
- rust-memoffset
ExclusiveArch: %{rust_arches}
- rust-memoffset0.5
ExclusiveArch: %{rust_arches}
- rust-memsec
ExclusiveArch: %{rust_arches}
- rust-metadeps
ExclusiveArch: %{rust_arches}
- rust-migrations_internals
ExclusiveArch: %{rust_arches}
- rust-migrations_macros
ExclusiveArch: %{rust_arches}
- rust-mime
ExclusiveArch: %{rust_arches}
- rust-mime-sniffer
ExclusiveArch: %{rust_arches}
- rust-mime0.2
ExclusiveArch: %{rust_arches}
- rust-mime_guess
ExclusiveArch: %{rust_arches}
- rust-mime_guess1
ExclusiveArch: %{rust_arches}
- rust-miniflux_api
ExclusiveArch: %{rust_arches}
- rust-minify-html
ExclusiveArch: %{rust_arches}
- rust-miniz-sys
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide0.3
ExclusiveArch: %{rust_arches}
- rust-miniz_oxide_c_api
ExclusiveArch: %{rust_arches}
- rust-mint
ExclusiveArch: %{rust_arches}
- rust-mio
ExclusiveArch: %{rust_arches}
- rust-mio-extras
ExclusiveArch: %{rust_arches}
- rust-mio-uds
ExclusiveArch: %{rust_arches}
- rust-mio0.6
ExclusiveArch: %{rust_arches}
- rust-mktemp
ExclusiveArch: %{rust_arches}
- rust-mnt
ExclusiveArch: %{rust_arches}
- rust-mockito
ExclusiveArch: %{rust_arches}
- rust-modifier
ExclusiveArch: %{rust_arches}
- rust-more-asserts
ExclusiveArch: %{rust_arches}
- rust-muldiv
ExclusiveArch: %{rust_arches}
- rust-multimap
ExclusiveArch: %{rust_arches}
- rust-multipart
ExclusiveArch: %{rust_arches}
- rust-mustache
ExclusiveArch: %{rust_arches}
- rust-nasm-rs
ExclusiveArch: %{rust_arches}
- rust-native-tls
ExclusiveArch: %{rust_arches}
- rust-natord
ExclusiveArch: %{rust_arches}
- rust-nb-connect
ExclusiveArch: %{rust_arches}
- rust-net2
ExclusiveArch: %{rust_arches}
- rust-netlink-packet-core
ExclusiveArch: %{rust_arches}
- rust-netlink-packet-route
ExclusiveArch: %{rust_arches}
- rust-netlink-packet-utils
ExclusiveArch: %{rust_arches}
- rust-netlink-proto
ExclusiveArch: %{rust_arches}
- rust-netlink-sys
ExclusiveArch: %{rust_arches}
- rust-netmap_sys
ExclusiveArch: %{rust_arches}
- rust-nettle
ExclusiveArch: %{rust_arches}
- rust-nettle-sys
ExclusiveArch: %{rust_arches}
- rust-new_debug_unreachable
ExclusiveArch: %{rust_arches}
- rust-news-flash
ExclusiveArch: %{rust_arches}
- rust-newsblur_api
ExclusiveArch: %{rust_arches}
- rust-newtype_derive
ExclusiveArch: %{rust_arches}
- rust-nickel
ExclusiveArch: %{rust_arches}
- rust-nix
ExclusiveArch: %{rust_arches}
- rust-nix0.14
ExclusiveArch: %{rust_arches}
- rust-nix0.17
ExclusiveArch: %{rust_arches}
- rust-nix0.18
ExclusiveArch: %{rust_arches}
- rust-no-panic
ExclusiveArch: %{rust_arches}
- rust-nodrop
ExclusiveArch: %{rust_arches}
- rust-nom
ExclusiveArch: %{rust_arches}
- rust-nom4
ExclusiveArch: %{rust_arches}
- rust-nom5
ExclusiveArch: %{rust_arches}
- rust-noop_proc_macro
ExclusiveArch: %{rust_arches}
- rust-normalize-line-endings
ExclusiveArch: %{rust_arches}
- rust-notify
ExclusiveArch: %{rust_arches}
- rust-notify-rust
ExclusiveArch: %{rust_arches}
- rust-num
ExclusiveArch: %{rust_arches}
- rust-num-bigint
ExclusiveArch: %{rust_arches}
- rust-num-bigint-dig
ExclusiveArch: %{rust_arches}
- rust-num-complex
ExclusiveArch: %{rust_arches}
- rust-num-derive
ExclusiveArch: %{rust_arches}
- rust-num-integer
ExclusiveArch: %{rust_arches}
- rust-num-iter
ExclusiveArch: %{rust_arches}
- rust-num-rational
ExclusiveArch: %{rust_arches}
- rust-num-traits
ExclusiveArch: %{rust_arches}
- rust-num-traits0.1
ExclusiveArch: %{rust_arches}
- rust-num_cpus
ExclusiveArch: %{rust_arches}
- rust-number_prefix
ExclusiveArch: %{rust_arches}
- rust-numtoa
ExclusiveArch: %{rust_arches}
- rust-oauth2
ExclusiveArch: %{rust_arches}
- rust-obfstr
ExclusiveArch: %{rust_arches}
- rust-object
ExclusiveArch: %{rust_arches}
- rust-odds
ExclusiveArch: %{rust_arches}
- rust-oid
ExclusiveArch: %{rust_arches}
- rust-once_cell
ExclusiveArch: %{rust_arches}
- rust-onig
ExclusiveArch: %{rust_arches}
- rust-onig_sys
ExclusiveArch: %{rust_arches}
- rust-oorandom
ExclusiveArch: %{rust_arches}
- rust-opaque-debug
ExclusiveArch: %{rust_arches}
- rust-open
ExclusiveArch: %{rust_arches}
- rust-openat
ExclusiveArch: %{rust_arches}
- rust-openat-ext
ExclusiveArch: %{rust_arches}
- rust-opener
ExclusiveArch: %{rust_arches}
- rust-openssh-keys
ExclusiveArch: %{rust_arches}
- rust-openssl
ExclusiveArch: %{rust_arches}
- rust-openssl-probe
ExclusiveArch: %{rust_arches}
- rust-openssl-sys
ExclusiveArch: %{rust_arches}
- rust-ord_subset
ExclusiveArch: %{rust_arches}
- rust-ordered-float
ExclusiveArch: %{rust_arches}
- rust-ordered-multimap
ExclusiveArch: %{rust_arches}
- rust-os_info
ExclusiveArch: %{rust_arches}
- rust-os_pipe
ExclusiveArch: %{rust_arches}
- rust-os_str_bytes
ExclusiveArch: %{rust_arches}
- rust-osmesa-sys
ExclusiveArch: %{rust_arches}
- rust-osstrtools
ExclusiveArch: %{rust_arches}
- rust-ostree
ExclusiveArch: %{rust_arches}
- rust-ostree-sys
ExclusiveArch: %{rust_arches}
- rust-owned-alloc
ExclusiveArch: %{rust_arches}
- rust-owned_ttf_parser
ExclusiveArch: %{rust_arches}
- rust-owning_ref
ExclusiveArch: %{rust_arches}
- rust-packaging
ExclusiveArch: %{rust_arches}
- rust-pad
ExclusiveArch: %{rust_arches}
- rust-pager
ExclusiveArch: %{rust_arches}
- rust-palette
ExclusiveArch: %{rust_arches}
- rust-palette_derive
ExclusiveArch: %{rust_arches}
- rust-pango
ExclusiveArch: %{rust_arches}
- rust-pango-sys
ExclusiveArch: %{rust_arches}
- rust-pangocairo
ExclusiveArch: %{rust_arches}
- rust-pangocairo-sys
ExclusiveArch: %{rust_arches}
- rust-parity-wasm
ExclusiveArch: %{rust_arches}
- rust-parking
ExclusiveArch: %{rust_arches}
- rust-parking_lot
ExclusiveArch: %{rust_arches}
- rust-parking_lot_core
ExclusiveArch: %{rust_arches}
- rust-parse-zoneinfo
ExclusiveArch: %{rust_arches}
- rust-parse_cfg
ExclusiveArch: %{rust_arches}
- rust-parsec-client
ExclusiveArch: %{rust_arches}
- rust-parsec-interface
ExclusiveArch: %{rust_arches}
- rust-partial-io
ExclusiveArch: %{rust_arches}
- rust-paste
ExclusiveArch: %{rust_arches}
- rust-paste-impl
ExclusiveArch: %{rust_arches}
- rust-path-absolutize
ExclusiveArch: %{rust_arches}
- rust-path-dedot
ExclusiveArch: %{rust_arches}
- rust-path-slash
ExclusiveArch: %{rust_arches}
- rust-pathdiff
ExclusiveArch: %{rust_arches}
- rust-pathfinder_geometry
ExclusiveArch: %{rust_arches}
- rust-pathfinder_simd
ExclusiveArch: %{rust_arches}
- rust-pbr
ExclusiveArch: %{rust_arches}
- rust-pcap
ExclusiveArch: %{rust_arches}
- rust-pcre2
ExclusiveArch: %{rust_arches}
- rust-pcre2-sys
ExclusiveArch: %{rust_arches}
- rust-peeking_take_while
ExclusiveArch: %{rust_arches}
- rust-peg
ExclusiveArch: %{rust_arches}
- rust-peg-macros
ExclusiveArch: %{rust_arches}
- rust-peg-runtime
ExclusiveArch: %{rust_arches}
- rust-peg0.5
ExclusiveArch: %{rust_arches}
- rust-pem
ExclusiveArch: %{rust_arches}
- rust-percent-encoding
ExclusiveArch: %{rust_arches}
- rust-percent-encoding1
ExclusiveArch: %{rust_arches}
- rust-peresil
ExclusiveArch: %{rust_arches}
- rust-permutate
ExclusiveArch: %{rust_arches}
- rust-permutohedron
ExclusiveArch: %{rust_arches}
- rust-pest
ExclusiveArch: %{rust_arches}
- rust-pest_derive
ExclusiveArch: %{rust_arches}
- rust-pest_generator
ExclusiveArch: %{rust_arches}
- rust-pest_meta
ExclusiveArch: %{rust_arches}
- rust-petgraph
ExclusiveArch: %{rust_arches}
- rust-phf
ExclusiveArch: %{rust_arches}
- rust-phf0.7
ExclusiveArch: %{rust_arches}
- rust-phf_codegen
ExclusiveArch: %{rust_arches}
- rust-phf_codegen0.7
ExclusiveArch: %{rust_arches}
- rust-phf_generator
ExclusiveArch: %{rust_arches}
- rust-phf_generator0.7
ExclusiveArch: %{rust_arches}
- rust-phf_macros
ExclusiveArch: %{rust_arches}
- rust-phf_macros0.7
ExclusiveArch: %{rust_arches}
- rust-phf_shared
ExclusiveArch: %{rust_arches}
- rust-phf_shared0.7
ExclusiveArch: %{rust_arches}
- rust-picky-asn1
ExclusiveArch: %{rust_arches}
- rust-picky-asn1-der
ExclusiveArch: %{rust_arches}
- rust-picky-asn1-x509
ExclusiveArch: %{rust_arches}
- rust-pico-args
ExclusiveArch: %{rust_arches}
- rust-pin-project
ExclusiveArch: %{rust_arches}
- rust-pin-project-internal
ExclusiveArch: %{rust_arches}
- rust-pin-project-internal0.4
ExclusiveArch: %{rust_arches}
- rust-pin-project-lite
ExclusiveArch: %{rust_arches}
- rust-pin-project-lite0.1
ExclusiveArch: %{rust_arches}
- rust-pin-project0.4
ExclusiveArch: %{rust_arches}
- rust-pin-utils
ExclusiveArch: %{rust_arches}
- rust-pipe
ExclusiveArch: %{rust_arches}
- rust-piper
ExclusiveArch: %{rust_arches}
- rust-pkcs11
ExclusiveArch: %{rust_arches}
- rust-pkg-config
ExclusiveArch: %{rust_arches}
- rust-plain
ExclusiveArch: %{rust_arches}
- rust-platform-dirs
ExclusiveArch: %{rust_arches}
- rust-platforms
ExclusiveArch: %{rust_arches}
- rust-plist
ExclusiveArch: %{rust_arches}
- rust-plotters
ExclusiveArch: %{rust_arches}
- rust-plugin
ExclusiveArch: %{rust_arches}
- rust-pnet_base
ExclusiveArch: %{rust_arches}
- rust-pnet_datalink
ExclusiveArch: %{rust_arches}
- rust-pnet_sys
ExclusiveArch: %{rust_arches}
- rust-png
ExclusiveArch: %{rust_arches}
- rust-podio
ExclusiveArch: %{rust_arches}
- rust-polling
ExclusiveArch: %{rust_arches}
- rust-polyval
ExclusiveArch: %{rust_arches}
- rust-pommes
ExclusiveArch: %{rust_arches}
- rust-ppv-lite86
ExclusiveArch: %{rust_arches}
- rust-pq-sys
ExclusiveArch: %{rust_arches}
- rust-precomputed-hash
ExclusiveArch: %{rust_arches}
- rust-predicates
ExclusiveArch: %{rust_arches}
- rust-predicates-core
ExclusiveArch: %{rust_arches}
- rust-predicates-tree
ExclusiveArch: %{rust_arches}
- rust-pretty-git-prompt
ExclusiveArch: %{rust_arches}
- rust-pretty-hex
ExclusiveArch: %{rust_arches}
- rust-pretty_assertions
ExclusiveArch: %{rust_arches}
- rust-pretty_assertions0.6
ExclusiveArch: %{rust_arches}
- rust-pretty_env_logger
ExclusiveArch: %{rust_arches}
- rust-prettytable-rs
ExclusiveArch: %{rust_arches}
- rust-proc-macro-crate
ExclusiveArch: %{rust_arches}
- rust-proc-macro-error
ExclusiveArch: %{rust_arches}
- rust-proc-macro-error-attr
ExclusiveArch: %{rust_arches}
- rust-proc-macro-hack
ExclusiveArch: %{rust_arches}
- rust-proc-macro-nested
ExclusiveArch: %{rust_arches}
- rust-proc-macro2
ExclusiveArch: %{rust_arches}
- rust-proc-macro2-0.4
ExclusiveArch: %{rust_arches}
- rust-proc-quote
ExclusiveArch: %{rust_arches}
- rust-proc-quote-impl
ExclusiveArch: %{rust_arches}
- rust-procedural-masquerade
ExclusiveArch: %{rust_arches}
- rust-process_path
ExclusiveArch: %{rust_arches}
- rust-procfs
ExclusiveArch: %{rust_arches}
- rust-procfs0.8
ExclusiveArch: %{rust_arches}
- rust-procs
ExclusiveArch: %{rust_arches}
- rust-progress-streams
ExclusiveArch: %{rust_arches}
- rust-prometheus
ExclusiveArch: %{rust_arches}
- rust-proptest
ExclusiveArch: %{rust_arches}
- rust-proptest-derive
ExclusiveArch: %{rust_arches}
- rust-prost
ExclusiveArch: %{rust_arches}
- rust-prost-build
ExclusiveArch: %{rust_arches}
- rust-prost-derive
ExclusiveArch: %{rust_arches}
- rust-prost-types
ExclusiveArch: %{rust_arches}
- rust-protobuf
ExclusiveArch: %{rust_arches}
- rust-protobuf-codegen
ExclusiveArch: %{rust_arches}
- rust-protobuf-codegen-pure
ExclusiveArch: %{rust_arches}
- rust-protoc
ExclusiveArch: %{rust_arches}
- rust-protoc-rust
ExclusiveArch: %{rust_arches}
- rust-psa-crypto
ExclusiveArch: %{rust_arches}
- rust-psa-crypto-sys
ExclusiveArch: %{rust_arches}
- rust-psm
ExclusiveArch: %{rust_arches}
- rust-psutil
ExclusiveArch: %{rust_arches}
- rust-publicsuffix
ExclusiveArch: %{rust_arches}
- rust-pulldown-cmark
ExclusiveArch: %{rust_arches}
- rust-pulse
ExclusiveArch: %{rust_arches}
- rust-pure-rust-locales
ExclusiveArch: %{rust_arches}
- rust-pyo3
ExclusiveArch: %{rust_arches}
- rust-pyo3-macros
ExclusiveArch: %{rust_arches}
- rust-pyo3-macros-backend
ExclusiveArch: %{rust_arches}
- rust-python3-sys
ExclusiveArch: %{rust_arches}
- rust-qr2term
ExclusiveArch: %{rust_arches}
- rust-qrcode
ExclusiveArch: %{rust_arches}
- rust-qstring
ExclusiveArch: %{rust_arches}
- rust-quick-error
ExclusiveArch: %{rust_arches}
- rust-quick-error1
ExclusiveArch: %{rust_arches}
- rust-quick-xml
ExclusiveArch: %{rust_arches}
- rust-quickcheck
ExclusiveArch: %{rust_arches}
- rust-quickcheck0.6
ExclusiveArch: %{rust_arches}
- rust-quickcheck0.9
ExclusiveArch: %{rust_arches}
- rust-quickcheck_macros
ExclusiveArch: %{rust_arches}
- rust-quickersort
ExclusiveArch: %{rust_arches}
- rust-quote
ExclusiveArch: %{rust_arches}
- rust-quote0.3
ExclusiveArch: %{rust_arches}
- rust-quote0.6
ExclusiveArch: %{rust_arches}
- rust-quoted_printable
ExclusiveArch: %{rust_arches}
- rust-r2d2
ExclusiveArch: %{rust_arches}
- rust-radium
ExclusiveArch: %{rust_arches}
- rust-rand
ExclusiveArch: %{rust_arches}
- rust-rand0.4
ExclusiveArch: %{rust_arches}
- rust-rand0.5
ExclusiveArch: %{rust_arches}
- rust-rand0.6
ExclusiveArch: %{rust_arches}
- rust-rand0.7
ExclusiveArch: %{rust_arches}
- rust-rand_chacha
ExclusiveArch: %{rust_arches}
- rust-rand_chacha0.1
ExclusiveArch: %{rust_arches}
- rust-rand_chacha0.2
ExclusiveArch: %{rust_arches}
- rust-rand_core
ExclusiveArch: %{rust_arches}
- rust-rand_core0.3
ExclusiveArch: %{rust_arches}
- rust-rand_core0.4
ExclusiveArch: %{rust_arches}
- rust-rand_core0.5
ExclusiveArch: %{rust_arches}
- rust-rand_distr
ExclusiveArch: %{rust_arches}
- rust-rand_distr0.2
ExclusiveArch: %{rust_arches}
- rust-rand_hc
ExclusiveArch: %{rust_arches}
- rust-rand_hc0.1
ExclusiveArch: %{rust_arches}
- rust-rand_isaac
ExclusiveArch: %{rust_arches}
- rust-rand_isaac0.1
ExclusiveArch: %{rust_arches}
- rust-rand_jitter
ExclusiveArch: %{rust_arches}
- rust-rand_jitter0.1
ExclusiveArch: %{rust_arches}
- rust-rand_os
ExclusiveArch: %{rust_arches}
- rust-rand_os0.1
ExclusiveArch: %{rust_arches}
- rust-rand_pcg
ExclusiveArch: %{rust_arches}
- rust-rand_pcg0.1
ExclusiveArch: %{rust_arches}
- rust-rand_pcg0.2
ExclusiveArch: %{rust_arches}
- rust-rand_xorshift
ExclusiveArch: %{rust_arches}
- rust-rand_xorshift0.1
ExclusiveArch: %{rust_arches}
- rust-rand_xoshiro
ExclusiveArch: %{rust_arches}
- rust-random-fast-rng
ExclusiveArch: %{rust_arches}
- rust-random-trait
ExclusiveArch: %{rust_arches}
- rust-randomize
ExclusiveArch: %{rust_arches}
- rust-rav1e
ExclusiveArch: %{rust_arches}
- rust-raw-window-handle
ExclusiveArch: %{rust_arches}
- rust-rawpointer
ExclusiveArch: %{rust_arches}
- rust-rawslice
ExclusiveArch: %{rust_arches}
- rust-rayon
ExclusiveArch: %{rust_arches}
- rust-rayon-core
ExclusiveArch: %{rust_arches}
- rust-readability-fork
ExclusiveArch: %{rust_arches}
- rust-readwrite
ExclusiveArch: %{rust_arches}
- rust-recycler
ExclusiveArch: %{rust_arches}
- rust-ref-cast
ExclusiveArch: %{rust_arches}
- rust-ref-cast-impl
ExclusiveArch: %{rust_arches}
- rust-regex
ExclusiveArch: %{rust_arches}
- rust-regex-automata
ExclusiveArch: %{rust_arches}
- rust-regex-syntax
ExclusiveArch: %{rust_arches}
- rust-region
ExclusiveArch: %{rust_arches}
- rust-relative-path
ExclusiveArch: %{rust_arches}
- rust-relay
ExclusiveArch: %{rust_arches}
- rust-remove_dir_all
ExclusiveArch: %{rust_arches}
- rust-reqwest
ExclusiveArch: %{rust_arches}
- rust-reqwest0.10
ExclusiveArch: %{rust_arches}
- rust-resize
ExclusiveArch: %{rust_arches}
- rust-resolv-conf
ExclusiveArch: %{rust_arches}
- rust-restson
ExclusiveArch: %{rust_arches}
- rust-retry
ExclusiveArch: %{rust_arches}
- rust-rgb
ExclusiveArch: %{rust_arches}
- rust-ring
ExclusiveArch: %{rust_arches}
- rust-ripgrep
ExclusiveArch: %{rust_arches}
- rust-rle-decode-fast
ExclusiveArch: %{rust_arches}
- rust-rmp
ExclusiveArch: %{rust_arches}
- rust-rmp-serde
ExclusiveArch: %{rust_arches}
- rust-roff
ExclusiveArch: %{rust_arches}
- rust-ron
ExclusiveArch: %{rust_arches}
- rust-roxmltree
ExclusiveArch: %{rust_arches}
- rust-rpassword
ExclusiveArch: %{rust_arches}
- rust-rpick
ExclusiveArch: %{rust_arches}
- rust-rsa
ExclusiveArch: %{rust_arches}
- rust-rspec
ExclusiveArch: %{rust_arches}
- rust-rtnetlink
ExclusiveArch: %{rust_arches}
- rust-ruma
ExclusiveArch: %{rust_arches}
- rust-ruma-api
ExclusiveArch: %{rust_arches}
- rust-ruma-api-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-appservice-api
ExclusiveArch: %{rust_arches}
- rust-ruma-client-api
ExclusiveArch: %{rust_arches}
- rust-ruma-common
ExclusiveArch: %{rust_arches}
- rust-ruma-events
ExclusiveArch: %{rust_arches}
- rust-ruma-events-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-federation-api
ExclusiveArch: %{rust_arches}
- rust-ruma-identifiers
ExclusiveArch: %{rust_arches}
- rust-ruma-identifiers-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-identifiers-validation
ExclusiveArch: %{rust_arches}
- rust-ruma-identity-service-api
ExclusiveArch: %{rust_arches}
- rust-ruma-push-gateway-api
ExclusiveArch: %{rust_arches}
- rust-ruma-serde
ExclusiveArch: %{rust_arches}
- rust-ruma-serde-macros
ExclusiveArch: %{rust_arches}
- rust-ruma-signatures
ExclusiveArch: %{rust_arches}
- rust-rusqlite
ExclusiveArch: %{rust_arches}
- rust-rust-embed
ExclusiveArch: %{rust_arches}
- rust-rust-embed-impl
ExclusiveArch: %{rust_arches}
- rust-rust-embed-utils
ExclusiveArch: %{rust_arches}
- rust-rust-ini
ExclusiveArch: %{rust_arches}
- rust-rust-stemmers
ExclusiveArch: %{rust_arches}
- rust-rust_decimal
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_normal_macro
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_proc_macro
ExclusiveArch: %{rust_arches}
- rust-rust_hawktracer_sys
ExclusiveArch: %{rust_arches}
- rust-rustc-demangle
ExclusiveArch: %{rust_arches}
- rust-rustc-hash
ExclusiveArch: %{rust_arches}
- rust-rustc-serialize
ExclusiveArch: %{rust_arches}
- rust-rustc-test
ExclusiveArch: %{rust_arches}
- rust-rustc_tools_util
ExclusiveArch: %{rust_arches}
- rust-rustc_version
ExclusiveArch: %{rust_arches}
- rust-rustdoc-stripper
ExclusiveArch: %{rust_arches}
- rust-rustfilt
ExclusiveArch: %{rust_arches}
- rust-rustfix
ExclusiveArch: %{rust_arches}
- rust-rustio
ExclusiveArch: %{rust_arches}
- rust-rusttype
ExclusiveArch: %{rust_arches}
- rust-rustversion
ExclusiveArch: %{rust_arches}
- rust-rusty-fork
ExclusiveArch: %{rust_arches}
- rust-rustyline
ExclusiveArch: %{rust_arches}
- rust-rustyline-derive
ExclusiveArch: %{rust_arches}
- rust-ryu
ExclusiveArch: %{rust_arches}
- rust-safe-transmute
ExclusiveArch: %{rust_arches}
- rust-safemem
ExclusiveArch: %{rust_arches}
- rust-same-file
ExclusiveArch: %{rust_arches}
- rust-sass-rs
ExclusiveArch: %{rust_arches}
- rust-sass-sys
ExclusiveArch: %{rust_arches}
- rust-scan_fmt
ExclusiveArch: %{rust_arches}
- rust-scheduled-thread-pool
ExclusiveArch: %{rust_arches}
- rust-scoped-tls
ExclusiveArch: %{rust_arches}
- rust-scoped-tls-hkt
ExclusiveArch: %{rust_arches}
- rust-scoped_threadpool
ExclusiveArch: %{rust_arches}
- rust-scopeguard
ExclusiveArch: %{rust_arches}
- rust-scopetime
ExclusiveArch: %{rust_arches}
- rust-scratch
ExclusiveArch: %{rust_arches}
- rust-scroll
ExclusiveArch: %{rust_arches}
- rust-scroll_derive
ExclusiveArch: %{rust_arches}
- rust-sct
ExclusiveArch: %{rust_arches}
- rust-sd
ExclusiveArch: %{rust_arches}
- rust-sd-notify
ExclusiveArch: %{rust_arches}
- rust-seahash
ExclusiveArch: %{rust_arches}
- rust-seahash3
ExclusiveArch: %{rust_arches}
- rust-secrecy
ExclusiveArch: %{rust_arches}
- rust-secret-service
ExclusiveArch: %{rust_arches}
- rust-semver
ExclusiveArch: %{rust_arches}
- rust-semver-parser
ExclusiveArch: %{rust_arches}
- rust-semver-parser0.7
ExclusiveArch: %{rust_arches}
- rust-semver-parser0.9
ExclusiveArch: %{rust_arches}
- rust-semver0.10
ExclusiveArch: %{rust_arches}
- rust-semver0.9
ExclusiveArch: %{rust_arches}
- rust-sequoia-autocrypt
ExclusiveArch: %{rust_arches}
- rust-sequoia-ipc
ExclusiveArch: %{rust_arches}
- rust-sequoia-keyring-linter
ExclusiveArch: %{rust_arches}
- rust-sequoia-net
ExclusiveArch: %{rust_arches}
- rust-sequoia-octopus-librnp
ExclusiveArch: %{rust_arches}
- rust-sequoia-openpgp
ExclusiveArch: %{rust_arches}
- rust-sequoia-sop
ExclusiveArch: %{rust_arches}
- rust-sequoia-sq
ExclusiveArch: %{rust_arches}
- rust-sequoia-sqv
ExclusiveArch: %{rust_arches}
- rust-serde
ExclusiveArch: %{rust_arches}
- rust-serde-big-array
ExclusiveArch: %{rust_arches}
- rust-serde-pickle
ExclusiveArch: %{rust_arches}
- rust-serde-value
ExclusiveArch: %{rust_arches}
- rust-serde-xml-rs
ExclusiveArch: %{rust_arches}
- rust-serde_bytes
ExclusiveArch: %{rust_arches}
- rust-serde_cbor
ExclusiveArch: %{rust_arches}
- rust-serde_derive
ExclusiveArch: %{rust_arches}
- rust-serde_ignored
ExclusiveArch: %{rust_arches}
- rust-serde_json
ExclusiveArch: %{rust_arches}
- rust-serde_repr
ExclusiveArch: %{rust_arches}
- rust-serde_stacker
ExclusiveArch: %{rust_arches}
- rust-serde_test
ExclusiveArch: %{rust_arches}
- rust-serde_url_params
ExclusiveArch: %{rust_arches}
- rust-serde_urlencoded
ExclusiveArch: %{rust_arches}
- rust-serde_urlencoded0.6
ExclusiveArch: %{rust_arches}
- rust-serde_with_macros
ExclusiveArch: %{rust_arches}
- rust-serde_yaml
ExclusiveArch: %{rust_arches}
- rust-serial_test
ExclusiveArch: %{rust_arches}
- rust-serial_test_derive
ExclusiveArch: %{rust_arches}
- rust-servo-fontconfig
ExclusiveArch: %{rust_arches}
- rust-servo-fontconfig-sys
ExclusiveArch: %{rust_arches}
- rust-sev
ExclusiveArch: %{rust_arches}
- rust-sevctl
ExclusiveArch: %{rust_arches}
- rust-sha-1
ExclusiveArch: %{rust_arches}
- rust-sha1
ExclusiveArch: %{rust_arches}
- rust-sha1collisiondetection
ExclusiveArch: %{rust_arches}
- rust-sha2
ExclusiveArch: %{rust_arches}
- rust-sha3
ExclusiveArch: %{rust_arches}
- rust-shared_child
ExclusiveArch: %{rust_arches}
- rust-shared_library
ExclusiveArch: %{rust_arches}
- rust-shell-escape
ExclusiveArch: %{rust_arches}
- rust-shell-words
ExclusiveArch: %{rust_arches}
- rust-shellexpand
ExclusiveArch: %{rust_arches}
- rust-shlex
ExclusiveArch: %{rust_arches}
- rust-signal-hook
ExclusiveArch: %{rust_arches}
- rust-signal-hook-registry
ExclusiveArch: %{rust_arches}
- rust-signal-hook0.1
ExclusiveArch: %{rust_arches}
- rust-silver
ExclusiveArch: %{rust_arches}
- rust-simd_helpers
ExclusiveArch: %{rust_arches}
- rust-simple_asn1
ExclusiveArch: %{rust_arches}
- rust-simple_logger
ExclusiveArch: %{rust_arches}
- rust-simplelog
ExclusiveArch: %{rust_arches}
- rust-siphasher
ExclusiveArch: %{rust_arches}
- rust-size
ExclusiveArch: %{rust_arches}
- rust-sized-chunks
ExclusiveArch: %{rust_arches}
- rust-skeptic
ExclusiveArch: %{rust_arches}
- rust-skim
ExclusiveArch: %{rust_arches}
- rust-slab
ExclusiveArch: %{rust_arches}
- rust-slash-formatter
ExclusiveArch: %{rust_arches}
- rust-slice-deque
ExclusiveArch: %{rust_arches}
- rust-slog
ExclusiveArch: %{rust_arches}
- rust-slog-async
ExclusiveArch: %{rust_arches}
- rust-slog-scope
ExclusiveArch: %{rust_arches}
- rust-slog-term
ExclusiveArch: %{rust_arches}
- rust-slotmap
ExclusiveArch: %{rust_arches}
- rust-slug
ExclusiveArch: %{rust_arches}
- rust-sluice
ExclusiveArch: %{rust_arches}
- rust-smallvec
ExclusiveArch: %{rust_arches}
- rust-smart-default
ExclusiveArch: %{rust_arches}
- rust-smawk
ExclusiveArch: %{rust_arches}
- rust-smithay-client-toolkit
ExclusiveArch: %{rust_arches}
- rust-smithay-clipboard
ExclusiveArch: %{rust_arches}
- rust-snafu
ExclusiveArch: %{rust_arches}
- rust-snafu-derive
ExclusiveArch: %{rust_arches}
- rust-snake_case
ExclusiveArch: %{rust_arches}
- rust-snowflake
ExclusiveArch: %{rust_arches}
- rust-socket2
ExclusiveArch: %{rust_arches}
- rust-socket2_0.3
ExclusiveArch: %{rust_arches}
- rust-soup-sys
ExclusiveArch: %{rust_arches}
- rust-sourceview
ExclusiveArch: %{rust_arches}
- rust-spin
ExclusiveArch: %{rust_arches}
- rust-spin_on
ExclusiveArch: %{rust_arches}
- rust-spinning_top
ExclusiveArch: %{rust_arches}
- rust-spmc
ExclusiveArch: %{rust_arches}
- rust-ssh-key-dir
ExclusiveArch: %{rust_arches}
- rust-stable_deref_trait
ExclusiveArch: %{rust_arches}
- rust-stacker
ExclusiveArch: %{rust_arches}
- rust-standback
ExclusiveArch: %{rust_arches}
- rust-starship
ExclusiveArch: %{rust_arches}
- rust-starship_module_config_derive
ExclusiveArch: %{rust_arches}
- rust-static_assertions
ExclusiveArch: %{rust_arches}
- rust-statistical
ExclusiveArch: %{rust_arches}
- rust-stb_truetype
ExclusiveArch: %{rust_arches}
- rust-streaming-stats
ExclusiveArch: %{rust_arches}
- rust-string
ExclusiveArch: %{rust_arches}
- rust-string_cache
ExclusiveArch: %{rust_arches}
- rust-string_cache_codegen
ExclusiveArch: %{rust_arches}
- rust-string_cache_shared
ExclusiveArch: %{rust_arches}
- rust-strings
ExclusiveArch: %{rust_arches}
- rust-strip-ansi-escapes
ExclusiveArch: %{rust_arches}
- rust-strsim
ExclusiveArch: %{rust_arches}
- rust-structopt
ExclusiveArch: %{rust_arches}
- rust-structopt-derive
ExclusiveArch: %{rust_arches}
- rust-structopt-derive0.2
ExclusiveArch: %{rust_arches}
- rust-structopt0.2
ExclusiveArch: %{rust_arches}
- rust-strum
ExclusiveArch: %{rust_arches}
- rust-strum_macros
ExclusiveArch: %{rust_arches}
- rust-subtle
ExclusiveArch: %{rust_arches}
- rust-sudo_plugin
ExclusiveArch: %{rust_arches}
- rust-sudo_plugin-sys
ExclusiveArch: %{rust_arches}
- rust-sval
ExclusiveArch: %{rust_arches}
- rust-sval_derive
ExclusiveArch: %{rust_arches}
- rust-svg_metadata
ExclusiveArch: %{rust_arches}
- rust-sxd-document
ExclusiveArch: %{rust_arches}
- rust-syn
ExclusiveArch: %{rust_arches}
- rust-syn-mid
ExclusiveArch: %{rust_arches}
- rust-syn0.15
ExclusiveArch: %{rust_arches}
- rust-synom
ExclusiveArch: %{rust_arches}
- rust-synstructure
ExclusiveArch: %{rust_arches}
- rust-syntect
ExclusiveArch: %{rust_arches}
- rust-sys-info
ExclusiveArch: %{rust_arches}
- rust-sysinfo
ExclusiveArch: %{rust_arches}
- rust-system-deps
ExclusiveArch: %{rust_arches}
- rust-systemd
ExclusiveArch: %{rust_arches}
- rust-tabwriter
ExclusiveArch: %{rust_arches}
- rust-take
ExclusiveArch: %{rust_arches}
- rust-take_mut
ExclusiveArch: %{rust_arches}
- rust-tap
ExclusiveArch: %{rust_arches}
- rust-tar
ExclusiveArch: %{rust_arches}
- rust-target-lexicon
ExclusiveArch: %{rust_arches}
- rust-tealdeer
ExclusiveArch: %{rust_arches}
- rust-teloxide
ExclusiveArch: %{rust_arches}
- rust-teloxide-macros
ExclusiveArch: %{rust_arches}
- rust-tempdir
ExclusiveArch: %{rust_arches}
- rust-tempfile
ExclusiveArch: %{rust_arches}
- rust-tendril
ExclusiveArch: %{rust_arches}
- rust-tera
ExclusiveArch: %{rust_arches}
- rust-term
ExclusiveArch: %{rust_arches}
- rust-term_grid
ExclusiveArch: %{rust_arches}
- rust-term_size
ExclusiveArch: %{rust_arches}
- rust-termcolor
ExclusiveArch: %{rust_arches}
- rust-terminal_size
ExclusiveArch: %{rust_arches}
- rust-terminfo
ExclusiveArch: %{rust_arches}
- rust-termion
ExclusiveArch: %{rust_arches}
- rust-termios
ExclusiveArch: %{rust_arches}
- rust-test-assembler
ExclusiveArch: %{rust_arches}
- rust-tester
ExclusiveArch: %{rust_arches}
- rust-testing_logger
ExclusiveArch: %{rust_arches}
- rust-textwrap
ExclusiveArch: %{rust_arches}
- rust-textwrap0.11
ExclusiveArch: %{rust_arches}
- rust-textwrap0.12
ExclusiveArch: %{rust_arches}
- rust-thiserror
ExclusiveArch: %{rust_arches}
- rust-thiserror-impl
ExclusiveArch: %{rust_arches}
- rust-thread-id
ExclusiveArch: %{rust_arches}
- rust-thread-scoped
ExclusiveArch: %{rust_arches}
- rust-thread_local
ExclusiveArch: %{rust_arches}
- rust-threadpool
ExclusiveArch: %{rust_arches}
- rust-tiff
ExclusiveArch: %{rust_arches}
- rust-tiger-digest
ExclusiveArch: %{rust_arches}
- rust-time
ExclusiveArch: %{rust_arches}
- rust-time-macros
ExclusiveArch: %{rust_arches}
- rust-time-macros-impl
ExclusiveArch: %{rust_arches}
- rust-time0.1
ExclusiveArch: %{rust_arches}
- rust-timebomb
ExclusiveArch: %{rust_arches}
- rust-timer
ExclusiveArch: %{rust_arches}
- rust-timerfd
ExclusiveArch: %{rust_arches}
- rust-tiny-keccak
ExclusiveArch: %{rust_arches}
- rust-tiny_http
ExclusiveArch: %{rust_arches}
- rust-tinytemplate
ExclusiveArch: %{rust_arches}
- rust-tinyvec
ExclusiveArch: %{rust_arches}
- rust-tinyvec_macros
ExclusiveArch: %{rust_arches}
- rust-tokei
ExclusiveArch: %{rust_arches}
- rust-tokio
ExclusiveArch: %{rust_arches}
- rust-tokio-codec
ExclusiveArch: %{rust_arches}
- rust-tokio-core
ExclusiveArch: %{rust_arches}
- rust-tokio-current-thread
ExclusiveArch: %{rust_arches}
- rust-tokio-executor
ExclusiveArch: %{rust_arches}
- rust-tokio-fs
ExclusiveArch: %{rust_arches}
- rust-tokio-io
ExclusiveArch: %{rust_arches}
- rust-tokio-io-pool
ExclusiveArch: %{rust_arches}
- rust-tokio-macros
ExclusiveArch: %{rust_arches}
- rust-tokio-macros0.2
ExclusiveArch: %{rust_arches}
- rust-tokio-mock-task
ExclusiveArch: %{rust_arches}
- rust-tokio-native-tls
ExclusiveArch: %{rust_arches}
- rust-tokio-openssl
ExclusiveArch: %{rust_arches}
- rust-tokio-openssl0.4
ExclusiveArch: %{rust_arches}
- rust-tokio-reactor
ExclusiveArch: %{rust_arches}
- rust-tokio-socks
ExclusiveArch: %{rust_arches}
- rust-tokio-socks0.3
ExclusiveArch: %{rust_arches}
- rust-tokio-stream
ExclusiveArch: %{rust_arches}
- rust-tokio-sync
ExclusiveArch: %{rust_arches}
- rust-tokio-tcp
ExclusiveArch: %{rust_arches}
- rust-tokio-test
ExclusiveArch: %{rust_arches}
- rust-tokio-threadpool
ExclusiveArch: %{rust_arches}
- rust-tokio-timer
ExclusiveArch: %{rust_arches}
- rust-tokio-tls
ExclusiveArch: %{rust_arches}
- rust-tokio-tls0.2
ExclusiveArch: %{rust_arches}
- rust-tokio-tungstenite
ExclusiveArch: %{rust_arches}
- rust-tokio-udp
ExclusiveArch: %{rust_arches}
- rust-tokio-uds
ExclusiveArch: %{rust_arches}
- rust-tokio-util
ExclusiveArch: %{rust_arches}
- rust-tokio-util0.2
ExclusiveArch: %{rust_arches}
- rust-tokio-util0.3
ExclusiveArch: %{rust_arches}
- rust-tokio0.1
ExclusiveArch: %{rust_arches}
- rust-tokio0.2
ExclusiveArch: %{rust_arches}
- rust-toml
ExclusiveArch: %{rust_arches}
- rust-toml0.4
ExclusiveArch: %{rust_arches}
- rust-tower-layer
ExclusiveArch: %{rust_arches}
- rust-tower-service
ExclusiveArch: %{rust_arches}
- rust-tower-test
ExclusiveArch: %{rust_arches}
- rust-tower-util
ExclusiveArch: %{rust_arches}
- rust-tpm2-policy
ExclusiveArch: %{rust_arches}
- rust-tracing
ExclusiveArch: %{rust_arches}
- rust-tracing-attributes
ExclusiveArch: %{rust_arches}
- rust-tracing-core
ExclusiveArch: %{rust_arches}
- rust-tracing-futures
ExclusiveArch: %{rust_arches}
- rust-traitobject
ExclusiveArch: %{rust_arches}
- rust-treebitmap
ExclusiveArch: %{rust_arches}
- rust-treeline
ExclusiveArch: %{rust_arches}
- rust-trust-dns-native-tls
ExclusiveArch: %{rust_arches}
- rust-trust-dns-native-tls0.19
ExclusiveArch: %{rust_arches}
- rust-trust-dns-openssl
ExclusiveArch: %{rust_arches}
- rust-trust-dns-openssl0.19
ExclusiveArch: %{rust_arches}
- rust-trust-dns-proto
ExclusiveArch: %{rust_arches}
- rust-trust-dns-proto0.19
ExclusiveArch: %{rust_arches}
- rust-trust-dns-resolver
ExclusiveArch: %{rust_arches}
- rust-trust-dns-resolver0.19
ExclusiveArch: %{rust_arches}
- rust-try-lock
ExclusiveArch: %{rust_arches}
- rust-try_from
ExclusiveArch: %{rust_arches}
- rust-try_or
ExclusiveArch: %{rust_arches}
- rust-trybuild
ExclusiveArch: %{rust_arches}
- rust-tss-esapi
ExclusiveArch: %{rust_arches}
- rust-tss-esapi-sys
ExclusiveArch: %{rust_arches}
- rust-ttf-parser
ExclusiveArch: %{rust_arches}
- rust-tui
ExclusiveArch: %{rust_arches}
- rust-tui-react
ExclusiveArch: %{rust_arches}
- rust-tui0.11
ExclusiveArch: %{rust_arches}
- rust-tui0.9
ExclusiveArch: %{rust_arches}
- rust-tuikit
ExclusiveArch: %{rust_arches}
- rust-tungstenite
ExclusiveArch: %{rust_arches}
- rust-twoway
ExclusiveArch: %{rust_arches}
- rust-typeable
ExclusiveArch: %{rust_arches}
- rust-typed-arena
ExclusiveArch: %{rust_arches}
- rust-typemap
ExclusiveArch: %{rust_arches}
- rust-typenum
ExclusiveArch: %{rust_arches}
- rust-typetag-impl
ExclusiveArch: %{rust_arches}
- rust-ucd-parse
ExclusiveArch: %{rust_arches}
- rust-ucd-trie
ExclusiveArch: %{rust_arches}
- rust-ucd-util
ExclusiveArch: %{rust_arches}
- rust-unchecked-index
ExclusiveArch: %{rust_arches}
- rust-unescape
ExclusiveArch: %{rust_arches}
- rust-unic-char-property
ExclusiveArch: %{rust_arches}
- rust-unic-char-range
ExclusiveArch: %{rust_arches}
- rust-unic-common
ExclusiveArch: %{rust_arches}
- rust-unic-segment
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-category
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-common
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-segment
ExclusiveArch: %{rust_arches}
- rust-unic-ucd-version
ExclusiveArch: %{rust_arches}
- rust-unicase
ExclusiveArch: %{rust_arches}
- rust-unicase1
ExclusiveArch: %{rust_arches}
- rust-unicode-bidi
ExclusiveArch: %{rust_arches}
- rust-unicode-normalization
ExclusiveArch: %{rust_arches}
- rust-unicode-segmentation
ExclusiveArch: %{rust_arches}
- rust-unicode-width
ExclusiveArch: %{rust_arches}
- rust-unicode-xid
ExclusiveArch: %{rust_arches}
- rust-unicode-xid0.1
ExclusiveArch: %{rust_arches}
- rust-unicode_categories
ExclusiveArch: %{rust_arches}
- rust-unindent
ExclusiveArch: %{rust_arches}
- rust-universal-hash
ExclusiveArch: %{rust_arches}
- rust-unix_socket
ExclusiveArch: %{rust_arches}
- rust-unreachable
ExclusiveArch: %{rust_arches}
- rust-unsafe-any
ExclusiveArch: %{rust_arches}
- rust-untrusted
ExclusiveArch: %{rust_arches}
- rust-uom
ExclusiveArch: %{rust_arches}
- rust-url
ExclusiveArch: %{rust_arches}
- rust-url1
ExclusiveArch: %{rust_arches}
- rust-url_serde
ExclusiveArch: %{rust_arches}
- rust-urlencoding
ExclusiveArch: %{rust_arches}
- rust-urlocator
ExclusiveArch: %{rust_arches}
- rust-urlshortener
ExclusiveArch: %{rust_arches}
- rust-users
ExclusiveArch: %{rust_arches}
- rust-users0.10
ExclusiveArch: %{rust_arches}
- rust-utf-8
ExclusiveArch: %{rust_arches}
- rust-utf8-cstr
ExclusiveArch: %{rust_arches}
- rust-utf8-ranges
ExclusiveArch: %{rust_arches}
- rust-utf8-width
ExclusiveArch: %{rust_arches}
- rust-utf8parse
ExclusiveArch: %{rust_arches}
- rust-uuid
ExclusiveArch: %{rust_arches}
- rust-uuid0.7
ExclusiveArch: %{rust_arches}
- rust-v_escape
ExclusiveArch: %{rust_arches}
- rust-v_escape_derive
ExclusiveArch: %{rust_arches}
- rust-v_frame
ExclusiveArch: %{rust_arches}
- rust-v_htmlescape
ExclusiveArch: %{rust_arches}
- rust-varlink
ExclusiveArch: %{rust_arches}
- rust-varlink-cli
ExclusiveArch: %{rust_arches}
- rust-varlink_generator
ExclusiveArch: %{rust_arches}
- rust-varlink_parser
ExclusiveArch: %{rust_arches}
- rust-varlink_stdinterfaces
ExclusiveArch: %{rust_arches}
- rust-vec-arena
ExclusiveArch: %{rust_arches}
- rust-vec_map
ExclusiveArch: %{rust_arches}
- rust-vergen
ExclusiveArch: %{rust_arches}
- rust-version
ExclusiveArch: %{rust_arches}
- rust-version-compare
ExclusiveArch: %{rust_arches}
- rust-version-sync
ExclusiveArch: %{rust_arches}
- rust-version-sync0.8
ExclusiveArch: %{rust_arches}
- rust-version_check
ExclusiveArch: %{rust_arches}
- rust-vmm-sys-util
ExclusiveArch: x86_64 aarch64 ppc64le
- rust-vmw_backdoor
ExclusiveArch: %{rust_arches}
- rust-void
ExclusiveArch: %{rust_arches}
- rust-vte
ExclusiveArch: %{rust_arches}
- rust-vte0.3
ExclusiveArch: %{rust_arches}
- rust-vte_generate_state_changes
ExclusiveArch: %{rust_arches}
- rust-wait-timeout
ExclusiveArch: %{rust_arches}
- rust-waker-fn
ExclusiveArch: %{rust_arches}
- rust-walkdir
ExclusiveArch: %{rust_arches}
- rust-want
ExclusiveArch: %{rust_arches}
- rust-warp
ExclusiveArch: %{rust_arches}
- rust-warp0.2
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-backend
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-macro
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-macro-support
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-shared
ExclusiveArch: %{rust_arches}
- rust-wasm-bindgen-test-macro
ExclusiveArch: %{rust_arches}
- rust-wayland-client
ExclusiveArch: %{rust_arches}
- rust-wayland-commons
ExclusiveArch: %{rust_arches}
- rust-wayland-cursor
ExclusiveArch: %{rust_arches}
- rust-wayland-egl
ExclusiveArch: %{rust_arches}
- rust-wayland-protocols
ExclusiveArch: %{rust_arches}
- rust-wayland-scanner
ExclusiveArch: %{rust_arches}
- rust-wayland-server
ExclusiveArch: %{rust_arches}
- rust-wayland-sys
ExclusiveArch: %{rust_arches}
- rust-web-sys
ExclusiveArch: %{rust_arches}
- rust-webbrowser
ExclusiveArch: %{rust_arches}
- rust-webkit2gtk
ExclusiveArch: %{rust_arches}
- rust-webkit2gtk-sys
ExclusiveArch: %{rust_arches}
- rust-websocket
ExclusiveArch: %{rust_arches}
- rust-websocket-base
ExclusiveArch: %{rust_arches}
- rust-weezl
ExclusiveArch: %{rust_arches}
- rust-which
ExclusiveArch: %{rust_arches}
- rust-wild
ExclusiveArch: %{rust_arches}
- rust-wildmatch
ExclusiveArch: %{rust_arches}
- rust-winit
ExclusiveArch: %{rust_arches}
- rust-ws
ExclusiveArch: %{rust_arches}
- rust-wyz
ExclusiveArch: %{rust_arches}
- rust-x11
ExclusiveArch: %{rust_arches}
- rust-x11-clipboard
ExclusiveArch: %{rust_arches}
- rust-x11-dl
ExclusiveArch: %{rust_arches}
- rust-xattr
ExclusiveArch: %{rust_arches}
- rust-xcb
ExclusiveArch: %{rust_arches}
- rust-xcursor
ExclusiveArch: %{rust_arches}
- rust-xdg
ExclusiveArch: %{rust_arches}
- rust-xkbcommon
ExclusiveArch: %{rust_arches}
- rust-xml-rs
ExclusiveArch: %{rust_arches}
- rust-xml5ever
ExclusiveArch: %{rust_arches}
- rust-xmlparser
ExclusiveArch: %{rust_arches}
- rust-xz2
ExclusiveArch: %{rust_arches}
- rust-y4m
ExclusiveArch: %{rust_arches}
- rust-yaml-rust
ExclusiveArch: %{rust_arches}
- rust-yaml-rust0.3
ExclusiveArch: %{rust_arches}
- rust-ybaas
ExclusiveArch: %{rust_arches}
- rust-ytop
ExclusiveArch: %{rust_arches}
- rust-yubibomb
ExclusiveArch: %{rust_arches}
- rust-yup-oauth2
ExclusiveArch: %{rust_arches}
- rust-zbase32
ExclusiveArch: %{rust_arches}
- rust-zbus
ExclusiveArch: %{rust_arches}
- rust-zbus_macros
ExclusiveArch: %{rust_arches}
- rust-zeroize
ExclusiveArch: %{rust_arches}
- rust-zeroize_derive
ExclusiveArch: %{rust_arches}
- rust-zincati
ExclusiveArch: %{rust_arches}
- rust-zip
ExclusiveArch: %{rust_arches}
- rust-zoneinfo_compiled
ExclusiveArch: %{rust_arches}
- rust-zoxide
ExclusiveArch: %{rust_arches}
- rust-zram-generator
ExclusiveArch: %{rust_arches}
- rust-zstd
ExclusiveArch: %{rust_arches}
- rust-zstd-safe
ExclusiveArch: %{rust_arches}
- rust-zstd-sys
ExclusiveArch: %{rust_arches}
- rust-zvariant
ExclusiveArch: %{rust_arches}
- rust-zvariant_derive
ExclusiveArch: %{rust_arches}
- s390utils
ExclusiveArch: s390 s390x
- safetyblanket
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- sagemath
ExclusiveArch: aarch64 %{ix86} x86_64 ppc sparcv9
- sbcl
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- sbd
ExclusiveArch: i686 x86_64 s390x aarch64 ppc64le
- sbsigntools
ExclusiveArch: x86_64 aarch64 %{arm} %{ix86}
- seabios
ExclusiveArch: x86_64
- seadrive-gui
ExclusiveArch: %{qt5_qtwebengine_arches}
- seafile-client
ExclusiveArch: %{qt5_qtwebengine_arches}
- seamonkey
ExclusiveArch: x86_64
- seqan3
ExclusiveArch: %{power64} x86_64 aarch64
- servicelog
ExclusiveArch: ppc %{power64}
- sgabios
ExclusiveArch: %{ix86} x86_64
- sharpfont
ExclusiveArch: %mono_arches
- sharpziplib
ExclusiveArch: %{mono_arches}
- shim
ExclusiveArch: %{efi}
- shim-unsigned-aarch64
ExclusiveArch: aarch64
- shim-unsigned-x64
ExclusiveArch: x86_64
- sigul
ExclusiveArch: x86_64
- skychart
ExclusiveArch: %{fpc_arches}
- snapd
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- soup-sharp
ExclusiveArch: %{mono_arches}
- sparkleshare
ExclusiveArch: %{mono_arches}
- spicctrl
ExclusiveArch: %{ix86} x86_64
- spice
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- springlobby
ExclusiveArch: %{ix86} x86_64
- squeekboard
ExclusiveArch: %{rust_arches}
- startdde
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- statsd
ExclusiveArch: %{nodejs_arches} noarch
- stratis-cli
ExclusiveArch: %{rust_arches} noarch
- stratisd
ExclusiveArch: %{rust_arches}
- stripesnoop
ExclusiveArch: %{ix86} x86_64
- supercollider
ExclusiveArch: %{qt5_qtwebengine_arches}
- supermin
ExclusiveArch: %{kernel_arches}
- svt-av1
ExclusiveArch: x86_64
- svt-vp9
ExclusiveArch: x86_64
- swift-lang
ExclusiveArch: x86_64 aarch64
- sysbench
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64le s390x
- syslinux
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- taglib-sharp
ExclusiveArch: %{mono_arches}
- tarantool
ExclusiveArch: %{ix86} x86_64
- tboot
ExclusiveArch: %{ix86} x86_64
- tdlib
ExclusiveArch: x86_64
- templates_parser
ExclusiveArch: %GPRbuild_arches
- ternimal
ExclusiveArch: %{rust_arches}
- testcloud
ExclusiveArch: %{kernel_arches} noarch
- themonospot-base
ExclusiveArch: %mono_arches
- themonospot-console
ExclusiveArch: %mono_arches
- themonospot-gui-gtk
ExclusiveArch: %mono_arches
- themonospot-plugin-avi
ExclusiveArch: %mono_arches
- themonospot-plugin-mkv
ExclusiveArch: %mono_arches
- thermald
ExclusiveArch: %{ix86} x86_64
- tilix
ExclusiveArch: %{ldc_arches}
- tmux-top
ExclusiveArch: %{go_arches}
- tomboy
ExclusiveArch: %{mono_arches}
- topojson-client
ExclusiveArch: %{nodejs_arches} noarch
- topojson-server
ExclusiveArch: %{nodejs_arches} noarch
- topojson-simplify
ExclusiveArch: %{nodejs_arches} noarch
- torbrowser-launcher
ExclusiveArch: %{ix86} x86_64
- tuned-profiles-nfv-host-bin
ExclusiveArch: %{ix86} x86_64
- uClibc
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
- ucx
ExclusiveArch: aarch64 ppc64le x86_64
- ugene
ExclusiveArch: %{ix86} x86_64
- uglify-js
ExclusiveArch: %{nodejs_arches} noarch
- uglify-js1
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- unetbootin
ExclusiveArch: %{ix86} x86_64
- ursa-major
ExclusiveArch: noarch aarch64 ppc64le s390x x86_64
- v8-314
ExclusiveArch: %{ix86} x86_64 %{arm} mips mipsel ppc ppc64
- valgrind
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x armv7hl aarch64
- vboot-utils
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- vim-go
ExclusiveArch: %{?golang_arches}%{!?golang_arches:%{ix86} x86_64 %{arm}}
- virt-p2v
ExclusiveArch: x86_64
- virt-v2v
ExclusiveArch: x86_64
- virtualbox-guest-additions
ExclusiveArch: i686 x86_64
- vkd3d
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- vmaf
ExclusiveArch: x86_64
- vmem
ExclusiveArch: x86_64
- vmemcache
ExclusiveArch: x86_64 ppc64 ppc64le s390x aarch64
- vrq
ExclusiveArch: %{ix86} x86_64
- warsow
ExclusiveArch: %{ix86} x86_64 %{arm}
- warsow-data
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{ix86} x86_64 %{arm}
- webkit2-sharp
ExclusiveArch: %mono_arches
- wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
ExclusiveArch: %{ix86} %{arm}
- wine-dxvk
ExclusiveArch: %{ix86} x86_64
- winetricks
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- wxMaxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
- x2goclient
ExclusiveArch: x86_64
- xe-guest-utilities-latest
ExclusiveArch: %{ix86} x86_64
- xen
ExclusiveArch: %{ix86} x86_64 armv7hl aarch64
- xmlada
ExclusiveArch: %{GPRbuild_arches}
- xorg-x11-drv-armsoc
ExclusiveArch: %{arm} aarch64
- xorg-x11-drv-intel
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-openchrome
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vesa
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vmware
ExclusiveArch: %{ix86} x86_64 ia64
- xsp
ExclusiveArch: %mono_arches
- yarnpkg
ExclusiveArch: %{nodejs_arches} noarch
- zeromq-ada
ExclusiveArch: %{GPRbuild_arches}
- zlib-ada
ExclusiveArch: %{GPRbuild_arches}
- zlib-ng
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
- zola
ExclusiveArch: %{rust_arches}
2 years, 11 months
Architecture specific change in rpms/rust-libsystemd-sys.git
by githook-noreply@fedoraproject.org
The package rpms/rust-libsystemd-sys.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rust-libsystemd-sys.git/commit/?i...
https://src.fedoraproject.org/cgit/rpms/rust-libsystemd-sys.git/commit/?i....
Change:
+ExcludeArch: s390x
+ExclusiveArch: %{rust_arches}
Thanks.
Full change:
============
commit 9fadf1d796612bd2239c624815dca6a877eee844
Author: Rémi Lauzier <remilauzier(a)protonmail.com>
Date: Tue Apr 27 22:02:40 2021 -0400
Remove s390x for now (rhbz1954360)
diff --git a/rust-libsystemd-sys.spec b/rust-libsystemd-sys.spec
index ecba98a..0439d0e 100644
--- a/rust-libsystemd-sys.spec
+++ b/rust-libsystemd-sys.spec
@@ -6,7 +6,7 @@
Name: rust-%{crate}
Version: 0.8.0
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: FFI bindings to libsystemd and libelogind
# Upstream license specification: LGPL-2.1-or-later WITH GCC-exception-2.0
@@ -22,6 +22,11 @@ ExclusiveArch: %{rust_arches}
BuildArch: noarch
%endif
+# Test bus::vtable::vtable_bitfield failed (rhbz1954360)
+# https://bugzilla.redhat.com/show_bug.cgi?id=1954360
+# https://github.com/jmesmon/rust-systemd/issues/191
+ExcludeArch: s390x
+
BuildRequires: rust-packaging
%global _description %{expand:
@@ -102,5 +107,7 @@ echo "systemd-devel"
%endif
%changelog
+* Tue Apr 27 21:49:40 EDT 2021 Rémi Lauzier <remilauzier(a)protonmail.com> - 0.8.0-2
+- Remove support for architecture s390x (rhbz1954360)
* Mon Mar 29 17:14:38 EDT 2021 Rémi Lauzier <remilauzier(a)protonmail.com> - 0.8.0-1
- Initial package
commit cf1358fc7a458abd3b8b6fd39464bd375c84f82c
Author: Rémi Lauzier <remilauzier(a)protonmail.com>
Date: Tue Apr 27 19:18:41 2021 -0400
Initial import (rhbz1944408)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..85b2573
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/libsystemd-sys-0.8.0.crate
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..a2febd4
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,458 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/README.md b/README.md
index ec57025..f9912e3 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,107 @@
-# rust-libsystemd-sys
+rust-systemd
+============
-The rust-libsystemd-sys package
+[crate docs (systemd)](http://docs.rs/crate/systemd)
+[crate docs (libsystemd-sys)](http://docs.rs/crate/libsystemd-sys)
+[![Crates.io](https://img.shields.io/crates/v/systemd.svg?maxAge=2592000)](https://crates.io/crates/systemd)
+[![Build Status](https://travis-ci.org/jmesmon/rust-systemd.svg?branch=master)](ht...
+
+
+In `Cargo.toml`:
+```toml
+[dependencies]
+systemd = "0.8"
+```
+
+Build Environment variables
+---------------------------
+
+By default, `libsystemd-sys` will use `pkg-config` to find `libsystemd`. It
+defaults to using the `libsystemd` package. To change the package looked up in
+pkg-config, set the `SYSTEMD_PKG_NAME` environment variable.
+
+If you want to override the source of the `libsystemd` directly, set the env
+var `SYSTEMD_LIB_DIR` to a path which contains the `libsystemd` to link
+against. Optionally, you may also set `SYSTEMD_LIBS` to indicate which
+libraries to link against. Libraries in the variable `SYSTEMD_LIBS` are colon
+(`:`) seperated and may include a `KIND`. For example:
+`SYSTEMD_LIBS="static=foo:bar"`.
+
+
+elogind support
+---------------
+
+Either set `SYSTEMD_PKG_NAME=libelogind` (name of the pkg-config file) or set
+both `SYSTEMD_LIBS=elogind` and set `SYSTEMD_LIB_DIR` to the appropriate
+directory.
+
+When using elogind, the apis needed for `journal` and `bus` features may not be completely
+avaliable (elogind forked from an older version of systemd that may lack some
+of these APIs). If your application does not need these features, depend on
+`systemd` without the default features to allow maximum compatibility:
+
+```toml
+[dependencies]
+systemd = { version = "0.8", default-features = false }
+```
+
+Note that there still may be some missing symbols. If you discover a link
+error, report it so that we can tweak the `systemd` crate to support it.
+
+journal
+-------
+Journal sending is supported, and systemd::journal::Journal is a (low
+functionality) wrapper around the read API.
+
+An example of the journal writing api:
+
+```rust
+use log::warn;
+use systemd::{journal, sd_journal_log};
+
+fn main() {
+ use systemd::journal;
+ journal::print(1, &format!("Rust can talk to the journal: {:?}",
+ 4));
+ journal::send(["CODE_FILE=HI", "CODE_LINE=1213", "CODE_FUNCTION=LIES"]);
+ journal::JournalLog::init().unwrap();
+ warn!("HI");
+ sd_journal_log!(4, "HI {:?}", 2);
+}
+```
+
+daemon
+------
+The daemon API mostly offers tools for working with raw filehandles passed to
+the process by systemd on socket activation. Since raw filehandles are not well
+supported in Rust, it's likely these functions will mostly be helpful in
+managing program flow; actual socket code will have to use the libc crate.
+
+
+License
+-------
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+In addition to the permissions in the GNU Lesser General Public License, the
+authors give you unlimited permission to link the compiled version of this
+library into combinations with other programs, and to distribute those programs
+without any restriction coming from the use of this library. (The Lesser
+General Public License restrictions do apply in other respects; for example,
+they cover modification of the library, and distribution when not linked into
+another program.)
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+Contributions
+-------------
+
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in the work by you shall be licensed as above, without any
+additional terms or conditions.
diff --git a/rust-libsystemd-sys.spec b/rust-libsystemd-sys.spec
new file mode 100644
index 0000000..ecba98a
--- /dev/null
+++ b/rust-libsystemd-sys.spec
@@ -0,0 +1,106 @@
+# Generated by rust2rpm 17
+%bcond_without check
+%global debug_package %{nil}
+
+%global crate libsystemd-sys
+
+Name: rust-%{crate}
+Version: 0.8.0
+Release: 1%{?dist}
+Summary: FFI bindings to libsystemd and libelogind
+
+# Upstream license specification: LGPL-2.1-or-later WITH GCC-exception-2.0
+# https://github.com/jmesmon/rust-systemd/issues/185
+License: LGPLv2+ with exceptions
+URL: https://crates.io/crates/libsystemd-sys
+Source: %{crates_source}
+Source1: https://raw.githubusercontent.com/jmesmon/rust-systemd/master/README.md
+Source2: https://raw.githubusercontent.com/jmesmon/rust-systemd/master/COPYING
+
+ExclusiveArch: %{rust_arches}
+%if %{__cargo_skip_build}
+BuildArch: noarch
+%endif
+
+BuildRequires: rust-packaging
+
+%global _description %{expand:
+FFI bindings to libsystemd and libelogind.}
+
+%description %{_description}
+
+%package devel
+Summary: %{summary}
+BuildArch: noarch
+Requires: systemd-devel
+
+%description devel %{_description}
+
+This package contains library source intended for building other packages
+which use "%{crate}" crate.
+
+%files devel
+%doc README.md
+%license COPYING
+%{cargo_registry}/%{crate}-%{version_no_tilde}/
+
+%package -n %{name}+default-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+default-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "default" feature of "%{crate}" crate.
+
+%files -n %{name}+default-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%package -n %{name}+bus-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+bus-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "bus" feature of "%{crate}" crate.
+
+%files -n %{name}+bus-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%package -n %{name}+journal-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+journal-devel %{_description}
+
+This package contains library source intended for building other packages
+which use "journal" feature of "%{crate}" crate.
+
+%files -n %{name}+journal-devel
+%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml
+
+%prep
+%autosetup -n %{crate}-%{version_no_tilde} -p1
+%cargo_prep
+cp %{SOURCE1} README.md
+cp %{SOURCE2} COPYING
+
+%generate_buildrequires
+%cargo_generate_buildrequires
+echo "systemd-devel"
+
+%build
+%cargo_build
+
+%install
+%cargo_install
+
+%if %{with check}
+%check
+%cargo_test
+%endif
+
+%changelog
+* Mon Mar 29 17:14:38 EDT 2021 Rémi Lauzier <remilauzier(a)protonmail.com> - 0.8.0-1
+- Initial package
diff --git a/sources b/sources
new file mode 100644
index 0000000..9a9a65d
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (libsystemd-sys-0.8.0.crate) = ad8a05836fe2936a5ba9ccd1b7b4225713c6c90feeab81d22de8ab38ad4e89cdc05d4e806151ed5aa6924b1af8108c76052c8c4300f6d6792fc075fef3e41595
2 years, 11 months
Architecture specific change in rpms/avr-binutils.git
by githook-noreply@fedoraproject.org
The package rpms/avr-binutils.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/avr-binutils.git/commit/?id=87042....
Change:
+%ifnarch s390x
Thanks.
Full change:
============
commit 87042fb64ea40a597b8f366233a8369a62e03d4e
Author: Michal Hlavinka <mhlavink(a)redhat.com>
Date: Tue May 4 23:31:38 2021 +0200
updated to 2.36.1
diff --git a/.gitignore b/.gitignore
index 0a5783f..8c8d123 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,5 @@ binutils-2.20.tar.bz2
/binutils-2.30.tar.xz
/binutils-2.32.tar.xz
/binutils-2.35.tar.xz
+/binutils-2.36.tar.xz
+/binutils-2.36.1.tar.xz
diff --git a/avr-binutils.spec b/avr-binutils.spec
index 404106e..1ddb548 100644
--- a/avr-binutils.spec
+++ b/avr-binutils.spec
@@ -1,8 +1,8 @@
%define target avr
Name: %{target}-binutils
-Version: 2.35
-Release: 3%{?dist}
+Version: 2.36.1
+Release: 1%{?dist}
Epoch: 1
Summary: Cross Compiling GNU binutils targeted at %{target}
License: GPLv2+
@@ -15,7 +15,8 @@ Patch2: avr-binutils-config.patch
BuildRequires: gawk texinfo gcc
#for autoreconf:
-BuildRequires: gettext-devel autoconf automake
+BuildRequires: gettext-devel automake
+BuildRequires: autoconf = 2.69
BuildRequires: make
Provides: bundled(libiberty)
@@ -57,7 +58,10 @@ popd
%check
cd build
+%ifnarch s390x
make check
+%endif
+echo "completed"
%install
rm -rf $RPM_BUILD_ROOT
@@ -68,9 +72,7 @@ popd
rm -f $RPM_BUILD_ROOT%{_mandir}/man1/%{target}-{dlltool,windres}.1
# we don't want these as we are a cross version
rm -r $RPM_BUILD_ROOT%{_infodir}
-rm $RPM_BUILD_ROOT%{_libdir}/libiberty.a ||:
-
-
+rm $RPM_BUILD_ROOT%{_libdir}/lib*.a $RPM_BUILD_ROOT%{_libdir}/bfd-plugins/libdep* ||:
%files
%license binutils-%{version}/COPYING binutils-%{version}/COPYING.LIB
@@ -81,6 +83,18 @@ rm $RPM_BUILD_ROOT%{_libdir}/libiberty.a ||:
%changelog
+* Tue May 04 2021 Michal Hlavinka <mhlavink(a)redhat.com> - 1:2.36.1-1
+- updated to 2.36.1
+
+* Tue May 04 2021 Michal Hlavinka <mhlavink(a)redhat.com> - 1:2.36-1
+- updated to 2.36
+
+* Tue May 04 2021 Michal Hlavinka <mhlavink(a)redhat.com> - 1:2.35-5
+- bump release for rebuild
+
+* Sun Apr 11 2021 Michal Hlavinka <mhlavink(a)redhat.com> - 1:2.35-4
+- add explicit requirement for autoconf 2.69
+
* Tue Feb 02 2021 Michal Hlavinka <mhlavink(a)redhat.com> - 1:2.35-3
- fix --format=avr option (#1907907)
@@ -88,7 +102,7 @@ rm $RPM_BUILD_ROOT%{_libdir}/libiberty.a ||:
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Mon Nov 09 2020 Michal Hlavinka <mhlavink(a)redhat.com> - 1:2.35-1
-- updated to 2.3
+- updated to 2.35
* Mon Jul 27 2020 Fedora Release Engineering <releng(a)fedoraproject.org> - 1:2.32-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
diff --git a/sources b/sources
index e0a77b1..959daa6 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (binutils-2.35.tar.xz) = 9f222e4ab6720036402d03904fb11b73ab87714b85cd84997f7d357f405c7e10581d70202f9165a1ee0c70538632db27ecc9dfe627dddb1e6bc7edb1537cf786
+SHA512 (binutils-2.36.1.tar.xz) = cc24590bcead10b90763386b6f96bb027d7594c659c2d95174a6352e8b98465a50ec3e4088d0da038428abe059bbc4ae5f37b269f31a40fc048072c8a234f4e9
2 years, 11 months