]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.0 patches
authorGreg Kroah-Hartman <gregkh@suse.de>
Sun, 21 Aug 2011 15:05:41 +0000 (08:05 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sun, 21 Aug 2011 15:05:41 +0000 (08:05 -0700)
queue-3.0/alsa-ac97-add-hp-compaq-dc5100-sff-pt003aw-to-headphone-jack-sense-whitelist.patch [new file with mode: 0644]
queue-3.0/alsa-snd_usb_caiaq-track-submitted-output-urbs.patch [new file with mode: 0644]
queue-3.0/alsa-usb-audio-fix-missing-mixer-db-information.patch [new file with mode: 0644]
queue-3.0/ext4-call-ext4_ioend_wait-and-ext4_flush_completed_io-in.patch [new file with mode: 0644]
queue-3.0/ext4-fix-ext4_should_writeback_data-for-no-journal-mode.patch [new file with mode: 0644]
queue-3.0/ext4-fix-nomblk_io_submit-option-so-it-correctly-converts-uninit-blocks.patch [new file with mode: 0644]
queue-3.0/ext4-resolve-the-hang-of-direct-i-o-read-in-handling-ext4_io_end_unwritten.patch [new file with mode: 0644]
queue-3.0/series

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 (file)
index 0000000..5210d55
--- /dev/null
@@ -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 (file)
index 0000000..ef2228f
--- /dev/null
@@ -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 (file)
index 0000000..f60bb1e
--- /dev/null
@@ -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 (file)
index 0000000..7d1934b
--- /dev/null
@@ -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 (file)
index 0000000..16d8edc
--- /dev/null
@@ -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 (file)
index 0000000..69b0e7d
--- /dev/null
@@ -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 (file)
index 0000000..d14b06f
--- /dev/null
@@ -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));
index d909a3917cc1570b71634a0e7f9d4667eb760479..b7b837680099c3093b35d14c33fc3dbc499c1d07 100644 (file)
@@ -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