--- /dev/null
+From 87c279e613f848c691111b29d49de8df3f4f56da Mon Sep 17 00:00:00 2001
+From: Omar Sandoval <osandov@fb.com>
+Date: Wed, 1 Jun 2016 22:18:48 -0700
+Subject: blk-mq: really fix plug list flushing for nomerge queues
+
+From: Omar Sandoval <osandov@fb.com>
+
+commit 87c279e613f848c691111b29d49de8df3f4f56da upstream.
+
+Commit 0809e3ac6231 ("block: fix plug list flushing for nomerge queues")
+updated blk_mq_make_request() to set request_count even when
+blk_queue_nomerges() returns true. However, blk_mq_make_request() only
+does limited plugging and doesn't use request_count;
+blk_sq_make_request() is the one that should have been fixed. Do that
+and get rid of the unnecessary work in the mq version.
+
+Fixes: 0809e3ac6231 ("block: fix plug list flushing for nomerge queues")
+Signed-off-by: Omar Sandoval <osandov@fb.com>
+Reviewed-by: Ming Lei <tom.leiming@gmail.com>
+Reviewed-by: Jeff Moyer <jmoyer@redhat.com>
+Signed-off-by: Jens Axboe <axboe@fb.com>
+Cc: Sumit Semwal <sumit.semwal@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ block/blk-mq.c | 17 ++++++++---------
+ 1 file changed, 8 insertions(+), 9 deletions(-)
+
+--- a/block/blk-mq.c
++++ b/block/blk-mq.c
+@@ -1259,12 +1259,9 @@ static blk_qc_t blk_mq_make_request(stru
+
+ blk_queue_split(q, &bio, q->bio_split);
+
+- if (!is_flush_fua && !blk_queue_nomerges(q)) {
+- if (blk_attempt_plug_merge(q, bio, &request_count,
+- &same_queue_rq))
+- return BLK_QC_T_NONE;
+- } else
+- request_count = blk_plug_queued_count(q);
++ if (!is_flush_fua && !blk_queue_nomerges(q) &&
++ blk_attempt_plug_merge(q, bio, &request_count, &same_queue_rq))
++ return BLK_QC_T_NONE;
+
+ rq = blk_mq_map_request(q, bio, &data);
+ if (unlikely(!rq))
+@@ -1355,9 +1352,11 @@ static blk_qc_t blk_sq_make_request(stru
+
+ blk_queue_split(q, &bio, q->bio_split);
+
+- if (!is_flush_fua && !blk_queue_nomerges(q) &&
+- blk_attempt_plug_merge(q, bio, &request_count, NULL))
+- return BLK_QC_T_NONE;
++ if (!is_flush_fua && !blk_queue_nomerges(q)) {
++ if (blk_attempt_plug_merge(q, bio, &request_count, NULL))
++ return BLK_QC_T_NONE;
++ } else
++ request_count = blk_plug_queued_count(q);
+
+ rq = blk_mq_map_request(q, bio, &data);
+ if (unlikely(!rq))
--- /dev/null
+From 2b2f5ff00f63847d95adad6289bd8b05f5983dd5 Mon Sep 17 00:00:00 2001
+From: Colin Ian King <colin.king@canonical.com>
+Date: Mon, 16 May 2016 17:22:54 +0100
+Subject: rtc: interface: ignore expired timers when enqueuing new timers
+
+From: Colin Ian King <colin.king@canonical.com>
+
+commit 2b2f5ff00f63847d95adad6289bd8b05f5983dd5 upstream.
+
+This patch fixes a RTC wakealarm issue, namely, the event fires during
+hibernate and is not cleared from the list, causing hwclock to block.
+
+The current enqueuing does not trigger an alarm if any expired timers
+already exist on the timerqueue. This can occur when a RTC wake alarm
+is used to wake a machine out of hibernate and the resumed state has
+old expired timers that have not been removed from the timer queue.
+This fix skips over any expired timers and triggers an alarm if there
+are no pending timers on the timerqueue. Note that the skipped expired
+timer will get reaped later on, so there is no need to clean it up
+immediately.
+
+The issue can be reproduced by putting a machine into hibernate and
+waking it with the RTC wakealarm. Running the example RTC test program
+from tools/testing/selftests/timers/rtctest.c after the hibernate will
+block indefinitely. With the fix, it no longer blocks after the
+hibernate resume.
+
+BugLink: http://bugs.launchpad.net/bugs/1333569
+
+Signed-off-by: Colin Ian King <colin.king@canonical.com>
+Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
+Cc: Sumit Semwal <sumit.semwal@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/rtc/interface.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+--- a/drivers/rtc/interface.c
++++ b/drivers/rtc/interface.c
+@@ -748,9 +748,23 @@ EXPORT_SYMBOL_GPL(rtc_irq_set_freq);
+ */
+ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
+ {
++ struct timerqueue_node *next = timerqueue_getnext(&rtc->timerqueue);
++ struct rtc_time tm;
++ ktime_t now;
++
+ timer->enabled = 1;
++ __rtc_read_time(rtc, &tm);
++ now = rtc_tm_to_ktime(tm);
++
++ /* Skip over expired timers */
++ while (next) {
++ if (next->expires.tv64 >= now.tv64)
++ break;
++ next = timerqueue_iterate_next(next);
++ }
++
+ timerqueue_add(&rtc->timerqueue, &timer->node);
+- if (&timer->node == timerqueue_getnext(&rtc->timerqueue)) {
++ if (!next) {
+ struct rtc_wkalrm alarm;
+ int err;
+ alarm.time = rtc_ktime_to_tm(timer->node.expires);
rtlwifi-rtl_usb-fix-missing-entry-in-usb-driver-s-private-data.patch
+rtc-interface-ignore-expired-timers-when-enqueuing-new-timers.patch
+blk-mq-really-fix-plug-list-flushing-for-nomerge-queues.patch