* [PATCH v7 0/1] PCI/IOV: Make pci_lock_rescan_remove() reentrant and protect sriov_add_vfs/sriov_del_vfs
@ 2026-03-08 13:53 Ionut Nechita (Wind River)
2026-03-08 13:53 ` [PATCH v7 1/1] " Ionut Nechita (Wind River)
2026-03-09 18:57 ` ✗ LGCI.VerificationFailed: failure for " Patchwork
0 siblings, 2 replies; 5+ messages in thread
From: Ionut Nechita (Wind River) @ 2026-03-08 13:53 UTC (permalink / raw)
To: linux-pci, bhelgaas
Cc: helgaas, sebott, schnelle, bblock, alifm, julianr, dtatulea, mani,
lukas, kbusch, ionut_n2001, sunlightlinux, linux-kernel, stable,
intel-xe, Ionut Nechita (Wind River)
Hi Bjorn,
This is v7 of the fix for the SR-IOV race between driver .remove()
and concurrent hotplug events (particularly on s390).
Changes since v6 (Mar 6):
- Replaced local pci_rescan_remove_owner / pci_rescan_remove_count
variables with mutex_get_owner() for owner checking and a single
pci_rescan_remove_reentrant_count depth counter, as tested and
suggested by Benjamin Block
- Dropped Reviewed-by and Tested-by tags per Benjamin Block's
feedback, since the implementation changed substantially between
the reviewed version and the current one
- Added Suggested-by for Benjamin Block
- Rebased on linux-next (20260306)
Changes since v5 (Mar 3):
- Reworked based on Lukas Wunner's suggestion: instead of introducing
separate pci_lock_rescan_remove_reentrant() /
pci_unlock_rescan_remove_reentrant() helpers, make the existing
pci_lock_rescan_remove() / pci_unlock_rescan_remove() themselves
reentrant using owner tracking and a depth counter
- No new API: callers simply use pci_lock/unlock_rescan_remove()
without needing to track any return value
- No changes to include/linux/pci.h
- Rebased on linux-next (20260306)
Changes since v4 (Feb 28):
- Replaced local pci_rescan_remove_owner variable with
mutex_get_owner() to check lock ownership, as suggested by
Manivannan Sadhasivam and agreed by Benjamin Block
- Removed owner tracking from pci_lock_rescan_remove() and
pci_unlock_rescan_remove() - they are now unchanged from upstream
- Rebased on linux-next (20260302)
Changes since v3 (Feb 25):
- Rebased on linux-next (next-20260227)
- Declared pci_rescan_remove_owner as const pointer
(const struct task_struct *) to make clear it is not meant to
modify the task (Benjamin Block)
- Added Reviewed-by and Tested-by from Benjamin Block (IBM)
Changes since v2 (Feb 19):
- Rebased on linux-next (next-20260225)
- Added Tested-by from Dragos Tatulea (NVIDIA)
- No code changes from v2
Changes since v1 (Feb 14):
- Renamed from pci_lock_rescan_remove_nested() to
pci_lock_rescan_remove_reentrant() to avoid confusion with
mutex_lock_nested() lockdep annotations (Benjamin Block)
- Added pci_unlock_rescan_remove_reentrant(const bool locked) helper
to avoid open-coding conditional unlock at each call site
(Benjamin Block)
- Moved declarations from drivers/pci/pci.h to include/linux/pci.h
alongside existing lock/unlock declarations (Benjamin Block)
- Simplified callers: removed negation of return value and manual
conditional unlock in favor of the paired lock/unlock helpers
The problem: on s390, platform-generated hot-unplug events for VFs
can race with sriov_del_vfs() when a PF driver is being unloaded.
The platform event handler takes pci_rescan_remove_lock, but
sriov_del_vfs() does not, leading to double removal and list
corruption. We cannot use a plain mutex_lock() because
sriov_del_vfs() may be called from paths that already hold the
lock (deadlock), and mutex_trylock() cannot distinguish self from
other holders.
The fix makes pci_lock_rescan_remove() reentrant using owner tracking
and a depth counter: if the current task already holds the lock, the
counter is incremented; pci_unlock_rescan_remove() decrements the
counter and only releases the mutex when it reaches zero. This keeps
the existing API unchanged while providing correct serialization.
Link: https://lore.kernel.org/linux-pci/20260214193235.262219-3-ionut.nechita@windriver.com/ [v1]
Link: https://lore.kernel.org/linux-pci/20260219212648.82606-1-ionut.nechita@windriver.com/ [v2]
Link: https://lore.kernel.org/linux-pci/20260225202434.18737-1-ionut.nechita@windriver.com/ [v3]
Link: https://lore.kernel.org/linux-pci/20260228120138.51197-2-ionut.nechita@windriver.com/ [v4]
Link: https://lore.kernel.org/linux-pci/20260303080903.28693-1-ionut.nechita@windriver.com/ [v5]
Link: https://lore.kernel.org/linux-pci/20260306082108.17322-1-ionut.nechita@windriver.com/ [v6]
Ionut Nechita (Wind River) (1):
PCI/IOV: Make pci_lock_rescan_remove() reentrant and protect
sriov_add_vfs/sriov_del_vfs
drivers/pci/iov.c | 5 +++++
drivers/pci/probe.c | 11 +++++++++--
2 files changed, 14 insertions(+), 2 deletions(-)
base-commit: a0ae2a256046c0c5d3778d1a194ff2e171f16e5f
--
2.53.0
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH v7 1/1] PCI/IOV: Make pci_lock_rescan_remove() reentrant and protect sriov_add_vfs/sriov_del_vfs 2026-03-08 13:53 [PATCH v7 0/1] PCI/IOV: Make pci_lock_rescan_remove() reentrant and protect sriov_add_vfs/sriov_del_vfs Ionut Nechita (Wind River) @ 2026-03-08 13:53 ` Ionut Nechita (Wind River) 2026-03-08 22:54 ` Benjamin Block 2026-03-09 20:11 ` Niklas Schnelle 2026-03-09 18:57 ` ✗ LGCI.VerificationFailed: failure for " Patchwork 1 sibling, 2 replies; 5+ messages in thread From: Ionut Nechita (Wind River) @ 2026-03-08 13:53 UTC (permalink / raw) To: linux-pci, bhelgaas Cc: helgaas, sebott, schnelle, bblock, alifm, julianr, dtatulea, mani, lukas, kbusch, ionut_n2001, sunlightlinux, linux-kernel, stable, intel-xe, Ionut Nechita (Wind River) After reverting commit 05703271c3cd ("PCI/IOV: Add PCI rescan-remove locking when enabling/disabling SR-IOV") and moving the lock to sriov_numvfs_store(), the path through driver .remove() (e.g. rmmod, or manual unbind) that calls pci_disable_sriov() directly remains unprotected against concurrent hotplug events. This affects any SR-IOV capable driver that calls pci_disable_sriov() from its .remove() callback (i40e, ice, mlx5, bnxt, etc.). On s390, platform-generated hot-unplug events for VFs can race with sriov_del_vfs() when a PF driver is being unloaded. The platform event handler takes pci_rescan_remove_lock, but sriov_del_vfs() does not, leading to double removal and list corruption. We cannot use a plain mutex_lock() here because sriov_del_vfs() may also be called from paths that already hold pci_rescan_remove_lock (e.g. remove_store -> pci_stop_and_remove_bus_device_locked, or sriov_numvfs_store with the lock taken by the previous patch). Using mutex_lock() in those cases would deadlock. Make pci_lock_rescan_remove() itself reentrant using mutex_get_owner() and a reentrant depth counter, as suggested by Lukas Wunner and Benjamin Block, since these recursive locking scenarios exist elsewhere in the PCI subsystem: - If the lock is already held by the current task (checked via mutex_get_owner()): increments the reentrant counter and returns without re-acquiring, avoiding deadlock. - If the lock is held by another task: blocks until the lock is released, providing complete serialization. - If the lock is not held: acquires the mutex normally. pci_unlock_rescan_remove() decrements the reentrant counter if it is non-zero, otherwise releases the mutex. This approach keeps the API unchanged: callers simply pair lock/unlock calls without needing to track any return value or use separate reentrant variants. Add pci_lock_rescan_remove()/pci_unlock_rescan_remove() calls to sriov_add_vfs() and sriov_del_vfs() to protect VF addition and removal against concurrent hotplug events. Fixes: 18f9e9d150fc ("PCI/IOV: Factor out sriov_add_vfs()") Cc: stable@vger.kernel.org Suggested-by: Lukas Wunner <lukas@wunner.de> Suggested-by: Benjamin Block <bblock@linux.ibm.com> Signed-off-by: Ionut Nechita <ionut_n2001@yahoo.com> Signed-off-by: Ionut Nechita <ionut.nechita@windriver.com> --- drivers/pci/iov.c | 5 +++++ drivers/pci/probe.c | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index 91ac4e37ecb9c..aba2fb90759cd 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c @@ -633,15 +633,18 @@ static int sriov_add_vfs(struct pci_dev *dev, u16 num_vfs) if (dev->no_vf_scan) return 0; + pci_lock_rescan_remove(); for (i = 0; i < num_vfs; i++) { rc = pci_iov_add_virtfn(dev, i); if (rc) goto failed; } + pci_unlock_rescan_remove(); return 0; failed: while (i--) pci_iov_remove_virtfn(dev, i); + pci_unlock_rescan_remove(); return rc; } @@ -766,8 +769,10 @@ static void sriov_del_vfs(struct pci_dev *dev) struct pci_sriov *iov = dev->sriov; int i; + pci_lock_rescan_remove(); for (i = 0; i < iov->num_VFs; i++) pci_iov_remove_virtfn(dev, i); + pci_unlock_rescan_remove(); } static void sriov_disable(struct pci_dev *dev) diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index bccc7a4bdd794..ce4d351b5aa21 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -3509,16 +3509,23 @@ EXPORT_SYMBOL_GPL(pci_rescan_bus); * routines should always be executed under this mutex. */ DEFINE_MUTEX(pci_rescan_remove_lock); +static size_t pci_rescan_remove_reentrant_count; void pci_lock_rescan_remove(void) { - mutex_lock(&pci_rescan_remove_lock); + if (mutex_get_owner(&pci_rescan_remove_lock) == (unsigned long)current) + pci_rescan_remove_reentrant_count++; + else + mutex_lock(&pci_rescan_remove_lock); } EXPORT_SYMBOL_GPL(pci_lock_rescan_remove); void pci_unlock_rescan_remove(void) { - mutex_unlock(&pci_rescan_remove_lock); + if (pci_rescan_remove_reentrant_count > 0) + pci_rescan_remove_reentrant_count--; + else + mutex_unlock(&pci_rescan_remove_lock); } EXPORT_SYMBOL_GPL(pci_unlock_rescan_remove); -- 2.53.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v7 1/1] PCI/IOV: Make pci_lock_rescan_remove() reentrant and protect sriov_add_vfs/sriov_del_vfs 2026-03-08 13:53 ` [PATCH v7 1/1] " Ionut Nechita (Wind River) @ 2026-03-08 22:54 ` Benjamin Block 2026-03-09 20:11 ` Niklas Schnelle 1 sibling, 0 replies; 5+ messages in thread From: Benjamin Block @ 2026-03-08 22:54 UTC (permalink / raw) To: Ionut Nechita (Wind River) Cc: linux-pci, bhelgaas, helgaas, sebott, schnelle, alifm, julianr, dtatulea, mani, lukas, kbusch, ionut_n2001, sunlightlinux, linux-kernel, stable, intel-xe On Sun, Mar 08, 2026 at 03:53:52PM +0200, Ionut Nechita (Wind River) wrote: > After reverting commit 05703271c3cd ("PCI/IOV: Add PCI rescan-remove > locking when enabling/disabling SR-IOV") and moving the lock to > sriov_numvfs_store(), the path through driver .remove() (e.g. rmmod, > or manual unbind) that calls pci_disable_sriov() directly remains > unprotected against concurrent hotplug events. This affects any SR-IOV > capable driver that calls pci_disable_sriov() from its .remove() > callback (i40e, ice, mlx5, bnxt, etc.). > > On s390, platform-generated hot-unplug events for VFs can race with > sriov_del_vfs() when a PF driver is being unloaded. The platform event > handler takes pci_rescan_remove_lock, but sriov_del_vfs() does not, > leading to double removal and list corruption. > > We cannot use a plain mutex_lock() here because sriov_del_vfs() may also > be called from paths that already hold pci_rescan_remove_lock (e.g. > remove_store -> pci_stop_and_remove_bus_device_locked, or > sriov_numvfs_store with the lock taken by the previous patch). Using > mutex_lock() in those cases would deadlock. > > Make pci_lock_rescan_remove() itself reentrant using mutex_get_owner() > and a reentrant depth counter, as suggested by Lukas Wunner and > Benjamin Block, since these recursive locking scenarios exist elsewhere > in the PCI subsystem: > - If the lock is already held by the current task (checked via > mutex_get_owner()): increments the reentrant counter and returns > without re-acquiring, avoiding deadlock. > - If the lock is held by another task: blocks until the lock is > released, providing complete serialization. > - If the lock is not held: acquires the mutex normally. > > pci_unlock_rescan_remove() decrements the reentrant counter if it is > non-zero, otherwise releases the mutex. > > This approach keeps the API unchanged: callers simply pair lock/unlock > calls without needing to track any return value or use separate > reentrant variants. > > Add pci_lock_rescan_remove()/pci_unlock_rescan_remove() calls to > sriov_add_vfs() and sriov_del_vfs() to protect VF addition and > removal against concurrent hotplug events. > > Fixes: 18f9e9d150fc ("PCI/IOV: Factor out sriov_add_vfs()") > Cc: stable@vger.kernel.org > Suggested-by: Lukas Wunner <lukas@wunner.de> > Suggested-by: Benjamin Block <bblock@linux.ibm.com> > Signed-off-by: Ionut Nechita <ionut_n2001@yahoo.com> > Signed-off-by: Ionut Nechita <ionut.nechita@windriver.com> > --- > drivers/pci/iov.c | 5 +++++ > drivers/pci/probe.c | 11 +++++++++-- > 2 files changed, 14 insertions(+), 2 deletions(-) Looks good to me. Also, I ran tests with this in our test lab (s390). Reviewed-by: Benjamin Block <bblock@linux.ibm.com> Tested-by: Benjamin Block <bblock@linux.ibm.com> Thanks. -- Best Regards, Benjamin Block / Linux on IBM Z Kernel Development IBM Deutschland Research & Development GmbH / https://www.ibm.com/privacy Vors. Aufs.-R.: Wolfgang Wendt / Geschäftsführung: David Faller Sitz der Ges.: Ehningen / Registergericht: AmtsG Stuttgart, HRB 243294 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v7 1/1] PCI/IOV: Make pci_lock_rescan_remove() reentrant and protect sriov_add_vfs/sriov_del_vfs 2026-03-08 13:53 ` [PATCH v7 1/1] " Ionut Nechita (Wind River) 2026-03-08 22:54 ` Benjamin Block @ 2026-03-09 20:11 ` Niklas Schnelle 1 sibling, 0 replies; 5+ messages in thread From: Niklas Schnelle @ 2026-03-09 20:11 UTC (permalink / raw) To: Ionut Nechita (Wind River), linux-pci, bhelgaas Cc: helgaas, sebott, bblock, alifm, julianr, dtatulea, mani, lukas, kbusch, ionut_n2001, sunlightlinux, linux-kernel, stable, intel-xe On Sun, 2026-03-08 at 15:53 +0200, Ionut Nechita (Wind River) wrote: > After reverting commit 05703271c3cd ("PCI/IOV: Add PCI rescan-remove > locking when enabling/disabling SR-IOV") and moving the lock to > sriov_numvfs_store(), the path through driver .remove() (e.g. rmmod, > or manual unbind) that calls pci_disable_sriov() directly remains > unprotected against concurrent hotplug events. This affects any SR-IOV > capable driver that calls pci_disable_sriov() from its .remove() > callback (i40e, ice, mlx5, bnxt, etc.). > > On s390, platform-generated hot-unplug events for VFs can race with > sriov_del_vfs() when a PF driver is being unloaded. The platform event > handler takes pci_rescan_remove_lock, but sriov_del_vfs() does not, > leading to double removal and list corruption. > > We cannot use a plain mutex_lock() here because sriov_del_vfs() may also > be called from paths that already hold pci_rescan_remove_lock (e.g. > remove_store -> pci_stop_and_remove_bus_device_locked, or > sriov_numvfs_store with the lock taken by the previous patch). Using > mutex_lock() in those cases would deadlock. > > Make pci_lock_rescan_remove() itself reentrant using mutex_get_owner() > and a reentrant depth counter, as suggested by Lukas Wunner and > Benjamin Block, since these recursive locking scenarios exist elsewhere > in the PCI subsystem: > - If the lock is already held by the current task (checked via > mutex_get_owner()): increments the reentrant counter and returns > without re-acquiring, avoiding deadlock. > - If the lock is held by another task: blocks until the lock is > released, providing complete serialization. > - If the lock is not held: acquires the mutex normally. > > pci_unlock_rescan_remove() decrements the reentrant counter if it is > non-zero, otherwise releases the mutex. > > This approach keeps the API unchanged: callers simply pair lock/unlock > calls without needing to track any return value or use separate > reentrant variants. > > Add pci_lock_rescan_remove()/pci_unlock_rescan_remove() calls to > sriov_add_vfs() and sriov_del_vfs() to protect VF addition and > removal against concurrent hotplug events. > > Fixes: 18f9e9d150fc ("PCI/IOV: Factor out sriov_add_vfs()") I think this should have an additional fixes tag for commit 05703271c3cd ("PCI/IOV: Add PCI rescan-remove locking when enabling/disabling SR-IOV") and commit a5338e365c45 ("PCI/IOV: Fix race between SR-IOV enable/disable and hotplug") especially if you incorporate my suggestion below but even without it. > Cc: stable@vger.kernel.org > Suggested-by: Lukas Wunner <lukas@wunner.de> > Suggested-by: Benjamin Block <bblock@linux.ibm.com> > Signed-off-by: Ionut Nechita <ionut_n2001@yahoo.com> > Signed-off-by: Ionut Nechita <ionut.nechita@windriver.com> > --- > drivers/pci/iov.c | 5 +++++ > drivers/pci/probe.c | 11 +++++++++-- > 2 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c > index 91ac4e37ecb9c..aba2fb90759cd 100644 > --- a/drivers/pci/iov.c > +++ b/drivers/pci/iov.c > @@ -633,15 +633,18 @@ static int sriov_add_vfs(struct pci_dev *dev, u16 num_vfs) > if (dev->no_vf_scan) > return 0; > > + pci_lock_rescan_remove(); > for (i = 0; i < num_vfs; i++) { > rc = pci_iov_add_virtfn(dev, i); > if (rc) > goto failed; > } > + pci_unlock_rescan_remove(); > return 0; > failed: > while (i--) > pci_iov_remove_virtfn(dev, i); > + pci_unlock_rescan_remove(); > > return rc; > } > @@ -766,8 +769,10 @@ static void sriov_del_vfs(struct pci_dev *dev) > struct pci_sriov *iov = dev->sriov; > int i; > > + pci_lock_rescan_remove(); > for (i = 0; i < iov->num_VFs; i++) > pci_iov_remove_virtfn(dev, i); > + pci_unlock_rescan_remove(); > } So basically after making the rescan/remove lock reentrant we can now use it in the same spot as I did in commit 05703271c3cd ("PCI/IOV: Add PCI rescan-remove locking when enabling/disabling SR-IOV") only now it doesn't deadlock via self-lock during device removal. With that I think you could actually remove the rescan/remove locking in sriov_numvfs_store() introduced by commit a5338e365c45 ("PCI/IOV: Fix race between SR-IOV enable/disable and hotplug") as part of this patch. That way for the price of making the lock reentrant we are able to reduce its scope. It does otherwise seem a bit weird, though harmless with the reentrant behavior, to take it in both sriov_numvfs_store() and then again in sriov_add_vfs()/sriov_del_vfs(). > > static void sriov_disable(struct pci_dev *dev) > diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c > index bccc7a4bdd794..ce4d351b5aa21 100644 > --- a/drivers/pci/probe.c > +++ b/drivers/pci/probe.c > @@ -3509,16 +3509,23 @@ EXPORT_SYMBOL_GPL(pci_rescan_bus); > * routines should always be executed under this mutex. > */ > DEFINE_MUTEX(pci_rescan_remove_lock); > +static size_t pci_rescan_remove_reentrant_count; > > void pci_lock_rescan_remove(void) > { > - mutex_lock(&pci_rescan_remove_lock); > + if (mutex_get_owner(&pci_rescan_remove_lock) == (unsigned long)current) > + pci_rescan_remove_reentrant_count++; > + else > + mutex_lock(&pci_rescan_remove_lock); > } > EXPORT_SYMBOL_GPL(pci_lock_rescan_remove); > > void pci_unlock_rescan_remove(void) > { > - mutex_unlock(&pci_rescan_remove_lock); > + if (pci_rescan_remove_reentrant_count > 0) > + pci_rescan_remove_reentrant_count--; > + else > + mutex_unlock(&pci_rescan_remove_lock); > } > EXPORT_SYMBOL_GPL(pci_unlock_rescan_remove); I still don't particularly love making the lock reentrant but I also haven't been able to come up with anything cleaner for handling the remove paths. This is especially true for s390 where removing the last passed-through PCI function (struct zpci_dev) on a shared virtual PCI bus also logically removes the virtual PCI bus while also having to hold onto the struct zpci_dev until the corresponding struct pci_dev is released. So this is why Benjamin's series for s390 now strictly depends on this patch to get that part safe without having to introduce rescan/remove locking in pci_release_dev() which seemed quite wrong to me. Long story short. Until a major tree-wide refactoring of the rescan/remove lock this seems like the cleanest path forward to me and I thank you for tackling this. Feel free to add my R-b independent of whether you remove the rescan/remove locking from sriov_numvfs_store() Reviewed-by: Niklas Schnelle <schnelle@linux.ibm.com> Thanks, Niklas ^ permalink raw reply [flat|nested] 5+ messages in thread
* ✗ LGCI.VerificationFailed: failure for PCI/IOV: Make pci_lock_rescan_remove() reentrant and protect sriov_add_vfs/sriov_del_vfs 2026-03-08 13:53 [PATCH v7 0/1] PCI/IOV: Make pci_lock_rescan_remove() reentrant and protect sriov_add_vfs/sriov_del_vfs Ionut Nechita (Wind River) 2026-03-08 13:53 ` [PATCH v7 1/1] " Ionut Nechita (Wind River) @ 2026-03-09 18:57 ` Patchwork 1 sibling, 0 replies; 5+ messages in thread From: Patchwork @ 2026-03-09 18:57 UTC (permalink / raw) To: Ionut Nechita (Wind River); +Cc: intel-xe == Series Details == Series: PCI/IOV: Make pci_lock_rescan_remove() reentrant and protect sriov_add_vfs/sriov_del_vfs URL : https://patchwork.freedesktop.org/series/162896/ State : failure == Summary == Address 'ionut.nechita@windriver.com' is not on the allowlist, which prevents CI from being triggered for this patch. If you want Intel GFX CI to accept this address, please contact the script maintainers at i915-ci-infra@lists.freedesktop.org. Exception occurred during validation, bailing out! ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-03-09 20:12 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-03-08 13:53 [PATCH v7 0/1] PCI/IOV: Make pci_lock_rescan_remove() reentrant and protect sriov_add_vfs/sriov_del_vfs Ionut Nechita (Wind River) 2026-03-08 13:53 ` [PATCH v7 1/1] " Ionut Nechita (Wind River) 2026-03-08 22:54 ` Benjamin Block 2026-03-09 20:11 ` Niklas Schnelle 2026-03-09 18:57 ` ✗ LGCI.VerificationFailed: failure for " Patchwork
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox