* [PATCH] bpf: avoid padding in struct bpf_common_attr
@ 2026-05-19 20:38 Arnd Bergmann
2026-05-19 20:52 ` Song Liu
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Arnd Bergmann @ 2026-05-19 20:38 UTC (permalink / raw)
To: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Eduard Zingerman, Kumar Kartikeya Dwivedi, Leon Hwang
Cc: Arnd Bergmann, Martin KaFai Lau, Song Liu, Yonghong Song,
Jiri Olsa, KP Singh, bpf, linux-kernel
From: Arnd Bergmann <arnd@arndb.de>
Building linux/bpf.h with -Wpadded shows an unintentionally
added portion of padding because of the 64-bit alignment:
./usr/include/linux/bpf.h:1510:1: error: padding struct size to alignment boundary with 4 bytes [-Werror=padded]
Avoid this by adding explicit padding.
Fixes: f28771c0691b ("bpf: Extend BPF syscall with common attributes support")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
include/uapi/linux/bpf.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index cc4c0b62cdfa..0f0ec00cae4a 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -1507,6 +1507,7 @@ struct bpf_common_attr {
__u32 log_size;
__u32 log_level;
__u32 log_true_size;
+ __u32 __pad;
};
#define BPF_OBJ_NAME_LEN 16U
--
2.39.5
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr
2026-05-19 20:38 [PATCH] bpf: avoid padding in struct bpf_common_attr Arnd Bergmann
@ 2026-05-19 20:52 ` Song Liu
2026-05-20 7:51 ` Geert Uytterhoeven
2026-05-19 21:17 ` bot+bpf-ci
2026-05-19 22:17 ` Yonghong Song
2 siblings, 1 reply; 8+ messages in thread
From: Song Liu @ 2026-05-19 20:52 UTC (permalink / raw)
To: Arnd Bergmann
Cc: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
Eduard Zingerman, Kumar Kartikeya Dwivedi, Leon Hwang,
Arnd Bergmann, Martin KaFai Lau, Yonghong Song, Jiri Olsa,
KP Singh, bpf, linux-kernel
On Tue, May 19, 2026 at 1:39 PM Arnd Bergmann <arnd@kernel.org> wrote:
>
> From: Arnd Bergmann <arnd@arndb.de>
>
> Building linux/bpf.h with -Wpadded shows an unintentionally
> added portion of padding because of the 64-bit alignment:
>
> ./usr/include/linux/bpf.h:1510:1: error: padding struct size to alignment boundary with 4 bytes [-Werror=padded]
>
> Avoid this by adding explicit padding.
>
> Fixes: f28771c0691b ("bpf: Extend BPF syscall with common attributes support")
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
> include/uapi/linux/bpf.h | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> index cc4c0b62cdfa..0f0ec00cae4a 100644
> --- a/include/uapi/linux/bpf.h
> +++ b/include/uapi/linux/bpf.h
> @@ -1507,6 +1507,7 @@ struct bpf_common_attr {
> __u32 log_size;
> __u32 log_level;
> __u32 log_true_size;
> + __u32 __pad;
> };
Can we instead add "__attribute__((aligned(8)));" here?
Thanks,
Song
>
> #define BPF_OBJ_NAME_LEN 16U
> --
> 2.39.5
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr
2026-05-19 20:38 [PATCH] bpf: avoid padding in struct bpf_common_attr Arnd Bergmann
2026-05-19 20:52 ` Song Liu
@ 2026-05-19 21:17 ` bot+bpf-ci
2026-05-19 22:17 ` Yonghong Song
2 siblings, 0 replies; 8+ messages in thread
From: bot+bpf-ci @ 2026-05-19 21:17 UTC (permalink / raw)
To: arnd, ast, daniel, andrii, eddyz87, memxor, leon.hwang
Cc: arnd, martin.lau, song, yonghong.song, jolsa, kpsingh, bpf,
linux-kernel, ast, andrii, daniel, martin.lau, eddyz87,
yonghong.song, clm, ihor.solodrai
[-- Attachment #1: Type: text/plain, Size: 968 bytes --]
> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> index aec171ccb6ef..bec33bd807dd 100644
> --- a/include/uapi/linux/bpf.h
> +++ b/include/uapi/linux/bpf.h
> @@ -1506,6 +1506,7 @@ struct bpf_common_attr {
> __u32 log_size;
> __u32 log_level;
> __u32 log_true_size;
> + __u32 __pad;
> };
Song Liu raised an alternative approach in his review: could we use
'__attribute__((aligned(8)))' on the struct instead of adding an
explicit padding field?
https://lore.kernel.org/bpf/CAPhsuW60EONo84VkYbYsLHdAPzpfZ+ig8z=+M6NEhiNj_--qtQ@mail.gmail.com/
This design question hasn't been addressed in the discussion. Was this
alternative considered, and if so, what made the explicit padding approach
preferable?
---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
CI run summary: https://github.com/kernel-patches/bpf/actions/runs/26124721051
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr
2026-05-19 20:38 [PATCH] bpf: avoid padding in struct bpf_common_attr Arnd Bergmann
2026-05-19 20:52 ` Song Liu
2026-05-19 21:17 ` bot+bpf-ci
@ 2026-05-19 22:17 ` Yonghong Song
2026-05-20 6:36 ` Arnd Bergmann
2 siblings, 1 reply; 8+ messages in thread
From: Yonghong Song @ 2026-05-19 22:17 UTC (permalink / raw)
To: Arnd Bergmann, Alexei Starovoitov, Daniel Borkmann,
Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi,
Leon Hwang
Cc: Arnd Bergmann, Martin KaFai Lau, Song Liu, Jiri Olsa, KP Singh,
bpf, linux-kernel
On 5/19/26 1:38 PM, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
>
> Building linux/bpf.h with -Wpadded shows an unintentionally
> added portion of padding because of the 64-bit alignment:
>
> ./usr/include/linux/bpf.h:1510:1: error: padding struct size to alignment boundary with 4 bytes [-Werror=padded]
>
> Avoid this by adding explicit padding.
>
> Fixes: f28771c0691b ("bpf: Extend BPF syscall with common attributes support")
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
> include/uapi/linux/bpf.h | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> index cc4c0b62cdfa..0f0ec00cae4a 100644
> --- a/include/uapi/linux/bpf.h
> +++ b/include/uapi/linux/bpf.h
> @@ -1507,6 +1507,7 @@ struct bpf_common_attr {
> __u32 log_size;
> __u32 log_level;
> __u32 log_true_size;
> + __u32 __pad;
Let us make it as
__u32 :32;
?
This can avoid people to use the '__pad' name.
IIUC, typically uapi struct won't have implicit padding.
> };
>
> #define BPF_OBJ_NAME_LEN 16U
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr
2026-05-19 22:17 ` Yonghong Song
@ 2026-05-20 6:36 ` Arnd Bergmann
2026-05-20 14:03 ` Alexei Starovoitov
0 siblings, 1 reply; 8+ messages in thread
From: Arnd Bergmann @ 2026-05-20 6:36 UTC (permalink / raw)
To: Yonghong Song, Arnd Bergmann, Alexei Starovoitov,
Daniel Borkmann, Andrii Nakryiko, Eduard Zingerman,
Kumar Kartikeya Dwivedi, Leon Hwang
Cc: Martin KaFai Lau, Song Liu, Jiri Olsa, KP Singh, bpf, linux-kernel
On Wed, May 20, 2026, at 00:17, Yonghong Song wrote:
> On 5/19/26 1:38 PM, Arnd Bergmann wrote:
>> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
>> index cc4c0b62cdfa..0f0ec00cae4a 100644
>> --- a/include/uapi/linux/bpf.h
>> +++ b/include/uapi/linux/bpf.h
>> @@ -1507,6 +1507,7 @@ struct bpf_common_attr {
>> __u32 log_size;
>> __u32 log_level;
>> __u32 log_true_size;
>> + __u32 __pad;
>
> Let us make it as
> __u32 :32;
> ?
> This can avoid people to use the '__pad' name.
Sure. Do you want me to resend, are are you going to change
it yourself?
> IIUC, typically uapi struct won't have implicit padding.
Correct. I have a patch set that I'm testing to add the
Warning to the kernel build process to find these
automatically, but I first need to take care of all the
existing instances and only report newly added ones at
the moment.
FWIW, see below for what I currently have in my private
tree for linux/bpf.h. Most of these ones are architecture
independent, so I just do the same '__u32 :32' that you
suggested above. For bpf_cgroup_storage_key and
bpf_attr::link_create::{tracing,tcx,expected_revision,cgroup}
there is an additional problem sinc ethe 64-bit fields
use __u64 instead of __aligned_u64.
This makes the structure layout incompatible between
i386 and x86_64. In the version below I use a
__uapi_arch_pad32 macro to have architecture specific
padding that keeps the existing behavior, but this
technically also requires adding a compat syscall
on x86 (but no other compat architectures) to convert
between the two layouts.
Using __aligned_u64 consistently here would have avoided
this problem, but changing it later is not an ABI
change that would affect every architecture with
unaligned __u64 (arc, csky, m68k, microblaze, nios2,
openrisc, sh and i386).
Arnd
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index aec171ccb6ef..0f0ec00cae4a 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -111,7 +111,8 @@ struct bpf_lpm_trie_key_u8 {
struct bpf_cgroup_storage_key {
__u64 cgroup_inode_id; /* cgroup inode id */
__u32 attach_type; /* program attach type (enum bpf_attach_type) */
-};
+ __uapi_arch_pad32;
+} __uapi_arch_align;
enum bpf_cgroup_iter_order {
BPF_CGROUP_ITER_ORDER_UNSPEC = 0,
@@ -1562,10 +1564,12 @@ union bpf_attr {
__aligned_u64 excl_prog_hash;
/* Size of the passed excl_prog_hash. */
__u32 excl_prog_hash_size;
+ __u32 :32;
};
struct { /* anonymous struct used by BPF_MAP_*_ELEM and BPF_MAP_FREEZE commands */
__u32 map_fd;
+ __u32 :32;
__aligned_u64 key;
union {
__aligned_u64 value;
@@ -1668,6 +1672,7 @@ union bpf_attr {
* if BPF_F_PATH_FD flag is not set, AT_FDCWD is assumed.
*/
__s32 path_fd;
+ __u32 :32;
};
struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */
@@ -1708,6 +1713,7 @@ union bpf_attr {
__u32 flags;
__u32 cpu;
__u32 batch_size;
+ __u32 :32;
} test;
struct { /* anonymous struct used by BPF_*_GET_*_ID */
@@ -1809,6 +1815,7 @@ union bpf_attr {
struct {
__aligned_u64 iter_info; /* extra bpf_iter_link_info */
__u32 iter_info_len; /* iter_info length */
+ __u32 :32;
};
struct {
/* black box user-provided value passed through
@@ -1827,12 +1834,13 @@ union bpf_attr {
struct {
/* this is overlaid with the target_btf_id above. */
__u32 target_btf_id;
+ __uapi_arch_pad32;
/* black box user-provided value passed through
* to BPF program at the execution time and
* accessible through bpf_get_attach_cookie() BPF helper
*/
__u64 cookie;
- } tracing;
+ } __uapi_arch_align tracing;
struct {
__u32 pf;
__u32 hooknum;
@@ -1844,8 +1852,9 @@ union bpf_attr {
__u32 relative_fd;
__u32 relative_id;
};
+ __uapi_arch_pad32;
__u64 expected_revision;
- } tcx;
+ } __uapi_arch_align tcx;
struct {
__aligned_u64 path;
__aligned_u64 offsets;
@@ -1854,12 +1863,14 @@ union bpf_attr {
__u32 cnt;
__u32 flags;
__u32 pid;
+ __u32 :32;
} uprobe_multi;
struct {
union {
__u32 relative_fd;
__u32 relative_id;
};
+ __uapi_arch_pad32;
__u64 expected_revision;
} netkit;
struct {
@@ -1867,6 +1878,7 @@ union bpf_attr {
__u32 relative_fd;
__u32 relative_id;
};
+ __uapi_arch_pad32;
__u64 expected_revision;
} cgroup;
};
@@ -1922,6 +1934,7 @@ union bpf_attr {
__u32 stream_buf_len;
__u32 stream_id;
__u32 prog_fd;
+ __u32 :32;
} prog_stream_read;
struct {
@@ -6648,6 +6661,7 @@ struct sk_reuseport_md {
__u32 ip_protocol; /* IP protocol. e.g. IPPROTO_TCP, IPPROTO_UDP */
__u32 bind_inany; /* Is sock bound to an INANY address? */
__u32 hash; /* A hash of the packet 4 tuples */
+ __u32 :32;
/* When reuse->migrating_sk is NULL, it is selecting a sk for the
* new incoming connection request (e.g. selecting a listen sk for
* the received SYN in the TCP case). reuse->sk is one of the sk
@@ -6706,6 +6720,7 @@ struct bpf_prog_info {
__u32 verified_insns;
__u32 attach_btf_obj_id;
__u32 attach_btf_id;
+ __u32 :32; /* alignment pad */
} __attribute__((aligned(8)));
struct bpf_map_info {
@@ -6727,6 +6742,7 @@ struct bpf_map_info {
__u64 map_extra;
__aligned_u64 hash;
__u32 hash_size;
+ __u32 :32; /* alignment pad */
} __attribute__((aligned(8)));
struct bpf_btf_info {
@@ -6742,6 +6758,7 @@ struct bpf_link_info {
__u32 type;
__u32 id;
__u32 prog_id;
+ __u32 :32; /* pad to alignof(__aligned_u64) */
union {
struct {
__aligned_u64 tp_name; /* in/out: tp_name buffer ptr */
@@ -6759,6 +6776,7 @@ struct bpf_link_info {
struct {
__u64 cgroup_id;
__u32 attach_type;
+ __uapi_arch_pad32;
} cgroup;
struct {
__aligned_u64 target_name; /* in/out: target_name buffer ptr */
@@ -6777,11 +6795,16 @@ struct bpf_link_info {
struct {
__u64 cgroup_id;
__u32 order;
+ __uapi_arch_pad32;
} cgroup;
struct {
__u32 tid;
__u32 pid;
} task;
+ struct {
+ __u64 :64;
+ __u64 :64;
+ };
};
} iter;
struct {
@@ -6896,6 +6919,7 @@ struct bpf_sock_addr {
__u32 msg_src_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write.
* Stored in network byte order.
*/
+ __u32 :32; /* pad to alignof(u64) */
__bpf_md_ptr(struct bpf_sock *, sk);
};
@@ -7555,6 +7579,7 @@ struct bpf_sk_lookup {
__u32 local_ip6[4]; /* Network byte order */
__u32 local_port; /* Host byte order */
__u32 ingress_ifindex; /* The arriving interface. Determined by inet_iif. */
+ __u32 :32;
};
/*
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr
2026-05-19 20:52 ` Song Liu
@ 2026-05-20 7:51 ` Geert Uytterhoeven
0 siblings, 0 replies; 8+ messages in thread
From: Geert Uytterhoeven @ 2026-05-20 7:51 UTC (permalink / raw)
To: Song Liu
Cc: Arnd Bergmann, Alexei Starovoitov, Daniel Borkmann,
Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi,
Leon Hwang, Arnd Bergmann, Martin KaFai Lau, Yonghong Song,
Jiri Olsa, KP Singh, bpf, linux-kernel
Hi Song,
On Tue, 19 May 2026 at 22:52, Song Liu <song@kernel.org> wrote:
> On Tue, May 19, 2026 at 1:39 PM Arnd Bergmann <arnd@kernel.org> wrote:
> >
> > From: Arnd Bergmann <arnd@arndb.de>
> >
> > Building linux/bpf.h with -Wpadded shows an unintentionally
> > added portion of padding because of the 64-bit alignment:
> >
> > ./usr/include/linux/bpf.h:1510:1: error: padding struct size to alignment boundary with 4 bytes [-Werror=padded]
> >
> > Avoid this by adding explicit padding.
> >
> > Fixes: f28771c0691b ("bpf: Extend BPF syscall with common attributes support")
> > Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> > ---
> > include/uapi/linux/bpf.h | 1 +
> > 1 file changed, 1 insertion(+)
> >
> > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> > index cc4c0b62cdfa..0f0ec00cae4a 100644
> > --- a/include/uapi/linux/bpf.h
> > +++ b/include/uapi/linux/bpf.h
> > @@ -1507,6 +1507,7 @@ struct bpf_common_attr {
> > __u32 log_size;
> > __u32 log_level;
> > __u32 log_true_size;
> > + __u32 __pad;
> > };
>
> Can we instead add "__attribute__((aligned(8)));" here?
That won't help:
1. The structure is already aligned to 8 bytes, as the first member
(out of context) is of type __aligned_u64,
2. Without explicit padding, there would still be an implicit hole
at the end of the structure, causing a warning with -Wpadded.
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] 8+ messages in thread
* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr
2026-05-20 6:36 ` Arnd Bergmann
@ 2026-05-20 14:03 ` Alexei Starovoitov
2026-05-20 14:22 ` Geert Uytterhoeven
0 siblings, 1 reply; 8+ messages in thread
From: Alexei Starovoitov @ 2026-05-20 14:03 UTC (permalink / raw)
To: Arnd Bergmann
Cc: Yonghong Song, Arnd Bergmann, Alexei Starovoitov,
Daniel Borkmann, Andrii Nakryiko, Eduard Zingerman,
Kumar Kartikeya Dwivedi, Leon Hwang, Martin KaFai Lau, Song Liu,
Jiri Olsa, KP Singh, bpf, LKML
On Wed, May 20, 2026 at 8:39 AM Arnd Bergmann <arnd@arndb.de> wrote:
>
> On Wed, May 20, 2026, at 00:17, Yonghong Song wrote:
> > On 5/19/26 1:38 PM, Arnd Bergmann wrote:
> >> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> >> index cc4c0b62cdfa..0f0ec00cae4a 100644
> >> --- a/include/uapi/linux/bpf.h
> >> +++ b/include/uapi/linux/bpf.h
> >> @@ -1507,6 +1507,7 @@ struct bpf_common_attr {
> >> __u32 log_size;
> >> __u32 log_level;
> >> __u32 log_true_size;
> >> + __u32 __pad;
> >
> > Let us make it as
> > __u32 :32;
> > ?
> > This can avoid people to use the '__pad' name.
>
> Sure. Do you want me to resend, are are you going to change
> it yourself?
No need to add a pad.
The issue was fixed in commit f05ddc6771c4 ("bpf: Check tail zero of
bpf_common_attr using offsetofend")
pw-bot: cr
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] bpf: avoid padding in struct bpf_common_attr
2026-05-20 14:03 ` Alexei Starovoitov
@ 2026-05-20 14:22 ` Geert Uytterhoeven
0 siblings, 0 replies; 8+ messages in thread
From: Geert Uytterhoeven @ 2026-05-20 14:22 UTC (permalink / raw)
To: Alexei Starovoitov
Cc: Arnd Bergmann, Yonghong Song, Arnd Bergmann, Alexei Starovoitov,
Daniel Borkmann, Andrii Nakryiko, Eduard Zingerman,
Kumar Kartikeya Dwivedi, Leon Hwang, Martin KaFai Lau, Song Liu,
Jiri Olsa, KP Singh, bpf, LKML
Hi Alexei,
On Wed, 20 May 2026 at 16:03, Alexei Starovoitov
<alexei.starovoitov@gmail.com> wrote:
> On Wed, May 20, 2026 at 8:39 AM Arnd Bergmann <arnd@arndb.de> wrote:
> > On Wed, May 20, 2026, at 00:17, Yonghong Song wrote:
> > > On 5/19/26 1:38 PM, Arnd Bergmann wrote:
> > >> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> > >> index cc4c0b62cdfa..0f0ec00cae4a 100644
> > >> --- a/include/uapi/linux/bpf.h
> > >> +++ b/include/uapi/linux/bpf.h
> > >> @@ -1507,6 +1507,7 @@ struct bpf_common_attr {
> > >> __u32 log_size;
> > >> __u32 log_level;
> > >> __u32 log_true_size;
> > >> + __u32 __pad;
> > >
> > > Let us make it as
> > > __u32 :32;
> > > ?
> > > This can avoid people to use the '__pad' name.
> >
> > Sure. Do you want me to resend, are are you going to change
> > it yourself?
>
> No need to add a pad.
> The issue was fixed in commit f05ddc6771c4 ("bpf: Check tail zero of
> bpf_common_attr using offsetofend")
I am afraid that commit does not fix any -Wpadded warnings?
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] 8+ messages in thread
end of thread, other threads:[~2026-05-20 14:22 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-05-19 20:38 [PATCH] bpf: avoid padding in struct bpf_common_attr Arnd Bergmann
2026-05-19 20:52 ` Song Liu
2026-05-20 7:51 ` Geert Uytterhoeven
2026-05-19 21:17 ` bot+bpf-ci
2026-05-19 22:17 ` Yonghong Song
2026-05-20 6:36 ` Arnd Bergmann
2026-05-20 14:03 ` Alexei Starovoitov
2026-05-20 14:22 ` Geert Uytterhoeven
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®