From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org,
Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Maarten Lankhorst <maarten.lankhorst@canonical.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
Ingo Molnar <mingo@kernel.org>,
peterz@infradead.org, imirkin@alum.mit.edu,
daniel.vetter@ffwll.ch, robdclark@gmail.com
Subject: [PATCH 3.11 89/94] mutex: Avoid gcc version dependent __builtin_constant_p() usage
Date: Fri, 8 Nov 2013 22:52:35 -0800 [thread overview]
Message-ID: <20131109065210.539422941@linuxfoundation.org> (raw)
In-Reply-To: <20131109065204.252462489@linuxfoundation.org>
3.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
commit b0267507dfd0187fb7840a0ec461a510a7f041c5 upstream.
Commit 040a0a37 ("mutex: Add support for wound/wait style locks")
used "!__builtin_constant_p(p == NULL)" but gcc 3.x cannot
handle such expression correctly, leading to boot failure when
built with CONFIG_DEBUG_MUTEXES=y.
Fix it by explicitly passing a bool which tells whether p != NULL
or not.
[ PeterZ: This is a sad patch, but provided it actually generates
similar code I suppose its the best we can do bar whole
sale deprecating gcc-3. ]
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
Cc: peterz@infradead.org
Cc: imirkin@alum.mit.edu
Cc: daniel.vetter@ffwll.ch
Cc: robdclark@gmail.com
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Link: http://lkml.kernel.org/r/201310171945.AGB17114.FSQVtHOJFOOFML@I-love.SAKURA.ne.jp
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
kernel/mutex.c | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
--- a/kernel/mutex.c
+++ b/kernel/mutex.c
@@ -408,7 +408,7 @@ ww_mutex_set_context_fastpath(struct ww_
static __always_inline int __sched
__mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
struct lockdep_map *nest_lock, unsigned long ip,
- struct ww_acquire_ctx *ww_ctx)
+ struct ww_acquire_ctx *ww_ctx, const bool use_ww_ctx)
{
struct task_struct *task = current;
struct mutex_waiter waiter;
@@ -448,7 +448,7 @@ __mutex_lock_common(struct mutex *lock,
struct task_struct *owner;
struct mspin_node node;
- if (!__builtin_constant_p(ww_ctx == NULL) && ww_ctx->acquired > 0) {
+ if (use_ww_ctx && ww_ctx->acquired > 0) {
struct ww_mutex *ww;
ww = container_of(lock, struct ww_mutex, base);
@@ -478,7 +478,7 @@ __mutex_lock_common(struct mutex *lock,
if ((atomic_read(&lock->count) == 1) &&
(atomic_cmpxchg(&lock->count, 1, 0) == 1)) {
lock_acquired(&lock->dep_map, ip);
- if (!__builtin_constant_p(ww_ctx == NULL)) {
+ if (use_ww_ctx) {
struct ww_mutex *ww;
ww = container_of(lock, struct ww_mutex, base);
@@ -548,7 +548,7 @@ slowpath:
goto err;
}
- if (!__builtin_constant_p(ww_ctx == NULL) && ww_ctx->acquired > 0) {
+ if (use_ww_ctx && ww_ctx->acquired > 0) {
ret = __mutex_lock_check_stamp(lock, ww_ctx);
if (ret)
goto err;
@@ -568,7 +568,7 @@ done:
mutex_remove_waiter(lock, &waiter, current_thread_info());
mutex_set_owner(lock);
- if (!__builtin_constant_p(ww_ctx == NULL)) {
+ if (use_ww_ctx) {
struct ww_mutex *ww = container_of(lock,
struct ww_mutex,
base);
@@ -618,7 +618,7 @@ mutex_lock_nested(struct mutex *lock, un
{
might_sleep();
__mutex_lock_common(lock, TASK_UNINTERRUPTIBLE,
- subclass, NULL, _RET_IP_, NULL);
+ subclass, NULL, _RET_IP_, NULL, 0);
}
EXPORT_SYMBOL_GPL(mutex_lock_nested);
@@ -628,7 +628,7 @@ _mutex_lock_nest_lock(struct mutex *lock
{
might_sleep();
__mutex_lock_common(lock, TASK_UNINTERRUPTIBLE,
- 0, nest, _RET_IP_, NULL);
+ 0, nest, _RET_IP_, NULL, 0);
}
EXPORT_SYMBOL_GPL(_mutex_lock_nest_lock);
@@ -638,7 +638,7 @@ mutex_lock_killable_nested(struct mutex
{
might_sleep();
return __mutex_lock_common(lock, TASK_KILLABLE,
- subclass, NULL, _RET_IP_, NULL);
+ subclass, NULL, _RET_IP_, NULL, 0);
}
EXPORT_SYMBOL_GPL(mutex_lock_killable_nested);
@@ -647,7 +647,7 @@ mutex_lock_interruptible_nested(struct m
{
might_sleep();
return __mutex_lock_common(lock, TASK_INTERRUPTIBLE,
- subclass, NULL, _RET_IP_, NULL);
+ subclass, NULL, _RET_IP_, NULL, 0);
}
EXPORT_SYMBOL_GPL(mutex_lock_interruptible_nested);
@@ -685,7 +685,7 @@ __ww_mutex_lock(struct ww_mutex *lock, s
might_sleep();
ret = __mutex_lock_common(&lock->base, TASK_UNINTERRUPTIBLE,
- 0, &ctx->dep_map, _RET_IP_, ctx);
+ 0, &ctx->dep_map, _RET_IP_, ctx, 1);
if (!ret && ctx->acquired > 1)
return ww_mutex_deadlock_injection(lock, ctx);
@@ -700,7 +700,7 @@ __ww_mutex_lock_interruptible(struct ww_
might_sleep();
ret = __mutex_lock_common(&lock->base, TASK_INTERRUPTIBLE,
- 0, &ctx->dep_map, _RET_IP_, ctx);
+ 0, &ctx->dep_map, _RET_IP_, ctx, 1);
if (!ret && ctx->acquired > 1)
return ww_mutex_deadlock_injection(lock, ctx);
@@ -812,28 +812,28 @@ __mutex_lock_slowpath(atomic_t *lock_cou
struct mutex *lock = container_of(lock_count, struct mutex, count);
__mutex_lock_common(lock, TASK_UNINTERRUPTIBLE, 0,
- NULL, _RET_IP_, NULL);
+ NULL, _RET_IP_, NULL, 0);
}
static noinline int __sched
__mutex_lock_killable_slowpath(struct mutex *lock)
{
return __mutex_lock_common(lock, TASK_KILLABLE, 0,
- NULL, _RET_IP_, NULL);
+ NULL, _RET_IP_, NULL, 0);
}
static noinline int __sched
__mutex_lock_interruptible_slowpath(struct mutex *lock)
{
return __mutex_lock_common(lock, TASK_INTERRUPTIBLE, 0,
- NULL, _RET_IP_, NULL);
+ NULL, _RET_IP_, NULL, 0);
}
static noinline int __sched
__ww_mutex_lock_slowpath(struct ww_mutex *lock, struct ww_acquire_ctx *ctx)
{
return __mutex_lock_common(&lock->base, TASK_UNINTERRUPTIBLE, 0,
- NULL, _RET_IP_, ctx);
+ NULL, _RET_IP_, ctx, 1);
}
static noinline int __sched
@@ -841,7 +841,7 @@ __ww_mutex_lock_interruptible_slowpath(s
struct ww_acquire_ctx *ctx)
{
return __mutex_lock_common(&lock->base, TASK_INTERRUPTIBLE, 0,
- NULL, _RET_IP_, ctx);
+ NULL, _RET_IP_, ctx, 1);
}
#endif
next prev parent reply other threads:[~2013-11-09 6:57 UTC|newest]
Thread overview: 100+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-09 6:51 [PATCH 3.11 00/94] 3.11.8-stable review Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 01/94] usb: musb: start musb on the udc side, too Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 02/94] usb-storage: add quirk for mandatory READ_CAPACITY_16 Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 03/94] USB: support new huawei devices in option.c Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 04/94] USB: quirks.c: add one device that cannot deal with suspension Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 05/94] USB: quirks: add touchscreen that is dazzeled by remote wakeup Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 06/94] USB: serial: ftdi_sio: add id for Z3X Box device Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 07/94] xhci: Dont enable/disable RWE on bus suspend/resume Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 08/94] cifs: Fix inability to write files >2GB to SMB2/3 shares Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 09/94] x86: Update UV3 hub revision ID Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 10/94] cpufreq: s3c64xx: Rename index to driver_data Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 11/94] cpufreq / intel_pstate: Fix max_perf_pct on resume Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 12/94] bcache: Fixed incorrect order of arguments to bio_alloc_bioset() Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 13/94] HID: wiimote: add LEGO-wiimote VID Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 14/94] cgroup: fix to break the while loop in cgroup_attach_task() correctly Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 15/94] mac80211: correctly close cancelled scans Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 16/94] mac80211: drop spoofed packets in ad-hoc mode Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 17/94] mac80211: use sta_info_get_bss() for nl80211 tx and client probing Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 18/94] mac80211: update sta->last_rx on acked tx frames Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 19/94] mac80211: fix crash if bitrate calculation goes wrong Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 20/94] ath9k: fix tx queue scheduling after channel changes Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 21/94] cfg80211: use the correct macro to check for active monitor support Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 22/94] cfg80211: fix warning when using WEXT for IBSS Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 23/94] mwifiex: fix SDIO interrupt lost issue Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 24/94] rtlwifi: rtl8192cu: Fix error in pointer arithmetic Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 25/94] iwlwifi: mvm: call ieee80211_scan_completed when needed Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 26/94] iwlwifi: pcie: add SKUs for 6000, 6005 and 6235 series Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 27/94] jfs: fix error path in ialloc Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 28/94] can: at91-can: fix device to driver data mapping for platform devices Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 29/94] can: flexcan: fix mx28 detection by rearanging OF match table Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 30/94] can: flexcan: flexcan_chip_start: fix regression, mark one MB for TX and abort pending TX Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 31/94] SCSI: BusLogic: Fix an oops when intializing multimaster adapter Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 32/94] SCSI: sd: call blk_pm_runtime_init before add_disk Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 33/94] ecryptfs: Fix memory leakage in keystore.c Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 34/94] eCryptfs: fix 32 bit corruption issue Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 35/94] raid5: set bio bi_vcnt 0 for discard request Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 36/94] raid5: avoid finding "discard" stripe Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 37/94] libata: make ata_eh_qc_retry() bump scmd->allowed on bogus failures Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 38/94] Revert "rt2x00pci: Use PCI MSIs whenever possible" Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 39/94] Revert "epoll: use freezable blocking call" Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 40/94] Revert "select: " Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 41/94] md: avoid deadlock when md_set_badblocks Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 42/94] md: Fix skipping recovery for read-only arrays Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 43/94] target: Fix assignment of LUN in tracepoints Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 44/94] target/pscsi: fix return value check Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 45/94] vhost/scsi: Fix incorrect usage of get_user_pages_fast write parameter Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 46/94] clockevents: Sanitize ticks to nsec conversion Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 47/94] parisc: Do not crash 64bit SMP kernels on machines with >= 4GB RAM Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 48/94] scripts/kallsyms: filter symbols not in kernel address space Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 49/94] ARC: Incorrect mm reference used in vmalloc fault handler Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 50/94] ALSA: hda - Add missing initial vmaster hook at build_controls callback Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 51/94] ALSA: hda - Fix unbalanced runtime PM refcount after S3/S4 Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 52/94] ALSA: hda - Add a fixup for ASUS N76VZ Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.11 53/94] ALSA: fix oops in snd_pcm_info() caused by ASoC DPCM Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 54/94] ASoC: wm_hubs: Add missing break in hp_supply_event() Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 55/94] ASoC: dapm: Fix source list debugfs outputs Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 56/94] staging: ozwpan: prevent overflow in oz_cdev_write() Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 57/94] Staging: bcm: info leak in ioctl Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 58/94] Staging: sb105x: info leak in mp_get_count() Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 59/94] staging: wlags49_h2: buffer overflow setting station name Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 60/94] uml: check length in exitcode_proc_write() Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 61/94] xtensa: dont use alternate signal stack on threads Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 62/94] mm: make generic_access_phys available for modules Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 63/94] uio: provide vm access to UIO_MEM_PHYS maps Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 65/94] lib/scatterlist.c: dont flush_kernel_dcache_page on slab page Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 66/94] aacraid: missing capable() check in compat ioctl Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 67/94] clk: fixup argument order when setting VCO parameters Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 68/94] clk: nomadik: set all timers to use 2.4 MHz TIMCLK Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 69/94] mm: numa: Do not account for a hinting fault if we raced Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 70/94] mm: Wait for THP migrations to complete during NUMA hinting faults Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 71/94] mm: Prevent parallel splits during THP migration Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 72/94] mm: numa: Sanitize task_numa_fault() callsites Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 73/94] mm: Close races between THP migration and PMD numa clearing Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 74/94] mm: Account for a THP NUMA hinting update as one PTE update Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 75/94] mm: /proc/pid/pagemap: inspect _PAGE_SOFT_DIRTY only on present pages Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 76/94] mm/pagewalk.c: fix walk_page_range() access of wrong PTEs Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 77/94] drm/vmwgfx: Dont put resources with invalid ids on lru list Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 78/94] drm/vmwgfx: Dont kill clients on VT switch Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 79/94] drm/i915: split aux_clock_divider logic in a separated function for reuse Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 80/94] drm/i915: Retry DP aux_ch communications with a different clock after failure Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 81/94] drm: Prevent overwriting from userspace underallocating core ioctl structs Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 82/94] drm: Pad drm_mode_get_connector to 64-bit boundary Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 83/94] drm/radeon/atom: workaround vbios bug in transmitter table on rs780 Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 84/94] drm/radeon: make missing smc ucode non-fatal (r7xx-SI) Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 85/94] drm/i915: Add HSW CRT output readout support Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 86/94] drm/i915: Add support for pipe_bpp readout Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 87/94] drm/i915: No LVDS hardware on Intel D410PT and D425KT Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 88/94] drm/i915: Fix the PPT fdi lane bifurcate state handling on ivb Greg Kroah-Hartman
2013-11-09 6:52 ` Greg Kroah-Hartman [this message]
2013-11-09 6:52 ` [PATCH 3.11 90/94] seq_file: always update file->f_pos in seq_lseek() Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 91/94] NTB: Add Error Handling in ntb_device_setup Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 92/94] NTB: Correct Number of Scratch Pad Registers Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 93/94] NTB: Correct USD/DSD Identification Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.11 94/94] NTB: Correct debugfs to work with more than 1 NTB Device Greg Kroah-Hartman
2013-11-09 17:00 ` [PATCH 3.11 00/94] 3.11.8-stable review Guenter Roeck
2013-11-09 17:12 ` Greg Kroah-Hartman
2013-11-10 12:11 ` Satoru Takeuchi
2013-11-10 15:15 ` Greg Kroah-Hartman
2013-11-11 17:57 ` Shuah Khan
2013-11-11 22:51 ` Greg Kroah-Hartman
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=20131109065210.539422941@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=daniel.vetter@ffwll.ch \
--cc=imirkin@alum.mit.edu \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@canonical.com \
--cc=mingo@kernel.org \
--cc=penguin-kernel@I-love.SAKURA.ne.jp \
--cc=peterz@infradead.org \
--cc=robdclark@gmail.com \
--cc=stable@vger.kernel.org \
--cc=torvalds@linux-foundation.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
Powered by JetHome