summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony G. Basile <blueness@gentoo.org>2014-07-11 08:44:39 -0400
committerAnthony G. Basile <blueness@gentoo.org>2014-07-11 08:44:39 -0400
commite19c6fd24e5309282575add82dc3953761ead349 (patch)
treedf31b7c5dbbb1abaa95cf4ccf118255b02559972
parentGrsec/PaX: 3.0-{3.2.60,3.14.11,3.15.4}-201407081937 (diff)
downloadhardened-patchset-e19c6fd24e5309282575add82dc3953761ead349.tar.gz
hardened-patchset-e19c6fd24e5309282575add82dc3953761ead349.tar.bz2
hardened-patchset-e19c6fd24e5309282575add82dc3953761ead349.zip
Grsec/PaX: 3.0-{3.2.60,3.14.12,3.15.5}-grsecurity-3.0-3.15.5-20140710003620140710
-rw-r--r--3.14.12/0000_README (renamed from 3.14.11/0000_README)2
-rw-r--r--3.14.12/4420_grsecurity-3.0-3.14.12-201407100035.patch (renamed from 3.14.11/4420_grsecurity-3.0-3.14.11-201407081919.patch)289
-rw-r--r--3.14.12/4425_grsec_remove_EI_PAX.patch (renamed from 3.14.11/4425_grsec_remove_EI_PAX.patch)0
-rw-r--r--3.14.12/4427_force_XATTR_PAX_tmpfs.patch (renamed from 3.14.11/4427_force_XATTR_PAX_tmpfs.patch)0
-rw-r--r--3.14.12/4430_grsec-remove-localversion-grsec.patch (renamed from 3.14.11/4430_grsec-remove-localversion-grsec.patch)0
-rw-r--r--3.14.12/4435_grsec-mute-warnings.patch (renamed from 3.14.11/4435_grsec-mute-warnings.patch)0
-rw-r--r--3.14.12/4440_grsec-remove-protected-paths.patch (renamed from 3.14.11/4440_grsec-remove-protected-paths.patch)0
-rw-r--r--3.14.12/4450_grsec-kconfig-default-gids.patch (renamed from 3.14.11/4450_grsec-kconfig-default-gids.patch)0
-rw-r--r--3.14.12/4465_selinux-avc_audit-log-curr_ip.patch (renamed from 3.14.11/4465_selinux-avc_audit-log-curr_ip.patch)0
-rw-r--r--3.14.12/4470_disable-compat_vdso.patch (renamed from 3.14.11/4470_disable-compat_vdso.patch)0
-rw-r--r--3.14.12/4475_emutramp_default_on.patch (renamed from 3.14.11/4475_emutramp_default_on.patch)0
-rw-r--r--3.15.5/0000_README (renamed from 3.15.4/0000_README)0
-rw-r--r--3.15.5/4420_grsecurity-3.0-3.15.5-201407100036.patch (renamed from 3.15.4/4420_grsecurity-3.0-3.15.4-201407081937.patch)294
-rw-r--r--3.15.5/4425_grsec_remove_EI_PAX.patch (renamed from 3.15.4/4425_grsec_remove_EI_PAX.patch)0
-rw-r--r--3.15.5/4427_force_XATTR_PAX_tmpfs.patch (renamed from 3.15.4/4427_force_XATTR_PAX_tmpfs.patch)0
-rw-r--r--3.15.5/4430_grsec-remove-localversion-grsec.patch (renamed from 3.15.4/4430_grsec-remove-localversion-grsec.patch)0
-rw-r--r--3.15.5/4435_grsec-mute-warnings.patch (renamed from 3.15.4/4435_grsec-mute-warnings.patch)0
-rw-r--r--3.15.5/4440_grsec-remove-protected-paths.patch (renamed from 3.15.4/4440_grsec-remove-protected-paths.patch)0
-rw-r--r--3.15.5/4450_grsec-kconfig-default-gids.patch (renamed from 3.15.4/4450_grsec-kconfig-default-gids.patch)0
-rw-r--r--3.15.5/4465_selinux-avc_audit-log-curr_ip.patch (renamed from 3.15.4/4465_selinux-avc_audit-log-curr_ip.patch)0
-rw-r--r--3.15.5/4470_disable-compat_vdso.patch (renamed from 3.15.4/4470_disable-compat_vdso.patch)0
-rw-r--r--3.15.5/4475_emutramp_default_on.patch (renamed from 3.15.4/4475_emutramp_default_on.patch)0
-rw-r--r--3.2.60/0000_README2
-rw-r--r--3.2.60/4420_grsecurity-3.0-3.2.60-201407100031.patch (renamed from 3.2.60/4420_grsecurity-3.0-3.2.60-201407081916.patch)64
24 files changed, 351 insertions, 300 deletions
diff --git a/3.14.11/0000_README b/3.14.12/0000_README
index b3b205b..f71dcad 100644
--- a/3.14.11/0000_README
+++ b/3.14.12/0000_README
@@ -2,7 +2,7 @@ README
-----------------------------------------------------------------------------
Individual Patch Descriptions:
-----------------------------------------------------------------------------
-Patch: 4420_grsecurity-3.0-3.14.11-201407081919.patch
+Patch: 4420_grsecurity-3.0-3.14.12-201407100035.patch
From: http://www.grsecurity.net
Desc: hardened-sources base patch from upstream grsecurity
diff --git a/3.14.11/4420_grsecurity-3.0-3.14.11-201407081919.patch b/3.14.12/4420_grsecurity-3.0-3.14.12-201407100035.patch
index fc0ad0c..3a245d4 100644
--- a/3.14.11/4420_grsecurity-3.0-3.14.11-201407081919.patch
+++ b/3.14.12/4420_grsecurity-3.0-3.14.12-201407100035.patch
@@ -287,7 +287,7 @@ index 7116fda..d8ed6e8 100644
pcd. [PARIDE]
diff --git a/Makefile b/Makefile
-index f1bbec5..d78810b 100644
+index 13d8f32..a7a7b9b 100644
--- a/Makefile
+++ b/Makefile
@@ -244,8 +244,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
@@ -28955,7 +28955,7 @@ index 3927528..fc19971 100644
vcpu->arch.regs_avail = ~((1 << VCPU_REGS_RIP) | (1 << VCPU_REGS_RSP)
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
-index ee0c3b5..773bb94 100644
+index 8fbd1a7..e046eef 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1776,8 +1776,8 @@ static int xen_hvm_config(struct kvm_vcpu *vcpu, u64 data)
@@ -36346,10 +36346,10 @@ index af00795..2bb8105 100644
#define XCHAL_ICACHE_SIZE 32768 /* I-cache size in bytes or 0 */
#define XCHAL_DCACHE_SIZE 32768 /* D-cache size in bytes or 0 */
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
-index 4e491d9..c8e18e4 100644
+index dd0dd2d..e59db49 100644
--- a/block/blk-cgroup.c
+++ b/block/blk-cgroup.c
-@@ -812,7 +812,7 @@ static void blkcg_css_free(struct cgroup_subsys_state *css)
+@@ -809,7 +809,7 @@ static void blkcg_css_free(struct cgroup_subsys_state *css)
static struct cgroup_subsys_state *
blkcg_css_alloc(struct cgroup_subsys_state *parent_css)
{
@@ -36358,7 +36358,7 @@ index 4e491d9..c8e18e4 100644
struct blkcg *blkcg;
if (!parent_css) {
-@@ -826,7 +826,7 @@ blkcg_css_alloc(struct cgroup_subsys_state *parent_css)
+@@ -823,7 +823,7 @@ blkcg_css_alloc(struct cgroup_subsys_state *parent_css)
blkcg->cfq_weight = CFQ_WEIGHT_DEFAULT;
blkcg->cfq_leaf_weight = CFQ_WEIGHT_DEFAULT;
@@ -39664,7 +39664,7 @@ index 18d4091..434be15 100644
}
EXPORT_SYMBOL_GPL(od_unregister_powersave_bias_handler);
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
-index de9ef4a..0b29fc9 100644
+index 6d98c37..a592321 100644
--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -125,10 +125,10 @@ struct pstate_funcs {
@@ -39680,7 +39680,7 @@ index de9ef4a..0b29fc9 100644
struct perf_limits {
int no_turbo;
-@@ -529,7 +529,7 @@ static void intel_pstate_set_pstate(struct cpudata *cpu, int pstate)
+@@ -526,7 +526,7 @@ static void intel_pstate_set_pstate(struct cpudata *cpu, int pstate)
cpu->pstate.current_pstate = pstate;
@@ -39689,7 +39689,7 @@ index de9ef4a..0b29fc9 100644
}
static inline void intel_pstate_pstate_increase(struct cpudata *cpu, int steps)
-@@ -551,12 +551,12 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)
+@@ -548,12 +548,12 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)
{
sprintf(cpu->name, "Intel 2nd generation core");
@@ -39707,7 +39707,7 @@ index de9ef4a..0b29fc9 100644
intel_pstate_set_pstate(cpu, cpu->pstate.min_pstate);
}
-@@ -838,9 +838,9 @@ static int intel_pstate_msrs_not_valid(void)
+@@ -835,9 +835,9 @@ static int intel_pstate_msrs_not_valid(void)
rdmsrl(MSR_IA32_APERF, aperf);
rdmsrl(MSR_IA32_MPERF, mperf);
@@ -39720,7 +39720,7 @@ index de9ef4a..0b29fc9 100644
return -ENODEV;
rdmsrl(MSR_IA32_APERF, tmp);
-@@ -854,7 +854,7 @@ static int intel_pstate_msrs_not_valid(void)
+@@ -851,7 +851,7 @@ static int intel_pstate_msrs_not_valid(void)
return 0;
}
@@ -39729,7 +39729,7 @@ index de9ef4a..0b29fc9 100644
{
pid_params.sample_rate_ms = policy->sample_rate_ms;
pid_params.p_gain_pct = policy->p_gain_pct;
-@@ -866,11 +866,7 @@ static void copy_pid_params(struct pstate_adjust_policy *policy)
+@@ -863,11 +863,7 @@ static void copy_pid_params(struct pstate_adjust_policy *policy)
static void copy_cpu_funcs(struct pstate_funcs *funcs)
{
@@ -42021,10 +42021,10 @@ index 8a8725c2..afed796 100644
marker = list_first_entry(&queue->head,
struct vmw_marker, head);
diff --git a/drivers/gpu/vga/vga_switcheroo.c b/drivers/gpu/vga/vga_switcheroo.c
-index ec0ae2d..dc0780b 100644
+index 6866448..2ad2b34 100644
--- a/drivers/gpu/vga/vga_switcheroo.c
+++ b/drivers/gpu/vga/vga_switcheroo.c
-@@ -643,7 +643,7 @@ static int vga_switcheroo_runtime_resume(struct device *dev)
+@@ -644,7 +644,7 @@ static int vga_switcheroo_runtime_resume(struct device *dev)
/* this version is for the case where the power switch is separate
to the device being powered down. */
@@ -42033,7 +42033,7 @@ index ec0ae2d..dc0780b 100644
{
/* copy over all the bus versions */
if (dev->bus && dev->bus->pm) {
-@@ -688,7 +688,7 @@ static int vga_switcheroo_runtime_resume_hdmi_audio(struct device *dev)
+@@ -689,7 +689,7 @@ static int vga_switcheroo_runtime_resume_hdmi_audio(struct device *dev)
return ret;
}
@@ -44601,7 +44601,7 @@ index 8c53b09..f1fb2b0 100644
void dm_uevent_add(struct mapped_device *md, struct list_head *elist)
diff --git a/drivers/md/md.c b/drivers/md/md.c
-index 8b013f8..93eed41 100644
+index 73aedcb..424968a 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -194,10 +194,10 @@ EXPORT_SYMBOL_GPL(bio_clone_mddev);
@@ -47773,10 +47773,10 @@ index ea7e70c..bc0c45f 100644
data->sku_cap_band_24GHz_enable ? "" : "NOT", "enabled",
data->sku_cap_band_52GHz_enable ? "" : "NOT", "enabled",
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
-index 8d42fd9..d923d65 100644
+index 16be0c0..eb0bc12 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
-@@ -1365,7 +1365,7 @@ static ssize_t iwl_dbgfs_interrupt_write(struct file *file,
+@@ -1371,7 +1371,7 @@ static ssize_t iwl_dbgfs_interrupt_write(struct file *file,
struct isr_statistics *isr_stats = &trans_pcie->isr_stats;
char buf[8];
@@ -47785,7 +47785,7 @@ index 8d42fd9..d923d65 100644
u32 reset_flag;
memset(buf, 0, sizeof(buf));
-@@ -1386,7 +1386,7 @@ static ssize_t iwl_dbgfs_csr_write(struct file *file,
+@@ -1392,7 +1392,7 @@ static ssize_t iwl_dbgfs_csr_write(struct file *file,
{
struct iwl_trans *trans = file->private_data;
char buf[8];
@@ -47847,7 +47847,7 @@ index 5028557..91cf394 100644
tmp = cpu_to_le32(rts_threshold);
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
-index e3b885d..7a7de2f 100644
+index 5d45a1a..6f5f041 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -375,7 +375,7 @@ struct rt2x00_intf {
@@ -51412,7 +51412,7 @@ index 2ebe47b..3205833 100644
dlci->modem_rx = 0;
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
-index e36d1f5..9938e3e 100644
+index 28ac3f3..9019b3b 100644
--- a/drivers/tty/n_tty.c
+++ b/drivers/tty/n_tty.c
@@ -115,7 +115,7 @@ struct n_tty_data {
@@ -51424,7 +51424,7 @@ index e36d1f5..9938e3e 100644
size_t line_start;
/* protected by output lock */
-@@ -2519,6 +2519,7 @@ void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
+@@ -2520,6 +2520,7 @@ void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
{
*ops = tty_ldisc_N_TTY;
ops->owner = NULL;
@@ -51618,7 +51618,7 @@ index a260cde..6b2b5ce 100644
/* This is only available if kgdboc is a built in for early debugging */
static int __init kgdboc_early_init(char *opt)
diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c
-index b5d779c..3622cfe 100644
+index c0f2b3e..7e3f80c 100644
--- a/drivers/tty/serial/msm_serial.c
+++ b/drivers/tty/serial/msm_serial.c
@@ -897,7 +897,7 @@ static struct uart_driver msm_uart_driver = {
@@ -56558,10 +56558,10 @@ index ce25d75..dc09eeb 100644
&data);
if (!inode) {
diff --git a/fs/aio.c b/fs/aio.c
-index 19e7d95..af5756a 100644
+index e609e15..c9fcd97 100644
--- a/fs/aio.c
+++ b/fs/aio.c
-@@ -375,7 +375,7 @@ static int aio_setup_ring(struct kioctx *ctx)
+@@ -380,7 +380,7 @@ static int aio_setup_ring(struct kioctx *ctx)
size += sizeof(struct io_event) * nr_events;
nr_pages = PFN_UP(size);
@@ -59884,52 +59884,10 @@ index 62f024c..a6a1a61 100644
/* locality groups */
diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c
-index 594009f..c30cbe2 100644
+index e6574d7..c30cbe2 100644
--- a/fs/ext4/indirect.c
+++ b/fs/ext4/indirect.c
-@@ -389,7 +389,13 @@ static int ext4_alloc_branch(handle_t *handle, struct inode *inode,
- return 0;
- failed:
- for (; i >= 0; i--) {
-- if (i != indirect_blks && branch[i].bh)
-+ /*
-+ * We want to ext4_forget() only freshly allocated indirect
-+ * blocks. Buffer for new_blocks[i-1] is at branch[i].bh and
-+ * buffer at branch[0].bh is indirect block / inode already
-+ * existing before ext4_alloc_branch() was called.
-+ */
-+ if (i > 0 && i != indirect_blks && branch[i].bh)
- ext4_forget(handle, 1, inode, branch[i].bh,
- branch[i].bh->b_blocknr);
- ext4_free_blocks(handle, inode, NULL, new_blocks[i],
-@@ -1312,16 +1318,24 @@ static int free_hole_blocks(handle_t *handle, struct inode *inode,
- blk = *i_data;
- if (level > 0) {
- ext4_lblk_t first2;
-+ ext4_lblk_t count2;
-+
- bh = sb_bread(inode->i_sb, le32_to_cpu(blk));
- if (!bh) {
- EXT4_ERROR_INODE_BLOCK(inode, le32_to_cpu(blk),
- "Read failure");
- return -EIO;
- }
-- first2 = (first > offset) ? first - offset : 0;
-+ if (first > offset) {
-+ first2 = first - offset;
-+ count2 = count;
-+ } else {
-+ first2 = 0;
-+ count2 = count - (offset - first);
-+ }
- ret = free_hole_blocks(handle, inode, bh,
- (__le32 *)bh->b_data, level - 1,
-- first2, count - offset,
-+ first2, count2,
- inode->i_sb->s_blocksize >> 2);
- if (ret) {
- brelse(bh);
-@@ -1331,8 +1345,8 @@ static int free_hole_blocks(handle_t *handle, struct inode *inode,
+@@ -1345,8 +1345,8 @@ static int free_hole_blocks(handle_t *handle, struct inode *inode,
if (level == 0 ||
(bh && all_zeroes((__le32 *)bh->b_data,
(__le32 *)bh->b_data + addr_per_block))) {
@@ -62817,10 +62775,10 @@ index 15f9d98..082c625 100644
void nfs_fattr_init(struct nfs_fattr *fattr)
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
-index 9a914e8..e89c0ea 100644
+index f23a6ca..730ddcc 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
-@@ -1178,7 +1178,7 @@ struct nfsd4_operation {
+@@ -1169,7 +1169,7 @@ struct nfsd4_operation {
nfsd4op_rsize op_rsize_bop;
stateid_getter op_get_currentstateid;
stateid_setter op_set_currentstateid;
@@ -62830,10 +62788,10 @@ index 9a914e8..e89c0ea 100644
static struct nfsd4_operation nfsd4_ops[];
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
-index bc11bf6..324b058 100644
+index 8657335..cd3e37f 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
-@@ -1531,7 +1531,7 @@ nfsd4_decode_notsupp(struct nfsd4_compoundargs *argp, void *p)
+@@ -1542,7 +1542,7 @@ nfsd4_decode_notsupp(struct nfsd4_compoundargs *argp, void *p)
typedef __be32(*nfsd4_dec)(struct nfsd4_compoundargs *argp, void *);
@@ -64620,10 +64578,10 @@ index d4a3574..b421ce9 100644
seq_putc(m, '\n');
diff --git a/fs/proc/proc_net.c b/fs/proc/proc_net.c
-index 4677bb7..94067cd 100644
+index 4677bb7..dad3045 100644
--- a/fs/proc/proc_net.c
+++ b/fs/proc/proc_net.c
-@@ -23,6 +23,7 @@
+@@ -23,9 +23,27 @@
#include <linux/nsproxy.h>
#include <net/net_namespace.h>
#include <linux/seq_file.h>
@@ -64631,7 +64589,27 @@ index 4677bb7..94067cd 100644
#include "internal.h"
-@@ -36,6 +37,8 @@ static struct net *get_proc_net(const struct inode *inode)
++#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
++static struct seq_operations *ipv6_seq_ops_addr;
++
++void register_ipv6_seq_ops_addr(struct seq_operations *addr)
++{
++ ipv6_seq_ops_addr = addr;
++}
++
++void unregister_ipv6_seq_ops_addr(void)
++{
++ ipv6_seq_ops_addr = NULL;
++}
++
++EXPORT_SYMBOL_GPL(register_ipv6_seq_ops_addr);
++EXPORT_SYMBOL_GPL(unregister_ipv6_seq_ops_addr);
++#endif
++
+ static inline struct net *PDE_NET(struct proc_dir_entry *pde)
+ {
+ return pde->parent->data;
+@@ -36,6 +54,8 @@ static struct net *get_proc_net(const struct inode *inode)
return maybe_get_net(PDE_NET(PDE(inode)));
}
@@ -64640,18 +64618,22 @@ index 4677bb7..94067cd 100644
int seq_open_net(struct inode *ino, struct file *f,
const struct seq_operations *ops, int size)
{
-@@ -44,6 +47,10 @@ int seq_open_net(struct inode *ino, struct file *f,
+@@ -44,6 +64,14 @@ int seq_open_net(struct inode *ino, struct file *f,
BUG_ON(size < sizeof(*p));
+ /* only permit access to /proc/net/dev */
-+ if (ops != &dev_seq_ops && gr_proc_is_restricted())
++ if (
++#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
++ ops != ipv6_seq_ops_addr &&
++#endif
++ ops != &dev_seq_ops && gr_proc_is_restricted())
+ return -EACCES;
+
net = get_proc_net(ino);
if (net == NULL)
return -ENXIO;
-@@ -66,6 +73,9 @@ int single_open_net(struct inode *inode, struct file *file,
+@@ -66,6 +94,9 @@ int single_open_net(struct inode *inode, struct file *file,
int err;
struct net *net;
@@ -85931,7 +85913,7 @@ index 0c9dc86..a891393 100644
s.version = AUDIT_VERSION_LATEST;
s.backlog_wait_time = audit_backlog_wait_time;
diff --git a/kernel/auditsc.c b/kernel/auditsc.c
-index 37e6216..3604797 100644
+index 619b58d..e58d957 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
@@ -1954,7 +1954,7 @@ int auditsc_get_stamp(struct audit_context *ctx,
@@ -90844,7 +90826,7 @@ index c0a58be..784c618 100644
if (!retval) {
if (old_rlim)
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
-index aae21e8..58d8c9a 100644
+index c1b26e1..bc7b50d 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -94,7 +94,6 @@
@@ -90884,7 +90866,7 @@ index aae21e8..58d8c9a 100644
#endif
/* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */
-@@ -182,10 +180,8 @@ static int proc_taint(struct ctl_table *table, int write,
+@@ -181,10 +179,8 @@ static int proc_taint(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos);
#endif
@@ -90895,7 +90877,7 @@ index aae21e8..58d8c9a 100644
static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos);
-@@ -216,6 +212,8 @@ static int sysrq_sysctl_handler(ctl_table *table, int write,
+@@ -215,6 +211,8 @@ static int sysrq_sysctl_handler(ctl_table *table, int write,
#endif
@@ -90904,7 +90886,7 @@ index aae21e8..58d8c9a 100644
static struct ctl_table kern_table[];
static struct ctl_table vm_table[];
static struct ctl_table fs_table[];
-@@ -230,6 +228,20 @@ extern struct ctl_table epoll_table[];
+@@ -229,6 +227,20 @@ extern struct ctl_table epoll_table[];
int sysctl_legacy_va_layout;
#endif
@@ -90925,7 +90907,7 @@ index aae21e8..58d8c9a 100644
/* The default sysctl tables: */
static struct ctl_table sysctl_base_table[] = {
-@@ -278,6 +290,22 @@ static int max_extfrag_threshold = 1000;
+@@ -277,6 +289,22 @@ static int max_extfrag_threshold = 1000;
#endif
static struct ctl_table kern_table[] = {
@@ -90948,7 +90930,7 @@ index aae21e8..58d8c9a 100644
{
.procname = "sched_child_runs_first",
.data = &sysctl_sched_child_runs_first,
-@@ -640,7 +668,7 @@ static struct ctl_table kern_table[] = {
+@@ -639,7 +667,7 @@ static struct ctl_table kern_table[] = {
.data = &modprobe_path,
.maxlen = KMOD_PATH_LEN,
.mode = 0644,
@@ -90957,7 +90939,7 @@ index aae21e8..58d8c9a 100644
},
{
.procname = "modules_disabled",
-@@ -807,16 +835,20 @@ static struct ctl_table kern_table[] = {
+@@ -806,16 +834,20 @@ static struct ctl_table kern_table[] = {
.extra1 = &zero,
.extra2 = &one,
},
@@ -90979,7 +90961,7 @@ index aae21e8..58d8c9a 100644
{
.procname = "ngroups_max",
.data = &ngroups_max,
-@@ -1061,10 +1093,17 @@ static struct ctl_table kern_table[] = {
+@@ -1060,10 +1092,17 @@ static struct ctl_table kern_table[] = {
*/
{
.procname = "perf_event_paranoid",
@@ -91000,7 +90982,7 @@ index aae21e8..58d8c9a 100644
},
{
.procname = "perf_event_mlock_kb",
-@@ -1335,6 +1374,13 @@ static struct ctl_table vm_table[] = {
+@@ -1334,6 +1373,13 @@ static struct ctl_table vm_table[] = {
.proc_handler = proc_dointvec_minmax,
.extra1 = &zero,
},
@@ -91014,7 +90996,7 @@ index aae21e8..58d8c9a 100644
#else
{
.procname = "nr_trim_pages",
-@@ -1799,6 +1845,16 @@ int proc_dostring(struct ctl_table *table, int write,
+@@ -1798,6 +1844,16 @@ int proc_dostring(struct ctl_table *table, int write,
buffer, lenp, ppos);
}
@@ -91031,7 +91013,7 @@ index aae21e8..58d8c9a 100644
static size_t proc_skip_spaces(char **buf)
{
size_t ret;
-@@ -1904,6 +1960,8 @@ static int proc_put_long(void __user **buf, size_t *size, unsigned long val,
+@@ -1903,6 +1959,8 @@ static int proc_put_long(void __user **buf, size_t *size, unsigned long val,
len = strlen(tmp);
if (len > *size)
len = *size;
@@ -91040,7 +91022,7 @@ index aae21e8..58d8c9a 100644
if (copy_to_user(*buf, tmp, len))
return -EFAULT;
*size -= len;
-@@ -2068,7 +2126,7 @@ int proc_dointvec(struct ctl_table *table, int write,
+@@ -2067,7 +2125,7 @@ int proc_dointvec(struct ctl_table *table, int write,
static int proc_taint(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
@@ -91049,7 +91031,7 @@ index aae21e8..58d8c9a 100644
unsigned long tmptaint = get_taint();
int err;
-@@ -2096,7 +2154,6 @@ static int proc_taint(struct ctl_table *table, int write,
+@@ -2095,7 +2153,6 @@ static int proc_taint(struct ctl_table *table, int write,
return err;
}
@@ -91057,7 +91039,7 @@ index aae21e8..58d8c9a 100644
static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
-@@ -2105,7 +2162,6 @@ static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
+@@ -2104,7 +2161,6 @@ static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
return proc_dointvec_minmax(table, write, buffer, lenp, ppos);
}
@@ -91065,7 +91047,7 @@ index aae21e8..58d8c9a 100644
struct do_proc_dointvec_minmax_conv_param {
int *min;
-@@ -2652,6 +2708,12 @@ int proc_dostring(struct ctl_table *table, int write,
+@@ -2651,6 +2707,12 @@ int proc_dostring(struct ctl_table *table, int write,
return -ENOSYS;
}
@@ -91078,7 +91060,7 @@ index aae21e8..58d8c9a 100644
int proc_dointvec(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
-@@ -2708,5 +2770,6 @@ EXPORT_SYMBOL(proc_dointvec_minmax);
+@@ -2707,5 +2769,6 @@ EXPORT_SYMBOL(proc_dointvec_minmax);
EXPORT_SYMBOL(proc_dointvec_userhz_jiffies);
EXPORT_SYMBOL(proc_dointvec_ms_jiffies);
EXPORT_SYMBOL(proc_dostring);
@@ -91674,10 +91656,10 @@ index fc4da2d..f3e800b 100644
*data_page = bpage;
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
-index f0831c22..4b19cb3 100644
+index fd21e60..eb47c25 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
-@@ -3400,7 +3400,7 @@ int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set)
+@@ -3398,7 +3398,7 @@ int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set)
return 0;
}
@@ -92824,7 +92806,7 @@ index b32b70c..e512eb0 100644
set_page_address(page, (void *)vaddr);
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
-index 06a9bc0..cfbba83 100644
+index 30dd626..e0a6729 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -2070,15 +2070,17 @@ static int hugetlb_sysctl_handler_common(bool obey_mempolicy,
@@ -92869,7 +92851,7 @@ index 06a9bc0..cfbba83 100644
if (ret)
goto out;
-@@ -2600,6 +2604,27 @@ static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -2615,6 +2619,27 @@ static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma,
return 1;
}
@@ -92897,7 +92879,7 @@ index 06a9bc0..cfbba83 100644
/*
* Hugetlb_cow() should be called with page lock of the original hugepage held.
* Called with hugetlb_instantiation_mutex held and pte_page locked so we
-@@ -2716,6 +2741,11 @@ retry_avoidcopy:
+@@ -2731,6 +2756,11 @@ retry_avoidcopy:
make_huge_pte(vma, new_page, 1));
page_remove_rmap(old_page);
hugepage_add_new_anon_rmap(new_page, vma, address);
@@ -92909,7 +92891,7 @@ index 06a9bc0..cfbba83 100644
/* Make the old page be freed below */
new_page = old_page;
}
-@@ -2880,6 +2910,10 @@ retry:
+@@ -2895,6 +2925,10 @@ retry:
&& (vma->vm_flags & VM_SHARED)));
set_huge_pte_at(mm, address, ptep, new_pte);
@@ -92920,7 +92902,7 @@ index 06a9bc0..cfbba83 100644
if ((flags & FAULT_FLAG_WRITE) && !(vma->vm_flags & VM_SHARED)) {
/* Optimization, do the COW without a second fault */
ret = hugetlb_cow(mm, vma, address, ptep, new_pte, page, ptl);
-@@ -2910,6 +2944,10 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -2925,6 +2959,10 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
static DEFINE_MUTEX(hugetlb_instantiation_mutex);
struct hstate *h = hstate_vma(vma);
@@ -92931,7 +92913,7 @@ index 06a9bc0..cfbba83 100644
address &= huge_page_mask(h);
ptep = huge_pte_offset(mm, address);
-@@ -2923,6 +2961,26 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -2938,6 +2976,26 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
VM_FAULT_SET_HINDEX(hstate_index(h));
}
@@ -93234,7 +93216,7 @@ index 33365e9..2234ef9 100644
}
unset_migratetype_isolate(page, MIGRATE_MOVABLE);
diff --git a/mm/memory.c b/mm/memory.c
-index 49e930f..90d7ec5 100644
+index 2121d8b8..fa1095a 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -403,6 +403,7 @@ static inline void free_pmd_range(struct mmu_gather *tlb, pud_t *pud,
@@ -93807,7 +93789,7 @@ index 49e930f..90d7ec5 100644
pgd = pgd_offset(mm, address);
pud = pud_alloc(mm, pgd, address);
if (!pud)
-@@ -3839,6 +4080,23 @@ int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
+@@ -3836,6 +4077,23 @@ int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
spin_unlock(&mm->page_table_lock);
return 0;
}
@@ -93831,7 +93813,7 @@ index 49e930f..90d7ec5 100644
#endif /* __PAGETABLE_PUD_FOLDED */
#ifndef __PAGETABLE_PMD_FOLDED
-@@ -3869,6 +4127,30 @@ int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
+@@ -3866,6 +4124,30 @@ int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
spin_unlock(&mm->page_table_lock);
return 0;
}
@@ -93862,7 +93844,7 @@ index 49e930f..90d7ec5 100644
#endif /* __PAGETABLE_PMD_FOLDED */
#if !defined(__HAVE_ARCH_GATE_AREA)
-@@ -3882,7 +4164,7 @@ static int __init gate_vma_init(void)
+@@ -3879,7 +4161,7 @@ static int __init gate_vma_init(void)
gate_vma.vm_start = FIXADDR_USER_START;
gate_vma.vm_end = FIXADDR_USER_END;
gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC;
@@ -93871,7 +93853,7 @@ index 49e930f..90d7ec5 100644
return 0;
}
-@@ -4016,8 +4298,8 @@ out:
+@@ -4013,8 +4295,8 @@ out:
return ret;
}
@@ -93882,7 +93864,7 @@ index 49e930f..90d7ec5 100644
{
resource_size_t phys_addr;
unsigned long prot = 0;
-@@ -4043,8 +4325,8 @@ EXPORT_SYMBOL_GPL(generic_access_phys);
+@@ -4040,8 +4322,8 @@ EXPORT_SYMBOL_GPL(generic_access_phys);
* Access another process' address space as given in mm. If non-NULL, use the
* given task for page fault accounting.
*/
@@ -93893,7 +93875,7 @@ index 49e930f..90d7ec5 100644
{
struct vm_area_struct *vma;
void *old_buf = buf;
-@@ -4052,7 +4334,7 @@ static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
+@@ -4049,7 +4331,7 @@ static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
down_read(&mm->mmap_sem);
/* ignore errors, just check how much was successfully transferred */
while (len) {
@@ -93902,7 +93884,7 @@ index 49e930f..90d7ec5 100644
void *maddr;
struct page *page = NULL;
-@@ -4111,8 +4393,8 @@ static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
+@@ -4108,8 +4390,8 @@ static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
*
* The caller must hold a reference on @mm.
*/
@@ -93913,7 +93895,7 @@ index 49e930f..90d7ec5 100644
{
return __access_remote_vm(NULL, mm, addr, buf, len, write);
}
-@@ -4122,11 +4404,11 @@ int access_remote_vm(struct mm_struct *mm, unsigned long addr,
+@@ -4119,11 +4401,11 @@ int access_remote_vm(struct mm_struct *mm, unsigned long addr,
* Source/target buffer must be kernel space,
* Do not walk the page table directly, use get_user_pages
*/
@@ -93929,10 +93911,10 @@ index 49e930f..90d7ec5 100644
mm = get_task_mm(tsk);
if (!mm)
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
-index 56224d9..a74c77e 100644
+index 9c6288a..b0ea97e 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
-@@ -750,6 +750,10 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
+@@ -747,6 +747,10 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
unsigned long vmstart;
unsigned long vmend;
@@ -93943,7 +93925,7 @@ index 56224d9..a74c77e 100644
vma = find_vma(mm, start);
if (!vma || vma->vm_start > start)
return -EFAULT;
-@@ -793,6 +797,16 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
+@@ -790,6 +794,16 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
err = vma_replace_policy(vma, new_pol);
if (err)
goto out;
@@ -93960,7 +93942,7 @@ index 56224d9..a74c77e 100644
}
out:
-@@ -1256,6 +1270,17 @@ static long do_mbind(unsigned long start, unsigned long len,
+@@ -1253,6 +1267,17 @@ static long do_mbind(unsigned long start, unsigned long len,
if (end < start)
return -EINVAL;
@@ -93978,7 +93960,7 @@ index 56224d9..a74c77e 100644
if (end == start)
return 0;
-@@ -1484,8 +1509,7 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode,
+@@ -1478,8 +1503,7 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode,
*/
tcred = __task_cred(task);
if (!uid_eq(cred->euid, tcred->suid) && !uid_eq(cred->euid, tcred->uid) &&
@@ -93988,7 +93970,7 @@ index 56224d9..a74c77e 100644
rcu_read_unlock();
err = -EPERM;
goto out_put;
-@@ -1516,6 +1540,15 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode,
+@@ -1510,6 +1534,15 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode,
goto out;
}
@@ -95760,7 +95742,7 @@ index d013dba..d5ae30d 100644
unsigned long bg_thresh,
unsigned long dirty,
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
-index 4b5d4f6..56dfb0a 100644
+index 7e7f947..254d009 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -61,6 +61,7 @@
@@ -95771,7 +95753,7 @@ index 4b5d4f6..56dfb0a 100644
#include <asm/sections.h>
#include <asm/tlbflush.h>
-@@ -354,7 +355,7 @@ out:
+@@ -355,7 +356,7 @@ out:
* This usage means that zero-order pages may not be compound.
*/
@@ -95780,7 +95762,7 @@ index 4b5d4f6..56dfb0a 100644
{
__free_pages_ok(page, compound_order(page));
}
-@@ -728,6 +729,10 @@ static bool free_pages_prepare(struct page *page, unsigned int order)
+@@ -729,6 +730,10 @@ static bool free_pages_prepare(struct page *page, unsigned int order)
int i;
int bad = 0;
@@ -95791,7 +95773,7 @@ index 4b5d4f6..56dfb0a 100644
trace_mm_page_free(page, order);
kmemcheck_free_shadow(page, order);
-@@ -744,6 +749,12 @@ static bool free_pages_prepare(struct page *page, unsigned int order)
+@@ -745,6 +750,12 @@ static bool free_pages_prepare(struct page *page, unsigned int order)
debug_check_no_obj_freed(page_address(page),
PAGE_SIZE << order);
}
@@ -95804,7 +95786,7 @@ index 4b5d4f6..56dfb0a 100644
arch_free_page(page, order);
kernel_map_pages(page, 1 << order, 0);
-@@ -766,6 +777,20 @@ static void __free_pages_ok(struct page *page, unsigned int order)
+@@ -767,6 +778,20 @@ static void __free_pages_ok(struct page *page, unsigned int order)
local_irq_restore(flags);
}
@@ -95825,7 +95807,7 @@ index 4b5d4f6..56dfb0a 100644
void __init __free_pages_bootmem(struct page *page, unsigned int order)
{
unsigned int nr_pages = 1 << order;
-@@ -781,6 +806,19 @@ void __init __free_pages_bootmem(struct page *page, unsigned int order)
+@@ -782,6 +807,19 @@ void __init __free_pages_bootmem(struct page *page, unsigned int order)
__ClearPageReserved(p);
set_page_count(p, 0);
@@ -95845,7 +95827,7 @@ index 4b5d4f6..56dfb0a 100644
page_zone(page)->managed_pages += nr_pages;
set_page_refcounted(page);
__free_pages(page, order);
-@@ -897,8 +935,10 @@ static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
+@@ -910,8 +948,10 @@ static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
arch_alloc_page(page, order);
kernel_map_pages(page, 1 << order, 1);
@@ -95856,7 +95838,7 @@ index 4b5d4f6..56dfb0a 100644
if (order && (gfp_flags & __GFP_COMP))
prep_compound_page(page, order);
-@@ -2401,7 +2441,7 @@ static void reset_alloc_batches(struct zonelist *zonelist,
+@@ -2414,7 +2454,7 @@ static void reset_alloc_batches(struct zonelist *zonelist,
continue;
mod_zone_page_state(zone, NR_ALLOC_BATCH,
high_wmark_pages(zone) - low_wmark_pages(zone) -
@@ -95865,7 +95847,7 @@ index 4b5d4f6..56dfb0a 100644
}
}
-@@ -6577,4 +6617,4 @@ void dump_page(struct page *page, char *reason)
+@@ -6605,4 +6645,4 @@ void dump_page(struct page *page, char *reason)
{
dump_page_badflags(page, reason, 0);
}
@@ -96203,7 +96185,7 @@ index 1f18c9d..b550bab 100644
return -ENOMEM;
diff --git a/mm/slab.c b/mm/slab.c
-index b264214..83872cd 100644
+index 6dd8d5f..2482a6d 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -300,10 +300,12 @@ static void kmem_cache_node_init(struct kmem_cache_node *parent)
@@ -96232,7 +96214,7 @@ index b264214..83872cd 100644
#endif
#if DEBUG
-@@ -403,7 +407,7 @@ static inline void *index_to_obj(struct kmem_cache *cache, struct page *page,
+@@ -436,7 +440,7 @@ static inline void *index_to_obj(struct kmem_cache *cache, struct page *page,
* reciprocal_divide(offset, cache->reciprocal_buffer_size)
*/
static inline unsigned int obj_to_index(const struct kmem_cache *cache,
@@ -96241,7 +96223,7 @@ index b264214..83872cd 100644
{
u32 offset = (obj - page->s_mem);
return reciprocal_divide(offset, cache->reciprocal_buffer_size);
-@@ -1489,12 +1493,12 @@ void __init kmem_cache_init(void)
+@@ -1536,12 +1540,12 @@ void __init kmem_cache_init(void)
*/
kmalloc_caches[INDEX_AC] = create_kmalloc_cache("kmalloc-ac",
@@ -96256,7 +96238,7 @@ index b264214..83872cd 100644
slab_early_init = 0;
-@@ -3428,6 +3432,21 @@ static inline void __cache_free(struct kmem_cache *cachep, void *objp,
+@@ -3484,6 +3488,21 @@ static inline void __cache_free(struct kmem_cache *cachep, void *objp,
struct array_cache *ac = cpu_cache_get(cachep);
check_irq_off();
@@ -96278,7 +96260,7 @@ index b264214..83872cd 100644
kmemleak_free_recursive(objp, cachep->flags);
objp = cache_free_debugcheck(cachep, objp, caller);
-@@ -3656,6 +3675,7 @@ void kfree(const void *objp)
+@@ -3712,6 +3731,7 @@ void kfree(const void *objp)
if (unlikely(ZERO_OR_NULL_PTR(objp)))
return;
@@ -96286,7 +96268,7 @@ index b264214..83872cd 100644
local_irq_save(flags);
kfree_debugcheck(objp);
c = virt_to_cache(objp);
-@@ -4097,14 +4117,22 @@ void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *cachep)
+@@ -4153,14 +4173,22 @@ void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *cachep)
}
/* cpu stats */
{
@@ -96313,7 +96295,7 @@ index b264214..83872cd 100644
#endif
}
-@@ -4334,13 +4362,69 @@ static const struct file_operations proc_slabstats_operations = {
+@@ -4381,13 +4409,69 @@ static const struct file_operations proc_slabstats_operations = {
static int __init slab_proc_init(void)
{
#ifdef CONFIG_DEBUG_SLAB_LEAK
@@ -98136,7 +98118,7 @@ index 6afa3b4..7a14180 100644
if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
rfc.mode != chan->mode)
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
-index d4b7702..7122922 100644
+index 27ae841..e5a8343 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -625,7 +625,8 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
@@ -98177,7 +98159,7 @@ index d4b7702..7122922 100644
if (copy_from_user((char *) &sec, optval, len)) {
err = -EFAULT;
break;
-@@ -857,7 +859,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
+@@ -852,7 +854,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
@@ -100579,7 +100561,7 @@ index e1a6393..f634ce5 100644
return -ENOMEM;
}
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
-index 6c7fa08..285086c 100644
+index 6c7fa08..8a31430 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -598,7 +598,7 @@ static int inet6_netconf_dump_devconf(struct sk_buff *skb,
@@ -100600,7 +100582,32 @@ index 6c7fa08..285086c 100644
if (ops->ndo_do_ioctl) {
mm_segment_t oldfs = get_fs();
-@@ -4146,7 +4146,7 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
+@@ -3528,16 +3528,23 @@ static const struct file_operations if6_fops = {
+ .release = seq_release_net,
+ };
+
++extern void register_ipv6_seq_ops_addr(struct seq_operations *addr);
++extern void unregister_ipv6_seq_ops_addr(void);
++
+ static int __net_init if6_proc_net_init(struct net *net)
+ {
+- if (!proc_create("if_inet6", S_IRUGO, net->proc_net, &if6_fops))
++ register_ipv6_seq_ops_addr(&if6_seq_ops);
++ if (!proc_create("if_inet6", S_IRUGO, net->proc_net, &if6_fops)) {
++ unregister_ipv6_seq_ops_addr();
+ return -ENOMEM;
++ }
+ return 0;
+ }
+
+ static void __net_exit if6_proc_net_exit(struct net *net)
+ {
+ remove_proc_entry("if_inet6", net->proc_net);
++ unregister_ipv6_seq_ops_addr();
+ }
+
+ static struct pernet_operations if6_proc_net_ops = {
+@@ -4146,7 +4153,7 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
s_ip_idx = ip_idx = cb->args[2];
rcu_read_lock();
@@ -100609,7 +100616,7 @@ index 6c7fa08..285086c 100644
for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
idx = 0;
head = &net->dev_index_head[h];
-@@ -4758,7 +4758,7 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
+@@ -4758,7 +4765,7 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
dst_free(&ifp->rt->dst);
break;
}
@@ -100618,7 +100625,7 @@ index 6c7fa08..285086c 100644
rt_genid_bump_ipv6(net);
}
-@@ -4779,7 +4779,7 @@ int addrconf_sysctl_forward(struct ctl_table *ctl, int write,
+@@ -4779,7 +4786,7 @@ int addrconf_sysctl_forward(struct ctl_table *ctl, int write,
int *valp = ctl->data;
int val = *valp;
loff_t pos = *ppos;
@@ -100627,7 +100634,7 @@ index 6c7fa08..285086c 100644
int ret;
/*
-@@ -4864,7 +4864,7 @@ int addrconf_sysctl_disable(struct ctl_table *ctl, int write,
+@@ -4864,7 +4871,7 @@ int addrconf_sysctl_disable(struct ctl_table *ctl, int write,
int *valp = ctl->data;
int val = *valp;
loff_t pos = *ppos;
diff --git a/3.14.11/4425_grsec_remove_EI_PAX.patch b/3.14.12/4425_grsec_remove_EI_PAX.patch
index fc51f79..fc51f79 100644
--- a/3.14.11/4425_grsec_remove_EI_PAX.patch
+++ b/3.14.12/4425_grsec_remove_EI_PAX.patch
diff --git a/3.14.11/4427_force_XATTR_PAX_tmpfs.patch b/3.14.12/4427_force_XATTR_PAX_tmpfs.patch
index 3db2112..3db2112 100644
--- a/3.14.11/4427_force_XATTR_PAX_tmpfs.patch
+++ b/3.14.12/4427_force_XATTR_PAX_tmpfs.patch
diff --git a/3.14.11/4430_grsec-remove-localversion-grsec.patch b/3.14.12/4430_grsec-remove-localversion-grsec.patch
index 31cf878..31cf878 100644
--- a/3.14.11/4430_grsec-remove-localversion-grsec.patch
+++ b/3.14.12/4430_grsec-remove-localversion-grsec.patch
diff --git a/3.14.11/4435_grsec-mute-warnings.patch b/3.14.12/4435_grsec-mute-warnings.patch
index 392cefb..392cefb 100644
--- a/3.14.11/4435_grsec-mute-warnings.patch
+++ b/3.14.12/4435_grsec-mute-warnings.patch
diff --git a/3.14.11/4440_grsec-remove-protected-paths.patch b/3.14.12/4440_grsec-remove-protected-paths.patch
index 741546d..741546d 100644
--- a/3.14.11/4440_grsec-remove-protected-paths.patch
+++ b/3.14.12/4440_grsec-remove-protected-paths.patch
diff --git a/3.14.11/4450_grsec-kconfig-default-gids.patch b/3.14.12/4450_grsec-kconfig-default-gids.patch
index af218a8..af218a8 100644
--- a/3.14.11/4450_grsec-kconfig-default-gids.patch
+++ b/3.14.12/4450_grsec-kconfig-default-gids.patch
diff --git a/3.14.11/4465_selinux-avc_audit-log-curr_ip.patch b/3.14.12/4465_selinux-avc_audit-log-curr_ip.patch
index fb528d0..fb528d0 100644
--- a/3.14.11/4465_selinux-avc_audit-log-curr_ip.patch
+++ b/3.14.12/4465_selinux-avc_audit-log-curr_ip.patch
diff --git a/3.14.11/4470_disable-compat_vdso.patch b/3.14.12/4470_disable-compat_vdso.patch
index 677174c..677174c 100644
--- a/3.14.11/4470_disable-compat_vdso.patch
+++ b/3.14.12/4470_disable-compat_vdso.patch
diff --git a/3.14.11/4475_emutramp_default_on.patch b/3.14.12/4475_emutramp_default_on.patch
index 015c7c1..015c7c1 100644
--- a/3.14.11/4475_emutramp_default_on.patch
+++ b/3.14.12/4475_emutramp_default_on.patch
diff --git a/3.15.4/0000_README b/3.15.5/0000_README
index a26acbb..a26acbb 100644
--- a/3.15.4/0000_README
+++ b/3.15.5/0000_README
diff --git a/3.15.4/4420_grsecurity-3.0-3.15.4-201407081937.patch b/3.15.5/4420_grsecurity-3.0-3.15.5-201407100036.patch
index fbbdd34..9936204 100644
--- a/3.15.4/4420_grsecurity-3.0-3.15.4-201407081937.patch
+++ b/3.15.5/4420_grsecurity-3.0-3.15.5-201407100036.patch
@@ -287,7 +287,7 @@ index 30a8ad0d..2ed9efd 100644
pcd. [PARIDE]
diff --git a/Makefile b/Makefile
-index 25ecc1d..184bee9 100644
+index e6b01ed..74dbc85 100644
--- a/Makefile
+++ b/Makefile
@@ -246,7 +246,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
@@ -28481,7 +28481,7 @@ index 138ceff..2e584f0 100644
vcpu->arch.regs_avail = ~((1 << VCPU_REGS_RIP) | (1 << VCPU_REGS_RSP)
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
-index 20316c6..9b3dddc 100644
+index 5521f7c..691b7a3 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1822,8 +1822,8 @@ static int xen_hvm_config(struct kvm_vcpu *vcpu, u64 data)
@@ -35859,10 +35859,10 @@ index af00795..2bb8105 100644
#define XCHAL_ICACHE_SIZE 32768 /* I-cache size in bytes or 0 */
#define XCHAL_DCACHE_SIZE 32768 /* D-cache size in bytes or 0 */
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
-index 1039fb9..d7c0d9a 100644
+index 95ee425..c9c7237 100644
--- a/block/blk-cgroup.c
+++ b/block/blk-cgroup.c
-@@ -825,7 +825,7 @@ static void blkcg_css_free(struct cgroup_subsys_state *css)
+@@ -822,7 +822,7 @@ static void blkcg_css_free(struct cgroup_subsys_state *css)
static struct cgroup_subsys_state *
blkcg_css_alloc(struct cgroup_subsys_state *parent_css)
{
@@ -35871,7 +35871,7 @@ index 1039fb9..d7c0d9a 100644
struct blkcg *blkcg;
if (!parent_css) {
-@@ -839,7 +839,7 @@ blkcg_css_alloc(struct cgroup_subsys_state *parent_css)
+@@ -836,7 +836,7 @@ blkcg_css_alloc(struct cgroup_subsys_state *parent_css)
blkcg->cfq_weight = CFQ_WEIGHT_DEFAULT;
blkcg->cfq_leaf_weight = CFQ_WEIGHT_DEFAULT;
@@ -39194,7 +39194,7 @@ index 18d4091..434be15 100644
}
EXPORT_SYMBOL_GPL(od_unregister_powersave_bias_handler);
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
-index db2e45b..72c7d37 100644
+index fcd0c92..7b736c2 100644
--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -125,10 +125,10 @@ struct pstate_funcs {
@@ -39210,7 +39210,7 @@ index db2e45b..72c7d37 100644
struct perf_limits {
int no_turbo;
-@@ -529,7 +529,7 @@ static void intel_pstate_set_pstate(struct cpudata *cpu, int pstate)
+@@ -526,7 +526,7 @@ static void intel_pstate_set_pstate(struct cpudata *cpu, int pstate)
cpu->pstate.current_pstate = pstate;
@@ -39219,7 +39219,7 @@ index db2e45b..72c7d37 100644
}
static inline void intel_pstate_pstate_increase(struct cpudata *cpu, int steps)
-@@ -551,12 +551,12 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)
+@@ -548,12 +548,12 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)
{
sprintf(cpu->name, "Intel 2nd generation core");
@@ -39237,7 +39237,7 @@ index db2e45b..72c7d37 100644
intel_pstate_set_pstate(cpu, cpu->pstate.min_pstate);
}
-@@ -841,9 +841,9 @@ static int intel_pstate_msrs_not_valid(void)
+@@ -838,9 +838,9 @@ static int intel_pstate_msrs_not_valid(void)
rdmsrl(MSR_IA32_APERF, aperf);
rdmsrl(MSR_IA32_MPERF, mperf);
@@ -39250,7 +39250,7 @@ index db2e45b..72c7d37 100644
return -ENODEV;
rdmsrl(MSR_IA32_APERF, tmp);
-@@ -857,7 +857,7 @@ static int intel_pstate_msrs_not_valid(void)
+@@ -854,7 +854,7 @@ static int intel_pstate_msrs_not_valid(void)
return 0;
}
@@ -39259,7 +39259,7 @@ index db2e45b..72c7d37 100644
{
pid_params.sample_rate_ms = policy->sample_rate_ms;
pid_params.p_gain_pct = policy->p_gain_pct;
-@@ -869,11 +869,7 @@ static void copy_pid_params(struct pstate_adjust_policy *policy)
+@@ -866,11 +866,7 @@ static void copy_pid_params(struct pstate_adjust_policy *policy)
static void copy_cpu_funcs(struct pstate_funcs *funcs)
{
@@ -39984,7 +39984,7 @@ index d8b7099..8a314a5 100644
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
old mode 100644
new mode 100755
-index 03711d0..9960928a
+index 8218078..9960928a
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -233,7 +233,7 @@ module_exit(drm_core_exit);
@@ -40005,17 +40005,6 @@ index 03711d0..9960928a
unsigned int nr = DRM_IOCTL_NR(cmd);
int retcode = -EINVAL;
char stack_kdata[128];
-@@ -419,8 +419,9 @@ long drm_ioctl(struct file *filp,
- retcode = -EFAULT;
- goto err_i1;
- }
-- } else
-+ } else if (cmd & IOC_OUT) {
- memset(kdata, 0, usize);
-+ }
-
- if (ioctl->flags & DRM_UNLOCKED)
- retcode = func(dev, kdata, file_priv);
diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c
index e1eba0b..98f69f9 100644
--- a/drivers/gpu/drm/drm_fops.c
@@ -41424,10 +41413,10 @@ index 8a8725c2..afed796 100644
marker = list_first_entry(&queue->head,
struct vmw_marker, head);
diff --git a/drivers/gpu/vga/vga_switcheroo.c b/drivers/gpu/vga/vga_switcheroo.c
-index ec0ae2d..dc0780b 100644
+index 6866448..2ad2b34 100644
--- a/drivers/gpu/vga/vga_switcheroo.c
+++ b/drivers/gpu/vga/vga_switcheroo.c
-@@ -643,7 +643,7 @@ static int vga_switcheroo_runtime_resume(struct device *dev)
+@@ -644,7 +644,7 @@ static int vga_switcheroo_runtime_resume(struct device *dev)
/* this version is for the case where the power switch is separate
to the device being powered down. */
@@ -41436,7 +41425,7 @@ index ec0ae2d..dc0780b 100644
{
/* copy over all the bus versions */
if (dev->bus && dev->bus->pm) {
-@@ -688,7 +688,7 @@ static int vga_switcheroo_runtime_resume_hdmi_audio(struct device *dev)
+@@ -689,7 +689,7 @@ static int vga_switcheroo_runtime_resume_hdmi_audio(struct device *dev)
return ret;
}
@@ -43937,7 +43926,7 @@ index 455e649..1f214be 100644
void dm_uevent_add(struct mapped_device *md, struct list_head *elist)
diff --git a/drivers/md/md.c b/drivers/md/md.c
-index 2382cfc..0d7e551 100644
+index 9a18209..ec4d3ec 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -194,10 +194,10 @@ EXPORT_SYMBOL_GPL(bio_clone_mddev);
@@ -47138,10 +47127,10 @@ index 6a6df71..eb5c93a 100644
data->sku_cap_band_24GHz_enable ? "" : "NOT", "enabled",
data->sku_cap_band_52GHz_enable ? "" : "NOT", "enabled",
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
-index 2365553..97126d8 100644
+index 295b24c..cb4f823 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
-@@ -1552,7 +1552,7 @@ static ssize_t iwl_dbgfs_interrupt_write(struct file *file,
+@@ -1558,7 +1558,7 @@ static ssize_t iwl_dbgfs_interrupt_write(struct file *file,
struct isr_statistics *isr_stats = &trans_pcie->isr_stats;
char buf[8];
@@ -47150,7 +47139,7 @@ index 2365553..97126d8 100644
u32 reset_flag;
memset(buf, 0, sizeof(buf));
-@@ -1573,7 +1573,7 @@ static ssize_t iwl_dbgfs_csr_write(struct file *file,
+@@ -1579,7 +1579,7 @@ static ssize_t iwl_dbgfs_csr_write(struct file *file,
{
struct iwl_trans *trans = file->private_data;
char buf[8];
@@ -47212,7 +47201,7 @@ index 39d22a1..4ec8612 100644
tmp = cpu_to_le32(rts_threshold);
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
-index e3b885d..7a7de2f 100644
+index 5d45a1a..6f5f041 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -375,7 +375,7 @@ struct rt2x00_intf {
@@ -49681,10 +49670,10 @@ index 13e8983..d306a68 100644
transport_setup_device(&rport->dev);
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
-index efcbcd1..aeaf26e 100644
+index bffbd4b..cb1b68a 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
-@@ -2968,7 +2968,7 @@ static int sd_probe(struct device *dev)
+@@ -2971,7 +2971,7 @@ static int sd_probe(struct device *dev)
sdkp->disk = gd;
sdkp->index = index;
atomic_set(&sdkp->openers, 0);
@@ -50796,7 +50785,7 @@ index 2ebe47b..3205833 100644
dlci->modem_rx = 0;
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
-index fe9d129..477300f 100644
+index 0391f17..31fa586 100644
--- a/drivers/tty/n_tty.c
+++ b/drivers/tty/n_tty.c
@@ -115,7 +115,7 @@ struct n_tty_data {
@@ -50808,7 +50797,7 @@ index fe9d129..477300f 100644
size_t line_start;
/* protected by output lock */
-@@ -2516,6 +2516,7 @@ void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
+@@ -2517,6 +2517,7 @@ void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
{
*ops = tty_ldisc_N_TTY;
ops->owner = NULL;
@@ -51002,7 +50991,7 @@ index a260cde..6b2b5ce 100644
/* This is only available if kgdboc is a built in for early debugging */
static int __init kgdboc_early_init(char *opt)
diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c
-index 053b98e..86742e5 100644
+index 7307dc4..ce4fe90 100644
--- a/drivers/tty/serial/msm_serial.c
+++ b/drivers/tty/serial/msm_serial.c
@@ -1026,7 +1026,7 @@ static struct uart_driver msm_uart_driver = {
@@ -59304,52 +59293,10 @@ index f542e48..c0275f5 100644
/* locality groups */
diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c
-index 594009f..c30cbe2 100644
+index e6574d7..c30cbe2 100644
--- a/fs/ext4/indirect.c
+++ b/fs/ext4/indirect.c
-@@ -389,7 +389,13 @@ static int ext4_alloc_branch(handle_t *handle, struct inode *inode,
- return 0;
- failed:
- for (; i >= 0; i--) {
-- if (i != indirect_blks && branch[i].bh)
-+ /*
-+ * We want to ext4_forget() only freshly allocated indirect
-+ * blocks. Buffer for new_blocks[i-1] is at branch[i].bh and
-+ * buffer at branch[0].bh is indirect block / inode already
-+ * existing before ext4_alloc_branch() was called.
-+ */
-+ if (i > 0 && i != indirect_blks && branch[i].bh)
- ext4_forget(handle, 1, inode, branch[i].bh,
- branch[i].bh->b_blocknr);
- ext4_free_blocks(handle, inode, NULL, new_blocks[i],
-@@ -1312,16 +1318,24 @@ static int free_hole_blocks(handle_t *handle, struct inode *inode,
- blk = *i_data;
- if (level > 0) {
- ext4_lblk_t first2;
-+ ext4_lblk_t count2;
-+
- bh = sb_bread(inode->i_sb, le32_to_cpu(blk));
- if (!bh) {
- EXT4_ERROR_INODE_BLOCK(inode, le32_to_cpu(blk),
- "Read failure");
- return -EIO;
- }
-- first2 = (first > offset) ? first - offset : 0;
-+ if (first > offset) {
-+ first2 = first - offset;
-+ count2 = count;
-+ } else {
-+ first2 = 0;
-+ count2 = count - (offset - first);
-+ }
- ret = free_hole_blocks(handle, inode, bh,
- (__le32 *)bh->b_data, level - 1,
-- first2, count - offset,
-+ first2, count2,
- inode->i_sb->s_blocksize >> 2);
- if (ret) {
- brelse(bh);
-@@ -1331,8 +1345,8 @@ static int free_hole_blocks(handle_t *handle, struct inode *inode,
+@@ -1345,8 +1345,8 @@ static int free_hole_blocks(handle_t *handle, struct inode *inode,
if (level == 0 ||
(bh && all_zeroes((__le32 *)bh->b_data,
(__le32 *)bh->b_data + addr_per_block))) {
@@ -62237,10 +62184,10 @@ index c79f3e7..d61d671 100644
void nfs_fattr_init(struct nfs_fattr *fattr)
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
-index d543222..2cfa2a2 100644
+index 95e3720..46c23fa 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
-@@ -1178,7 +1178,7 @@ struct nfsd4_operation {
+@@ -1169,7 +1169,7 @@ struct nfsd4_operation {
nfsd4op_rsize op_rsize_bop;
stateid_getter op_get_currentstateid;
stateid_setter op_set_currentstateid;
@@ -62250,10 +62197,10 @@ index d543222..2cfa2a2 100644
static struct nfsd4_operation nfsd4_ops[];
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
-index b4c4958..04687ad 100644
+index 3297158..7bb8436 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
-@@ -1530,7 +1530,7 @@ nfsd4_decode_notsupp(struct nfsd4_compoundargs *argp, void *p)
+@@ -1541,7 +1541,7 @@ nfsd4_decode_notsupp(struct nfsd4_compoundargs *argp, void *p)
typedef __be32(*nfsd4_dec)(struct nfsd4_compoundargs *argp, void *);
@@ -64021,10 +63968,10 @@ index d4a3574..b421ce9 100644
seq_putc(m, '\n');
diff --git a/fs/proc/proc_net.c b/fs/proc/proc_net.c
-index 4677bb7..94067cd 100644
+index 4677bb7..dad3045 100644
--- a/fs/proc/proc_net.c
+++ b/fs/proc/proc_net.c
-@@ -23,6 +23,7 @@
+@@ -23,9 +23,27 @@
#include <linux/nsproxy.h>
#include <net/net_namespace.h>
#include <linux/seq_file.h>
@@ -64032,7 +63979,27 @@ index 4677bb7..94067cd 100644
#include "internal.h"
-@@ -36,6 +37,8 @@ static struct net *get_proc_net(const struct inode *inode)
++#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
++static struct seq_operations *ipv6_seq_ops_addr;
++
++void register_ipv6_seq_ops_addr(struct seq_operations *addr)
++{
++ ipv6_seq_ops_addr = addr;
++}
++
++void unregister_ipv6_seq_ops_addr(void)
++{
++ ipv6_seq_ops_addr = NULL;
++}
++
++EXPORT_SYMBOL_GPL(register_ipv6_seq_ops_addr);
++EXPORT_SYMBOL_GPL(unregister_ipv6_seq_ops_addr);
++#endif
++
+ static inline struct net *PDE_NET(struct proc_dir_entry *pde)
+ {
+ return pde->parent->data;
+@@ -36,6 +54,8 @@ static struct net *get_proc_net(const struct inode *inode)
return maybe_get_net(PDE_NET(PDE(inode)));
}
@@ -64041,18 +64008,22 @@ index 4677bb7..94067cd 100644
int seq_open_net(struct inode *ino, struct file *f,
const struct seq_operations *ops, int size)
{
-@@ -44,6 +47,10 @@ int seq_open_net(struct inode *ino, struct file *f,
+@@ -44,6 +64,14 @@ int seq_open_net(struct inode *ino, struct file *f,
BUG_ON(size < sizeof(*p));
+ /* only permit access to /proc/net/dev */
-+ if (ops != &dev_seq_ops && gr_proc_is_restricted())
++ if (
++#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
++ ops != ipv6_seq_ops_addr &&
++#endif
++ ops != &dev_seq_ops && gr_proc_is_restricted())
+ return -EACCES;
+
net = get_proc_net(ino);
if (net == NULL)
return -ENXIO;
-@@ -66,6 +73,9 @@ int single_open_net(struct inode *inode, struct file *file,
+@@ -66,6 +94,9 @@ int single_open_net(struct inode *inode, struct file *file,
int err;
struct net *net;
@@ -84061,10 +84032,10 @@ index 52beadf..598734c 100644
u8 qfull;
enum fc_lport_state state;
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
-index 5853c91..1e355a8 100644
+index 27ab310..60dc245 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
-@@ -186,9 +186,9 @@ struct scsi_device {
+@@ -187,9 +187,9 @@ struct scsi_device {
unsigned int max_device_blocked; /* what device_blocked counts down from */
#define SCSI_DEFAULT_DEVICE_BLOCKED 3
@@ -90358,7 +90329,7 @@ index fba0f29..84400e2 100644
if (!retval) {
if (old_rlim)
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
-index 74f5b58..65ba165 100644
+index 0e0373f..69f5181 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -94,7 +94,6 @@
@@ -90399,7 +90370,7 @@ index 74f5b58..65ba165 100644
#endif
/* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */
-@@ -179,10 +179,8 @@ static int proc_taint(struct ctl_table *table, int write,
+@@ -178,10 +178,8 @@ static int proc_taint(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos);
#endif
@@ -90410,7 +90381,7 @@ index 74f5b58..65ba165 100644
static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos);
-@@ -213,6 +211,8 @@ static int sysrq_sysctl_handler(ctl_table *table, int write,
+@@ -212,6 +210,8 @@ static int sysrq_sysctl_handler(ctl_table *table, int write,
#endif
@@ -90419,7 +90390,7 @@ index 74f5b58..65ba165 100644
static struct ctl_table kern_table[];
static struct ctl_table vm_table[];
static struct ctl_table fs_table[];
-@@ -227,6 +227,20 @@ extern struct ctl_table epoll_table[];
+@@ -226,6 +226,20 @@ extern struct ctl_table epoll_table[];
int sysctl_legacy_va_layout;
#endif
@@ -90440,7 +90411,7 @@ index 74f5b58..65ba165 100644
/* The default sysctl tables: */
static struct ctl_table sysctl_base_table[] = {
-@@ -275,6 +289,22 @@ static int max_extfrag_threshold = 1000;
+@@ -274,6 +288,22 @@ static int max_extfrag_threshold = 1000;
#endif
static struct ctl_table kern_table[] = {
@@ -90463,7 +90434,7 @@ index 74f5b58..65ba165 100644
{
.procname = "sched_child_runs_first",
.data = &sysctl_sched_child_runs_first,
-@@ -630,7 +660,7 @@ static struct ctl_table kern_table[] = {
+@@ -629,7 +659,7 @@ static struct ctl_table kern_table[] = {
.data = &modprobe_path,
.maxlen = KMOD_PATH_LEN,
.mode = 0644,
@@ -90472,7 +90443,7 @@ index 74f5b58..65ba165 100644
},
{
.procname = "modules_disabled",
-@@ -797,16 +827,20 @@ static struct ctl_table kern_table[] = {
+@@ -796,16 +826,20 @@ static struct ctl_table kern_table[] = {
.extra1 = &zero,
.extra2 = &one,
},
@@ -90494,7 +90465,7 @@ index 74f5b58..65ba165 100644
{
.procname = "ngroups_max",
.data = &ngroups_max,
-@@ -1051,10 +1085,17 @@ static struct ctl_table kern_table[] = {
+@@ -1050,10 +1084,17 @@ static struct ctl_table kern_table[] = {
*/
{
.procname = "perf_event_paranoid",
@@ -90515,7 +90486,7 @@ index 74f5b58..65ba165 100644
},
{
.procname = "perf_event_mlock_kb",
-@@ -1316,6 +1357,13 @@ static struct ctl_table vm_table[] = {
+@@ -1315,6 +1356,13 @@ static struct ctl_table vm_table[] = {
.proc_handler = proc_dointvec_minmax,
.extra1 = &zero,
},
@@ -90529,7 +90500,7 @@ index 74f5b58..65ba165 100644
#else
{
.procname = "nr_trim_pages",
-@@ -1780,6 +1828,16 @@ int proc_dostring(struct ctl_table *table, int write,
+@@ -1779,6 +1827,16 @@ int proc_dostring(struct ctl_table *table, int write,
buffer, lenp, ppos);
}
@@ -90546,7 +90517,7 @@ index 74f5b58..65ba165 100644
static size_t proc_skip_spaces(char **buf)
{
size_t ret;
-@@ -1885,6 +1943,8 @@ static int proc_put_long(void __user **buf, size_t *size, unsigned long val,
+@@ -1884,6 +1942,8 @@ static int proc_put_long(void __user **buf, size_t *size, unsigned long val,
len = strlen(tmp);
if (len > *size)
len = *size;
@@ -90555,7 +90526,7 @@ index 74f5b58..65ba165 100644
if (copy_to_user(*buf, tmp, len))
return -EFAULT;
*size -= len;
-@@ -2049,7 +2109,7 @@ int proc_dointvec(struct ctl_table *table, int write,
+@@ -2048,7 +2108,7 @@ int proc_dointvec(struct ctl_table *table, int write,
static int proc_taint(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
@@ -90564,7 +90535,7 @@ index 74f5b58..65ba165 100644
unsigned long tmptaint = get_taint();
int err;
-@@ -2077,7 +2137,6 @@ static int proc_taint(struct ctl_table *table, int write,
+@@ -2076,7 +2136,6 @@ static int proc_taint(struct ctl_table *table, int write,
return err;
}
@@ -90572,7 +90543,7 @@ index 74f5b58..65ba165 100644
static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
-@@ -2086,7 +2145,6 @@ static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
+@@ -2085,7 +2144,6 @@ static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
return proc_dointvec_minmax(table, write, buffer, lenp, ppos);
}
@@ -90580,7 +90551,7 @@ index 74f5b58..65ba165 100644
struct do_proc_dointvec_minmax_conv_param {
int *min;
-@@ -2633,6 +2691,12 @@ int proc_dostring(struct ctl_table *table, int write,
+@@ -2632,6 +2690,12 @@ int proc_dostring(struct ctl_table *table, int write,
return -ENOSYS;
}
@@ -90593,7 +90564,7 @@ index 74f5b58..65ba165 100644
int proc_dointvec(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
-@@ -2689,5 +2753,6 @@ EXPORT_SYMBOL(proc_dointvec_minmax);
+@@ -2688,5 +2752,6 @@ EXPORT_SYMBOL(proc_dointvec_minmax);
EXPORT_SYMBOL(proc_dointvec_userhz_jiffies);
EXPORT_SYMBOL(proc_dointvec_ms_jiffies);
EXPORT_SYMBOL(proc_dostring);
@@ -91225,10 +91196,10 @@ index c634868..00d0d19 100644
*data_page = bpage;
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
-index e916972..e87f285 100644
+index 1848dc6..5fc244c 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
-@@ -3449,7 +3449,7 @@ int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set)
+@@ -3447,7 +3447,7 @@ int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set)
return 0;
}
@@ -92303,7 +92274,7 @@ index b32b70c..e512eb0 100644
set_page_address(page, (void *)vaddr);
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
-index c82290b..863d466 100644
+index a646f15..f55da4c 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -2107,6 +2107,7 @@ static int hugetlb_sysctl_handler_common(bool obey_mempolicy,
@@ -92350,7 +92321,7 @@ index c82290b..863d466 100644
if (ret)
goto out;
-@@ -2639,6 +2643,27 @@ static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -2654,6 +2658,27 @@ static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma,
return 1;
}
@@ -92378,7 +92349,7 @@ index c82290b..863d466 100644
/*
* Hugetlb_cow() should be called with page lock of the original hugepage held.
* Called with hugetlb_instantiation_mutex held and pte_page locked so we
-@@ -2756,6 +2781,11 @@ retry_avoidcopy:
+@@ -2771,6 +2796,11 @@ retry_avoidcopy:
make_huge_pte(vma, new_page, 1));
page_remove_rmap(old_page);
hugepage_add_new_anon_rmap(new_page, vma, address);
@@ -92390,7 +92361,7 @@ index c82290b..863d466 100644
/* Make the old page be freed below */
new_page = old_page;
}
-@@ -2915,6 +2945,10 @@ retry:
+@@ -2930,6 +2960,10 @@ retry:
&& (vma->vm_flags & VM_SHARED)));
set_huge_pte_at(mm, address, ptep, new_pte);
@@ -92401,7 +92372,7 @@ index c82290b..863d466 100644
if ((flags & FAULT_FLAG_WRITE) && !(vma->vm_flags & VM_SHARED)) {
/* Optimization, do the COW without a second fault */
ret = hugetlb_cow(mm, vma, address, ptep, new_pte, page, ptl);
-@@ -2981,6 +3015,10 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -2996,6 +3030,10 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
struct hstate *h = hstate_vma(vma);
struct address_space *mapping;
@@ -92412,7 +92383,7 @@ index c82290b..863d466 100644
address &= huge_page_mask(h);
ptep = huge_pte_offset(mm, address);
-@@ -2994,6 +3032,26 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -3009,6 +3047,26 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
VM_FAULT_SET_HINDEX(hstate_index(h));
}
@@ -92755,7 +92726,7 @@ index eb8fb72..ae36cf3 100644
}
unset_migratetype_isolate(page, MIGRATE_MOVABLE);
diff --git a/mm/memory.c b/mm/memory.c
-index 037b812..948123c 100644
+index e302ae1..c0ef712 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -413,6 +413,7 @@ static inline void free_pmd_range(struct mmu_gather *tlb, pud_t *pud,
@@ -93343,7 +93314,7 @@ index 037b812..948123c 100644
pgd = pgd_offset(mm, address);
pud = pud_alloc(mm, pgd, address);
if (!pud)
-@@ -4003,6 +4251,23 @@ int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
+@@ -4000,6 +4248,23 @@ int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
spin_unlock(&mm->page_table_lock);
return 0;
}
@@ -93367,7 +93338,7 @@ index 037b812..948123c 100644
#endif /* __PAGETABLE_PUD_FOLDED */
#ifndef __PAGETABLE_PMD_FOLDED
-@@ -4033,6 +4298,30 @@ int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
+@@ -4030,6 +4295,30 @@ int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
spin_unlock(&mm->page_table_lock);
return 0;
}
@@ -93398,7 +93369,7 @@ index 037b812..948123c 100644
#endif /* __PAGETABLE_PMD_FOLDED */
#if !defined(__HAVE_ARCH_GATE_AREA)
-@@ -4046,7 +4335,7 @@ static int __init gate_vma_init(void)
+@@ -4043,7 +4332,7 @@ static int __init gate_vma_init(void)
gate_vma.vm_start = FIXADDR_USER_START;
gate_vma.vm_end = FIXADDR_USER_END;
gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC;
@@ -93407,7 +93378,7 @@ index 037b812..948123c 100644
return 0;
}
-@@ -4180,8 +4469,8 @@ out:
+@@ -4177,8 +4466,8 @@ out:
return ret;
}
@@ -93418,7 +93389,7 @@ index 037b812..948123c 100644
{
resource_size_t phys_addr;
unsigned long prot = 0;
-@@ -4207,8 +4496,8 @@ EXPORT_SYMBOL_GPL(generic_access_phys);
+@@ -4204,8 +4493,8 @@ EXPORT_SYMBOL_GPL(generic_access_phys);
* Access another process' address space as given in mm. If non-NULL, use the
* given task for page fault accounting.
*/
@@ -93429,7 +93400,7 @@ index 037b812..948123c 100644
{
struct vm_area_struct *vma;
void *old_buf = buf;
-@@ -4216,7 +4505,7 @@ static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
+@@ -4213,7 +4502,7 @@ static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
down_read(&mm->mmap_sem);
/* ignore errors, just check how much was successfully transferred */
while (len) {
@@ -93438,7 +93409,7 @@ index 037b812..948123c 100644
void *maddr;
struct page *page = NULL;
-@@ -4275,8 +4564,8 @@ static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
+@@ -4272,8 +4561,8 @@ static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
*
* The caller must hold a reference on @mm.
*/
@@ -93449,7 +93420,7 @@ index 037b812..948123c 100644
{
return __access_remote_vm(NULL, mm, addr, buf, len, write);
}
-@@ -4286,11 +4575,11 @@ int access_remote_vm(struct mm_struct *mm, unsigned long addr,
+@@ -4283,11 +4572,11 @@ int access_remote_vm(struct mm_struct *mm, unsigned long addr,
* Source/target buffer must be kernel space,
* Do not walk the page table directly, use get_user_pages
*/
@@ -93465,10 +93436,10 @@ index 037b812..948123c 100644
mm = get_task_mm(tsk);
if (!mm)
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
-index 30cc47f8..c12ef34 100644
+index 35f9f91..bed4575 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
-@@ -750,6 +750,10 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
+@@ -747,6 +747,10 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
unsigned long vmstart;
unsigned long vmend;
@@ -93479,7 +93450,7 @@ index 30cc47f8..c12ef34 100644
vma = find_vma(mm, start);
if (!vma || vma->vm_start > start)
return -EFAULT;
-@@ -793,6 +797,16 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
+@@ -790,6 +794,16 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
err = vma_replace_policy(vma, new_pol);
if (err)
goto out;
@@ -93496,7 +93467,7 @@ index 30cc47f8..c12ef34 100644
}
out:
-@@ -1225,6 +1239,17 @@ static long do_mbind(unsigned long start, unsigned long len,
+@@ -1222,6 +1236,17 @@ static long do_mbind(unsigned long start, unsigned long len,
if (end < start)
return -EINVAL;
@@ -93514,7 +93485,7 @@ index 30cc47f8..c12ef34 100644
if (end == start)
return 0;
-@@ -1453,8 +1478,7 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode,
+@@ -1447,8 +1472,7 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode,
*/
tcred = __task_cred(task);
if (!uid_eq(cred->euid, tcred->suid) && !uid_eq(cred->euid, tcred->uid) &&
@@ -93524,7 +93495,7 @@ index 30cc47f8..c12ef34 100644
rcu_read_unlock();
err = -EPERM;
goto out_put;
-@@ -1485,6 +1509,15 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode,
+@@ -1479,6 +1503,15 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode,
goto out;
}
@@ -95216,7 +95187,7 @@ index 05f1180..c3cde48 100644
out:
if (ret & ~PAGE_MASK)
diff --git a/mm/nommu.c b/mm/nommu.c
-index 85f8d66..b3375fa 100644
+index 431fd7c..8674512 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -67,7 +67,6 @@ int sysctl_max_map_count = DEFAULT_MAX_MAP_COUNT;
@@ -95296,7 +95267,7 @@ index 154af21..86e447f 100644
unsigned long bg_thresh,
unsigned long dirty,
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
-index 56eb0eb..bb5e928 100644
+index d64f5f9..9005ab5 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -61,6 +61,7 @@
@@ -95307,7 +95278,7 @@ index 56eb0eb..bb5e928 100644
#include <asm/sections.h>
#include <asm/tlbflush.h>
-@@ -355,7 +356,7 @@ out:
+@@ -356,7 +357,7 @@ out:
* This usage means that zero-order pages may not be compound.
*/
@@ -95316,7 +95287,7 @@ index 56eb0eb..bb5e928 100644
{
__free_pages_ok(page, compound_order(page));
}
-@@ -729,6 +730,10 @@ static bool free_pages_prepare(struct page *page, unsigned int order)
+@@ -730,6 +731,10 @@ static bool free_pages_prepare(struct page *page, unsigned int order)
int i;
int bad = 0;
@@ -95327,7 +95298,7 @@ index 56eb0eb..bb5e928 100644
trace_mm_page_free(page, order);
kmemcheck_free_shadow(page, order);
-@@ -745,6 +750,12 @@ static bool free_pages_prepare(struct page *page, unsigned int order)
+@@ -746,6 +751,12 @@ static bool free_pages_prepare(struct page *page, unsigned int order)
debug_check_no_obj_freed(page_address(page),
PAGE_SIZE << order);
}
@@ -95340,7 +95311,7 @@ index 56eb0eb..bb5e928 100644
arch_free_page(page, order);
kernel_map_pages(page, 1 << order, 0);
-@@ -767,6 +778,20 @@ static void __free_pages_ok(struct page *page, unsigned int order)
+@@ -768,6 +779,20 @@ static void __free_pages_ok(struct page *page, unsigned int order)
local_irq_restore(flags);
}
@@ -95361,7 +95332,7 @@ index 56eb0eb..bb5e928 100644
void __init __free_pages_bootmem(struct page *page, unsigned int order)
{
unsigned int nr_pages = 1 << order;
-@@ -782,6 +807,19 @@ void __init __free_pages_bootmem(struct page *page, unsigned int order)
+@@ -783,6 +808,19 @@ void __init __free_pages_bootmem(struct page *page, unsigned int order)
__ClearPageReserved(p);
set_page_count(p, 0);
@@ -95381,7 +95352,7 @@ index 56eb0eb..bb5e928 100644
page_zone(page)->managed_pages += nr_pages;
set_page_refcounted(page);
__free_pages(page, order);
-@@ -898,8 +936,10 @@ static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
+@@ -911,8 +949,10 @@ static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
arch_alloc_page(page, order);
kernel_map_pages(page, 1 << order, 1);
@@ -95392,7 +95363,7 @@ index 56eb0eb..bb5e928 100644
if (order && (gfp_flags & __GFP_COMP))
prep_compound_page(page, order);
-@@ -2402,7 +2442,7 @@ static void reset_alloc_batches(struct zonelist *zonelist,
+@@ -2415,7 +2455,7 @@ static void reset_alloc_batches(struct zonelist *zonelist,
continue;
mod_zone_page_state(zone, NR_ALLOC_BATCH,
high_wmark_pages(zone) - low_wmark_pages(zone) -
@@ -97668,10 +97639,10 @@ index b9a418e..2af862a 100644
err = -EFAULT;
break;
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
-index dc4d301..4975bac 100644
+index 1c97b7a..9171d69 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
-@@ -3536,8 +3536,10 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
+@@ -3542,8 +3542,10 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
break;
case L2CAP_CONF_RFC:
@@ -97685,7 +97656,7 @@ index dc4d301..4975bac 100644
if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
rfc.mode != chan->mode)
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
-index ade3fb4..df37cb4 100644
+index e137869..33f3ebd 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -628,7 +628,8 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
@@ -97726,7 +97697,7 @@ index ade3fb4..df37cb4 100644
if (copy_from_user((char *) &sec, optval, len)) {
err = -EFAULT;
break;
-@@ -866,7 +868,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
+@@ -861,7 +863,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
@@ -100232,7 +100203,7 @@ index 6156f68..d6ab46d 100644
return -ENOMEM;
}
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
-index 6c7fa08..285086c 100644
+index 6c7fa08..8a31430 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -598,7 +598,7 @@ static int inet6_netconf_dump_devconf(struct sk_buff *skb,
@@ -100253,7 +100224,32 @@ index 6c7fa08..285086c 100644
if (ops->ndo_do_ioctl) {
mm_segment_t oldfs = get_fs();
-@@ -4146,7 +4146,7 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
+@@ -3528,16 +3528,23 @@ static const struct file_operations if6_fops = {
+ .release = seq_release_net,
+ };
+
++extern void register_ipv6_seq_ops_addr(struct seq_operations *addr);
++extern void unregister_ipv6_seq_ops_addr(void);
++
+ static int __net_init if6_proc_net_init(struct net *net)
+ {
+- if (!proc_create("if_inet6", S_IRUGO, net->proc_net, &if6_fops))
++ register_ipv6_seq_ops_addr(&if6_seq_ops);
++ if (!proc_create("if_inet6", S_IRUGO, net->proc_net, &if6_fops)) {
++ unregister_ipv6_seq_ops_addr();
+ return -ENOMEM;
++ }
+ return 0;
+ }
+
+ static void __net_exit if6_proc_net_exit(struct net *net)
+ {
+ remove_proc_entry("if_inet6", net->proc_net);
++ unregister_ipv6_seq_ops_addr();
+ }
+
+ static struct pernet_operations if6_proc_net_ops = {
+@@ -4146,7 +4153,7 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
s_ip_idx = ip_idx = cb->args[2];
rcu_read_lock();
@@ -100262,7 +100258,7 @@ index 6c7fa08..285086c 100644
for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
idx = 0;
head = &net->dev_index_head[h];
-@@ -4758,7 +4758,7 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
+@@ -4758,7 +4765,7 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
dst_free(&ifp->rt->dst);
break;
}
@@ -100271,7 +100267,7 @@ index 6c7fa08..285086c 100644
rt_genid_bump_ipv6(net);
}
-@@ -4779,7 +4779,7 @@ int addrconf_sysctl_forward(struct ctl_table *ctl, int write,
+@@ -4779,7 +4786,7 @@ int addrconf_sysctl_forward(struct ctl_table *ctl, int write,
int *valp = ctl->data;
int val = *valp;
loff_t pos = *ppos;
@@ -100280,7 +100276,7 @@ index 6c7fa08..285086c 100644
int ret;
/*
-@@ -4864,7 +4864,7 @@ int addrconf_sysctl_disable(struct ctl_table *ctl, int write,
+@@ -4864,7 +4871,7 @@ int addrconf_sysctl_disable(struct ctl_table *ctl, int write,
int *valp = ctl->data;
int val = *valp;
loff_t pos = *ppos;
diff --git a/3.15.4/4425_grsec_remove_EI_PAX.patch b/3.15.5/4425_grsec_remove_EI_PAX.patch
index fc51f79..fc51f79 100644
--- a/3.15.4/4425_grsec_remove_EI_PAX.patch
+++ b/3.15.5/4425_grsec_remove_EI_PAX.patch
diff --git a/3.15.4/4427_force_XATTR_PAX_tmpfs.patch b/3.15.5/4427_force_XATTR_PAX_tmpfs.patch
index 85766c5..85766c5 100644
--- a/3.15.4/4427_force_XATTR_PAX_tmpfs.patch
+++ b/3.15.5/4427_force_XATTR_PAX_tmpfs.patch
diff --git a/3.15.4/4430_grsec-remove-localversion-grsec.patch b/3.15.5/4430_grsec-remove-localversion-grsec.patch
index 31cf878..31cf878 100644
--- a/3.15.4/4430_grsec-remove-localversion-grsec.patch
+++ b/3.15.5/4430_grsec-remove-localversion-grsec.patch
diff --git a/3.15.4/4435_grsec-mute-warnings.patch b/3.15.5/4435_grsec-mute-warnings.patch
index a685858..a685858 100644
--- a/3.15.4/4435_grsec-mute-warnings.patch
+++ b/3.15.5/4435_grsec-mute-warnings.patch
diff --git a/3.15.4/4440_grsec-remove-protected-paths.patch b/3.15.5/4440_grsec-remove-protected-paths.patch
index 741546d..741546d 100644
--- a/3.15.4/4440_grsec-remove-protected-paths.patch
+++ b/3.15.5/4440_grsec-remove-protected-paths.patch
diff --git a/3.15.4/4450_grsec-kconfig-default-gids.patch b/3.15.5/4450_grsec-kconfig-default-gids.patch
index af218a8..af218a8 100644
--- a/3.15.4/4450_grsec-kconfig-default-gids.patch
+++ b/3.15.5/4450_grsec-kconfig-default-gids.patch
diff --git a/3.15.4/4465_selinux-avc_audit-log-curr_ip.patch b/3.15.5/4465_selinux-avc_audit-log-curr_ip.patch
index fb528d0..fb528d0 100644
--- a/3.15.4/4465_selinux-avc_audit-log-curr_ip.patch
+++ b/3.15.5/4465_selinux-avc_audit-log-curr_ip.patch
diff --git a/3.15.4/4470_disable-compat_vdso.patch b/3.15.5/4470_disable-compat_vdso.patch
index 7852848..7852848 100644
--- a/3.15.4/4470_disable-compat_vdso.patch
+++ b/3.15.5/4470_disable-compat_vdso.patch
diff --git a/3.15.4/4475_emutramp_default_on.patch b/3.15.5/4475_emutramp_default_on.patch
index cf88fd9..cf88fd9 100644
--- a/3.15.4/4475_emutramp_default_on.patch
+++ b/3.15.5/4475_emutramp_default_on.patch
diff --git a/3.2.60/0000_README b/3.2.60/0000_README
index 86d5902..2fa8fe3 100644
--- a/3.2.60/0000_README
+++ b/3.2.60/0000_README
@@ -158,7 +158,7 @@ Patch: 1059_linux-3.2.60.patch
From: http://www.kernel.org
Desc: Linux 3.2.60
-Patch: 4420_grsecurity-3.0-3.2.60-201407081916.patch
+Patch: 4420_grsecurity-3.0-3.2.60-201407100031.patch
From: http://www.grsecurity.net
Desc: hardened-sources base patch from upstream grsecurity
diff --git a/3.2.60/4420_grsecurity-3.0-3.2.60-201407081916.patch b/3.2.60/4420_grsecurity-3.0-3.2.60-201407100031.patch
index 3dc65d9..ba7f89f 100644
--- a/3.2.60/4420_grsecurity-3.0-3.2.60-201407081916.patch
+++ b/3.2.60/4420_grsecurity-3.0-3.2.60-201407100031.patch
@@ -63141,10 +63141,10 @@ index b1822dd..df622cb 100644
seq_putc(m, '\n');
diff --git a/fs/proc/proc_net.c b/fs/proc/proc_net.c
-index f738024..867e17d 100644
+index f738024..c2f9e5e 100644
--- a/fs/proc/proc_net.c
+++ b/fs/proc/proc_net.c
-@@ -23,6 +23,7 @@
+@@ -23,15 +23,34 @@
#include <linux/nsproxy.h>
#include <net/net_namespace.h>
#include <linux/seq_file.h>
@@ -63152,7 +63152,25 @@ index f738024..867e17d 100644
#include "internal.h"
-@@ -32,6 +33,8 @@ static struct net *get_proc_net(const struct inode *inode)
++#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
++static struct seq_operations *ipv6_seq_ops_addr;
++
++void register_ipv6_seq_ops_addr(struct seq_operations *addr)
++{
++ ipv6_seq_ops_addr = addr;
++}
++
++void unregister_ipv6_seq_ops_addr(void)
++{
++ ipv6_seq_ops_addr = NULL;
++}
++
++EXPORT_SYMBOL_GPL(register_ipv6_seq_ops_addr);
++EXPORT_SYMBOL_GPL(unregister_ipv6_seq_ops_addr);
++#endif
+
+ static struct net *get_proc_net(const struct inode *inode)
+ {
return maybe_get_net(PDE_NET(PDE(inode)));
}
@@ -63161,18 +63179,22 @@ index f738024..867e17d 100644
int seq_open_net(struct inode *ino, struct file *f,
const struct seq_operations *ops, int size)
{
-@@ -40,6 +43,10 @@ int seq_open_net(struct inode *ino, struct file *f,
+@@ -40,6 +59,14 @@ int seq_open_net(struct inode *ino, struct file *f,
BUG_ON(size < sizeof(*p));
+ /* only permit access to /proc/net/dev */
-+ if (ops != &dev_seq_ops && gr_proc_is_restricted())
++ if (
++#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
++ ops != ipv6_seq_ops_addr &&
++#endif
++ ops != &dev_seq_ops && gr_proc_is_restricted())
+ return -EACCES;
+
net = get_proc_net(ino);
if (net == NULL)
return -ENXIO;
-@@ -62,6 +69,9 @@ int single_open_net(struct inode *inode, struct file *file,
+@@ -62,6 +89,9 @@ int single_open_net(struct inode *inode, struct file *file,
int err;
struct net *net;
@@ -63182,7 +63204,7 @@ index f738024..867e17d 100644
err = -ENXIO;
net = get_proc_net(inode);
if (net == NULL)
-@@ -228,7 +238,7 @@ static __net_exit void proc_net_ns_exit(struct net *net)
+@@ -228,7 +258,7 @@ static __net_exit void proc_net_ns_exit(struct net *net)
kfree(net->proc_net);
}
@@ -103468,7 +103490,7 @@ index a0b4c5d..a5818a1 100644
}
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
-index b9edff0..2dba43d 100644
+index b9edff0..63ad6cf 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -2160,7 +2160,7 @@ int addrconf_set_dstaddr(struct net *net, void __user *arg)
@@ -103480,6 +103502,32 @@ index b9edff0..2dba43d 100644
if (ops->ndo_do_ioctl) {
mm_segment_t oldfs = get_fs();
+@@ -3227,16 +3227,23 @@ static const struct file_operations if6_fops = {
+ .release = seq_release_net,
+ };
+
++extern void register_ipv6_seq_ops_addr(struct seq_operations *addr);
++extern void unregister_ipv6_seq_ops_addr(void);
++
+ static int __net_init if6_proc_net_init(struct net *net)
+ {
+- if (!proc_net_fops_create(net, "if_inet6", S_IRUGO, &if6_fops))
++ register_ipv6_seq_ops_addr(&if6_seq_ops);
++ if (!proc_net_fops_create(net, "if_inet6", S_IRUGO, &if6_fops)) {
++ unregister_ipv6_seq_ops_addr();
+ return -ENOMEM;
++ }
+ return 0;
+ }
+
+ static void __net_exit if6_proc_net_exit(struct net *net)
+ {
+- proc_net_remove(net, "if_inet6");
++ proc_net_remove(net, "if_inet6");
++ unregister_ipv6_seq_ops_addr();
+ }
+
+ static struct pernet_operations if6_proc_net_ops = {
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c
index 65dd543..e6c6e6d 100644
--- a/net/ipv6/esp6.c