From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Ming-Hung Tsai <mtsai@redhat.com>,
Mikulas Patocka <mpatocka@redhat.com>,
Sasha Levin <sashal@kernel.org>,
agk@redhat.com, snitzer@kernel.org, dm-devel@lists.linux.dev
Subject: [PATCH AUTOSEL 5.10 044/114] dm cache: prevent BUG_ON by blocking retries on failed device resumes
Date: Mon, 5 May 2025 19:17:07 -0400 [thread overview]
Message-ID: <20250505231817.2697367-44-sashal@kernel.org> (raw)
In-Reply-To: <20250505231817.2697367-1-sashal@kernel.org>
From: Ming-Hung Tsai <mtsai@redhat.com>
[ Upstream commit 5da692e2262b8f81993baa9592f57d12c2703dea ]
A cache device failing to resume due to mapping errors should not be
retried, as the failure leaves a partially initialized policy object.
Repeating the resume operation risks triggering BUG_ON when reloading
cache mappings into the incomplete policy object.
Reproduce steps:
1. create a cache metadata consisting of 512 or more cache blocks,
with some mappings stored in the first array block of the mapping
array. Here we use cache_restore v1.0 to build the metadata.
cat <<EOF >> cmeta.xml
<superblock uuid="" block_size="128" nr_cache_blocks="512" \
policy="smq" hint_width="4">
<mappings>
<mapping cache_block="0" origin_block="0" dirty="false"/>
</mappings>
</superblock>
EOF
dmsetup create cmeta --table "0 8192 linear /dev/sdc 0"
cache_restore -i cmeta.xml -o /dev/mapper/cmeta --metadata-version=2
dmsetup remove cmeta
2. wipe the second array block of the mapping array to simulate
data degradations.
mapping_root=$(dd if=/dev/sdc bs=1c count=8 skip=192 \
2>/dev/null | hexdump -e '1/8 "%u\n"')
ablock=$(dd if=/dev/sdc bs=1c count=8 skip=$((4096*mapping_root+2056)) \
2>/dev/null | hexdump -e '1/8 "%u\n"')
dd if=/dev/zero of=/dev/sdc bs=4k count=1 seek=$ablock
3. try bringing up the cache device. The resume is expected to fail
due to the broken array block.
dmsetup create cmeta --table "0 8192 linear /dev/sdc 0"
dmsetup create cdata --table "0 65536 linear /dev/sdc 8192"
dmsetup create corig --table "0 524288 linear /dev/sdc 262144"
dmsetup create cache --notable
dmsetup load cache --table "0 524288 cache /dev/mapper/cmeta \
/dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 writethrough smq 0"
dmsetup resume cache
4. try resuming the cache again. An unexpected BUG_ON is triggered
while loading cache mappings.
dmsetup resume cache
Kernel logs:
(snip)
------------[ cut here ]------------
kernel BUG at drivers/md/dm-cache-policy-smq.c:752!
Oops: invalid opcode: 0000 [#1] PREEMPT SMP KASAN NOPTI
CPU: 0 UID: 0 PID: 332 Comm: dmsetup Not tainted 6.13.4 #3
RIP: 0010:smq_load_mapping+0x3e5/0x570
Fix by disallowing resume operations for devices that failed the
initial attempt.
Signed-off-by: Ming-Hung Tsai <mtsai@redhat.com>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/md/dm-cache-target.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
index 8a03357f8c936..fc6ad47c08b58 100644
--- a/drivers/md/dm-cache-target.c
+++ b/drivers/md/dm-cache-target.c
@@ -2958,6 +2958,27 @@ static dm_cblock_t get_cache_dev_size(struct cache *cache)
return to_cblock(size);
}
+static bool can_resume(struct cache *cache)
+{
+ /*
+ * Disallow retrying the resume operation for devices that failed the
+ * first resume attempt, as the failure leaves the policy object partially
+ * initialized. Retrying could trigger BUG_ON when loading cache mappings
+ * into the incomplete policy object.
+ */
+ if (cache->sized && !cache->loaded_mappings) {
+ if (get_cache_mode(cache) != CM_WRITE)
+ DMERR("%s: unable to resume a failed-loaded cache, please check metadata.",
+ cache_device_name(cache));
+ else
+ DMERR("%s: unable to resume cache due to missing proper cache table reload",
+ cache_device_name(cache));
+ return false;
+ }
+
+ return true;
+}
+
static bool can_resize(struct cache *cache, dm_cblock_t new_size)
{
if (from_cblock(new_size) > from_cblock(cache->cache_size)) {
@@ -3006,6 +3027,9 @@ static int cache_preresume(struct dm_target *ti)
struct cache *cache = ti->private;
dm_cblock_t csize = get_cache_dev_size(cache);
+ if (!can_resume(cache))
+ return -EINVAL;
+
/*
* Check to see if the cache has resized.
*/
--
2.39.5
next prev parent reply other threads:[~2025-05-05 23:19 UTC|newest]
Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-05 23:16 [PATCH AUTOSEL 5.10 001/114] kconfig: merge_config: use an empty file as initfile Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 002/114] NFSv4: Check for delegation validity in nfs_start_delegation_return_locked() Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 003/114] mailbox: use error ret code of of_parse_phandle_with_args() Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 004/114] fbdev: fsl-diu-fb: add missing device_remove_file() Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 005/114] fbcon: Use correct erase colour for clearing in fbcon Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 006/114] fbdev: core: tileblit: Implement missing margin clearing for tileblit Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 007/114] NFSv4: Treat ENETUNREACH errors as fatal for state recovery Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 008/114] SUNRPC: rpc_clnt_set_transport() must not change the autobind setting Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 009/114] SUNRPC: rpcbind should never reset the port to the value '0' Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 010/114] thermal/drivers/qoriq: Power down TMU on system suspend Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 011/114] exit: fix the usage of delay_group_leader->exit_code in do_notify_parent() and pidfs_exit() Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 012/114] dql: Fix dql->limit value when reset Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 013/114] tools/build: Don't pass test log files to linker Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 014/114] pNFS/flexfiles: Report ENETDOWN as a connection error Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 015/114] libnvdimm/labels: Fix divide error in nd_label_data_init() Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 016/114] mmc: host: Wait for Vdd to settle on card power off Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 017/114] i2c: qup: Vote for interconnect bandwidth to DRAM Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 018/114] i2c: pxa: fix call balance of i2c->clk handling routines Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 019/114] btrfs: avoid linker error in btrfs_find_create_tree_block() Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 020/114] btrfs: send: return -ENAMETOOLONG when attempting a path that is too long Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 021/114] clocksource/drivers/timer-riscv: Stop stimecmp when cpu hotplug Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 022/114] um: Store full CSGSFS and SS register from mcontext Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 023/114] um: Update min_low_pfn to match changes in uml_reserved Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 024/114] ext4: reorder capability check last Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 025/114] scsi: st: Tighten the page format heuristics with MODE SELECT Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 026/114] scsi: st: ERASE does not change tape location Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 027/114] tcp: reorganize tcp_in_ack_event() and tcp_count_delivered() Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 028/114] rtc: rv3032: fix EERD location Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 029/114] kbuild: fix argument parsing in scripts/config Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 030/114] dm: restrict dm device size to 2^63-512 bytes Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 031/114] xen: Add support for XenServer 6.1 platform device Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 032/114] posix-timers: Add cond_resched() to posix_timer_add() search loop Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 033/114] netfilter: conntrack: Bound nf_conntrack sysctl writes Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 034/114] arm64/mm: Check PUD_TYPE_TABLE in pud_bad() Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 035/114] mmc: sdhci: Disable SD card clock before changing parameters Sasha Levin
2025-05-05 23:16 ` [PATCH AUTOSEL 5.10 036/114] ipv6: save dontfrag in cork Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 037/114] arm64: tegra: p2597: Fix gpio for vdd-1v8-dis regulator Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 038/114] powerpc/prom_init: Fixup missing #size-cells on PowerBook6,7 Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 039/114] tcp: bring back NUMA dispersion in inet_ehash_locks_alloc() Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 040/114] rtc: ds1307: stop disabling alarms on probe Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 041/114] ieee802154: ca8210: Use proper setters and getters for bitwise types Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 042/114] ARM: tegra: Switch DSI-B clock parent to PLLD on Tegra114 Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 043/114] media: c8sectpfe: Call of_node_put(i2c_bus) only once in c8sectpfe_probe() Sasha Levin
2025-05-05 23:17 ` Sasha Levin [this message]
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 045/114] orangefs: Do not truncate file size Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 046/114] drm/amdgpu: Do not program AGP BAR regs under SRIOV in gfxhub_v1_0.c Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 047/114] media: cx231xx: set device_caps for 417 Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 048/114] pinctrl: bcm281xx: Use "unsigned int" instead of bare "unsigned" Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 049/114] net: ethernet: ti: cpsw_new: populate netdev of_node Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 050/114] net: pktgen: fix mpls maximum labels list parsing Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 051/114] ipv4: fib: Move fib_valid_key_len() to rtm_to_fib_config() Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 052/114] clk: imx8mp: inform CCF of maximum frequency of clocks Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 053/114] x86/bugs: Make spectre user default depend on MITIGATION_SPECTRE_V2 Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 054/114] hwmon: (gpio-fan) Add missing mutex locks Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 055/114] drm/mediatek: mtk_dpi: Add checks for reg_h_fre_con existence Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 056/114] fpga: altera-cvp: Increase credit timeout Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 057/114] PCI: brcmstb: Expand inbound window size up to 64GB Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 058/114] PCI: brcmstb: Add a softdep to MIP MSI-X driver Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 059/114] net/mlx5: Avoid report two health errors on same syndrome Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 060/114] drm/amdkfd: KFD release_work possible circular locking Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 061/114] net: xgene-v2: remove incorrect ACPI_PTR annotation Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 062/114] bonding: report duplicate MAC address in all situations Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 063/114] soc: ti: k3-socinfo: Do not use syscon helper to build regmap Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 064/114] drm/amd/display: fix dcn4x init failed Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 065/114] x86/nmi: Add an emergency handler in nmi_desc & use it in nmi_shootdown_cpus() Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 066/114] cpuidle: menu: Avoid discarding useful information Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 067/114] libbpf: Fix out-of-bound read Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 068/114] MIPS: Use arch specific syscall name match function Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 069/114] MIPS: pm-cps: Use per-CPU variables as per-CPU, not per-core Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 070/114] clocksource: mips-gic-timer: Enable counter when CPUs start Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 071/114] scsi: mpt3sas: Send a diag reset if target reset fails Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 072/114] wifi: rtw88: Fix rtw_init_vht_cap() for RTL8814AU Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 073/114] wifi: rtw88: Fix rtw_init_ht_cap() " Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 074/114] wifi: rtw88: Fix rtw_desc_to_mcsrate() to handle MCS16-31 Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 075/114] net: pktgen: fix access outside of user given buffer in pktgen_thread_write() Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 076/114] EDAC/ie31200: work around false positive build warning Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 077/114] bpf: Prevent unsafe access to the sock fields in the BPF timestamping callback Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 078/114] can: c_can: Use of_property_present() to test existence of DT property Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 079/114] eth: mlx4: don't try to complete XDP frames in netpoll Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 080/114] PCI: Fix old_size lower bound in calculate_iosize() too Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 081/114] ACPI: HED: Always initialize before evged Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 082/114] net/mlx5: Modify LSB bitmask in temperature event to include only the first bit Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 083/114] net/mlx5: Apply rate-limiting to high temperature warning Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 084/114] ASoC: ops: Enforce platform maximum on initial value Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 085/114] ASoC: tas2764: Power up/down amp on mute ops Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 086/114] ASoC: soc-dai: check return value at snd_soc_dai_set_tdm_slot() Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 087/114] pinctrl: devicetree: do not goto err when probing hogs in pinctrl_dt_to_map Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 088/114] smack: recognize ipv4 CIPSO w/o categories Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 089/114] media: v4l: Memset argument to 0 before calling get_mbus_config pad op Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 090/114] net/mlx4_core: Avoid impossible mlx4_db_alloc() order value Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 091/114] phy: core: don't require set_mode() callback for phy_get_mode() to work Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 092/114] drm/amd/display: Initial psr_version with correct setting Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 093/114] net/mlx5: Extend Ethtool loopback selftest to support non-linear SKB Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 094/114] net/mlx5e: set the tx_queue_len for pfifo_fast Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 095/114] net/mlx5e: reduce rep rxq depth to 256 for ECPF Sasha Levin
2025-05-05 23:17 ` [PATCH AUTOSEL 5.10 096/114] ip: fib_rules: Fetch net from fib_rule in fib[46]_rule_configure() Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 097/114] wifi: rtw88: Fix download_firmware_validate() for RTL8814AU Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 098/114] exit: change the release_task() paths to call flush_sigqueue() lockless Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 099/114] hwmon: (xgene-hwmon) use appropriate type for the latency value Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 100/114] vxlan: Annotate FDB data races Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 101/114] net-sysfs: prevent uncleared queues from being re-added Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 102/114] rcu: handle quiescent states for PREEMPT_RCU=n, PREEMPT_COUNT=y Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 103/114] rcu: fix header guard for rcu_all_qs() Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 104/114] scsi: lpfc: Handle duplicate D_IDs in ndlp search-by D_ID routine Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 105/114] scsi: st: Restore some drive settings after reset Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 106/114] HID: usbkbd: Fix the bit shift number for LED_KANA Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 107/114] drm/ast: Find VBIOS mode from regular display size Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 108/114] bpftool: Fix readlink usage in get_fd_type Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 109/114] perf/amd/ibs: Fix perf_ibs_op.cnt_mask for CurCnt Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 110/114] wifi: rtw88: Don't use static local variable in rtw8822b_set_tx_power_index_by_rate Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 111/114] spi: zynqmp-gqspi: Always acknowledge interrupts Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 112/114] regulator: ad5398: Add device tree support Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 113/114] drm/atomic: clarify the rules around drm_atomic_state->allow_modeset Sasha Levin
2025-05-05 23:18 ` [PATCH AUTOSEL 5.10 114/114] drm: Add valid clones check Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250505231817.2697367-44-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=agk@redhat.com \
--cc=dm-devel@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=mpatocka@redhat.com \
--cc=mtsai@redhat.com \
--cc=snitzer@kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox