* [PATCH] iio: accel: mma8452: use pm_ptr() for dev_pm_ops
@ 2026-04-14 19:20 Sanjay Chitroda
2026-04-15 9:42 ` Andy Shevchenko
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Sanjay Chitroda @ 2026-04-14 19:20 UTC (permalink / raw)
To: jic23; +Cc: dlechner, nuno.sa, andy, linux-iio, linux-kernel
From: Sanjay Chitroda <sanjayembeddedse@gmail.com>
Use pm_ptr() so the PM ops pointer is automatically set to
NULL when CONFIG_PM is disabled. This avoids unused-function warnings
and follows modern kernel power-management conventions.
Signed-off-by: Sanjay Chitroda <sanjayembeddedse@gmail.com>
---
drivers/iio/accel/mma8452.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
index 15172ba2972c..f2b71077574b 100644
--- a/drivers/iio/accel/mma8452.c
+++ b/drivers/iio/accel/mma8452.c
@@ -1744,7 +1744,6 @@ static void mma8452_remove(struct i2c_client *client)
regulator_disable(data->vdd_reg);
}
-#ifdef CONFIG_PM
static int mma8452_runtime_suspend(struct device *dev)
{
struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
@@ -1812,7 +1811,6 @@ static int mma8452_runtime_resume(struct device *dev)
return ret;
}
-#endif
static const struct dev_pm_ops mma8452_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume)
@@ -1835,7 +1833,7 @@ static struct i2c_driver mma8452_driver = {
.driver = {
.name = "mma8452",
.of_match_table = mma8452_dt_ids,
- .pm = &mma8452_pm_ops,
+ .pm = pm_ptr(&mma8452_pm_ops),
},
.probe = mma8452_probe,
.remove = mma8452_remove,
--
2.34.1
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH] iio: accel: mma8452: use pm_ptr() for dev_pm_ops 2026-04-14 19:20 [PATCH] iio: accel: mma8452: use pm_ptr() for dev_pm_ops Sanjay Chitroda @ 2026-04-15 9:42 ` Andy Shevchenko 2026-04-21 1:53 ` Sanjay Chitroda 2026-04-16 15:33 ` kernel test robot 2026-04-20 8:06 ` Geert Uytterhoeven 2 siblings, 1 reply; 7+ messages in thread From: Andy Shevchenko @ 2026-04-15 9:42 UTC (permalink / raw) To: Sanjay Chitroda; +Cc: jic23, dlechner, nuno.sa, andy, linux-iio, linux-kernel On Wed, Apr 15, 2026 at 12:50:45AM +0530, Sanjay Chitroda wrote: > Use pm_ptr() so the PM ops pointer is automatically set to > NULL when CONFIG_PM is disabled. This avoids unused-function warnings > and follows modern kernel power-management conventions. ... > static const struct dev_pm_ops mma8452_pm_ops = { > SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume) You also want to change this to DEFINE_RUNTIME_DEV_PM_OPS(). -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] iio: accel: mma8452: use pm_ptr() for dev_pm_ops 2026-04-15 9:42 ` Andy Shevchenko @ 2026-04-21 1:53 ` Sanjay Chitroda 0 siblings, 0 replies; 7+ messages in thread From: Sanjay Chitroda @ 2026-04-21 1:53 UTC (permalink / raw) To: Andy Shevchenko; +Cc: jic23, dlechner, nuno.sa, andy, linux-iio, linux-kernel On 15 April 2026 3:12:15 pm IST, Andy Shevchenko <andriy.shevchenko@intel.com> wrote: >On Wed, Apr 15, 2026 at 12:50:45AM +0530, Sanjay Chitroda wrote: > >> Use pm_ptr() so the PM ops pointer is automatically set to >> NULL when CONFIG_PM is disabled. This avoids unused-function warnings >> and follows modern kernel power-management conventions. > >... > >> static const struct dev_pm_ops mma8452_pm_ops = { >> SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume) > >You also want to change this to DEFINE_RUNTIME_DEV_PM_OPS(). > Hi Andy, Thank you for the review and feedback. I will update changes in next version. Thank, Sanjay Chitroda ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] iio: accel: mma8452: use pm_ptr() for dev_pm_ops 2026-04-14 19:20 [PATCH] iio: accel: mma8452: use pm_ptr() for dev_pm_ops Sanjay Chitroda 2026-04-15 9:42 ` Andy Shevchenko @ 2026-04-16 15:33 ` kernel test robot 2026-04-20 8:06 ` Geert Uytterhoeven 2 siblings, 0 replies; 7+ messages in thread From: kernel test robot @ 2026-04-16 15:33 UTC (permalink / raw) To: Sanjay Chitroda, jic23 Cc: oe-kbuild-all, dlechner, nuno.sa, andy, linux-iio, linux-kernel Hi Sanjay, kernel test robot noticed the following build warnings: [auto build test WARNING on jic23-iio/togreg] [also build test WARNING on linus/master v7.0 next-20260415] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Sanjay-Chitroda/iio-accel-mma8452-use-pm_ptr-for-dev_pm_ops/20260416-061819 base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg patch link: https://lore.kernel.org/r/20260414192045.3598010-1-sanjayembedded%40gmail.com patch subject: [PATCH] iio: accel: mma8452: use pm_ptr() for dev_pm_ops config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20260416/202604162323.4pYsEj7A-lkp@intel.com/config) compiler: m68k-linux-gcc (GCC) 15.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260416/202604162323.4pYsEj7A-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202604162323.4pYsEj7A-lkp@intel.com/ All warnings (new ones prefixed by >>): >> drivers/iio/accel/mma8452.c:1776:12: warning: 'mma8452_runtime_resume' defined but not used [-Wunused-function] 1776 | static int mma8452_runtime_resume(struct device *dev) | ^~~~~~~~~~~~~~~~~~~~~~ >> drivers/iio/accel/mma8452.c:1747:12: warning: 'mma8452_runtime_suspend' defined but not used [-Wunused-function] 1747 | static int mma8452_runtime_suspend(struct device *dev) | ^~~~~~~~~~~~~~~~~~~~~~~ vim +/mma8452_runtime_resume +1776 drivers/iio/accel/mma8452.c c7eeea93ac60ab Peter Meerwald 2014-02-05 1746 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 @1747 static int mma8452_runtime_suspend(struct device *dev) 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1748 { 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1749 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1750 struct mma8452_data *data = iio_priv(indio_dev); 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1751 int ret; 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1752 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1753 mutex_lock(&data->lock); 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1754 ret = mma8452_standby(data); 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1755 mutex_unlock(&data->lock); 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1756 if (ret < 0) { 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1757 dev_err(&data->client->dev, "powering off device failed\n"); 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1758 return -EAGAIN; 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1759 } 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1760 f6ff49b8a3b6f7 Anson Huang 2019-01-08 1761 ret = regulator_disable(data->vddio_reg); f6ff49b8a3b6f7 Anson Huang 2019-01-08 1762 if (ret) { f6ff49b8a3b6f7 Anson Huang 2019-01-08 1763 dev_err(dev, "failed to disable VDDIO regulator\n"); f6ff49b8a3b6f7 Anson Huang 2019-01-08 1764 return ret; f6ff49b8a3b6f7 Anson Huang 2019-01-08 1765 } f6ff49b8a3b6f7 Anson Huang 2019-01-08 1766 f6ff49b8a3b6f7 Anson Huang 2019-01-08 1767 ret = regulator_disable(data->vdd_reg); f6ff49b8a3b6f7 Anson Huang 2019-01-08 1768 if (ret) { f6ff49b8a3b6f7 Anson Huang 2019-01-08 1769 dev_err(dev, "failed to disable VDD regulator\n"); f6ff49b8a3b6f7 Anson Huang 2019-01-08 1770 return ret; f6ff49b8a3b6f7 Anson Huang 2019-01-08 1771 } f6ff49b8a3b6f7 Anson Huang 2019-01-08 1772 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1773 return 0; 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1774 } 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1775 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 @1776 static int mma8452_runtime_resume(struct device *dev) 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1777 { 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1778 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1779 struct mma8452_data *data = iio_priv(indio_dev); 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1780 int ret, sleep_val; 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1781 f6ff49b8a3b6f7 Anson Huang 2019-01-08 1782 ret = regulator_enable(data->vdd_reg); f6ff49b8a3b6f7 Anson Huang 2019-01-08 1783 if (ret) { f6ff49b8a3b6f7 Anson Huang 2019-01-08 1784 dev_err(dev, "failed to enable VDD regulator\n"); f6ff49b8a3b6f7 Anson Huang 2019-01-08 1785 return ret; f6ff49b8a3b6f7 Anson Huang 2019-01-08 1786 } f6ff49b8a3b6f7 Anson Huang 2019-01-08 1787 f6ff49b8a3b6f7 Anson Huang 2019-01-08 1788 ret = regulator_enable(data->vddio_reg); f6ff49b8a3b6f7 Anson Huang 2019-01-08 1789 if (ret) { f6ff49b8a3b6f7 Anson Huang 2019-01-08 1790 dev_err(dev, "failed to enable VDDIO regulator\n"); f6ff49b8a3b6f7 Anson Huang 2019-01-08 1791 regulator_disable(data->vdd_reg); f6ff49b8a3b6f7 Anson Huang 2019-01-08 1792 return ret; f6ff49b8a3b6f7 Anson Huang 2019-01-08 1793 } f6ff49b8a3b6f7 Anson Huang 2019-01-08 1794 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1795 ret = mma8452_active(data); 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1796 if (ret < 0) f6ff49b8a3b6f7 Anson Huang 2019-01-08 1797 goto runtime_resume_failed; 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1798 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1799 ret = mma8452_get_odr_index(data); 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1800 sleep_val = 1000 / mma8452_samp_freq[ret][0]; 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1801 if (sleep_val < 20) 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1802 usleep_range(sleep_val * 1000, 20000); 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1803 else 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1804 msleep_interruptible(sleep_val); 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1805 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1806 return 0; 96c0cb2bbfe0a5 Martin Kepplinger 2016-03-03 1807 f6ff49b8a3b6f7 Anson Huang 2019-01-08 1808 runtime_resume_failed: f6ff49b8a3b6f7 Anson Huang 2019-01-08 1809 regulator_disable(data->vddio_reg); f6ff49b8a3b6f7 Anson Huang 2019-01-08 1810 regulator_disable(data->vdd_reg); c7eeea93ac60ab Peter Meerwald 2014-02-05 1811 f6ff49b8a3b6f7 Anson Huang 2019-01-08 1812 return ret; c7eeea93ac60ab Peter Meerwald 2014-02-05 1813 } c7eeea93ac60ab Peter Meerwald 2014-02-05 1814 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] iio: accel: mma8452: use pm_ptr() for dev_pm_ops 2026-04-14 19:20 [PATCH] iio: accel: mma8452: use pm_ptr() for dev_pm_ops Sanjay Chitroda 2026-04-15 9:42 ` Andy Shevchenko 2026-04-16 15:33 ` kernel test robot @ 2026-04-20 8:06 ` Geert Uytterhoeven 2026-04-21 1:53 ` Sanjay Chitroda 2 siblings, 1 reply; 7+ messages in thread From: Geert Uytterhoeven @ 2026-04-20 8:06 UTC (permalink / raw) To: Sanjay Chitroda; +Cc: jic23, dlechner, nuno.sa, andy, linux-iio, linux-kernel Hi Sanjay, On Tue, 14 Apr 2026 at 21:20, Sanjay Chitroda <sanjayembeddedse@gmail.com> wrote: > From: Sanjay Chitroda <sanjayembeddedse@gmail.com> > > Use pm_ptr() so the PM ops pointer is automatically set to > NULL when CONFIG_PM is disabled. This avoids unused-function warnings > and follows modern kernel power-management conventions. > > Signed-off-by: Sanjay Chitroda <sanjayembeddedse@gmail.com> Thanks for your patch! > --- a/drivers/iio/accel/mma8452.c > +++ b/drivers/iio/accel/mma8452.c > @@ -1744,7 +1744,6 @@ static void mma8452_remove(struct i2c_client *client) > regulator_disable(data->vdd_reg); > } > > -#ifdef CONFIG_PM > static int mma8452_runtime_suspend(struct device *dev) > { > struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); > @@ -1812,7 +1811,6 @@ static int mma8452_runtime_resume(struct device *dev) > > return ret; > } > -#endif > > static const struct dev_pm_ops mma8452_pm_ops = { > SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume) You are still getting defined but not used warnings, as reported by the kernel test robot, due to the use of SET_SYSTEM_SLEEP_PM_OPS() and SET_RUNTIME_PM_OPS(). Please define the structure using DEFINE_RUNTIME_DEV_PM_OPS() to fix this. > @@ -1835,7 +1833,7 @@ static struct i2c_driver mma8452_driver = { > .driver = { > .name = "mma8452", > .of_match_table = mma8452_dt_ids, > - .pm = &mma8452_pm_ops, > + .pm = pm_ptr(&mma8452_pm_ops), > }, > .probe = mma8452_probe, > .remove = mma8452_remove, Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] iio: accel: mma8452: use pm_ptr() for dev_pm_ops 2026-04-20 8:06 ` Geert Uytterhoeven @ 2026-04-21 1:53 ` Sanjay Chitroda 2026-04-21 15:24 ` Jonathan Cameron 0 siblings, 1 reply; 7+ messages in thread From: Sanjay Chitroda @ 2026-04-21 1:53 UTC (permalink / raw) To: Geert Uytterhoeven Cc: jic23, dlechner, nuno.sa, andy, linux-iio, linux-kernel On 20 April 2026 1:36:14 pm IST, Geert Uytterhoeven <geert@linux-m68k.org> wrote: >Hi Sanjay, > >On Tue, 14 Apr 2026 at 21:20, Sanjay Chitroda ><sanjayembeddedse@gmail.com> wrote: >> From: Sanjay Chitroda <sanjayembeddedse@gmail.com> >> >> Use pm_ptr() so the PM ops pointer is automatically set to >> NULL when CONFIG_PM is disabled. This avoids unused-function warnings >> and follows modern kernel power-management conventions. >> >> Signed-off-by: Sanjay Chitroda <sanjayembeddedse@gmail.com> > >Thanks for your patch! > >> --- a/drivers/iio/accel/mma8452.c >> +++ b/drivers/iio/accel/mma8452.c >> @@ -1744,7 +1744,6 @@ static void mma8452_remove(struct i2c_client *client) >> regulator_disable(data->vdd_reg); >> } >> >> -#ifdef CONFIG_PM >> static int mma8452_runtime_suspend(struct device *dev) >> { >> struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); >> @@ -1812,7 +1811,6 @@ static int mma8452_runtime_resume(struct device *dev) >> >> return ret; >> } >> -#endif >> >> static const struct dev_pm_ops mma8452_pm_ops = { >> SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume) > >You are still getting defined but not used warnings, as reported by >the kernel test robot, due to the use of SET_SYSTEM_SLEEP_PM_OPS() >and SET_RUNTIME_PM_OPS(). Please define the structure using >DEFINE_RUNTIME_DEV_PM_OPS() to fix this. > >> @@ -1835,7 +1833,7 @@ static struct i2c_driver mma8452_driver = { >> .driver = { >> .name = "mma8452", >> .of_match_table = mma8452_dt_ids, >> - .pm = &mma8452_pm_ops, >> + .pm = pm_ptr(&mma8452_pm_ops), >> }, >> .probe = mma8452_probe, >> .remove = mma8452_remove, > >Gr{oetje,eeting}s, > > Geert > Hi Greet, Thank you for the review and feedback. I will update changes in next version. Thank, Sanjay Chitroda ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] iio: accel: mma8452: use pm_ptr() for dev_pm_ops 2026-04-21 1:53 ` Sanjay Chitroda @ 2026-04-21 15:24 ` Jonathan Cameron 0 siblings, 0 replies; 7+ messages in thread From: Jonathan Cameron @ 2026-04-21 15:24 UTC (permalink / raw) To: Sanjay Chitroda Cc: Geert Uytterhoeven, dlechner, nuno.sa, andy, linux-iio, linux-kernel On Tue, 21 Apr 2026 07:23:06 +0530 Sanjay Chitroda <sanjayembeddedse@gmail.com> wrote: > On 20 April 2026 1:36:14 pm IST, Geert Uytterhoeven <geert@linux-m68k.org> wrote: > >Hi Sanjay, > > > >On Tue, 14 Apr 2026 at 21:20, Sanjay Chitroda > ><sanjayembeddedse@gmail.com> wrote: > >> From: Sanjay Chitroda <sanjayembeddedse@gmail.com> > >> > >> Use pm_ptr() so the PM ops pointer is automatically set to > >> NULL when CONFIG_PM is disabled. This avoids unused-function warnings > >> and follows modern kernel power-management conventions. > >> > >> Signed-off-by: Sanjay Chitroda <sanjayembeddedse@gmail.com> > > > >Thanks for your patch! > > > >> --- a/drivers/iio/accel/mma8452.c > >> +++ b/drivers/iio/accel/mma8452.c > >> @@ -1744,7 +1744,6 @@ static void mma8452_remove(struct i2c_client *client) > >> regulator_disable(data->vdd_reg); > >> } > >> > >> -#ifdef CONFIG_PM > >> static int mma8452_runtime_suspend(struct device *dev) > >> { > >> struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); > >> @@ -1812,7 +1811,6 @@ static int mma8452_runtime_resume(struct device *dev) > >> > >> return ret; > >> } > >> -#endif > >> > >> static const struct dev_pm_ops mma8452_pm_ops = { > >> SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume) > > > >You are still getting defined but not used warnings, as reported by > >the kernel test robot, due to the use of SET_SYSTEM_SLEEP_PM_OPS() > >and SET_RUNTIME_PM_OPS(). Please define the structure using > >DEFINE_RUNTIME_DEV_PM_OPS() to fix this. > > > >> @@ -1835,7 +1833,7 @@ static struct i2c_driver mma8452_driver = { > >> .driver = { > >> .name = "mma8452", > >> .of_match_table = mma8452_dt_ids, > >> - .pm = &mma8452_pm_ops, > >> + .pm = pm_ptr(&mma8452_pm_ops), > >> }, > >> .probe = mma8452_probe, > >> .remove = mma8452_remove, > > > >Gr{oetje,eeting}s, > > > > Geert > > > Hi Greet, > > Thank you for the review and feedback. > I will update changes in next version. > > Thank, > Sanjay Chitroda Trivial process thing. Whilst it may seem less polite than you'd like to me, emails like this just add noise for those dealing with a lot of review. Save your thanks for the change log of the next version (under the ---) I've not grumped at anyone about this for a few weeks. You just happen to be the unfortunate victim amongst many who do this! Thanks, Jonathan ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-04-21 15:24 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-04-14 19:20 [PATCH] iio: accel: mma8452: use pm_ptr() for dev_pm_ops Sanjay Chitroda 2026-04-15 9:42 ` Andy Shevchenko 2026-04-21 1:53 ` Sanjay Chitroda 2026-04-16 15:33 ` kernel test robot 2026-04-20 8:06 ` Geert Uytterhoeven 2026-04-21 1:53 ` Sanjay Chitroda 2026-04-21 15:24 ` Jonathan Cameron
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
Powered by JetHome