summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2011-08-21 08:05:41 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2011-08-21 08:05:41 -0700
commit8a4005d1521586f6dadba573f9abbb42c88db47e (patch)
tree4b8e182332f02820bde92448d38ad9e2af04b2e7
parent7ce7bc4f70aeab6ba9078ce3ba785449562134b3 (diff)
downloadstable-queue-8a4005d1521586f6dadba573f9abbb42c88db47e.tar.gz
3.0 patches
-rw-r--r--queue-3.0/alsa-ac97-add-hp-compaq-dc5100-sff-pt003aw-to-headphone-jack-sense-whitelist.patch33
-rw-r--r--queue-3.0/alsa-snd_usb_caiaq-track-submitted-output-urbs.patch125
-rw-r--r--queue-3.0/alsa-usb-audio-fix-missing-mixer-db-information.patch44
-rw-r--r--queue-3.0/ext4-call-ext4_ioend_wait-and-ext4_flush_completed_io-in.patch66
-rw-r--r--queue-3.0/ext4-fix-ext4_should_writeback_data-for-no-journal-mode.patch83
-rw-r--r--queue-3.0/ext4-fix-nomblk_io_submit-option-so-it-correctly-converts-uninit-blocks.patch50
-rw-r--r--queue-3.0/ext4-resolve-the-hang-of-direct-i-o-read-in-handling-ext4_io_end_unwritten.patch67
-rw-r--r--queue-3.0/series7
8 files changed, 475 insertions, 0 deletions
diff --git a/queue-3.0/alsa-ac97-add-hp-compaq-dc5100-sff-pt003aw-to-headphone-jack-sense-whitelist.patch b/queue-3.0/alsa-ac97-add-hp-compaq-dc5100-sff-pt003aw-to-headphone-jack-sense-whitelist.patch
new file mode 100644
index 0000000000..5210d5559a
--- /dev/null
+++ b/queue-3.0/alsa-ac97-add-hp-compaq-dc5100-sff-pt003aw-to-headphone-jack-sense-whitelist.patch
@@ -0,0 +1,33 @@
+From eade7b281c9fc18401b989c77d5e5e660b25a3b7 Mon Sep 17 00:00:00 2001
+From: Daniel T Chen <crimsun@ubuntu.com>
+Date: Sun, 14 Aug 2011 22:43:01 -0400
+Subject: ALSA: ac97: Add HP Compaq dc5100 SFF(PT003AW) to Headphone Jack Sense whitelist
+
+From: Daniel T Chen <crimsun@ubuntu.com>
+
+commit eade7b281c9fc18401b989c77d5e5e660b25a3b7 upstream.
+
+BugLink: https://bugs.launchpad.net/bugs/826081
+
+The original reporter needs 'Headphone Jack Sense' enabled to have
+audible audio, so add his PCI SSID to the whitelist.
+
+Reported-and-tested-by: Muhammad Khurram Khan
+Signed-off-by: Daniel T Chen <crimsun@ubuntu.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/pci/ac97/ac97_patch.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/sound/pci/ac97/ac97_patch.c
++++ b/sound/pci/ac97/ac97_patch.c
+@@ -1909,6 +1909,7 @@ static unsigned int ad1981_jacks_whiteli
+ 0x103c0944, /* HP nc6220 */
+ 0x103c0934, /* HP nc8220 */
+ 0x103c006d, /* HP nx9105 */
++ 0x103c300d, /* HP Compaq dc5100 SFF(PT003AW) */
+ 0x17340088, /* FSC Scenic-W */
+ 0 /* end */
+ };
diff --git a/queue-3.0/alsa-snd_usb_caiaq-track-submitted-output-urbs.patch b/queue-3.0/alsa-snd_usb_caiaq-track-submitted-output-urbs.patch
new file mode 100644
index 0000000000..ef2228fc05
--- /dev/null
+++ b/queue-3.0/alsa-snd_usb_caiaq-track-submitted-output-urbs.patch
@@ -0,0 +1,125 @@
+From da6094ea7d3c2295473d8f5134279307255d6ebf Mon Sep 17 00:00:00 2001
+From: Daniel Mack <zonque@gmail.com>
+Date: Sun, 14 Aug 2011 11:31:16 +0200
+Subject: ALSA: snd_usb_caiaq: track submitted output urbs
+
+From: Daniel Mack <zonque@gmail.com>
+
+commit da6094ea7d3c2295473d8f5134279307255d6ebf upstream.
+
+The snd_usb_caiaq driver currently assumes that output urbs are serviced
+in time and doesn't track when and whether they are given back by the
+USB core. That usually works fine, but due to temporary limitations of
+the XHCI stack, we faced that urbs were submitted more than once with
+this approach.
+
+As it's no good practice to fire and forget urbs anyway, this patch
+introduces a proper bit mask to track which requests have been submitted
+and given back.
+
+That alone however doesn't make the driver work in case the host
+controller is broken and doesn't give back urbs at all, and the output
+stream will stop once all pre-allocated output urbs are consumed. But
+it does prevent crashes of the controller stack in such cases.
+
+See http://bugzilla.kernel.org/show_bug.cgi?id=40702 for more details.
+
+Signed-off-by: Daniel Mack <zonque@gmail.com>
+Reported-and-tested-by: Matej Laitl <matej@laitl.cz>
+Cc: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/usb/caiaq/audio.c | 31 +++++++++++++++++++++++++++----
+ sound/usb/caiaq/device.h | 1 +
+ 2 files changed, 28 insertions(+), 4 deletions(-)
+
+--- a/sound/usb/caiaq/audio.c
++++ b/sound/usb/caiaq/audio.c
+@@ -139,8 +139,12 @@ static void stream_stop(struct snd_usb_c
+
+ for (i = 0; i < N_URBS; i++) {
+ usb_kill_urb(dev->data_urbs_in[i]);
+- usb_kill_urb(dev->data_urbs_out[i]);
++
++ if (test_bit(i, &dev->outurb_active_mask))
++ usb_kill_urb(dev->data_urbs_out[i]);
+ }
++
++ dev->outurb_active_mask = 0;
+ }
+
+ static int snd_usb_caiaq_substream_open(struct snd_pcm_substream *substream)
+@@ -612,8 +616,8 @@ static void read_completed(struct urb *u
+ {
+ struct snd_usb_caiaq_cb_info *info = urb->context;
+ struct snd_usb_caiaqdev *dev;
+- struct urb *out;
+- int frame, len, send_it = 0, outframe = 0;
++ struct urb *out = NULL;
++ int i, frame, len, send_it = 0, outframe = 0;
+ size_t offset = 0;
+
+ if (urb->status || !info)
+@@ -624,7 +628,17 @@ static void read_completed(struct urb *u
+ if (!dev->streaming)
+ return;
+
+- out = dev->data_urbs_out[info->index];
++ /* find an unused output urb that is unused */
++ for (i = 0; i < N_URBS; i++)
++ if (test_and_set_bit(i, &dev->outurb_active_mask) == 0) {
++ out = dev->data_urbs_out[i];
++ break;
++ }
++
++ if (!out) {
++ log("Unable to find an output urb to use\n");
++ goto requeue;
++ }
+
+ /* read the recently received packet and send back one which has
+ * the same layout */
+@@ -655,8 +669,12 @@ static void read_completed(struct urb *u
+ out->number_of_packets = outframe;
+ out->transfer_flags = URB_ISO_ASAP;
+ usb_submit_urb(out, GFP_ATOMIC);
++ } else {
++ struct snd_usb_caiaq_cb_info *oinfo = out->context;
++ clear_bit(oinfo->index, &dev->outurb_active_mask);
+ }
+
++requeue:
+ /* re-submit inbound urb */
+ for (frame = 0; frame < FRAMES_PER_URB; frame++) {
+ urb->iso_frame_desc[frame].offset = BYTES_PER_FRAME * frame;
+@@ -678,6 +696,8 @@ static void write_completed(struct urb *
+ dev->output_running = 1;
+ wake_up(&dev->prepare_wait_queue);
+ }
++
++ clear_bit(info->index, &dev->outurb_active_mask);
+ }
+
+ static struct urb **alloc_urbs(struct snd_usb_caiaqdev *dev, int dir, int *ret)
+@@ -829,6 +849,9 @@ int snd_usb_caiaq_audio_init(struct snd_
+ if (!dev->data_cb_info)
+ return -ENOMEM;
+
++ dev->outurb_active_mask = 0;
++ BUILD_BUG_ON(N_URBS > (sizeof(dev->outurb_active_mask) * 8));
++
+ for (i = 0; i < N_URBS; i++) {
+ dev->data_cb_info[i].dev = dev;
+ dev->data_cb_info[i].index = i;
+--- a/sound/usb/caiaq/device.h
++++ b/sound/usb/caiaq/device.h
+@@ -96,6 +96,7 @@ struct snd_usb_caiaqdev {
+ int input_panic, output_panic, warned;
+ char *audio_in_buf, *audio_out_buf;
+ unsigned int samplerates, bpp;
++ unsigned long outurb_active_mask;
+
+ struct snd_pcm_substream *sub_playback[MAX_STREAMS];
+ struct snd_pcm_substream *sub_capture[MAX_STREAMS];
diff --git a/queue-3.0/alsa-usb-audio-fix-missing-mixer-db-information.patch b/queue-3.0/alsa-usb-audio-fix-missing-mixer-db-information.patch
new file mode 100644
index 0000000000..f60bb1e741
--- /dev/null
+++ b/queue-3.0/alsa-usb-audio-fix-missing-mixer-db-information.patch
@@ -0,0 +1,44 @@
+From 38b65190c6ab0be8ce7cff69e734ca5b5e7fa309 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Fri, 19 Aug 2011 07:55:10 +0200
+Subject: ALSA: usb-audio - Fix missing mixer dB information
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 38b65190c6ab0be8ce7cff69e734ca5b5e7fa309 upstream.
+
+The recent fix for testing dB range at the mixer creation time seems
+to cause regressions in some devices. In such devices, reading the dB
+info at probing time gives an error, thus both dBmin and dBmax are still
+zero, and TLV flag isn't set although the later read of dB info succeeds.
+
+This patch adds a workaround for such a case by assuming that the later
+read will succeed. In future, a similar test should be performed in a
+case where a wrong dB range is seen even in the later read.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/usb/mixer.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/sound/usb/mixer.c
++++ b/sound/usb/mixer.c
+@@ -152,6 +152,7 @@ static inline void check_mapped_dB(const
+ if (p && p->dB) {
+ cval->dBmin = p->dB->min;
+ cval->dBmax = p->dB->max;
++ cval->initialized = 1;
+ }
+ }
+
+@@ -1092,7 +1093,7 @@ static void build_feature_ctl(struct mix
+ " Switch" : " Volume");
+ if (control == UAC_FU_VOLUME) {
+ check_mapped_dB(map, cval);
+- if (cval->dBmin < cval->dBmax) {
++ if (cval->dBmin < cval->dBmax || !cval->initialized) {
+ kctl->tlv.c = mixer_vol_tlv;
+ kctl->vd[0].access |=
+ SNDRV_CTL_ELEM_ACCESS_TLV_READ |
diff --git a/queue-3.0/ext4-call-ext4_ioend_wait-and-ext4_flush_completed_io-in.patch b/queue-3.0/ext4-call-ext4_ioend_wait-and-ext4_flush_completed_io-in.patch
new file mode 100644
index 0000000000..7d1934b967
--- /dev/null
+++ b/queue-3.0/ext4-call-ext4_ioend_wait-and-ext4_flush_completed_io-in.patch
@@ -0,0 +1,66 @@
+From 2581fdc810889fdea97689cb62481201d579c796 Mon Sep 17 00:00:00 2001
+From: Jiaying Zhang <jiayingz@google.com>
+Date: Sat, 13 Aug 2011 12:17:13 -0400
+Subject: ext4: call ext4_ioend_wait and ext4_flush_completed_IO in ext4_evict_inode
+
+From: Jiaying Zhang <jiayingz@google.com>
+
+commit 2581fdc810889fdea97689cb62481201d579c796 upstream.
+
+Flush inode's i_completed_io_list before calling ext4_io_wait to
+prevent the following deadlock scenario: A page fault happens while
+some process is writing inode A. During page fault,
+shrink_icache_memory is called that in turn evicts another inode
+B. Inode B has some pending io_end work so it calls ext4_ioend_wait()
+that waits for inode B's i_ioend_count to become zero. However, inode
+B's ioend work was queued behind some of inode A's ioend work on the
+same cpu's ext4-dio-unwritten workqueue. As the ext4-dio-unwritten
+thread on that cpu is processing inode A's ioend work, it tries to
+grab inode A's i_mutex lock. Since the i_mutex lock of inode A is
+still hold before the page fault happened, we enter a deadlock.
+
+Also moves ext4_flush_completed_IO and ext4_ioend_wait from
+ext4_destroy_inode() to ext4_evict_inode(). During inode deleteion,
+ext4_evict_inode() is called before ext4_destroy_inode() and in
+ext4_evict_inode(), we may call ext4_truncate() without holding
+i_mutex lock. As a result, there is a race between flush_completed_IO
+that is called from ext4_ext_truncate() and ext4_end_io_work, which
+may cause corruption on an io_end structure. This change moves
+ext4_flush_completed_IO and ext4_ioend_wait from ext4_destroy_inode()
+to ext4_evict_inode() to resolve the race between ext4_truncate() and
+ext4_end_io_work during inode deletion.
+
+Signed-off-by: Jiaying Zhang <jiayingz@google.com>
+Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/ext4/inode.c | 6 ++++++
+ fs/ext4/super.c | 1 -
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -189,6 +189,12 @@ void ext4_evict_inode(struct inode *inod
+ int err;
+
+ trace_ext4_evict_inode(inode);
++
++ mutex_lock(&inode->i_mutex);
++ ext4_flush_completed_IO(inode);
++ mutex_unlock(&inode->i_mutex);
++ ext4_ioend_wait(inode);
++
+ if (inode->i_nlink) {
+ truncate_inode_pages(&inode->i_data, 0);
+ goto no_delete;
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -892,7 +892,6 @@ static void ext4_i_callback(struct rcu_h
+
+ static void ext4_destroy_inode(struct inode *inode)
+ {
+- ext4_ioend_wait(inode);
+ if (!list_empty(&(EXT4_I(inode)->i_orphan))) {
+ ext4_msg(inode->i_sb, KERN_ERR,
+ "Inode %lu (%p): orphan list check failed!",
diff --git a/queue-3.0/ext4-fix-ext4_should_writeback_data-for-no-journal-mode.patch b/queue-3.0/ext4-fix-ext4_should_writeback_data-for-no-journal-mode.patch
new file mode 100644
index 0000000000..16d8edca08
--- /dev/null
+++ b/queue-3.0/ext4-fix-ext4_should_writeback_data-for-no-journal-mode.patch
@@ -0,0 +1,83 @@
+From 441c850857148935babe000fc2ba1455fe54a6a9 Mon Sep 17 00:00:00 2001
+From: Curt Wohlgemuth <curtw@google.com>
+Date: Sat, 13 Aug 2011 11:25:18 -0400
+Subject: ext4: Fix ext4_should_writeback_data() for no-journal mode
+
+From: Curt Wohlgemuth <curtw@google.com>
+
+commit 441c850857148935babe000fc2ba1455fe54a6a9 upstream.
+
+ext4_should_writeback_data() had an incorrect sequence of
+tests to determine if it should return 0 or 1: in
+particular, even in no-journal mode, 0 was being returned
+for a non-regular-file inode.
+
+This meant that, in non-journal mode, we would use
+ext4_journalled_aops for directories, symlinks, and other
+non-regular files. However, calling journalled aop
+callbacks when there is no valid handle, can cause problems.
+
+This would cause a kernel crash with Jan Kara's commit
+2d859db3e4 ("ext4: fix data corruption in inodes with
+journalled data"), because we now dereference 'handle' in
+ext4_journalled_write_end().
+
+I also added BUG_ONs to check for a valid handle in the
+obviously journal-only aops callbacks.
+
+I tested this running xfstests with a scratch device in
+these modes:
+
+ - no-journal
+ - data=ordered
+ - data=writeback
+ - data=journal
+
+All work fine; the data=journal run has many failures and a
+crash in xfstests 074, but this is no different from a
+vanilla kernel.
+
+Signed-off-by: Curt Wohlgemuth <curtw@google.com>
+Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/ext4/ext4_jbd2.h | 4 ++--
+ fs/ext4/inode.c | 4 ++++
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+--- a/fs/ext4/ext4_jbd2.h
++++ b/fs/ext4/ext4_jbd2.h
+@@ -289,10 +289,10 @@ static inline int ext4_should_order_data
+
+ static inline int ext4_should_writeback_data(struct inode *inode)
+ {
+- if (!S_ISREG(inode->i_mode))
+- return 0;
+ if (EXT4_JOURNAL(inode) == NULL)
+ return 1;
++ if (!S_ISREG(inode->i_mode))
++ return 0;
+ if (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA))
+ return 0;
+ if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -1849,6 +1849,8 @@ static int ext4_journalled_write_end(str
+ from = pos & (PAGE_CACHE_SIZE - 1);
+ to = from + len;
+
++ BUG_ON(!ext4_handle_valid(handle));
++
+ if (copied < len) {
+ if (!PageUptodate(page))
+ copied = 0;
+@@ -2564,6 +2566,8 @@ static int __ext4_journalled_writepage(s
+ goto out;
+ }
+
++ BUG_ON(!ext4_handle_valid(handle));
++
+ ret = walk_page_buffers(handle, page_bufs, 0, len, NULL,
+ do_journal_get_write_access);
+
diff --git a/queue-3.0/ext4-fix-nomblk_io_submit-option-so-it-correctly-converts-uninit-blocks.patch b/queue-3.0/ext4-fix-nomblk_io_submit-option-so-it-correctly-converts-uninit-blocks.patch
new file mode 100644
index 0000000000..69b0e7df11
--- /dev/null
+++ b/queue-3.0/ext4-fix-nomblk_io_submit-option-so-it-correctly-converts-uninit-blocks.patch
@@ -0,0 +1,50 @@
+From 9dd75f1f1a02d656a11a7b9b9e6c2759b9c1e946 Mon Sep 17 00:00:00 2001
+From: Theodore Ts'o <tytso@mit.edu>
+Date: Sat, 13 Aug 2011 12:58:21 -0400
+Subject: ext4: fix nomblk_io_submit option so it correctly converts uninit blocks
+
+From: Theodore Ts'o <tytso@mit.edu>
+
+commit 9dd75f1f1a02d656a11a7b9b9e6c2759b9c1e946 upstream.
+
+Bug discovered by Jan Kara:
+
+Finally, commit 1449032be17abb69116dbc393f67ceb8bd034f92 returned back
+the old IO submission code but apparently it forgot to return the old
+handling of uninitialized buffers so we unconditionnaly call
+block_write_full_page() without specifying end_io function. So AFAICS
+we never convert unwritten extents to written in some cases. For
+example when I mount the fs as: mount -t ext4 -o
+nomblk_io_submit,dioread_nolock /dev/ubdb /mnt and do
+ int fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, 0600);
+ char buf[1024];
+ memset(buf, 'a', sizeof(buf));
+ fallocate(fd, 0, 0, 16384);
+ write(fd, buf, sizeof(buf));
+
+I get a file full of zeros (after remounting the filesystem so that
+pagecache is dropped) instead of seeing the first KB contain 'a's.
+
+Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/ext4/inode.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -2156,7 +2156,12 @@ static int mpage_da_submit_io(struct mpa
+ else if (test_opt(inode->i_sb, MBLK_IO_SUBMIT))
+ err = ext4_bio_write_page(&io_submit, page,
+ len, mpd->wbc);
+- else
++ else if (buffer_uninit(page_bufs)) {
++ ext4_set_bh_endio(page_bufs, inode);
++ err = block_write_full_page_endio(page,
++ noalloc_get_block_write,
++ mpd->wbc, ext4_end_io_buffer_write);
++ } else
+ err = block_write_full_page(page,
+ noalloc_get_block_write, mpd->wbc);
+
diff --git a/queue-3.0/ext4-resolve-the-hang-of-direct-i-o-read-in-handling-ext4_io_end_unwritten.patch b/queue-3.0/ext4-resolve-the-hang-of-direct-i-o-read-in-handling-ext4_io_end_unwritten.patch
new file mode 100644
index 0000000000..d14b06febd
--- /dev/null
+++ b/queue-3.0/ext4-resolve-the-hang-of-direct-i-o-read-in-handling-ext4_io_end_unwritten.patch
@@ -0,0 +1,67 @@
+From 32c80b32c053dc52712dedac5e4d0aa7c93fc353 Mon Sep 17 00:00:00 2001
+From: Tao Ma <boyu.mt@taobao.com>
+Date: Sat, 13 Aug 2011 12:30:59 -0400
+Subject: ext4: Resolve the hang of direct i/o read in handling EXT4_IO_END_UNWRITTEN.
+
+From: Tao Ma <boyu.mt@taobao.com>
+
+commit 32c80b32c053dc52712dedac5e4d0aa7c93fc353 upstream.
+
+EXT4_IO_END_UNWRITTEN flag set and the increase of i_aiodio_unwritten
+should be done simultaneously since ext4_end_io_nolock always clear
+the flag and decrease the counter in the same time.
+
+We don't increase i_aiodio_unwritten when setting
+EXT4_IO_END_UNWRITTEN so it will go nagative and causes some process
+to wait forever.
+
+Part of the patch came from Eric in his e-mail, but it doesn't fix the
+problem met by Michael actually.
+
+http://marc.info/?l=linux-ext4&m=131316851417460&w=2
+
+Reported-and-Tested-by: Michael Tokarev<mjt@tls.msk.ru>
+Signed-off-by: Eric Sandeen <sandeen@redhat.com>
+Signed-off-by: Tao Ma <boyu.mt@taobao.com>
+Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/ext4/inode.c | 9 ++++++++-
+ fs/ext4/page-io.c | 6 ++++--
+ 2 files changed, 12 insertions(+), 3 deletions(-)
+
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -3645,8 +3645,15 @@ static void ext4_end_io_buffer_write(str
+ goto out;
+ }
+
+- io_end->flag = EXT4_IO_END_UNWRITTEN;
++ /*
++ * It may be over-defensive here to check EXT4_IO_END_UNWRITTEN now,
++ * but being more careful is always safe for the future change.
++ */
+ inode = io_end->inode;
++ if (!(io_end->flag & EXT4_IO_END_UNWRITTEN)) {
++ io_end->flag |= EXT4_IO_END_UNWRITTEN;
++ atomic_inc(&EXT4_I(inode)->i_aiodio_unwritten);
++ }
+
+ /* Add the io_end to per-inode completed io list*/
+ spin_lock_irqsave(&EXT4_I(inode)->i_completed_io_lock, flags);
+--- a/fs/ext4/page-io.c
++++ b/fs/ext4/page-io.c
+@@ -338,8 +338,10 @@ submit_and_retry:
+ if ((io_end->num_io_pages >= MAX_IO_PAGES) &&
+ (io_end->pages[io_end->num_io_pages-1] != io_page))
+ goto submit_and_retry;
+- if (buffer_uninit(bh))
+- io->io_end->flag |= EXT4_IO_END_UNWRITTEN;
++ if (buffer_uninit(bh) && !(io_end->flag & EXT4_IO_END_UNWRITTEN)) {
++ io_end->flag |= EXT4_IO_END_UNWRITTEN;
++ atomic_inc(&EXT4_I(inode)->i_aiodio_unwritten);
++ }
+ io->io_end->size += bh->b_size;
+ io->io_next_block++;
+ ret = bio_add_page(io->io_bio, bh->b_page, bh->b_size, bh_offset(bh));
diff --git a/queue-3.0/series b/queue-3.0/series
index d909a3917c..b7b8376800 100644
--- a/queue-3.0/series
+++ b/queue-3.0/series
@@ -12,3 +12,10 @@ x86-mtrr-lock-stop-machine-during-mtrr-rendezvous-sequence.patch
btrfs-detect-wether-a-device-supports-discard.patch
loop-fix-deadlock-when-sysfs-and-loop_clr_fd-race-against.patch
btrfs-fix-an-oops-of-log-replay.patch
+alsa-usb-audio-fix-missing-mixer-db-information.patch
+alsa-snd_usb_caiaq-track-submitted-output-urbs.patch
+alsa-ac97-add-hp-compaq-dc5100-sff-pt003aw-to-headphone-jack-sense-whitelist.patch
+ext4-fix-ext4_should_writeback_data-for-no-journal-mode.patch
+ext4-call-ext4_ioend_wait-and-ext4_flush_completed_io-in.patch
+ext4-resolve-the-hang-of-direct-i-o-read-in-handling-ext4_io_end_unwritten.patch
+ext4-fix-nomblk_io_submit-option-so-it-correctly-converts-uninit-blocks.patch