]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.18-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 5 Jan 2019 17:36:20 +0000 (18:36 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 5 Jan 2019 17:36:20 +0000 (18:36 +0100)
added patches:
cdc-acm-fix-abnormal-data-rx-issue-for-mediatek-preloader.patch
ext4-check-for-shutdown-and-r-o-file-system-in-ext4_write_inode.patch
ext4-fix-possible-use-after-free-in-ext4_quota_enable.patch
ext4-force-inode-writes-when-nfsd-calls-commit_metadata.patch
ext4-missing-unlock-put_page-in-ext4_try_to_write_inline_data.patch

queue-3.18/cdc-acm-fix-abnormal-data-rx-issue-for-mediatek-preloader.patch [new file with mode: 0644]
queue-3.18/ext4-check-for-shutdown-and-r-o-file-system-in-ext4_write_inode.patch [new file with mode: 0644]
queue-3.18/ext4-fix-possible-use-after-free-in-ext4_quota_enable.patch [new file with mode: 0644]
queue-3.18/ext4-force-inode-writes-when-nfsd-calls-commit_metadata.patch [new file with mode: 0644]
queue-3.18/ext4-missing-unlock-put_page-in-ext4_try_to_write_inline_data.patch [new file with mode: 0644]
queue-3.18/series

diff --git a/queue-3.18/cdc-acm-fix-abnormal-data-rx-issue-for-mediatek-preloader.patch b/queue-3.18/cdc-acm-fix-abnormal-data-rx-issue-for-mediatek-preloader.patch
new file mode 100644 (file)
index 0000000..464397b
--- /dev/null
@@ -0,0 +1,80 @@
+From eafb27fa5283599ce6c5492ea18cf636a28222bb Mon Sep 17 00:00:00 2001
+From: Macpaul Lin <macpaul.lin@mediatek.com>
+Date: Wed, 19 Dec 2018 12:11:03 +0800
+Subject: cdc-acm: fix abnormal DATA RX issue for Mediatek Preloader.
+
+From: Macpaul Lin <macpaul.lin@mediatek.com>
+
+commit eafb27fa5283599ce6c5492ea18cf636a28222bb upstream.
+
+Mediatek Preloader is a proprietary embedded boot loader for loading
+Little Kernel and Linux into device DRAM.
+
+This boot loader also handle firmware update. Mediatek Preloader will be
+enumerated as a virtual COM port when the device is connected to Windows
+or Linux OS via CDC-ACM class driver. When the USB enumeration has been
+done, Mediatek Preloader will send out handshake command "READY" to PC
+actively instead of waiting command from the download tool.
+
+Since Linux 4.12, the commit "tty: reset termios state on device
+registration" (93857edd9829e144acb6c7e72d593f6e01aead66) causes Mediatek
+Preloader receiving some abnoraml command like "READYXX" as it sent.
+This will be recognized as an incorrect response. The behavior change
+also causes the download handshake fail. This change only affects
+subsequent connects if the reconnected device happens to get the same minor
+number.
+
+By disabling the ECHO termios flag could avoid this problem. However, it
+cannot be done by user space configuration when download tool open
+/dev/ttyACM0. This is because the device running Mediatek Preloader will
+send handshake command "READY" immediately once the CDC-ACM driver is
+ready.
+
+This patch wants to fix above problem by introducing "DISABLE_ECHO"
+property in driver_info. When Mediatek Preloader is connected, the
+CDC-ACM driver could disable ECHO flag in termios to avoid the problem.
+
+Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
+Cc: stable@vger.kernel.org
+Reviewed-by: Johan Hovold <johan@kernel.org>
+Acked-by: Oliver Neukum <oneukum@suse.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/usb/class/cdc-acm.c |   10 ++++++++++
+ drivers/usb/class/cdc-acm.h |    1 +
+ 2 files changed, 11 insertions(+)
+
+--- a/drivers/usb/class/cdc-acm.c
++++ b/drivers/usb/class/cdc-acm.c
+@@ -502,6 +502,13 @@ static int acm_tty_install(struct tty_dr
+       if (retval)
+               goto error_init_termios;
++      /*
++       * Suppress initial echoing for some devices which might send data
++       * immediately after acm driver has been installed.
++       */
++      if (acm->quirks & DISABLE_ECHO)
++              tty->termios.c_lflag &= ~ECHO;
++
+       tty->driver_data = acm;
+       return 0;
+@@ -1694,6 +1701,9 @@ static const struct usb_device_id acm_id
+       { USB_DEVICE(0x0e8d, 0x0003), /* FIREFLY, MediaTek Inc; andrey.arapov@gmail.com */
+       .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
+       },
++      { USB_DEVICE(0x0e8d, 0x2000), /* MediaTek Inc Preloader */
++      .driver_info = DISABLE_ECHO, /* DISABLE ECHO in termios flag */
++      },
+       { USB_DEVICE(0x0e8d, 0x3329), /* MediaTek Inc GPS */
+       .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
+       },
+--- a/drivers/usb/class/cdc-acm.h
++++ b/drivers/usb/class/cdc-acm.h
+@@ -135,3 +135,4 @@ struct acm {
+ #define QUIRK_CONTROL_LINE_STATE      BIT(6)
+ #define CLEAR_HALT_CONDITIONS         BIT(7)
+ #define SEND_ZERO_PACKET              BIT(8)
++#define DISABLE_ECHO                  BIT(9)
diff --git a/queue-3.18/ext4-check-for-shutdown-and-r-o-file-system-in-ext4_write_inode.patch b/queue-3.18/ext4-check-for-shutdown-and-r-o-file-system-in-ext4_write_inode.patch
new file mode 100644 (file)
index 0000000..ecad153
--- /dev/null
@@ -0,0 +1,50 @@
+From 18f2c4fcebf2582f96cbd5f2238f4f354a0e4847 Mon Sep 17 00:00:00 2001
+From: Theodore Ts'o <tytso@mit.edu>
+Date: Wed, 19 Dec 2018 14:36:58 -0500
+Subject: ext4: check for shutdown and r/o file system in ext4_write_inode()
+
+From: Theodore Ts'o <tytso@mit.edu>
+
+commit 18f2c4fcebf2582f96cbd5f2238f4f354a0e4847 upstream.
+
+If the file system has been shut down or is read-only, then
+ext4_write_inode() needs to bail out early.
+
+Also use jbd2_complete_transaction() instead of ext4_force_commit() so
+we only force a commit if it is needed.
+
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Cc: stable@kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/ext4/inode.c |    9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -4409,9 +4409,13 @@ int ext4_write_inode(struct inode *inode
+ {
+       int err;
+-      if (WARN_ON_ONCE(current->flags & PF_MEMALLOC))
++      if (WARN_ON_ONCE(current->flags & PF_MEMALLOC) ||
++          sb_rdonly(inode->i_sb))
+               return 0;
++      if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb))))
++              return -EIO;
++
+       if (EXT4_SB(inode->i_sb)->s_journal) {
+               if (ext4_journal_current_handle()) {
+                       jbd_debug(1, "called recursively, non-PF_MEMALLOC!\n");
+@@ -4427,7 +4431,8 @@ int ext4_write_inode(struct inode *inode
+               if (wbc->sync_mode != WB_SYNC_ALL || wbc->for_sync)
+                       return 0;
+-              err = ext4_force_commit(inode->i_sb);
++              err = jbd2_complete_transaction(EXT4_SB(inode->i_sb)->s_journal,
++                                              EXT4_I(inode)->i_sync_tid);
+       } else {
+               struct ext4_iloc iloc;
diff --git a/queue-3.18/ext4-fix-possible-use-after-free-in-ext4_quota_enable.patch b/queue-3.18/ext4-fix-possible-use-after-free-in-ext4_quota_enable.patch
new file mode 100644 (file)
index 0000000..7ae6900
--- /dev/null
@@ -0,0 +1,37 @@
+From 61157b24e60fb3cd1f85f2c76a7b1d628f970144 Mon Sep 17 00:00:00 2001
+From: Pan Bian <bianpan2016@163.com>
+Date: Mon, 3 Dec 2018 23:28:02 -0500
+Subject: ext4: fix possible use after free in ext4_quota_enable
+
+From: Pan Bian <bianpan2016@163.com>
+
+commit 61157b24e60fb3cd1f85f2c76a7b1d628f970144 upstream.
+
+The function frees qf_inode via iput but then pass qf_inode to
+lockdep_set_quota_inode on the failure path. This may result in a
+use-after-free bug. The patch frees df_inode only when it is never used.
+
+Fixes: daf647d2dd5 ("ext4: add lockdep annotations for i_data_sem")
+Cc: stable@kernel.org # 4.6
+Reviewed-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Pan Bian <bianpan2016@163.com>
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/ext4/super.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -5389,9 +5389,9 @@ static int ext4_quota_enable(struct supe
+       qf_inode->i_flags |= S_NOQUOTA;
+       lockdep_set_quota_inode(qf_inode, I_DATA_SEM_QUOTA);
+       err = dquot_enable(qf_inode, type, format_id, flags);
+-      iput(qf_inode);
+       if (err)
+               lockdep_set_quota_inode(qf_inode, I_DATA_SEM_NORMAL);
++      iput(qf_inode);
+       return err;
+ }
diff --git a/queue-3.18/ext4-force-inode-writes-when-nfsd-calls-commit_metadata.patch b/queue-3.18/ext4-force-inode-writes-when-nfsd-calls-commit_metadata.patch
new file mode 100644 (file)
index 0000000..a7c9b5b
--- /dev/null
@@ -0,0 +1,86 @@
+From fde872682e175743e0c3ef939c89e3c6008a1529 Mon Sep 17 00:00:00 2001
+From: Theodore Ts'o <tytso@mit.edu>
+Date: Wed, 19 Dec 2018 14:07:58 -0500
+Subject: ext4: force inode writes when nfsd calls commit_metadata()
+
+From: Theodore Ts'o <tytso@mit.edu>
+
+commit fde872682e175743e0c3ef939c89e3c6008a1529 upstream.
+
+Some time back, nfsd switched from calling vfs_fsync() to using a new
+commit_metadata() hook in export_operations().  If the file system did
+not provide a commit_metadata() hook, it fell back to using
+sync_inode_metadata().  Unfortunately doesn't work on all file
+systems.  In particular, it doesn't work on ext4 due to how the inode
+gets journalled --- the VFS writeback code will not always call
+ext4_write_inode().
+
+So we need to provide our own ext4_nfs_commit_metdata() method which
+calls ext4_write_inode() directly.
+
+Google-Bug-Id: 121195940
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Cc: stable@kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/ext4/super.c             |   11 +++++++++++
+ include/trace/events/ext4.h |   20 ++++++++++++++++++++
+ 2 files changed, 31 insertions(+)
+
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -1034,6 +1034,16 @@ static struct dentry *ext4_fh_to_parent(
+                                   ext4_nfs_get_inode);
+ }
++static int ext4_nfs_commit_metadata(struct inode *inode)
++{
++      struct writeback_control wbc = {
++              .sync_mode = WB_SYNC_ALL
++      };
++
++      trace_ext4_nfs_commit_metadata(inode);
++      return ext4_write_inode(inode, &wbc);
++}
++
+ /*
+  * Try to release metadata pages (indirect blocks, directories) which are
+  * mapped via the block device.  Since these pages could have journal heads
+@@ -1135,6 +1145,7 @@ static const struct export_operations ex
+       .fh_to_dentry = ext4_fh_to_dentry,
+       .fh_to_parent = ext4_fh_to_parent,
+       .get_parent = ext4_get_parent,
++      .commit_metadata = ext4_nfs_commit_metadata,
+ };
+ enum {
+--- a/include/trace/events/ext4.h
++++ b/include/trace/events/ext4.h
+@@ -195,6 +195,26 @@ TRACE_EVENT(ext4_drop_inode,
+                 (unsigned long) __entry->ino, __entry->drop)
+ );
++TRACE_EVENT(ext4_nfs_commit_metadata,
++      TP_PROTO(struct inode *inode),
++
++      TP_ARGS(inode),
++
++      TP_STRUCT__entry(
++              __field(        dev_t,  dev                     )
++              __field(        ino_t,  ino                     )
++      ),
++
++      TP_fast_assign(
++              __entry->dev    = inode->i_sb->s_dev;
++              __entry->ino    = inode->i_ino;
++      ),
++
++      TP_printk("dev %d,%d ino %lu",
++                MAJOR(__entry->dev), MINOR(__entry->dev),
++                (unsigned long) __entry->ino)
++);
++
+ TRACE_EVENT(ext4_mark_inode_dirty,
+       TP_PROTO(struct inode *inode, unsigned long IP),
diff --git a/queue-3.18/ext4-missing-unlock-put_page-in-ext4_try_to_write_inline_data.patch b/queue-3.18/ext4-missing-unlock-put_page-in-ext4_try_to_write_inline_data.patch
new file mode 100644 (file)
index 0000000..9dac48e
--- /dev/null
@@ -0,0 +1,37 @@
+From 132d00becb31e88469334e1e62751c81345280e0 Mon Sep 17 00:00:00 2001
+From: Maurizio Lombardi <mlombard@redhat.com>
+Date: Tue, 4 Dec 2018 00:06:53 -0500
+Subject: ext4: missing unlock/put_page() in ext4_try_to_write_inline_data()
+
+From: Maurizio Lombardi <mlombard@redhat.com>
+
+commit 132d00becb31e88469334e1e62751c81345280e0 upstream.
+
+In case of error, ext4_try_to_write_inline_data() should unlock
+and release the page it holds.
+
+Fixes: f19d5870cbf7 ("ext4: add normal write support for inline data")
+Cc: stable@kernel.org # 3.8
+Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/ext4/inline.c |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/fs/ext4/inline.c
++++ b/fs/ext4/inline.c
+@@ -696,8 +696,11 @@ int ext4_try_to_write_inline_data(struct
+       if (!PageUptodate(page)) {
+               ret = ext4_read_inline_page(inode, page);
+-              if (ret < 0)
++              if (ret < 0) {
++                      unlock_page(page);
++                      put_page(page);
+                       goto out_up_read;
++              }
+       }
+       ret = 1;
index f2e7768a5d0b16b0c977a042288663c82cecc5e0..c27efdf447bc6afb2aea5af9678d5dfdb9fce82e 100644 (file)
@@ -20,3 +20,8 @@ sock-make-sock-sk_stamp-thread-safe.patch
 usb-serial-pl2303-add-ids-for-hewlett-packard-hp-pos-pole-displays.patch
 usb-r8a66597-fix-a-possible-concurrency-use-after-free-bug-in-r8a66597_endpoint_disable.patch
 kvm-x86-use-jmp-to-invoke-kvm_spurious_fault-from-.fixup.patch
+ext4-fix-possible-use-after-free-in-ext4_quota_enable.patch
+ext4-missing-unlock-put_page-in-ext4_try_to_write_inline_data.patch
+ext4-force-inode-writes-when-nfsd-calls-commit_metadata.patch
+ext4-check-for-shutdown-and-r-o-file-system-in-ext4_write_inode.patch
+cdc-acm-fix-abnormal-data-rx-issue-for-mediatek-preloader.patch