From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Seiji Aguchi <seiji.aguchi@hds.com>,
Madper Xie <cxie@redhat.com>,
Matt Fleming <matt.fleming@intel.com>
Subject: [PATCH 3.12 30/62] efivars, efi-pstore: Hold off deletion of sysfs entry until the scan is completed
Date: Tue, 10 Dec 2013 00:01:01 -0800 [thread overview]
Message-ID: <20131210080059.560895664@linuxfoundation.org> (raw)
In-Reply-To: <20131210080057.415644748@linuxfoundation.org>
3.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Seiji Aguchi <seiji.aguchi@hds.com>
commit e0d59733f6b1796b8d6692642c87d7dd862c3e3a upstream.
Currently, when mounting pstore file system, a read callback of
efi_pstore driver runs mutiple times as below.
- In the first read callback, scan efivar_sysfs_list from head and pass
a kmsg buffer of a entry to an upper pstore layer.
- In the second read callback, rescan efivar_sysfs_list from the entry
and pass another kmsg buffer to it.
- Repeat the scan and pass until the end of efivar_sysfs_list.
In this process, an entry is read across the multiple read function
calls. To avoid race between the read and erasion, the whole process
above is protected by a spinlock, holding in open() and releasing in
close().
At the same time, kmemdup() is called to pass the buffer to pstore
filesystem during it. And then, it causes a following lockdep warning.
To make the dynamic memory allocation runnable without taking spinlock,
holding off a deletion of sysfs entry if it happens while scanning it
via efi_pstore, and deleting it after the scan is completed.
To implement it, this patch introduces two flags, scanning and deleting,
to efivar_entry.
On the code basis, it seems that all the scanning and deleting logic is
not needed because __efivars->lock are not dropped when reading from the
EFI variable store.
But, the scanning and deleting logic is still needed because an
efi-pstore and a pstore filesystem works as follows.
In case an entry(A) is found, the pointer is saved to psi->data. And
efi_pstore_read() passes the entry(A) to a pstore filesystem by
releasing __efivars->lock.
And then, the pstore filesystem calls efi_pstore_read() again and the
same entry(A), which is saved to psi->data, is used for resuming to scan
a sysfs-list.
So, to protect the entry(A), the logic is needed.
[ 1.143710] ------------[ cut here ]------------
[ 1.144058] WARNING: CPU: 1 PID: 1 at kernel/lockdep.c:2740 lockdep_trace_alloc+0x104/0x110()
[ 1.144058] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
[ 1.144058] Modules linked in:
[ 1.144058] CPU: 1 PID: 1 Comm: systemd Not tainted 3.11.0-rc5 #2
[ 1.144058] 0000000000000009 ffff8800797e9ae0 ffffffff816614a5 ffff8800797e9b28
[ 1.144058] ffff8800797e9b18 ffffffff8105510d 0000000000000080 0000000000000046
[ 1.144058] 00000000000000d0 00000000000003af ffffffff81ccd0c0 ffff8800797e9b78
[ 1.144058] Call Trace:
[ 1.144058] [<ffffffff816614a5>] dump_stack+0x54/0x74
[ 1.144058] [<ffffffff8105510d>] warn_slowpath_common+0x7d/0xa0
[ 1.144058] [<ffffffff8105517c>] warn_slowpath_fmt+0x4c/0x50
[ 1.144058] [<ffffffff8131290f>] ? vsscanf+0x57f/0x7b0
[ 1.144058] [<ffffffff810bbd74>] lockdep_trace_alloc+0x104/0x110
[ 1.144058] [<ffffffff81192da0>] __kmalloc_track_caller+0x50/0x280
[ 1.144058] [<ffffffff815147bb>] ? efi_pstore_read_func.part.1+0x12b/0x170
[ 1.144058] [<ffffffff8115b260>] kmemdup+0x20/0x50
[ 1.144058] [<ffffffff815147bb>] efi_pstore_read_func.part.1+0x12b/0x170
[ 1.144058] [<ffffffff81514800>] ? efi_pstore_read_func.part.1+0x170/0x170
[ 1.144058] [<ffffffff815148b4>] efi_pstore_read_func+0xb4/0xe0
[ 1.144058] [<ffffffff81512b7b>] __efivar_entry_iter+0xfb/0x120
[ 1.144058] [<ffffffff8151428f>] efi_pstore_read+0x3f/0x50
[ 1.144058] [<ffffffff8128d7ba>] pstore_get_records+0x9a/0x150
[ 1.158207] [<ffffffff812af25c>] ? selinux_d_instantiate+0x1c/0x20
[ 1.158207] [<ffffffff8128ce30>] ? parse_options+0x80/0x80
[ 1.158207] [<ffffffff8128ced5>] pstore_fill_super+0xa5/0xc0
[ 1.158207] [<ffffffff811ae7d2>] mount_single+0xa2/0xd0
[ 1.158207] [<ffffffff8128ccf8>] pstore_mount+0x18/0x20
[ 1.158207] [<ffffffff811ae8b9>] mount_fs+0x39/0x1b0
[ 1.158207] [<ffffffff81160550>] ? __alloc_percpu+0x10/0x20
[ 1.158207] [<ffffffff811c9493>] vfs_kern_mount+0x63/0xf0
[ 1.158207] [<ffffffff811cbb0e>] do_mount+0x23e/0xa20
[ 1.158207] [<ffffffff8115b51b>] ? strndup_user+0x4b/0xf0
[ 1.158207] [<ffffffff811cc373>] SyS_mount+0x83/0xc0
[ 1.158207] [<ffffffff81673cc2>] system_call_fastpath+0x16/0x1b
[ 1.158207] ---[ end trace 61981bc62de9f6f4 ]---
Signed-off-by: Seiji Aguchi <seiji.aguchi@hds.com>
Tested-by: Madper Xie <cxie@redhat.com>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/firmware/efi/efi-pstore.c | 143 +++++++++++++++++++++++++++++++++++---
drivers/firmware/efi/efivars.c | 12 ++-
drivers/firmware/efi/vars.c | 12 ++-
include/linux/efi.h | 4 +
4 files changed, 155 insertions(+), 16 deletions(-)
--- a/drivers/firmware/efi/efi-pstore.c
+++ b/drivers/firmware/efi/efi-pstore.c
@@ -18,14 +18,12 @@ module_param_named(pstore_disable, efiva
static int efi_pstore_open(struct pstore_info *psi)
{
- efivar_entry_iter_begin();
psi->data = NULL;
return 0;
}
static int efi_pstore_close(struct pstore_info *psi)
{
- efivar_entry_iter_end();
psi->data = NULL;
return 0;
}
@@ -91,19 +89,125 @@ static int efi_pstore_read_func(struct e
__efivar_entry_get(entry, &entry->var.Attributes,
&entry->var.DataSize, entry->var.Data);
size = entry->var.DataSize;
+ memcpy(*cb_data->buf, entry->var.Data,
+ (size_t)min_t(unsigned long, EFIVARS_DATA_SIZE_MAX, size));
- *cb_data->buf = kmemdup(entry->var.Data, size, GFP_KERNEL);
- if (*cb_data->buf == NULL)
- return -ENOMEM;
return size;
}
+/**
+ * efi_pstore_scan_sysfs_enter
+ * @entry: scanning entry
+ * @next: next entry
+ * @head: list head
+ */
+static void efi_pstore_scan_sysfs_enter(struct efivar_entry *pos,
+ struct efivar_entry *next,
+ struct list_head *head)
+{
+ pos->scanning = true;
+ if (&next->list != head)
+ next->scanning = true;
+}
+
+/**
+ * __efi_pstore_scan_sysfs_exit
+ * @entry: deleting entry
+ * @turn_off_scanning: Check if a scanning flag should be turned off
+ */
+static inline void __efi_pstore_scan_sysfs_exit(struct efivar_entry *entry,
+ bool turn_off_scanning)
+{
+ if (entry->deleting) {
+ list_del(&entry->list);
+ efivar_entry_iter_end();
+ efivar_unregister(entry);
+ efivar_entry_iter_begin();
+ } else if (turn_off_scanning)
+ entry->scanning = false;
+}
+
+/**
+ * efi_pstore_scan_sysfs_exit
+ * @pos: scanning entry
+ * @next: next entry
+ * @head: list head
+ * @stop: a flag checking if scanning will stop
+ */
+static void efi_pstore_scan_sysfs_exit(struct efivar_entry *pos,
+ struct efivar_entry *next,
+ struct list_head *head, bool stop)
+{
+ __efi_pstore_scan_sysfs_exit(pos, true);
+ if (stop)
+ __efi_pstore_scan_sysfs_exit(next, &next->list != head);
+}
+
+/**
+ * efi_pstore_sysfs_entry_iter
+ *
+ * @data: function-specific data to pass to callback
+ * @pos: entry to begin iterating from
+ *
+ * You MUST call efivar_enter_iter_begin() before this function, and
+ * efivar_entry_iter_end() afterwards.
+ *
+ * It is possible to begin iteration from an arbitrary entry within
+ * the list by passing @pos. @pos is updated on return to point to
+ * the next entry of the last one passed to efi_pstore_read_func().
+ * To begin iterating from the beginning of the list @pos must be %NULL.
+ */
+static int efi_pstore_sysfs_entry_iter(void *data, struct efivar_entry **pos)
+{
+ struct efivar_entry *entry, *n;
+ struct list_head *head = &efivar_sysfs_list;
+ int size = 0;
+
+ if (!*pos) {
+ list_for_each_entry_safe(entry, n, head, list) {
+ efi_pstore_scan_sysfs_enter(entry, n, head);
+
+ size = efi_pstore_read_func(entry, data);
+ efi_pstore_scan_sysfs_exit(entry, n, head, size < 0);
+ if (size)
+ break;
+ }
+ *pos = n;
+ return size;
+ }
+
+ list_for_each_entry_safe_from((*pos), n, head, list) {
+ efi_pstore_scan_sysfs_enter((*pos), n, head);
+
+ size = efi_pstore_read_func((*pos), data);
+ efi_pstore_scan_sysfs_exit((*pos), n, head, size < 0);
+ if (size)
+ break;
+ }
+ *pos = n;
+ return size;
+}
+
+/**
+ * efi_pstore_read
+ *
+ * This function returns a size of NVRAM entry logged via efi_pstore_write().
+ * The meaning and behavior of efi_pstore/pstore are as below.
+ *
+ * size > 0: Got data of an entry logged via efi_pstore_write() successfully,
+ * and pstore filesystem will continue reading subsequent entries.
+ * size == 0: Entry was not logged via efi_pstore_write(),
+ * and efi_pstore driver will continue reading subsequent entries.
+ * size < 0: Failed to get data of entry logging via efi_pstore_write(),
+ * and pstore will stop reading entry.
+ */
static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
int *count, struct timespec *timespec,
char **buf, bool *compressed,
struct pstore_info *psi)
{
struct pstore_read_data data;
+ ssize_t size;
data.id = id;
data.type = type;
@@ -112,8 +216,17 @@ static ssize_t efi_pstore_read(u64 *id,
data.compressed = compressed;
data.buf = buf;
- return __efivar_entry_iter(efi_pstore_read_func, &efivar_sysfs_list, &data,
- (struct efivar_entry **)&psi->data);
+ *data.buf = kzalloc(EFIVARS_DATA_SIZE_MAX, GFP_KERNEL);
+ if (!*data.buf)
+ return -ENOMEM;
+
+ efivar_entry_iter_begin();
+ size = efi_pstore_sysfs_entry_iter(&data,
+ (struct efivar_entry **)&psi->data);
+ efivar_entry_iter_end();
+ if (size <= 0)
+ kfree(*data.buf);
+ return size;
}
static int efi_pstore_write(enum pstore_type_id type,
@@ -184,9 +297,17 @@ static int efi_pstore_erase_func(struct
return 0;
}
+ if (entry->scanning) {
+ /*
+ * Skip deletion because this entry will be deleted
+ * after scanning is completed.
+ */
+ entry->deleting = true;
+ } else
+ list_del(&entry->list);
+
/* found */
__efivar_entry_delete(entry);
- list_del(&entry->list);
return 1;
}
@@ -214,10 +335,12 @@ static int efi_pstore_erase(enum pstore_
efivar_entry_iter_begin();
found = __efivar_entry_iter(efi_pstore_erase_func, &efivar_sysfs_list, &edata, &entry);
- efivar_entry_iter_end();
- if (found)
+ if (found && !entry->scanning) {
+ efivar_entry_iter_end();
efivar_unregister(entry);
+ } else
+ efivar_entry_iter_end();
return 0;
}
--- a/drivers/firmware/efi/efivars.c
+++ b/drivers/firmware/efi/efivars.c
@@ -383,12 +383,16 @@ static ssize_t efivar_delete(struct file
else if (__efivar_entry_delete(entry))
err = -EIO;
- efivar_entry_iter_end();
-
- if (err)
+ if (err) {
+ efivar_entry_iter_end();
return err;
+ }
- efivar_unregister(entry);
+ if (!entry->scanning) {
+ efivar_entry_iter_end();
+ efivar_unregister(entry);
+ } else
+ efivar_entry_iter_end();
/* It's dead Jim.... */
return count;
--- a/drivers/firmware/efi/vars.c
+++ b/drivers/firmware/efi/vars.c
@@ -683,8 +683,16 @@ struct efivar_entry *efivar_entry_find(e
if (!found)
return NULL;
- if (remove)
- list_del(&entry->list);
+ if (remove) {
+ if (entry->scanning) {
+ /*
+ * The entry will be deleted
+ * after scanning is completed.
+ */
+ entry->deleting = true;
+ } else
+ list_del(&entry->list);
+ }
return entry;
}
--- a/include/linux/efi.h
+++ b/include/linux/efi.h
@@ -782,6 +782,8 @@ struct efivar_entry {
struct efi_variable var;
struct list_head list;
struct kobject kobj;
+ bool scanning;
+ bool deleting;
};
extern struct list_head efivar_sysfs_list;
@@ -840,6 +842,8 @@ void efivar_run_worker(void);
#if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)
int efivars_sysfs_init(void);
+#define EFIVARS_DATA_SIZE_MAX 1024
+
#endif /* CONFIG_EFI_VARS */
#endif /* _LINUX_EFI_H */
next prev parent reply other threads:[~2013-12-10 8:01 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-10 8:00 [PATCH 3.12 00/62] 3.12.5-stable review Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 01/62] ALSA: hda - Fix silent output on ASUS W7J laptop Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 02/62] ALSA: hda - Another fixup for ASUS laptop with ALC660 codec Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 03/62] ALSA: hda - Use always amps for auto-mute on AD1986A codec Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 04/62] ALSA: hda - Fix headset mic input after muted internal mic (Dell/Realtek) Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 05/62] ALSA: hda - Fix bad EAPD setup for HP machines with AD1984A Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 06/62] ALSA: hda - Fix silent output on MacBook Air 2,1 Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 07/62] ALSA: hda - Add mono speaker quirk for Dell Inspiron 5439 Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 08/62] crypto: s390 - Fix aes-xts parameter corruption Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 09/62] crypto: scatterwalk - Set the chain pointer indication bit Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 10/62] crypto: ccm - Fix handling of zero plaintext when computing mac Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 11/62] crypto: authenc - Find proper IV address in ablkcipher callback Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 12/62] ARM: fix booting low-vectors machines Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 13/62] ARM: footbridge: fix VGA initialisation Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 14/62] ARM: footbridge: fix EBSA285 LEDs Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 15/62] ARM: multi_v7_defconfig: enable SDHCI_BCM_KONA and MMC_BLOCK_MINORS=16 Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 16/62] ARM: dts: omap4-panda-common: Fix pin muxing for wl12xx Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 17/62] ARM: OMAPFB: panel-sony-acx565akm: fix bad unlock balance Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 18/62] ARM: at91: sama5d3: reduce TWI internal clock frequency Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 19/62] ARM: mvebu: second PCIe unit of Armada XP mv78230 is only x1 capable Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 20/62] ARM: mvebu: fix second and third PCIe unit of Armada XP mv78260 Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 21/62] ARM: mvebu: use the virtual CPU registers to access coherency registers Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 22/62] ARM: mvebu: re-enable PCIe on Armada 370 DB Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 23/62] ASoC: wm8990: Mark the register map as dirty when powering down Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 24/62] ASoC: dapm: Use SND_SOC_DAPM_INIT_REG_VAL in SND_SOC_DAPM_MUX Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 25/62] ASoC: wm8731: fix dsp mode configuration Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 26/62] vfs: fix subtle use-after-free of pipe_inode_info Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 27/62] can: sja1000: fix {pre,post}_irq() handling and IRQ handler return value Greg Kroah-Hartman
2013-12-10 8:00 ` [PATCH 3.12 28/62] can: flexcan: use correct clock as base for bit rate calculation Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 29/62] can: c_can: dont call pm_runtime_get_sync() from interrupt context Greg Kroah-Hartman
2013-12-10 8:01 ` Greg Kroah-Hartman [this message]
2013-12-10 8:01 ` [PATCH 3.12 31/62] efi-pstore: Make efi-pstore return a unique id Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 32/62] SCSI: bfa: Fix crash when symb name set for offline vport Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 33/62] SCSI: enclosure: fix WARN_ON in dual path device removing Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 34/62] SCSI: libsas: fix usage of ata_tf_to_fis Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 35/62] SCSI: hpsa: do not discard scsi status on aborted commands Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 36/62] SCSI: hpsa: return 0 from driver probe function on success, not 1 Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 37/62] NFSv4: Update list of irrecoverable errors on DELEGRETURN Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 38/62] PNP: fix restoring devices after hibernation Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 39/62] time: Fix 1ns/tick drift w/ GENERIC_TIME_VSYSCALL_OLD Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 40/62] powerpc/gpio: Fix the wrong GPIO input data on MPC8572/MPC8536 Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 41/62] parisc: fix mmap(MAP_FIXED|MAP_SHARED) to already mmapped address Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 42/62] xen/gnttab: leave lazy MMU mode in the case of a m2p override failure Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 43/62] spi/pxa2xx: add new ACPI IDs Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 44/62] cpuidle: Check for dev before deregistering it Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 45/62] Update of blkg_stat and blkg_rwstat may happen in bh context. While u64_stats_fetch_retry is only preempt_disable on 32bit UP system. This is not enough to avoid preemption by bh and may read strange 64 bit value Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 46/62] irq: Enable all irqs unconditionally in irq_resume Greg Kroah-Hartman
2013-12-10 9:01 ` Pavel Machek
2013-12-10 9:08 ` Greg Kroah-Hartman
2013-12-10 12:52 ` Heiko Stübner
2013-12-10 19:27 ` Greg Kroah-Hartman
2013-12-10 21:46 ` Heiko Stübner
2013-12-11 1:16 ` Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 47/62] net: update consumers of MSG_MORE to recognize MSG_SENDPAGE_NOTLAST Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 48/62] x86-64, build: Always pass in -mno-sse Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 49/62] SCSI: Disable WRITE SAME for RAID and virtual host adapter drivers Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 50/62] iwlwifi: dvm: dont override mac80211s queue setting Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 51/62] tg3: avoid double-freeing of rx data memory Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 52/62] Input: allow deselecting serio drivers even without CONFIG_EXPERT Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 53/62] Input: mousedev - allow disabling " Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 54/62] mei: me: add Lynx Point Wellsburg work station device id Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 55/62] mei: add 9 series PCH mei device ids Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 56/62] n_tty: Fix missing newline echo Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 57/62] USB: pl2303: fixed handling of CS5 setting Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 58/62] USB: ftdi_sio: fixed handling of unsupported CSIZE setting Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 59/62] USB: mos7840: correct handling of CS5 setting Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 60/62] USB: spcp8x5: " Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 61/62] USB: cdc-acm: Added support for the Lenovo RD02-D400 USB Modem Greg Kroah-Hartman
2013-12-10 8:01 ` [PATCH 3.12 62/62] drivers/char/i8k.c: add Dell XPLS L421X Greg Kroah-Hartman
2013-12-10 17:04 ` [PATCH 3.12 00/62] 3.12.5-stable review Guenter Roeck
2013-12-11 1:17 ` Greg Kroah-Hartman
2013-12-11 1:49 ` Shuah Khan
2013-12-11 2:00 ` Greg Kroah-Hartman
2013-12-11 21:26 ` Satoru Takeuchi
2013-12-11 23:31 ` 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=20131210080059.560895664@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=cxie@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=matt.fleming@intel.com \
--cc=seiji.aguchi@hds.com \
--cc=stable@vger.kernel.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;
as well as URLs for NNTP newsgroup(s).