commit:     586e8ad56c51f3844347707c9b20aa666796fbdf
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Sat Oct 22 13:08:18 2016 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Sat Oct 22 13:08:18 2016 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=586e8ad5

Linux patch 4.8.4

 0000_README            |    4 +
 1003_linux-4.8.4.patch | 2264 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 2268 insertions(+)

diff --git a/0000_README b/0000_README
index f814c9e..5a8b43e 100644
--- a/0000_README
+++ b/0000_README
@@ -55,6 +55,10 @@ Patch:  1002_linux-4.8.3.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.8.3
 
+Patch:  1003_linux-4.8.4.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.8.4
+
 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/1003_linux-4.8.4.patch b/1003_linux-4.8.4.patch
new file mode 100644
index 0000000..bb2930c
--- /dev/null
+++ b/1003_linux-4.8.4.patch
@@ -0,0 +1,2264 @@
+diff --git a/MAINTAINERS b/MAINTAINERS
+index f593300e310b..babaf8261941 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -12951,11 +12951,10 @@ F:   arch/x86/xen/*swiotlb*
+ F:    drivers/xen/*swiotlb*
+ 
+ XFS FILESYSTEM
+-P:    Silicon Graphics Inc
+ M:    Dave Chinner <[email protected]>
+-M:    [email protected]
+-L:    [email protected]
+-W:    http://oss.sgi.com/projects/xfs
++M:    [email protected]
++L:    [email protected]
++W:    http://xfs.org/
+ T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git
+ S:    Supported
+ F:    Documentation/filesystems/xfs.txt
+diff --git a/Makefile b/Makefile
+index 42eb45c86a42..82a36ab540a4 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 8
+-SUBLEVEL = 3
++SUBLEVEL = 4
+ EXTRAVERSION =
+ NAME = Psychotic Stoned Sheep
+ 
+diff --git a/arch/arc/include/asm/irqflags-arcv2.h 
b/arch/arc/include/asm/irqflags-arcv2.h
+index d1ec7f6b31e0..e880dfa3fcd3 100644
+--- a/arch/arc/include/asm/irqflags-arcv2.h
++++ b/arch/arc/include/asm/irqflags-arcv2.h
+@@ -112,7 +112,7 @@ static inline long arch_local_save_flags(void)
+        */
+       temp = (1 << 5) |
+               ((!!(temp & STATUS_IE_MASK)) << CLRI_STATUS_IE_BIT) |
+-              (temp & CLRI_STATUS_E_MASK);
++              ((temp >> 1) & CLRI_STATUS_E_MASK);
+       return temp;
+ }
+ 
+diff --git a/arch/arc/kernel/intc-arcv2.c b/arch/arc/kernel/intc-arcv2.c
+index 6c24faf48b16..62b59409a5d9 100644
+--- a/arch/arc/kernel/intc-arcv2.c
++++ b/arch/arc/kernel/intc-arcv2.c
+@@ -74,7 +74,7 @@ void arc_init_IRQ(void)
+       tmp = read_aux_reg(0xa);
+       tmp |= STATUS_AD_MASK | (irq_prio << 1);
+       tmp &= ~STATUS_IE_MASK;
+-      asm volatile("flag %0   \n"::"r"(tmp));
++      asm volatile("kflag %0  \n"::"r"(tmp));
+ }
+ 
+ static void arcv2_irq_mask(struct irq_data *data)
+diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
+index cc2f6dbd4303..5e24d880306c 100644
+--- a/block/cfq-iosched.c
++++ b/block/cfq-iosched.c
+@@ -3042,7 +3042,6 @@ static struct request *cfq_check_fifo(struct cfq_queue 
*cfqq)
+       if (ktime_get_ns() < rq->fifo_time)
+               rq = NULL;
+ 
+-      cfq_log_cfqq(cfqq->cfqd, cfqq, "fifo=%p", rq);
+       return rq;
+ }
+ 
+@@ -3420,6 +3419,9 @@ static bool cfq_may_dispatch(struct cfq_data *cfqd, 
struct cfq_queue *cfqq)
+ {
+       unsigned int max_dispatch;
+ 
++      if (cfq_cfqq_must_dispatch(cfqq))
++              return true;
++
+       /*
+        * Drain async requests before we start sync IO
+        */
+@@ -3511,15 +3513,20 @@ static bool cfq_dispatch_request(struct cfq_data 
*cfqd, struct cfq_queue *cfqq)
+ 
+       BUG_ON(RB_EMPTY_ROOT(&cfqq->sort_list));
+ 
++      rq = cfq_check_fifo(cfqq);
++      if (rq)
++              cfq_mark_cfqq_must_dispatch(cfqq);
++
+       if (!cfq_may_dispatch(cfqd, cfqq))
+               return false;
+ 
+       /*
+        * follow expired path, else get first next available
+        */
+-      rq = cfq_check_fifo(cfqq);
+       if (!rq)
+               rq = cfqq->next_rq;
++      else
++              cfq_log_cfqq(cfqq->cfqd, cfqq, "fifo=%p", rq);
+ 
+       /*
+        * insert request into driver dispatch list
+@@ -3989,7 +3996,7 @@ cfq_should_preempt(struct cfq_data *cfqd, struct 
cfq_queue *new_cfqq,
+        * if the new request is sync, but the currently running queue is
+        * not, let the sync request have priority.
+        */
+-      if (rq_is_sync(rq) && !cfq_cfqq_sync(cfqq))
++      if (rq_is_sync(rq) && !cfq_cfqq_sync(cfqq) && 
!cfq_cfqq_must_dispatch(cfqq))
+               return true;
+ 
+       /*
+diff --git a/crypto/async_tx/async_pq.c b/crypto/async_tx/async_pq.c
+index 08b3ac68952b..f83de99d7d71 100644
+--- a/crypto/async_tx/async_pq.c
++++ b/crypto/async_tx/async_pq.c
+@@ -368,8 +368,6 @@ async_syndrome_val(struct page **blocks, unsigned int 
offset, int disks,
+ 
+               dma_set_unmap(tx, unmap);
+               async_tx_submit(chan, tx, submit);
+-
+-              return tx;
+       } else {
+               struct page *p_src = P(blocks, disks);
+               struct page *q_src = Q(blocks, disks);
+@@ -424,9 +422,11 @@ async_syndrome_val(struct page **blocks, unsigned int 
offset, int disks,
+               submit->cb_param = cb_param_orig;
+               submit->flags = flags_orig;
+               async_tx_sync_epilog(submit);
+-
+-              return NULL;
++              tx = NULL;
+       }
++      dmaengine_unmap_put(unmap);
++
++      return tx;
+ }
+ EXPORT_SYMBOL_GPL(async_syndrome_val);
+ 
+diff --git a/crypto/ghash-generic.c b/crypto/ghash-generic.c
+index bac70995e064..12ad3e3a84e3 100644
+--- a/crypto/ghash-generic.c
++++ b/crypto/ghash-generic.c
+@@ -14,24 +14,13 @@
+ 
+ #include <crypto/algapi.h>
+ #include <crypto/gf128mul.h>
++#include <crypto/ghash.h>
+ #include <crypto/internal/hash.h>
+ #include <linux/crypto.h>
+ #include <linux/init.h>
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ 
+-#define GHASH_BLOCK_SIZE      16
+-#define GHASH_DIGEST_SIZE     16
+-
+-struct ghash_ctx {
+-      struct gf128mul_4k *gf128;
+-};
+-
+-struct ghash_desc_ctx {
+-      u8 buffer[GHASH_BLOCK_SIZE];
+-      u32 bytes;
+-};
+-
+ static int ghash_init(struct shash_desc *desc)
+ {
+       struct ghash_desc_ctx *dctx = shash_desc_ctx(desc);
+diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
+index e1d5ea6d5e40..2accf784534e 100644
+--- a/drivers/acpi/nfit/core.c
++++ b/drivers/acpi/nfit/core.c
+@@ -2689,6 +2689,9 @@ static void acpi_nfit_notify(struct acpi_device *adev, 
u32 event)
+ 
+       dev_dbg(dev, "%s: event: %d\n", __func__, event);
+ 
++      if (event != NFIT_NOTIFY_UPDATE)
++              return;
++
+       device_lock(dev);
+       if (!dev->driver) {
+               /* dev->driver may be null if we're being removed */
+diff --git a/drivers/acpi/nfit/nfit.h b/drivers/acpi/nfit/nfit.h
+index e894ded24d99..51d23f130d86 100644
+--- a/drivers/acpi/nfit/nfit.h
++++ b/drivers/acpi/nfit/nfit.h
+@@ -78,6 +78,10 @@ enum {
+       NFIT_ARS_TIMEOUT = 90,
+ };
+ 
++enum nfit_root_notifiers {
++      NFIT_NOTIFY_UPDATE = 0x80,
++};
++
+ struct nfit_spa {
+       struct list_head list;
+       struct nd_region *nd_region;
+diff --git a/drivers/base/dma-mapping.c b/drivers/base/dma-mapping.c
+index d799662f19eb..261420ddfe66 100644
+--- a/drivers/base/dma-mapping.c
++++ b/drivers/base/dma-mapping.c
+@@ -334,7 +334,7 @@ void dma_common_free_remap(void *cpu_addr, size_t size, 
unsigned long vm_flags)
+               return;
+       }
+ 
+-      unmap_kernel_range((unsigned long)cpu_addr, size);
++      unmap_kernel_range((unsigned long)cpu_addr, PAGE_ALIGN(size));
+       vunmap(cpu_addr);
+ }
+ #endif
+diff --git a/drivers/clk/mvebu/cp110-system-controller.c 
b/drivers/clk/mvebu/cp110-system-controller.c
+index 7fa42d6b2b92..f2303da7fda7 100644
+--- a/drivers/clk/mvebu/cp110-system-controller.c
++++ b/drivers/clk/mvebu/cp110-system-controller.c
+@@ -81,13 +81,6 @@ enum {
+ #define CP110_GATE_EIP150             25
+ #define CP110_GATE_EIP197             26
+ 
+-static struct clk *cp110_clks[CP110_CLK_NUM];
+-
+-static struct clk_onecell_data cp110_clk_data = {
+-      .clks = cp110_clks,
+-      .clk_num = CP110_CLK_NUM,
+-};
+-
+ struct cp110_gate_clk {
+       struct clk_hw hw;
+       struct regmap *regmap;
+@@ -142,6 +135,8 @@ static struct clk *cp110_register_gate(const char *name,
+       if (!gate)
+               return ERR_PTR(-ENOMEM);
+ 
++      memset(&init, 0, sizeof(init));
++
+       init.name = name;
+       init.ops = &cp110_gate_ops;
+       init.parent_names = &parent_name;
+@@ -194,7 +189,8 @@ static int cp110_syscon_clk_probe(struct platform_device 
*pdev)
+       struct regmap *regmap;
+       struct device_node *np = pdev->dev.of_node;
+       const char *ppv2_name, *apll_name, *core_name, *eip_name, *nand_name;
+-      struct clk *clk;
++      struct clk_onecell_data *cp110_clk_data;
++      struct clk *clk, **cp110_clks;
+       u32 nand_clk_ctrl;
+       int i, ret;
+ 
+@@ -207,6 +203,20 @@ static int cp110_syscon_clk_probe(struct platform_device 
*pdev)
+       if (ret)
+               return ret;
+ 
++      cp110_clks = devm_kcalloc(&pdev->dev, sizeof(struct clk *),
++                                CP110_CLK_NUM, GFP_KERNEL);
++      if (!cp110_clks)
++              return -ENOMEM;
++
++      cp110_clk_data = devm_kzalloc(&pdev->dev,
++                                    sizeof(*cp110_clk_data),
++                                    GFP_KERNEL);
++      if (!cp110_clk_data)
++              return -ENOMEM;
++
++      cp110_clk_data->clks = cp110_clks;
++      cp110_clk_data->clk_num = CP110_CLK_NUM;
++
+       /* Register the APLL which is the root of the clk tree */
+       of_property_read_string_index(np, "core-clock-output-names",
+                                     CP110_CORE_APLL, &apll_name);
+@@ -334,10 +344,12 @@ static int cp110_syscon_clk_probe(struct platform_device 
*pdev)
+               cp110_clks[CP110_MAX_CORE_CLOCKS + i] = clk;
+       }
+ 
+-      ret = of_clk_add_provider(np, cp110_of_clk_get, &cp110_clk_data);
++      ret = of_clk_add_provider(np, cp110_of_clk_get, cp110_clk_data);
+       if (ret)
+               goto fail_clk_add;
+ 
++      platform_set_drvdata(pdev, cp110_clks);
++
+       return 0;
+ 
+ fail_clk_add:
+@@ -364,6 +376,7 @@ fail0:
+ 
+ static int cp110_syscon_clk_remove(struct platform_device *pdev)
+ {
++      struct clk **cp110_clks = platform_get_drvdata(pdev);
+       int i;
+ 
+       of_clk_del_provider(pdev->dev.of_node);
+diff --git a/drivers/crypto/vmx/ghash.c b/drivers/crypto/vmx/ghash.c
+index 6c999cb01b80..27a94a119009 100644
+--- a/drivers/crypto/vmx/ghash.c
++++ b/drivers/crypto/vmx/ghash.c
+@@ -26,16 +26,13 @@
+ #include <linux/hardirq.h>
+ #include <asm/switch_to.h>
+ #include <crypto/aes.h>
++#include <crypto/ghash.h>
+ #include <crypto/scatterwalk.h>
+ #include <crypto/internal/hash.h>
+ #include <crypto/b128ops.h>
+ 
+ #define IN_INTERRUPT in_interrupt()
+ 
+-#define GHASH_BLOCK_SIZE (16)
+-#define GHASH_DIGEST_SIZE (16)
+-#define GHASH_KEY_LEN (16)
+-
+ void gcm_init_p8(u128 htable[16], const u64 Xi[2]);
+ void gcm_gmult_p8(u64 Xi[2], const u128 htable[16]);
+ void gcm_ghash_p8(u64 Xi[2], const u128 htable[16],
+@@ -55,16 +52,11 @@ struct p8_ghash_desc_ctx {
+ 
+ static int p8_ghash_init_tfm(struct crypto_tfm *tfm)
+ {
+-      const char *alg;
++      const char *alg = "ghash-generic";
+       struct crypto_shash *fallback;
+       struct crypto_shash *shash_tfm = __crypto_shash_cast(tfm);
+       struct p8_ghash_ctx *ctx = crypto_tfm_ctx(tfm);
+ 
+-      if (!(alg = crypto_tfm_alg_name(tfm))) {
+-              printk(KERN_ERR "Failed to get algorithm name.\n");
+-              return -ENOENT;
+-      }
+-
+       fallback = crypto_alloc_shash(alg, 0, CRYPTO_ALG_NEED_FALLBACK);
+       if (IS_ERR(fallback)) {
+               printk(KERN_ERR
+@@ -78,10 +70,18 @@ static int p8_ghash_init_tfm(struct crypto_tfm *tfm)
+       crypto_shash_set_flags(fallback,
+                              crypto_shash_get_flags((struct crypto_shash
+                                                      *) tfm));
+-      ctx->fallback = fallback;
+ 
+-      shash_tfm->descsize = sizeof(struct p8_ghash_desc_ctx)
+-          + crypto_shash_descsize(fallback);
++      /* Check if the descsize defined in the algorithm is still enough. */
++      if (shash_tfm->descsize < sizeof(struct p8_ghash_desc_ctx)
++          + crypto_shash_descsize(fallback)) {
++              printk(KERN_ERR
++                     "Desc size of the fallback implementation (%s) does not 
match the expected value: %lu vs %u\n",
++                     alg,
++                     shash_tfm->descsize - sizeof(struct p8_ghash_desc_ctx),
++                     crypto_shash_descsize(fallback));
++              return -EINVAL;
++      }
++      ctx->fallback = fallback;
+ 
+       return 0;
+ }
+@@ -113,7 +113,7 @@ static int p8_ghash_setkey(struct crypto_shash *tfm, const 
u8 *key,
+ {
+       struct p8_ghash_ctx *ctx = crypto_tfm_ctx(crypto_shash_tfm(tfm));
+ 
+-      if (keylen != GHASH_KEY_LEN)
++      if (keylen != GHASH_BLOCK_SIZE)
+               return -EINVAL;
+ 
+       preempt_disable();
+@@ -211,7 +211,8 @@ struct shash_alg p8_ghash_alg = {
+       .update = p8_ghash_update,
+       .final = p8_ghash_final,
+       .setkey = p8_ghash_setkey,
+-      .descsize = sizeof(struct p8_ghash_desc_ctx),
++      .descsize = sizeof(struct p8_ghash_desc_ctx)
++              + sizeof(struct ghash_desc_ctx),
+       .base = {
+                .cra_name = "ghash",
+                .cra_driver_name = "p8_ghash",
+diff --git a/drivers/gpu/drm/virtio/virtgpu_drm_bus.c 
b/drivers/gpu/drm/virtio/virtgpu_drm_bus.c
+index 7f0e93f87a55..88a39165edd5 100644
+--- a/drivers/gpu/drm/virtio/virtgpu_drm_bus.c
++++ b/drivers/gpu/drm/virtio/virtgpu_drm_bus.c
+@@ -27,6 +27,16 @@
+ 
+ #include "virtgpu_drv.h"
+ 
++int drm_virtio_set_busid(struct drm_device *dev, struct drm_master *master)
++{
++      struct pci_dev *pdev = dev->pdev;
++
++      if (pdev) {
++              return drm_pci_set_busid(dev, master);
++      }
++      return 0;
++}
++
+ static void virtio_pci_kick_out_firmware_fb(struct pci_dev *pci_dev)
+ {
+       struct apertures_struct *ap;
+diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.c 
b/drivers/gpu/drm/virtio/virtgpu_drv.c
+index c13f70cfc461..5820b7020ae5 100644
+--- a/drivers/gpu/drm/virtio/virtgpu_drv.c
++++ b/drivers/gpu/drm/virtio/virtgpu_drv.c
+@@ -117,6 +117,7 @@ static const struct file_operations virtio_gpu_driver_fops 
= {
+ 
+ static struct drm_driver driver = {
+       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | 
DRIVER_RENDER | DRIVER_ATOMIC,
++      .set_busid = drm_virtio_set_busid,
+       .load = virtio_gpu_driver_load,
+       .unload = virtio_gpu_driver_unload,
+       .open = virtio_gpu_driver_open,
+diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h 
b/drivers/gpu/drm/virtio/virtgpu_drv.h
+index b18ef3111f0c..acf556a35cb2 100644
+--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
++++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
+@@ -49,6 +49,7 @@
+ #define DRIVER_PATCHLEVEL 1
+ 
+ /* virtgpu_drm_bus.c */
++int drm_virtio_set_busid(struct drm_device *dev, struct drm_master *master);
+ int drm_virtio_init(struct drm_driver *driver, struct virtio_device *vdev);
+ 
+ struct virtio_gpu_object {
+diff --git a/drivers/infiniband/hw/hfi1/rc.c b/drivers/infiniband/hw/hfi1/rc.c
+index 5da190e6011b..bcf76c33726b 100644
+--- a/drivers/infiniband/hw/hfi1/rc.c
++++ b/drivers/infiniband/hw/hfi1/rc.c
+@@ -932,8 +932,10 @@ void hfi1_send_rc_ack(struct hfi1_ctxtdata *rcd, struct 
rvt_qp *qp,
+       return;
+ 
+ queue_ack:
+-      this_cpu_inc(*ibp->rvp.rc_qacks);
+       spin_lock_irqsave(&qp->s_lock, flags);
++      if (!(ib_rvt_state_ops[qp->state] & RVT_PROCESS_RECV_OK))
++              goto unlock;
++      this_cpu_inc(*ibp->rvp.rc_qacks);
+       qp->s_flags |= RVT_S_ACK_PENDING | RVT_S_RESP_PENDING;
+       qp->s_nak_state = qp->r_nak_state;
+       qp->s_ack_psn = qp->r_ack_psn;
+@@ -942,6 +944,7 @@ queue_ack:
+ 
+       /* Schedule the send tasklet. */
+       hfi1_schedule_send(qp);
++unlock:
+       spin_unlock_irqrestore(&qp->s_lock, flags);
+ }
+ 
+diff --git a/drivers/misc/mei/amthif.c b/drivers/misc/mei/amthif.c
+index a039a5df6f21..fd9271bc1a11 100644
+--- a/drivers/misc/mei/amthif.c
++++ b/drivers/misc/mei/amthif.c
+@@ -67,8 +67,12 @@ int mei_amthif_host_init(struct mei_device *dev, struct 
mei_me_client *me_cl)
+       struct mei_cl *cl = &dev->iamthif_cl;
+       int ret;
+ 
+-      if (mei_cl_is_connected(cl))
+-              return 0;
++      mutex_lock(&dev->device_lock);
++
++      if (mei_cl_is_connected(cl)) {
++              ret = 0;
++              goto out;
++      }
+ 
+       dev->iamthif_state = MEI_IAMTHIF_IDLE;
+ 
+@@ -77,11 +81,13 @@ int mei_amthif_host_init(struct mei_device *dev, struct 
mei_me_client *me_cl)
+       ret = mei_cl_link(cl);
+       if (ret < 0) {
+               dev_err(dev->dev, "amthif: failed cl_link %d\n", ret);
+-              return ret;
++              goto out;
+       }
+ 
+       ret = mei_cl_connect(cl, me_cl, NULL);
+ 
++out:
++      mutex_unlock(&dev->device_lock);
+       return ret;
+ }
+ 
+diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c
+index 1f33fea9299f..e094df3cf2d5 100644
+--- a/drivers/misc/mei/bus.c
++++ b/drivers/misc/mei/bus.c
+@@ -983,12 +983,10 @@ void mei_cl_bus_rescan_work(struct work_struct *work)
+               container_of(work, struct mei_device, bus_rescan_work);
+       struct mei_me_client *me_cl;
+ 
+-      mutex_lock(&bus->device_lock);
+       me_cl = mei_me_cl_by_uuid(bus, &mei_amthif_guid);
+       if (me_cl)
+               mei_amthif_host_init(bus, me_cl);
+       mei_me_cl_put(me_cl);
+-      mutex_unlock(&bus->device_lock);
+ 
+       mei_cl_bus_rescan(bus);
+ }
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c 
b/drivers/net/ethernet/intel/i40e/i40e_main.c
+index d0b3a1bb82ca..dad15b6c66dd 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
+@@ -11360,6 +11360,12 @@ static pci_ers_result_t 
i40e_pci_error_detected(struct pci_dev *pdev,
+ 
+       dev_info(&pdev->dev, "%s: error %d\n", __func__, error);
+ 
++      if (!pf) {
++              dev_info(&pdev->dev,
++                       "Cannot recover - error happened during device 
probe\n");
++              return PCI_ERS_RESULT_DISCONNECT;
++      }
++
+       /* shutdown all operations */
+       if (!test_bit(__I40E_SUSPENDED, &pf->state)) {
+               rtnl_lock();
+diff --git a/drivers/net/wireless/ath/carl9170/debug.c 
b/drivers/net/wireless/ath/carl9170/debug.c
+index 6808db433283..ec3a64e5d2bb 100644
+--- a/drivers/net/wireless/ath/carl9170/debug.c
++++ b/drivers/net/wireless/ath/carl9170/debug.c
+@@ -75,7 +75,8 @@ static ssize_t carl9170_debugfs_read(struct file *file, char 
__user *userbuf,
+ 
+       if (!ar)
+               return -ENODEV;
+-      dfops = container_of(file->f_op, struct carl9170_debugfs_fops, fops);
++      dfops = container_of(debugfs_real_fops(file),
++                           struct carl9170_debugfs_fops, fops);
+ 
+       if (!dfops->read)
+               return -ENOSYS;
+@@ -127,7 +128,8 @@ static ssize_t carl9170_debugfs_write(struct file *file,
+ 
+       if (!ar)
+               return -ENODEV;
+-      dfops = container_of(file->f_op, struct carl9170_debugfs_fops, fops);
++      dfops = container_of(debugfs_real_fops(file),
++                           struct carl9170_debugfs_fops, fops);
+ 
+       if (!dfops->write)
+               return -ENOSYS;
+diff --git a/drivers/net/wireless/broadcom/b43/debugfs.c 
b/drivers/net/wireless/broadcom/b43/debugfs.c
+index b4bcd94aff6c..77046384dd80 100644
+--- a/drivers/net/wireless/broadcom/b43/debugfs.c
++++ b/drivers/net/wireless/broadcom/b43/debugfs.c
+@@ -524,7 +524,8 @@ static ssize_t b43_debugfs_read(struct file *file, char 
__user *userbuf,
+               goto out_unlock;
+       }
+ 
+-      dfops = container_of(file->f_op, struct b43_debugfs_fops, fops);
++      dfops = container_of(debugfs_real_fops(file),
++                           struct b43_debugfs_fops, fops);
+       if (!dfops->read) {
+               err = -ENOSYS;
+               goto out_unlock;
+@@ -585,7 +586,8 @@ static ssize_t b43_debugfs_write(struct file *file,
+               goto out_unlock;
+       }
+ 
+-      dfops = container_of(file->f_op, struct b43_debugfs_fops, fops);
++      dfops = container_of(debugfs_real_fops(file),
++                           struct b43_debugfs_fops, fops);
+       if (!dfops->write) {
+               err = -ENOSYS;
+               goto out_unlock;
+diff --git a/drivers/net/wireless/broadcom/b43legacy/debugfs.c 
b/drivers/net/wireless/broadcom/b43legacy/debugfs.c
+index 090910ea259e..82ef56ed7ca1 100644
+--- a/drivers/net/wireless/broadcom/b43legacy/debugfs.c
++++ b/drivers/net/wireless/broadcom/b43legacy/debugfs.c
+@@ -221,7 +221,8 @@ static ssize_t b43legacy_debugfs_read(struct file *file, 
char __user *userbuf,
+               goto out_unlock;
+       }
+ 
+-      dfops = container_of(file->f_op, struct b43legacy_debugfs_fops, fops);
++      dfops = container_of(debugfs_real_fops(file),
++                           struct b43legacy_debugfs_fops, fops);
+       if (!dfops->read) {
+               err = -ENOSYS;
+               goto out_unlock;
+@@ -287,7 +288,8 @@ static ssize_t b43legacy_debugfs_write(struct file *file,
+               goto out_unlock;
+       }
+ 
+-      dfops = container_of(file->f_op, struct b43legacy_debugfs_fops, fops);
++      dfops = container_of(debugfs_real_fops(file),
++                           struct b43legacy_debugfs_fops, fops);
+       if (!dfops->write) {
+               err = -ENOSYS;
+               goto out_unlock;
+diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+index b8aec5e5ef93..abaf003a5b39 100644
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+@@ -2533,7 +2533,7 @@ static void brcmf_fill_bss_param(struct brcmf_if *ifp, 
struct station_info *si)
+                                    WL_BSS_INFO_MAX);
+       if (err) {
+               brcmf_err("Failed to get bss info (%d)\n", err);
+-              return;
++              goto out_kfree;
+       }
+       si->filled |= BIT(NL80211_STA_INFO_BSS_PARAM);
+       si->bss_param.beacon_interval = le16_to_cpu(buf->bss_le.beacon_period);
+@@ -2545,6 +2545,9 @@ static void brcmf_fill_bss_param(struct brcmf_if *ifp, 
struct station_info *si)
+               si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE;
+       if (capability & WLAN_CAPABILITY_SHORT_SLOT_TIME)
+               si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME;
++
++out_kfree:
++      kfree(buf);
+ }
+ 
+ static s32
+@@ -3884,11 +3887,11 @@ brcmf_cfg80211_del_pmksa(struct wiphy *wiphy, struct 
net_device *ndev,
+       if (!check_vif_up(ifp->vif))
+               return -EIO;
+ 
+-      brcmf_dbg(CONN, "del_pmksa - PMK bssid = %pM\n", &pmksa->bssid);
++      brcmf_dbg(CONN, "del_pmksa - PMK bssid = %pM\n", pmksa->bssid);
+ 
+       npmk = le32_to_cpu(cfg->pmk_list.npmk);
+       for (i = 0; i < npmk; i++)
+-              if (!memcmp(&pmksa->bssid, &pmk[i].bssid, ETH_ALEN))
++              if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN))
+                       break;
+ 
+       if ((npmk > 0) && (i < npmk)) {
+diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
+index 7e269f9aa607..63664442e687 100644
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
+@@ -234,13 +234,20 @@ static void brcmf_flowring_block(struct brcmf_flowring 
*flow, u16 flowid,
+ 
+ void brcmf_flowring_delete(struct brcmf_flowring *flow, u16 flowid)
+ {
++      struct brcmf_bus *bus_if = dev_get_drvdata(flow->dev);
+       struct brcmf_flowring_ring *ring;
++      struct brcmf_if *ifp;
+       u16 hash_idx;
++      u8 ifidx;
+       struct sk_buff *skb;
+ 
+       ring = flow->rings[flowid];
+       if (!ring)
+               return;
++
++      ifidx = brcmf_flowring_ifidx_get(flow, flowid);
++      ifp = brcmf_get_ifp(bus_if->drvr, ifidx);
++
+       brcmf_flowring_block(flow, flowid, false);
+       hash_idx = ring->hash_id;
+       flow->hash[hash_idx].ifidx = BRCMF_FLOWRING_INVALID_IFIDX;
+@@ -249,7 +256,7 @@ void brcmf_flowring_delete(struct brcmf_flowring *flow, 
u16 flowid)
+ 
+       skb = skb_dequeue(&ring->skblist);
+       while (skb) {
+-              brcmu_pkt_buf_free_skb(skb);
++              brcmf_txfinalize(ifp, skb, false);
+               skb = skb_dequeue(&ring->skblist);
+       }
+ 
+diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c 
b/drivers/scsi/arcmsr/arcmsr_hba.c
+index 7640498964a5..3d53d636b17b 100644
+--- a/drivers/scsi/arcmsr/arcmsr_hba.c
++++ b/drivers/scsi/arcmsr/arcmsr_hba.c
+@@ -2388,15 +2388,23 @@ static int arcmsr_iop_message_xfer(struct 
AdapterControlBlock *acb,
+       }
+       case ARCMSR_MESSAGE_WRITE_WQBUFFER: {
+               unsigned char *ver_addr;
+-              int32_t user_len, cnt2end;
++              uint32_t user_len;
++              int32_t cnt2end;
+               uint8_t *pQbuffer, *ptmpuserbuffer;
++
++              user_len = pcmdmessagefld->cmdmessage.Length;
++              if (user_len > ARCMSR_API_DATA_BUFLEN) {
++                      retvalue = ARCMSR_MESSAGE_FAIL;
++                      goto message_out;
++              }
++
+               ver_addr = kmalloc(ARCMSR_API_DATA_BUFLEN, GFP_ATOMIC);
+               if (!ver_addr) {
+                       retvalue = ARCMSR_MESSAGE_FAIL;
+                       goto message_out;
+               }
+               ptmpuserbuffer = ver_addr;
+-              user_len = pcmdmessagefld->cmdmessage.Length;
++
+               memcpy(ptmpuserbuffer,
+                       pcmdmessagefld->messagedatabuffer, user_len);
+               spin_lock_irqsave(&acb->wqbuffer_lock, flags);
+diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
+index ab67ec4b6bd6..79c9860a165f 100644
+--- a/drivers/scsi/ibmvscsi/ibmvfc.c
++++ b/drivers/scsi/ibmvscsi/ibmvfc.c
+@@ -717,7 +717,6 @@ static int ibmvfc_reset_crq(struct ibmvfc_host *vhost)
+       spin_lock_irqsave(vhost->host->host_lock, flags);
+       vhost->state = IBMVFC_NO_CRQ;
+       vhost->logged_in = 0;
+-      ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE);
+ 
+       /* Clean out the queue */
+       memset(crq->msgs, 0, PAGE_SIZE);
+diff --git a/drivers/tty/serial/8250/8250_dw.c 
b/drivers/tty/serial/8250/8250_dw.c
+index e19969614203..b022f5a01e63 100644
+--- a/drivers/tty/serial/8250/8250_dw.c
++++ b/drivers/tty/serial/8250/8250_dw.c
+@@ -462,7 +462,7 @@ static int dw8250_probe(struct platform_device *pdev)
+       }
+ 
+       data->pclk = devm_clk_get(&pdev->dev, "apb_pclk");
+-      if (IS_ERR(data->clk) && PTR_ERR(data->clk) == -EPROBE_DEFER) {
++      if (IS_ERR(data->pclk) && PTR_ERR(data->pclk) == -EPROBE_DEFER) {
+               err = -EPROBE_DEFER;
+               goto err_clk;
+       }
+diff --git a/drivers/tty/serial/8250/8250_port.c 
b/drivers/tty/serial/8250/8250_port.c
+index bdfa659b9606..858a54633664 100644
+--- a/drivers/tty/serial/8250/8250_port.c
++++ b/drivers/tty/serial/8250/8250_port.c
+@@ -1414,12 +1414,8 @@ static void __do_stop_tx_rs485(struct uart_8250_port *p)
+       if (!(p->port.rs485.flags & SER_RS485_RX_DURING_TX)) {
+               serial8250_clear_fifos(p);
+ 
+-              serial8250_rpm_get(p);
+-
+               p->ier |= UART_IER_RLSI | UART_IER_RDI;
+               serial_port_out(&p->port, UART_IER, p->ier);
+-
+-              serial8250_rpm_put(p);
+       }
+ }
+ 
+@@ -1429,6 +1425,7 @@ static void serial8250_em485_handle_stop_tx(unsigned 
long arg)
+       struct uart_8250_em485 *em485 = p->em485;
+       unsigned long flags;
+ 
++      serial8250_rpm_get(p);
+       spin_lock_irqsave(&p->port.lock, flags);
+       if (em485 &&
+           em485->active_timer == &em485->stop_tx_timer) {
+@@ -1436,6 +1433,7 @@ static void serial8250_em485_handle_stop_tx(unsigned 
long arg)
+               em485->active_timer = NULL;
+       }
+       spin_unlock_irqrestore(&p->port.lock, flags);
++      serial8250_rpm_put(p);
+ }
+ 
+ static void __stop_tx_rs485(struct uart_8250_port *p)
+@@ -1475,7 +1473,7 @@ static inline void __stop_tx(struct uart_8250_port *p)
+               unsigned char lsr = serial_in(p, UART_LSR);
+               /*
+                * To provide required timeing and allow FIFO transfer,
+-               * __stop_tx_rs485 must be called only when both FIFO and
++               * __stop_tx_rs485() must be called only when both FIFO and
+                * shift register are empty. It is for device driver to enable
+                * interrupt on TEMT.
+                */
+@@ -1484,9 +1482,10 @@ static inline void __stop_tx(struct uart_8250_port *p)
+ 
+               del_timer(&em485->start_tx_timer);
+               em485->active_timer = NULL;
++
++              __stop_tx_rs485(p);
+       }
+       __do_stop_tx(p);
+-      __stop_tx_rs485(p);
+ }
+ 
+ static void serial8250_stop_tx(struct uart_port *port)
+diff --git a/drivers/tty/serial/atmel_serial.c 
b/drivers/tty/serial/atmel_serial.c
+index 2eaa18ddef61..8bbde52db376 100644
+--- a/drivers/tty/serial/atmel_serial.c
++++ b/drivers/tty/serial/atmel_serial.c
+@@ -1929,6 +1929,9 @@ static void atmel_shutdown(struct uart_port *port)
+ {
+       struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
+ 
++      /* Disable modem control lines interrupts */
++      atmel_disable_ms(port);
++
+       /* Disable interrupts at device level */
+       atmel_uart_writel(port, ATMEL_US_IDR, -1);
+ 
+@@ -1979,8 +1982,6 @@ static void atmel_shutdown(struct uart_port *port)
+        */
+       free_irq(port->irq, port);
+ 
+-      atmel_port->ms_irq_enabled = false;
+-
+       atmel_flush_buffer(port);
+ }
+ 
+diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
+index 0df2b1c091ae..615c0279a1a6 100644
+--- a/drivers/tty/serial/imx.c
++++ b/drivers/tty/serial/imx.c
+@@ -740,12 +740,13 @@ static unsigned int imx_get_hwmctrl(struct imx_port 
*sport)
+ {
+       unsigned int tmp = TIOCM_DSR;
+       unsigned usr1 = readl(sport->port.membase + USR1);
++      unsigned usr2 = readl(sport->port.membase + USR2);
+ 
+       if (usr1 & USR1_RTSS)
+               tmp |= TIOCM_CTS;
+ 
+       /* in DCE mode DCDIN is always 0 */
+-      if (!(usr1 & USR2_DCDIN))
++      if (!(usr2 & USR2_DCDIN))
+               tmp |= TIOCM_CAR;
+ 
+       if (sport->dte_mode)
+diff --git a/fs/attr.c b/fs/attr.c
+index 42bb42bb3c72..3c42cab06b5d 100644
+--- a/fs/attr.c
++++ b/fs/attr.c
+@@ -202,6 +202,21 @@ int notify_change(struct dentry * dentry, struct iattr * 
attr, struct inode **de
+                       return -EPERM;
+       }
+ 
++      /*
++       * If utimes(2) and friends are called with times == NULL (or both
++       * times are UTIME_NOW), then we need to check for write permission
++       */
++      if (ia_valid & ATTR_TOUCH) {
++              if (IS_IMMUTABLE(inode))
++                      return -EPERM;
++
++              if (!inode_owner_or_capable(inode)) {
++                      error = inode_permission(inode, MAY_WRITE);
++                      if (error)
++                              return error;
++              }
++      }
++
+       if ((ia_valid & ATTR_MODE)) {
+               umode_t amode = attr->ia_mode;
+               /* Flag setting protected by i_mutex */
+diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c
+index 431fd7ee3488..e44271dfceb6 100644
+--- a/fs/autofs4/waitq.c
++++ b/fs/autofs4/waitq.c
+@@ -431,8 +431,8 @@ int autofs4_wait(struct autofs_sb_info *sbi,
+               memcpy(&wq->name, &qstr, sizeof(struct qstr));
+               wq->dev = autofs4_get_dev(sbi);
+               wq->ino = autofs4_get_ino(sbi);
+-              wq->uid = current_uid();
+-              wq->gid = current_gid();
++              wq->uid = current_real_cred()->uid;
++              wq->gid = current_real_cred()->gid;
+               wq->pid = pid;
+               wq->tgid = tgid;
+               wq->status = -EINTR; /* Status return if interrupted */
+diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
+index 029db6e1105c..60a850ee8c78 100644
+--- a/fs/btrfs/compression.c
++++ b/fs/btrfs/compression.c
+@@ -698,7 +698,7 @@ int btrfs_submit_compressed_read(struct inode *inode, 
struct bio *bio,
+ 
+                       ret = btrfs_map_bio(root, comp_bio, mirror_num, 0);
+                       if (ret) {
+-                              bio->bi_error = ret;
++                              comp_bio->bi_error = ret;
+                               bio_endio(comp_bio);
+                       }
+ 
+@@ -728,7 +728,7 @@ int btrfs_submit_compressed_read(struct inode *inode, 
struct bio *bio,
+ 
+       ret = btrfs_map_bio(root, comp_bio, mirror_num, 0);
+       if (ret) {
+-              bio->bi_error = ret;
++              comp_bio->bi_error = ret;
+               bio_endio(comp_bio);
+       }
+ 
+diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
+index 33fe03551105..791e47ce9d27 100644
+--- a/fs/btrfs/ctree.h
++++ b/fs/btrfs/ctree.h
+@@ -251,7 +251,8 @@ struct btrfs_super_block {
+ #define BTRFS_FEATURE_COMPAT_SAFE_CLEAR               0ULL
+ 
+ #define BTRFS_FEATURE_COMPAT_RO_SUPP                  \
+-      (BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE)
++      (BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE |      \
++       BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID)
+ 
+ #define BTRFS_FEATURE_COMPAT_RO_SAFE_SET      0ULL
+ #define BTRFS_FEATURE_COMPAT_RO_SAFE_CLEAR    0ULL
+diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
+index 54bc8c7c6bcd..3dede6d53bad 100644
+--- a/fs/btrfs/disk-io.c
++++ b/fs/btrfs/disk-io.c
+@@ -2566,6 +2566,7 @@ int open_ctree(struct super_block *sb,
+       int num_backups_tried = 0;
+       int backup_index = 0;
+       int max_active;
++      int clear_free_space_tree = 0;
+ 
+       tree_root = fs_info->tree_root = btrfs_alloc_root(fs_info, GFP_KERNEL);
+       chunk_root = fs_info->chunk_root = btrfs_alloc_root(fs_info, 
GFP_KERNEL);
+@@ -3129,6 +3130,26 @@ retry_root_backup:
+       if (sb->s_flags & MS_RDONLY)
+               return 0;
+ 
++      if (btrfs_test_opt(fs_info, CLEAR_CACHE) &&
++          btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) {
++              clear_free_space_tree = 1;
++      } else if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE) &&
++                 !btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE_VALID)) {
++              btrfs_warn(fs_info, "free space tree is invalid");
++              clear_free_space_tree = 1;
++      }
++
++      if (clear_free_space_tree) {
++              btrfs_info(fs_info, "clearing free space tree");
++              ret = btrfs_clear_free_space_tree(fs_info);
++              if (ret) {
++                      btrfs_warn(fs_info,
++                                 "failed to clear free space tree: %d", ret);
++                      close_ctree(tree_root);
++                      return ret;
++              }
++      }
++
+       if (btrfs_test_opt(tree_root->fs_info, FREE_SPACE_TREE) &&
+           !btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) {
+               btrfs_info(fs_info, "creating free space tree");
+@@ -3166,18 +3187,6 @@ retry_root_backup:
+ 
+       btrfs_qgroup_rescan_resume(fs_info);
+ 
+-      if (btrfs_test_opt(tree_root->fs_info, CLEAR_CACHE) &&
+-          btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) {
+-              btrfs_info(fs_info, "clearing free space tree");
+-              ret = btrfs_clear_free_space_tree(fs_info);
+-              if (ret) {
+-                      btrfs_warn(fs_info,
+-                              "failed to clear free space tree: %d", ret);
+-                      close_ctree(tree_root);
+-                      return ret;
+-              }
+-      }
+-
+       if (!fs_info->uuid_root) {
+               btrfs_info(fs_info, "creating UUID tree");
+               ret = btrfs_create_uuid_tree(fs_info);
+diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
+index 44fe66b53c8b..c3ec30dea9a5 100644
+--- a/fs/btrfs/extent_io.c
++++ b/fs/btrfs/extent_io.c
+@@ -5524,17 +5524,45 @@ void copy_extent_buffer(struct extent_buffer *dst, 
struct extent_buffer *src,
+       }
+ }
+ 
+-/*
+- * The extent buffer bitmap operations are done with byte granularity because
+- * bitmap items are not guaranteed to be aligned to a word and therefore a
+- * single word in a bitmap may straddle two pages in the extent buffer.
+- */
+-#define BIT_BYTE(nr) ((nr) / BITS_PER_BYTE)
+-#define BYTE_MASK ((1 << BITS_PER_BYTE) - 1)
+-#define BITMAP_FIRST_BYTE_MASK(start) \
+-      ((BYTE_MASK << ((start) & (BITS_PER_BYTE - 1))) & BYTE_MASK)
+-#define BITMAP_LAST_BYTE_MASK(nbits) \
+-      (BYTE_MASK >> (-(nbits) & (BITS_PER_BYTE - 1)))
++void le_bitmap_set(u8 *map, unsigned int start, int len)
++{
++      u8 *p = map + BIT_BYTE(start);
++      const unsigned int size = start + len;
++      int bits_to_set = BITS_PER_BYTE - (start % BITS_PER_BYTE);
++      u8 mask_to_set = BITMAP_FIRST_BYTE_MASK(start);
++
++      while (len - bits_to_set >= 0) {
++              *p |= mask_to_set;
++              len -= bits_to_set;
++              bits_to_set = BITS_PER_BYTE;
++              mask_to_set = ~(u8)0;
++              p++;
++      }
++      if (len) {
++              mask_to_set &= BITMAP_LAST_BYTE_MASK(size);
++              *p |= mask_to_set;
++      }
++}
++
++void le_bitmap_clear(u8 *map, unsigned int start, int len)
++{
++      u8 *p = map + BIT_BYTE(start);
++      const unsigned int size = start + len;
++      int bits_to_clear = BITS_PER_BYTE - (start % BITS_PER_BYTE);
++      u8 mask_to_clear = BITMAP_FIRST_BYTE_MASK(start);
++
++      while (len - bits_to_clear >= 0) {
++              *p &= ~mask_to_clear;
++              len -= bits_to_clear;
++              bits_to_clear = BITS_PER_BYTE;
++              mask_to_clear = ~(u8)0;
++              p++;
++      }
++      if (len) {
++              mask_to_clear &= BITMAP_LAST_BYTE_MASK(size);
++              *p &= ~mask_to_clear;
++      }
++}
+ 
+ /*
+  * eb_bitmap_offset() - calculate the page and offset of the byte containing 
the
+@@ -5578,7 +5606,7 @@ static inline void eb_bitmap_offset(struct extent_buffer 
*eb,
+ int extent_buffer_test_bit(struct extent_buffer *eb, unsigned long start,
+                          unsigned long nr)
+ {
+-      char *kaddr;
++      u8 *kaddr;
+       struct page *page;
+       unsigned long i;
+       size_t offset;
+@@ -5600,13 +5628,13 @@ int extent_buffer_test_bit(struct extent_buffer *eb, 
unsigned long start,
+ void extent_buffer_bitmap_set(struct extent_buffer *eb, unsigned long start,
+                             unsigned long pos, unsigned long len)
+ {
+-      char *kaddr;
++      u8 *kaddr;
+       struct page *page;
+       unsigned long i;
+       size_t offset;
+       const unsigned int size = pos + len;
+       int bits_to_set = BITS_PER_BYTE - (pos % BITS_PER_BYTE);
+-      unsigned int mask_to_set = BITMAP_FIRST_BYTE_MASK(pos);
++      u8 mask_to_set = BITMAP_FIRST_BYTE_MASK(pos);
+ 
+       eb_bitmap_offset(eb, start, pos, &i, &offset);
+       page = eb->pages[i];
+@@ -5617,7 +5645,7 @@ void extent_buffer_bitmap_set(struct extent_buffer *eb, 
unsigned long start,
+               kaddr[offset] |= mask_to_set;
+               len -= bits_to_set;
+               bits_to_set = BITS_PER_BYTE;
+-              mask_to_set = ~0U;
++              mask_to_set = ~(u8)0;
+               if (++offset >= PAGE_SIZE && len > 0) {
+                       offset = 0;
+                       page = eb->pages[++i];
+@@ -5642,13 +5670,13 @@ void extent_buffer_bitmap_set(struct extent_buffer 
*eb, unsigned long start,
+ void extent_buffer_bitmap_clear(struct extent_buffer *eb, unsigned long start,
+                               unsigned long pos, unsigned long len)
+ {
+-      char *kaddr;
++      u8 *kaddr;
+       struct page *page;
+       unsigned long i;
+       size_t offset;
+       const unsigned int size = pos + len;
+       int bits_to_clear = BITS_PER_BYTE - (pos % BITS_PER_BYTE);
+-      unsigned int mask_to_clear = BITMAP_FIRST_BYTE_MASK(pos);
++      u8 mask_to_clear = BITMAP_FIRST_BYTE_MASK(pos);
+ 
+       eb_bitmap_offset(eb, start, pos, &i, &offset);
+       page = eb->pages[i];
+@@ -5659,7 +5687,7 @@ void extent_buffer_bitmap_clear(struct extent_buffer 
*eb, unsigned long start,
+               kaddr[offset] &= ~mask_to_clear;
+               len -= bits_to_clear;
+               bits_to_clear = BITS_PER_BYTE;
+-              mask_to_clear = ~0U;
++              mask_to_clear = ~(u8)0;
+               if (++offset >= PAGE_SIZE && len > 0) {
+                       offset = 0;
+                       page = eb->pages[++i];
+diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
+index 28cd88fccc7e..1cf4e4226fc8 100644
+--- a/fs/btrfs/extent_io.h
++++ b/fs/btrfs/extent_io.h
+@@ -59,6 +59,28 @@
+  */
+ #define EXTENT_PAGE_PRIVATE 1
+ 
++/*
++ * The extent buffer bitmap operations are done with byte granularity instead 
of
++ * word granularity for two reasons:
++ * 1. The bitmaps must be little-endian on disk.
++ * 2. Bitmap items are not guaranteed to be aligned to a word and therefore a
++ *    single word in a bitmap may straddle two pages in the extent buffer.
++ */
++#define BIT_BYTE(nr) ((nr) / BITS_PER_BYTE)
++#define BYTE_MASK ((1 << BITS_PER_BYTE) - 1)
++#define BITMAP_FIRST_BYTE_MASK(start) \
++      ((BYTE_MASK << ((start) & (BITS_PER_BYTE - 1))) & BYTE_MASK)
++#define BITMAP_LAST_BYTE_MASK(nbits) \
++      (BYTE_MASK >> (-(nbits) & (BITS_PER_BYTE - 1)))
++
++static inline int le_test_bit(int nr, const u8 *addr)
++{
++      return 1U & (addr[BIT_BYTE(nr)] >> (nr & (BITS_PER_BYTE-1)));
++}
++
++extern void le_bitmap_set(u8 *map, unsigned int start, int len);
++extern void le_bitmap_clear(u8 *map, unsigned int start, int len);
++
+ struct extent_state;
+ struct btrfs_root;
+ struct btrfs_io_bio;
+diff --git a/fs/btrfs/free-space-tree.c b/fs/btrfs/free-space-tree.c
+index 87e7e3d3e676..ea605ffd0e03 100644
+--- a/fs/btrfs/free-space-tree.c
++++ b/fs/btrfs/free-space-tree.c
+@@ -151,7 +151,7 @@ static inline u32 free_space_bitmap_size(u64 size, u32 
sectorsize)
+       return DIV_ROUND_UP((u32)div_u64(size, sectorsize), BITS_PER_BYTE);
+ }
+ 
+-static unsigned long *alloc_bitmap(u32 bitmap_size)
++static u8 *alloc_bitmap(u32 bitmap_size)
+ {
+       void *mem;
+ 
+@@ -180,8 +180,7 @@ int convert_free_space_to_bitmaps(struct 
btrfs_trans_handle *trans,
+       struct btrfs_free_space_info *info;
+       struct btrfs_key key, found_key;
+       struct extent_buffer *leaf;
+-      unsigned long *bitmap;
+-      char *bitmap_cursor;
++      u8 *bitmap, *bitmap_cursor;
+       u64 start, end;
+       u64 bitmap_range, i;
+       u32 bitmap_size, flags, expected_extent_count;
+@@ -231,7 +230,7 @@ int convert_free_space_to_bitmaps(struct 
btrfs_trans_handle *trans,
+                                               block_group->sectorsize);
+                               last = div_u64(found_key.objectid + 
found_key.offset - start,
+                                              block_group->sectorsize);
+-                              bitmap_set(bitmap, first, last - first);
++                              le_bitmap_set(bitmap, first, last - first);
+ 
+                               extent_count++;
+                               nr++;
+@@ -269,7 +268,7 @@ int convert_free_space_to_bitmaps(struct 
btrfs_trans_handle *trans,
+               goto out;
+       }
+ 
+-      bitmap_cursor = (char *)bitmap;
++      bitmap_cursor = bitmap;
+       bitmap_range = block_group->sectorsize * BTRFS_FREE_SPACE_BITMAP_BITS;
+       i = start;
+       while (i < end) {
+@@ -318,7 +317,7 @@ int convert_free_space_to_extents(struct 
btrfs_trans_handle *trans,
+       struct btrfs_free_space_info *info;
+       struct btrfs_key key, found_key;
+       struct extent_buffer *leaf;
+-      unsigned long *bitmap;
++      u8 *bitmap;
+       u64 start, end;
+       /* Initialize to silence GCC. */
+       u64 extent_start = 0;
+@@ -362,7 +361,7 @@ int convert_free_space_to_extents(struct 
btrfs_trans_handle *trans,
+                               break;
+                       } else if (found_key.type == 
BTRFS_FREE_SPACE_BITMAP_KEY) {
+                               unsigned long ptr;
+-                              char *bitmap_cursor;
++                              u8 *bitmap_cursor;
+                               u32 bitmap_pos, data_size;
+ 
+                               ASSERT(found_key.objectid >= start);
+@@ -372,7 +371,7 @@ int convert_free_space_to_extents(struct 
btrfs_trans_handle *trans,
+                               bitmap_pos = div_u64(found_key.objectid - start,
+                                                    block_group->sectorsize *
+                                                    BITS_PER_BYTE);
+-                              bitmap_cursor = ((char *)bitmap) + bitmap_pos;
++                              bitmap_cursor = bitmap + bitmap_pos;
+                               data_size = 
free_space_bitmap_size(found_key.offset,
+                                                                  
block_group->sectorsize);
+ 
+@@ -409,7 +408,7 @@ int convert_free_space_to_extents(struct 
btrfs_trans_handle *trans,
+       offset = start;
+       bitnr = 0;
+       while (offset < end) {
+-              bit = !!test_bit(bitnr, bitmap);
++              bit = !!le_test_bit(bitnr, bitmap);
+               if (prev_bit == 0 && bit == 1) {
+                       extent_start = offset;
+               } else if (prev_bit == 1 && bit == 0) {
+@@ -1183,6 +1182,7 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info 
*fs_info)
+       }
+ 
+       btrfs_set_fs_compat_ro(fs_info, FREE_SPACE_TREE);
++      btrfs_set_fs_compat_ro(fs_info, FREE_SPACE_TREE_VALID);
+       fs_info->creating_free_space_tree = 0;
+ 
+       ret = btrfs_commit_transaction(trans, tree_root);
+@@ -1251,6 +1251,7 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info 
*fs_info)
+               return PTR_ERR(trans);
+ 
+       btrfs_clear_fs_compat_ro(fs_info, FREE_SPACE_TREE);
++      btrfs_clear_fs_compat_ro(fs_info, FREE_SPACE_TREE_VALID);
+       fs_info->free_space_root = NULL;
+ 
+       ret = clear_free_space_tree(trans, free_space_root);
+diff --git a/fs/cachefiles/interface.c b/fs/cachefiles/interface.c
+index ce5f345d70f5..e7f16a77a22a 100644
+--- a/fs/cachefiles/interface.c
++++ b/fs/cachefiles/interface.c
+@@ -253,6 +253,8 @@ static void cachefiles_drop_object(struct fscache_object 
*_object)
+       struct cachefiles_object *object;
+       struct cachefiles_cache *cache;
+       const struct cred *saved_cred;
++      struct inode *inode;
++      blkcnt_t i_blocks = 0;
+ 
+       ASSERT(_object);
+ 
+@@ -279,6 +281,10 @@ static void cachefiles_drop_object(struct fscache_object 
*_object)
+                   _object != cache->cache.fsdef
+                   ) {
+                       _debug("- retire object OBJ%x", 
object->fscache.debug_id);
++                      inode = d_backing_inode(object->dentry);
++                      if (inode)
++                              i_blocks = inode->i_blocks;
++
+                       cachefiles_begin_secure(cache, &saved_cred);
+                       cachefiles_delete_object(cache, object);
+                       cachefiles_end_secure(cache, saved_cred);
+@@ -292,7 +298,7 @@ static void cachefiles_drop_object(struct fscache_object 
*_object)
+ 
+       /* note that the object is now inactive */
+       if (test_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags))
+-              cachefiles_mark_object_inactive(cache, object);
++              cachefiles_mark_object_inactive(cache, object, i_blocks);
+ 
+       dput(object->dentry);
+       object->dentry = NULL;
+diff --git a/fs/cachefiles/internal.h b/fs/cachefiles/internal.h
+index 2fcde1a34b7c..cd1effee8a49 100644
+--- a/fs/cachefiles/internal.h
++++ b/fs/cachefiles/internal.h
+@@ -160,7 +160,8 @@ extern char *cachefiles_cook_key(const u8 *raw, int 
keylen, uint8_t type);
+  * namei.c
+  */
+ extern void cachefiles_mark_object_inactive(struct cachefiles_cache *cache,
+-                                          struct cachefiles_object *object);
++                                          struct cachefiles_object *object,
++                                          blkcnt_t i_blocks);
+ extern int cachefiles_delete_object(struct cachefiles_cache *cache,
+                                   struct cachefiles_object *object);
+ extern int cachefiles_walk_to_object(struct cachefiles_object *parent,
+diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c
+index 3f7c2cd41f8f..c6ee4b5fb7e6 100644
+--- a/fs/cachefiles/namei.c
++++ b/fs/cachefiles/namei.c
+@@ -261,10 +261,9 @@ requeue:
+  * Mark an object as being inactive.
+  */
+ void cachefiles_mark_object_inactive(struct cachefiles_cache *cache,
+-                                   struct cachefiles_object *object)
++                                   struct cachefiles_object *object,
++                                   blkcnt_t i_blocks)
+ {
+-      blkcnt_t i_blocks = d_backing_inode(object->dentry)->i_blocks;
+-
+       write_lock(&cache->active_lock);
+       rb_erase(&object->active_node, &cache->active_nodes);
+       clear_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags);
+@@ -707,7 +706,8 @@ mark_active_timed_out:
+ 
+ check_error:
+       _debug("check error %d", ret);
+-      cachefiles_mark_object_inactive(cache, object);
++      cachefiles_mark_object_inactive(
++              cache, object, d_backing_inode(object->dentry)->i_blocks);
+ release_dentry:
+       dput(object->dentry);
+       object->dentry = NULL;
+diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c
+index 592059f88e04..309f4e9b2419 100644
+--- a/fs/debugfs/file.c
++++ b/fs/debugfs/file.c
+@@ -97,9 +97,6 @@ EXPORT_SYMBOL_GPL(debugfs_use_file_finish);
+ 
+ #define F_DENTRY(filp) ((filp)->f_path.dentry)
+ 
+-#define REAL_FOPS_DEREF(dentry)                                       \
+-      ((const struct file_operations *)(dentry)->d_fsdata)
+-
+ static int open_proxy_open(struct inode *inode, struct file *filp)
+ {
+       const struct dentry *dentry = F_DENTRY(filp);
+@@ -112,7 +109,7 @@ static int open_proxy_open(struct inode *inode, struct 
file *filp)
+               goto out;
+       }
+ 
+-      real_fops = REAL_FOPS_DEREF(dentry);
++      real_fops = debugfs_real_fops(filp);
+       real_fops = fops_get(real_fops);
+       if (!real_fops) {
+               /* Huh? Module did not clean up after itself at exit? */
+@@ -143,7 +140,7 @@ static ret_type full_proxy_ ## name(proto)                 
        \
+ {                                                                     \
+       const struct dentry *dentry = F_DENTRY(filp);                   \
+       const struct file_operations *real_fops =                       \
+-              REAL_FOPS_DEREF(dentry);                                \
++              debugfs_real_fops(filp);                                \
+       int srcu_idx;                                                   \
+       ret_type r;                                                     \
+                                                                       \
+@@ -176,7 +173,7 @@ static unsigned int full_proxy_poll(struct file *filp,
+                               struct poll_table_struct *wait)
+ {
+       const struct dentry *dentry = F_DENTRY(filp);
+-      const struct file_operations *real_fops = REAL_FOPS_DEREF(dentry);
++      const struct file_operations *real_fops = debugfs_real_fops(filp);
+       int srcu_idx;
+       unsigned int r = 0;
+ 
+@@ -193,7 +190,7 @@ static unsigned int full_proxy_poll(struct file *filp,
+ static int full_proxy_release(struct inode *inode, struct file *filp)
+ {
+       const struct dentry *dentry = F_DENTRY(filp);
+-      const struct file_operations *real_fops = REAL_FOPS_DEREF(dentry);
++      const struct file_operations *real_fops = debugfs_real_fops(filp);
+       const struct file_operations *proxy_fops = filp->f_op;
+       int r = 0;
+ 
+@@ -241,7 +238,7 @@ static int full_proxy_open(struct inode *inode, struct 
file *filp)
+               goto out;
+       }
+ 
+-      real_fops = REAL_FOPS_DEREF(dentry);
++      real_fops = debugfs_real_fops(filp);
+       real_fops = fops_get(real_fops);
+       if (!real_fops) {
+               /* Huh? Module did not cleanup after itself at exit? */
+diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
+index 963016c8f3d1..609998de533e 100644
+--- a/fs/dlm/lowcomms.c
++++ b/fs/dlm/lowcomms.c
+@@ -1656,16 +1656,12 @@ void dlm_lowcomms_stop(void)
+       mutex_lock(&connections_lock);
+       dlm_allow_conn = 0;
+       foreach_conn(stop_conn);
++      clean_writequeues();
++      foreach_conn(free_conn);
+       mutex_unlock(&connections_lock);
+ 
+       work_stop();
+ 
+-      mutex_lock(&connections_lock);
+-      clean_writequeues();
+-
+-      foreach_conn(free_conn);
+-
+-      mutex_unlock(&connections_lock);
+       kmem_cache_destroy(con_cache);
+ }
+ 
+diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
+index d7ccb7f51dfc..7f69347bd5a5 100644
+--- a/fs/ext4/extents.c
++++ b/fs/ext4/extents.c
+@@ -5734,6 +5734,9 @@ int ext4_insert_range(struct inode *inode, loff_t 
offset, loff_t len)
+                       up_write(&EXT4_I(inode)->i_data_sem);
+                       goto out_stop;
+               }
++      } else {
++              ext4_ext_drop_refs(path);
++              kfree(path);
+       }
+ 
+       ret = ext4_es_remove_extent(inode, offset_lblk,
+diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
+index c6ea25a190f8..f4cdc647ecfc 100644
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -647,11 +647,19 @@ found:
+               /*
+                * We have to zeroout blocks before inserting them into extent
+                * status tree. Otherwise someone could look them up there and
+-               * use them before they are really zeroed.
++               * use them before they are really zeroed. We also have to
++               * unmap metadata before zeroing as otherwise writeback can
++               * overwrite zeros with stale data from block device.
+                */
+               if (flags & EXT4_GET_BLOCKS_ZERO &&
+                   map->m_flags & EXT4_MAP_MAPPED &&
+                   map->m_flags & EXT4_MAP_NEW) {
++                      ext4_lblk_t i;
++
++                      for (i = 0; i < map->m_len; i++) {
++                              unmap_underlying_metadata(inode->i_sb->s_bdev,
++                                                        map->m_pblk + i);
++                      }
+                       ret = ext4_issue_zeroout(inode, map->m_lblk,
+                                                map->m_pblk, map->m_len);
+                       if (ret) {
+@@ -1649,6 +1657,8 @@ static void mpage_release_unused_pages(struct 
mpage_da_data *mpd,
+                       BUG_ON(!PageLocked(page));
+                       BUG_ON(PageWriteback(page));
+                       if (invalidate) {
++                              if (page_mapped(page))
++                                      clear_page_dirty_for_io(page);
+                               block_invalidatepage(page, 0, PAGE_SIZE);
+                               ClearPageUptodate(page);
+                       }
+@@ -3890,7 +3900,7 @@ int ext4_update_disksize_before_punch(struct inode 
*inode, loff_t offset,
+ }
+ 
+ /*
+- * ext4_punch_hole: punches a hole in a file by releaseing the blocks
++ * ext4_punch_hole: punches a hole in a file by releasing the blocks
+  * associated with the given offset and length
+  *
+  * @inode:  File inode
+@@ -3919,7 +3929,7 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, 
loff_t length)
+        * Write out all dirty pages to avoid race conditions
+        * Then release them.
+        */
+-      if (mapping->nrpages && mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) {
++      if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) {
+               ret = filemap_write_and_wait_range(mapping, offset,
+                                                  offset + length - 1);
+               if (ret)
+@@ -4814,14 +4824,14 @@ static int ext4_do_update_inode(handle_t *handle,
+  * Fix up interoperability with old kernels. Otherwise, old inodes get
+  * re-used with the upper 16 bits of the uid/gid intact
+  */
+-              if (!ei->i_dtime) {
++              if (ei->i_dtime && list_empty(&ei->i_orphan)) {
++                      raw_inode->i_uid_high = 0;
++                      raw_inode->i_gid_high = 0;
++              } else {
+                       raw_inode->i_uid_high =
+                               cpu_to_le16(high_16_bits(i_uid));
+                       raw_inode->i_gid_high =
+                               cpu_to_le16(high_16_bits(i_gid));
+-              } else {
+-                      raw_inode->i_uid_high = 0;
+-                      raw_inode->i_gid_high = 0;
+               }
+       } else {
+               raw_inode->i_uid_low = cpu_to_le16(fs_high2lowuid(i_uid));
+diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c
+index a920c5d29fac..6fc14def0c70 100644
+--- a/fs/ext4/move_extent.c
++++ b/fs/ext4/move_extent.c
+@@ -598,6 +598,13 @@ ext4_move_extents(struct file *o_filp, struct file 
*d_filp, __u64 orig_blk,
+               return -EOPNOTSUPP;
+       }
+ 
++      if (ext4_encrypted_inode(orig_inode) ||
++          ext4_encrypted_inode(donor_inode)) {
++              ext4_msg(orig_inode->i_sb, KERN_ERR,
++                       "Online defrag not supported for encrypted files");
++              return -EOPNOTSUPP;
++      }
++
+       /* Protect orig and donor inodes against a truncate */
+       lock_two_nondirectories(orig_inode, donor_inode);
+ 
+diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
+index 34c0142caf6a..7e2f8c3c11ce 100644
+--- a/fs/ext4/namei.c
++++ b/fs/ext4/namei.c
+@@ -2044,33 +2044,31 @@ static int make_indexed_dir(handle_t *handle, struct 
ext4_filename *fname,
+       frame->entries = entries;
+       frame->at = entries;
+       frame->bh = bh;
+-      bh = bh2;
+ 
+       retval = ext4_handle_dirty_dx_node(handle, dir, frame->bh);
+       if (retval)
+               goto out_frames;        
+-      retval = ext4_handle_dirty_dirent_node(handle, dir, bh);
++      retval = ext4_handle_dirty_dirent_node(handle, dir, bh2);
+       if (retval)
+               goto out_frames;        
+ 
+-      de = do_split(handle,dir, &bh, frame, &fname->hinfo);
++      de = do_split(handle,dir, &bh2, frame, &fname->hinfo);
+       if (IS_ERR(de)) {
+               retval = PTR_ERR(de);
+               goto out_frames;
+       }
+-      dx_release(frames);
+ 
+-      retval = add_dirent_to_buf(handle, fname, dir, inode, de, bh);
+-      brelse(bh);
+-      return retval;
++      retval = add_dirent_to_buf(handle, fname, dir, inode, de, bh2);
+ out_frames:
+       /*
+        * Even if the block split failed, we have to properly write
+        * out all the changes we did so far. Otherwise we can end up
+        * with corrupted filesystem.
+        */
+-      ext4_mark_inode_dirty(handle, dir);
++      if (retval)
++              ext4_mark_inode_dirty(handle, dir);
+       dx_release(frames);
++      brelse(bh2);
+       return retval;
+ }
+ 
+diff --git a/fs/ext4/symlink.c b/fs/ext4/symlink.c
+index 4d83d9e05f2e..04a7850a0d45 100644
+--- a/fs/ext4/symlink.c
++++ b/fs/ext4/symlink.c
+@@ -65,13 +65,12 @@ static const char *ext4_encrypted_get_link(struct dentry 
*dentry,
+       res = fscrypt_fname_alloc_buffer(inode, cstr.len, &pstr);
+       if (res)
+               goto errout;
++      paddr = pstr.name;
+ 
+       res = fscrypt_fname_disk_to_usr(inode, 0, 0, &cstr, &pstr);
+       if (res < 0)
+               goto errout;
+ 
+-      paddr = pstr.name;
+-
+       /* Null-terminate the name */
+       if (res <= pstr.len)
+               paddr[res] = '\0';
+diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
+index c47b7780ce37..4ff9251e9d3a 100644
+--- a/fs/fuse/dir.c
++++ b/fs/fuse/dir.c
+@@ -1702,14 +1702,46 @@ error:
+ static int fuse_setattr(struct dentry *entry, struct iattr *attr)
+ {
+       struct inode *inode = d_inode(entry);
++      struct file *file = (attr->ia_valid & ATTR_FILE) ? attr->ia_file : NULL;
++      int ret;
+ 
+       if (!fuse_allow_current_process(get_fuse_conn(inode)))
+               return -EACCES;
+ 
+-      if (attr->ia_valid & ATTR_FILE)
+-              return fuse_do_setattr(inode, attr, attr->ia_file);
+-      else
+-              return fuse_do_setattr(inode, attr, NULL);
++      if (attr->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) {
++              int kill;
++
++              attr->ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID |
++                                  ATTR_MODE);
++              /*
++               * ia_mode calculation may have used stale i_mode.  Refresh and
++               * recalculate.
++               */
++              ret = fuse_do_getattr(inode, NULL, file);
++              if (ret)
++                      return ret;
++
++              attr->ia_mode = inode->i_mode;
++              kill = should_remove_suid(entry);
++              if (kill & ATTR_KILL_SUID) {
++                      attr->ia_valid |= ATTR_MODE;
++                      attr->ia_mode &= ~S_ISUID;
++              }
++              if (kill & ATTR_KILL_SGID) {
++                      attr->ia_valid |= ATTR_MODE;
++                      attr->ia_mode &= ~S_ISGID;
++              }
++      }
++      if (!attr->ia_valid)
++              return 0;
++
++      ret = fuse_do_setattr(inode, attr, file);
++      if (!ret) {
++              /* Directory mode changed, may need to revalidate access */
++              if (d_is_dir(entry) && (attr->ia_valid & ATTR_MODE))
++                      fuse_invalidate_entry_cache(entry);
++      }
++      return ret;
+ }
+ 
+ static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
+@@ -1801,6 +1833,23 @@ static ssize_t fuse_getxattr(struct dentry *entry, 
struct inode *inode,
+       return ret;
+ }
+ 
++static int fuse_verify_xattr_list(char *list, size_t size)
++{
++      size_t origsize = size;
++
++      while (size) {
++              size_t thislen = strnlen(list, size);
++
++              if (!thislen || thislen == size)
++                      return -EIO;
++
++              size -= thislen + 1;
++              list += thislen + 1;
++      }
++
++      return origsize;
++}
++
+ static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
+ {
+       struct inode *inode = d_inode(entry);
+@@ -1836,6 +1885,8 @@ static ssize_t fuse_listxattr(struct dentry *entry, char 
*list, size_t size)
+       ret = fuse_simple_request(fc, &args);
+       if (!ret && !size)
+               ret = outarg.size;
++      if (ret > 0 && size)
++              ret = fuse_verify_xattr_list(list, ret);
+       if (ret == -ENOSYS) {
+               fc->no_listxattr = 1;
+               ret = -EOPNOTSUPP;
+diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
+index b5bc3e249163..3d8246a9faa4 100644
+--- a/fs/jbd2/transaction.c
++++ b/fs/jbd2/transaction.c
+@@ -159,6 +159,7 @@ static void wait_transaction_locked(journal_t *journal)
+       read_unlock(&journal->j_state_lock);
+       if (need_to_start)
+               jbd2_log_start_commit(journal, tid);
++      jbd2_might_wait_for_commit(journal);
+       schedule();
+       finish_wait(&journal->j_wait_transaction_locked, &wait);
+ }
+@@ -182,8 +183,6 @@ static int add_transaction_credits(journal_t *journal, int 
blocks,
+       int needed;
+       int total = blocks + rsv_blocks;
+ 
+-      jbd2_might_wait_for_commit(journal);
+-
+       /*
+        * If the current transaction is locked down for commit, wait
+        * for the lock to be released.
+@@ -214,6 +213,7 @@ static int add_transaction_credits(journal_t *journal, int 
blocks,
+               if (atomic_read(&journal->j_reserved_credits) + total >
+                   journal->j_max_transaction_buffers) {
+                       read_unlock(&journal->j_state_lock);
++                      jbd2_might_wait_for_commit(journal);
+                       wait_event(journal->j_wait_reserved,
+                                  atomic_read(&journal->j_reserved_credits) + 
total <=
+                                  journal->j_max_transaction_buffers);
+@@ -238,6 +238,7 @@ static int add_transaction_credits(journal_t *journal, int 
blocks,
+       if (jbd2_log_space_left(journal) < jbd2_space_needed(journal)) {
+               atomic_sub(total, &t->t_outstanding_credits);
+               read_unlock(&journal->j_state_lock);
++              jbd2_might_wait_for_commit(journal);
+               write_lock(&journal->j_state_lock);
+               if (jbd2_log_space_left(journal) < jbd2_space_needed(journal))
+                       __jbd2_log_wait_for_space(journal);
+@@ -255,6 +256,7 @@ static int add_transaction_credits(journal_t *journal, int 
blocks,
+               sub_reserved_credits(journal, rsv_blocks);
+               atomic_sub(total, &t->t_outstanding_credits);
+               read_unlock(&journal->j_state_lock);
++              jbd2_might_wait_for_commit(journal);
+               wait_event(journal->j_wait_reserved,
+                        atomic_read(&journal->j_reserved_credits) + rsv_blocks
+                        <= journal->j_max_transaction_buffers / 2);
+diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c
+index 7a4a85a6821e..74d5ddd26296 100644
+--- a/fs/reiserfs/super.c
++++ b/fs/reiserfs/super.c
+@@ -190,7 +190,15 @@ static int remove_save_link_only(struct super_block *s,
+ static int reiserfs_quota_on_mount(struct super_block *, int);
+ #endif
+ 
+-/* look for uncompleted unlinks and truncates and complete them */
++/*
++ * Look for uncompleted unlinks and truncates and complete them
++ *
++ * Called with superblock write locked.  If quotas are enabled, we have to
++ * release/retake lest we call dquot_quota_on_mount(), proceed to
++ * schedule_on_each_cpu() in invalidate_bdev() and deadlock waiting for the 
per
++ * cpu worklets to complete flush_async_commits() that in turn wait for the
++ * superblock write lock.
++ */
+ static int finish_unfinished(struct super_block *s)
+ {
+       INITIALIZE_PATH(path);
+@@ -237,7 +245,9 @@ static int finish_unfinished(struct super_block *s)
+                               quota_enabled[i] = 0;
+                               continue;
+                       }
++                      reiserfs_write_unlock(s);
+                       ret = reiserfs_quota_on_mount(s, i);
++                      reiserfs_write_lock(s);
+                       if (ret < 0)
+                               reiserfs_warning(s, "reiserfs-2500",
+                                                "cannot turn on journaled "
+diff --git a/fs/utimes.c b/fs/utimes.c
+index 794f5f5b1fb5..ba54b9e648c9 100644
+--- a/fs/utimes.c
++++ b/fs/utimes.c
+@@ -87,21 +87,7 @@ static int utimes_common(struct path *path, struct timespec 
*times)
+                */
+               newattrs.ia_valid |= ATTR_TIMES_SET;
+       } else {
+-              /*
+-               * If times is NULL (or both times are UTIME_NOW),
+-               * then we need to check permissions, because
+-               * inode_change_ok() won't do it.
+-               */
+-              error = -EPERM;
+-                if (IS_IMMUTABLE(inode))
+-                      goto mnt_drop_write_and_out;
+-
+-              error = -EACCES;
+-              if (!inode_owner_or_capable(inode)) {
+-                      error = inode_permission(inode, MAY_WRITE);
+-                      if (error)
+-                              goto mnt_drop_write_and_out;
+-              }
++              newattrs.ia_valid |= ATTR_TOUCH;
+       }
+ retry_deleg:
+       inode_lock(inode);
+@@ -113,7 +99,6 @@ retry_deleg:
+                       goto retry_deleg;
+       }
+ 
+-mnt_drop_write_and_out:
+       mnt_drop_write(path->mnt);
+ out:
+       return error;
+diff --git a/include/crypto/ghash.h b/include/crypto/ghash.h
+new file mode 100644
+index 000000000000..2a61c9bbab8f
+--- /dev/null
++++ b/include/crypto/ghash.h
+@@ -0,0 +1,23 @@
++/*
++ * Common values for GHASH algorithms
++ */
++
++#ifndef __CRYPTO_GHASH_H__
++#define __CRYPTO_GHASH_H__
++
++#include <linux/types.h>
++#include <crypto/gf128mul.h>
++
++#define GHASH_BLOCK_SIZE      16
++#define GHASH_DIGEST_SIZE     16
++
++struct ghash_ctx {
++      struct gf128mul_4k *gf128;
++};
++
++struct ghash_desc_ctx {
++      u8 buffer[GHASH_BLOCK_SIZE];
++      u32 bytes;
++};
++
++#endif
+diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h
+index 1438e2322d5c..4d3f0d1aec73 100644
+--- a/include/linux/debugfs.h
++++ b/include/linux/debugfs.h
+@@ -45,6 +45,23 @@ extern struct dentry *arch_debugfs_dir;
+ 
+ extern struct srcu_struct debugfs_srcu;
+ 
++/**
++ * debugfs_real_fops - getter for the real file operation
++ * @filp: a pointer to a struct file
++ *
++ * Must only be called under the protection established by
++ * debugfs_use_file_start().
++ */
++static inline const struct file_operations *debugfs_real_fops(struct file 
*filp)
++      __must_hold(&debugfs_srcu)
++{
++      /*
++       * Neither the pointer to the struct file_operations, nor its
++       * contents ever change -- srcu_dereference() is not needed here.
++       */
++      return filp->f_path.dentry->d_fsdata;
++}
++
+ #if defined(CONFIG_DEBUG_FS)
+ 
+ struct dentry *debugfs_create_file(const char *name, umode_t mode,
+diff --git a/include/linux/fs.h b/include/linux/fs.h
+index 901e25d495cc..7c391366fb43 100644
+--- a/include/linux/fs.h
++++ b/include/linux/fs.h
+@@ -224,6 +224,7 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t 
offset,
+ #define ATTR_KILL_PRIV        (1 << 14)
+ #define ATTR_OPEN     (1 << 15) /* Truncating from open(O_TRUNC) */
+ #define ATTR_TIMES_SET        (1 << 16)
++#define ATTR_TOUCH    (1 << 17)
+ 
+ /*
+  * Whiteout is represented by a char device.  The following constants define 
the
+diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h
+index 4c45105dece3..52b97db93830 100644
+--- a/include/linux/radix-tree.h
++++ b/include/linux/radix-tree.h
+@@ -280,9 +280,9 @@ bool __radix_tree_delete_node(struct radix_tree_root *root,
+                             struct radix_tree_node *node);
+ void *radix_tree_delete_item(struct radix_tree_root *, unsigned long, void *);
+ void *radix_tree_delete(struct radix_tree_root *, unsigned long);
+-struct radix_tree_node *radix_tree_replace_clear_tags(
+-                              struct radix_tree_root *root,
+-                              unsigned long index, void *entry);
++void radix_tree_clear_tags(struct radix_tree_root *root,
++                         struct radix_tree_node *node,
++                         void **slot);
+ unsigned int radix_tree_gang_lookup(struct radix_tree_root *root,
+                       void **results, unsigned long first_index,
+                       unsigned int max_items);
+diff --git a/include/linux/sem.h b/include/linux/sem.h
+index 976ce3a19f1b..d0efd6e6c20a 100644
+--- a/include/linux/sem.h
++++ b/include/linux/sem.h
+@@ -21,6 +21,7 @@ struct sem_array {
+       struct list_head        list_id;        /* undo requests on this array 
*/
+       int                     sem_nsems;      /* no. of semaphores in array */
+       int                     complex_count;  /* pending complex operations */
++      bool                    complex_mode;   /* no parallel simple ops */
+ };
+ 
+ #ifdef CONFIG_SYSVIPC
+diff --git a/include/uapi/linux/btrfs.h b/include/uapi/linux/btrfs.h
+index ac5eacd3055b..db4c253f8011 100644
+--- a/include/uapi/linux/btrfs.h
++++ b/include/uapi/linux/btrfs.h
+@@ -239,7 +239,17 @@ struct btrfs_ioctl_fs_info_args {
+  * Used by:
+  * struct btrfs_ioctl_feature_flags
+  */
+-#define BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE       (1ULL << 0)
++#define BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE               (1ULL << 0)
++/*
++ * Older kernels (< 4.9) on big-endian systems produced broken free space tree
++ * bitmaps, and btrfs-progs also used to corrupt the free space tree (versions
++ * < 4.7.3).  If this bit is clear, then the free space tree cannot be 
trusted.
++ * btrfs-progs can also intentionally clear this bit to ask the kernel to
++ * rebuild the free space tree, however this might not work on older kernels
++ * that do not know about this bit. If not sure, clear the cache manually on
++ * first mount when booting older kernel versions.
++ */
++#define BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID (1ULL << 1)
+ 
+ #define BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF  (1ULL << 0)
+ #define BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL (1ULL << 1)
+diff --git a/ipc/sem.c b/ipc/sem.c
+index 7c9d4f7683c0..5e318c5f749d 100644
+--- a/ipc/sem.c
++++ b/ipc/sem.c
+@@ -162,14 +162,21 @@ static int sysvipc_sem_proc_show(struct seq_file *s, 
void *it);
+ 
+ /*
+  * Locking:
++ * a) global sem_lock() for read/write
+  *    sem_undo.id_next,
+  *    sem_array.complex_count,
+- *    sem_array.pending{_alter,_cont},
+- *    sem_array.sem_undo: global sem_lock() for read/write
+- *    sem_undo.proc_next: only "current" is allowed to read/write that field.
++ *    sem_array.complex_mode
++ *    sem_array.pending{_alter,_const},
++ *    sem_array.sem_undo
+  *
++ * b) global or semaphore sem_lock() for read/write:
+  *    sem_array.sem_base[i].pending_{const,alter}:
+- *            global or semaphore sem_lock() for read/write
++ *    sem_array.complex_mode (for read)
++ *
++ * c) special:
++ *    sem_undo_list.list_proc:
++ *    * undo_list->lock for write
++ *    * rcu for read
+  */
+ 
+ #define sc_semmsl     sem_ctls[0]
+@@ -260,30 +267,61 @@ static void sem_rcu_free(struct rcu_head *head)
+ }
+ 
+ /*
+- * Wait until all currently ongoing simple ops have completed.
++ * Enter the mode suitable for non-simple operations:
+  * Caller must own sem_perm.lock.
+- * New simple ops cannot start, because simple ops first check
+- * that sem_perm.lock is free.
+- * that a) sem_perm.lock is free and b) complex_count is 0.
+  */
+-static void sem_wait_array(struct sem_array *sma)
++static void complexmode_enter(struct sem_array *sma)
+ {
+       int i;
+       struct sem *sem;
+ 
+-      if (sma->complex_count)  {
+-              /* The thread that increased sma->complex_count waited on
+-               * all sem->lock locks. Thus we don't need to wait again.
+-               */
++      if (sma->complex_mode)  {
++              /* We are already in complex_mode. Nothing to do */
+               return;
+       }
+ 
++      /* We need a full barrier after seting complex_mode:
++       * The write to complex_mode must be visible
++       * before we read the first sem->lock spinlock state.
++       */
++      smp_store_mb(sma->complex_mode, true);
++
+       for (i = 0; i < sma->sem_nsems; i++) {
+               sem = sma->sem_base + i;
+               spin_unlock_wait(&sem->lock);
+       }
++      /*
++       * spin_unlock_wait() is not a memory barriers, it is only a
++       * control barrier. The code must pair with spin_unlock(&sem->lock),
++       * thus just the control barrier is insufficient.
++       *
++       * smp_rmb() is sufficient, as writes cannot pass the control barrier.
++       */
++      smp_rmb();
++}
++
++/*
++ * Try to leave the mode that disallows simple operations:
++ * Caller must own sem_perm.lock.
++ */
++static void complexmode_tryleave(struct sem_array *sma)
++{
++      if (sma->complex_count)  {
++              /* Complex ops are sleeping.
++               * We must stay in complex mode
++               */
++              return;
++      }
++      /*
++       * Immediately after setting complex_mode to false,
++       * a simple op can start. Thus: all memory writes
++       * performed by the current operation must be visible
++       * before we set complex_mode to false.
++       */
++      smp_store_release(&sma->complex_mode, false);
+ }
+ 
++#define SEM_GLOBAL_LOCK       (-1)
+ /*
+  * If the request contains only one semaphore operation, and there are
+  * no complex transactions pending, lock only the semaphore involved.
+@@ -300,56 +338,42 @@ static inline int sem_lock(struct sem_array *sma, struct 
sembuf *sops,
+               /* Complex operation - acquire a full lock */
+               ipc_lock_object(&sma->sem_perm);
+ 
+-              /* And wait until all simple ops that are processed
+-               * right now have dropped their locks.
+-               */
+-              sem_wait_array(sma);
+-              return -1;
++              /* Prevent parallel simple ops */
++              complexmode_enter(sma);
++              return SEM_GLOBAL_LOCK;
+       }
+ 
+       /*
+        * Only one semaphore affected - try to optimize locking.
+-       * The rules are:
+-       * - optimized locking is possible if no complex operation
+-       *   is either enqueued or processed right now.
+-       * - The test for enqueued complex ops is simple:
+-       *      sma->complex_count != 0
+-       * - Testing for complex ops that are processed right now is
+-       *   a bit more difficult. Complex ops acquire the full lock
+-       *   and first wait that the running simple ops have completed.
+-       *   (see above)
+-       *   Thus: If we own a simple lock and the global lock is free
+-       *      and complex_count is now 0, then it will stay 0 and
+-       *      thus just locking sem->lock is sufficient.
++       * Optimized locking is possible if no complex operation
++       * is either enqueued or processed right now.
++       *
++       * Both facts are tracked by complex_mode.
+        */
+       sem = sma->sem_base + sops->sem_num;
+ 
+-      if (sma->complex_count == 0) {
++      /*
++       * Initial check for complex_mode. Just an optimization,
++       * no locking, no memory barrier.
++       */
++      if (!sma->complex_mode) {
+               /*
+                * It appears that no complex operation is around.
+                * Acquire the per-semaphore lock.
+                */
+               spin_lock(&sem->lock);
+ 
+-              /* Then check that the global lock is free */
+-              if (!spin_is_locked(&sma->sem_perm.lock)) {
+-                      /*
+-                       * We need a memory barrier with acquire semantics,
+-                       * otherwise we can race with another thread that does:
+-                       *      complex_count++;
+-                       *      spin_unlock(sem_perm.lock);
+-                       */
+-                      smp_acquire__after_ctrl_dep();
++              /*
++               * See 51d7d5205d33
++               * ("powerpc: Add smp_mb() to arch_spin_is_locked()"):
++               * A full barrier is required: the write of sem->lock
++               * must be visible before the read is executed
++               */
++              smp_mb();
+ 
+-                      /*
+-                       * Now repeat the test of complex_count:
+-                       * It can't change anymore until we drop sem->lock.
+-                       * Thus: if is now 0, then it will stay 0.
+-                       */
+-                      if (sma->complex_count == 0) {
+-                              /* fast path successful! */
+-                              return sops->sem_num;
+-                      }
++              if (!smp_load_acquire(&sma->complex_mode)) {
++                      /* fast path successful! */
++                      return sops->sem_num;
+               }
+               spin_unlock(&sem->lock);
+       }
+@@ -369,15 +393,16 @@ static inline int sem_lock(struct sem_array *sma, struct 
sembuf *sops,
+               /* Not a false alarm, thus complete the sequence for a
+                * full lock.
+                */
+-              sem_wait_array(sma);
+-              return -1;
++              complexmode_enter(sma);
++              return SEM_GLOBAL_LOCK;
+       }
+ }
+ 
+ static inline void sem_unlock(struct sem_array *sma, int locknum)
+ {
+-      if (locknum == -1) {
++      if (locknum == SEM_GLOBAL_LOCK) {
+               unmerge_queues(sma);
++              complexmode_tryleave(sma);
+               ipc_unlock_object(&sma->sem_perm);
+       } else {
+               struct sem *sem = sma->sem_base + locknum;
+@@ -529,6 +554,7 @@ static int newary(struct ipc_namespace *ns, struct 
ipc_params *params)
+       }
+ 
+       sma->complex_count = 0;
++      sma->complex_mode = true; /* dropped by sem_unlock below */
+       INIT_LIST_HEAD(&sma->pending_alter);
+       INIT_LIST_HEAD(&sma->pending_const);
+       INIT_LIST_HEAD(&sma->list_id);
+@@ -2184,10 +2210,10 @@ static int sysvipc_sem_proc_show(struct seq_file *s, 
void *it)
+       /*
+        * The proc interface isn't aware of sem_lock(), it calls
+        * ipc_lock_object() directly (in sysvipc_find_ipc).
+-       * In order to stay compatible with sem_lock(), we must wait until
+-       * all simple semop() calls have left their critical regions.
++       * In order to stay compatible with sem_lock(), we must
++       * enter / leave complex_mode.
+        */
+-      sem_wait_array(sma);
++      complexmode_enter(sma);
+ 
+       sem_otime = get_semotime(sma);
+ 
+@@ -2204,6 +2230,8 @@ static int sysvipc_sem_proc_show(struct seq_file *s, 
void *it)
+                  sem_otime,
+                  sma->sem_ctime);
+ 
++      complexmode_tryleave(sma);
++
+       return 0;
+ }
+ #endif
+diff --git a/lib/radix-tree.c b/lib/radix-tree.c
+index 91f0727e3cad..8e6d552c40dd 100644
+--- a/lib/radix-tree.c
++++ b/lib/radix-tree.c
+@@ -1583,15 +1583,10 @@ void *radix_tree_delete(struct radix_tree_root *root, 
unsigned long index)
+ }
+ EXPORT_SYMBOL(radix_tree_delete);
+ 
+-struct radix_tree_node *radix_tree_replace_clear_tags(
+-                      struct radix_tree_root *root,
+-                      unsigned long index, void *entry)
++void radix_tree_clear_tags(struct radix_tree_root *root,
++                         struct radix_tree_node *node,
++                         void **slot)
+ {
+-      struct radix_tree_node *node;
+-      void **slot;
+-
+-      __radix_tree_lookup(root, index, &node, &slot);
+-
+       if (node) {
+               unsigned int tag, offset = get_slot_offset(node, slot);
+               for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++)
+@@ -1600,9 +1595,6 @@ struct radix_tree_node *radix_tree_replace_clear_tags(
+               /* Clear root node tags */
+               root->gfp_mask &= __GFP_BITS_MASK;
+       }
+-
+-      radix_tree_replace_slot(slot, entry);
+-      return node;
+ }
+ 
+ /**
+diff --git a/mm/filemap.c b/mm/filemap.c
+index 2d0986a64f1f..ced9ef6c06b0 100644
+--- a/mm/filemap.c
++++ b/mm/filemap.c
+@@ -169,33 +169,35 @@ static int page_cache_tree_insert(struct address_space 
*mapping,
+ static void page_cache_tree_delete(struct address_space *mapping,
+                                  struct page *page, void *shadow)
+ {
+-      struct radix_tree_node *node;
+       int i, nr = PageHuge(page) ? 1 : hpage_nr_pages(page);
+ 
+       VM_BUG_ON_PAGE(!PageLocked(page), page);
+       VM_BUG_ON_PAGE(PageTail(page), page);
+       VM_BUG_ON_PAGE(nr != 1 && shadow, page);
+ 
+-      if (shadow) {
+-              mapping->nrexceptional += nr;
+-              /*
+-               * Make sure the nrexceptional update is committed before
+-               * the nrpages update so that final truncate racing
+-               * with reclaim does not see both counters 0 at the
+-               * same time and miss a shadow entry.
+-               */
+-              smp_wmb();
+-      }
+-      mapping->nrpages -= nr;
+-
+       for (i = 0; i < nr; i++) {
+-              node = radix_tree_replace_clear_tags(&mapping->page_tree,
+-                              page->index + i, shadow);
++              struct radix_tree_node *node;
++              void **slot;
++
++              __radix_tree_lookup(&mapping->page_tree, page->index + i,
++                                  &node, &slot);
++
++              radix_tree_clear_tags(&mapping->page_tree, node, slot);
++
+               if (!node) {
+                       VM_BUG_ON_PAGE(nr != 1, page);
+-                      return;
++                      /*
++                       * We need a node to properly account shadow
++                       * entries. Don't plant any without. XXX
++                       */
++                      shadow = NULL;
+               }
+ 
++              radix_tree_replace_slot(slot, shadow);
++
++              if (!node)
++                      break;
++
+               workingset_node_pages_dec(node);
+               if (shadow)
+                       workingset_node_shadows_inc(node);
+@@ -219,6 +221,18 @@ static void page_cache_tree_delete(struct address_space 
*mapping,
+                                       &node->private_list);
+               }
+       }
++
++      if (shadow) {
++              mapping->nrexceptional += nr;
++              /*
++               * Make sure the nrexceptional update is committed before
++               * the nrpages update so that final truncate racing
++               * with reclaim does not see both counters 0 at the
++               * same time and miss a shadow entry.
++               */
++              smp_wmb();
++      }
++      mapping->nrpages -= nr;
+ }
+ 
+ /*
+@@ -619,7 +633,6 @@ int replace_page_cache_page(struct page *old, struct page 
*new, gfp_t gfp_mask)
+               __delete_from_page_cache(old, NULL);
+               error = page_cache_tree_insert(mapping, new, NULL);
+               BUG_ON(error);
+-              mapping->nrpages++;
+ 
+               /*
+                * hugetlb pages do not participate in page cache accounting.
+@@ -1674,6 +1687,10 @@ static ssize_t do_generic_file_read(struct file *filp, 
loff_t *ppos,
+       unsigned int prev_offset;
+       int error = 0;
+ 
++      if (unlikely(*ppos >= inode->i_sb->s_maxbytes))
++              return -EINVAL;
++      iov_iter_truncate(iter, inode->i_sb->s_maxbytes);
++
+       index = *ppos >> PAGE_SHIFT;
+       prev_index = ra->prev_pos >> PAGE_SHIFT;
+       prev_offset = ra->prev_pos & (PAGE_SIZE-1);
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index 87e11d8ad536..603bdd01ec2c 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -1443,13 +1443,14 @@ static void dissolve_free_huge_page(struct page *page)
+ {
+       spin_lock(&hugetlb_lock);
+       if (PageHuge(page) && !page_count(page)) {
+-              struct hstate *h = page_hstate(page);
+-              int nid = page_to_nid(page);
+-              list_del(&page->lru);
++              struct page *head = compound_head(page);
++              struct hstate *h = page_hstate(head);
++              int nid = page_to_nid(head);
++              list_del(&head->lru);
+               h->free_huge_pages--;
+               h->free_huge_pages_node[nid]--;
+               h->max_huge_pages--;
+-              update_and_free_page(h, page);
++              update_and_free_page(h, head);
+       }
+       spin_unlock(&hugetlb_lock);
+ }
+@@ -1457,7 +1458,8 @@ static void dissolve_free_huge_page(struct page *page)
+ /*
+  * Dissolve free hugepages in a given pfn range. Used by memory hotplug to
+  * make specified memory blocks removable from the system.
+- * Note that start_pfn should aligned with (minimum) hugepage size.
++ * Note that this will dissolve a free gigantic hugepage completely, if any
++ * part of it lies within the given range.
+  */
+ void dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn)
+ {
+@@ -1466,7 +1468,6 @@ void dissolve_free_huge_pages(unsigned long start_pfn, 
unsigned long end_pfn)
+       if (!hugepages_supported())
+               return;
+ 
+-      VM_BUG_ON(!IS_ALIGNED(start_pfn, 1 << minimum_order));
+       for (pfn = start_pfn; pfn < end_pfn; pfn += 1 << minimum_order)
+               dissolve_free_huge_page(pfn_to_page(pfn));
+ }
+diff --git a/sound/soc/codecs/nau8825.c b/sound/soc/codecs/nau8825.c
+index 2e59a85e360b..ff566376da40 100644
+--- a/sound/soc/codecs/nau8825.c
++++ b/sound/soc/codecs/nau8825.c
+@@ -1907,7 +1907,7 @@ static int nau8825_calc_fll_param(unsigned int fll_in, 
unsigned int fs,
+       /* Calculate the FLL 10-bit integer input and the FLL 16-bit fractional
+        * input based on FDCO, FREF and FLL ratio.
+        */
+-      fvco = div_u64(fvco << 16, fref * fll_param->ratio);
++      fvco = div_u64(fvco_max << 16, fref * fll_param->ratio);
+       fll_param->fll_int = (fvco >> 16) & 0x3FF;
+       fll_param->fll_frac = fvco & 0xFFFF;
+       return 0;
+diff --git a/sound/soc/intel/atom/sst/sst_pvt.c 
b/sound/soc/intel/atom/sst/sst_pvt.c
+index adb32fefd693..b1e6b8f34a6a 100644
+--- a/sound/soc/intel/atom/sst/sst_pvt.c
++++ b/sound/soc/intel/atom/sst/sst_pvt.c
+@@ -279,17 +279,15 @@ int sst_prepare_and_post_msg(struct intel_sst_drv *sst,
+ 
+       if (response) {
+               ret = sst_wait_timeout(sst, block);
+-              if (ret < 0) {
++              if (ret < 0)
+                       goto out;
+-              } else if(block->data) {
+-                      if (!data)
+-                              goto out;
+-                      *data = kzalloc(block->size, GFP_KERNEL);
+-                      if (!(*data)) {
++
++              if (data && block->data) {
++                      *data = kmemdup(block->data, block->size, GFP_KERNEL);
++                      if (!*data) {
+                               ret = -ENOMEM;
+                               goto out;
+-                      } else
+-                              memcpy(data, (void *) block->data, block->size);
++                      }
+               }
+       }
+ out:

Reply via email to