commit:     81add174d3383b65dd28e1ce3ad998e75aed350f
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Tue Oct 27 13:41:19 2015 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Tue Oct 27 13:41:19 2015 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=81add174

Linux patch 3.10.92

 0000_README              |   4 +
 1091_linux-3.10.92.patch | 413 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 417 insertions(+)

diff --git a/0000_README b/0000_README
index 15d5f51..b2a3944 100644
--- a/0000_README
+++ b/0000_README
@@ -406,6 +406,10 @@ Patch:  1090_linux-3.10.91.patch
 From:   http://www.kernel.org
 Desc:   Linux 3.10.91
 
+Patch:  1091_linux-3.10.92.patch
+From:   http://www.kernel.org
+Desc:   Linux 3.10.92
+
 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/1091_linux-3.10.92.patch b/1091_linux-3.10.92.patch
new file mode 100644
index 0000000..ac354e3
--- /dev/null
+++ b/1091_linux-3.10.92.patch
@@ -0,0 +1,413 @@
+diff --git a/Makefile b/Makefile
+index ba6a94cf354b..25701b67bb6d 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 10
+-SUBLEVEL = 91
++SUBLEVEL = 92
+ EXTRAVERSION =
+ NAME = TOSSUG Baby Fish
+ 
+diff --git a/arch/m68k/include/asm/uaccess_mm.h 
b/arch/m68k/include/asm/uaccess_mm.h
+index 472c891a4aee..15901db435b9 100644
+--- a/arch/m68k/include/asm/uaccess_mm.h
++++ b/arch/m68k/include/asm/uaccess_mm.h
+@@ -90,7 +90,7 @@ asm volatile ("\n"                                   \
+               __put_user_asm(__pu_err, __pu_val, ptr, b, d, -EFAULT); \
+               break;                                                  \
+       case 2:                                                         \
+-              __put_user_asm(__pu_err, __pu_val, ptr, w, d, -EFAULT); \
++              __put_user_asm(__pu_err, __pu_val, ptr, w, r, -EFAULT); \
+               break;                                                  \
+       case 4:                                                         \
+               __put_user_asm(__pu_err, __pu_val, ptr, l, r, -EFAULT); \
+@@ -158,7 +158,7 @@ asm volatile ("\n"                                 \
+               __get_user_asm(__gu_err, x, ptr, u8, b, d, -EFAULT);    \
+               break;                                                  \
+       case 2:                                                         \
+-              __get_user_asm(__gu_err, x, ptr, u16, w, d, -EFAULT);   \
++              __get_user_asm(__gu_err, x, ptr, u16, w, r, -EFAULT);   \
+               break;                                                  \
+       case 4:                                                         \
+               __get_user_asm(__gu_err, x, ptr, u32, l, r, -EFAULT);   \
+@@ -245,7 +245,7 @@ __constant_copy_from_user(void *to, const void __user 
*from, unsigned long n)
+               __get_user_asm(res, *(u8 *)to, (u8 __user *)from, u8, b, d, 1);
+               break;
+       case 2:
+-              __get_user_asm(res, *(u16 *)to, (u16 __user *)from, u16, w, d, 
2);
++              __get_user_asm(res, *(u16 *)to, (u16 __user *)from, u16, w, r, 
2);
+               break;
+       case 3:
+               __constant_copy_from_user_asm(res, to, from, tmp, 3, w, b,);
+@@ -326,7 +326,7 @@ __constant_copy_to_user(void __user *to, const void *from, 
unsigned long n)
+               __put_user_asm(res, *(u8 *)from, (u8 __user *)to, b, d, 1);
+               break;
+       case 2:
+-              __put_user_asm(res, *(u16 *)from, (u16 __user *)to, w, d, 2);
++              __put_user_asm(res, *(u16 *)from, (u16 __user *)to, w, r, 2);
+               break;
+       case 3:
+               __constant_copy_to_user_asm(res, to, from, tmp, 3, w, b,);
+diff --git a/arch/m68k/lib/uaccess.c b/arch/m68k/lib/uaccess.c
+index 5e97f2ee7c11..35d1442dee89 100644
+--- a/arch/m68k/lib/uaccess.c
++++ b/arch/m68k/lib/uaccess.c
+@@ -52,7 +52,7 @@ unsigned long __generic_copy_from_user(void *to, const void 
__user *from,
+               "       .long   3b,30b\n"
+               "       .long   5b,50b\n"
+               "       .previous"
+-              : "=d" (res), "+a" (from), "+a" (to), "=&r" (tmp)
++              : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp)
+               : "0" (n / 4), "d" (n & 3));
+ 
+       return res;
+@@ -96,7 +96,7 @@ unsigned long __generic_copy_to_user(void __user *to, const 
void *from,
+               "       .long   7b,50b\n"
+               "       .long   8b,50b\n"
+               "       .previous"
+-              : "=d" (res), "+a" (from), "+a" (to), "=&r" (tmp)
++              : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp)
+               : "0" (n / 4), "d" (n & 3));
+ 
+       return res;
+@@ -141,7 +141,7 @@ unsigned long __clear_user(void __user *to, unsigned long 
n)
+               "       .long   7b,40b\n"
+               "       .previous"
+               : "=d" (res), "+a" (to)
+-              : "r" (0), "0" (n / 4), "d" (n & 3));
++              : "d" (0), "0" (n / 4), "d" (n & 3));
+ 
+     return res;
+ }
+diff --git a/arch/sparc/crypto/aes_glue.c b/arch/sparc/crypto/aes_glue.c
+index ded4cee35318..dc78cdd43e0a 100644
+--- a/arch/sparc/crypto/aes_glue.c
++++ b/arch/sparc/crypto/aes_glue.c
+@@ -433,6 +433,7 @@ static struct crypto_alg algs[] = { {
+               .blkcipher = {
+                       .min_keysize    = AES_MIN_KEY_SIZE,
+                       .max_keysize    = AES_MAX_KEY_SIZE,
++                      .ivsize         = AES_BLOCK_SIZE,
+                       .setkey         = aes_set_key,
+                       .encrypt        = cbc_encrypt,
+                       .decrypt        = cbc_decrypt,
+@@ -452,6 +453,7 @@ static struct crypto_alg algs[] = { {
+               .blkcipher = {
+                       .min_keysize    = AES_MIN_KEY_SIZE,
+                       .max_keysize    = AES_MAX_KEY_SIZE,
++                      .ivsize         = AES_BLOCK_SIZE,
+                       .setkey         = aes_set_key,
+                       .encrypt        = ctr_crypt,
+                       .decrypt        = ctr_crypt,
+diff --git a/arch/sparc/crypto/camellia_glue.c 
b/arch/sparc/crypto/camellia_glue.c
+index 641f55cb61c3..eb87d6dd86b1 100644
+--- a/arch/sparc/crypto/camellia_glue.c
++++ b/arch/sparc/crypto/camellia_glue.c
+@@ -274,6 +274,7 @@ static struct crypto_alg algs[] = { {
+               .blkcipher = {
+                       .min_keysize    = CAMELLIA_MIN_KEY_SIZE,
+                       .max_keysize    = CAMELLIA_MAX_KEY_SIZE,
++                      .ivsize         = CAMELLIA_BLOCK_SIZE,
+                       .setkey         = camellia_set_key,
+                       .encrypt        = cbc_encrypt,
+                       .decrypt        = cbc_decrypt,
+diff --git a/arch/sparc/crypto/des_glue.c b/arch/sparc/crypto/des_glue.c
+index d11500972994..1359bfc544e4 100644
+--- a/arch/sparc/crypto/des_glue.c
++++ b/arch/sparc/crypto/des_glue.c
+@@ -429,6 +429,7 @@ static struct crypto_alg algs[] = { {
+               .blkcipher = {
+                       .min_keysize    = DES_KEY_SIZE,
+                       .max_keysize    = DES_KEY_SIZE,
++                      .ivsize         = DES_BLOCK_SIZE,
+                       .setkey         = des_set_key,
+                       .encrypt        = cbc_encrypt,
+                       .decrypt        = cbc_decrypt,
+@@ -485,6 +486,7 @@ static struct crypto_alg algs[] = { {
+               .blkcipher = {
+                       .min_keysize    = DES3_EDE_KEY_SIZE,
+                       .max_keysize    = DES3_EDE_KEY_SIZE,
++                      .ivsize         = DES3_EDE_BLOCK_SIZE,
+                       .setkey         = des3_ede_set_key,
+                       .encrypt        = cbc3_encrypt,
+                       .decrypt        = cbc3_decrypt,
+diff --git a/crypto/ahash.c b/crypto/ahash.c
+index 793a27f2493e..857ae2b2a2a2 100644
+--- a/crypto/ahash.c
++++ b/crypto/ahash.c
+@@ -462,7 +462,8 @@ static int ahash_prepare_alg(struct ahash_alg *alg)
+       struct crypto_alg *base = &alg->halg.base;
+ 
+       if (alg->halg.digestsize > PAGE_SIZE / 8 ||
+-          alg->halg.statesize > PAGE_SIZE / 8)
++          alg->halg.statesize > PAGE_SIZE / 8 ||
++          alg->halg.statesize == 0)
+               return -EINVAL;
+ 
+       base->cra_type = &crypto_ahash_type;
+diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
+index 01677543248d..2fa22c24fa5d 100644
+--- a/drivers/block/rbd.c
++++ b/drivers/block/rbd.c
+@@ -4860,7 +4860,6 @@ static int rbd_dev_probe_parent(struct rbd_device 
*rbd_dev)
+ out_err:
+       if (parent) {
+               rbd_dev_unparent(rbd_dev);
+-              kfree(rbd_dev->header_name);
+               rbd_dev_destroy(parent);
+       } else {
+               rbd_put_client(rbdc);
+diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c
+index 8a806f5c40cf..3f2dbd1ce6a3 100644
+--- a/drivers/i2c/busses/i2c-rcar.c
++++ b/drivers/i2c/busses/i2c-rcar.c
+@@ -673,15 +673,16 @@ static int rcar_i2c_probe(struct platform_device *pdev)
+               return ret;
+       }
+ 
++      pm_runtime_enable(dev);
++      platform_set_drvdata(pdev, priv);
++
+       ret = i2c_add_numbered_adapter(adap);
+       if (ret < 0) {
+               dev_err(dev, "reg adap failed: %d\n", ret);
++              pm_runtime_disable(dev);
+               return ret;
+       }
+ 
+-      pm_runtime_enable(dev);
+-      platform_set_drvdata(pdev, priv);
+-
+       dev_info(dev, "probed\n");
+ 
+       return 0;
+diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
+index 39996ca58ce6..ec56072c6326 100644
+--- a/drivers/md/dm-thin.c
++++ b/drivers/md/dm-thin.c
+@@ -2109,7 +2109,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, 
char **argv)
+                                               metadata_low_callback,
+                                               pool);
+       if (r)
+-              goto out_free_pt;
++              goto out_flags_changed;
+ 
+       pt->callbacks.congested_fn = pool_is_congested;
+       dm_table_add_target_callbacks(ti->table, &pt->callbacks);
+diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c
+index becfa3ef7fdc..eda9f3d87746 100644
+--- a/drivers/net/ppp/pppoe.c
++++ b/drivers/net/ppp/pppoe.c
+@@ -313,7 +313,6 @@ static void pppoe_flush_dev(struct net_device *dev)
+                       if (po->pppoe_dev == dev &&
+                           sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND | 
PPPOX_ZOMBIE)) {
+                               pppox_unbind_sock(sk);
+-                              sk->sk_state = PPPOX_ZOMBIE;
+                               sk->sk_state_change(sk);
+                               po->pppoe_dev = NULL;
+                               dev_put(dev);
+diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c
+index 97b5de7aebdb..05e8bd7b3e0f 100644
+--- a/drivers/net/usb/asix_devices.c
++++ b/drivers/net/usb/asix_devices.c
+@@ -466,19 +466,7 @@ static int ax88772_bind(struct usbnet *dev, struct 
usb_interface *intf)
+               return ret;
+       }
+ 
+-      ret = asix_sw_reset(dev, AX_SWRESET_IPPD | AX_SWRESET_PRL);
+-      if (ret < 0)
+-              return ret;
+-
+-      msleep(150);
+-
+-      ret = asix_sw_reset(dev, AX_SWRESET_CLEAR);
+-      if (ret < 0)
+-              return ret;
+-
+-      msleep(150);
+-
+-      ret = asix_sw_reset(dev, embd_phy ? AX_SWRESET_IPRL : AX_SWRESET_PRTE);
++      ax88772_reset(dev);
+ 
+       /* Read PHYID register *AFTER* the PHY was reset properly */
+       phyid = asix_get_phyid(dev);
+@@ -888,7 +876,7 @@ static const struct driver_info ax88772_info = {
+       .unbind = ax88772_unbind,
+       .status = asix_status,
+       .link_reset = ax88772_link_reset,
+-      .reset = ax88772_reset,
++      .reset = ax88772_link_reset,
+       .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | 
FLAG_MULTI_PACKET,
+       .rx_fixup = asix_rx_fixup_common,
+       .tx_fixup = asix_tx_fixup,
+diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
+index 478120ae34e5..993e34774bb1 100644
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -2363,6 +2363,9 @@ static inline void skb_postpull_rcsum(struct sk_buff 
*skb,
+ {
+       if (skb->ip_summed == CHECKSUM_COMPLETE)
+               skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0));
++      else if (skb->ip_summed == CHECKSUM_PARTIAL &&
++               skb_checksum_start_offset(skb) < 0)
++              skb->ip_summed = CHECKSUM_NONE;
+ }
+ 
+ unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len);
+diff --git a/include/net/af_unix.h b/include/net/af_unix.h
+index dbdfd2b0f3b3..e927d3e80b61 100644
+--- a/include/net/af_unix.h
++++ b/include/net/af_unix.h
+@@ -63,7 +63,11 @@ struct unix_sock {
+ #define UNIX_GC_MAYBE_CYCLE   1
+       struct socket_wq        peer_wq;
+ };
+-#define unix_sk(__sk) ((struct unix_sock *)__sk)
++
++static inline struct unix_sock *unix_sk(struct sock *sk)
++{
++      return (struct unix_sock *)sk;
++}
+ 
+ #define peer_wait peer_wq.wait
+ 
+diff --git a/include/net/sock.h b/include/net/sock.h
+index c0aad07160ef..95dc0c8a9dac 100644
+--- a/include/net/sock.h
++++ b/include/net/sock.h
+@@ -782,6 +782,14 @@ static inline __must_check int sk_add_backlog(struct sock 
*sk, struct sk_buff *s
+       if (sk_rcvqueues_full(sk, skb, limit))
+               return -ENOBUFS;
+ 
++      /*
++       * If the skb was allocated from pfmemalloc reserves, only
++       * allow SOCK_MEMALLOC sockets to use it as this socket is
++       * helping free memory
++       */
++      if (skb_pfmemalloc(skb) && !sock_flag(sk, SOCK_MEMALLOC))
++              return -ENOMEM;
++
+       __sk_add_backlog(sk, skb);
+       sk->sk_backlog.len += skb->truesize;
+       return 0;
+diff --git a/kernel/workqueue.c b/kernel/workqueue.c
+index fe7c4b91d2e7..fa927fd5778d 100644
+--- a/kernel/workqueue.c
++++ b/kernel/workqueue.c
+@@ -1450,13 +1450,13 @@ static void __queue_delayed_work(int cpu, struct 
workqueue_struct *wq,
+       timer_stats_timer_set_start_info(&dwork->timer);
+ 
+       dwork->wq = wq;
++      /* timer isn't guaranteed to run in this cpu, record earlier */
++      if (cpu == WORK_CPU_UNBOUND)
++              cpu = raw_smp_processor_id();
+       dwork->cpu = cpu;
+       timer->expires = jiffies + delay;
+ 
+-      if (unlikely(cpu != WORK_CPU_UNBOUND))
+-              add_timer_on(timer, cpu);
+-      else
+-              add_timer(timer);
++      add_timer_on(timer, cpu);
+ }
+ 
+ /**
+diff --git a/net/core/ethtool.c b/net/core/ethtool.c
+index ce91766eeca9..213b61255140 100644
+--- a/net/core/ethtool.c
++++ b/net/core/ethtool.c
+@@ -1066,7 +1066,7 @@ static int ethtool_get_strings(struct net_device *dev, 
void __user *useraddr)
+ 
+       gstrings.len = ret;
+ 
+-      data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER);
++      data = kcalloc(gstrings.len, ETH_GSTRING_LEN, GFP_USER);
+       if (!data)
+               return -ENOMEM;
+ 
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index 6148716884ae..05195b8c8718 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -2711,11 +2711,12 @@ EXPORT_SYMBOL(skb_append_datato_frags);
+  */
+ unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len)
+ {
++      unsigned char *data = skb->data;
++
+       BUG_ON(len > skb->len);
+-      skb->len -= len;
+-      BUG_ON(skb->len < skb->data_len);
+-      skb_postpull_rcsum(skb, skb->data, len);
+-      return skb->data += len;
++      __skb_pull(skb, len);
++      skb_postpull_rcsum(skb, data, len);
++      return skb->data;
+ }
+ EXPORT_SYMBOL_GPL(skb_pull_rcsum);
+ 
+diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c
+index 8c27de2b4d5a..797ff373e486 100644
+--- a/net/l2tp/l2tp_core.c
++++ b/net/l2tp/l2tp_core.c
+@@ -1381,7 +1381,7 @@ static void l2tp_tunnel_del_work(struct work_struct 
*work)
+       tunnel = container_of(work, struct l2tp_tunnel, del_work);
+       sk = l2tp_tunnel_sock_lookup(tunnel);
+       if (!sk)
+-              return;
++              goto out;
+ 
+       sock = sk->sk_socket;
+ 
+@@ -1402,6 +1402,8 @@ static void l2tp_tunnel_del_work(struct work_struct 
*work)
+       }
+ 
+       l2tp_tunnel_sock_put(sk);
++out:
++      l2tp_tunnel_dec_refcount(tunnel);
+ }
+ 
+ /* Create a socket for the tunnel, if one isn't set up by
+@@ -1731,8 +1733,13 @@ EXPORT_SYMBOL_GPL(l2tp_tunnel_create);
+  */
+ int l2tp_tunnel_delete(struct l2tp_tunnel *tunnel)
+ {
++      l2tp_tunnel_inc_refcount(tunnel);
+       l2tp_tunnel_closeall(tunnel);
+-      return (false == queue_work(l2tp_wq, &tunnel->del_work));
++      if (false == queue_work(l2tp_wq, &tunnel->del_work)) {
++              l2tp_tunnel_dec_refcount(tunnel);
++              return 1;
++      }
++      return 0;
+ }
+ EXPORT_SYMBOL_GPL(l2tp_tunnel_delete);
+ 
+diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
+index 123c16419cbe..825c029bf092 100644
+--- a/net/unix/af_unix.c
++++ b/net/unix/af_unix.c
+@@ -2063,8 +2063,20 @@ again:
+                       if (UNIXCB(skb).fp)
+                               siocb->scm->fp = scm_fp_dup(UNIXCB(skb).fp);
+ 
+-                      sk_peek_offset_fwd(sk, chunk);
++                      if (skip) {
++                              sk_peek_offset_fwd(sk, chunk);
++                              skip -= chunk;
++                      }
++
++                      if (UNIXCB(skb).fp)
++                              break;
+ 
++                      last = skb;
++                      unix_state_lock(sk);
++                      skb = skb_peek_next(skb, &sk->sk_receive_queue);
++                      if (skb)
++                              goto again;
++                      unix_state_unlock(sk);
+                       break;
+               }
+       } while (size);

Reply via email to