* [PATCH AUTOSEL 5.10 06/16] nvmet-tcp: fix nvme tcp ida memory leak
[not found] <20240207212700.4287-1-sashal@kernel.org>
@ 2024-02-07 21:26 ` Sasha Levin
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 10/16] nvme-fc: do not wait in vain when unloading module Sasha Levin
` (4 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Sasha Levin @ 2024-02-07 21:26 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Guixin Liu, Christoph Hellwig, Chaitanya Kulkarni, Keith Busch,
Sasha Levin, sagi, linux-nvme
From: Guixin Liu <kanie@linux.alibaba.com>
[ Upstream commit 47c5dd66c1840524572dcdd956f4af2bdb6fbdff ]
The nvmet_tcp_queue_ida should be destroy when the nvmet-tcp module
exit.
Signed-off-by: Guixin Liu <kanie@linux.alibaba.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/nvme/target/tcp.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c
index 116ae6fd35e2..d70a2fa4ba45 100644
--- a/drivers/nvme/target/tcp.c
+++ b/drivers/nvme/target/tcp.c
@@ -1852,6 +1852,7 @@ static void __exit nvmet_tcp_exit(void)
flush_scheduled_work();
destroy_workqueue(nvmet_tcp_wq);
+ ida_destroy(&nvmet_tcp_queue_ida);
}
module_init(nvmet_tcp_init);
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH AUTOSEL 5.10 10/16] nvme-fc: do not wait in vain when unloading module
[not found] <20240207212700.4287-1-sashal@kernel.org>
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 06/16] nvmet-tcp: fix nvme tcp ida memory leak Sasha Levin
@ 2024-02-07 21:26 ` Sasha Levin
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 11/16] nvmet-fcloop: swap the list_add_tail arguments Sasha Levin
` (3 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Sasha Levin @ 2024-02-07 21:26 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Daniel Wagner, Christoph Hellwig, Hannes Reinecke, Keith Busch,
Sasha Levin, james.smart, sagi, linux-nvme
From: Daniel Wagner <dwagner@suse.de>
[ Upstream commit 70fbfc47a392b98e5f8dba70c6efc6839205c982 ]
The module exit path has race between deleting all controllers and
freeing 'left over IDs'. To prevent double free a synchronization
between nvme_delete_ctrl and ida_destroy has been added by the initial
commit.
There is some logic around trying to prevent from hanging forever in
wait_for_completion, though it does not handling all cases. E.g.
blktests is able to reproduce the situation where the module unload
hangs forever.
If we completely rely on the cleanup code executed from the
nvme_delete_ctrl path, all IDs will be freed eventually. This makes
calling ida_destroy unnecessary. We only have to ensure that all
nvme_delete_ctrl code has been executed before we leave
nvme_fc_exit_module. This is done by flushing the nvme_delete_wq
workqueue.
While at it, remove the unused nvme_fc_wq workqueue too.
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/nvme/host/fc.c | 47 ++++++------------------------------------
1 file changed, 6 insertions(+), 41 deletions(-)
diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c
index 906cab35afe7..8e05239073ef 100644
--- a/drivers/nvme/host/fc.c
+++ b/drivers/nvme/host/fc.c
@@ -220,11 +220,6 @@ static LIST_HEAD(nvme_fc_lport_list);
static DEFINE_IDA(nvme_fc_local_port_cnt);
static DEFINE_IDA(nvme_fc_ctrl_cnt);
-static struct workqueue_struct *nvme_fc_wq;
-
-static bool nvme_fc_waiting_to_unload;
-static DECLARE_COMPLETION(nvme_fc_unload_proceed);
-
/*
* These items are short-term. They will eventually be moved into
* a generic FC class. See comments in module init.
@@ -254,8 +249,6 @@ nvme_fc_free_lport(struct kref *ref)
/* remove from transport list */
spin_lock_irqsave(&nvme_fc_lock, flags);
list_del(&lport->port_list);
- if (nvme_fc_waiting_to_unload && list_empty(&nvme_fc_lport_list))
- complete(&nvme_fc_unload_proceed);
spin_unlock_irqrestore(&nvme_fc_lock, flags);
ida_simple_remove(&nvme_fc_local_port_cnt, lport->localport.port_num);
@@ -3823,10 +3816,6 @@ static int __init nvme_fc_init_module(void)
{
int ret;
- nvme_fc_wq = alloc_workqueue("nvme_fc_wq", WQ_MEM_RECLAIM, 0);
- if (!nvme_fc_wq)
- return -ENOMEM;
-
/*
* NOTE:
* It is expected that in the future the kernel will combine
@@ -3844,7 +3833,7 @@ static int __init nvme_fc_init_module(void)
ret = class_register(&fc_class);
if (ret) {
pr_err("couldn't register class fc\n");
- goto out_destroy_wq;
+ return ret;
}
/*
@@ -3868,8 +3857,6 @@ static int __init nvme_fc_init_module(void)
device_destroy(&fc_class, MKDEV(0, 0));
out_destroy_class:
class_unregister(&fc_class);
-out_destroy_wq:
- destroy_workqueue(nvme_fc_wq);
return ret;
}
@@ -3889,45 +3876,23 @@ nvme_fc_delete_controllers(struct nvme_fc_rport *rport)
spin_unlock(&rport->lock);
}
-static void
-nvme_fc_cleanup_for_unload(void)
+static void __exit nvme_fc_exit_module(void)
{
struct nvme_fc_lport *lport;
struct nvme_fc_rport *rport;
-
- list_for_each_entry(lport, &nvme_fc_lport_list, port_list) {
- list_for_each_entry(rport, &lport->endp_list, endp_list) {
- nvme_fc_delete_controllers(rport);
- }
- }
-}
-
-static void __exit nvme_fc_exit_module(void)
-{
unsigned long flags;
- bool need_cleanup = false;
spin_lock_irqsave(&nvme_fc_lock, flags);
- nvme_fc_waiting_to_unload = true;
- if (!list_empty(&nvme_fc_lport_list)) {
- need_cleanup = true;
- nvme_fc_cleanup_for_unload();
- }
+ list_for_each_entry(lport, &nvme_fc_lport_list, port_list)
+ list_for_each_entry(rport, &lport->endp_list, endp_list)
+ nvme_fc_delete_controllers(rport);
spin_unlock_irqrestore(&nvme_fc_lock, flags);
- if (need_cleanup) {
- pr_info("%s: waiting for ctlr deletes\n", __func__);
- wait_for_completion(&nvme_fc_unload_proceed);
- pr_info("%s: ctrl deletes complete\n", __func__);
- }
+ flush_workqueue(nvme_delete_wq);
nvmf_unregister_transport(&nvme_fc_transport);
- ida_destroy(&nvme_fc_local_port_cnt);
- ida_destroy(&nvme_fc_ctrl_cnt);
-
device_destroy(&fc_class, MKDEV(0, 0));
class_unregister(&fc_class);
- destroy_workqueue(nvme_fc_wq);
}
module_init(nvme_fc_init_module);
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH AUTOSEL 5.10 11/16] nvmet-fcloop: swap the list_add_tail arguments
[not found] <20240207212700.4287-1-sashal@kernel.org>
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 06/16] nvmet-tcp: fix nvme tcp ida memory leak Sasha Levin
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 10/16] nvme-fc: do not wait in vain when unloading module Sasha Levin
@ 2024-02-07 21:26 ` Sasha Levin
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 12/16] nvmet-fc: release reference on target port Sasha Levin
` (2 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Sasha Levin @ 2024-02-07 21:26 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Daniel Wagner, Christoph Hellwig, Hannes Reinecke, Keith Busch,
Sasha Levin, james.smart, sagi, kch, linux-nvme
From: Daniel Wagner <dwagner@suse.de>
[ Upstream commit dcfad4ab4d6733f2861cd241d8532a0004fc835a ]
The first argument of list_add_tail function is the new element which
should be added to the list which is the second argument. Swap the
arguments to allow processing more than one element at a time.
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/nvme/target/fcloop.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c
index 80a208fb34f5..f2c5136bf2b8 100644
--- a/drivers/nvme/target/fcloop.c
+++ b/drivers/nvme/target/fcloop.c
@@ -358,7 +358,7 @@ fcloop_h2t_ls_req(struct nvme_fc_local_port *localport,
if (!rport->targetport) {
tls_req->status = -ECONNREFUSED;
spin_lock(&rport->lock);
- list_add_tail(&rport->ls_list, &tls_req->ls_list);
+ list_add_tail(&tls_req->ls_list, &rport->ls_list);
spin_unlock(&rport->lock);
schedule_work(&rport->ls_work);
return ret;
@@ -391,7 +391,7 @@ fcloop_h2t_xmt_ls_rsp(struct nvmet_fc_target_port *targetport,
if (remoteport) {
rport = remoteport->private;
spin_lock(&rport->lock);
- list_add_tail(&rport->ls_list, &tls_req->ls_list);
+ list_add_tail(&tls_req->ls_list, &rport->ls_list);
spin_unlock(&rport->lock);
schedule_work(&rport->ls_work);
}
@@ -446,7 +446,7 @@ fcloop_t2h_ls_req(struct nvmet_fc_target_port *targetport, void *hosthandle,
if (!tport->remoteport) {
tls_req->status = -ECONNREFUSED;
spin_lock(&tport->lock);
- list_add_tail(&tport->ls_list, &tls_req->ls_list);
+ list_add_tail(&tls_req->ls_list, &tport->ls_list);
spin_unlock(&tport->lock);
schedule_work(&tport->ls_work);
return ret;
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH AUTOSEL 5.10 12/16] nvmet-fc: release reference on target port
[not found] <20240207212700.4287-1-sashal@kernel.org>
` (2 preceding siblings ...)
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 11/16] nvmet-fcloop: swap the list_add_tail arguments Sasha Levin
@ 2024-02-07 21:26 ` Sasha Levin
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 13/16] nvmet-fc: do not tack refs on tgtports from assoc Sasha Levin
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 14/16] nvmet-fc: abort command when there is no binding Sasha Levin
5 siblings, 0 replies; 8+ messages in thread
From: Sasha Levin @ 2024-02-07 21:26 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Daniel Wagner, Hannes Reinecke, Christoph Hellwig, Keith Busch,
Sasha Levin, james.smart, sagi, kch, linux-nvme
From: Daniel Wagner <dwagner@suse.de>
[ Upstream commit c691e6d7e13dab81ac8c7489c83b5dea972522a5 ]
In case we return early out of __nvmet_fc_finish_ls_req() we still have
to release the reference on the target port.
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/nvme/target/fc.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c
index 46fc44ce8671..18a64a4fd8da 100644
--- a/drivers/nvme/target/fc.c
+++ b/drivers/nvme/target/fc.c
@@ -357,7 +357,7 @@ __nvmet_fc_finish_ls_req(struct nvmet_fc_ls_req_op *lsop)
if (!lsop->req_queued) {
spin_unlock_irqrestore(&tgtport->lock, flags);
- return;
+ goto out_puttgtport;
}
list_del(&lsop->lsreq_list);
@@ -370,6 +370,7 @@ __nvmet_fc_finish_ls_req(struct nvmet_fc_ls_req_op *lsop)
(lsreq->rqstlen + lsreq->rsplen),
DMA_BIDIRECTIONAL);
+out_puttgtport:
nvmet_fc_tgtport_put(tgtport);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH AUTOSEL 5.10 13/16] nvmet-fc: do not tack refs on tgtports from assoc
[not found] <20240207212700.4287-1-sashal@kernel.org>
` (3 preceding siblings ...)
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 12/16] nvmet-fc: release reference on target port Sasha Levin
@ 2024-02-07 21:26 ` Sasha Levin
2024-02-18 19:08 ` Pavel Machek
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 14/16] nvmet-fc: abort command when there is no binding Sasha Levin
5 siblings, 1 reply; 8+ messages in thread
From: Sasha Levin @ 2024-02-07 21:26 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Daniel Wagner, Hannes Reinecke, Christoph Hellwig, Keith Busch,
Sasha Levin, james.smart, sagi, kch, linux-nvme
From: Daniel Wagner <dwagner@suse.de>
[ Upstream commit 1c110588dd95d21782397ff3cbaa55820b4e1fad ]
The association life time is tied to the life time of the target port.
That means we should not take extra a refcount when creating a
association.
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/nvme/target/fc.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c
index 18a64a4fd8da..ebbc513682e1 100644
--- a/drivers/nvme/target/fc.c
+++ b/drivers/nvme/target/fc.c
@@ -1110,12 +1110,9 @@ nvmet_fc_alloc_target_assoc(struct nvmet_fc_tgtport *tgtport, void *hosthandle)
if (idx < 0)
goto out_free_assoc;
- if (!nvmet_fc_tgtport_get(tgtport))
- goto out_ida;
-
assoc->hostport = nvmet_fc_alloc_hostport(tgtport, hosthandle);
if (IS_ERR(assoc->hostport))
- goto out_put;
+ goto out_ida;
assoc->tgtport = tgtport;
assoc->a_id = idx;
@@ -1145,8 +1142,6 @@ nvmet_fc_alloc_target_assoc(struct nvmet_fc_tgtport *tgtport, void *hosthandle)
return assoc;
-out_put:
- nvmet_fc_tgtport_put(tgtport);
out_ida:
ida_simple_remove(&tgtport->assoc_cnt, idx);
out_free_assoc:
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH AUTOSEL 5.10 14/16] nvmet-fc: abort command when there is no binding
[not found] <20240207212700.4287-1-sashal@kernel.org>
` (4 preceding siblings ...)
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 13/16] nvmet-fc: do not tack refs on tgtports from assoc Sasha Levin
@ 2024-02-07 21:26 ` Sasha Levin
5 siblings, 0 replies; 8+ messages in thread
From: Sasha Levin @ 2024-02-07 21:26 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Daniel Wagner, Hannes Reinecke, Christoph Hellwig, Keith Busch,
Sasha Levin, james.smart, sagi, kch, linux-nvme
From: Daniel Wagner <dwagner@suse.de>
[ Upstream commit 3146345c2e9c2f661527054e402b0cfad80105a4 ]
When the target port has not active port binding, there is no point in
trying to process the command as it has to fail anyway. Instead adding
checks to all commands abort the command early.
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/nvme/target/fc.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c
index ebbc513682e1..6bdf9235b14d 100644
--- a/drivers/nvme/target/fc.c
+++ b/drivers/nvme/target/fc.c
@@ -1102,6 +1102,9 @@ nvmet_fc_alloc_target_assoc(struct nvmet_fc_tgtport *tgtport, void *hosthandle)
int idx;
bool needrandom = true;
+ if (!tgtport->pe)
+ return NULL;
+
assoc = kzalloc(sizeof(*assoc), GFP_KERNEL);
if (!assoc)
return NULL;
@@ -2524,8 +2527,9 @@ nvmet_fc_handle_fcp_rqst(struct nvmet_fc_tgtport *tgtport,
fod->req.cmd = &fod->cmdiubuf.sqe;
fod->req.cqe = &fod->rspiubuf.cqe;
- if (tgtport->pe)
- fod->req.port = tgtport->pe->port;
+ if (!tgtport->pe)
+ goto transport_error;
+ fod->req.port = tgtport->pe->port;
/* clear any response payload */
memset(&fod->rspiubuf, 0, sizeof(fod->rspiubuf));
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH AUTOSEL 5.10 13/16] nvmet-fc: do not tack refs on tgtports from assoc
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 13/16] nvmet-fc: do not tack refs on tgtports from assoc Sasha Levin
@ 2024-02-18 19:08 ` Pavel Machek
2024-02-22 12:24 ` Sasha Levin
0 siblings, 1 reply; 8+ messages in thread
From: Pavel Machek @ 2024-02-18 19:08 UTC (permalink / raw)
To: Sasha Levin
Cc: linux-kernel, stable, Daniel Wagner, Hannes Reinecke,
Christoph Hellwig, Keith Busch, james.smart, sagi, kch,
linux-nvme
[-- Attachment #1: Type: text/plain, Size: 1178 bytes --]
Hi!
> From: Daniel Wagner <dwagner@suse.de>
>
> [ Upstream commit 1c110588dd95d21782397ff3cbaa55820b4e1fad ]
>
> The association life time is tied to the life time of the target port.
> That means we should not take extra a refcount when creating a
> association.
I don't see this one queued for 6.1 or 6.6. What went wrong here?
Best regards,
Pavel
> +++ b/drivers/nvme/target/fc.c
> @@ -1110,12 +1110,9 @@ nvmet_fc_alloc_target_assoc(struct nvmet_fc_tgtport *tgtport, void *hosthandle)
> if (idx < 0)
> goto out_free_assoc;
>
> - if (!nvmet_fc_tgtport_get(tgtport))
> - goto out_ida;
> -
> assoc->hostport = nvmet_fc_alloc_hostport(tgtport, hosthandle);
> if (IS_ERR(assoc->hostport))
> - goto out_put;
> + goto out_ida;
>
> assoc->tgtport = tgtport;
> assoc->a_id = idx;
> @@ -1145,8 +1142,6 @@ nvmet_fc_alloc_target_assoc(struct nvmet_fc_tgtport *tgtport, void *hosthandle)
>
> return assoc;
>
> -out_put:
> - nvmet_fc_tgtport_put(tgtport);
> out_ida:
> ida_simple_remove(&tgtport->assoc_cnt, idx);
> out_free_assoc:
--
People of Russia, stop Putin before his war on Ukraine escalates.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH AUTOSEL 5.10 13/16] nvmet-fc: do not tack refs on tgtports from assoc
2024-02-18 19:08 ` Pavel Machek
@ 2024-02-22 12:24 ` Sasha Levin
0 siblings, 0 replies; 8+ messages in thread
From: Sasha Levin @ 2024-02-22 12:24 UTC (permalink / raw)
To: Pavel Machek
Cc: linux-kernel, stable, Daniel Wagner, Hannes Reinecke,
Christoph Hellwig, Keith Busch, james.smart, sagi, kch,
linux-nvme
On Sun, Feb 18, 2024 at 08:08:51PM +0100, Pavel Machek wrote:
>Hi!
>
>> From: Daniel Wagner <dwagner@suse.de>
>>
>> [ Upstream commit 1c110588dd95d21782397ff3cbaa55820b4e1fad ]
>>
>> The association life time is tied to the life time of the target port.
>> That means we should not take extra a refcount when creating a
>> association.
>
>I don't see this one queued for 6.1 or 6.6. What went wrong here?
Yup, this should have been dropped from all trees. Thanks!
--
Thanks,
Sasha
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-02-22 12:24 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20240207212700.4287-1-sashal@kernel.org>
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 06/16] nvmet-tcp: fix nvme tcp ida memory leak Sasha Levin
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 10/16] nvme-fc: do not wait in vain when unloading module Sasha Levin
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 11/16] nvmet-fcloop: swap the list_add_tail arguments Sasha Levin
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 12/16] nvmet-fc: release reference on target port Sasha Levin
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 13/16] nvmet-fc: do not tack refs on tgtports from assoc Sasha Levin
2024-02-18 19:08 ` Pavel Machek
2024-02-22 12:24 ` Sasha Levin
2024-02-07 21:26 ` [PATCH AUTOSEL 5.10 14/16] nvmet-fc: abort command when there is no binding Sasha Levin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox