public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/hardened-patchset:master commit in: 3.2.66/, 3.2.65/
@ 2015-01-02 16:00 Anthony G. Basile
  0 siblings, 0 replies; only message in thread
From: Anthony G. Basile @ 2015-01-02 16:00 UTC (permalink / raw
  To: gentoo-commits

commit:     1346d58afe1360a7eb64307476c9de5bfe3eaf19
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Fri Jan  2 16:00:58 2015 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Fri Jan  2 16:00:58 2015 +0000
URL:        http://sources.gentoo.org/gitweb/?p=proj/hardened-patchset.git;a=commit;h=1346d58a

Bump 3.2.65 to 3.2.66

---
 {3.2.65 => 3.2.66}/0000_README                     |    4 +
 {3.2.65 => 3.2.66}/1021_linux-3.2.22.patch         |    0
 {3.2.65 => 3.2.66}/1022_linux-3.2.23.patch         |    0
 {3.2.65 => 3.2.66}/1023_linux-3.2.24.patch         |    0
 {3.2.65 => 3.2.66}/1024_linux-3.2.25.patch         |    0
 {3.2.65 => 3.2.66}/1025_linux-3.2.26.patch         |    0
 {3.2.65 => 3.2.66}/1026_linux-3.2.27.patch         |    0
 {3.2.65 => 3.2.66}/1027_linux-3.2.28.patch         |    0
 {3.2.65 => 3.2.66}/1028_linux-3.2.29.patch         |    0
 {3.2.65 => 3.2.66}/1029_linux-3.2.30.patch         |    0
 {3.2.65 => 3.2.66}/1030_linux-3.2.31.patch         |    0
 {3.2.65 => 3.2.66}/1031_linux-3.2.32.patch         |    0
 {3.2.65 => 3.2.66}/1032_linux-3.2.33.patch         |    0
 {3.2.65 => 3.2.66}/1033_linux-3.2.34.patch         |    0
 {3.2.65 => 3.2.66}/1034_linux-3.2.35.patch         |    0
 {3.2.65 => 3.2.66}/1035_linux-3.2.36.patch         |    0
 {3.2.65 => 3.2.66}/1036_linux-3.2.37.patch         |    0
 {3.2.65 => 3.2.66}/1037_linux-3.2.38.patch         |    0
 {3.2.65 => 3.2.66}/1038_linux-3.2.39.patch         |    0
 {3.2.65 => 3.2.66}/1039_linux-3.2.40.patch         |    0
 {3.2.65 => 3.2.66}/1040_linux-3.2.41.patch         |    0
 {3.2.65 => 3.2.66}/1041_linux-3.2.42.patch         |    0
 {3.2.65 => 3.2.66}/1042_linux-3.2.43.patch         |    0
 {3.2.65 => 3.2.66}/1043_linux-3.2.44.patch         |    0
 {3.2.65 => 3.2.66}/1044_linux-3.2.45.patch         |    0
 {3.2.65 => 3.2.66}/1045_linux-3.2.46.patch         |    0
 {3.2.65 => 3.2.66}/1046_linux-3.2.47.patch         |    0
 {3.2.65 => 3.2.66}/1047_linux-3.2.48.patch         |    0
 {3.2.65 => 3.2.66}/1048_linux-3.2.49.patch         |    0
 {3.2.65 => 3.2.66}/1049_linux-3.2.50.patch         |    0
 {3.2.65 => 3.2.66}/1050_linux-3.2.51.patch         |    0
 {3.2.65 => 3.2.66}/1051_linux-3.2.52.patch         |    0
 {3.2.65 => 3.2.66}/1052_linux-3.2.53.patch         |    0
 {3.2.65 => 3.2.66}/1053_linux-3.2.54.patch         |    0
 {3.2.65 => 3.2.66}/1054_linux-3.2.55.patch         |    0
 {3.2.65 => 3.2.66}/1055_linux-3.2.56.patch         |    0
 {3.2.65 => 3.2.66}/1056_linux-3.2.57.patch         |    0
 {3.2.65 => 3.2.66}/1057_linux-3.2.58.patch         |    0
 {3.2.65 => 3.2.66}/1058_linux-3.2.59.patch         |    0
 {3.2.65 => 3.2.66}/1059_linux-3.2.60.patch         |    0
 {3.2.65 => 3.2.66}/1060_linux-3.2.61.patch         |    0
 {3.2.65 => 3.2.66}/1061_linux-3.2.62.patch         |    0
 {3.2.65 => 3.2.66}/1062_linux-3.2.63.patch         |    0
 {3.2.65 => 3.2.66}/1063_linux-3.2.64.patch         |    0
 {3.2.65 => 3.2.66}/1064_linux-3.2.65.patch         |    0
 3.2.66/1065_linux-3.2.66.patch                     | 2041 ++++++++++++++++++++
 .../4420_grsecurity-3.0-3.2.65-201412280855.patch  |    0
 {3.2.65 => 3.2.66}/4425_grsec_remove_EI_PAX.patch  |    0
 .../4427_force_XATTR_PAX_tmpfs.patch               |    0
 .../4430_grsec-remove-localversion-grsec.patch     |    0
 {3.2.65 => 3.2.66}/4435_grsec-mute-warnings.patch  |    0
 .../4440_grsec-remove-protected-paths.patch        |    0
 .../4450_grsec-kconfig-default-gids.patch          |    0
 .../4465_selinux-avc_audit-log-curr_ip.patch       |    0
 {3.2.65 => 3.2.66}/4470_disable-compat_vdso.patch  |    0
 {3.2.65 => 3.2.66}/4475_emutramp_default_on.patch  |    0
 56 files changed, 2045 insertions(+)

diff --git a/3.2.65/0000_README b/3.2.66/0000_README
similarity index 98%
rename from 3.2.65/0000_README
rename to 3.2.66/0000_README
index 153f045..96a6e23 100644
--- a/3.2.65/0000_README
+++ b/3.2.66/0000_README
@@ -178,6 +178,10 @@ Patch:	1064_linux-3.2.65.patch
 From:	http://www.kernel.org
 Desc:	Linux 3.2.65
 
+Patch:	1065_linux-3.2.66.patch
+From:	http://www.kernel.org
+Desc:	Linux 3.2.66
+
 Patch:	4420_grsecurity-3.0-3.2.65-201412280855.patch
 From:	http://www.grsecurity.net
 Desc:	hardened-sources base patch from upstream grsecurity

diff --git a/3.2.65/1021_linux-3.2.22.patch b/3.2.66/1021_linux-3.2.22.patch
similarity index 100%
rename from 3.2.65/1021_linux-3.2.22.patch
rename to 3.2.66/1021_linux-3.2.22.patch

diff --git a/3.2.65/1022_linux-3.2.23.patch b/3.2.66/1022_linux-3.2.23.patch
similarity index 100%
rename from 3.2.65/1022_linux-3.2.23.patch
rename to 3.2.66/1022_linux-3.2.23.patch

diff --git a/3.2.65/1023_linux-3.2.24.patch b/3.2.66/1023_linux-3.2.24.patch
similarity index 100%
rename from 3.2.65/1023_linux-3.2.24.patch
rename to 3.2.66/1023_linux-3.2.24.patch

diff --git a/3.2.65/1024_linux-3.2.25.patch b/3.2.66/1024_linux-3.2.25.patch
similarity index 100%
rename from 3.2.65/1024_linux-3.2.25.patch
rename to 3.2.66/1024_linux-3.2.25.patch

diff --git a/3.2.65/1025_linux-3.2.26.patch b/3.2.66/1025_linux-3.2.26.patch
similarity index 100%
rename from 3.2.65/1025_linux-3.2.26.patch
rename to 3.2.66/1025_linux-3.2.26.patch

diff --git a/3.2.65/1026_linux-3.2.27.patch b/3.2.66/1026_linux-3.2.27.patch
similarity index 100%
rename from 3.2.65/1026_linux-3.2.27.patch
rename to 3.2.66/1026_linux-3.2.27.patch

diff --git a/3.2.65/1027_linux-3.2.28.patch b/3.2.66/1027_linux-3.2.28.patch
similarity index 100%
rename from 3.2.65/1027_linux-3.2.28.patch
rename to 3.2.66/1027_linux-3.2.28.patch

diff --git a/3.2.65/1028_linux-3.2.29.patch b/3.2.66/1028_linux-3.2.29.patch
similarity index 100%
rename from 3.2.65/1028_linux-3.2.29.patch
rename to 3.2.66/1028_linux-3.2.29.patch

diff --git a/3.2.65/1029_linux-3.2.30.patch b/3.2.66/1029_linux-3.2.30.patch
similarity index 100%
rename from 3.2.65/1029_linux-3.2.30.patch
rename to 3.2.66/1029_linux-3.2.30.patch

diff --git a/3.2.65/1030_linux-3.2.31.patch b/3.2.66/1030_linux-3.2.31.patch
similarity index 100%
rename from 3.2.65/1030_linux-3.2.31.patch
rename to 3.2.66/1030_linux-3.2.31.patch

diff --git a/3.2.65/1031_linux-3.2.32.patch b/3.2.66/1031_linux-3.2.32.patch
similarity index 100%
rename from 3.2.65/1031_linux-3.2.32.patch
rename to 3.2.66/1031_linux-3.2.32.patch

diff --git a/3.2.65/1032_linux-3.2.33.patch b/3.2.66/1032_linux-3.2.33.patch
similarity index 100%
rename from 3.2.65/1032_linux-3.2.33.patch
rename to 3.2.66/1032_linux-3.2.33.patch

diff --git a/3.2.65/1033_linux-3.2.34.patch b/3.2.66/1033_linux-3.2.34.patch
similarity index 100%
rename from 3.2.65/1033_linux-3.2.34.patch
rename to 3.2.66/1033_linux-3.2.34.patch

diff --git a/3.2.65/1034_linux-3.2.35.patch b/3.2.66/1034_linux-3.2.35.patch
similarity index 100%
rename from 3.2.65/1034_linux-3.2.35.patch
rename to 3.2.66/1034_linux-3.2.35.patch

diff --git a/3.2.65/1035_linux-3.2.36.patch b/3.2.66/1035_linux-3.2.36.patch
similarity index 100%
rename from 3.2.65/1035_linux-3.2.36.patch
rename to 3.2.66/1035_linux-3.2.36.patch

diff --git a/3.2.65/1036_linux-3.2.37.patch b/3.2.66/1036_linux-3.2.37.patch
similarity index 100%
rename from 3.2.65/1036_linux-3.2.37.patch
rename to 3.2.66/1036_linux-3.2.37.patch

diff --git a/3.2.65/1037_linux-3.2.38.patch b/3.2.66/1037_linux-3.2.38.patch
similarity index 100%
rename from 3.2.65/1037_linux-3.2.38.patch
rename to 3.2.66/1037_linux-3.2.38.patch

diff --git a/3.2.65/1038_linux-3.2.39.patch b/3.2.66/1038_linux-3.2.39.patch
similarity index 100%
rename from 3.2.65/1038_linux-3.2.39.patch
rename to 3.2.66/1038_linux-3.2.39.patch

diff --git a/3.2.65/1039_linux-3.2.40.patch b/3.2.66/1039_linux-3.2.40.patch
similarity index 100%
rename from 3.2.65/1039_linux-3.2.40.patch
rename to 3.2.66/1039_linux-3.2.40.patch

diff --git a/3.2.65/1040_linux-3.2.41.patch b/3.2.66/1040_linux-3.2.41.patch
similarity index 100%
rename from 3.2.65/1040_linux-3.2.41.patch
rename to 3.2.66/1040_linux-3.2.41.patch

diff --git a/3.2.65/1041_linux-3.2.42.patch b/3.2.66/1041_linux-3.2.42.patch
similarity index 100%
rename from 3.2.65/1041_linux-3.2.42.patch
rename to 3.2.66/1041_linux-3.2.42.patch

diff --git a/3.2.65/1042_linux-3.2.43.patch b/3.2.66/1042_linux-3.2.43.patch
similarity index 100%
rename from 3.2.65/1042_linux-3.2.43.patch
rename to 3.2.66/1042_linux-3.2.43.patch

diff --git a/3.2.65/1043_linux-3.2.44.patch b/3.2.66/1043_linux-3.2.44.patch
similarity index 100%
rename from 3.2.65/1043_linux-3.2.44.patch
rename to 3.2.66/1043_linux-3.2.44.patch

diff --git a/3.2.65/1044_linux-3.2.45.patch b/3.2.66/1044_linux-3.2.45.patch
similarity index 100%
rename from 3.2.65/1044_linux-3.2.45.patch
rename to 3.2.66/1044_linux-3.2.45.patch

diff --git a/3.2.65/1045_linux-3.2.46.patch b/3.2.66/1045_linux-3.2.46.patch
similarity index 100%
rename from 3.2.65/1045_linux-3.2.46.patch
rename to 3.2.66/1045_linux-3.2.46.patch

diff --git a/3.2.65/1046_linux-3.2.47.patch b/3.2.66/1046_linux-3.2.47.patch
similarity index 100%
rename from 3.2.65/1046_linux-3.2.47.patch
rename to 3.2.66/1046_linux-3.2.47.patch

diff --git a/3.2.65/1047_linux-3.2.48.patch b/3.2.66/1047_linux-3.2.48.patch
similarity index 100%
rename from 3.2.65/1047_linux-3.2.48.patch
rename to 3.2.66/1047_linux-3.2.48.patch

diff --git a/3.2.65/1048_linux-3.2.49.patch b/3.2.66/1048_linux-3.2.49.patch
similarity index 100%
rename from 3.2.65/1048_linux-3.2.49.patch
rename to 3.2.66/1048_linux-3.2.49.patch

diff --git a/3.2.65/1049_linux-3.2.50.patch b/3.2.66/1049_linux-3.2.50.patch
similarity index 100%
rename from 3.2.65/1049_linux-3.2.50.patch
rename to 3.2.66/1049_linux-3.2.50.patch

diff --git a/3.2.65/1050_linux-3.2.51.patch b/3.2.66/1050_linux-3.2.51.patch
similarity index 100%
rename from 3.2.65/1050_linux-3.2.51.patch
rename to 3.2.66/1050_linux-3.2.51.patch

diff --git a/3.2.65/1051_linux-3.2.52.patch b/3.2.66/1051_linux-3.2.52.patch
similarity index 100%
rename from 3.2.65/1051_linux-3.2.52.patch
rename to 3.2.66/1051_linux-3.2.52.patch

diff --git a/3.2.65/1052_linux-3.2.53.patch b/3.2.66/1052_linux-3.2.53.patch
similarity index 100%
rename from 3.2.65/1052_linux-3.2.53.patch
rename to 3.2.66/1052_linux-3.2.53.patch

diff --git a/3.2.65/1053_linux-3.2.54.patch b/3.2.66/1053_linux-3.2.54.patch
similarity index 100%
rename from 3.2.65/1053_linux-3.2.54.patch
rename to 3.2.66/1053_linux-3.2.54.patch

diff --git a/3.2.65/1054_linux-3.2.55.patch b/3.2.66/1054_linux-3.2.55.patch
similarity index 100%
rename from 3.2.65/1054_linux-3.2.55.patch
rename to 3.2.66/1054_linux-3.2.55.patch

diff --git a/3.2.65/1055_linux-3.2.56.patch b/3.2.66/1055_linux-3.2.56.patch
similarity index 100%
rename from 3.2.65/1055_linux-3.2.56.patch
rename to 3.2.66/1055_linux-3.2.56.patch

diff --git a/3.2.65/1056_linux-3.2.57.patch b/3.2.66/1056_linux-3.2.57.patch
similarity index 100%
rename from 3.2.65/1056_linux-3.2.57.patch
rename to 3.2.66/1056_linux-3.2.57.patch

diff --git a/3.2.65/1057_linux-3.2.58.patch b/3.2.66/1057_linux-3.2.58.patch
similarity index 100%
rename from 3.2.65/1057_linux-3.2.58.patch
rename to 3.2.66/1057_linux-3.2.58.patch

diff --git a/3.2.65/1058_linux-3.2.59.patch b/3.2.66/1058_linux-3.2.59.patch
similarity index 100%
rename from 3.2.65/1058_linux-3.2.59.patch
rename to 3.2.66/1058_linux-3.2.59.patch

diff --git a/3.2.65/1059_linux-3.2.60.patch b/3.2.66/1059_linux-3.2.60.patch
similarity index 100%
rename from 3.2.65/1059_linux-3.2.60.patch
rename to 3.2.66/1059_linux-3.2.60.patch

diff --git a/3.2.65/1060_linux-3.2.61.patch b/3.2.66/1060_linux-3.2.61.patch
similarity index 100%
rename from 3.2.65/1060_linux-3.2.61.patch
rename to 3.2.66/1060_linux-3.2.61.patch

diff --git a/3.2.65/1061_linux-3.2.62.patch b/3.2.66/1061_linux-3.2.62.patch
similarity index 100%
rename from 3.2.65/1061_linux-3.2.62.patch
rename to 3.2.66/1061_linux-3.2.62.patch

diff --git a/3.2.65/1062_linux-3.2.63.patch b/3.2.66/1062_linux-3.2.63.patch
similarity index 100%
rename from 3.2.65/1062_linux-3.2.63.patch
rename to 3.2.66/1062_linux-3.2.63.patch

diff --git a/3.2.65/1063_linux-3.2.64.patch b/3.2.66/1063_linux-3.2.64.patch
similarity index 100%
rename from 3.2.65/1063_linux-3.2.64.patch
rename to 3.2.66/1063_linux-3.2.64.patch

diff --git a/3.2.65/1064_linux-3.2.65.patch b/3.2.66/1064_linux-3.2.65.patch
similarity index 100%
rename from 3.2.65/1064_linux-3.2.65.patch
rename to 3.2.66/1064_linux-3.2.65.patch

diff --git a/3.2.66/1065_linux-3.2.66.patch b/3.2.66/1065_linux-3.2.66.patch
new file mode 100644
index 0000000..73fa646
--- /dev/null
+++ b/3.2.66/1065_linux-3.2.66.patch
@@ -0,0 +1,2041 @@
+diff --git a/Makefile b/Makefile
+index 1433109..f08f8bf 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 2
+-SUBLEVEL = 65
++SUBLEVEL = 66
+ EXTRAVERSION =
+ NAME = Saber-toothed Squirrel
+ 
+diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c
+index 70ec4e9..941d5cb 100644
+--- a/arch/powerpc/platforms/cell/spufs/inode.c
++++ b/arch/powerpc/platforms/cell/spufs/inode.c
+@@ -165,7 +165,7 @@ static void spufs_prune_dir(struct dentry *dir)
+ 	struct dentry *dentry, *tmp;
+ 
+ 	mutex_lock(&dir->d_inode->i_mutex);
+-	list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_u.d_child) {
++	list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_child) {
+ 		spin_lock(&dentry->d_lock);
+ 		if (!(d_unhashed(dentry)) && dentry->d_inode) {
+ 			dget_dlock(dentry);
+@@ -223,7 +223,7 @@ out:
+ 	 * - free child's inode if possible
+ 	 * - free child
+ 	 */
+-	list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_u.d_child) {
++	list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_child) {
+ 		dput(dentry);
+ 	}
+ 
+diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c
+index b2f44de..fd65e5e2 100644
+--- a/arch/s390/kernel/time.c
++++ b/arch/s390/kernel/time.c
+@@ -110,20 +110,10 @@ static void fixup_clock_comparator(unsigned long long delta)
+ 	set_clock_comparator(S390_lowcore.clock_comparator);
+ }
+ 
+-static int s390_next_ktime(ktime_t expires,
++static int s390_next_event(unsigned long delta,
+ 			   struct clock_event_device *evt)
+ {
+-	struct timespec ts;
+-	u64 nsecs;
+-
+-	ts.tv_sec = ts.tv_nsec = 0;
+-	monotonic_to_bootbased(&ts);
+-	nsecs = ktime_to_ns(ktime_add(timespec_to_ktime(ts), expires));
+-	do_div(nsecs, 125);
+-	S390_lowcore.clock_comparator = sched_clock_base_cc + (nsecs << 9);
+-	/* Program the maximum value if we have an overflow (== year 2042) */
+-	if (unlikely(S390_lowcore.clock_comparator < sched_clock_base_cc))
+-		S390_lowcore.clock_comparator = -1ULL;
++	S390_lowcore.clock_comparator = get_clock() + delta;
+ 	set_clock_comparator(S390_lowcore.clock_comparator);
+ 	return 0;
+ }
+@@ -148,15 +138,14 @@ void init_cpu_timer(void)
+ 	cpu = smp_processor_id();
+ 	cd = &per_cpu(comparators, cpu);
+ 	cd->name		= "comparator";
+-	cd->features		= CLOCK_EVT_FEAT_ONESHOT |
+-				  CLOCK_EVT_FEAT_KTIME;
++	cd->features		= CLOCK_EVT_FEAT_ONESHOT;
+ 	cd->mult		= 16777;
+ 	cd->shift		= 12;
+ 	cd->min_delta_ns	= 1;
+ 	cd->max_delta_ns	= LONG_MAX;
+ 	cd->rating		= 400;
+ 	cd->cpumask		= cpumask_of(cpu);
+-	cd->set_next_ktime	= s390_next_ktime;
++	cd->set_next_event	= s390_next_event;
+ 	cd->set_mode		= s390_set_mode;
+ 
+ 	clockevents_register_device(cd);
+diff --git a/arch/x86/crypto/ghash-clmulni-intel_asm.S b/arch/x86/crypto/ghash-clmulni-intel_asm.S
+index 1eb7f90..eb4d2a2 100644
+--- a/arch/x86/crypto/ghash-clmulni-intel_asm.S
++++ b/arch/x86/crypto/ghash-clmulni-intel_asm.S
+@@ -24,10 +24,6 @@
+ .align 16
+ .Lbswap_mask:
+ 	.octa 0x000102030405060708090a0b0c0d0e0f
+-.Lpoly:
+-	.octa 0xc2000000000000000000000000000001
+-.Ltwo_one:
+-	.octa 0x00000001000000000000000000000001
+ 
+ #define DATA	%xmm0
+ #define SHASH	%xmm1
+@@ -131,27 +127,3 @@ ENTRY(clmul_ghash_update)
+ 	movups DATA, (%rdi)
+ .Lupdate_just_ret:
+ 	ret
+-
+-/*
+- * void clmul_ghash_setkey(be128 *shash, const u8 *key);
+- *
+- * Calculate hash_key << 1 mod poly
+- */
+-ENTRY(clmul_ghash_setkey)
+-	movaps .Lbswap_mask, BSWAP
+-	movups (%rsi), %xmm0
+-	PSHUFB_XMM BSWAP %xmm0
+-	movaps %xmm0, %xmm1
+-	psllq $1, %xmm0
+-	psrlq $63, %xmm1
+-	movaps %xmm1, %xmm2
+-	pslldq $8, %xmm1
+-	psrldq $8, %xmm2
+-	por %xmm1, %xmm0
+-	# reduction
+-	pshufd $0b00100100, %xmm2, %xmm1
+-	pcmpeqd .Ltwo_one, %xmm1
+-	pand .Lpoly, %xmm1
+-	pxor %xmm1, %xmm0
+-	movups %xmm0, (%rdi)
+-	ret
+diff --git a/arch/x86/crypto/ghash-clmulni-intel_glue.c b/arch/x86/crypto/ghash-clmulni-intel_glue.c
+index 976aa64..294a264 100644
+--- a/arch/x86/crypto/ghash-clmulni-intel_glue.c
++++ b/arch/x86/crypto/ghash-clmulni-intel_glue.c
+@@ -29,8 +29,6 @@ void clmul_ghash_mul(char *dst, const be128 *shash);
+ void clmul_ghash_update(char *dst, const char *src, unsigned int srclen,
+ 			const be128 *shash);
+ 
+-void clmul_ghash_setkey(be128 *shash, const u8 *key);
+-
+ struct ghash_async_ctx {
+ 	struct cryptd_ahash *cryptd_tfm;
+ };
+@@ -57,13 +55,23 @@ static int ghash_setkey(struct crypto_shash *tfm,
+ 			const u8 *key, unsigned int keylen)
+ {
+ 	struct ghash_ctx *ctx = crypto_shash_ctx(tfm);
++	be128 *x = (be128 *)key;
++	u64 a, b;
+ 
+ 	if (keylen != GHASH_BLOCK_SIZE) {
+ 		crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
+ 		return -EINVAL;
+ 	}
+ 
+-	clmul_ghash_setkey(&ctx->shash, key);
++	/* perform multiplication by 'x' in GF(2^128) */
++	a = be64_to_cpu(x->a);
++	b = be64_to_cpu(x->b);
++
++	ctx->shash.a = (__be64)((b << 1) | (a >> 63));
++	ctx->shash.b = (__be64)((a << 1) | (b >> 63));
++
++	if (a >> 63)
++		ctx->shash.b ^= cpu_to_be64(0xc2);
+ 
+ 	return 0;
+ }
+diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
+index a315f1c..b8a5fe5 100644
+--- a/arch/x86/include/asm/cpufeature.h
++++ b/arch/x86/include/asm/cpufeature.h
+@@ -193,6 +193,7 @@
+ #define X86_FEATURE_DECODEASSISTS (8*32+12) /* AMD Decode Assists support */
+ #define X86_FEATURE_PAUSEFILTER (8*32+13) /* AMD filtered pause intercept */
+ #define X86_FEATURE_PFTHRESHOLD (8*32+14) /* AMD pause filter threshold */
++#define X86_FEATURE_VMMCALL     ( 8*32+15) /* Prefer vmmcall to vmcall */
+ 
+ 
+ /* Intel-defined CPU features, CPUID level 0x00000007:0 (ebx), word 9 */
+diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h
+index 734c376..9f0a680 100644
+--- a/arch/x86/include/asm/kvm_para.h
++++ b/arch/x86/include/asm/kvm_para.h
+@@ -91,15 +91,21 @@ struct kvm_vcpu_pv_apf_data {
+ 
+ #ifdef __KERNEL__
+ #include <asm/processor.h>
++#include <asm/alternative.h>
+ 
+ extern void kvmclock_init(void);
+ extern int kvm_register_clock(char *txt);
+ 
+ 
+-/* This instruction is vmcall.  On non-VT architectures, it will generate a
+- * trap that we will then rewrite to the appropriate instruction.
++#ifdef CONFIG_DEBUG_RODATA
++#define KVM_HYPERCALL \
++        ALTERNATIVE(".byte 0x0f,0x01,0xc1", ".byte 0x0f,0x01,0xd9", X86_FEATURE_VMMCALL)
++#else
++/* On AMD processors, vmcall will generate a trap that we will
++ * then rewrite to the appropriate instruction.
+  */
+ #define KVM_HYPERCALL ".byte 0x0f,0x01,0xc1"
++#endif
+ 
+ /* For KVM hypercalls, a three-byte sequence of either the vmrun or the vmmrun
+  * instruction.  The hypervisor may replace it with something else but only the
+diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
+index f07becc..2d44a28 100644
+--- a/arch/x86/kernel/cpu/amd.c
++++ b/arch/x86/kernel/cpu/amd.c
+@@ -469,6 +469,13 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)
+ 			set_cpu_cap(c, X86_FEATURE_EXTD_APICID);
+ 	}
+ #endif
++
++	/*
++	 * This is only needed to tell the kernel whether to use VMCALL
++	 * and VMMCALL.  VMMCALL is never executed except under virt, so
++	 * we can set it unconditionally.
++	 */
++	set_cpu_cap(c, X86_FEATURE_VMMCALL);
+ }
+ 
+ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
+diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
+index a9c2116..4b6701e 100644
+--- a/arch/x86/kernel/kvm.c
++++ b/arch/x86/kernel/kvm.c
+@@ -419,7 +419,14 @@ static void kvm_leave_lazy_mmu(void)
+ static void __init paravirt_ops_setup(void)
+ {
+ 	pv_info.name = "KVM";
+-	pv_info.paravirt_enabled = 1;
++
++	/*
++	 * KVM isn't paravirt in the sense of paravirt_enabled.  A KVM
++	 * guest kernel works like a bare metal kernel with additional
++	 * features, and paravirt_enabled is about features that are
++	 * missing.
++	 */
++	pv_info.paravirt_enabled = 0;
+ 
+ 	if (kvm_para_has_feature(KVM_FEATURE_NOP_IO_DELAY))
+ 		pv_cpu_ops.io_delay = kvm_io_delay;
+diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c
+index 44842d7..e90eca0 100644
+--- a/arch/x86/kernel/kvmclock.c
++++ b/arch/x86/kernel/kvmclock.c
+@@ -203,7 +203,6 @@ void __init kvmclock_init(void)
+ #endif
+ 	kvm_get_preset_lpj();
+ 	clocksource_register_hz(&kvm_clock, NSEC_PER_SEC);
+-	pv_info.paravirt_enabled = 1;
+ 	pv_info.name = "KVM";
+ 
+ 	if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE_STABLE_BIT))
+diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c
+index bcfec2d..7af7338 100644
+--- a/arch/x86/kernel/tls.c
++++ b/arch/x86/kernel/tls.c
+@@ -28,6 +28,21 @@ static int get_free_idx(void)
+ 	return -ESRCH;
+ }
+ 
++static bool tls_desc_okay(const struct user_desc *info)
++{
++	if (LDT_empty(info))
++		return true;
++
++	/*
++	 * espfix is required for 16-bit data segments, but espfix
++	 * only works for LDT segments.
++	 */
++	if (!info->seg_32bit)
++		return false;
++
++	return true;
++}
++
+ static void set_tls_desc(struct task_struct *p, int idx,
+ 			 const struct user_desc *info, int n)
+ {
+@@ -67,6 +82,9 @@ int do_set_thread_area(struct task_struct *p, int idx,
+ 	if (copy_from_user(&info, u_info, sizeof(info)))
+ 		return -EFAULT;
+ 
++	if (!tls_desc_okay(&info))
++		return -EINVAL;
++
+ 	if (idx == -1)
+ 		idx = info.entry_number;
+ 
+@@ -197,6 +215,7 @@ int regset_tls_set(struct task_struct *target, const struct user_regset *regset,
+ {
+ 	struct user_desc infobuf[GDT_ENTRY_TLS_ENTRIES];
+ 	const struct user_desc *info;
++	int i;
+ 
+ 	if (pos >= GDT_ENTRY_TLS_ENTRIES * sizeof(struct user_desc) ||
+ 	    (pos % sizeof(struct user_desc)) != 0 ||
+@@ -210,6 +229,10 @@ int regset_tls_set(struct task_struct *target, const struct user_regset *regset,
+ 	else
+ 		info = infobuf;
+ 
++	for (i = 0; i < count / sizeof(struct user_desc); i++)
++		if (!tls_desc_okay(info + i))
++			return -EINVAL;
++
+ 	set_tls_desc(target,
+ 		     GDT_ENTRY_TLS_MIN + (pos / sizeof(struct user_desc)),
+ 		     info, count / sizeof(struct user_desc));
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index 2d7d0df..bb179cc 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -4846,7 +4846,7 @@ static int handle_emulation_failure(struct kvm_vcpu *vcpu)
+ 
+ 	++vcpu->stat.insn_emulation_fail;
+ 	trace_kvm_emulate_insn_failed(vcpu);
+-	if (!is_guest_mode(vcpu)) {
++	if (!is_guest_mode(vcpu) && kvm_x86_ops->get_cpl(vcpu) == 0) {
+ 		vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
+ 		vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_EMULATION;
+ 		vcpu->run->internal.ndata = 0;
+diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
+index 923ac15..81f32e5 100644
+--- a/drivers/ata/ahci.c
++++ b/drivers/ata/ahci.c
+@@ -331,6 +331,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
+ 	{ PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series RAID */
+ 	{ PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */
+ 	{ PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series RAID */
++	{ PCI_VDEVICE(INTEL, 0x9d03), board_ahci }, /* Sunrise Point-LP AHCI */
++	{ PCI_VDEVICE(INTEL, 0x9d05), board_ahci }, /* Sunrise Point-LP RAID */
++	{ PCI_VDEVICE(INTEL, 0x9d07), board_ahci }, /* Sunrise Point-LP RAID */
+ 	{ PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H AHCI */
+ 	{ PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H RAID */
+ 	{ PCI_VDEVICE(INTEL, 0xa105), board_ahci }, /* Sunrise Point-H RAID */
+@@ -499,6 +502,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
+ 	 * enabled.  https://bugzilla.kernel.org/show_bug.cgi?id=60731
+ 	 */
+ 	{ PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_nomsi },
++	{ PCI_VDEVICE(SAMSUNG, 0xa800), board_ahci_nomsi },
+ 
+ 	/* Enmotus */
+ 	{ PCI_DEVICE(0x1c44, 0x8000), board_ahci },
+diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c
+index 78ae7b6..54702f8 100644
+--- a/drivers/ata/sata_fsl.c
++++ b/drivers/ata/sata_fsl.c
+@@ -1338,7 +1338,7 @@ static int sata_fsl_probe(struct platform_device *ofdev)
+ 	host_priv->csr_base = csr_base;
+ 
+ 	irq = irq_of_parse_and_map(ofdev->dev.of_node, 0);
+-	if (irq < 0) {
++	if (!irq) {
+ 		dev_err(&ofdev->dev, "invalid irq from platform\n");
+ 		goto error_exit_with_cleanup;
+ 	}
+diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
+index 3f1799b..09851ce 100644
+--- a/drivers/gpu/drm/drm_crtc.c
++++ b/drivers/gpu/drm/drm_crtc.c
+@@ -1815,7 +1815,17 @@ int drm_mode_getfb(struct drm_device *dev,
+ 	r->depth = fb->depth;
+ 	r->bpp = fb->bits_per_pixel;
+ 	r->pitch = fb->pitch;
+-	fb->funcs->create_handle(fb, file_priv, &r->handle);
++	if (file_priv->is_master || capable(CAP_SYS_ADMIN)) {
++		ret = fb->funcs->create_handle(fb, file_priv, &r->handle);
++	} else {
++		/* GET_FB() is an unprivileged ioctl so we must not
++		 * return a buffer-handle to non-master processes! For
++		 * backwards-compatibility reasons, we cannot make
++		 * GET_FB() privileged, so just return an invalid handle
++		 * for non-masters. */
++		r->handle = 0;
++		ret = 0;
++	}
+ 
+ out:
+ 	mutex_unlock(&dev->mode_config.mutex);
+diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
+index fadd021..4da8182 100644
+--- a/drivers/gpu/drm/i915/intel_lvds.c
++++ b/drivers/gpu/drm/i915/intel_lvds.c
+@@ -914,6 +914,18 @@ bool intel_lvds_init(struct drm_device *dev)
+ 	int pipe;
+ 	u8 pin;
+ 
++	/*
++	 * Unlock registers and just leave them unlocked. Do this before
++	 * checking quirk lists to avoid bogus WARNINGs.
++	 */
++	if (HAS_PCH_SPLIT(dev)) {
++		I915_WRITE(PCH_PP_CONTROL,
++			   I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
++	} else {
++		I915_WRITE(PP_CONTROL,
++			   I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
++	}
++
+ 	/* Skip init on machines we know falsely report LVDS */
+ 	if (dmi_check_system(intel_no_lvds))
+ 		return false;
+@@ -1088,19 +1100,6 @@ out:
+ 		pwm = I915_READ(BLC_PWM_PCH_CTL1);
+ 		pwm |= PWM_PCH_ENABLE;
+ 		I915_WRITE(BLC_PWM_PCH_CTL1, pwm);
+-		/*
+-		 * Unlock registers and just
+-		 * leave them unlocked
+-		 */
+-		I915_WRITE(PCH_PP_CONTROL,
+-			   I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
+-	} else {
+-		/*
+-		 * Unlock registers and just
+-		 * leave them unlocked
+-		 */
+-		I915_WRITE(PP_CONTROL,
+-			   I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
+ 	}
+ 	dev_priv->lid_notifier.notifier_call = intel_lid_notify;
+ 	if (acpi_lid_notifier_register(&dev_priv->lid_notifier)) {
+diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c
+index 79b4bcb..1837fe6 100644
+--- a/drivers/i2c/busses/i2c-davinci.c
++++ b/drivers/i2c/busses/i2c-davinci.c
+@@ -416,11 +416,9 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
+ 	if (dev->cmd_err & DAVINCI_I2C_STR_NACK) {
+ 		if (msg->flags & I2C_M_IGNORE_NAK)
+ 			return msg->len;
+-		if (stop) {
+-			w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
+-			w |= DAVINCI_I2C_MDR_STP;
+-			davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w);
+-		}
++		w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
++		w |= DAVINCI_I2C_MDR_STP;
++		davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w);
+ 		return -EREMOTEIO;
+ 	}
+ 	return -EIO;
+diff --git a/drivers/media/dvb/ttusb-dec/ttusbdecfe.c b/drivers/media/dvb/ttusb-dec/ttusbdecfe.c
+index 21260aa..852870b 100644
+--- a/drivers/media/dvb/ttusb-dec/ttusbdecfe.c
++++ b/drivers/media/dvb/ttusb-dec/ttusbdecfe.c
+@@ -154,6 +154,9 @@ static int ttusbdecfe_dvbs_diseqc_send_master_cmd(struct dvb_frontend* fe, struc
+ 		   0x00, 0x00, 0x00, 0x00,
+ 		   0x00, 0x00 };
+ 
++	if (cmd->msg_len > sizeof(b) - 4)
++		return -EINVAL;
++
+ 	memcpy(&b[4], cmd->msg, cmd->msg_len);
+ 
+ 	state->config->send_command(fe, 0x72,
+diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
+index 654a5e9..61d3d1f 100644
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -143,6 +143,7 @@ config MACVLAN
+ config MACVTAP
+ 	tristate "MAC-VLAN based tap driver (EXPERIMENTAL)"
+ 	depends on MACVLAN
++	depends on INET
+ 	help
+ 	  This adds a specialized tap character device driver that is based
+ 	  on the MAC-VLAN network interface, called macvtap. A macvtap device
+@@ -195,6 +196,7 @@ config RIONET_RX_SIZE
+ 
+ config TUN
+ 	tristate "Universal TUN/TAP device driver support"
++	depends on INET
+ 	select CRC32
+ 	---help---
+ 	  TUN/TAP provides packet reception and transmission for user space
+diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
+index b0f9015..0e6e57e 100644
+--- a/drivers/net/macvtap.c
++++ b/drivers/net/macvtap.c
+@@ -15,6 +15,7 @@
+ #include <linux/cdev.h>
+ #include <linux/fs.h>
+ 
++#include <net/ipv6.h>
+ #include <net/net_namespace.h>
+ #include <net/rtnetlink.h>
+ #include <net/sock.h>
+@@ -577,6 +578,8 @@ static int macvtap_skb_from_vnet_hdr(struct sk_buff *skb,
+ 			break;
+ 		case VIRTIO_NET_HDR_GSO_UDP:
+ 			gso_type = SKB_GSO_UDP;
++			if (skb->protocol == htons(ETH_P_IPV6))
++				ipv6_proxy_select_ident(skb);
+ 			break;
+ 		default:
+ 			return -EINVAL;
+diff --git a/drivers/net/tun.c b/drivers/net/tun.c
+index ee1aab0..2fbbca6 100644
+--- a/drivers/net/tun.c
++++ b/drivers/net/tun.c
+@@ -64,6 +64,7 @@
+ #include <linux/nsproxy.h>
+ #include <linux/virtio_net.h>
+ #include <linux/rcupdate.h>
++#include <net/ipv6.h>
+ #include <net/net_namespace.h>
+ #include <net/netns/generic.h>
+ #include <net/rtnetlink.h>
+@@ -695,6 +696,8 @@ static ssize_t tun_get_user(struct tun_struct *tun,
+ 		break;
+ 	}
+ 
++	skb_reset_network_header(skb);
++
+ 	if (gso.gso_type != VIRTIO_NET_HDR_GSO_NONE) {
+ 		pr_debug("GSO!\n");
+ 		switch (gso.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) {
+@@ -706,6 +709,8 @@ static ssize_t tun_get_user(struct tun_struct *tun,
+ 			break;
+ 		case VIRTIO_NET_HDR_GSO_UDP:
+ 			skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
++			if (skb->protocol == htons(ETH_P_IPV6))
++				ipv6_proxy_select_ident(skb);
+ 			break;
+ 		default:
+ 			tun->dev->stats.rx_frame_errors++;
+diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c
+index 2278dad..5babd94 100644
+--- a/drivers/usb/core/inode.c
++++ b/drivers/usb/core/inode.c
+@@ -212,7 +212,7 @@ static void update_bus(struct dentry *bus)
+ 
+ 	mutex_lock(&bus->d_inode->i_mutex);
+ 
+-	list_for_each_entry(dev, &bus->d_subdirs, d_u.d_child)
++	list_for_each_entry(dev, &bus->d_subdirs, d_child)
+ 		if (dev->d_inode)
+ 			update_dev(dev);
+ 
+@@ -229,7 +229,7 @@ static void update_sb(struct super_block *sb)
+ 
+ 	mutex_lock_nested(&root->d_inode->i_mutex, I_MUTEX_PARENT);
+ 
+-	list_for_each_entry(bus, &root->d_subdirs, d_u.d_child) {
++	list_for_each_entry(bus, &root->d_subdirs, d_child) {
+ 		if (bus->d_inode) {
+ 			switch (S_IFMT & bus->d_inode->i_mode) {
+ 			case S_IFDIR:
+@@ -345,7 +345,7 @@ static int usbfs_empty (struct dentry *dentry)
+ 
+ 	spin_lock(&dentry->d_lock);
+ 	list_for_each(list, &dentry->d_subdirs) {
+-		struct dentry *de = list_entry(list, struct dentry, d_u.d_child);
++		struct dentry *de = list_entry(list, struct dentry, d_child);
+ 
+ 		spin_lock_nested(&de->d_lock, DENTRY_D_LOCK_NESTED);
+ 		if (usbfs_positive(de)) {
+diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c
+index 0b5745e..30d4fa8 100644
+--- a/fs/9p/vfs_inode_dotl.c
++++ b/fs/9p/vfs_inode_dotl.c
+@@ -81,7 +81,7 @@ static struct dentry *v9fs_dentry_from_dir_inode(struct inode *inode)
+ 	spin_lock(&inode->i_lock);
+ 	/* Directory should have only one entry. */
+ 	BUG_ON(S_ISDIR(inode->i_mode) && !list_is_singular(&inode->i_dentry));
+-	dentry = list_entry(inode->i_dentry.next, struct dentry, d_alias);
++	dentry = list_entry(inode->i_dentry.next, struct dentry, d_u.d_alias);
+ 	spin_unlock(&inode->i_lock);
+ 	return dentry;
+ }
+diff --git a/fs/affs/amigaffs.c b/fs/affs/amigaffs.c
+index de37ec8..43c05d8 100644
+--- a/fs/affs/amigaffs.c
++++ b/fs/affs/amigaffs.c
+@@ -132,7 +132,7 @@ affs_fix_dcache(struct dentry *dentry, u32 entry_ino)
+ 	head = &inode->i_dentry;
+ 	next = head->next;
+ 	while (next != head) {
+-		dentry = list_entry(next, struct dentry, d_alias);
++		dentry = list_entry(next, struct dentry, d_u.d_alias);
+ 		if (entry_ino == (u32)(long)dentry->d_fsdata) {
+ 			dentry->d_fsdata = data;
+ 			break;
+diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c
+index 2c69d12..7fc0371 100644
+--- a/fs/autofs4/expire.c
++++ b/fs/autofs4/expire.c
+@@ -100,7 +100,7 @@ static struct dentry *get_next_positive_subdir(struct dentry *prev,
+ 	p = prev;
+ 	spin_lock(&p->d_lock);
+ again:
+-	next = p->d_u.d_child.next;
++	next = p->d_child.next;
+ start:
+ 	if (next == &root->d_subdirs) {
+ 		spin_unlock(&p->d_lock);
+@@ -109,7 +109,7 @@ start:
+ 		return NULL;
+ 	}
+ 
+-	q = list_entry(next, struct dentry, d_u.d_child);
++	q = list_entry(next, struct dentry, d_child);
+ 
+ 	spin_lock_nested(&q->d_lock, DENTRY_D_LOCK_NESTED);
+ 	/* Negative dentry - try next */
+@@ -165,13 +165,13 @@ again:
+ 				goto relock;
+ 			}
+ 			spin_unlock(&p->d_lock);
+-			next = p->d_u.d_child.next;
++			next = p->d_child.next;
+ 			p = parent;
+ 			if (next != &parent->d_subdirs)
+ 				break;
+ 		}
+ 	}
+-	ret = list_entry(next, struct dentry, d_u.d_child);
++	ret = list_entry(next, struct dentry, d_child);
+ 
+ 	spin_lock_nested(&ret->d_lock, DENTRY_D_LOCK_NESTED);
+ 	/* Negative dentry - try next */
+@@ -455,7 +455,7 @@ found:
+ 	spin_lock(&sbi->lookup_lock);
+ 	spin_lock(&expired->d_parent->d_lock);
+ 	spin_lock_nested(&expired->d_lock, DENTRY_D_LOCK_NESTED);
+-	list_move(&expired->d_parent->d_subdirs, &expired->d_u.d_child);
++	list_move(&expired->d_parent->d_subdirs, &expired->d_child);
+ 	spin_unlock(&expired->d_lock);
+ 	spin_unlock(&expired->d_parent->d_lock);
+ 	spin_unlock(&sbi->lookup_lock);
+diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c
+index 790fa63..2e936c6 100644
+--- a/fs/autofs4/root.c
++++ b/fs/autofs4/root.c
+@@ -651,7 +651,7 @@ static void autofs_clear_leaf_automount_flags(struct dentry *dentry)
+ 	/* only consider parents below dentrys in the root */
+ 	if (IS_ROOT(parent->d_parent))
+ 		return;
+-	d_child = &dentry->d_u.d_child;
++	d_child = &dentry->d_child;
+ 	/* Set parent managed if it's becoming empty */
+ 	if (d_child->next == &parent->d_subdirs &&
+ 	    d_child->prev == &parent->d_subdirs)
+diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
+index 9895400..7903e62 100644
+--- a/fs/ceph/dir.c
++++ b/fs/ceph/dir.c
+@@ -104,7 +104,7 @@ static unsigned fpos_off(loff_t p)
+ /*
+  * When possible, we try to satisfy a readdir by peeking at the
+  * dcache.  We make this work by carefully ordering dentries on
+- * d_u.d_child when we initially get results back from the MDS, and
++ * d_child when we initially get results back from the MDS, and
+  * falling back to a "normal" sync readdir if any dentries in the dir
+  * are dropped.
+  *
+@@ -140,11 +140,11 @@ static int __dcache_readdir(struct file *filp,
+ 		p = parent->d_subdirs.prev;
+ 		dout(" initial p %p/%p\n", p->prev, p->next);
+ 	} else {
+-		p = last->d_u.d_child.prev;
++		p = last->d_child.prev;
+ 	}
+ 
+ more:
+-	dentry = list_entry(p, struct dentry, d_u.d_child);
++	dentry = list_entry(p, struct dentry, d_child);
+ 	di = ceph_dentry(dentry);
+ 	while (1) {
+ 		dout(" p %p/%p %s d_subdirs %p/%p\n", p->prev, p->next,
+@@ -166,7 +166,7 @@ more:
+ 		     !dentry->d_inode ? " null" : "");
+ 		spin_unlock(&dentry->d_lock);
+ 		p = p->prev;
+-		dentry = list_entry(p, struct dentry, d_u.d_child);
++		dentry = list_entry(p, struct dentry, d_child);
+ 		di = ceph_dentry(dentry);
+ 	}
+ 
+diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
+index 87fb132..8e889b7 100644
+--- a/fs/ceph/inode.c
++++ b/fs/ceph/inode.c
+@@ -868,9 +868,9 @@ static void ceph_set_dentry_offset(struct dentry *dn)
+ 
+ 	spin_lock(&dir->d_lock);
+ 	spin_lock_nested(&dn->d_lock, DENTRY_D_LOCK_NESTED);
+-	list_move(&dn->d_u.d_child, &dir->d_subdirs);
++	list_move(&dn->d_child, &dir->d_subdirs);
+ 	dout("set_dentry_offset %p %lld (%p %p)\n", dn, di->offset,
+-	     dn->d_u.d_child.prev, dn->d_u.d_child.next);
++	     dn->d_child.prev, dn->d_child.next);
+ 	spin_unlock(&dn->d_lock);
+ 	spin_unlock(&dir->d_lock);
+ }
+@@ -1256,7 +1256,7 @@ retry_lookup:
+ 			/* reorder parent's d_subdirs */
+ 			spin_lock(&parent->d_lock);
+ 			spin_lock_nested(&dn->d_lock, DENTRY_D_LOCK_NESTED);
+-			list_move(&dn->d_u.d_child, &parent->d_subdirs);
++			list_move(&dn->d_child, &parent->d_subdirs);
+ 			spin_unlock(&dn->d_lock);
+ 			spin_unlock(&parent->d_lock);
+ 		}
+diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
+index c0c51e1..710dd05 100644
+--- a/fs/cifs/inode.c
++++ b/fs/cifs/inode.c
+@@ -823,7 +823,7 @@ inode_has_hashed_dentries(struct inode *inode)
+ 	struct dentry *dentry;
+ 
+ 	spin_lock(&inode->i_lock);
+-	list_for_each_entry(dentry, &inode->i_dentry, d_alias) {
++	list_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
+ 		if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
+ 			spin_unlock(&inode->i_lock);
+ 			return true;
+diff --git a/fs/coda/cache.c b/fs/coda/cache.c
+index 6901578..4b2e5cb 100644
+--- a/fs/coda/cache.c
++++ b/fs/coda/cache.c
+@@ -95,7 +95,7 @@ static void coda_flag_children(struct dentry *parent, int flag)
+ 	spin_lock(&parent->d_lock);
+ 	list_for_each(child, &parent->d_subdirs)
+ 	{
+-		de = list_entry(child, struct dentry, d_u.d_child);
++		de = list_entry(child, struct dentry, d_child);
+ 		/* don't know what to do with negative dentries */
+ 		if ( ! de->d_inode ) 
+ 			continue;
+diff --git a/fs/dcache.c b/fs/dcache.c
+index d322929..3f65742 100644
+--- a/fs/dcache.c
++++ b/fs/dcache.c
+@@ -42,7 +42,7 @@
+ /*
+  * Usage:
+  * dcache->d_inode->i_lock protects:
+- *   - i_dentry, d_alias, d_inode of aliases
++ *   - i_dentry, d_u.d_alias, d_inode of aliases
+  * dcache_hash_bucket lock protects:
+  *   - the dcache hash table
+  * s_anon bl list spinlock protects:
+@@ -57,7 +57,7 @@
+  *   - d_unhashed()
+  *   - d_parent and d_subdirs
+  *   - childrens' d_child and d_parent
+- *   - d_alias, d_inode
++ *   - d_u.d_alias, d_inode
+  *
+  * Ordering:
+  * dentry->d_inode->i_lock
+@@ -140,7 +140,6 @@ static void __d_free(struct rcu_head *head)
+ {
+ 	struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu);
+ 
+-	WARN_ON(!list_empty(&dentry->d_alias));
+ 	if (dname_external(dentry))
+ 		kfree(dentry->d_name.name);
+ 	kmem_cache_free(dentry_cache, dentry); 
+@@ -151,6 +150,7 @@ static void __d_free(struct rcu_head *head)
+  */
+ static void d_free(struct dentry *dentry)
+ {
++	WARN_ON(!list_empty(&dentry->d_u.d_alias));
+ 	BUG_ON(dentry->d_count);
+ 	this_cpu_dec(nr_dentry);
+ 	if (dentry->d_op && dentry->d_op->d_release)
+@@ -189,7 +189,7 @@ static void dentry_iput(struct dentry * dentry)
+ 	struct inode *inode = dentry->d_inode;
+ 	if (inode) {
+ 		dentry->d_inode = NULL;
+-		list_del_init(&dentry->d_alias);
++		list_del_init(&dentry->d_u.d_alias);
+ 		spin_unlock(&dentry->d_lock);
+ 		spin_unlock(&inode->i_lock);
+ 		if (!inode->i_nlink)
+@@ -213,7 +213,7 @@ static void dentry_unlink_inode(struct dentry * dentry)
+ {
+ 	struct inode *inode = dentry->d_inode;
+ 	dentry->d_inode = NULL;
+-	list_del_init(&dentry->d_alias);
++	list_del_init(&dentry->d_u.d_alias);
+ 	dentry_rcuwalk_barrier(dentry);
+ 	spin_unlock(&dentry->d_lock);
+ 	spin_unlock(&inode->i_lock);
+@@ -306,9 +306,9 @@ static struct dentry *d_kill(struct dentry *dentry, struct dentry *parent)
+ 	__releases(parent->d_lock)
+ 	__releases(dentry->d_inode->i_lock)
+ {
+-	list_del(&dentry->d_u.d_child);
++	__list_del_entry(&dentry->d_child);
+ 	/*
+-	 * Inform try_to_ascend() that we are no longer attached to the
++	 * Inform ascending readers that we are no longer attached to the
+ 	 * dentry tree
+ 	 */
+ 	dentry->d_flags |= DCACHE_DENTRY_KILLED;
+@@ -624,7 +624,7 @@ static struct dentry *__d_find_alias(struct inode *inode, int want_discon)
+ 
+ again:
+ 	discon_alias = NULL;
+-	list_for_each_entry(alias, &inode->i_dentry, d_alias) {
++	list_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
+ 		spin_lock(&alias->d_lock);
+  		if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
+ 			if (IS_ROOT(alias) &&
+@@ -677,7 +677,7 @@ void d_prune_aliases(struct inode *inode)
+ 	struct dentry *dentry;
+ restart:
+ 	spin_lock(&inode->i_lock);
+-	list_for_each_entry(dentry, &inode->i_dentry, d_alias) {
++	list_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
+ 		spin_lock(&dentry->d_lock);
+ 		if (!dentry->d_count) {
+ 			__dget_dlock(dentry);
+@@ -857,7 +857,7 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
+ 		/* descend to the first leaf in the current subtree */
+ 		while (!list_empty(&dentry->d_subdirs))
+ 			dentry = list_entry(dentry->d_subdirs.next,
+-					    struct dentry, d_u.d_child);
++					    struct dentry, d_child);
+ 
+ 		/* consume the dentries from this leaf up through its parents
+ 		 * until we find one with children or run out altogether */
+@@ -889,17 +889,17 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
+ 
+ 			if (IS_ROOT(dentry)) {
+ 				parent = NULL;
+-				list_del(&dentry->d_u.d_child);
++				list_del(&dentry->d_child);
+ 			} else {
+ 				parent = dentry->d_parent;
+ 				parent->d_count--;
+-				list_del(&dentry->d_u.d_child);
++				list_del(&dentry->d_child);
+ 			}
+ 
+ 			inode = dentry->d_inode;
+ 			if (inode) {
+ 				dentry->d_inode = NULL;
+-				list_del_init(&dentry->d_alias);
++				list_del_init(&dentry->d_u.d_alias);
+ 				if (dentry->d_op && dentry->d_op->d_iput)
+ 					dentry->d_op->d_iput(dentry, inode);
+ 				else
+@@ -917,7 +917,7 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
+ 		} while (list_empty(&dentry->d_subdirs));
+ 
+ 		dentry = list_entry(dentry->d_subdirs.next,
+-				    struct dentry, d_u.d_child);
++				    struct dentry, d_child);
+ 	}
+ }
+ 
+@@ -949,34 +949,6 @@ void shrink_dcache_for_umount(struct super_block *sb)
+ 	}
+ }
+ 
+-/*
+- * This tries to ascend one level of parenthood, but
+- * we can race with renaming, so we need to re-check
+- * the parenthood after dropping the lock and check
+- * that the sequence number still matches.
+- */
+-static struct dentry *try_to_ascend(struct dentry *old, int locked, unsigned seq)
+-{
+-	struct dentry *new = old->d_parent;
+-
+-	rcu_read_lock();
+-	spin_unlock(&old->d_lock);
+-	spin_lock(&new->d_lock);
+-
+-	/*
+-	 * might go back up the wrong parent if we have had a rename
+-	 * or deletion
+-	 */
+-	if (new != old->d_parent ||
+-		 (old->d_flags & DCACHE_DENTRY_KILLED) ||
+-		 (!locked && read_seqretry(&rename_lock, seq))) {
+-		spin_unlock(&new->d_lock);
+-		new = NULL;
+-	}
+-	rcu_read_unlock();
+-	return new;
+-}
+-
+ 
+ /*
+  * Search for at least 1 mount point in the dentry's subdirs.
+@@ -1010,7 +982,7 @@ repeat:
+ resume:
+ 	while (next != &this_parent->d_subdirs) {
+ 		struct list_head *tmp = next;
+-		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
++		struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
+ 		next = tmp->next;
+ 
+ 		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
+@@ -1032,17 +1004,32 @@ resume:
+ 	/*
+ 	 * All done at this level ... ascend and resume the search.
+ 	 */
++	rcu_read_lock();
++ascend:
+ 	if (this_parent != parent) {
+ 		struct dentry *child = this_parent;
+-		this_parent = try_to_ascend(this_parent, locked, seq);
+-		if (!this_parent)
++		this_parent = child->d_parent;
++
++		spin_unlock(&child->d_lock);
++		spin_lock(&this_parent->d_lock);
++
++		/* might go back up the wrong parent if we have had a rename */
++		if (!locked && read_seqretry(&rename_lock, seq))
+ 			goto rename_retry;
+-		next = child->d_u.d_child.next;
++		next = child->d_child.next;
++		while (unlikely(child->d_flags & DCACHE_DENTRY_KILLED)) {
++			if (next == &this_parent->d_subdirs)
++				goto ascend;
++			child = list_entry(next, struct dentry, d_child);
++			next = next->next;
++		}
++		rcu_read_unlock();
+ 		goto resume;
+ 	}
+-	spin_unlock(&this_parent->d_lock);
+ 	if (!locked && read_seqretry(&rename_lock, seq))
+ 		goto rename_retry;
++	spin_unlock(&this_parent->d_lock);
++	rcu_read_unlock();
+ 	if (locked)
+ 		write_sequnlock(&rename_lock);
+ 	return 0; /* No mount points found in tree */
+@@ -1054,6 +1041,8 @@ positive:
+ 	return 1;
+ 
+ rename_retry:
++	spin_unlock(&this_parent->d_lock);
++	rcu_read_unlock();
+ 	if (locked)
+ 		goto again;
+ 	locked = 1;
+@@ -1093,7 +1082,7 @@ repeat:
+ resume:
+ 	while (next != &this_parent->d_subdirs) {
+ 		struct list_head *tmp = next;
+-		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
++		struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
+ 		next = tmp->next;
+ 
+ 		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
+@@ -1139,23 +1128,40 @@ resume:
+ 	/*
+ 	 * All done at this level ... ascend and resume the search.
+ 	 */
++	rcu_read_lock();
++ascend:
+ 	if (this_parent != parent) {
+ 		struct dentry *child = this_parent;
+-		this_parent = try_to_ascend(this_parent, locked, seq);
+-		if (!this_parent)
++		this_parent = child->d_parent;
++
++		spin_unlock(&child->d_lock);
++		spin_lock(&this_parent->d_lock);
++
++		/* might go back up the wrong parent if we have had a rename */
++		if (!locked && read_seqretry(&rename_lock, seq))
+ 			goto rename_retry;
+-		next = child->d_u.d_child.next;
++		next = child->d_child.next;
++		while (unlikely(child->d_flags & DCACHE_DENTRY_KILLED)) {
++			if (next == &this_parent->d_subdirs)
++				goto ascend;
++			child = list_entry(next, struct dentry, d_child);
++			next = next->next;
++		}
++		rcu_read_unlock();
+ 		goto resume;
+ 	}
+ out:
+-	spin_unlock(&this_parent->d_lock);
+ 	if (!locked && read_seqretry(&rename_lock, seq))
+ 		goto rename_retry;
++	spin_unlock(&this_parent->d_lock);
++	rcu_read_unlock();
+ 	if (locked)
+ 		write_sequnlock(&rename_lock);
+ 	return found;
+ 
+ rename_retry:
++	spin_unlock(&this_parent->d_lock);
++	rcu_read_unlock();
+ 	if (found)
+ 		return found;
+ 	if (locked)
+@@ -1230,8 +1236,8 @@ struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)
+ 	INIT_HLIST_BL_NODE(&dentry->d_hash);
+ 	INIT_LIST_HEAD(&dentry->d_lru);
+ 	INIT_LIST_HEAD(&dentry->d_subdirs);
+-	INIT_LIST_HEAD(&dentry->d_alias);
+-	INIT_LIST_HEAD(&dentry->d_u.d_child);
++	INIT_LIST_HEAD(&dentry->d_u.d_alias);
++	INIT_LIST_HEAD(&dentry->d_child);
+ 	d_set_d_op(dentry, dentry->d_sb->s_d_op);
+ 
+ 	this_cpu_inc(nr_dentry);
+@@ -1261,7 +1267,7 @@ struct dentry *d_alloc(struct dentry * parent, const struct qstr *name)
+ 	 */
+ 	__dget_dlock(parent);
+ 	dentry->d_parent = parent;
+-	list_add(&dentry->d_u.d_child, &parent->d_subdirs);
++	list_add(&dentry->d_child, &parent->d_subdirs);
+ 	spin_unlock(&parent->d_lock);
+ 
+ 	return dentry;
+@@ -1318,7 +1324,7 @@ static void __d_instantiate(struct dentry *dentry, struct inode *inode)
+ 	if (inode) {
+ 		if (unlikely(IS_AUTOMOUNT(inode)))
+ 			dentry->d_flags |= DCACHE_NEED_AUTOMOUNT;
+-		list_add(&dentry->d_alias, &inode->i_dentry);
++		list_add(&dentry->d_u.d_alias, &inode->i_dentry);
+ 	}
+ 	dentry->d_inode = inode;
+ 	dentry_rcuwalk_barrier(dentry);
+@@ -1343,7 +1349,7 @@ static void __d_instantiate(struct dentry *dentry, struct inode *inode)
+  
+ void d_instantiate(struct dentry *entry, struct inode * inode)
+ {
+-	BUG_ON(!list_empty(&entry->d_alias));
++	BUG_ON(!list_empty(&entry->d_u.d_alias));
+ 	if (inode)
+ 		spin_lock(&inode->i_lock);
+ 	__d_instantiate(entry, inode);
+@@ -1382,7 +1388,7 @@ static struct dentry *__d_instantiate_unique(struct dentry *entry,
+ 		return NULL;
+ 	}
+ 
+-	list_for_each_entry(alias, &inode->i_dentry, d_alias) {
++	list_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
+ 		struct qstr *qstr = &alias->d_name;
+ 
+ 		/*
+@@ -1408,7 +1414,7 @@ struct dentry *d_instantiate_unique(struct dentry *entry, struct inode *inode)
+ {
+ 	struct dentry *result;
+ 
+-	BUG_ON(!list_empty(&entry->d_alias));
++	BUG_ON(!list_empty(&entry->d_u.d_alias));
+ 
+ 	if (inode)
+ 		spin_lock(&inode->i_lock);
+@@ -1458,7 +1464,7 @@ static struct dentry * __d_find_any_alias(struct inode *inode)
+ 
+ 	if (list_empty(&inode->i_dentry))
+ 		return NULL;
+-	alias = list_first_entry(&inode->i_dentry, struct dentry, d_alias);
++	alias = list_first_entry(&inode->i_dentry, struct dentry, d_u.d_alias);
+ 	__dget(alias);
+ 	return alias;
+ }
+@@ -1525,7 +1531,7 @@ struct dentry *d_obtain_alias(struct inode *inode)
+ 	spin_lock(&tmp->d_lock);
+ 	tmp->d_inode = inode;
+ 	tmp->d_flags |= DCACHE_DISCONNECTED;
+-	list_add(&tmp->d_alias, &inode->i_dentry);
++	list_add(&tmp->d_u.d_alias, &inode->i_dentry);
+ 	hlist_bl_lock(&tmp->d_sb->s_anon);
+ 	hlist_bl_add_head(&tmp->d_hash, &tmp->d_sb->s_anon);
+ 	hlist_bl_unlock(&tmp->d_sb->s_anon);
+@@ -1931,7 +1937,7 @@ int d_validate(struct dentry *dentry, struct dentry *dparent)
+ 	struct dentry *child;
+ 
+ 	spin_lock(&dparent->d_lock);
+-	list_for_each_entry(child, &dparent->d_subdirs, d_u.d_child) {
++	list_for_each_entry(child, &dparent->d_subdirs, d_child) {
+ 		if (dentry == child) {
+ 			spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
+ 			__dget_dlock(dentry);
+@@ -2178,8 +2184,8 @@ static void __d_move(struct dentry * dentry, struct dentry * target)
+ 	/* Unhash the target: dput() will then get rid of it */
+ 	__d_drop(target);
+ 
+-	list_del(&dentry->d_u.d_child);
+-	list_del(&target->d_u.d_child);
++	list_del(&dentry->d_child);
++	list_del(&target->d_child);
+ 
+ 	/* Switch the names.. */
+ 	switch_names(dentry, target);
+@@ -2189,15 +2195,15 @@ static void __d_move(struct dentry * dentry, struct dentry * target)
+ 	if (IS_ROOT(dentry)) {
+ 		dentry->d_parent = target->d_parent;
+ 		target->d_parent = target;
+-		INIT_LIST_HEAD(&target->d_u.d_child);
++		INIT_LIST_HEAD(&target->d_child);
+ 	} else {
+ 		swap(dentry->d_parent, target->d_parent);
+ 
+ 		/* And add them back to the (new) parent lists */
+-		list_add(&target->d_u.d_child, &target->d_parent->d_subdirs);
++		list_add(&target->d_child, &target->d_parent->d_subdirs);
+ 	}
+ 
+-	list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs);
++	list_add(&dentry->d_child, &dentry->d_parent->d_subdirs);
+ 
+ 	write_seqcount_end(&target->d_seq);
+ 	write_seqcount_end(&dentry->d_seq);
+@@ -2304,18 +2310,18 @@ static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon)
+ 	swap(dentry->d_name.hash, anon->d_name.hash);
+ 
+ 	dentry->d_parent = (aparent == anon) ? dentry : aparent;
+-	list_del(&dentry->d_u.d_child);
++	list_del(&dentry->d_child);
+ 	if (!IS_ROOT(dentry))
+-		list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs);
++		list_add(&dentry->d_child, &dentry->d_parent->d_subdirs);
+ 	else
+-		INIT_LIST_HEAD(&dentry->d_u.d_child);
++		INIT_LIST_HEAD(&dentry->d_child);
+ 
+ 	anon->d_parent = (dparent == dentry) ? anon : dparent;
+-	list_del(&anon->d_u.d_child);
++	list_del(&anon->d_child);
+ 	if (!IS_ROOT(anon))
+-		list_add(&anon->d_u.d_child, &anon->d_parent->d_subdirs);
++		list_add(&anon->d_child, &anon->d_parent->d_subdirs);
+ 	else
+-		INIT_LIST_HEAD(&anon->d_u.d_child);
++		INIT_LIST_HEAD(&anon->d_child);
+ 
+ 	write_seqcount_end(&dentry->d_seq);
+ 	write_seqcount_end(&anon->d_seq);
+@@ -2893,7 +2899,7 @@ repeat:
+ resume:
+ 	while (next != &this_parent->d_subdirs) {
+ 		struct list_head *tmp = next;
+-		struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
++		struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
+ 		next = tmp->next;
+ 
+ 		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
+@@ -2914,26 +2920,43 @@ resume:
+ 		}
+ 		spin_unlock(&dentry->d_lock);
+ 	}
++	rcu_read_lock();
++ascend:
+ 	if (this_parent != root) {
+ 		struct dentry *child = this_parent;
+ 		if (!(this_parent->d_flags & DCACHE_GENOCIDE)) {
+ 			this_parent->d_flags |= DCACHE_GENOCIDE;
+ 			this_parent->d_count--;
+ 		}
+-		this_parent = try_to_ascend(this_parent, locked, seq);
+-		if (!this_parent)
++		this_parent = child->d_parent;
++
++		spin_unlock(&child->d_lock);
++		spin_lock(&this_parent->d_lock);
++
++		/* might go back up the wrong parent if we have had a rename */
++		if (!locked && read_seqretry(&rename_lock, seq))
+ 			goto rename_retry;
+-		next = child->d_u.d_child.next;
++		next = child->d_child.next;
++		while (unlikely(child->d_flags & DCACHE_DENTRY_KILLED)) {
++			if (next == &this_parent->d_subdirs)
++				goto ascend;
++			child = list_entry(next, struct dentry, d_child);
++			next = next->next;
++		}
++		rcu_read_unlock();
+ 		goto resume;
+ 	}
+-	spin_unlock(&this_parent->d_lock);
+ 	if (!locked && read_seqretry(&rename_lock, seq))
+ 		goto rename_retry;
++	spin_unlock(&this_parent->d_lock);
++	rcu_read_unlock();
+ 	if (locked)
+ 		write_sequnlock(&rename_lock);
+ 	return;
+ 
+ rename_retry:
++	spin_unlock(&this_parent->d_lock);
++	rcu_read_unlock();
+ 	if (locked)
+ 		goto again;
+ 	locked = 1;
+diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
+index 01951c6b..6ac0893 100644
+--- a/fs/debugfs/inode.c
++++ b/fs/debugfs/inode.c
+@@ -399,7 +399,7 @@ void debugfs_remove_recursive(struct dentry *dentry)
+ 	 * use the d_u.d_child as the rcu head and corrupt this list.
+ 	 */
+ 	spin_lock(&parent->d_lock);
+-	list_for_each_entry(child, &parent->d_subdirs, d_u.d_child) {
++	list_for_each_entry(child, &parent->d_subdirs, d_child) {
+ 		if (!debugfs_positive(child))
+ 			continue;
+ 
+diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c
+index b05acb7..3bbf5e7 100644
+--- a/fs/exportfs/expfs.c
++++ b/fs/exportfs/expfs.c
+@@ -50,7 +50,7 @@ find_acceptable_alias(struct dentry *result,
+ 
+ 	inode = result->d_inode;
+ 	spin_lock(&inode->i_lock);
+-	list_for_each_entry(dentry, &inode->i_dentry, d_alias) {
++	list_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
+ 		dget(dentry);
+ 		spin_unlock(&inode->i_lock);
+ 		if (toput)
+diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c
+index a8d03a4..019c29c 100644
+--- a/fs/ext4/fsync.c
++++ b/fs/ext4/fsync.c
+@@ -139,7 +139,7 @@ static int ext4_sync_parent(struct inode *inode)
+ 		spin_lock(&inode->i_lock);
+ 		if (!list_empty(&inode->i_dentry)) {
+ 			dentry = list_first_entry(&inode->i_dentry,
+-						  struct dentry, d_alias);
++						  struct dentry, d_u.d_alias);
+ 			dget(dentry);
+ 		}
+ 		spin_unlock(&inode->i_lock);
+diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
+index cd39fa7..c9f2e3d 100644
+--- a/fs/ext4/namei.c
++++ b/fs/ext4/namei.c
+@@ -1986,7 +1986,7 @@ int ext4_orphan_add(handle_t *handle, struct inode *inode)
+ 	struct ext4_iloc iloc;
+ 	int err = 0, rc;
+ 
+-	if (!ext4_handle_valid(handle) || is_bad_inode(inode))
++	if (!EXT4_SB(sb)->s_journal || is_bad_inode(inode))
+ 		return 0;
+ 
+ 	mutex_lock(&EXT4_SB(sb)->s_orphan_lock);
+@@ -2060,8 +2060,7 @@ int ext4_orphan_del(handle_t *handle, struct inode *inode)
+ 	struct ext4_iloc iloc;
+ 	int err = 0;
+ 
+-	/* ext4_handle_valid() assumes a valid handle_t pointer */
+-	if (handle && !ext4_handle_valid(handle) &&
++	if (!EXT4_SB(inode->i_sb)->s_journal &&
+ 	    !(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_ORPHAN_FS))
+ 		return 0;
+ 
+@@ -2081,7 +2080,7 @@ int ext4_orphan_del(handle_t *handle, struct inode *inode)
+ 	 * transaction handle with which to update the orphan list on
+ 	 * disk, but we still need to remove the inode from the linked
+ 	 * list in memory. */
+-	if (sbi->s_journal && !handle)
++	if (!handle)
+ 		goto out;
+ 
+ 	err = ext4_reserve_inode_write(handle, inode, &iloc);
+diff --git a/fs/libfs.c b/fs/libfs.c
+index f6d411e..ce85edf 100644
+--- a/fs/libfs.c
++++ b/fs/libfs.c
+@@ -104,18 +104,18 @@ loff_t dcache_dir_lseek(struct file *file, loff_t offset, int origin)
+ 
+ 			spin_lock(&dentry->d_lock);
+ 			/* d_lock not required for cursor */
+-			list_del(&cursor->d_u.d_child);
++			list_del(&cursor->d_child);
+ 			p = dentry->d_subdirs.next;
+ 			while (n && p != &dentry->d_subdirs) {
+ 				struct dentry *next;
+-				next = list_entry(p, struct dentry, d_u.d_child);
++				next = list_entry(p, struct dentry, d_child);
+ 				spin_lock_nested(&next->d_lock, DENTRY_D_LOCK_NESTED);
+ 				if (simple_positive(next))
+ 					n--;
+ 				spin_unlock(&next->d_lock);
+ 				p = p->next;
+ 			}
+-			list_add_tail(&cursor->d_u.d_child, p);
++			list_add_tail(&cursor->d_child, p);
+ 			spin_unlock(&dentry->d_lock);
+ 		}
+ 	}
+@@ -139,7 +139,7 @@ int dcache_readdir(struct file * filp, void * dirent, filldir_t filldir)
+ {
+ 	struct dentry *dentry = filp->f_path.dentry;
+ 	struct dentry *cursor = filp->private_data;
+-	struct list_head *p, *q = &cursor->d_u.d_child;
++	struct list_head *p, *q = &cursor->d_child;
+ 	ino_t ino;
+ 	int i = filp->f_pos;
+ 
+@@ -165,7 +165,7 @@ int dcache_readdir(struct file * filp, void * dirent, filldir_t filldir)
+ 
+ 			for (p=q->next; p != &dentry->d_subdirs; p=p->next) {
+ 				struct dentry *next;
+-				next = list_entry(p, struct dentry, d_u.d_child);
++				next = list_entry(p, struct dentry, d_child);
+ 				spin_lock_nested(&next->d_lock, DENTRY_D_LOCK_NESTED);
+ 				if (!simple_positive(next)) {
+ 					spin_unlock(&next->d_lock);
+@@ -282,7 +282,7 @@ int simple_empty(struct dentry *dentry)
+ 	int ret = 0;
+ 
+ 	spin_lock(&dentry->d_lock);
+-	list_for_each_entry(child, &dentry->d_subdirs, d_u.d_child) {
++	list_for_each_entry(child, &dentry->d_subdirs, d_child) {
+ 		spin_lock_nested(&child->d_lock, DENTRY_D_LOCK_NESTED);
+ 		if (simple_positive(child)) {
+ 			spin_unlock(&child->d_lock);
+diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c
+index 844bd64..efa38a9 100644
+--- a/fs/ncpfs/dir.c
++++ b/fs/ncpfs/dir.c
+@@ -391,7 +391,7 @@ ncp_dget_fpos(struct dentry *dentry, struct dentry *parent, unsigned long fpos)
+ 	spin_lock(&parent->d_lock);
+ 	next = parent->d_subdirs.next;
+ 	while (next != &parent->d_subdirs) {
+-		dent = list_entry(next, struct dentry, d_u.d_child);
++		dent = list_entry(next, struct dentry, d_child);
+ 		if ((unsigned long)dent->d_fsdata == fpos) {
+ 			if (dent->d_inode)
+ 				dget(dent);
+diff --git a/fs/ncpfs/ncplib_kernel.h b/fs/ncpfs/ncplib_kernel.h
+index 09881e6..64a817a 100644
+--- a/fs/ncpfs/ncplib_kernel.h
++++ b/fs/ncpfs/ncplib_kernel.h
+@@ -194,7 +194,7 @@ ncp_renew_dentries(struct dentry *parent)
+ 	spin_lock(&parent->d_lock);
+ 	next = parent->d_subdirs.next;
+ 	while (next != &parent->d_subdirs) {
+-		dentry = list_entry(next, struct dentry, d_u.d_child);
++		dentry = list_entry(next, struct dentry, d_child);
+ 
+ 		if (dentry->d_fsdata == NULL)
+ 			ncp_age_dentry(server, dentry);
+@@ -216,7 +216,7 @@ ncp_invalidate_dircache_entries(struct dentry *parent)
+ 	spin_lock(&parent->d_lock);
+ 	next = parent->d_subdirs.next;
+ 	while (next != &parent->d_subdirs) {
+-		dentry = list_entry(next, struct dentry, d_u.d_child);
++		dentry = list_entry(next, struct dentry, d_child);
+ 		dentry->d_fsdata = NULL;
+ 		ncp_age_dentry(server, dentry);
+ 		next = next->next;
+diff --git a/fs/nfs/getroot.c b/fs/nfs/getroot.c
+index dcb6154..d7abf9e 100644
+--- a/fs/nfs/getroot.c
++++ b/fs/nfs/getroot.c
+@@ -65,7 +65,7 @@ static int nfs_superblock_set_dummy_root(struct super_block *sb, struct inode *i
+ 		 */
+ 		spin_lock(&sb->s_root->d_inode->i_lock);
+ 		spin_lock(&sb->s_root->d_lock);
+-		list_del_init(&sb->s_root->d_alias);
++		list_del_init(&sb->s_root->d_u.d_alias);
+ 		spin_unlock(&sb->s_root->d_lock);
+ 		spin_unlock(&sb->s_root->d_inode->i_lock);
+ 	}
+diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c
+index 79b47cb..f8ea28f 100644
+--- a/fs/notify/fsnotify.c
++++ b/fs/notify/fsnotify.c
+@@ -62,14 +62,14 @@ void __fsnotify_update_child_dentry_flags(struct inode *inode)
+ 	spin_lock(&inode->i_lock);
+ 	/* run all of the dentries associated with this inode.  Since this is a
+ 	 * directory, there damn well better only be one item on this list */
+-	list_for_each_entry(alias, &inode->i_dentry, d_alias) {
++	list_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
+ 		struct dentry *child;
+ 
+ 		/* run all of the children of the original inode and fix their
+ 		 * d_flags to indicate parental interest (their parent is the
+ 		 * original inode) */
+ 		spin_lock(&alias->d_lock);
+-		list_for_each_entry(child, &alias->d_subdirs, d_u.d_child) {
++		list_for_each_entry(child, &alias->d_subdirs, d_child) {
+ 			if (!child->d_inode)
+ 				continue;
+ 
+diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c
+index e5ba348..26977cc 100644
+--- a/fs/ocfs2/dcache.c
++++ b/fs/ocfs2/dcache.c
+@@ -175,7 +175,7 @@ struct dentry *ocfs2_find_local_alias(struct inode *inode,
+ 
+ 	spin_lock(&inode->i_lock);
+ 	list_for_each(p, &inode->i_dentry) {
+-		dentry = list_entry(p, struct dentry, d_alias);
++		dentry = list_entry(p, struct dentry, d_u.d_alias);
+ 
+ 		spin_lock(&dentry->d_lock);
+ 		if (ocfs2_match_dentry(dentry, parent_blkno, skip_unhashed)) {
+diff --git a/fs/udf/inode.c b/fs/udf/inode.c
+index af37ce3..a0f6ded 100644
+--- a/fs/udf/inode.c
++++ b/fs/udf/inode.c
+@@ -1176,13 +1176,22 @@ update_time:
+ 	return 0;
+ }
+ 
++/*
++ * Maximum length of linked list formed by ICB hierarchy. The chosen number is
++ * arbitrary - just that we hopefully don't limit any real use of rewritten
++ * inode on write-once media but avoid looping for too long on corrupted media.
++ */
++#define UDF_MAX_ICB_NESTING 1024
++
+ static void __udf_read_inode(struct inode *inode)
+ {
+ 	struct buffer_head *bh = NULL;
+ 	struct fileEntry *fe;
+ 	uint16_t ident;
+ 	struct udf_inode_info *iinfo = UDF_I(inode);
++	unsigned int indirections = 0;
+ 
++reread:
+ 	/*
+ 	 * Set defaults, but the inode is still incomplete!
+ 	 * Note: get_new_inode() sets the following on a new inode:
+@@ -1219,28 +1228,26 @@ static void __udf_read_inode(struct inode *inode)
+ 		ibh = udf_read_ptagged(inode->i_sb, &iinfo->i_location, 1,
+ 					&ident);
+ 		if (ident == TAG_IDENT_IE && ibh) {
+-			struct buffer_head *nbh = NULL;
+ 			struct kernel_lb_addr loc;
+ 			struct indirectEntry *ie;
+ 
+ 			ie = (struct indirectEntry *)ibh->b_data;
+ 			loc = lelb_to_cpu(ie->indirectICB.extLocation);
+ 
+-			if (ie->indirectICB.extLength &&
+-				(nbh = udf_read_ptagged(inode->i_sb, &loc, 0,
+-							&ident))) {
+-				if (ident == TAG_IDENT_FE ||
+-					ident == TAG_IDENT_EFE) {
+-					memcpy(&iinfo->i_location,
+-						&loc,
+-						sizeof(struct kernel_lb_addr));
+-					brelse(bh);
+-					brelse(ibh);
+-					brelse(nbh);
+-					__udf_read_inode(inode);
++			if (ie->indirectICB.extLength) {
++				brelse(bh);
++				brelse(ibh);
++				memcpy(&iinfo->i_location, &loc,
++				       sizeof(struct kernel_lb_addr));
++				if (++indirections > UDF_MAX_ICB_NESTING) {
++					udf_err(inode->i_sb,
++						"too many ICBs in ICB hierarchy"
++						" (max %d supported)\n",
++						UDF_MAX_ICB_NESTING);
++					make_bad_inode(inode);
+ 					return;
+ 				}
+-				brelse(nbh);
++				goto reread;
+ 			}
+ 		}
+ 		brelse(ibh);
+diff --git a/include/linux/dcache.h b/include/linux/dcache.h
+index 1dfe974..99374de 100644
+--- a/include/linux/dcache.h
++++ b/include/linux/dcache.h
+@@ -133,15 +133,15 @@ struct dentry {
+ 	void *d_fsdata;			/* fs-specific data */
+ 
+ 	struct list_head d_lru;		/* LRU list */
++	struct list_head d_child;	/* child of parent list */
++	struct list_head d_subdirs;	/* our children */
+ 	/*
+-	 * d_child and d_rcu can share memory
++	 * d_alias and d_rcu can share memory
+ 	 */
+ 	union {
+-		struct list_head d_child;	/* child of parent list */
++		struct list_head d_alias;	/* inode alias list */
+ 	 	struct rcu_head d_rcu;
+ 	} d_u;
+-	struct list_head d_subdirs;	/* our children */
+-	struct list_head d_alias;	/* inode alias list */
+ };
+ 
+ /*
+diff --git a/include/net/ipv6.h b/include/net/ipv6.h
+index 00a2eb6..ab2e6d7 100644
+--- a/include/net/ipv6.h
++++ b/include/net/ipv6.h
+@@ -481,6 +481,7 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_add
+ }
+ 
+ extern void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt);
++void ipv6_proxy_select_ident(struct sk_buff *skb);
+ 
+ /*
+  *	Prototypes exported by ipv6
+diff --git a/include/net/tcp.h b/include/net/tcp.h
+index 238255b..e90235f 100644
+--- a/include/net/tcp.h
++++ b/include/net/tcp.h
+@@ -1214,11 +1214,13 @@ extern int tcp_v4_md5_do_del(struct sock *sk, __be32 addr);
+ #define tcp_twsk_md5_key(twsk)	NULL
+ #endif
+ 
+-extern struct tcp_md5sig_pool __percpu *tcp_alloc_md5sig_pool(struct sock *);
+-extern void tcp_free_md5sig_pool(void);
++extern bool tcp_alloc_md5sig_pool(void);
+ 
+ extern struct tcp_md5sig_pool	*tcp_get_md5sig_pool(void);
+-extern void tcp_put_md5sig_pool(void);
++static inline void tcp_put_md5sig_pool(void)
++{
++	local_bh_enable();
++}
+ 
+ extern int tcp_md5_hash_header(struct tcp_md5sig_pool *, const struct tcphdr *);
+ extern int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *, const struct sk_buff *,
+diff --git a/kernel/cgroup.c b/kernel/cgroup.c
+index ffcf896..eafb6dd 100644
+--- a/kernel/cgroup.c
++++ b/kernel/cgroup.c
+@@ -881,7 +881,7 @@ static void cgroup_clear_directory(struct dentry *dentry)
+ 	spin_lock(&dentry->d_lock);
+ 	node = dentry->d_subdirs.next;
+ 	while (node != &dentry->d_subdirs) {
+-		struct dentry *d = list_entry(node, struct dentry, d_u.d_child);
++		struct dentry *d = list_entry(node, struct dentry, d_child);
+ 
+ 		spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED);
+ 		list_del_init(node);
+@@ -915,7 +915,7 @@ static void cgroup_d_remove_dir(struct dentry *dentry)
+ 	parent = dentry->d_parent;
+ 	spin_lock(&parent->d_lock);
+ 	spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
+-	list_del_init(&dentry->d_u.d_child);
++	list_del_init(&dentry->d_child);
+ 	spin_unlock(&dentry->d_lock);
+ 	spin_unlock(&parent->d_lock);
+ 	remove_dir(dentry);
+diff --git a/mm/memory.c b/mm/memory.c
+index 5a7f314..628cadc 100644
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -870,20 +870,20 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
+ 		if (!pte_file(pte)) {
+ 			swp_entry_t entry = pte_to_swp_entry(pte);
+ 
+-			if (swap_duplicate(entry) < 0)
+-				return entry.val;
+-
+-			/* make sure dst_mm is on swapoff's mmlist. */
+-			if (unlikely(list_empty(&dst_mm->mmlist))) {
+-				spin_lock(&mmlist_lock);
+-				if (list_empty(&dst_mm->mmlist))
+-					list_add(&dst_mm->mmlist,
+-						 &src_mm->mmlist);
+-				spin_unlock(&mmlist_lock);
+-			}
+-			if (likely(!non_swap_entry(entry)))
++			if (likely(!non_swap_entry(entry))) {
++				if (swap_duplicate(entry) < 0)
++					return entry.val;
++
++				/* make sure dst_mm is on swapoff's mmlist. */
++				if (unlikely(list_empty(&dst_mm->mmlist))) {
++					spin_lock(&mmlist_lock);
++					if (list_empty(&dst_mm->mmlist))
++						list_add(&dst_mm->mmlist,
++							 &src_mm->mmlist);
++					spin_unlock(&mmlist_lock);
++				}
+ 				rss[MM_SWAPENTS]++;
+-			else if (is_write_migration_entry(entry) &&
++			} else if (is_write_migration_entry(entry) &&
+ 					is_cow_mapping(vm_flags)) {
+ 				/*
+ 				 * COW mappings require pages in both parent
+diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
+index 76da979..1cdb4a9 100644
+--- a/net/ipv4/fib_semantics.c
++++ b/net/ipv4/fib_semantics.c
+@@ -467,7 +467,7 @@ int fib_nh_match(struct fib_config *cfg, struct fib_info *fi)
+ 			return 1;
+ 
+ 		attrlen = rtnh_attrlen(rtnh);
+-		if (attrlen < 0) {
++		if (attrlen > 0) {
+ 			struct nlattr *nla, *attrs = rtnh_attrs(rtnh);
+ 
+ 			nla = nla_find(attrs, attrlen, RTA_GATEWAY);
+diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
+index 115157b..bf2e54b 100644
+--- a/net/ipv4/ip_output.c
++++ b/net/ipv4/ip_output.c
+@@ -1472,6 +1472,7 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, __be32 daddr,
+ 	struct ipcm_cookie ipc;
+ 	struct flowi4 fl4;
+ 	struct rtable *rt = skb_rtable(skb);
++	int err;
+ 
+ 	if (ip_options_echo(&replyopts.opt.opt, skb))
+ 		return;
+@@ -1509,8 +1510,13 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, __be32 daddr,
+ 	sk->sk_priority = skb->priority;
+ 	sk->sk_protocol = ip_hdr(skb)->protocol;
+ 	sk->sk_bound_dev_if = arg->bound_dev_if;
+-	ip_append_data(sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base, len, 0,
+-		       &ipc, &rt, MSG_DONTWAIT);
++	err = ip_append_data(sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base,
++			     len, 0, &ipc, &rt, MSG_DONTWAIT);
++	if (unlikely(err)) {
++		ip_flush_pending_frames(sk);
++		goto out;
++	}
++
+ 	if ((skb = skb_peek(&sk->sk_write_queue)) != NULL) {
+ 		if (arg->csumoffset >= 0)
+ 			*((__sum16 *)skb_transport_header(skb) +
+@@ -1519,7 +1525,7 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, __be32 daddr,
+ 		skb->ip_summed = CHECKSUM_NONE;
+ 		ip_push_pending_frames(sk, &fl4);
+ 	}
+-
++out:
+ 	bh_unlock_sock(sk);
+ 
+ 	ip_rt_put(rt);
+diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
+index ec8b4b7e..32c9e83 100644
+--- a/net/ipv4/tcp.c
++++ b/net/ipv4/tcp.c
+@@ -2863,104 +2863,42 @@ int tcp_gro_complete(struct sk_buff *skb)
+ EXPORT_SYMBOL(tcp_gro_complete);
+ 
+ #ifdef CONFIG_TCP_MD5SIG
+-static unsigned long tcp_md5sig_users;
+-static struct tcp_md5sig_pool __percpu *tcp_md5sig_pool;
+-static DEFINE_SPINLOCK(tcp_md5sig_pool_lock);
++static DEFINE_PER_CPU(struct tcp_md5sig_pool, tcp_md5sig_pool);
++static DEFINE_MUTEX(tcp_md5sig_mutex);
++static bool tcp_md5sig_pool_populated = false;
+ 
+-static void __tcp_free_md5sig_pool(struct tcp_md5sig_pool __percpu *pool)
++static void __tcp_alloc_md5sig_pool(void)
+ {
+ 	int cpu;
+ 
+ 	for_each_possible_cpu(cpu) {
+-		struct tcp_md5sig_pool *p = per_cpu_ptr(pool, cpu);
++		if (!per_cpu(tcp_md5sig_pool, cpu).md5_desc.tfm) {
++			struct crypto_hash *hash;
+ 
+-		if (p->md5_desc.tfm)
+-			crypto_free_hash(p->md5_desc.tfm);
+-	}
+-	free_percpu(pool);
+-}
+-
+-void tcp_free_md5sig_pool(void)
+-{
+-	struct tcp_md5sig_pool __percpu *pool = NULL;
+-
+-	spin_lock_bh(&tcp_md5sig_pool_lock);
+-	if (--tcp_md5sig_users == 0) {
+-		pool = tcp_md5sig_pool;
+-		tcp_md5sig_pool = NULL;
++			hash = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC);
++			if (IS_ERR_OR_NULL(hash))
++				return;
++			per_cpu(tcp_md5sig_pool, cpu).md5_desc.tfm = hash;
++		}
+ 	}
+-	spin_unlock_bh(&tcp_md5sig_pool_lock);
+-	if (pool)
+-		__tcp_free_md5sig_pool(pool);
++	/* before setting tcp_md5sig_pool_populated, we must commit all writes
++	 * to memory. See smp_rmb() in tcp_get_md5sig_pool()
++	 */
++	smp_wmb();
++	tcp_md5sig_pool_populated = true;
+ }
+-EXPORT_SYMBOL(tcp_free_md5sig_pool);
+ 
+-static struct tcp_md5sig_pool __percpu *
+-__tcp_alloc_md5sig_pool(struct sock *sk)
++bool tcp_alloc_md5sig_pool(void)
+ {
+-	int cpu;
+-	struct tcp_md5sig_pool __percpu *pool;
+-
+-	pool = alloc_percpu(struct tcp_md5sig_pool);
+-	if (!pool)
+-		return NULL;
+-
+-	for_each_possible_cpu(cpu) {
+-		struct crypto_hash *hash;
++	if (unlikely(!tcp_md5sig_pool_populated)) {
++		mutex_lock(&tcp_md5sig_mutex);
+ 
+-		hash = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC);
+-		if (!hash || IS_ERR(hash))
+-			goto out_free;
++		if (!tcp_md5sig_pool_populated)
++			__tcp_alloc_md5sig_pool();
+ 
+-		per_cpu_ptr(pool, cpu)->md5_desc.tfm = hash;
++		mutex_unlock(&tcp_md5sig_mutex);
+ 	}
+-	return pool;
+-out_free:
+-	__tcp_free_md5sig_pool(pool);
+-	return NULL;
+-}
+-
+-struct tcp_md5sig_pool __percpu *tcp_alloc_md5sig_pool(struct sock *sk)
+-{
+-	struct tcp_md5sig_pool __percpu *pool;
+-	int alloc = 0;
+-
+-retry:
+-	spin_lock_bh(&tcp_md5sig_pool_lock);
+-	pool = tcp_md5sig_pool;
+-	if (tcp_md5sig_users++ == 0) {
+-		alloc = 1;
+-		spin_unlock_bh(&tcp_md5sig_pool_lock);
+-	} else if (!pool) {
+-		tcp_md5sig_users--;
+-		spin_unlock_bh(&tcp_md5sig_pool_lock);
+-		cpu_relax();
+-		goto retry;
+-	} else
+-		spin_unlock_bh(&tcp_md5sig_pool_lock);
+-
+-	if (alloc) {
+-		/* we cannot hold spinlock here because this may sleep. */
+-		struct tcp_md5sig_pool __percpu *p;
+-
+-		p = __tcp_alloc_md5sig_pool(sk);
+-		spin_lock_bh(&tcp_md5sig_pool_lock);
+-		if (!p) {
+-			tcp_md5sig_users--;
+-			spin_unlock_bh(&tcp_md5sig_pool_lock);
+-			return NULL;
+-		}
+-		pool = tcp_md5sig_pool;
+-		if (pool) {
+-			/* oops, it has already been assigned. */
+-			spin_unlock_bh(&tcp_md5sig_pool_lock);
+-			__tcp_free_md5sig_pool(p);
+-		} else {
+-			tcp_md5sig_pool = pool = p;
+-			spin_unlock_bh(&tcp_md5sig_pool_lock);
+-		}
+-	}
+-	return pool;
++	return tcp_md5sig_pool_populated;
+ }
+ EXPORT_SYMBOL(tcp_alloc_md5sig_pool);
+ 
+@@ -2974,31 +2912,18 @@ EXPORT_SYMBOL(tcp_alloc_md5sig_pool);
+  */
+ struct tcp_md5sig_pool *tcp_get_md5sig_pool(void)
+ {
+-	struct tcp_md5sig_pool __percpu *p;
+-
+ 	local_bh_disable();
+ 
+-	spin_lock(&tcp_md5sig_pool_lock);
+-	p = tcp_md5sig_pool;
+-	if (p)
+-		tcp_md5sig_users++;
+-	spin_unlock(&tcp_md5sig_pool_lock);
+-
+-	if (p)
+-		return this_cpu_ptr(p);
+-
++	if (tcp_md5sig_pool_populated) {
++		/* coupled with smp_wmb() in __tcp_alloc_md5sig_pool() */
++		smp_rmb();
++		return this_cpu_ptr(&tcp_md5sig_pool);
++	}
+ 	local_bh_enable();
+ 	return NULL;
+ }
+ EXPORT_SYMBOL(tcp_get_md5sig_pool);
+ 
+-void tcp_put_md5sig_pool(void)
+-{
+-	local_bh_enable();
+-	tcp_free_md5sig_pool();
+-}
+-EXPORT_SYMBOL(tcp_put_md5sig_pool);
+-
+ int tcp_md5_hash_header(struct tcp_md5sig_pool *hp,
+ 			const struct tcphdr *th)
+ {
+diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
+index 26eb8e2..b4e0eb4 100644
+--- a/net/ipv4/tcp_ipv4.c
++++ b/net/ipv4/tcp_ipv4.c
+@@ -938,8 +938,7 @@ int tcp_v4_md5_do_add(struct sock *sk, __be32 addr,
+ 		}
+ 
+ 		md5sig = tp->md5sig_info;
+-		if (md5sig->entries4 == 0 &&
+-		    tcp_alloc_md5sig_pool(sk) == NULL) {
++		if (md5sig->entries4 == 0 && !tcp_alloc_md5sig_pool()) {
+ 			kfree(newkey);
+ 			return -ENOMEM;
+ 		}
+@@ -949,8 +948,6 @@ int tcp_v4_md5_do_add(struct sock *sk, __be32 addr,
+ 					(md5sig->entries4 + 1)), GFP_ATOMIC);
+ 			if (!keys) {
+ 				kfree(newkey);
+-				if (md5sig->entries4 == 0)
+-					tcp_free_md5sig_pool();
+ 				return -ENOMEM;
+ 			}
+ 
+@@ -994,7 +991,6 @@ int tcp_v4_md5_do_del(struct sock *sk, __be32 addr)
+ 				kfree(tp->md5sig_info->keys4);
+ 				tp->md5sig_info->keys4 = NULL;
+ 				tp->md5sig_info->alloced4 = 0;
+-				tcp_free_md5sig_pool();
+ 			} else if (tp->md5sig_info->entries4 != i) {
+ 				/* Need to do some manipulation */
+ 				memmove(&tp->md5sig_info->keys4[i],
+@@ -1022,7 +1018,6 @@ static void tcp_v4_clear_md5_list(struct sock *sk)
+ 		for (i = 0; i < tp->md5sig_info->entries4; i++)
+ 			kfree(tp->md5sig_info->keys4[i].base.key);
+ 		tp->md5sig_info->entries4 = 0;
+-		tcp_free_md5sig_pool();
+ 	}
+ 	if (tp->md5sig_info->keys4) {
+ 		kfree(tp->md5sig_info->keys4);
+diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c
+index 66363b6..00e1530 100644
+--- a/net/ipv4/tcp_minisocks.c
++++ b/net/ipv4/tcp_minisocks.c
+@@ -365,7 +365,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
+ 			if (key != NULL) {
+ 				memcpy(&tcptw->tw_md5_key, key->key, key->keylen);
+ 				tcptw->tw_md5_keylen = key->keylen;
+-				if (tcp_alloc_md5sig_pool(sk) == NULL)
++				if (!tcp_alloc_md5sig_pool())
+ 					BUG();
+ 			}
+ 		} while (0);
+@@ -403,11 +403,6 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
+ 
+ void tcp_twsk_destructor(struct sock *sk)
+ {
+-#ifdef CONFIG_TCP_MD5SIG
+-	struct tcp_timewait_sock *twsk = tcp_twsk(sk);
+-	if (twsk->tw_md5_keylen)
+-		tcp_free_md5sig_pool();
+-#endif
+ }
+ EXPORT_SYMBOL_GPL(tcp_twsk_destructor);
+ 
+diff --git a/net/ipv6/Makefile b/net/ipv6/Makefile
+index 686934a..4b20d56 100644
+--- a/net/ipv6/Makefile
++++ b/net/ipv6/Makefile
+@@ -37,6 +37,6 @@ obj-$(CONFIG_NETFILTER)	+= netfilter/
+ obj-$(CONFIG_IPV6_SIT) += sit.o
+ obj-$(CONFIG_IPV6_TUNNEL) += ip6_tunnel.o
+ 
+-obj-y += addrconf_core.o exthdrs_core.o
++obj-y += addrconf_core.o exthdrs_core.o output_core.o
+ 
+ obj-$(subst m,y,$(CONFIG_IPV6)) += inet6_hashtables.o
+diff --git a/net/ipv6/output_core.c b/net/ipv6/output_core.c
+new file mode 100644
+index 0000000..a6126c6
+--- /dev/null
++++ b/net/ipv6/output_core.c
+@@ -0,0 +1,38 @@
++#include <linux/export.h>
++#include <linux/skbuff.h>
++#include <net/ip.h>
++#include <net/ipv6.h>
++
++/* This function exists only for tap drivers that must support broken
++ * clients requesting UFO without specifying an IPv6 fragment ID.
++ *
++ * This is similar to ipv6_select_ident() but we use an independent hash
++ * seed to limit information leakage.
++ */
++void ipv6_proxy_select_ident(struct sk_buff *skb)
++{
++	static u32 ip6_proxy_idents_hashrnd __read_mostly;
++	static bool hashrnd_initialized = false;
++	struct in6_addr buf[2];
++	struct in6_addr *addrs;
++	u32 hash, id;
++
++	addrs = skb_header_pointer(skb,
++				   skb_network_offset(skb) +
++				   offsetof(struct ipv6hdr, saddr),
++				   sizeof(buf), buf);
++	if (!addrs)
++		return;
++
++	if (unlikely(!hashrnd_initialized)) {
++		hashrnd_initialized = true;
++		get_random_bytes(&ip6_proxy_idents_hashrnd,
++				 sizeof(ip6_proxy_idents_hashrnd));
++	}
++	hash = __ipv6_addr_jhash(&addrs[1], ip6_proxy_idents_hashrnd);
++	hash = __ipv6_addr_jhash(&addrs[0], hash);
++
++	id = ip_idents_reserve(hash, 1);
++	skb_shinfo(skb)->ip6_frag_id = htonl(id);
++}
++EXPORT_SYMBOL_GPL(ipv6_proxy_select_ident);
+diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
+index 057a9d2..655cc60 100644
+--- a/net/ipv6/tcp_ipv6.c
++++ b/net/ipv6/tcp_ipv6.c
+@@ -592,7 +592,7 @@ static int tcp_v6_md5_do_add(struct sock *sk, const struct in6_addr *peer,
+ 			sk_nocaps_add(sk, NETIF_F_GSO_MASK);
+ 		}
+ 		if (tp->md5sig_info->entries6 == 0 &&
+-			tcp_alloc_md5sig_pool(sk) == NULL) {
++		    !tcp_alloc_md5sig_pool()) {
+ 			kfree(newkey);
+ 			return -ENOMEM;
+ 		}
+@@ -602,8 +602,6 @@ static int tcp_v6_md5_do_add(struct sock *sk, const struct in6_addr *peer,
+ 
+ 			if (!keys) {
+ 				kfree(newkey);
+-				if (tp->md5sig_info->entries6 == 0)
+-					tcp_free_md5sig_pool();
+ 				return -ENOMEM;
+ 			}
+ 
+@@ -649,7 +647,6 @@ static int tcp_v6_md5_do_del(struct sock *sk, const struct in6_addr *peer)
+ 				kfree(tp->md5sig_info->keys6);
+ 				tp->md5sig_info->keys6 = NULL;
+ 				tp->md5sig_info->alloced6 = 0;
+-				tcp_free_md5sig_pool();
+ 			} else {
+ 				/* shrink the database */
+ 				if (tp->md5sig_info->entries6 != i)
+@@ -673,7 +670,6 @@ static void tcp_v6_clear_md5_list (struct sock *sk)
+ 		for (i = 0; i < tp->md5sig_info->entries6; i++)
+ 			kfree(tp->md5sig_info->keys6[i].base.key);
+ 		tp->md5sig_info->entries6 = 0;
+-		tcp_free_md5sig_pool();
+ 	}
+ 
+ 	kfree(tp->md5sig_info->keys6);
+@@ -684,7 +680,6 @@ static void tcp_v6_clear_md5_list (struct sock *sk)
+ 		for (i = 0; i < tp->md5sig_info->entries4; i++)
+ 			kfree(tp->md5sig_info->keys4[i].base.key);
+ 		tp->md5sig_info->entries4 = 0;
+-		tcp_free_md5sig_pool();
+ 	}
+ 
+ 	kfree(tp->md5sig_info->keys4);
+diff --git a/net/sctp/auth.c b/net/sctp/auth.c
+index 333926d..53d455c 100644
+--- a/net/sctp/auth.c
++++ b/net/sctp/auth.c
+@@ -866,8 +866,6 @@ int sctp_auth_set_key(struct sctp_endpoint *ep,
+ 		list_add(&cur_key->key_list, sh_keys);
+ 
+ 	cur_key->key = key;
+-	sctp_auth_key_hold(key);
+-
+ 	return 0;
+ nomem:
+ 	if (!replace)
+diff --git a/net/sctp/output.c b/net/sctp/output.c
+index 5bd9aa9..c3b8549 100644
+--- a/net/sctp/output.c
++++ b/net/sctp/output.c
+@@ -384,12 +384,12 @@ int sctp_packet_transmit(struct sctp_packet *packet)
+ 	sk = chunk->skb->sk;
+ 
+ 	/* Allocate the new skb.  */
+-	nskb = alloc_skb(packet->size + LL_MAX_HEADER, GFP_ATOMIC);
++	nskb = alloc_skb(packet->size + MAX_HEADER, GFP_ATOMIC);
+ 	if (!nskb)
+ 		goto nomem;
+ 
+ 	/* Make sure the outbound skb has enough header room reserved. */
+-	skb_reserve(nskb, packet->overhead + LL_MAX_HEADER);
++	skb_reserve(nskb, packet->overhead + MAX_HEADER);
+ 
+ 	/* Set the owning socket so that we know where to get the
+ 	 * destination IP address.
+diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
+index d8d4704..c40952c 100644
+--- a/net/sctp/sm_make_chunk.c
++++ b/net/sctp/sm_make_chunk.c
+@@ -2570,6 +2570,9 @@ do_addr_param:
+ 		addr_param = param.v + sizeof(sctp_addip_param_t);
+ 
+ 		af = sctp_get_af_specific(param_type2af(param.p->type));
++		if (af == NULL)
++			break;
++
+ 		af->from_addr_param(&addr, addr_param,
+ 				    htons(asoc->peer.port), 0);
+ 
+diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
+index b4f802d..4dd8dcf 100644
+--- a/security/selinux/selinuxfs.c
++++ b/security/selinux/selinuxfs.c
+@@ -1197,7 +1197,7 @@ static void sel_remove_entries(struct dentry *de)
+ 	spin_lock(&de->d_lock);
+ 	node = de->d_subdirs.next;
+ 	while (node != &de->d_subdirs) {
+-		struct dentry *d = list_entry(node, struct dentry, d_u.d_child);
++		struct dentry *d = list_entry(node, struct dentry, d_child);
+ 
+ 		spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED);
+ 		list_del_init(node);
+@@ -1704,12 +1704,12 @@ static void sel_remove_classes(void)
+ 
+ 	list_for_each(class_node, &class_dir->d_subdirs) {
+ 		struct dentry *class_subdir = list_entry(class_node,
+-					struct dentry, d_u.d_child);
++					struct dentry, d_child);
+ 		struct list_head *class_subdir_node;
+ 
+ 		list_for_each(class_subdir_node, &class_subdir->d_subdirs) {
+ 			struct dentry *d = list_entry(class_subdir_node,
+-						struct dentry, d_u.d_child);
++						struct dentry, d_child);
+ 
+ 			if (d->d_inode)
+ 				if (d->d_inode->i_mode & S_IFDIR)

diff --git a/3.2.65/4420_grsecurity-3.0-3.2.65-201412280855.patch b/3.2.66/4420_grsecurity-3.0-3.2.65-201412280855.patch
similarity index 100%
rename from 3.2.65/4420_grsecurity-3.0-3.2.65-201412280855.patch
rename to 3.2.66/4420_grsecurity-3.0-3.2.65-201412280855.patch

diff --git a/3.2.65/4425_grsec_remove_EI_PAX.patch b/3.2.66/4425_grsec_remove_EI_PAX.patch
similarity index 100%
rename from 3.2.65/4425_grsec_remove_EI_PAX.patch
rename to 3.2.66/4425_grsec_remove_EI_PAX.patch

diff --git a/3.2.65/4427_force_XATTR_PAX_tmpfs.patch b/3.2.66/4427_force_XATTR_PAX_tmpfs.patch
similarity index 100%
rename from 3.2.65/4427_force_XATTR_PAX_tmpfs.patch
rename to 3.2.66/4427_force_XATTR_PAX_tmpfs.patch

diff --git a/3.2.65/4430_grsec-remove-localversion-grsec.patch b/3.2.66/4430_grsec-remove-localversion-grsec.patch
similarity index 100%
rename from 3.2.65/4430_grsec-remove-localversion-grsec.patch
rename to 3.2.66/4430_grsec-remove-localversion-grsec.patch

diff --git a/3.2.65/4435_grsec-mute-warnings.patch b/3.2.66/4435_grsec-mute-warnings.patch
similarity index 100%
rename from 3.2.65/4435_grsec-mute-warnings.patch
rename to 3.2.66/4435_grsec-mute-warnings.patch

diff --git a/3.2.65/4440_grsec-remove-protected-paths.patch b/3.2.66/4440_grsec-remove-protected-paths.patch
similarity index 100%
rename from 3.2.65/4440_grsec-remove-protected-paths.patch
rename to 3.2.66/4440_grsec-remove-protected-paths.patch

diff --git a/3.2.65/4450_grsec-kconfig-default-gids.patch b/3.2.66/4450_grsec-kconfig-default-gids.patch
similarity index 100%
rename from 3.2.65/4450_grsec-kconfig-default-gids.patch
rename to 3.2.66/4450_grsec-kconfig-default-gids.patch

diff --git a/3.2.65/4465_selinux-avc_audit-log-curr_ip.patch b/3.2.66/4465_selinux-avc_audit-log-curr_ip.patch
similarity index 100%
rename from 3.2.65/4465_selinux-avc_audit-log-curr_ip.patch
rename to 3.2.66/4465_selinux-avc_audit-log-curr_ip.patch

diff --git a/3.2.65/4470_disable-compat_vdso.patch b/3.2.66/4470_disable-compat_vdso.patch
similarity index 100%
rename from 3.2.65/4470_disable-compat_vdso.patch
rename to 3.2.66/4470_disable-compat_vdso.patch

diff --git a/3.2.65/4475_emutramp_default_on.patch b/3.2.66/4475_emutramp_default_on.patch
similarity index 100%
rename from 3.2.65/4475_emutramp_default_on.patch
rename to 3.2.66/4475_emutramp_default_on.patch


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2015-01-02 16:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-02 16:00 [gentoo-commits] proj/hardened-patchset:master commit in: 3.2.66/, 3.2.65/ Anthony G. Basile

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox