commit:     236cc26e44d8452be4ed1fbe3f91a1ace569c974
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Thu Jun  2 18:01:00 2016 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Thu Jun  2 18:01:00 2016 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=236cc26e

Linux patch 3.14.71

 0000_README              |   4 +
 1070_linux-3.14.71.patch | 742 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 746 insertions(+)

diff --git a/0000_README b/0000_README
index 2cabaa5..e43b6d6 100644
--- a/0000_README
+++ b/0000_README
@@ -322,6 +322,10 @@ Patch:  1069_linux-3.14.70.patch
 From:   http://www.kernel.org
 Desc:   Linux 3.14.70
 
+Patch:  1070_linux-3.14.71.patch
+From:   http://www.kernel.org
+Desc:   Linux 3.14.71
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1070_linux-3.14.71.patch b/1070_linux-3.14.71.patch
new file mode 100644
index 0000000..5d3937d
--- /dev/null
+++ b/1070_linux-3.14.71.patch
@@ -0,0 +1,742 @@
+diff --git a/Makefile b/Makefile
+index bc3311a0893b..98282e65bb46 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 14
+-SUBLEVEL = 70
++SUBLEVEL = 71
+ EXTRAVERSION =
+ NAME = Remembering Coco
+ 
+diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
+index c612e37166ad..2036f191c56f 100644
+--- a/arch/arm/kvm/mmu.c
++++ b/arch/arm/kvm/mmu.c
+@@ -682,11 +682,14 @@ static int stage2_set_pmd_huge(struct kvm *kvm, struct 
kvm_mmu_memory_cache
+       VM_BUG_ON(pmd_present(*pmd) && pmd_pfn(*pmd) != pmd_pfn(*new_pmd));
+ 
+       old_pmd = *pmd;
+-      kvm_set_pmd(pmd, *new_pmd);
+-      if (pmd_present(old_pmd))
++      if (pmd_present(old_pmd)) {
++              pmd_clear(pmd);
+               kvm_tlb_flush_vmid_ipa(kvm, addr);
+-      else
++      } else {
+               get_page(virt_to_page(pmd));
++      }
++
++      kvm_set_pmd(pmd, *new_pmd);
+       return 0;
+ }
+ 
+@@ -723,12 +726,14 @@ static int stage2_set_pte(struct kvm *kvm, struct 
kvm_mmu_memory_cache *cache,
+ 
+       /* Create 2nd stage page table mapping - Level 3 */
+       old_pte = *pte;
+-      kvm_set_pte(pte, *new_pte);
+-      if (pte_present(old_pte))
++      if (pte_present(old_pte)) {
++              kvm_set_pte(pte, __pte(0));
+               kvm_tlb_flush_vmid_ipa(kvm, addr);
+-      else
++      } else {
+               get_page(virt_to_page(pte));
++      }
+ 
++      kvm_set_pte(pte, *new_pte);
+       return 0;
+ }
+ 
+diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
+index 726c969b8a81..f83020db593a 100644
+--- a/drivers/acpi/osl.c
++++ b/drivers/acpi/osl.c
+@@ -138,7 +138,7 @@ static struct osi_linux {
+       unsigned int    enable:1;
+       unsigned int    dmi:1;
+       unsigned int    cmdline:1;
+-      unsigned int    default_disabling:1;
++      u8              default_disabling;
+ } osi_linux = {0, 0, 0, 0};
+ 
+ static u32 acpi_osi_handler(acpi_string interface, u32 supported)
+@@ -1420,10 +1420,13 @@ void __init acpi_osi_setup(char *str)
+       if (*str == '!') {
+               str++;
+               if (*str == '\0') {
+-                      osi_linux.default_disabling = 1;
++                      /* Do not override acpi_osi=!* */
++                      if (!osi_linux.default_disabling)
++                              osi_linux.default_disabling =
++                                      ACPI_DISABLE_ALL_VENDOR_STRINGS;
+                       return;
+               } else if (*str == '*') {
+-                      acpi_update_interfaces(ACPI_DISABLE_ALL_STRINGS);
++                      osi_linux.default_disabling = ACPI_DISABLE_ALL_STRINGS;
+                       for (i = 0; i < OSI_STRING_ENTRIES_MAX; i++) {
+                               osi = &osi_setup_entries[i];
+                               osi->enable = false;
+@@ -1496,10 +1499,13 @@ static void __init acpi_osi_setup_late(void)
+       acpi_status status;
+ 
+       if (osi_linux.default_disabling) {
+-              status = 
acpi_update_interfaces(ACPI_DISABLE_ALL_VENDOR_STRINGS);
++              status = acpi_update_interfaces(osi_linux.default_disabling);
+ 
+               if (ACPI_SUCCESS(status))
+-                      printk(KERN_INFO PREFIX "Disabled all _OSI OS 
vendors\n");
++                      printk(KERN_INFO PREFIX "Disabled all _OSI OS 
vendors%s\n",
++                              osi_linux.default_disabling ==
++                              ACPI_DISABLE_ALL_STRINGS ?
++                              " and feature groups" : "");
+       }
+ 
+       for (i = 0; i < OSI_STRING_ENTRIES_MAX; i++) {
+diff --git a/drivers/bluetooth/hci_vhci.c b/drivers/bluetooth/hci_vhci.c
+index 1ef6990a5c7e..bbe6643e299d 100644
+--- a/drivers/bluetooth/hci_vhci.c
++++ b/drivers/bluetooth/hci_vhci.c
+@@ -340,6 +340,7 @@ static int vhci_release(struct inode *inode, struct file 
*file)
+               hci_free_dev(hdev);
+       }
+ 
++      skb_queue_purge(&data->readq);
+       file->private_data = NULL;
+       kfree(data);
+ 
+diff --git a/drivers/crypto/caam/jr.c b/drivers/crypto/caam/jr.c
+index b512a4ba7569..33308810d1b5 100644
+--- a/drivers/crypto/caam/jr.c
++++ b/drivers/crypto/caam/jr.c
+@@ -244,7 +244,7 @@ static void caam_jr_dequeue(unsigned long devarg)
+ struct device *caam_jr_alloc(void)
+ {
+       struct caam_drv_private_jr *jrpriv, *min_jrpriv = NULL;
+-      struct device *dev = NULL;
++      struct device *dev = ERR_PTR(-ENODEV);
+       int min_tfm_cnt = INT_MAX;
+       int tfm_cnt;
+ 
+diff --git a/drivers/mfd/omap-usb-tll.c b/drivers/mfd/omap-usb-tll.c
+index 5ee50f779ef6..0ce45874c14b 100644
+--- a/drivers/mfd/omap-usb-tll.c
++++ b/drivers/mfd/omap-usb-tll.c
+@@ -269,6 +269,8 @@ static int usbtll_omap_probe(struct platform_device *pdev)
+ 
+               if (IS_ERR(tll->ch_clk[i]))
+                       dev_dbg(dev, "can't get clock : %s\n", clkname);
++              else
++                      clk_prepare(tll->ch_clk[i]);
+       }
+ 
+       pm_runtime_put_sync(dev);
+@@ -301,9 +303,12 @@ static int usbtll_omap_remove(struct platform_device 
*pdev)
+       tll_dev = NULL;
+       spin_unlock(&tll_lock);
+ 
+-      for (i = 0; i < tll->nch; i++)
+-              if (!IS_ERR(tll->ch_clk[i]))
++      for (i = 0; i < tll->nch; i++) {
++              if (!IS_ERR(tll->ch_clk[i])) {
++                      clk_unprepare(tll->ch_clk[i]);
+                       clk_put(tll->ch_clk[i]);
++              }
++      }
+ 
+       pm_runtime_disable(&pdev->dev);
+       return 0;
+@@ -421,7 +426,7 @@ int omap_tll_enable(struct usbhs_omap_platform_data *pdata)
+                       if (IS_ERR(tll->ch_clk[i]))
+                               continue;
+ 
+-                      r = clk_prepare_enable(tll->ch_clk[i]);
++                      r = clk_enable(tll->ch_clk[i]);
+                       if (r) {
+                               dev_err(tll_dev,
+                                "Error enabling ch %d clock: %d\n", i, r);
+@@ -449,7 +454,7 @@ int omap_tll_disable(struct usbhs_omap_platform_data 
*pdata)
+       for (i = 0; i < tll->nch; i++) {
+               if (omap_usb_mode_needs_tll(pdata->port_mode[i])) {
+                       if (!IS_ERR(tll->ch_clk[i]))
+-                              clk_disable_unprepare(tll->ch_clk[i]);
++                              clk_disable(tll->ch_clk[i]);
+               }
+       }
+ 
+diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
+index 92aeb1d2b41b..508380b6a10d 100644
+--- a/drivers/mmc/card/block.c
++++ b/drivers/mmc/card/block.c
+@@ -2352,11 +2352,12 @@ static const struct mmc_fixup blk_fixups[] =
+                 MMC_QUIRK_BLK_NO_CMD23),
+ 
+       /*
+-       * Some Micron MMC cards needs longer data read timeout than
+-       * indicated in CSD.
++       * Some MMC cards need longer data read timeout than indicated in CSD.
+        */
+       MMC_FIXUP(CID_NAME_ANY, CID_MANFID_MICRON, 0x200, add_quirk_mmc,
+                 MMC_QUIRK_LONG_READ_TIME),
++      MMC_FIXUP("008GE0", CID_MANFID_TOSHIBA, CID_OEMID_ANY, add_quirk_mmc,
++                MMC_QUIRK_LONG_READ_TIME),
+ 
+       /*
+        * On these Samsung MoviNAND parts, performing secure erase or
+diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
+index 4a50b5049c51..1bbe372a9e04 100644
+--- a/drivers/mmc/core/core.c
++++ b/drivers/mmc/core/core.c
+@@ -822,11 +822,11 @@ void mmc_set_data_timeout(struct mmc_data *data, const 
struct mmc_card *card)
+       /*
+        * Some cards require longer data read timeout than indicated in CSD.
+        * Address this by setting the read timeout to a "reasonably high"
+-       * value. For the cards tested, 300ms has proven enough. If necessary,
++       * value. For the cards tested, 600ms has proven enough. If necessary,
+        * this value can be increased if other problematic cards require this.
+        */
+       if (mmc_card_long_read_time(card) && data->flags & MMC_DATA_READ) {
+-              data->timeout_ns = 300000000;
++              data->timeout_ns = 600000000;
+               data->timeout_clks = 0;
+       }
+ 
+diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
+index 98e9eb0f6643..229407229ecd 100644
+--- a/drivers/mmc/core/mmc.c
++++ b/drivers/mmc/core/mmc.c
+@@ -267,6 +267,9 @@ static void mmc_select_card_type(struct mmc_card *card)
+       card->ext_csd.card_type = card_type;
+ }
+ 
++/* Minimum partition switch timeout in milliseconds */
++#define MMC_MIN_PART_SWITCH_TIME      300
++
+ /*
+  * Decode extended CSD.
+  */
+@@ -331,6 +334,10 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 
*ext_csd)
+ 
+               /* EXT_CSD value is in units of 10ms, but we store in ms */
+               card->ext_csd.part_time = 10 * 
ext_csd[EXT_CSD_PART_SWITCH_TIME];
++              /* Some eMMC set the value too low so set a minimum */
++              if (card->ext_csd.part_time &&
++                  card->ext_csd.part_time < MMC_MIN_PART_SWITCH_TIME)
++                      card->ext_csd.part_time = MMC_MIN_PART_SWITCH_TIME;
+ 
+               /* Sleep / awake timeout in 100ns units */
+               if (sa_shift > 0 && sa_shift <= 0x17)
+diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
+index 7d3a3f5cb5ba..0a70d12fe33c 100644
+--- a/drivers/tty/serial/samsung.c
++++ b/drivers/tty/serial/samsung.c
+@@ -734,6 +734,8 @@ static void s3c24xx_serial_set_termios(struct uart_port 
*port,
+       /* check to see if we need  to change clock source */
+ 
+       if (ourport->baudclk != clk) {
++              clk_prepare_enable(clk);
++
+               s3c24xx_serial_setsource(port, clk_sel);
+ 
+               if (!IS_ERR(ourport->baudclk)) {
+@@ -741,8 +743,6 @@ static void s3c24xx_serial_set_termios(struct uart_port 
*port,
+                       ourport->baudclk = ERR_PTR(-EINVAL);
+               }
+ 
+-              clk_prepare_enable(clk);
+-
+               ourport->baudclk = clk;
+               ourport->baudclk_rate = clk ? clk_get_rate(clk) : 0;
+       }
+diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
+index 693091ab726b..abf17b6fe237 100644
+--- a/drivers/tty/vt/vt.c
++++ b/drivers/tty/vt/vt.c
+@@ -3512,9 +3512,10 @@ static int do_register_con_driver(const struct consw 
*csw, int first, int last)
+               goto err;
+ 
+       desc = csw->con_startup();
+-
+-      if (!desc)
++      if (!desc) {
++              retval = -ENODEV;
+               goto err;
++      }
+ 
+       retval = -EINVAL;
+ 
+diff --git a/drivers/usb/serial/io_edgeport.c 
b/drivers/usb/serial/io_edgeport.c
+index c0866971db2b..1947ea0e0988 100644
+--- a/drivers/usb/serial/io_edgeport.c
++++ b/drivers/usb/serial/io_edgeport.c
+@@ -2856,14 +2856,16 @@ static int edge_startup(struct usb_serial *serial)
+                               /* not set up yet, so do it now */
+                               edge_serial->interrupt_read_urb =
+                                               usb_alloc_urb(0, GFP_KERNEL);
+-                              if (!edge_serial->interrupt_read_urb)
+-                                      return -ENOMEM;
++                              if (!edge_serial->interrupt_read_urb) {
++                                      response = -ENOMEM;
++                                      break;
++                              }
+ 
+                               edge_serial->interrupt_in_buffer =
+                                       kmalloc(buffer_size, GFP_KERNEL);
+                               if (!edge_serial->interrupt_in_buffer) {
+-                                      
usb_free_urb(edge_serial->interrupt_read_urb);
+-                                      return -ENOMEM;
++                                      response = -ENOMEM;
++                                      break;
+                               }
+                               edge_serial->interrupt_in_endpoint =
+                                               endpoint->bEndpointAddress;
+@@ -2891,14 +2893,16 @@ static int edge_startup(struct usb_serial *serial)
+                               /* not set up yet, so do it now */
+                               edge_serial->read_urb =
+                                               usb_alloc_urb(0, GFP_KERNEL);
+-                              if (!edge_serial->read_urb)
+-                                      return -ENOMEM;
++                              if (!edge_serial->read_urb) {
++                                      response = -ENOMEM;
++                                      break;
++                              }
+ 
+                               edge_serial->bulk_in_buffer =
+                                       kmalloc(buffer_size, GFP_KERNEL);
+                               if (!edge_serial->bulk_in_buffer) {
+-                                      usb_free_urb(edge_serial->read_urb);
+-                                      return -ENOMEM;
++                                      response = -ENOMEM;
++                                      break;
+                               }
+                               edge_serial->bulk_in_endpoint =
+                                               endpoint->bEndpointAddress;
+@@ -2924,9 +2928,22 @@ static int edge_startup(struct usb_serial *serial)
+                       }
+               }
+ 
+-              if (!interrupt_in_found || !bulk_in_found || !bulk_out_found) {
+-                      dev_err(ddev, "Error - the proper endpoints were not 
found!\n");
+-                      return -ENODEV;
++              if (response || !interrupt_in_found || !bulk_in_found ||
++                                                      !bulk_out_found) {
++                      if (!response) {
++                              dev_err(ddev, "expected endpoints not found\n");
++                              response = -ENODEV;
++                      }
++
++                      usb_free_urb(edge_serial->interrupt_read_urb);
++                      kfree(edge_serial->interrupt_in_buffer);
++
++                      usb_free_urb(edge_serial->read_urb);
++                      kfree(edge_serial->bulk_in_buffer);
++
++                      kfree(edge_serial);
++
++                      return response;
+               }
+ 
+               /* start interrupt read for this edgeport this interrupt will
+@@ -2949,16 +2966,9 @@ static void edge_disconnect(struct usb_serial *serial)
+ {
+       struct edgeport_serial *edge_serial = usb_get_serial_data(serial);
+ 
+-      /* stop reads and writes on all ports */
+-      /* free up our endpoint stuff */
+       if (edge_serial->is_epic) {
+               usb_kill_urb(edge_serial->interrupt_read_urb);
+-              usb_free_urb(edge_serial->interrupt_read_urb);
+-              kfree(edge_serial->interrupt_in_buffer);
+-
+               usb_kill_urb(edge_serial->read_urb);
+-              usb_free_urb(edge_serial->read_urb);
+-              kfree(edge_serial->bulk_in_buffer);
+       }
+ }
+ 
+@@ -2971,6 +2981,16 @@ static void edge_release(struct usb_serial *serial)
+ {
+       struct edgeport_serial *edge_serial = usb_get_serial_data(serial);
+ 
++      if (edge_serial->is_epic) {
++              usb_kill_urb(edge_serial->interrupt_read_urb);
++              usb_free_urb(edge_serial->interrupt_read_urb);
++              kfree(edge_serial->interrupt_in_buffer);
++
++              usb_kill_urb(edge_serial->read_urb);
++              usb_free_urb(edge_serial->read_urb);
++              kfree(edge_serial->bulk_in_buffer);
++      }
++
+       kfree(edge_serial);
+ }
+ 
+diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
+index 35297a845a63..118dba285b5d 100644
+--- a/drivers/usb/serial/keyspan.c
++++ b/drivers/usb/serial/keyspan.c
+@@ -2406,6 +2406,10 @@ static void keyspan_release(struct usb_serial *serial)
+ 
+       s_priv = usb_get_serial_data(serial);
+ 
++      /* Make sure to unlink the URBs submitted in attach. */
++      usb_kill_urb(s_priv->instat_urb);
++      usb_kill_urb(s_priv->indat_urb);
++
+       usb_free_urb(s_priv->instat_urb);
+       usb_free_urb(s_priv->indat_urb);
+       usb_free_urb(s_priv->glocont_urb);
+diff --git a/drivers/usb/serial/mxuport.c b/drivers/usb/serial/mxuport.c
+index 460a40669967..d029b2fc0f75 100644
+--- a/drivers/usb/serial/mxuport.c
++++ b/drivers/usb/serial/mxuport.c
+@@ -1263,6 +1263,15 @@ static int mxuport_attach(struct usb_serial *serial)
+       return 0;
+ }
+ 
++static void mxuport_release(struct usb_serial *serial)
++{
++      struct usb_serial_port *port0 = serial->port[0];
++      struct usb_serial_port *port1 = serial->port[1];
++
++      usb_serial_generic_close(port1);
++      usb_serial_generic_close(port0);
++}
++
+ static int mxuport_open(struct tty_struct *tty, struct usb_serial_port *port)
+ {
+       struct mxuport_port *mxport = usb_get_serial_port_data(port);
+@@ -1365,6 +1374,7 @@ static struct usb_serial_driver mxuport_device = {
+       .probe                  = mxuport_probe,
+       .port_probe             = mxuport_port_probe,
+       .attach                 = mxuport_attach,
++      .release                = mxuport_release,
+       .calc_num_ports         = mxuport_calc_num_ports,
+       .open                   = mxuport_open,
+       .close                  = mxuport_close,
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 99c89d7fa1ad..bcb6f5c2bae4 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -375,18 +375,22 @@ static void option_instat_callback(struct urb *urb);
+ #define HAIER_PRODUCT_CE81B                   0x10f8
+ #define HAIER_PRODUCT_CE100                   0x2009
+ 
+-/* Cinterion (formerly Siemens) products */
+-#define SIEMENS_VENDOR_ID                             0x0681
+-#define CINTERION_VENDOR_ID                           0x1e2d
++/* Gemalto's Cinterion products (formerly Siemens) */
++#define SIEMENS_VENDOR_ID                     0x0681
++#define CINTERION_VENDOR_ID                   0x1e2d
++#define CINTERION_PRODUCT_HC25_MDMNET         0x0040
+ #define CINTERION_PRODUCT_HC25_MDM            0x0047
+-#define CINTERION_PRODUCT_HC25_MDMNET 0x0040
++#define CINTERION_PRODUCT_HC28_MDMNET         0x004A /* same for HC28J */
+ #define CINTERION_PRODUCT_HC28_MDM            0x004C
+-#define CINTERION_PRODUCT_HC28_MDMNET 0x004A /* same for HC28J */
+ #define CINTERION_PRODUCT_EU3_E                       0x0051
+ #define CINTERION_PRODUCT_EU3_P                       0x0052
+ #define CINTERION_PRODUCT_PH8                 0x0053
+ #define CINTERION_PRODUCT_AHXX                        0x0055
+ #define CINTERION_PRODUCT_PLXX                        0x0060
++#define CINTERION_PRODUCT_PH8_2RMNET          0x0082
++#define CINTERION_PRODUCT_PH8_AUDIO           0x0083
++#define CINTERION_PRODUCT_AHXX_2RMNET         0x0084
++#define CINTERION_PRODUCT_AHXX_AUDIO          0x0085
+ 
+ /* Olivetti products */
+ #define OLIVETTI_VENDOR_ID                    0x0b3c
+@@ -641,6 +645,10 @@ static const struct option_blacklist_info 
telit_le922_blacklist_usbcfg3 = {
+       .reserved = BIT(1) | BIT(2) | BIT(3),
+ };
+ 
++static const struct option_blacklist_info cinterion_rmnet2_blacklist = {
++      .reserved = BIT(4) | BIT(5),
++};
++
+ static const struct usb_device_id option_ids[] = {
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
+@@ -1712,7 +1720,13 @@ static const struct usb_device_id option_ids[] = {
+       { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, 
CINTERION_PRODUCT_AHXX, 0xff) },
+       { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLXX),
+               .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
+-      { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) }, 
++      { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, 
CINTERION_PRODUCT_PH8_2RMNET, 0xff),
++              .driver_info = (kernel_ulong_t)&cinterion_rmnet2_blacklist },
++      { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, 
CINTERION_PRODUCT_PH8_AUDIO, 0xff),
++              .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
++      { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, 
CINTERION_PRODUCT_AHXX_2RMNET, 0xff) },
++      { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, 
CINTERION_PRODUCT_AHXX_AUDIO, 0xff) },
++      { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) },
+       { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) },
+       { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDM) },
+       { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDMNET) },
+diff --git a/drivers/usb/serial/quatech2.c b/drivers/usb/serial/quatech2.c
+index 7725ed261ed6..62e449db24c3 100644
+--- a/drivers/usb/serial/quatech2.c
++++ b/drivers/usb/serial/quatech2.c
+@@ -141,6 +141,7 @@ static void qt2_release(struct usb_serial *serial)
+ 
+       serial_priv = usb_get_serial_data(serial);
+ 
++      usb_kill_urb(serial_priv->read_urb);
+       usb_free_urb(serial_priv->read_urb);
+       kfree(serial_priv->read_buffer);
+       kfree(serial_priv);
+diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
+index d40ae42ba6d4..a65fa2ae094f 100644
+--- a/fs/btrfs/ioctl.c
++++ b/fs/btrfs/ioctl.c
+@@ -1574,7 +1574,7 @@ static noinline int 
btrfs_ioctl_snap_create_transid(struct file *file,
+ 
+               src_inode = file_inode(src.file);
+               if (src_inode->i_sb != file_inode(file)->i_sb) {
+-                      btrfs_info(BTRFS_I(src_inode)->root->fs_info,
++                      btrfs_info(BTRFS_I(file_inode(file))->root->fs_info,
+                                  "Snapshot src from another FS");
+                       ret = -EINVAL;
+               } else if (!inode_owner_or_capable(src_inode)) {
+diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
+index e87387dbf39f..bbb50be00ef5 100644
+--- a/fs/cifs/sess.c
++++ b/fs/cifs/sess.c
+@@ -399,19 +399,27 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
+       sec_blob->LmChallengeResponse.MaximumLength = 0;
+ 
+       sec_blob->NtChallengeResponse.BufferOffset = cpu_to_le32(tmp - pbuffer);
+-      rc = setup_ntlmv2_rsp(ses, nls_cp);
+-      if (rc) {
+-              cifs_dbg(VFS, "Error %d during NTLMSSP authentication\n", rc);
+-              goto setup_ntlmv2_ret;
+-      }
+-      memcpy(tmp, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
+-                      ses->auth_key.len - CIFS_SESS_KEY_SIZE);
+-      tmp += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
++      if (ses->user_name != NULL) {
++              rc = setup_ntlmv2_rsp(ses, nls_cp);
++              if (rc) {
++                      cifs_dbg(VFS, "Error %d during NTLMSSP 
authentication\n", rc);
++                      goto setup_ntlmv2_ret;
++              }
++              memcpy(tmp, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
++                              ses->auth_key.len - CIFS_SESS_KEY_SIZE);
++              tmp += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
+ 
+-      sec_blob->NtChallengeResponse.Length =
+-                      cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
+-      sec_blob->NtChallengeResponse.MaximumLength =
+-                      cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
++              sec_blob->NtChallengeResponse.Length =
++                              cpu_to_le16(ses->auth_key.len - 
CIFS_SESS_KEY_SIZE);
++              sec_blob->NtChallengeResponse.MaximumLength =
++                              cpu_to_le16(ses->auth_key.len - 
CIFS_SESS_KEY_SIZE);
++      } else {
++              /*
++               * don't send an NT Response for anonymous access
++               */
++              sec_blob->NtChallengeResponse.Length = 0;
++              sec_blob->NtChallengeResponse.MaximumLength = 0;
++      }
+ 
+       if (ses->domainName == NULL) {
+               sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
+diff --git a/fs/cifs/smb2glob.h b/fs/cifs/smb2glob.h
+index bc0bb9c34f72..0ffa18094335 100644
+--- a/fs/cifs/smb2glob.h
++++ b/fs/cifs/smb2glob.h
+@@ -44,6 +44,7 @@
+ #define SMB2_OP_DELETE 7
+ #define SMB2_OP_HARDLINK 8
+ #define SMB2_OP_SET_EOF 9
++#define SMB2_OP_RMDIR 10
+ 
+ /* Used when constructing chained read requests. */
+ #define CHAINED_REQUEST 1
+diff --git a/fs/cifs/smb2inode.c b/fs/cifs/smb2inode.c
+index 215f8d3e3e53..f970c5d5b253 100644
+--- a/fs/cifs/smb2inode.c
++++ b/fs/cifs/smb2inode.c
+@@ -80,6 +80,10 @@ smb2_open_op_close(const unsigned int xid, struct cifs_tcon 
*tcon,
+                * SMB2_open() call.
+                */
+               break;
++      case SMB2_OP_RMDIR:
++              tmprc = SMB2_rmdir(xid, tcon, fid.persistent_fid,
++                                 fid.volatile_fid);
++              break;
+       case SMB2_OP_RENAME:
+               tmprc = SMB2_rename(xid, tcon, fid.persistent_fid,
+                                   fid.volatile_fid, (__le16 *)data);
+@@ -191,8 +195,8 @@ smb2_rmdir(const unsigned int xid, struct cifs_tcon *tcon, 
const char *name,
+          struct cifs_sb_info *cifs_sb)
+ {
+       return smb2_open_op_close(xid, tcon, cifs_sb, name, DELETE, FILE_OPEN,
+-                                CREATE_NOT_FILE | CREATE_DELETE_ON_CLOSE,
+-                                NULL, SMB2_OP_DELETE);
++                                CREATE_NOT_FILE,
++                                NULL, SMB2_OP_RMDIR);
+ }
+ 
+ int
+diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
+index ae375dff03da..fc656bc5d6cb 100644
+--- a/fs/cifs/smb2pdu.c
++++ b/fs/cifs/smb2pdu.c
+@@ -2291,6 +2291,22 @@ SMB2_rename(const unsigned int xid, struct cifs_tcon 
*tcon,
+ }
+ 
+ int
++SMB2_rmdir(const unsigned int xid, struct cifs_tcon *tcon,
++                u64 persistent_fid, u64 volatile_fid)
++{
++      __u8 delete_pending = 1;
++      void *data;
++      unsigned int size;
++
++      data = &delete_pending;
++      size = 1; /* sizeof __u8 */
++
++      return send_set_info(xid, tcon, persistent_fid, volatile_fid,
++                      current->tgid, FILE_DISPOSITION_INFORMATION, 1, &data,
++                      &size);
++}
++
++int
+ SMB2_set_hardlink(const unsigned int xid, struct cifs_tcon *tcon,
+                 u64 persistent_fid, u64 volatile_fid, __le16 *target_file)
+ {
+diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h
+index 0ce48db20a65..8e0d57bf446b 100644
+--- a/fs/cifs/smb2proto.h
++++ b/fs/cifs/smb2proto.h
+@@ -134,6 +134,8 @@ extern int SMB2_query_directory(const unsigned int xid, 
struct cifs_tcon *tcon,
+ extern int SMB2_rename(const unsigned int xid, struct cifs_tcon *tcon,
+                      u64 persistent_fid, u64 volatile_fid,
+                      __le16 *target_file);
++extern int SMB2_rmdir(const unsigned int xid, struct cifs_tcon *tcon,
++                    u64 persistent_fid, u64 volatile_fid);
+ extern int SMB2_set_hardlink(const unsigned int xid, struct cifs_tcon *tcon,
+                            u64 persistent_fid, u64 volatile_fid,
+                            __le16 *target_file);
+diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
+index c798ed2fc281..0d3af0a47c6d 100644
+--- a/kernel/trace/ring_buffer.c
++++ b/kernel/trace/ring_buffer.c
+@@ -463,7 +463,7 @@ struct ring_buffer_per_cpu {
+       raw_spinlock_t                  reader_lock;    /* serialize readers */
+       arch_spinlock_t                 lock;
+       struct lock_class_key           lock_key;
+-      unsigned int                    nr_pages;
++      unsigned long                   nr_pages;
+       struct list_head                *pages;
+       struct buffer_page              *head_page;     /* read from head */
+       struct buffer_page              *tail_page;     /* write to tail */
+@@ -483,7 +483,7 @@ struct ring_buffer_per_cpu {
+       u64                             write_stamp;
+       u64                             read_stamp;
+       /* ring buffer pages to update, > 0 to add, < 0 to remove */
+-      int                             nr_pages_to_update;
++      long                            nr_pages_to_update;
+       struct list_head                new_pages; /* new pages to add */
+       struct work_struct              update_pages_work;
+       struct completion               update_done;
+@@ -1120,10 +1120,10 @@ static int rb_check_pages(struct ring_buffer_per_cpu 
*cpu_buffer)
+       return 0;
+ }
+ 
+-static int __rb_allocate_pages(int nr_pages, struct list_head *pages, int cpu)
++static int __rb_allocate_pages(long nr_pages, struct list_head *pages, int 
cpu)
+ {
+-      int i;
+       struct buffer_page *bpage, *tmp;
++      long i;
+ 
+       for (i = 0; i < nr_pages; i++) {
+               struct page *page;
+@@ -1160,7 +1160,7 @@ free_pages:
+ }
+ 
+ static int rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer,
+-                           unsigned nr_pages)
++                           unsigned long nr_pages)
+ {
+       LIST_HEAD(pages);
+ 
+@@ -1185,7 +1185,7 @@ static int rb_allocate_pages(struct ring_buffer_per_cpu 
*cpu_buffer,
+ }
+ 
+ static struct ring_buffer_per_cpu *
+-rb_allocate_cpu_buffer(struct ring_buffer *buffer, int nr_pages, int cpu)
++rb_allocate_cpu_buffer(struct ring_buffer *buffer, long nr_pages, int cpu)
+ {
+       struct ring_buffer_per_cpu *cpu_buffer;
+       struct buffer_page *bpage;
+@@ -1284,8 +1284,9 @@ struct ring_buffer *__ring_buffer_alloc(unsigned long 
size, unsigned flags,
+                                       struct lock_class_key *key)
+ {
+       struct ring_buffer *buffer;
++      long nr_pages;
+       int bsize;
+-      int cpu, nr_pages;
++      int cpu;
+ 
+       /* keep it in its own cache line */
+       buffer = kzalloc(ALIGN(sizeof(*buffer), cache_line_size()),
+@@ -1408,12 +1409,12 @@ static inline unsigned long rb_page_write(struct 
buffer_page *bpage)
+ }
+ 
+ static int
+-rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned int nr_pages)
++rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned long 
nr_pages)
+ {
+       struct list_head *tail_page, *to_remove, *next_page;
+       struct buffer_page *to_remove_page, *tmp_iter_page;
+       struct buffer_page *last_page, *first_page;
+-      unsigned int nr_removed;
++      unsigned long nr_removed;
+       unsigned long head_bit;
+       int page_entries;
+ 
+@@ -1630,7 +1631,7 @@ int ring_buffer_resize(struct ring_buffer *buffer, 
unsigned long size,
+                       int cpu_id)
+ {
+       struct ring_buffer_per_cpu *cpu_buffer;
+-      unsigned nr_pages;
++      unsigned long nr_pages;
+       int cpu, err = 0;
+ 
+       /*
+@@ -1644,14 +1645,13 @@ int ring_buffer_resize(struct ring_buffer *buffer, 
unsigned long size,
+           !cpumask_test_cpu(cpu_id, buffer->cpumask))
+               return size;
+ 
+-      size = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
+-      size *= BUF_PAGE_SIZE;
++      nr_pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
+ 
+       /* we need a minimum of two pages */
+-      if (size < BUF_PAGE_SIZE * 2)
+-              size = BUF_PAGE_SIZE * 2;
++      if (nr_pages < 2)
++              nr_pages = 2;
+ 
+-      nr_pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
++      size = nr_pages * BUF_PAGE_SIZE;
+ 
+       /*
+        * Don't succeed if resizing is disabled, as a reader might be
+@@ -4609,8 +4609,9 @@ static int rb_cpu_notify(struct notifier_block *self,
+       struct ring_buffer *buffer =
+               container_of(self, struct ring_buffer, cpu_notify);
+       long cpu = (long)hcpu;
+-      int cpu_i, nr_pages_same;
+-      unsigned int nr_pages;
++      long nr_pages_same;
++      int cpu_i;
++      unsigned long nr_pages;
+ 
+       switch (action) {
+       case CPU_UP_PREPARE:

Reply via email to