kernel: add support for 3.8-rc2
Signed-off-by: Florian Fainelli <florian@openwrt.org> SVN-Revision: 35055
This commit is contained in:
		
							
								
								
									
										3725
									
								
								target/linux/generic/config-3.8
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3725
									
								
								target/linux/generic/config-3.8
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -161,7 +161,13 @@ struct ocf_device {
 | 
				
			|||||||
	sigemptyset(¤t->blocked); \
 | 
						sigemptyset(¤t->blocked); \
 | 
				
			||||||
	recalc_sigpending(current); \
 | 
						recalc_sigpending(current); \
 | 
				
			||||||
	spin_unlock_irq(¤t->sigmask_lock); \
 | 
						spin_unlock_irq(¤t->sigmask_lock); \
 | 
				
			||||||
	sprintf(current->comm, str);
 | 
						sprintf(current->comm, str); \
 | 
				
			||||||
 | 
					#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0) \
 | 
				
			||||||
 | 
						spin_lock_irq(¤t->sigmask_lock); \
 | 
				
			||||||
 | 
						sigemptyset(¤t->blocked); \
 | 
				
			||||||
 | 
						recalc_sigpending(current); \
 | 
				
			||||||
 | 
						spin_unlock_irq(¤t->sigmask_lock); \
 | 
				
			||||||
 | 
						sprintf(current->comm, str); \
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#define ocf_daemonize(str) daemonize(str);
 | 
					#define ocf_daemonize(str) daemonize(str);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -198,6 +198,9 @@ random_proc(void *arg)
 | 
				
			|||||||
	recalc_sigpending(current);
 | 
						recalc_sigpending(current);
 | 
				
			||||||
	spin_unlock_irq(¤t->sigmask_lock);
 | 
						spin_unlock_irq(¤t->sigmask_lock);
 | 
				
			||||||
	sprintf(current->comm, "ocf-random");
 | 
						sprintf(current->comm, "ocf-random");
 | 
				
			||||||
 | 
					#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)
 | 
				
			||||||
 | 
						recalc_sigpending();
 | 
				
			||||||
 | 
						sprintf(current->comm, "ocf-random");
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	daemonize("ocf-random");
 | 
						daemonize("ocf-random");
 | 
				
			||||||
	allow_signal(SIGKILL);
 | 
						allow_signal(SIGKILL);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					From 7a70ff39328cd24b9c7db11eb4ae1a18c698a538 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Florian Fainelli <florian@openwrt.org>
 | 
				
			||||||
 | 
					Date: Mon, 7 Jan 2013 14:26:15 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH] sctp: fix typo in default SCTP cookie choice
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Commit 0d0863b0 (sctp: Change defaults on cookie hmac selection)
 | 
				
			||||||
 | 
					introduced a choice configuration option to select the default SCTP
 | 
				
			||||||
 | 
					cookie hashing algorithm, a typo was introduced for the default choice.
 | 
				
			||||||
 | 
					This is an issue when running make oldconfig because an explicit choice
 | 
				
			||||||
 | 
					number must be entered since no default is available. This patch fixes
 | 
				
			||||||
 | 
					the typo, thus providing a valid default choice.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Florian Fainelli <florian@openwrt.org>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 net/sctp/Kconfig |    2 +-
 | 
				
			||||||
 | 
					 1 file changed, 1 insertion(+), 1 deletion(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					diff --git a/net/sctp/Kconfig b/net/sctp/Kconfig
 | 
				
			||||||
 | 
					index c262106..7521d94 100644
 | 
				
			||||||
 | 
					--- a/net/sctp/Kconfig
 | 
				
			||||||
 | 
					+++ b/net/sctp/Kconfig
 | 
				
			||||||
 | 
					@@ -68,7 +68,7 @@ config SCTP_DBG_OBJCNT
 | 
				
			||||||
 | 
					 	  If unsure, say N
 | 
				
			||||||
 | 
					 choice
 | 
				
			||||||
 | 
					 	prompt "Default SCTP cookie HMAC encoding"
 | 
				
			||||||
 | 
					-	default SCTP_COOKIE_HMAC_MD5
 | 
				
			||||||
 | 
					+	default SCTP_DEFAULT_COOKIE_HMAC_MD5
 | 
				
			||||||
 | 
					 	help
 | 
				
			||||||
 | 
					 	  This option sets the default sctp cookie hmac algorithm
 | 
				
			||||||
 | 
					 	  when in doubt select 'md5'
 | 
				
			||||||
 | 
					-- 
 | 
				
			||||||
 | 
					1.7.10.4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										36
									
								
								target/linux/generic/patches-3.8/060-hso_devices.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								target/linux/generic/patches-3.8/060-hso_devices.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					--- a/drivers/net/usb/hso.c
 | 
				
			||||||
 | 
					+++ b/drivers/net/usb/hso.c
 | 
				
			||||||
 | 
					@@ -468,8 +468,10 @@ static const struct usb_device_id hso_id
 | 
				
			||||||
 | 
					 	{USB_DEVICE(0x0af0, 0x8400)},
 | 
				
			||||||
 | 
					 	{USB_DEVICE(0x0af0, 0x8600)},
 | 
				
			||||||
 | 
					 	{USB_DEVICE(0x0af0, 0x8800)},
 | 
				
			||||||
 | 
					-	{USB_DEVICE(0x0af0, 0x8900)},
 | 
				
			||||||
 | 
					-	{USB_DEVICE(0x0af0, 0x9000)},
 | 
				
			||||||
 | 
					+	{USB_DEVICE(0x0af0, 0x8900)},  /* GTM 67xx */
 | 
				
			||||||
 | 
					+	{USB_DEVICE(0x0af0, 0x9000)},  /* GTM 66xx */
 | 
				
			||||||
 | 
					+	{USB_DEVICE(0x0af0, 0x9200)},  /* GTM 67xxWFS */
 | 
				
			||||||
 | 
					+	{USB_DEVICE(0x0af0, 0x9300)},  /* GTM 66xxWFS */
 | 
				
			||||||
 | 
					 	{USB_DEVICE(0x0af0, 0xd035)},
 | 
				
			||||||
 | 
					 	{USB_DEVICE(0x0af0, 0xd055)},
 | 
				
			||||||
 | 
					 	{USB_DEVICE(0x0af0, 0xd155)},
 | 
				
			||||||
 | 
					--- a/drivers/usb/storage/unusual_devs.h
 | 
				
			||||||
 | 
					+++ b/drivers/usb/storage/unusual_devs.h
 | 
				
			||||||
 | 
					@@ -1237,6 +1237,18 @@ UNUSUAL_DEV( 0x0af0, 0x8304, 0x0000, 0x0
 | 
				
			||||||
 | 
					 		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
 | 
				
			||||||
 | 
					 		0 ),
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+UNUSUAL_DEV( 0x0af0, 0x9200, 0x0000, 0x0000,
 | 
				
			||||||
 | 
					+		"Option",
 | 
				
			||||||
 | 
					+		"Globetrotter 67xxWFS SD-Card",
 | 
				
			||||||
 | 
					+		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
 | 
				
			||||||
 | 
					+		0 ),
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+UNUSUAL_DEV( 0x0af0, 0x9300, 0x0000, 0x0000,
 | 
				
			||||||
 | 
					+		"Option",
 | 
				
			||||||
 | 
					+		"Globetrotter 66xxWFS SD-Card",
 | 
				
			||||||
 | 
					+		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
 | 
				
			||||||
 | 
					+		0 ),
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 UNUSUAL_DEV( 0x0af0, 0xc100, 0x0000, 0x0000,
 | 
				
			||||||
 | 
					 		"Option",
 | 
				
			||||||
 | 
					 		"GI 070x SD-Card",
 | 
				
			||||||
@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					--- a/arch/arm/boot/compressed/decompress.c
 | 
				
			||||||
 | 
					+++ b/arch/arm/boot/compressed/decompress.c
 | 
				
			||||||
 | 
					@@ -50,6 +50,7 @@ extern char * strstr(const char * s1, co
 | 
				
			||||||
 | 
					 #ifdef CONFIG_KERNEL_XZ
 | 
				
			||||||
 | 
					 #define memmove memmove
 | 
				
			||||||
 | 
					 #define memcpy memcpy
 | 
				
			||||||
 | 
					+extern char * strstr(const char *, const char *);
 | 
				
			||||||
 | 
					 #include "../../../../lib/decompress_unxz.c"
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
@@ -0,0 +1,66 @@
 | 
				
			|||||||
 | 
					From 0db3db45f5bd6df4bdc03bbd5dec672e16164c4e Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Florian Fainelli <florian@openwrt.org>
 | 
				
			||||||
 | 
					Date: Mon, 12 Nov 2012 12:31:55 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH] MIPS: decompressor: fix build failure on memcpy() in
 | 
				
			||||||
 | 
					 decompress.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The decompress.c file includes linux/kernel.h which causes the following
 | 
				
			||||||
 | 
					inclusion chain to be pulled:
 | 
				
			||||||
 | 
					linux/kernel.h ->
 | 
				
			||||||
 | 
						linux/dynamic_debug.h ->
 | 
				
			||||||
 | 
							linux/string.h ->
 | 
				
			||||||
 | 
								asm/string.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We end up having a the GCC builtin + architecture specific memcpy() expanding
 | 
				
			||||||
 | 
					into this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void *({ size_t __len = (size_t n); void *__ret; if
 | 
				
			||||||
 | 
					(__builtin_constant_p(size_t n) && __len >= 64) __ret = memcpy((void *dest),
 | 
				
			||||||
 | 
					(const void *src), __len); else __ret = __builtin_memcpy((void *dest), (const
 | 
				
			||||||
 | 
					void *src), __len); __ret; })
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 [memcpy implementation in decompress.c starts here]
 | 
				
			||||||
 | 
					 int i;
 | 
				
			||||||
 | 
					 const char *s = src;
 | 
				
			||||||
 | 
					 char *d = dest;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 for (i = 0; i < n; i++)
 | 
				
			||||||
 | 
					  d[i] = s[i];
 | 
				
			||||||
 | 
					 return dest;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					raising the following compilation error:
 | 
				
			||||||
 | 
					arch/mips/boot/compressed/decompress.c:46:8: error: expected identifier or '('
 | 
				
			||||||
 | 
					before '{' token
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					There are at least three possibilities to fix this issue:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1) define _LINUX_STRING_H_ at the beginning of decompress.c to prevent
 | 
				
			||||||
 | 
					   further linux/string.h definitions and declarations from being used, and add
 | 
				
			||||||
 | 
					   an explicit strstr() declaration for linux/dynamic_debug.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2) remove the inclusion of linux/kernel.h because we actually use no definition
 | 
				
			||||||
 | 
					   or declaration from this header file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3) undefine memcpy or re-define memcpy to memcpy thus resulting in picking up
 | 
				
			||||||
 | 
					   the local memcpy() implementation to this compilation unit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This patch uses the second option which is the less intrusive one.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Florian Fainelli <florian@openwrt.org>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 arch/mips/boot/compressed/decompress.c |    2 --
 | 
				
			||||||
 | 
					 1 file changed, 2 deletions(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/arch/mips/boot/compressed/decompress.c
 | 
				
			||||||
 | 
					+++ b/arch/mips/boot/compressed/decompress.c
 | 
				
			||||||
 | 
					@@ -10,9 +10,7 @@
 | 
				
			||||||
 | 
					  * Free Software Foundation;  either version 2 of the  License, or (at your
 | 
				
			||||||
 | 
					  * option) any later version.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 #include <linux/types.h>
 | 
				
			||||||
 | 
					-#include <linux/kernel.h>
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #include <asm/addrspace.h>
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					From 031d8ad2c3cee85c515e551fc8c0054bdedb7b8b Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Florian Fainelli <florian@openwrt.org>
 | 
				
			||||||
 | 
					Date: Thu, 13 Dec 2012 18:02:11 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH] x86: fix perf build with uclibc toolchains
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					libio.h is not provided by uClibc, in order to be able to test the
 | 
				
			||||||
 | 
					definition of __UCLIBC__ we need to include stdlib.h, which also
 | 
				
			||||||
 | 
					includes stddef.h, providing the definition of 'NULL'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Florian Fainelli <florian@openwrt.org>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 tools/perf/arch/x86/util/dwarf-regs.c |    3 +++
 | 
				
			||||||
 | 
					 1 file changed, 3 insertions(+)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/tools/perf/arch/x86/util/dwarf-regs.c
 | 
				
			||||||
 | 
					+++ b/tools/perf/arch/x86/util/dwarf-regs.c
 | 
				
			||||||
 | 
					@@ -20,7 +20,10 @@
 | 
				
			||||||
 | 
					  *
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#include <stdlib.h>
 | 
				
			||||||
 | 
					+#ifndef __UCLIBC__
 | 
				
			||||||
 | 
					 #include <libio.h>
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 #include <dwarf-regs.h>
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
							
								
								
									
										3191
									
								
								target/linux/generic/patches-3.8/100-overlayfs.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3191
									
								
								target/linux/generic/patches-3.8/100-overlayfs.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					--- a/drivers/usb/host/ehci-hcd.c
 | 
				
			||||||
 | 
					+++ b/drivers/usb/host/ehci-hcd.c
 | 
				
			||||||
 | 
					@@ -634,7 +634,7 @@ static int ehci_run (struct usb_hcd *hcd
 | 
				
			||||||
 | 
					 		"USB %x.%x started, EHCI %x.%02x%s\n",
 | 
				
			||||||
 | 
					 		((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f),
 | 
				
			||||||
 | 
					 		temp >> 8, temp & 0xff,
 | 
				
			||||||
 | 
					-		ignore_oc ? ", overcurrent ignored" : "");
 | 
				
			||||||
 | 
					+		(ignore_oc || ehci->ignore_oc) ? ", overcurrent ignored" : "");
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	ehci_writel(ehci, INTR_MASK,
 | 
				
			||||||
 | 
					 		    &ehci->regs->intr_enable); /* Turn On Interrupts */
 | 
				
			||||||
 | 
					--- a/drivers/usb/host/ehci-hub.c
 | 
				
			||||||
 | 
					+++ b/drivers/usb/host/ehci-hub.c
 | 
				
			||||||
 | 
					@@ -611,7 +611,7 @@ ehci_hub_status_data (struct usb_hcd *hc
 | 
				
			||||||
 | 
					 	 * always set, seem to clear PORT_OCC and PORT_CSC when writing to
 | 
				
			||||||
 | 
					 	 * PORT_POWER; that's surprising, but maybe within-spec.
 | 
				
			||||||
 | 
					 	 */
 | 
				
			||||||
 | 
					-	if (!ignore_oc)
 | 
				
			||||||
 | 
					+	if (!ignore_oc && !ehci->ignore_oc)
 | 
				
			||||||
 | 
					 		mask = PORT_CSC | PORT_PEC | PORT_OCC;
 | 
				
			||||||
 | 
					 	else
 | 
				
			||||||
 | 
					 		mask = PORT_CSC | PORT_PEC;
 | 
				
			||||||
 | 
					@@ -825,7 +825,7 @@ static int ehci_hub_control (
 | 
				
			||||||
 | 
					 		if (temp & PORT_PEC)
 | 
				
			||||||
 | 
					 			status |= USB_PORT_STAT_C_ENABLE << 16;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-		if ((temp & PORT_OCC) && !ignore_oc){
 | 
				
			||||||
 | 
					+		if ((temp & PORT_OCC) && (!ignore_oc && !ehci->ignore_oc)){
 | 
				
			||||||
 | 
					 			status |= USB_PORT_STAT_C_OVERCURRENT << 16;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 			/*
 | 
				
			||||||
 | 
					--- a/drivers/usb/host/ehci.h
 | 
				
			||||||
 | 
					+++ b/drivers/usb/host/ehci.h
 | 
				
			||||||
 | 
					@@ -196,6 +196,7 @@ struct ehci_hcd {			/* one per controlle
 | 
				
			||||||
 | 
					 	unsigned		use_dummy_qh:1;	/* AMD Frame List table quirk*/
 | 
				
			||||||
 | 
					 	unsigned		has_synopsys_hc_bug:1; /* Synopsys HC */
 | 
				
			||||||
 | 
					 	unsigned		frame_index_bug:1; /* MosChip (AKA NetMos) */
 | 
				
			||||||
 | 
					+	unsigned		ignore_oc:1;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* required for usb32 quirk */
 | 
				
			||||||
 | 
					 	#define OHCI_CTRL_HCFS          (3 << 6)
 | 
				
			||||||
							
								
								
									
										10
									
								
								target/linux/generic/patches-3.8/110-fix_mtd_include.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								target/linux/generic/patches-3.8/110-fix_mtd_include.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					--- a/include/linux/mtd/physmap.h
 | 
				
			||||||
 | 
					+++ b/include/linux/mtd/physmap.h
 | 
				
			||||||
 | 
					@@ -17,6 +17,7 @@
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #include <linux/mtd/mtd.h>
 | 
				
			||||||
 | 
					 #include <linux/mtd/partitions.h>
 | 
				
			||||||
 | 
					+#include <linux/platform_device.h>
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 struct map_info;
 | 
				
			||||||
 | 
					 struct platform_device;
 | 
				
			||||||
							
								
								
									
										11
									
								
								target/linux/generic/patches-3.8/200-fix_localversion.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								target/linux/generic/patches-3.8/200-fix_localversion.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					--- a/scripts/setlocalversion
 | 
				
			||||||
 | 
					+++ b/scripts/setlocalversion
 | 
				
			||||||
 | 
					@@ -167,7 +167,7 @@ else
 | 
				
			||||||
 | 
					 	# annotated or signed tagged state (as git describe only
 | 
				
			||||||
 | 
					 	# looks at signed or annotated tags - git tag -a/-s) and
 | 
				
			||||||
 | 
					 	# LOCALVERSION= is not specified
 | 
				
			||||||
 | 
					-	if test "${LOCALVERSION+set}" != "set"; then
 | 
				
			||||||
 | 
					+	if test "${CONFIG_LOCALVERSION+set}" != "set"; then
 | 
				
			||||||
 | 
					 		scm=$(scm_version --short)
 | 
				
			||||||
 | 
					 		res="$res${scm:++}"
 | 
				
			||||||
 | 
					 	fi
 | 
				
			||||||
@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					--- a/Makefile
 | 
				
			||||||
 | 
					+++ b/Makefile
 | 
				
			||||||
 | 
					@@ -570,9 +570,9 @@ endif # $(dot-config)
 | 
				
			||||||
 | 
					 all: vmlinux
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
 | 
				
			||||||
 | 
					-KBUILD_CFLAGS	+= -Os
 | 
				
			||||||
 | 
					+KBUILD_CFLAGS	+= -Os -fno-caller-saves
 | 
				
			||||||
 | 
					 else
 | 
				
			||||||
 | 
					-KBUILD_CFLAGS	+= -O2
 | 
				
			||||||
 | 
					+KBUILD_CFLAGS	+= -O2 -fno-reorder-blocks -fno-tree-ch -fno-caller-saves
 | 
				
			||||||
 | 
					 endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 include $(srctree)/arch/$(SRCARCH)/Makefile
 | 
				
			||||||
 | 
					@@ -645,6 +645,9 @@ endif
 | 
				
			||||||
 | 
					 NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
 | 
				
			||||||
 | 
					 CHECKFLAGS     += $(NOSTDINC_FLAGS)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+# improve gcc optimization
 | 
				
			||||||
 | 
					+CFLAGS += $(call cc-option,-funit-at-a-time,)
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 # warn about C99 declaration after statement
 | 
				
			||||||
 | 
					 KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					--- a/Makefile
 | 
				
			||||||
 | 
					+++ b/Makefile
 | 
				
			||||||
 | 
					@@ -379,7 +379,7 @@ KBUILD_CFLAGS_KERNEL :=
 | 
				
			||||||
 | 
					 KBUILD_AFLAGS   := -D__ASSEMBLY__
 | 
				
			||||||
 | 
					 KBUILD_AFLAGS_MODULE  := -DMODULE
 | 
				
			||||||
 | 
					 KBUILD_CFLAGS_MODULE  := -DMODULE
 | 
				
			||||||
 | 
					-KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
 | 
				
			||||||
 | 
					+KBUILD_LDFLAGS_MODULE = -T $(srctree)/scripts/module-common.lds $(if $(CONFIG_PROFILING),,-s)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 # Read KERNELRELEASE from include/config/kernel.release (if it exists)
 | 
				
			||||||
 | 
					 KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
 | 
				
			||||||
							
								
								
									
										3088
									
								
								target/linux/generic/patches-3.8/210-darwin_scripts_include.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3088
									
								
								target/linux/generic/patches-3.8/210-darwin_scripts_include.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					--- a/tools/include/tools/be_byteshift.h
 | 
				
			||||||
 | 
					+++ b/tools/include/tools/be_byteshift.h
 | 
				
			||||||
 | 
					@@ -1,7 +1,11 @@
 | 
				
			||||||
 | 
					 #ifndef _TOOLS_BE_BYTESHIFT_H
 | 
				
			||||||
 | 
					 #define _TOOLS_BE_BYTESHIFT_H
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#ifdef __linux__
 | 
				
			||||||
 | 
					 #include <linux/types.h>
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+#include "linux_types.h"
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static inline __u16 __get_unaligned_be16(const __u8 *p)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					--- a/tools/include/tools/le_byteshift.h
 | 
				
			||||||
 | 
					+++ b/tools/include/tools/le_byteshift.h
 | 
				
			||||||
 | 
					@@ -1,7 +1,11 @@
 | 
				
			||||||
 | 
					 #ifndef _TOOLS_LE_BYTESHIFT_H
 | 
				
			||||||
 | 
					 #define _TOOLS_LE_BYTESHIFT_H
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#ifdef __linux__
 | 
				
			||||||
 | 
					 #include <linux/types.h>
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+#include "linux_types.h"
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static inline __u16 __get_unaligned_le16(const __u8 *p)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					--- /dev/null
 | 
				
			||||||
 | 
					+++ b/tools/include/tools/linux_types.h
 | 
				
			||||||
 | 
					@@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					+#ifndef __LINUX_TYPES_H
 | 
				
			||||||
 | 
					+#define __LINUX_TYPES_H
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#include <stdint.h>
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+typedef uint8_t __u8;
 | 
				
			||||||
 | 
					+typedef uint8_t __be8;
 | 
				
			||||||
 | 
					+typedef uint8_t __le8;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+typedef uint16_t __u16;
 | 
				
			||||||
 | 
					+typedef uint16_t __be16;
 | 
				
			||||||
 | 
					+typedef uint16_t __le16;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+typedef uint32_t __u32;
 | 
				
			||||||
 | 
					+typedef uint32_t __be32;
 | 
				
			||||||
 | 
					+typedef uint32_t __le32;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+typedef uint64_t __u64;
 | 
				
			||||||
 | 
					+typedef uint64_t __be64;
 | 
				
			||||||
 | 
					+typedef uint64_t __le64;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
							
								
								
									
										91
									
								
								target/linux/generic/patches-3.8/220-module_exports.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								target/linux/generic/patches-3.8/220-module_exports.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
				
			|||||||
 | 
					--- a/include/asm-generic/vmlinux.lds.h
 | 
				
			||||||
 | 
					+++ b/include/asm-generic/vmlinux.lds.h
 | 
				
			||||||
 | 
					@@ -52,6 +52,18 @@
 | 
				
			||||||
 | 
					 #define LOAD_OFFSET 0
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#ifndef SYMTAB_KEEP_STR
 | 
				
			||||||
 | 
					+#define SYMTAB_KEEP *(SORT(___ksymtab+*))
 | 
				
			||||||
 | 
					+#define SYMTAB_KEEP_GPL *(SORT(___ksymtab_gpl+*))
 | 
				
			||||||
 | 
					+#define SYMTAB_KEEP_STR *(__ksymtab_strings+*)
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#ifndef SYMTAB_DISCARD
 | 
				
			||||||
 | 
					+#define SYMTAB_DISCARD
 | 
				
			||||||
 | 
					+#define SYMTAB_DISCARD_GPL
 | 
				
			||||||
 | 
					+#define SYMTAB_DISCARD_STR
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 #ifndef SYMBOL_PREFIX
 | 
				
			||||||
 | 
					 #define VMLINUX_SYMBOL(sym) sym
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					@@ -276,14 +288,14 @@
 | 
				
			||||||
 | 
					 	/* Kernel symbol table: Normal symbols */			\
 | 
				
			||||||
 | 
					 	__ksymtab         : AT(ADDR(__ksymtab) - LOAD_OFFSET) {		\
 | 
				
			||||||
 | 
					 		VMLINUX_SYMBOL(__start___ksymtab) = .;			\
 | 
				
			||||||
 | 
					-		*(SORT(___ksymtab+*))					\
 | 
				
			||||||
 | 
					+		SYMTAB_KEEP						\
 | 
				
			||||||
 | 
					 		VMLINUX_SYMBOL(__stop___ksymtab) = .;			\
 | 
				
			||||||
 | 
					 	}								\
 | 
				
			||||||
 | 
					 									\
 | 
				
			||||||
 | 
					 	/* Kernel symbol table: GPL-only symbols */			\
 | 
				
			||||||
 | 
					 	__ksymtab_gpl     : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) {	\
 | 
				
			||||||
 | 
					 		VMLINUX_SYMBOL(__start___ksymtab_gpl) = .;		\
 | 
				
			||||||
 | 
					-		*(SORT(___ksymtab_gpl+*))				\
 | 
				
			||||||
 | 
					+		SYMTAB_KEEP_GPL						\
 | 
				
			||||||
 | 
					 		VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .;		\
 | 
				
			||||||
 | 
					 	}								\
 | 
				
			||||||
 | 
					 									\
 | 
				
			||||||
 | 
					@@ -345,7 +357,7 @@
 | 
				
			||||||
 | 
					 									\
 | 
				
			||||||
 | 
					 	/* Kernel symbol table: strings */				\
 | 
				
			||||||
 | 
					         __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) {	\
 | 
				
			||||||
 | 
					-		*(__ksymtab_strings)					\
 | 
				
			||||||
 | 
					+		SYMTAB_KEEP_STR						\
 | 
				
			||||||
 | 
					 	}								\
 | 
				
			||||||
 | 
					 									\
 | 
				
			||||||
 | 
					 	/* __*init sections */						\
 | 
				
			||||||
 | 
					@@ -679,6 +691,9 @@
 | 
				
			||||||
 | 
					 	EXIT_TEXT							\
 | 
				
			||||||
 | 
					 	EXIT_DATA							\
 | 
				
			||||||
 | 
					 	EXIT_CALL							\
 | 
				
			||||||
 | 
					+	SYMTAB_DISCARD							\
 | 
				
			||||||
 | 
					+	SYMTAB_DISCARD_GPL						\
 | 
				
			||||||
 | 
					+	SYMTAB_DISCARD_STR						\
 | 
				
			||||||
 | 
					 	*(.discard)							\
 | 
				
			||||||
 | 
					 	*(.discard.*)							\
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					--- a/include/linux/export.h
 | 
				
			||||||
 | 
					+++ b/include/linux/export.h
 | 
				
			||||||
 | 
					@@ -45,12 +45,19 @@ extern struct module __this_module;
 | 
				
			||||||
 | 
					 #define __CRC_SYMBOL(sym, sec)
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#ifdef MODULE
 | 
				
			||||||
 | 
					+#define __EXPORT_SUFFIX(sym)
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+#define __EXPORT_SUFFIX(sym) "+" #sym
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 /* For every exported symbol, place a struct in the __ksymtab section */
 | 
				
			||||||
 | 
					 #define __EXPORT_SYMBOL(sym, sec)				\
 | 
				
			||||||
 | 
					 	extern typeof(sym) sym;					\
 | 
				
			||||||
 | 
					 	__CRC_SYMBOL(sym, sec)					\
 | 
				
			||||||
 | 
					 	static const char __kstrtab_##sym[]			\
 | 
				
			||||||
 | 
					-	__attribute__((section("__ksymtab_strings"), aligned(1))) \
 | 
				
			||||||
 | 
					+	__attribute__((section("__ksymtab_strings"		\
 | 
				
			||||||
 | 
					+	  __EXPORT_SUFFIX(sym)), aligned(1)))			\
 | 
				
			||||||
 | 
					 	= MODULE_SYMBOL_PREFIX #sym;				\
 | 
				
			||||||
 | 
					 	static const struct kernel_symbol __ksymtab_##sym	\
 | 
				
			||||||
 | 
					 	__used							\
 | 
				
			||||||
 | 
					--- a/scripts/Makefile.build
 | 
				
			||||||
 | 
					+++ b/scripts/Makefile.build
 | 
				
			||||||
 | 
					@@ -348,7 +348,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $(
 | 
				
			||||||
 | 
					 # Linker scripts preprocessor (.lds.S -> .lds)
 | 
				
			||||||
 | 
					 # ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					 quiet_cmd_cpp_lds_S = LDS     $@
 | 
				
			||||||
 | 
					-      cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \
 | 
				
			||||||
 | 
					+      cmd_cpp_lds_S = $(CPP) $(EXTRA_LDSFLAGS) $(cpp_flags) -P -C -U$(ARCH) \
 | 
				
			||||||
 | 
					 	                     -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 $(obj)/%.lds: $(src)/%.lds.S FORCE
 | 
				
			||||||
@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					--- a/scripts/Makefile.lib
 | 
				
			||||||
 | 
					+++ b/scripts/Makefile.lib
 | 
				
			||||||
 | 
					@@ -299,7 +299,7 @@ cmd_bzip2 = (cat $(filter-out FORCE,$^)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 quiet_cmd_lzma = LZMA    $@
 | 
				
			||||||
 | 
					 cmd_lzma = (cat $(filter-out FORCE,$^) | \
 | 
				
			||||||
 | 
					-	lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
 | 
				
			||||||
 | 
					+	lzma e -d20 -lc1 -lp2 -pb2 -eos -si -so && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
 | 
				
			||||||
 | 
					 	(rm -f $@ ; false)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 quiet_cmd_lzo = LZO     $@
 | 
				
			||||||
 | 
					--- a/scripts/gen_initramfs_list.sh
 | 
				
			||||||
 | 
					+++ b/scripts/gen_initramfs_list.sh
 | 
				
			||||||
 | 
					@@ -226,7 +226,7 @@ cpio_list=
 | 
				
			||||||
 | 
					 output="/dev/stdout"
 | 
				
			||||||
 | 
					 output_file=""
 | 
				
			||||||
 | 
					 is_cpio_compressed=
 | 
				
			||||||
 | 
					-compr="gzip -n -9 -f"
 | 
				
			||||||
 | 
					+compr="gzip -n -9 -f -"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 arg="$1"
 | 
				
			||||||
 | 
					 case "$arg" in
 | 
				
			||||||
 | 
					@@ -240,9 +240,9 @@ case "$arg" in
 | 
				
			||||||
 | 
					 		output_file="$1"
 | 
				
			||||||
 | 
					 		cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)"
 | 
				
			||||||
 | 
					 		output=${cpio_list}
 | 
				
			||||||
 | 
					-		echo "$output_file" | grep -q "\.gz$" && compr="gzip -n -9 -f"
 | 
				
			||||||
 | 
					-		echo "$output_file" | grep -q "\.bz2$" && compr="bzip2 -9 -f"
 | 
				
			||||||
 | 
					-		echo "$output_file" | grep -q "\.lzma$" && compr="lzma -9 -f"
 | 
				
			||||||
 | 
					+		echo "$output_file" | grep -q "\.gz$" && compr="gzip -n -9 -f -"
 | 
				
			||||||
 | 
					+		echo "$output_file" | grep -q "\.bz2$" && compr="bzip2 -9 -f -"
 | 
				
			||||||
 | 
					+		echo "$output_file" | grep -q "\.lzma$" && compr="lzma e -d20 -lc1 -lp2 -pb2 -eos -si -so"
 | 
				
			||||||
 | 
					 		echo "$output_file" | grep -q "\.xz$" && \
 | 
				
			||||||
 | 
					 				compr="xz --check=crc32 --lzma2=dict=1MiB"
 | 
				
			||||||
 | 
					 		echo "$output_file" | grep -q "\.lzo$" && compr="lzop -9 -f"
 | 
				
			||||||
 | 
					@@ -303,7 +303,7 @@ if [ ! -z ${output_file} ]; then
 | 
				
			||||||
 | 
					 	if [ "${is_cpio_compressed}" = "compressed" ]; then
 | 
				
			||||||
 | 
					 		cat ${cpio_tfile} > ${output_file}
 | 
				
			||||||
 | 
					 	else
 | 
				
			||||||
 | 
					-		(cat ${cpio_tfile} | ${compr}  - > ${output_file}) \
 | 
				
			||||||
 | 
					+		(cat ${cpio_tfile} | ${compr} > ${output_file}) \
 | 
				
			||||||
 | 
					 		|| (rm -f ${output_file} ; false)
 | 
				
			||||||
 | 
					 	fi
 | 
				
			||||||
 | 
					 	[ -z ${cpio_file} ] && rm ${cpio_tfile}
 | 
				
			||||||
 | 
					--- a/lib/decompress.c
 | 
				
			||||||
 | 
					+++ b/lib/decompress.c
 | 
				
			||||||
 | 
					@@ -43,6 +43,7 @@ static const struct compress_format comp
 | 
				
			||||||
 | 
					 	{ {037, 0236}, "gzip", gunzip },
 | 
				
			||||||
 | 
					 	{ {0x42, 0x5a}, "bzip2", bunzip2 },
 | 
				
			||||||
 | 
					 	{ {0x5d, 0x00}, "lzma", unlzma },
 | 
				
			||||||
 | 
					+	{ {0x6d, 0x00}, "lzma-openwrt", unlzma },
 | 
				
			||||||
 | 
					 	{ {0xfd, 0x37}, "xz", unxz },
 | 
				
			||||||
 | 
					 	{ {0x89, 0x4c}, "lzo", unlzo },
 | 
				
			||||||
 | 
					 	{ {0, 0}, NULL, NULL }
 | 
				
			||||||
							
								
								
									
										18
									
								
								target/linux/generic/patches-3.8/250-netfilter_depends.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								target/linux/generic/patches-3.8/250-netfilter_depends.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					--- a/net/netfilter/Kconfig
 | 
				
			||||||
 | 
					+++ b/net/netfilter/Kconfig
 | 
				
			||||||
 | 
					@@ -191,7 +191,6 @@ config NF_CONNTRACK_FTP
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config NF_CONNTRACK_H323
 | 
				
			||||||
 | 
					 	tristate "H.323 protocol support"
 | 
				
			||||||
 | 
					-	depends on (IPV6 || IPV6=n)
 | 
				
			||||||
 | 
					 	depends on NETFILTER_ADVANCED
 | 
				
			||||||
 | 
					 	help
 | 
				
			||||||
 | 
					 	  H.323 is a VoIP signalling protocol from ITU-T. As one of the most
 | 
				
			||||||
 | 
					@@ -750,7 +749,6 @@ config NETFILTER_XT_TARGET_SECMARK
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config NETFILTER_XT_TARGET_TCPMSS
 | 
				
			||||||
 | 
					 	tristate '"TCPMSS" target support'
 | 
				
			||||||
 | 
					-	depends on (IPV6 || IPV6=n)
 | 
				
			||||||
 | 
					 	default m if NETFILTER_ADVANCED=n
 | 
				
			||||||
 | 
					 	---help---
 | 
				
			||||||
 | 
					 	  This option adds a `TCPMSS' target, which allows you to alter the
 | 
				
			||||||
							
								
								
									
										11
									
								
								target/linux/generic/patches-3.8/251-sound_kconfig.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								target/linux/generic/patches-3.8/251-sound_kconfig.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					--- a/sound/core/Kconfig
 | 
				
			||||||
 | 
					+++ b/sound/core/Kconfig
 | 
				
			||||||
 | 
					@@ -7,7 +7,7 @@ config SND_PCM
 | 
				
			||||||
 | 
					 	select SND_TIMER
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config SND_HWDEP
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	tristate "Sound hardware support"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config SND_RAWMIDI
 | 
				
			||||||
 | 
					 	tristate
 | 
				
			||||||
							
								
								
									
										10
									
								
								target/linux/generic/patches-3.8/252-mv_cesa_depends.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								target/linux/generic/patches-3.8/252-mv_cesa_depends.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					--- a/drivers/crypto/Kconfig
 | 
				
			||||||
 | 
					+++ b/drivers/crypto/Kconfig
 | 
				
			||||||
 | 
					@@ -164,6 +164,7 @@ config CRYPTO_DEV_MV_CESA
 | 
				
			||||||
 | 
					 	depends on PLAT_ORION
 | 
				
			||||||
 | 
					 	select CRYPTO_ALGAPI
 | 
				
			||||||
 | 
					 	select CRYPTO_AES
 | 
				
			||||||
 | 
					+	select CRYPTO_HASH2
 | 
				
			||||||
 | 
					 	select CRYPTO_BLKCIPHER2
 | 
				
			||||||
 | 
					 	select CRYPTO_HASH
 | 
				
			||||||
 | 
					 	help
 | 
				
			||||||
@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					--- a/drivers/ssb/Kconfig
 | 
				
			||||||
 | 
					+++ b/drivers/ssb/Kconfig
 | 
				
			||||||
 | 
					@@ -29,6 +29,7 @@ config SSB_SPROM
 | 
				
			||||||
 | 
					 config SSB_BLOCKIO
 | 
				
			||||||
 | 
					 	bool
 | 
				
			||||||
 | 
					 	depends on SSB
 | 
				
			||||||
 | 
					+	default y
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config SSB_PCIHOST_POSSIBLE
 | 
				
			||||||
 | 
					 	bool
 | 
				
			||||||
 | 
					@@ -49,7 +50,7 @@ config SSB_PCIHOST
 | 
				
			||||||
 | 
					 config SSB_B43_PCI_BRIDGE
 | 
				
			||||||
 | 
					 	bool
 | 
				
			||||||
 | 
					 	depends on SSB_PCIHOST
 | 
				
			||||||
 | 
					-	default n
 | 
				
			||||||
 | 
					+	default y
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config SSB_PCMCIAHOST_POSSIBLE
 | 
				
			||||||
 | 
					 	bool
 | 
				
			||||||
 | 
					--- a/drivers/bcma/Kconfig
 | 
				
			||||||
 | 
					+++ b/drivers/bcma/Kconfig
 | 
				
			||||||
 | 
					@@ -17,6 +17,7 @@ config BCMA
 | 
				
			||||||
 | 
					 config BCMA_BLOCKIO
 | 
				
			||||||
 | 
					 	bool
 | 
				
			||||||
 | 
					 	depends on BCMA
 | 
				
			||||||
 | 
					+	default y
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config BCMA_HOST_PCI_POSSIBLE
 | 
				
			||||||
 | 
					 	bool
 | 
				
			||||||
@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					--- a/lib/Kconfig
 | 
				
			||||||
 | 
					+++ b/lib/Kconfig
 | 
				
			||||||
 | 
					@@ -280,16 +280,16 @@ config BCH_CONST_T
 | 
				
			||||||
 | 
					 # Textsearch support is select'ed if needed
 | 
				
			||||||
 | 
					 #
 | 
				
			||||||
 | 
					 config TEXTSEARCH
 | 
				
			||||||
 | 
					-	boolean
 | 
				
			||||||
 | 
					+	boolean	"Textsearch support"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config TEXTSEARCH_KMP
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	tristate "Textsearch KMP"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config TEXTSEARCH_BM
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	tristate "Textsearch BM"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config TEXTSEARCH_FSM
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	tristate "Textsearch FSM"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config BTREE
 | 
				
			||||||
 | 
					 	boolean
 | 
				
			||||||
@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					--- a/net/wireless/Kconfig
 | 
				
			||||||
 | 
					+++ b/net/wireless/Kconfig
 | 
				
			||||||
 | 
					@@ -149,13 +149,13 @@ config LIB80211
 | 
				
			||||||
 | 
					 	  Drivers should select this themselves if needed.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config LIB80211_CRYPT_WEP
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	tristate "LIB80211_CRYPT_WEP"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config LIB80211_CRYPT_CCMP
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	tristate "LIB80211_CRYPT_CCMP"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config LIB80211_CRYPT_TKIP
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	tristate "LIB80211_CRYPT_TKIP"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config LIB80211_DEBUG
 | 
				
			||||||
 | 
					 	bool "lib80211 debugging messages"
 | 
				
			||||||
@@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					--- a/crypto/Kconfig
 | 
				
			||||||
 | 
					+++ b/crypto/Kconfig
 | 
				
			||||||
 | 
					@@ -31,7 +31,7 @@ config CRYPTO_FIPS
 | 
				
			||||||
 | 
					 	  this is.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config CRYPTO_ALGAPI
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	tristate "ALGAPI"
 | 
				
			||||||
 | 
					 	select CRYPTO_ALGAPI2
 | 
				
			||||||
 | 
					 	help
 | 
				
			||||||
 | 
					 	  This option provides the API for cryptographic algorithms.
 | 
				
			||||||
 | 
					@@ -40,7 +40,7 @@ config CRYPTO_ALGAPI2
 | 
				
			||||||
 | 
					 	tristate
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config CRYPTO_AEAD
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	tristate "AEAD"
 | 
				
			||||||
 | 
					 	select CRYPTO_AEAD2
 | 
				
			||||||
 | 
					 	select CRYPTO_ALGAPI
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -49,7 +49,7 @@ config CRYPTO_AEAD2
 | 
				
			||||||
 | 
					 	select CRYPTO_ALGAPI2
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config CRYPTO_BLKCIPHER
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	tristate "BLKCIPHER"
 | 
				
			||||||
 | 
					 	select CRYPTO_BLKCIPHER2
 | 
				
			||||||
 | 
					 	select CRYPTO_ALGAPI
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -60,7 +60,7 @@ config CRYPTO_BLKCIPHER2
 | 
				
			||||||
 | 
					 	select CRYPTO_WORKQUEUE
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config CRYPTO_HASH
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	tristate "HASH"
 | 
				
			||||||
 | 
					 	select CRYPTO_HASH2
 | 
				
			||||||
 | 
					 	select CRYPTO_ALGAPI
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -69,7 +69,7 @@ config CRYPTO_HASH2
 | 
				
			||||||
 | 
					 	select CRYPTO_ALGAPI2
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config CRYPTO_RNG
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	tristate "RNG"
 | 
				
			||||||
 | 
					 	select CRYPTO_RNG2
 | 
				
			||||||
 | 
					 	select CRYPTO_ALGAPI
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					--- a/net/wireless/Kconfig
 | 
				
			||||||
 | 
					+++ b/net/wireless/Kconfig
 | 
				
			||||||
 | 
					@@ -1,5 +1,5 @@
 | 
				
			||||||
 | 
					 config WIRELESS_EXT
 | 
				
			||||||
 | 
					-	bool
 | 
				
			||||||
 | 
					+	bool "Wireless extensions"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config WEXT_CORE
 | 
				
			||||||
 | 
					 	def_bool y
 | 
				
			||||||
 | 
					@@ -11,10 +11,10 @@ config WEXT_PROC
 | 
				
			||||||
 | 
					 	depends on WEXT_CORE
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config WEXT_SPY
 | 
				
			||||||
 | 
					-	bool
 | 
				
			||||||
 | 
					+	bool "WEXT_SPY"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config WEXT_PRIV
 | 
				
			||||||
 | 
					-	bool
 | 
				
			||||||
 | 
					+	bool "WEXT_PRIV"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config CFG80211
 | 
				
			||||||
 | 
					 	tristate "cfg80211 - wireless configuration API"
 | 
				
			||||||
@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					--- a/net/netfilter/Kconfig
 | 
				
			||||||
 | 
					+++ b/net/netfilter/Kconfig
 | 
				
			||||||
 | 
					@@ -2,7 +2,7 @@ menu "Core Netfilter Configuration"
 | 
				
			||||||
 | 
					 	depends on NET && INET && NETFILTER
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config NETFILTER_NETLINK
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	tristate "Netfilter NFNETLINK interface"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config NETFILTER_NETLINK_ACCT
 | 
				
			||||||
 | 
					 tristate "Netfilter NFACCT over NFNETLINK interface"
 | 
				
			||||||
							
								
								
									
										55
									
								
								target/linux/generic/patches-3.8/259-regmap_dynamic.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								target/linux/generic/patches-3.8/259-regmap_dynamic.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					--- a/drivers/base/regmap/Kconfig
 | 
				
			||||||
 | 
					+++ b/drivers/base/regmap/Kconfig
 | 
				
			||||||
 | 
					@@ -3,20 +3,23 @@
 | 
				
			||||||
 | 
					 # subsystems should select the appropriate symbols.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config REGMAP
 | 
				
			||||||
 | 
					-	default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_MMIO || REGMAP_IRQ)
 | 
				
			||||||
 | 
					 	select LZO_COMPRESS
 | 
				
			||||||
 | 
					 	select LZO_DECOMPRESS
 | 
				
			||||||
 | 
					 	select IRQ_DOMAIN if REGMAP_IRQ
 | 
				
			||||||
 | 
					-	bool
 | 
				
			||||||
 | 
					+	tristate "Regmap"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config REGMAP_I2C
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	select REGMAP
 | 
				
			||||||
 | 
					+	tristate "Regmap I2C"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config REGMAP_SPI
 | 
				
			||||||
 | 
					-	tristate
 | 
				
			||||||
 | 
					+	select REGMAP
 | 
				
			||||||
 | 
					+	tristate "Regmap SPI"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config REGMAP_MMIO
 | 
				
			||||||
 | 
					+	select REGMAP
 | 
				
			||||||
 | 
					 	tristate
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config REGMAP_IRQ
 | 
				
			||||||
 | 
					+	select REGMAP
 | 
				
			||||||
 | 
					 	bool
 | 
				
			||||||
 | 
					--- a/include/linux/regmap.h
 | 
				
			||||||
 | 
					+++ b/include/linux/regmap.h
 | 
				
			||||||
 | 
					@@ -44,7 +44,7 @@ struct reg_default {
 | 
				
			||||||
 | 
					 	unsigned int def;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#ifdef CONFIG_REGMAP
 | 
				
			||||||
 | 
					+#if IS_ENABLED(CONFIG_REGMAP)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 enum regmap_endian {
 | 
				
			||||||
 | 
					 	/* Unspecified -> 0 -> Backwards compatible default */
 | 
				
			||||||
 | 
					--- a/drivers/base/regmap/Makefile
 | 
				
			||||||
 | 
					+++ b/drivers/base/regmap/Makefile
 | 
				
			||||||
 | 
					@@ -1,6 +1,8 @@
 | 
				
			||||||
 | 
					-obj-$(CONFIG_REGMAP) += regmap.o regcache.o
 | 
				
			||||||
 | 
					-obj-$(CONFIG_REGMAP) += regcache-rbtree.o regcache-lzo.o
 | 
				
			||||||
 | 
					-obj-$(CONFIG_DEBUG_FS) += regmap-debugfs.o
 | 
				
			||||||
 | 
					+regmap-core-objs = regmap.o regcache.o regcache-rbtree.o regcache-lzo.o
 | 
				
			||||||
 | 
					+ifdef CONFIG_DEBUG_FS
 | 
				
			||||||
 | 
					+regmap-core-objs += regmap-debugfs.o
 | 
				
			||||||
 | 
					+endif
 | 
				
			||||||
 | 
					+obj-$(CONFIG_REGMAP) += regmap-core.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_REGMAP_I2C) += regmap-i2c.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_REGMAP_SPI) += regmap-spi.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_REGMAP_MMIO) += regmap-mmio.o
 | 
				
			||||||
@@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					From: Mark Miller <mark@mirell.org>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This exposes the CONFIG_BOOT_RAW symbol in Kconfig. This is needed on
 | 
				
			||||||
 | 
					certain Broadcom chipsets running CFE in order to load the kernel.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Mark Miller <mark@mirell.org>
 | 
				
			||||||
 | 
					Acked-by: Rob Landley <rob@landley.net>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					--- a/arch/mips/Kconfig
 | 
				
			||||||
 | 
					+++ b/arch/mips/Kconfig
 | 
				
			||||||
 | 
					@@ -893,9 +893,6 @@ config FW_ARC
 | 
				
			||||||
 | 
					 config ARCH_MAY_HAVE_PC_FDC
 | 
				
			||||||
 | 
					 	bool
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-config BOOT_RAW
 | 
				
			||||||
 | 
					-	bool
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 config CEVT_BCM1480
 | 
				
			||||||
 | 
					 	bool
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -2374,6 +2371,18 @@ config USE_OF
 | 
				
			||||||
 | 
					 	select OF_EARLY_FLATTREE
 | 
				
			||||||
 | 
					 	select IRQ_DOMAIN
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+config BOOT_RAW
 | 
				
			||||||
 | 
					+	bool "Enable the kernel to be executed from the load address"
 | 
				
			||||||
 | 
					+	default n
 | 
				
			||||||
 | 
					+	help
 | 
				
			||||||
 | 
					+	 Allow the kernel to be executed from the load address for
 | 
				
			||||||
 | 
					+	 bootloaders which cannot read the ELF format. This places
 | 
				
			||||||
 | 
					+	 a jump to start_kernel at the load address.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	 If unsure, say N.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 endmenu
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config LOCKDEP_SUPPORT
 | 
				
			||||||
@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					--- a/arch/mips/Kconfig
 | 
				
			||||||
 | 
					+++ b/arch/mips/Kconfig
 | 
				
			||||||
 | 
					@@ -984,6 +984,10 @@ config SYNC_R4K
 | 
				
			||||||
 | 
					 config MIPS_MACHINE
 | 
				
			||||||
 | 
					 	def_bool n
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+config IMAGE_CMDLINE_HACK
 | 
				
			||||||
 | 
					+	bool "OpenWrt specific image command line hack"
 | 
				
			||||||
 | 
					+	default n
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 config NO_IOPORT
 | 
				
			||||||
 | 
					 	def_bool n
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					--- a/arch/mips/kernel/head.S
 | 
				
			||||||
 | 
					+++ b/arch/mips/kernel/head.S
 | 
				
			||||||
 | 
					@@ -141,6 +141,12 @@ FEXPORT(__kernel_entry)
 | 
				
			||||||
 | 
					 	j	kernel_entry
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#ifdef CONFIG_IMAGE_CMDLINE_HACK
 | 
				
			||||||
 | 
					+	.ascii	"CMDLINE:"
 | 
				
			||||||
 | 
					+EXPORT(__image_cmdline)
 | 
				
			||||||
 | 
					+	.fill	0x400
 | 
				
			||||||
 | 
					+#endif /* CONFIG_IMAGE_CMDLINE_HACK */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	__REF
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 NESTED(kernel_entry, 16, sp)			# kernel entry point
 | 
				
			||||||
@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					--- a/arch/mips/Makefile
 | 
				
			||||||
 | 
					+++ b/arch/mips/Makefile
 | 
				
			||||||
 | 
					@@ -87,7 +87,7 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
 | 
				
			||||||
 | 
					 # machines may also.  Since BFD is incredibly buggy with respect to
 | 
				
			||||||
 | 
					 # crossformat linking we rely on the elf2ecoff tool for format conversion.
 | 
				
			||||||
 | 
					 #
 | 
				
			||||||
 | 
					-cflags-y			+= -G 0 -mno-abicalls -fno-pic -pipe
 | 
				
			||||||
 | 
					+cflags-y			+= -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely
 | 
				
			||||||
 | 
					 cflags-y			+= -msoft-float
 | 
				
			||||||
 | 
					 LDFLAGS_vmlinux			+= -G 0 -static -n -nostdlib
 | 
				
			||||||
 | 
					 KBUILD_AFLAGS_MODULE		+= -mlong-calls
 | 
				
			||||||
							
								
								
									
										160
									
								
								target/linux/generic/patches-3.8/304-mips_disable_fpu.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								target/linux/generic/patches-3.8/304-mips_disable_fpu.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,160 @@
 | 
				
			|||||||
 | 
					MIPS: allow disabling the kernel FPU emulator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This patch allows turning off the in-kernel Algorithmics
 | 
				
			||||||
 | 
					FPU emulator support, which allows one to save a couple of
 | 
				
			||||||
 | 
					precious blocks on an embedded system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Florian Fainelli <florian@openwrt.org>
 | 
				
			||||||
 | 
					--
 | 
				
			||||||
 | 
					--- a/arch/mips/Kconfig
 | 
				
			||||||
 | 
					+++ b/arch/mips/Kconfig
 | 
				
			||||||
 | 
					@@ -969,6 +969,17 @@ config I8259
 | 
				
			||||||
 | 
					 config MIPS_BONITO64
 | 
				
			||||||
 | 
					 	bool
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+config MIPS_FPU_EMU
 | 
				
			||||||
 | 
					+	bool "Enable FPU emulation"
 | 
				
			||||||
 | 
					+	default y
 | 
				
			||||||
 | 
					+	help
 | 
				
			||||||
 | 
					+	   This option allows building a kernel with or without the Algorithmics
 | 
				
			||||||
 | 
					+	   FPU emulator enabled. Turning off this option results in a kernel which
 | 
				
			||||||
 | 
					+	   does not catch floating operations exceptions. Make sure that your toolchain
 | 
				
			||||||
 | 
					+	   is configured to enable software floating point emulation in that case.
 | 
				
			||||||
 | 
					+		
 | 
				
			||||||
 | 
					+	   If unsure say Y here.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 config MIPS_MSC
 | 
				
			||||||
 | 
					 	bool
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					--- a/arch/mips/math-emu/Makefile
 | 
				
			||||||
 | 
					+++ b/arch/mips/math-emu/Makefile
 | 
				
			||||||
 | 
					@@ -2,11 +2,13 @@
 | 
				
			||||||
 | 
					 # Makefile for the Linux/MIPS kernel FPU emulation.
 | 
				
			||||||
 | 
					 #
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-obj-y	:= cp1emu.o ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
 | 
				
			||||||
 | 
					+obj-y	:=	kernel_linkage.o dsemul.o cp1emu.o
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+obj-$(CONFIG_MIPS_FPU_EMU)	+= ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
 | 
				
			||||||
 | 
					 	   ieee754xcpt.o dp_frexp.o dp_modf.o dp_div.o dp_mul.o dp_sub.o \
 | 
				
			||||||
 | 
					 	   dp_add.o dp_fsp.o dp_cmp.o dp_logb.o dp_scalb.o dp_simple.o \
 | 
				
			||||||
 | 
					 	   dp_tint.o dp_fint.o dp_tlong.o dp_flong.o sp_frexp.o sp_modf.o \
 | 
				
			||||||
 | 
					 	   sp_div.o sp_mul.o sp_sub.o sp_add.o sp_fdp.o sp_cmp.o sp_logb.o \
 | 
				
			||||||
 | 
					 	   sp_scalb.o sp_simple.o sp_tint.o sp_fint.o sp_tlong.o sp_flong.o \
 | 
				
			||||||
 | 
					-	   dp_sqrt.o sp_sqrt.o kernel_linkage.o dsemul.o
 | 
				
			||||||
 | 
					+	   dp_sqrt.o sp_sqrt.o
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					--- a/arch/mips/math-emu/cp1emu.c
 | 
				
			||||||
 | 
					+++ b/arch/mips/math-emu/cp1emu.c
 | 
				
			||||||
 | 
					@@ -58,7 +58,11 @@
 | 
				
			||||||
 | 
					 #define __mips 4
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* Function which emulates a floating point instruction. */
 | 
				
			||||||
 | 
					+#ifdef CONFIG_DEBUG_FS
 | 
				
			||||||
 | 
					+DEFINE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats);
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#ifdef CONFIG_MIPS_FPU_EMU
 | 
				
			||||||
 | 
					 static int fpu_emu(struct pt_regs *, struct mips_fpu_struct *,
 | 
				
			||||||
 | 
					 	mips_instruction);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -69,10 +73,6 @@ static int fpux_emu(struct pt_regs *,
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* Further private data for which no space exists in mips_fpu_struct */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#ifdef CONFIG_DEBUG_FS
 | 
				
			||||||
 | 
					-DEFINE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats);
 | 
				
			||||||
 | 
					-#endif
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 /* Control registers */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define FPCREG_RID	0	/* $0  = revision id */
 | 
				
			||||||
 | 
					@@ -1361,7 +1361,6 @@ int fpu_emulator_cop1Handler(struct pt_r
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	return sig;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 #ifdef CONFIG_DEBUG_FS
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static int fpuemu_stat_get(void *data, u64 *val)
 | 
				
			||||||
 | 
					@@ -1410,4 +1409,11 @@ static int __init debugfs_fpuemu(void)
 | 
				
			||||||
 | 
					 	return 0;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 __initcall(debugfs_fpuemu);
 | 
				
			||||||
 | 
					-#endif
 | 
				
			||||||
 | 
					+#endif /* CONFIG_DEBUGFS */
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+int fpu_emulator_cop1Handler(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
 | 
				
			||||||
 | 
					+        int has_fpu)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+#endif /* CONFIG_MIPS_FPU_EMU */
 | 
				
			||||||
 | 
					--- a/arch/mips/math-emu/dsemul.c
 | 
				
			||||||
 | 
					+++ b/arch/mips/math-emu/dsemul.c
 | 
				
			||||||
 | 
					@@ -108,6 +108,7 @@ int mips_dsemul(struct pt_regs *regs, mi
 | 
				
			||||||
 | 
					 	return SIGILL;		/* force out of emulation loop */
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#ifdef CONFIG_MIPS_FPU_EMU
 | 
				
			||||||
 | 
					 int do_dsemulret(struct pt_regs *xcp)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	struct emuframe __user *fr;
 | 
				
			||||||
 | 
					@@ -164,3 +165,9 @@ int do_dsemulret(struct pt_regs *xcp)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	return 1;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+int do_dsemulret(struct pt_regs *xcp)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+#endif /* CONFIG_MIPS_FPU_EMU */
 | 
				
			||||||
 | 
					--- a/arch/mips/math-emu/kernel_linkage.c
 | 
				
			||||||
 | 
					+++ b/arch/mips/math-emu/kernel_linkage.c
 | 
				
			||||||
 | 
					@@ -29,6 +29,7 @@
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define SIGNALLING_NAN 0x7ff800007ff80000LL
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#ifdef CONFIG_MIPS_FPU_EMU
 | 
				
			||||||
 | 
					 void fpu_emulator_init_fpu(void)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	static int first = 1;
 | 
				
			||||||
 | 
					@@ -112,4 +113,36 @@ int fpu_emulator_restore_context32(struc
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	return err;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					-#endif
 | 
				
			||||||
 | 
					+#endif	/* CONFIG_64BIT */
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+void fpu_emulator_init_fpu(void)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	printk(KERN_INFO "FPU emulator disabled, make sure your toolchain"
 | 
				
			||||||
 | 
					+		"was compiled with software floating point support (soft-float)\n");
 | 
				
			||||||
 | 
					+	return;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+int fpu_emulator_save_context(struct sigcontext __user *sc)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+int fpu_emulator_restore_context(struct sigcontext __user *sc)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+int fpu_emulator_save_context32(struct sigcontext32 __user *sc)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+int fpu_emulator_restore_context32(struct sigcontext32 __user *sc)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#ifdef CONFIG_64BIT
 | 
				
			||||||
 | 
					+#endif	/* CONFIG_64BIT */
 | 
				
			||||||
 | 
					+#endif /* CONFIG_MIPS_FPU_EMU */
 | 
				
			||||||
@@ -0,0 +1,83 @@
 | 
				
			|||||||
 | 
					--- a/arch/mips/include/asm/string.h
 | 
				
			||||||
 | 
					+++ b/arch/mips/include/asm/string.h
 | 
				
			||||||
 | 
					@@ -133,11 +133,44 @@ strncmp(__const__ char *__cs, __const__
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define __HAVE_ARCH_MEMSET
 | 
				
			||||||
 | 
					 extern void *memset(void *__s, int __c, size_t __count);
 | 
				
			||||||
 | 
					+#define memset(__s, __c, len)					\
 | 
				
			||||||
 | 
					+({								\
 | 
				
			||||||
 | 
					+	size_t __len = (len);					\
 | 
				
			||||||
 | 
					+	void *__ret;						\
 | 
				
			||||||
 | 
					+	if (__builtin_constant_p(len) && __len >= 64)		\
 | 
				
			||||||
 | 
					+		__ret = memset((__s), (__c), __len);		\
 | 
				
			||||||
 | 
					+	else							\
 | 
				
			||||||
 | 
					+		__ret = __builtin_memset((__s), (__c), __len);	\
 | 
				
			||||||
 | 
					+	__ret;							\
 | 
				
			||||||
 | 
					+})
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define __HAVE_ARCH_MEMCPY
 | 
				
			||||||
 | 
					 extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
 | 
				
			||||||
 | 
					+#define memcpy(dst, src, len)					\
 | 
				
			||||||
 | 
					+({								\
 | 
				
			||||||
 | 
					+	size_t __len = (len);					\
 | 
				
			||||||
 | 
					+	void *__ret;						\
 | 
				
			||||||
 | 
					+	if (__builtin_constant_p(len) && __len >= 64)		\
 | 
				
			||||||
 | 
					+		__ret = memcpy((dst), (src), __len);		\
 | 
				
			||||||
 | 
					+	else							\
 | 
				
			||||||
 | 
					+		__ret = __builtin_memcpy((dst), (src), __len);	\
 | 
				
			||||||
 | 
					+	__ret;							\
 | 
				
			||||||
 | 
					+})
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define __HAVE_ARCH_MEMMOVE
 | 
				
			||||||
 | 
					 extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
 | 
				
			||||||
 | 
					+#define memmove(dst, src, len)					\
 | 
				
			||||||
 | 
					+({								\
 | 
				
			||||||
 | 
					+	size_t __len = (len);					\
 | 
				
			||||||
 | 
					+	void *__ret;						\
 | 
				
			||||||
 | 
					+	if (__builtin_constant_p(len) && __len >= 64)		\
 | 
				
			||||||
 | 
					+		__ret = memmove((dst), (src), __len);		\
 | 
				
			||||||
 | 
					+	else							\
 | 
				
			||||||
 | 
					+		__ret = __builtin_memmove((dst), (src), __len);	\
 | 
				
			||||||
 | 
					+	__ret;							\
 | 
				
			||||||
 | 
					+})
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#define __HAVE_ARCH_MEMCMP
 | 
				
			||||||
 | 
					+#define memcmp(src1, src2, len) __builtin_memcmp((src1), (src2), (len))
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #endif /* _ASM_STRING_H */
 | 
				
			||||||
 | 
					--- a/arch/mips/lib/Makefile
 | 
				
			||||||
 | 
					+++ b/arch/mips/lib/Makefile
 | 
				
			||||||
 | 
					@@ -4,7 +4,7 @@
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 lib-y	+= bitops.o csum_partial.o delay.o memcpy.o memset.o \
 | 
				
			||||||
 | 
					 	   mips-atomic.o strlen_user.o strncpy_user.o \
 | 
				
			||||||
 | 
					-	   strnlen_user.o uncached.o
 | 
				
			||||||
 | 
					+	   strnlen_user.o uncached.o memcmp.o
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 obj-y			+= iomap.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_PCI)	+= iomap-pci.o
 | 
				
			||||||
 | 
					--- /dev/null
 | 
				
			||||||
 | 
					+++ b/arch/mips/lib/memcmp.c
 | 
				
			||||||
 | 
					@@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					+/*
 | 
				
			||||||
 | 
					+ *  copied from linux/lib/string.c
 | 
				
			||||||
 | 
					+ *
 | 
				
			||||||
 | 
					+ *  Copyright (C) 1991, 1992  Linus Torvalds
 | 
				
			||||||
 | 
					+ */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#include <linux/module.h>
 | 
				
			||||||
 | 
					+#include <linux/string.h>
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#undef memcmp
 | 
				
			||||||
 | 
					+int memcmp(const void *cs, const void *ct, size_t count)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	const unsigned char *su1, *su2;
 | 
				
			||||||
 | 
					+	int res = 0;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
 | 
				
			||||||
 | 
					+		if ((res = *su1 - *su2) != 0)
 | 
				
			||||||
 | 
					+			break;
 | 
				
			||||||
 | 
					+	return res;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+EXPORT_SYMBOL(memcmp);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					--- a/arch/mips/kernel/cpu-probe.c
 | 
				
			||||||
 | 
					+++ b/arch/mips/kernel/cpu-probe.c
 | 
				
			||||||
 | 
					@@ -838,10 +838,13 @@ static inline void cpu_probe_mips(struct
 | 
				
			||||||
 | 
					 		__cpu_name[cpu] = "MIPS 20Kc";
 | 
				
			||||||
 | 
					 		break;
 | 
				
			||||||
 | 
					 	case PRID_IMP_24K:
 | 
				
			||||||
 | 
					-	case PRID_IMP_24KE:
 | 
				
			||||||
 | 
					 		c->cputype = CPU_24K;
 | 
				
			||||||
 | 
					 		__cpu_name[cpu] = "MIPS 24Kc";
 | 
				
			||||||
 | 
					 		break;
 | 
				
			||||||
 | 
					+	case PRID_IMP_24KE:
 | 
				
			||||||
 | 
					+		c->cputype = CPU_24K;
 | 
				
			||||||
 | 
					+		__cpu_name[cpu] = "MIPS 24KEc";
 | 
				
			||||||
 | 
					+		break;
 | 
				
			||||||
 | 
					 	case PRID_IMP_25KF:
 | 
				
			||||||
 | 
					 		c->cputype = CPU_25KF;
 | 
				
			||||||
 | 
					 		__cpu_name[cpu] = "MIPS 25Kc";
 | 
				
			||||||
@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					--- a/arch/mips/mm/cache.c
 | 
				
			||||||
 | 
					+++ b/arch/mips/mm/cache.c
 | 
				
			||||||
 | 
					@@ -39,6 +39,7 @@ void (*__flush_kernel_vmap_range)(unsign
 | 
				
			||||||
 | 
					 void (*__invalidate_kernel_vmap_range)(unsigned long vaddr, int size);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 EXPORT_SYMBOL_GPL(__flush_kernel_vmap_range);
 | 
				
			||||||
 | 
					+EXPORT_SYMBOL(__flush_cache_all);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* MIPS specific cache operations */
 | 
				
			||||||
 | 
					 void (*flush_cache_sigtramp)(unsigned long addr);
 | 
				
			||||||
 | 
					--- a/fs/fuse/dev.c
 | 
				
			||||||
 | 
					+++ b/fs/fuse/dev.c
 | 
				
			||||||
 | 
					@@ -19,6 +19,9 @@
 | 
				
			||||||
 | 
					 #include <linux/pipe_fs_i.h>
 | 
				
			||||||
 | 
					 #include <linux/swap.h>
 | 
				
			||||||
 | 
					 #include <linux/splice.h>
 | 
				
			||||||
 | 
					+#ifdef CONFIG_MIPS
 | 
				
			||||||
 | 
					+#include <asm/cacheflush.h>
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 MODULE_ALIAS_MISCDEV(FUSE_MINOR);
 | 
				
			||||||
 | 
					 MODULE_ALIAS("devname:fuse");
 | 
				
			||||||
 | 
					@@ -654,6 +657,9 @@ static int fuse_copy_fill(struct fuse_co
 | 
				
			||||||
 | 
					 static int fuse_copy_do(struct fuse_copy_state *cs, void **val, unsigned *size)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	unsigned ncpy = min(*size, cs->len);
 | 
				
			||||||
 | 
					+#ifdef CONFIG_MIPS
 | 
				
			||||||
 | 
					+	__flush_cache_all();
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 	if (val) {
 | 
				
			||||||
 | 
					 		if (cs->write)
 | 
				
			||||||
 | 
					 			memcpy(cs->buf, *val, ncpy);
 | 
				
			||||||
@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					--- a/arch/arm/kernel/module.c
 | 
				
			||||||
 | 
					+++ b/arch/arm/kernel/module.c
 | 
				
			||||||
 | 
					@@ -81,6 +81,10 @@ apply_relocate(Elf32_Shdr *sechdrs, cons
 | 
				
			||||||
 | 
					 			return -ENOEXEC;
 | 
				
			||||||
 | 
					 		}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+		if ((IS_ERR_VALUE(sym->st_value) || !sym->st_value) &&
 | 
				
			||||||
 | 
					+		    ELF_ST_BIND(sym->st_info) == STB_WEAK)
 | 
				
			||||||
 | 
					+			continue;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 		loc = dstsec->sh_addr + rel->r_offset;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		switch (ELF32_R_TYPE(rel->r_info)) {
 | 
				
			||||||
@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					Upstream doesn't optimize the kernel and bootwrappers for ppc44x because
 | 
				
			||||||
 | 
					they still want to support gcc 3.3 -- well, we don't.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/arch/powerpc/Makefile
 | 
				
			||||||
 | 
					+++ b/arch/powerpc/Makefile
 | 
				
			||||||
 | 
					@@ -119,7 +119,8 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
 | 
				
			||||||
 | 
					 KBUILD_CFLAGS		+= -mno-sched-epilog
 | 
				
			||||||
 | 
					 endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-cpu-as-$(CONFIG_4xx)		+= -Wa,-m405
 | 
				
			||||||
 | 
					+cpu-as-$(CONFIG_40x)		+= -Wa,-m405
 | 
				
			||||||
 | 
					+cpu-as-$(CONFIG_44x)		+= -Wa,-m440
 | 
				
			||||||
 | 
					 cpu-as-$(CONFIG_ALTIVEC)	+= -Wa,-maltivec
 | 
				
			||||||
 | 
					 cpu-as-$(CONFIG_E500)		+= -Wa,-me500
 | 
				
			||||||
 | 
					 cpu-as-$(CONFIG_E200)		+= -Wa,-me200
 | 
				
			||||||
 | 
					--- a/arch/powerpc/boot/Makefile
 | 
				
			||||||
 | 
					+++ b/arch/powerpc/boot/Makefile
 | 
				
			||||||
 | 
					@@ -38,10 +38,10 @@ BOOTCFLAGS	+= -I$(obj) -I$(srctree)/$(ob
 | 
				
			||||||
 | 
					 DTC_FLAGS	?= -p 1024
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 $(obj)/4xx.o: BOOTCFLAGS += -mcpu=405
 | 
				
			||||||
 | 
					-$(obj)/ebony.o: BOOTCFLAGS += -mcpu=405
 | 
				
			||||||
 | 
					+$(obj)/ebony.o: BOOTCFLAGS += -mcpu=440
 | 
				
			||||||
 | 
					 $(obj)/cuboot-hotfoot.o: BOOTCFLAGS += -mcpu=405
 | 
				
			||||||
 | 
					-$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=405
 | 
				
			||||||
 | 
					-$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=405
 | 
				
			||||||
 | 
					+$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=440
 | 
				
			||||||
 | 
					+$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=440
 | 
				
			||||||
 | 
					 $(obj)/cuboot-acadia.o: BOOTCFLAGS += -mcpu=405
 | 
				
			||||||
 | 
					 $(obj)/treeboot-walnut.o: BOOTCFLAGS += -mcpu=405
 | 
				
			||||||
 | 
					 $(obj)/treeboot-iss4xx.o: BOOTCFLAGS += -mcpu=405
 | 
				
			||||||
@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					--- a/arch/powerpc/Makefile
 | 
				
			||||||
 | 
					+++ b/arch/powerpc/Makefile
 | 
				
			||||||
 | 
					@@ -86,7 +86,6 @@ CPP		= $(CC) -E $(KBUILD_CFLAGS)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 CHECKFLAGS	+= -m$(CONFIG_WORD_SIZE) -D__powerpc__ -D__powerpc$(CONFIG_WORD_SIZE)__
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 # No AltiVec or VSX instructions when building kernel
 | 
				
			||||||
 | 
					 KBUILD_CFLAGS += $(call cc-option,-mno-altivec)
 | 
				
			||||||
@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					--- a/drivers/crypto/amcc/crypto4xx_core.c
 | 
				
			||||||
 | 
					+++ b/drivers/crypto/amcc/crypto4xx_core.c
 | 
				
			||||||
 | 
					@@ -19,6 +19,7 @@
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #include <linux/kernel.h>
 | 
				
			||||||
 | 
					+#include <linux/module.h>
 | 
				
			||||||
 | 
					 #include <linux/interrupt.h>
 | 
				
			||||||
 | 
					 #include <linux/spinlock_types.h>
 | 
				
			||||||
 | 
					 #include <linux/random.h>
 | 
				
			||||||
@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					--- a/kernel/module.c
 | 
				
			||||||
 | 
					+++ b/kernel/module.c
 | 
				
			||||||
 | 
					@@ -2374,12 +2374,15 @@ static void dynamic_debug_remove(struct
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 void * __weak module_alloc(unsigned long size)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					-	return vmalloc_exec(size);
 | 
				
			||||||
 | 
					+	return size == 0 ? NULL : vmalloc_exec(size);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static void *module_alloc_update_bounds(unsigned long size)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					-	void *ret = module_alloc(size);
 | 
				
			||||||
 | 
					+	void *ret = NULL;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (size)
 | 
				
			||||||
 | 
					+		ret = module_alloc(size);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (ret) {
 | 
				
			||||||
 | 
					 		mutex_lock(&module_mutex);
 | 
				
			||||||
							
								
								
									
										327
									
								
								target/linux/generic/patches-3.8/400-rootfs_split.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										327
									
								
								target/linux/generic/patches-3.8/400-rootfs_split.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,327 @@
 | 
				
			|||||||
 | 
					--- a/drivers/mtd/Kconfig
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/Kconfig
 | 
				
			||||||
 | 
					@@ -23,6 +23,14 @@ config MTD_TESTS
 | 
				
			||||||
 | 
					 	  WARNING: some of the tests will ERASE entire MTD device which they
 | 
				
			||||||
 | 
					 	  test. Do not use these tests unless you really know what you do.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+config MTD_ROOTFS_ROOT_DEV
 | 
				
			||||||
 | 
					+	bool "Automatically set 'rootfs' partition to be root filesystem"
 | 
				
			||||||
 | 
					+	default y
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+config MTD_ROOTFS_SPLIT
 | 
				
			||||||
 | 
					+	bool "Automatically split 'rootfs' partition for squashfs"
 | 
				
			||||||
 | 
					+	default y
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 config MTD_REDBOOT_PARTS
 | 
				
			||||||
 | 
					 	tristate "RedBoot partition table parsing"
 | 
				
			||||||
 | 
					 	---help---
 | 
				
			||||||
 | 
					--- a/drivers/mtd/mtdpart.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/mtdpart.c
 | 
				
			||||||
 | 
					@@ -29,6 +29,8 @@
 | 
				
			||||||
 | 
					 #include <linux/kmod.h>
 | 
				
			||||||
 | 
					 #include <linux/mtd/mtd.h>
 | 
				
			||||||
 | 
					 #include <linux/mtd/partitions.h>
 | 
				
			||||||
 | 
					+#include <linux/root_dev.h>
 | 
				
			||||||
 | 
					+#include <linux/magic.h>
 | 
				
			||||||
 | 
					 #include <linux/err.h>
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #include "mtdcore.h"
 | 
				
			||||||
 | 
					@@ -50,7 +52,7 @@ struct mtd_part {
 | 
				
			||||||
 | 
					  * the pointer to that structure with this macro.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					 #define PART(x)  ((struct mtd_part *)(x))
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+#define IS_PART(mtd) (mtd->_read == part_read)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * MTD methods which simply translate the effective address and pass through
 | 
				
			||||||
 | 
					@@ -613,6 +615,155 @@ int mtd_del_partition(struct mtd_info *m
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 EXPORT_SYMBOL_GPL(mtd_del_partition);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#ifdef CONFIG_MTD_ROOTFS_SPLIT
 | 
				
			||||||
 | 
					+#define ROOTFS_SPLIT_NAME "rootfs_data"
 | 
				
			||||||
 | 
					+#define ROOTFS_REMOVED_NAME "<removed>"
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+struct squashfs_super_block {
 | 
				
			||||||
 | 
					+	__le32 s_magic;
 | 
				
			||||||
 | 
					+	__le32 pad0[9];
 | 
				
			||||||
 | 
					+	__le64 bytes_used;
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int split_squashfs(struct mtd_info *master, int offset, int *split_offset)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct squashfs_super_block sb;
 | 
				
			||||||
 | 
					+	int len, ret;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	ret = mtd_read(master, offset, sizeof(sb), &len, (void *) &sb);
 | 
				
			||||||
 | 
					+	if (ret || (len != sizeof(sb))) {
 | 
				
			||||||
 | 
					+		printk(KERN_ALERT "split_squashfs: error occured while reading "
 | 
				
			||||||
 | 
					+			"from \"%s\"\n", master->name);
 | 
				
			||||||
 | 
					+		return -EINVAL;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (SQUASHFS_MAGIC != le32_to_cpu(sb.s_magic) ) {
 | 
				
			||||||
 | 
					+		printk(KERN_ALERT "split_squashfs: no squashfs found in \"%s\"\n",
 | 
				
			||||||
 | 
					+			master->name);
 | 
				
			||||||
 | 
					+		*split_offset = 0;
 | 
				
			||||||
 | 
					+		return 0;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (le64_to_cpu((sb.bytes_used)) <= 0) {
 | 
				
			||||||
 | 
					+		printk(KERN_ALERT "split_squashfs: squashfs is empty in \"%s\"\n",
 | 
				
			||||||
 | 
					+			master->name);
 | 
				
			||||||
 | 
					+		*split_offset = 0;
 | 
				
			||||||
 | 
					+		return 0;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	len = (u32) le64_to_cpu(sb.bytes_used);
 | 
				
			||||||
 | 
					+	len += (offset & 0x000fffff);
 | 
				
			||||||
 | 
					+	len +=  (master->erasesize - 1);
 | 
				
			||||||
 | 
					+	len &= ~(master->erasesize - 1);
 | 
				
			||||||
 | 
					+	len -= (offset & 0x000fffff);
 | 
				
			||||||
 | 
					+	*split_offset = offset + len;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int split_rootfs_data(struct mtd_info *master, struct mtd_info *rpart, const struct mtd_partition *part)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct mtd_partition *dpart;
 | 
				
			||||||
 | 
					+	struct mtd_part *slave = NULL;
 | 
				
			||||||
 | 
					+	struct mtd_part *spart;
 | 
				
			||||||
 | 
					+	int ret, split_offset = 0;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	spart = PART(rpart);
 | 
				
			||||||
 | 
					+	ret = split_squashfs(master, spart->offset, &split_offset);
 | 
				
			||||||
 | 
					+	if (ret)
 | 
				
			||||||
 | 
					+		return ret;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (split_offset <= 0)
 | 
				
			||||||
 | 
					+		return 0;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	dpart = kmalloc(sizeof(*part)+sizeof(ROOTFS_SPLIT_NAME)+1, GFP_KERNEL);
 | 
				
			||||||
 | 
					+	if (dpart == NULL) {
 | 
				
			||||||
 | 
					+		printk(KERN_INFO "split_squashfs: no memory for partition \"%s\"\n",
 | 
				
			||||||
 | 
					+			ROOTFS_SPLIT_NAME);
 | 
				
			||||||
 | 
					+		return -ENOMEM;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	memcpy(dpart, part, sizeof(*part));
 | 
				
			||||||
 | 
					+	dpart->name = (unsigned char *)&dpart[1];
 | 
				
			||||||
 | 
					+	strcpy(dpart->name, ROOTFS_SPLIT_NAME);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	dpart->size = rpart->size - (split_offset - spart->offset);
 | 
				
			||||||
 | 
					+	dpart->offset = split_offset;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (dpart == NULL)
 | 
				
			||||||
 | 
					+		return 1;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	printk(KERN_INFO "mtd: partition \"%s\" created automatically, ofs=%llX, len=%llX \n",
 | 
				
			||||||
 | 
					+		ROOTFS_SPLIT_NAME, dpart->offset, dpart->size);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	slave = allocate_partition(master, dpart, 0, split_offset);
 | 
				
			||||||
 | 
					+	if (IS_ERR(slave))
 | 
				
			||||||
 | 
					+		return PTR_ERR(slave);
 | 
				
			||||||
 | 
					+	mutex_lock(&mtd_partitions_mutex);
 | 
				
			||||||
 | 
					+	list_add(&slave->list, &mtd_partitions);
 | 
				
			||||||
 | 
					+	mutex_unlock(&mtd_partitions_mutex);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	add_mtd_device(&slave->mtd);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	rpart->split = &slave->mtd;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int refresh_rootfs_split(struct mtd_info *mtd)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct mtd_partition tpart;
 | 
				
			||||||
 | 
					+	struct mtd_part *part;
 | 
				
			||||||
 | 
					+	char *name;
 | 
				
			||||||
 | 
					+	//int index = 0;
 | 
				
			||||||
 | 
					+	int offset, size;
 | 
				
			||||||
 | 
					+	int ret;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	part = PART(mtd);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* check for the new squashfs offset first */
 | 
				
			||||||
 | 
					+	ret = split_squashfs(part->master, part->offset, &offset);
 | 
				
			||||||
 | 
					+	if (ret)
 | 
				
			||||||
 | 
					+		return ret;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if ((offset > 0) && !mtd->split) {
 | 
				
			||||||
 | 
					+		printk(KERN_INFO "%s: creating new split partition for \"%s\"\n", __func__, mtd->name);
 | 
				
			||||||
 | 
					+		/* if we don't have a rootfs split partition, create a new one */
 | 
				
			||||||
 | 
					+		tpart.name = (char *) mtd->name;
 | 
				
			||||||
 | 
					+		tpart.size = mtd->size;
 | 
				
			||||||
 | 
					+		tpart.offset = part->offset;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		return split_rootfs_data(part->master, &part->mtd, &tpart);
 | 
				
			||||||
 | 
					+	} else if ((offset > 0) && mtd->split) {
 | 
				
			||||||
 | 
					+		/* update the offsets of the existing partition */
 | 
				
			||||||
 | 
					+		size = mtd->size + part->offset - offset;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		part = PART(mtd->split);
 | 
				
			||||||
 | 
					+		part->offset = offset;
 | 
				
			||||||
 | 
					+		part->mtd.size = size;
 | 
				
			||||||
 | 
					+		printk(KERN_INFO "%s: %s partition \"" ROOTFS_SPLIT_NAME "\", offset: 0x%06x (0x%06x)\n",
 | 
				
			||||||
 | 
					+			__func__, (!strcmp(part->mtd.name, ROOTFS_SPLIT_NAME) ? "updating" : "creating"),
 | 
				
			||||||
 | 
					+			(u32) part->offset, (u32) part->mtd.size);
 | 
				
			||||||
 | 
					+		name = kmalloc(sizeof(ROOTFS_SPLIT_NAME) + 1, GFP_KERNEL);
 | 
				
			||||||
 | 
					+		strcpy(name, ROOTFS_SPLIT_NAME);
 | 
				
			||||||
 | 
					+		part->mtd.name = name;
 | 
				
			||||||
 | 
					+	} else if ((offset <= 0) && mtd->split) {
 | 
				
			||||||
 | 
					+		printk(KERN_INFO "%s: removing partition \"%s\"\n", __func__, mtd->split->name);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		/* mark existing partition as removed */
 | 
				
			||||||
 | 
					+		part = PART(mtd->split);
 | 
				
			||||||
 | 
					+		name = kmalloc(sizeof(ROOTFS_SPLIT_NAME) + 1, GFP_KERNEL);
 | 
				
			||||||
 | 
					+		strcpy(name, ROOTFS_REMOVED_NAME);
 | 
				
			||||||
 | 
					+		part->mtd.name = name;
 | 
				
			||||||
 | 
					+		part->offset = 0;
 | 
				
			||||||
 | 
					+		part->mtd.size = 0;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+#endif /* CONFIG_MTD_ROOTFS_SPLIT */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * This function, given a master MTD object and a partition table, creates
 | 
				
			||||||
 | 
					  * and registers slave MTD objects which are bound to the master according to
 | 
				
			||||||
 | 
					@@ -629,6 +780,9 @@ int add_mtd_partitions(struct mtd_info *
 | 
				
			||||||
 | 
					 	struct mtd_part *slave;
 | 
				
			||||||
 | 
					 	uint64_t cur_offset = 0;
 | 
				
			||||||
 | 
					 	int i;
 | 
				
			||||||
 | 
					+#ifdef CONFIG_MTD_ROOTFS_SPLIT
 | 
				
			||||||
 | 
					+	int ret;
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	printk(KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n", nbparts, master->name);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -643,12 +797,53 @@ int add_mtd_partitions(struct mtd_info *
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		add_mtd_device(&slave->mtd);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+		if (!strcmp(parts[i].name, "rootfs")) {
 | 
				
			||||||
 | 
					+#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV
 | 
				
			||||||
 | 
					+			if (ROOT_DEV == 0) {
 | 
				
			||||||
 | 
					+				printk(KERN_NOTICE "mtd: partition \"rootfs\" "
 | 
				
			||||||
 | 
					+					"set to be root filesystem\n");
 | 
				
			||||||
 | 
					+				ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, slave->mtd.index);
 | 
				
			||||||
 | 
					+			}
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+#ifdef CONFIG_MTD_ROOTFS_SPLIT
 | 
				
			||||||
 | 
					+			ret = split_rootfs_data(master, &slave->mtd, &parts[i]);
 | 
				
			||||||
 | 
					+			/* if (ret == 0)
 | 
				
			||||||
 | 
					+			 * 	j++; */
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 		cur_offset = slave->offset + slave->mtd.size;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	return 0;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+int mtd_device_refresh(struct mtd_info *mtd)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	int ret = 0;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (IS_PART(mtd)) {
 | 
				
			||||||
 | 
					+		struct mtd_part *part;
 | 
				
			||||||
 | 
					+		struct mtd_info *master;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		part = PART(mtd);
 | 
				
			||||||
 | 
					+		master = part->master;
 | 
				
			||||||
 | 
					+		if (master->refresh_device)
 | 
				
			||||||
 | 
					+			ret = master->refresh_device(master);
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (!ret && mtd->refresh_device)
 | 
				
			||||||
 | 
					+		ret = mtd->refresh_device(mtd);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#ifdef CONFIG_MTD_ROOTFS_SPLIT
 | 
				
			||||||
 | 
					+	if (!ret && IS_PART(mtd) && !strcmp(mtd->name, "rootfs"))
 | 
				
			||||||
 | 
					+		refresh_rootfs_split(mtd);
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+EXPORT_SYMBOL_GPL(mtd_device_refresh);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static DEFINE_SPINLOCK(part_parser_lock);
 | 
				
			||||||
 | 
					 static LIST_HEAD(part_parsers);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					--- a/drivers/mtd/mtdchar.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/mtdchar.c
 | 
				
			||||||
 | 
					@@ -1012,6 +1012,12 @@ static int mtdchar_ioctl(struct file *fi
 | 
				
			||||||
 | 
					 		break;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	case MTDREFRESH:
 | 
				
			||||||
 | 
					+	{
 | 
				
			||||||
 | 
					+		ret = mtd_device_refresh(mtd);
 | 
				
			||||||
 | 
					+		break;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	default:
 | 
				
			||||||
 | 
					 		ret = -ENOTTY;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					--- a/include/linux/mtd/mtd.h
 | 
				
			||||||
 | 
					+++ b/include/linux/mtd/mtd.h
 | 
				
			||||||
 | 
					@@ -114,6 +114,7 @@ struct nand_ecclayout {
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 struct module;	/* only needed for owner field in mtd_info */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+struct mtd_info;
 | 
				
			||||||
 | 
					 struct mtd_info {
 | 
				
			||||||
 | 
					 	u_char type;
 | 
				
			||||||
 | 
					 	uint32_t flags;
 | 
				
			||||||
 | 
					@@ -226,6 +227,9 @@ struct mtd_info {
 | 
				
			||||||
 | 
					 	int (*_block_markbad) (struct mtd_info *mtd, loff_t ofs);
 | 
				
			||||||
 | 
					 	int (*_suspend) (struct mtd_info *mtd);
 | 
				
			||||||
 | 
					 	void (*_resume) (struct mtd_info *mtd);
 | 
				
			||||||
 | 
					+	int (*refresh_device)(struct mtd_info *mtd);
 | 
				
			||||||
 | 
					+	struct mtd_info *split;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	/*
 | 
				
			||||||
 | 
					 	 * If the driver is something smart, like UBI, it may need to maintain
 | 
				
			||||||
 | 
					 	 * its own reference counting. The below functions are only for driver.
 | 
				
			||||||
 | 
					@@ -368,6 +372,7 @@ extern int mtd_device_parse_register(str
 | 
				
			||||||
 | 
					 			      int defnr_parts);
 | 
				
			||||||
 | 
					 #define mtd_device_register(master, parts, nr_parts)	\
 | 
				
			||||||
 | 
					 	mtd_device_parse_register(master, NULL, NULL, parts, nr_parts)
 | 
				
			||||||
 | 
					+extern int mtd_device_refresh(struct mtd_info *master);
 | 
				
			||||||
 | 
					 extern int mtd_device_unregister(struct mtd_info *master);
 | 
				
			||||||
 | 
					 extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num);
 | 
				
			||||||
 | 
					 extern int __get_mtd_device(struct mtd_info *mtd);
 | 
				
			||||||
 | 
					--- a/include/linux/mtd/partitions.h
 | 
				
			||||||
 | 
					+++ b/include/linux/mtd/partitions.h
 | 
				
			||||||
 | 
					@@ -36,12 +36,14 @@
 | 
				
			||||||
 | 
					  * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK).
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+struct mtd_partition;
 | 
				
			||||||
 | 
					 struct mtd_partition {
 | 
				
			||||||
 | 
					 	char *name;			/* identifier string */
 | 
				
			||||||
 | 
					 	uint64_t size;			/* partition size */
 | 
				
			||||||
 | 
					 	uint64_t offset;		/* offset within the master MTD space */
 | 
				
			||||||
 | 
					 	uint32_t mask_flags;		/* master MTD flags to mask out for this partition */
 | 
				
			||||||
 | 
					 	struct nand_ecclayout *ecclayout;	/* out of band layout for this partition (NAND only) */
 | 
				
			||||||
 | 
					+	int (*refresh_partition)(struct mtd_info *);
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define MTDPART_OFS_RETAIN	(-3)
 | 
				
			||||||
 | 
					--- a/include/uapi/mtd/mtd-abi.h
 | 
				
			||||||
 | 
					+++ b/include/uapi/mtd/mtd-abi.h
 | 
				
			||||||
 | 
					@@ -202,6 +202,7 @@ struct otp_info {
 | 
				
			||||||
 | 
					  * without OOB, e.g., NOR flash.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					 #define MEMWRITE		_IOWR('M', 24, struct mtd_write_req)
 | 
				
			||||||
 | 
					+#define MTDREFRESH		_IO('M', 50)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * Obsolete legacy interface. Keep it in order not to break userspace
 | 
				
			||||||
@@ -0,0 +1,145 @@
 | 
				
			|||||||
 | 
					--- a/drivers/mtd/mtdpart.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/mtdpart.c
 | 
				
			||||||
 | 
					@@ -35,6 +35,8 @@
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #include "mtdcore.h"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#define MTD_ERASE_PARTIAL	0x8000 /* partition only covers parts of an erase block */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 /* Our partition linked list */
 | 
				
			||||||
 | 
					 static LIST_HEAD(mtd_partitions);
 | 
				
			||||||
 | 
					 static DEFINE_MUTEX(mtd_partitions_mutex);
 | 
				
			||||||
 | 
					@@ -230,13 +232,60 @@ static int part_erase(struct mtd_info *m
 | 
				
			||||||
 | 
					 	struct mtd_part *part = PART(mtd);
 | 
				
			||||||
 | 
					 	int ret;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	instr->partial_start = false;
 | 
				
			||||||
 | 
					+	if (mtd->flags & MTD_ERASE_PARTIAL) {
 | 
				
			||||||
 | 
					+		size_t readlen = 0;
 | 
				
			||||||
 | 
					+		u64 mtd_ofs;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		instr->erase_buf = kmalloc(part->master->erasesize, GFP_ATOMIC);
 | 
				
			||||||
 | 
					+		if (!instr->erase_buf)
 | 
				
			||||||
 | 
					+			return -ENOMEM;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		mtd_ofs = part->offset + instr->addr;
 | 
				
			||||||
 | 
					+		instr->erase_buf_ofs = do_div(mtd_ofs, part->master->erasesize);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		if (instr->erase_buf_ofs > 0) {
 | 
				
			||||||
 | 
					+			instr->addr -= instr->erase_buf_ofs;
 | 
				
			||||||
 | 
					+			ret = mtd_read(part->master,
 | 
				
			||||||
 | 
					+				instr->addr + part->offset,
 | 
				
			||||||
 | 
					+				part->master->erasesize,
 | 
				
			||||||
 | 
					+				&readlen, instr->erase_buf);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+			instr->partial_start = true;
 | 
				
			||||||
 | 
					+		} else {
 | 
				
			||||||
 | 
					+			mtd_ofs = part->offset + part->mtd.size;
 | 
				
			||||||
 | 
					+			instr->erase_buf_ofs = part->master->erasesize -
 | 
				
			||||||
 | 
					+				do_div(mtd_ofs, part->master->erasesize);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+			if (instr->erase_buf_ofs > 0) {
 | 
				
			||||||
 | 
					+				instr->len += instr->erase_buf_ofs;
 | 
				
			||||||
 | 
					+				ret = mtd_read(part->master,
 | 
				
			||||||
 | 
					+					part->offset + instr->addr +
 | 
				
			||||||
 | 
					+					instr->len - part->master->erasesize,
 | 
				
			||||||
 | 
					+					part->master->erasesize, &readlen,
 | 
				
			||||||
 | 
					+					instr->erase_buf);
 | 
				
			||||||
 | 
					+			} else {
 | 
				
			||||||
 | 
					+				ret = 0;
 | 
				
			||||||
 | 
					+			}
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+		if (ret < 0) {
 | 
				
			||||||
 | 
					+			kfree(instr->erase_buf);
 | 
				
			||||||
 | 
					+			return ret;
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	instr->addr += part->offset;
 | 
				
			||||||
 | 
					 	ret = part->master->_erase(part->master, instr);
 | 
				
			||||||
 | 
					 	if (ret) {
 | 
				
			||||||
 | 
					 		if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
 | 
				
			||||||
 | 
					 			instr->fail_addr -= part->offset;
 | 
				
			||||||
 | 
					 		instr->addr -= part->offset;
 | 
				
			||||||
 | 
					+		if (mtd->flags & MTD_ERASE_PARTIAL)
 | 
				
			||||||
 | 
					+			kfree(instr->erase_buf);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	return ret;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -244,7 +293,25 @@ void mtd_erase_callback(struct erase_inf
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	if (instr->mtd->_erase == part_erase) {
 | 
				
			||||||
 | 
					 		struct mtd_part *part = PART(instr->mtd);
 | 
				
			||||||
 | 
					+		size_t wrlen = 0;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+		if (instr->mtd->flags & MTD_ERASE_PARTIAL) {
 | 
				
			||||||
 | 
					+			if (instr->partial_start) {
 | 
				
			||||||
 | 
					+				part->master->_write(part->master,
 | 
				
			||||||
 | 
					+					instr->addr, instr->erase_buf_ofs,
 | 
				
			||||||
 | 
					+					&wrlen, instr->erase_buf);
 | 
				
			||||||
 | 
					+				instr->addr += instr->erase_buf_ofs;
 | 
				
			||||||
 | 
					+			} else {
 | 
				
			||||||
 | 
					+				instr->len -= instr->erase_buf_ofs;
 | 
				
			||||||
 | 
					+				part->master->_write(part->master,
 | 
				
			||||||
 | 
					+					instr->addr + instr->len,
 | 
				
			||||||
 | 
					+					instr->erase_buf_ofs, &wrlen,
 | 
				
			||||||
 | 
					+					instr->erase_buf +
 | 
				
			||||||
 | 
					+					part->master->erasesize -
 | 
				
			||||||
 | 
					+					instr->erase_buf_ofs);
 | 
				
			||||||
 | 
					+			}
 | 
				
			||||||
 | 
					+			kfree(instr->erase_buf);
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					 		if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
 | 
				
			||||||
 | 
					 			instr->fail_addr -= part->offset;
 | 
				
			||||||
 | 
					 		instr->addr -= part->offset;
 | 
				
			||||||
 | 
					@@ -504,18 +571,24 @@ static struct mtd_part *allocate_partiti
 | 
				
			||||||
 | 
					 	if ((slave->mtd.flags & MTD_WRITEABLE) &&
 | 
				
			||||||
 | 
					 	    mtd_mod_by_eb(slave->offset, &slave->mtd)) {
 | 
				
			||||||
 | 
					 		/* Doesn't start on a boundary of major erase size */
 | 
				
			||||||
 | 
					-		/* FIXME: Let it be writable if it is on a boundary of
 | 
				
			||||||
 | 
					-		 * _minor_ erase size though */
 | 
				
			||||||
 | 
					-		slave->mtd.flags &= ~MTD_WRITEABLE;
 | 
				
			||||||
 | 
					-		printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase block boundary -- force read-only\n",
 | 
				
			||||||
 | 
					-			part->name);
 | 
				
			||||||
 | 
					+		slave->mtd.flags |= MTD_ERASE_PARTIAL;
 | 
				
			||||||
 | 
					+		if (((u32) slave->mtd.size) > master->erasesize)
 | 
				
			||||||
 | 
					+			slave->mtd.flags &= ~MTD_WRITEABLE;
 | 
				
			||||||
 | 
					+		else
 | 
				
			||||||
 | 
					+			slave->mtd.erasesize = slave->mtd.size;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 	if ((slave->mtd.flags & MTD_WRITEABLE) &&
 | 
				
			||||||
 | 
					-	    mtd_mod_by_eb(slave->mtd.size, &slave->mtd)) {
 | 
				
			||||||
 | 
					-		slave->mtd.flags &= ~MTD_WRITEABLE;
 | 
				
			||||||
 | 
					-		printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase block -- force read-only\n",
 | 
				
			||||||
 | 
					-			part->name);
 | 
				
			||||||
 | 
					+	    mtd_mod_by_eb(slave->offset + slave->mtd.size, &slave->mtd)) {
 | 
				
			||||||
 | 
					+		slave->mtd.flags |= MTD_ERASE_PARTIAL;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		if ((u32) slave->mtd.size > master->erasesize)
 | 
				
			||||||
 | 
					+			slave->mtd.flags &= ~MTD_WRITEABLE;
 | 
				
			||||||
 | 
					+		else
 | 
				
			||||||
 | 
					+			slave->mtd.erasesize = slave->mtd.size;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					+	if ((slave->mtd.flags & (MTD_ERASE_PARTIAL|MTD_WRITEABLE)) == MTD_ERASE_PARTIAL)
 | 
				
			||||||
 | 
					+		printk(KERN_WARNING"mtd: partition \"%s\" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only\n",
 | 
				
			||||||
 | 
					+				part->name);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	slave->mtd.ecclayout = master->ecclayout;
 | 
				
			||||||
 | 
					 	slave->mtd.ecc_strength = master->ecc_strength;
 | 
				
			||||||
 | 
					--- a/include/linux/mtd/mtd.h
 | 
				
			||||||
 | 
					+++ b/include/linux/mtd/mtd.h
 | 
				
			||||||
 | 
					@@ -58,6 +58,10 @@ struct erase_info {
 | 
				
			||||||
 | 
					 	u_long priv;
 | 
				
			||||||
 | 
					 	u_char state;
 | 
				
			||||||
 | 
					 	struct erase_info *next;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	u8 *erase_buf;
 | 
				
			||||||
 | 
					+	u32 erase_buf_ofs;
 | 
				
			||||||
 | 
					+	bool partial_start;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 struct mtd_erase_region_info {
 | 
				
			||||||
@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					--- a/include/linux/mtd/partitions.h
 | 
				
			||||||
 | 
					+++ b/include/linux/mtd/partitions.h
 | 
				
			||||||
 | 
					@@ -35,6 +35,7 @@
 | 
				
			||||||
 | 
					  * Note: writeable partitions require their size and offset be
 | 
				
			||||||
 | 
					  * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK).
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					+struct mtd_info;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 struct mtd_partition;
 | 
				
			||||||
 | 
					 struct mtd_partition {
 | 
				
			||||||
 | 
					@@ -52,7 +53,6 @@ struct mtd_partition {
 | 
				
			||||||
 | 
					 #define MTDPART_SIZ_FULL	(0)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-struct mtd_info;
 | 
				
			||||||
 | 
					 struct device_node;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /**
 | 
				
			||||||
							
								
								
									
										30
									
								
								target/linux/generic/patches-3.8/420-redboot_space.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								target/linux/generic/patches-3.8/420-redboot_space.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					--- a/drivers/mtd/redboot.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/redboot.c
 | 
				
			||||||
 | 
					@@ -265,14 +265,21 @@ static int parse_redboot_partitions(stru
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 		names += strlen(names)+1;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
 | 
				
			||||||
 | 
					 		if(fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_base) {
 | 
				
			||||||
 | 
					-			i++;
 | 
				
			||||||
 | 
					-			parts[i].offset = parts[i-1].size + parts[i-1].offset;
 | 
				
			||||||
 | 
					-			parts[i].size = fl->next->img->flash_base - parts[i].offset;
 | 
				
			||||||
 | 
					-			parts[i].name = nullname;
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					+			if (!strcmp(parts[i].name, "rootfs")) {
 | 
				
			||||||
 | 
					+				parts[i].size = fl->next->img->flash_base;
 | 
				
			||||||
 | 
					+				parts[i].size &= ~(master->erasesize - 1);
 | 
				
			||||||
 | 
					+				parts[i].size -= parts[i].offset;
 | 
				
			||||||
 | 
					+#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
 | 
				
			||||||
 | 
					+				nrparts--;
 | 
				
			||||||
 | 
					+			} else {
 | 
				
			||||||
 | 
					+				i++;
 | 
				
			||||||
 | 
					+				parts[i].offset = parts[i-1].size + parts[i-1].offset;
 | 
				
			||||||
 | 
					+				parts[i].size = fl->next->img->flash_base - parts[i].offset;
 | 
				
			||||||
 | 
					+				parts[i].name = nullname;
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					+			}
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					 		tmp_fl = fl;
 | 
				
			||||||
 | 
					 		fl = fl->next;
 | 
				
			||||||
 | 
					 		kfree(tmp_fl);
 | 
				
			||||||
@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					--- a/drivers/mtd/Kconfig
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/Kconfig
 | 
				
			||||||
 | 
					@@ -163,6 +163,22 @@ config MTD_BCM47XX_PARTS
 | 
				
			||||||
 | 
					 	  This provides partitions parser for devices based on BCM47xx
 | 
				
			||||||
 | 
					 	  boards.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+config MTD_MYLOADER_PARTS
 | 
				
			||||||
 | 
					+	tristate "MyLoader partition parsing"
 | 
				
			||||||
 | 
					+	depends on ADM5120 || ATHEROS_AR231X || ATHEROS_AR71XX || ATH79
 | 
				
			||||||
 | 
					+	---help---
 | 
				
			||||||
 | 
					+	  MyLoader is a bootloader which allows the user to define partitions
 | 
				
			||||||
 | 
					+	  in flash devices, by putting a table in the second erase block
 | 
				
			||||||
 | 
					+	  on the device, similar to a partition table. This table gives the 
 | 
				
			||||||
 | 
					+	  offsets and lengths of the user defined partitions.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	  If you need code which can detect and parse these tables, and
 | 
				
			||||||
 | 
					+	  register MTD 'partitions' corresponding to each image detected,
 | 
				
			||||||
 | 
					+	  enable this option.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	  You will still need the parsing functions to be called by the driver
 | 
				
			||||||
 | 
					+	  for your particular device. It won't happen automatically.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 comment "User Modules And Translation Layers"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config MTD_CHAR
 | 
				
			||||||
 | 
					--- a/drivers/mtd/Makefile
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/Makefile
 | 
				
			||||||
 | 
					@@ -13,6 +13,7 @@ obj-$(CONFIG_MTD_AFS_PARTS)	+= afs.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_MTD_AR7_PARTS)	+= ar7part.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_MTD_BCM63XX_PARTS)	+= bcm63xxpart.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_MTD_BCM47XX_PARTS)	+= bcm47xxpart.o
 | 
				
			||||||
 | 
					+obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 # 'Users' - code which presents functionality to userspace.
 | 
				
			||||||
 | 
					 obj-$(CONFIG_MTD_CHAR)		+= mtdchar.o
 | 
				
			||||||
							
								
								
									
										116
									
								
								target/linux/generic/patches-3.8/440-block2mtd_init.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								target/linux/generic/patches-3.8/440-block2mtd_init.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
				
			|||||||
 | 
					--- a/drivers/mtd/devices/block2mtd.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/devices/block2mtd.c
 | 
				
			||||||
 | 
					@@ -14,6 +14,7 @@
 | 
				
			||||||
 | 
					 #include <linux/list.h>
 | 
				
			||||||
 | 
					 #include <linux/init.h>
 | 
				
			||||||
 | 
					 #include <linux/mtd/mtd.h>
 | 
				
			||||||
 | 
					+#include <linux/mtd/partitions.h>
 | 
				
			||||||
 | 
					 #include <linux/mutex.h>
 | 
				
			||||||
 | 
					 #include <linux/mount.h>
 | 
				
			||||||
 | 
					 #include <linux/slab.h>
 | 
				
			||||||
 | 
					@@ -210,11 +211,12 @@ static void block2mtd_free_device(struct
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* FIXME: ensure that mtd->size % erase_size == 0 */
 | 
				
			||||||
 | 
					-static struct block2mtd_dev *add_device(char *devname, int erase_size)
 | 
				
			||||||
 | 
					+static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL;
 | 
				
			||||||
 | 
					 	struct block_device *bdev;
 | 
				
			||||||
 | 
					 	struct block2mtd_dev *dev;
 | 
				
			||||||
 | 
					+	struct mtd_partition *part;
 | 
				
			||||||
 | 
					 	char *name;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (!devname)
 | 
				
			||||||
 | 
					@@ -253,13 +255,16 @@ static struct block2mtd_dev *add_device(
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* Setup the MTD structure */
 | 
				
			||||||
 | 
					 	/* make the name contain the block device in */
 | 
				
			||||||
 | 
					-	name = kasprintf(GFP_KERNEL, "block2mtd: %s", devname);
 | 
				
			||||||
 | 
					+	if (!mtdname)
 | 
				
			||||||
 | 
					+		mtdname = devname;
 | 
				
			||||||
 | 
					+	name = kmalloc(strlen(mtdname) + 1, GFP_KERNEL);
 | 
				
			||||||
 | 
					 	if (!name)
 | 
				
			||||||
 | 
					 		goto devinit_err;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	strcpy(name, mtdname);
 | 
				
			||||||
 | 
					 	dev->mtd.name = name;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;
 | 
				
			||||||
 | 
					+	dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK & ~(erase_size - 1);
 | 
				
			||||||
 | 
					 	dev->mtd.erasesize = erase_size;
 | 
				
			||||||
 | 
					 	dev->mtd.writesize = 1;
 | 
				
			||||||
 | 
					 	dev->mtd.writebufsize = PAGE_SIZE;
 | 
				
			||||||
 | 
					@@ -272,14 +277,17 @@ static struct block2mtd_dev *add_device(
 | 
				
			||||||
 | 
					 	dev->mtd.priv = dev;
 | 
				
			||||||
 | 
					 	dev->mtd.owner = THIS_MODULE;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	if (mtd_device_register(&dev->mtd, NULL, 0)) {
 | 
				
			||||||
 | 
					+	part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL);
 | 
				
			||||||
 | 
					+	part->name = name;
 | 
				
			||||||
 | 
					+	part->offset = 0;
 | 
				
			||||||
 | 
					+	part->size = dev->mtd.size;
 | 
				
			||||||
 | 
					+	if (mtd_device_register(&dev->mtd, part, 1)) {
 | 
				
			||||||
 | 
					 		/* Device didn't get added, so free the entry */
 | 
				
			||||||
 | 
					 		goto devinit_err;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 	list_add(&dev->list, &blkmtd_device_list);
 | 
				
			||||||
 | 
					 	INFO("mtd%d: [%s] erase_size = %dKiB [%d]", dev->mtd.index,
 | 
				
			||||||
 | 
					-			dev->mtd.name + strlen("block2mtd: "),
 | 
				
			||||||
 | 
					-			dev->mtd.erasesize >> 10, dev->mtd.erasesize);
 | 
				
			||||||
 | 
					+			mtdname, dev->mtd.erasesize >> 10, dev->mtd.erasesize);
 | 
				
			||||||
 | 
					 	return dev;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 devinit_err:
 | 
				
			||||||
 | 
					@@ -352,9 +360,9 @@ static char block2mtd_paramline[80 + 12]
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static int block2mtd_setup2(const char *val)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					-	char buf[80 + 12]; /* 80 for device, 12 for erase size */
 | 
				
			||||||
 | 
					+	char buf[80 + 12 + 80]; /* 80 for device, 12 for erase size, 80 for name */
 | 
				
			||||||
 | 
					 	char *str = buf;
 | 
				
			||||||
 | 
					-	char *token[2];
 | 
				
			||||||
 | 
					+	char *token[3];
 | 
				
			||||||
 | 
					 	char *name;
 | 
				
			||||||
 | 
					 	size_t erase_size = PAGE_SIZE;
 | 
				
			||||||
 | 
					 	int i, ret;
 | 
				
			||||||
 | 
					@@ -365,7 +373,7 @@ static int block2mtd_setup2(const char *
 | 
				
			||||||
 | 
					 	strcpy(str, val);
 | 
				
			||||||
 | 
					 	kill_final_newline(str);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	for (i = 0; i < 2; i++)
 | 
				
			||||||
 | 
					+	for (i = 0; i < 3; i++)
 | 
				
			||||||
 | 
					 		token[i] = strsep(&str, ",");
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (str)
 | 
				
			||||||
 | 
					@@ -384,8 +392,10 @@ static int block2mtd_setup2(const char *
 | 
				
			||||||
 | 
					 			parse_err("illegal erase size");
 | 
				
			||||||
 | 
					 		}
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					+	if (token[2] && (strlen(token[2]) + 1 > 80))
 | 
				
			||||||
 | 
					+		parse_err("mtd device name too long");
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	add_device(name, erase_size);
 | 
				
			||||||
 | 
					+	add_device(name, erase_size, token[2]);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	return 0;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					@@ -419,7 +429,7 @@ static int block2mtd_setup(const char *v
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
 | 
				
			||||||
 | 
					-MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>]\"");
 | 
				
			||||||
 | 
					+MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>]]\"");
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static int __init block2mtd_init(void)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					--- a/block/partition-generic.c
 | 
				
			||||||
 | 
					+++ b/block/partition-generic.c
 | 
				
			||||||
 | 
					@@ -548,6 +548,7 @@ int invalidate_partitions(struct gendisk
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	return 0;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					+EXPORT_SYMBOL(rescan_partitions);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 unsigned char *read_dev_sector(struct block_device *bdev, sector_t n, Sector *p)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
							
								
								
									
										268
									
								
								target/linux/generic/patches-3.8/441-block2mtd_refresh.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										268
									
								
								target/linux/generic/patches-3.8/441-block2mtd_refresh.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,268 @@
 | 
				
			|||||||
 | 
					--- a/drivers/mtd/devices/block2mtd.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/devices/block2mtd.c
 | 
				
			||||||
 | 
					@@ -29,6 +29,8 @@ struct block2mtd_dev {
 | 
				
			||||||
 | 
					 	struct block_device *blkdev;
 | 
				
			||||||
 | 
					 	struct mtd_info mtd;
 | 
				
			||||||
 | 
					 	struct mutex write_mutex;
 | 
				
			||||||
 | 
					+	rwlock_t bdev_mutex;
 | 
				
			||||||
 | 
					+	char devname[0];
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -80,6 +82,12 @@ static int block2mtd_erase(struct mtd_in
 | 
				
			||||||
 | 
					 	size_t len = instr->len;
 | 
				
			||||||
 | 
					 	int err;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	read_lock(&dev->bdev_mutex);
 | 
				
			||||||
 | 
					+	if (!dev->blkdev) {
 | 
				
			||||||
 | 
					+		err = -EINVAL;
 | 
				
			||||||
 | 
					+		goto done;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	instr->state = MTD_ERASING;
 | 
				
			||||||
 | 
					 	mutex_lock(&dev->write_mutex);
 | 
				
			||||||
 | 
					 	err = _block2mtd_erase(dev, from, len);
 | 
				
			||||||
 | 
					@@ -91,6 +99,10 @@ static int block2mtd_erase(struct mtd_in
 | 
				
			||||||
 | 
					 		instr->state = MTD_ERASE_DONE;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	mtd_erase_callback(instr);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+done:
 | 
				
			||||||
 | 
					+	read_unlock(&dev->bdev_mutex);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	return err;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -102,7 +114,13 @@ static int block2mtd_read(struct mtd_inf
 | 
				
			||||||
 | 
					 	struct page *page;
 | 
				
			||||||
 | 
					 	int index = from >> PAGE_SHIFT;
 | 
				
			||||||
 | 
					 	int offset = from & (PAGE_SIZE-1);
 | 
				
			||||||
 | 
					-	int cpylen;
 | 
				
			||||||
 | 
					+	int cpylen, err = 0;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	read_lock(&dev->bdev_mutex);
 | 
				
			||||||
 | 
					+	if (!dev->blkdev || (from > mtd->size)) {
 | 
				
			||||||
 | 
					+		err = -EINVAL;
 | 
				
			||||||
 | 
					+		goto done;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	while (len) {
 | 
				
			||||||
 | 
					 		if ((offset + len) > PAGE_SIZE)
 | 
				
			||||||
 | 
					@@ -112,8 +130,10 @@ static int block2mtd_read(struct mtd_inf
 | 
				
			||||||
 | 
					 		len = len - cpylen;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		page = page_read(dev->blkdev->bd_inode->i_mapping, index);
 | 
				
			||||||
 | 
					-		if (IS_ERR(page))
 | 
				
			||||||
 | 
					+		if (IS_ERR(page)) {
 | 
				
			||||||
 | 
					 			return PTR_ERR(page);
 | 
				
			||||||
 | 
					+			goto done;
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		memcpy(buf, page_address(page) + offset, cpylen);
 | 
				
			||||||
 | 
					 		page_cache_release(page);
 | 
				
			||||||
 | 
					@@ -124,7 +144,10 @@ static int block2mtd_read(struct mtd_inf
 | 
				
			||||||
 | 
					 		offset = 0;
 | 
				
			||||||
 | 
					 		index++;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					-	return 0;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+done:
 | 
				
			||||||
 | 
					+	read_unlock(&dev->bdev_mutex);
 | 
				
			||||||
 | 
					+	return err;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -173,13 +196,22 @@ static int block2mtd_write(struct mtd_in
 | 
				
			||||||
 | 
					 		size_t *retlen, const u_char *buf)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	struct block2mtd_dev *dev = mtd->priv;
 | 
				
			||||||
 | 
					-	int err;
 | 
				
			||||||
 | 
					+	int err = 0;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	read_lock(&dev->bdev_mutex);
 | 
				
			||||||
 | 
					+	if (!dev->blkdev) {
 | 
				
			||||||
 | 
					+		err = -EINVAL;
 | 
				
			||||||
 | 
					+		goto done;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	mutex_lock(&dev->write_mutex);
 | 
				
			||||||
 | 
					 	err = _block2mtd_write(dev, buf, to, len, retlen);
 | 
				
			||||||
 | 
					 	mutex_unlock(&dev->write_mutex);
 | 
				
			||||||
 | 
					 	if (err > 0)
 | 
				
			||||||
 | 
					 		err = 0;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+done:
 | 
				
			||||||
 | 
					+	read_unlock(&dev->bdev_mutex);
 | 
				
			||||||
 | 
					 	return err;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -188,33 +220,110 @@ static int block2mtd_write(struct mtd_in
 | 
				
			||||||
 | 
					 static void block2mtd_sync(struct mtd_info *mtd)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	struct block2mtd_dev *dev = mtd->priv;
 | 
				
			||||||
 | 
					+	read_lock(&dev->bdev_mutex);
 | 
				
			||||||
 | 
					+	if (dev->blkdev)
 | 
				
			||||||
 | 
					 	sync_blockdev(dev->blkdev);
 | 
				
			||||||
 | 
					+	read_unlock(&dev->bdev_mutex);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	return;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+static int _open_bdev(struct block2mtd_dev *dev)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL;
 | 
				
			||||||
 | 
					+	struct block_device *bdev;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* Get a handle on the device */
 | 
				
			||||||
 | 
					+	bdev = blkdev_get_by_path(dev->devname, mode, dev);
 | 
				
			||||||
 | 
					+#ifndef MODULE
 | 
				
			||||||
 | 
					+	if (IS_ERR(bdev)) {
 | 
				
			||||||
 | 
					+		dev_t devt;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		/* We might not have rootfs mounted at this point. Try
 | 
				
			||||||
 | 
					+		   to resolve the device name by other means. */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		devt = name_to_dev_t(dev->devname);
 | 
				
			||||||
 | 
					+		if (devt)
 | 
				
			||||||
 | 
					+			bdev = blkdev_get_by_dev(devt, mode, dev);
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (IS_ERR(bdev)) {
 | 
				
			||||||
 | 
					+		ERROR("error: cannot open device %s", dev->devname);
 | 
				
			||||||
 | 
					+		return 1;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+	dev->blkdev = bdev;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) {
 | 
				
			||||||
 | 
					+		ERROR("attempting to use an MTD device as a block device");
 | 
				
			||||||
 | 
					+		return 1;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void _close_bdev(struct block2mtd_dev *dev)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct block_device *bdev;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (!dev->blkdev)
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	bdev = dev->blkdev;
 | 
				
			||||||
 | 
					+	invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping, 0, -1);
 | 
				
			||||||
 | 
					+	blkdev_put(dev->blkdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);
 | 
				
			||||||
 | 
					+	dev->blkdev = NULL;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static void block2mtd_free_device(struct block2mtd_dev *dev)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	if (!dev)
 | 
				
			||||||
 | 
					 		return;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	kfree(dev->mtd.name);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	if (dev->blkdev) {
 | 
				
			||||||
 | 
					-		invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping,
 | 
				
			||||||
 | 
					-					0, -1);
 | 
				
			||||||
 | 
					-		blkdev_put(dev->blkdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);
 | 
				
			||||||
 | 
					-	}
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+	_close_bdev(dev);
 | 
				
			||||||
 | 
					 	kfree(dev);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-/* FIXME: ensure that mtd->size % erase_size == 0 */
 | 
				
			||||||
 | 
					-static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
 | 
				
			||||||
 | 
					+static int block2mtd_refresh(struct mtd_info *mtd)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					-	const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL;
 | 
				
			||||||
 | 
					+	struct block2mtd_dev *dev = mtd->priv;
 | 
				
			||||||
 | 
					 	struct block_device *bdev;
 | 
				
			||||||
 | 
					+	dev_t devt;
 | 
				
			||||||
 | 
					+	int err = 0;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* no other mtd function can run at this point */
 | 
				
			||||||
 | 
					+	write_lock(&dev->bdev_mutex);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* get the device number for the whole disk */
 | 
				
			||||||
 | 
					+	devt = MKDEV(MAJOR(dev->blkdev->bd_dev), 0);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* close the old block device */
 | 
				
			||||||
 | 
					+	_close_bdev(dev);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* open the whole disk, issue a partition rescan, then */
 | 
				
			||||||
 | 
					+	bdev = blkdev_get_by_dev(devt, FMODE_WRITE | FMODE_READ, mtd);
 | 
				
			||||||
 | 
					+	if (!bdev || !bdev->bd_disk)
 | 
				
			||||||
 | 
					+		err = -EINVAL;
 | 
				
			||||||
 | 
					+#ifndef CONFIG_MTD_BLOCK2MTD_MODULE
 | 
				
			||||||
 | 
					+	else
 | 
				
			||||||
 | 
					+		err = rescan_partitions(bdev->bd_disk, bdev);
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+	if (bdev)
 | 
				
			||||||
 | 
					+		blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* try to open the partition block device again */
 | 
				
			||||||
 | 
					+	_open_bdev(dev);
 | 
				
			||||||
 | 
					+	write_unlock(&dev->bdev_mutex);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return err;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+/* FIXME: ensure that mtd->size % erase_size == 0 */
 | 
				
			||||||
 | 
					+static struct block2mtd_dev *add_device(char *devname, int erase_size, char *mtdname)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					 	struct block2mtd_dev *dev;
 | 
				
			||||||
 | 
					 	struct mtd_partition *part;
 | 
				
			||||||
 | 
					 	char *name;
 | 
				
			||||||
 | 
					@@ -222,36 +331,17 @@ static struct block2mtd_dev *add_device(
 | 
				
			||||||
 | 
					 	if (!devname)
 | 
				
			||||||
 | 
					 		return NULL;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	dev = kzalloc(sizeof(struct block2mtd_dev), GFP_KERNEL);
 | 
				
			||||||
 | 
					+	dev = kzalloc(sizeof(struct block2mtd_dev) + strlen(devname) + 1, GFP_KERNEL);
 | 
				
			||||||
 | 
					 	if (!dev)
 | 
				
			||||||
 | 
					 		return NULL;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	/* Get a handle on the device */
 | 
				
			||||||
 | 
					-	bdev = blkdev_get_by_path(devname, mode, dev);
 | 
				
			||||||
 | 
					-#ifndef MODULE
 | 
				
			||||||
 | 
					-	if (IS_ERR(bdev)) {
 | 
				
			||||||
 | 
					+	strcpy(dev->devname, devname);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-		/* We might not have rootfs mounted at this point. Try
 | 
				
			||||||
 | 
					-		   to resolve the device name by other means. */
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-		dev_t devt = name_to_dev_t(devname);
 | 
				
			||||||
 | 
					-		if (devt)
 | 
				
			||||||
 | 
					-			bdev = blkdev_get_by_dev(devt, mode, dev);
 | 
				
			||||||
 | 
					-	}
 | 
				
			||||||
 | 
					-#endif
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	if (IS_ERR(bdev)) {
 | 
				
			||||||
 | 
					-		ERROR("error: cannot open device %s", devname);
 | 
				
			||||||
 | 
					-		goto devinit_err;
 | 
				
			||||||
 | 
					-	}
 | 
				
			||||||
 | 
					-	dev->blkdev = bdev;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) {
 | 
				
			||||||
 | 
					-		ERROR("attempting to use an MTD device as a block device");
 | 
				
			||||||
 | 
					+	if (_open_bdev(dev))
 | 
				
			||||||
 | 
					 		goto devinit_err;
 | 
				
			||||||
 | 
					-	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	mutex_init(&dev->write_mutex);
 | 
				
			||||||
 | 
					+	rwlock_init(&dev->bdev_mutex);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* Setup the MTD structure */
 | 
				
			||||||
 | 
					 	/* make the name contain the block device in */
 | 
				
			||||||
 | 
					@@ -276,6 +366,7 @@ static struct block2mtd_dev *add_device(
 | 
				
			||||||
 | 
					 	dev->mtd._read = block2mtd_read;
 | 
				
			||||||
 | 
					 	dev->mtd.priv = dev;
 | 
				
			||||||
 | 
					 	dev->mtd.owner = THIS_MODULE;
 | 
				
			||||||
 | 
					+	dev->mtd.refresh_device = block2mtd_refresh;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL);
 | 
				
			||||||
 | 
					 	part->name = name;
 | 
				
			||||||
							
								
								
									
										10
									
								
								target/linux/generic/patches-3.8/442-block2mtd_probe.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								target/linux/generic/patches-3.8/442-block2mtd_probe.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					--- a/drivers/mtd/devices/block2mtd.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/devices/block2mtd.c
 | 
				
			||||||
 | 
					@@ -243,6 +243,7 @@ static int _open_bdev(struct block2mtd_d
 | 
				
			||||||
 | 
					 		/* We might not have rootfs mounted at this point. Try
 | 
				
			||||||
 | 
					 		   to resolve the device name by other means. */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+		wait_for_device_probe();
 | 
				
			||||||
 | 
					 		devt = name_to_dev_t(dev->devname);
 | 
				
			||||||
 | 
					 		if (devt)
 | 
				
			||||||
 | 
					 			bdev = blkdev_get_by_dev(devt, mode, dev);
 | 
				
			||||||
@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					 drivers/mtd/nand/plat_nand.c |   13 ++++++++++++-
 | 
				
			||||||
 | 
					 include/linux/mtd/nand.h     |    1 +
 | 
				
			||||||
 | 
					 2 files changed, 13 insertions(+), 1 deletion(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/include/linux/mtd/nand.h
 | 
				
			||||||
 | 
					+++ b/include/linux/mtd/nand.h
 | 
				
			||||||
 | 
					@@ -647,6 +647,7 @@ struct platform_nand_chip {
 | 
				
			||||||
 | 
					 	unsigned int options;
 | 
				
			||||||
 | 
					 	unsigned int bbt_options;
 | 
				
			||||||
 | 
					 	const char **part_probe_types;
 | 
				
			||||||
 | 
					+	int (*chip_fixup)(struct mtd_info *mtd);
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* Keep gcc happy */
 | 
				
			||||||
 | 
					--- a/drivers/mtd/nand/plat_nand.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/nand/plat_nand.c
 | 
				
			||||||
 | 
					@@ -103,7 +103,18 @@ static int plat_nand_probe(struct platfo
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* Scan to find existence of the device */
 | 
				
			||||||
 | 
					-	if (nand_scan(&data->mtd, pdata->chip.nr_chips)) {
 | 
				
			||||||
 | 
					+	if (nand_scan_ident(&data->mtd, pdata->chip.nr_chips, NULL)) {
 | 
				
			||||||
 | 
					+		err = -ENXIO;
 | 
				
			||||||
 | 
					+		goto out;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (pdata->chip.chip_fixup) {
 | 
				
			||||||
 | 
					+		err = pdata->chip.chip_fixup(&data->mtd);
 | 
				
			||||||
 | 
					+		if (err)
 | 
				
			||||||
 | 
					+			goto out;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (nand_scan_tail(&data->mtd)) {
 | 
				
			||||||
 | 
					 		err = -ENXIO;
 | 
				
			||||||
 | 
					 		goto out;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					--- a/drivers/mtd/nand/nand_ecc.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/nand/nand_ecc.c
 | 
				
			||||||
 | 
					@@ -507,8 +507,7 @@ int __nand_correct_data(unsigned char *b
 | 
				
			||||||
 | 
					 	if ((bitsperbyte[b0] + bitsperbyte[b1] + bitsperbyte[b2]) == 1)
 | 
				
			||||||
 | 
					 		return 1;	/* error in ECC data; no action needed */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	printk(KERN_ERR "uncorrectable error : ");
 | 
				
			||||||
 | 
					-	return -1;
 | 
				
			||||||
 | 
					+	return -EBADMSG;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 EXPORT_SYMBOL(__nand_correct_data);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					--- a/drivers/mtd/chips/cfi_cmdset_0002.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
 | 
				
			||||||
 | 
					@@ -762,7 +762,7 @@ static int get_chip(struct map_info *map
 | 
				
			||||||
 | 
					 		return 0;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	case FL_ERASING:
 | 
				
			||||||
 | 
					-		if (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) ||
 | 
				
			||||||
 | 
					+		if (1 /* no suspend */ || !cfip || !(cfip->EraseSuspend & (0x1|0x2)) ||
 | 
				
			||||||
 | 
					 		    !(mode == FL_READY || mode == FL_POINT ||
 | 
				
			||||||
 | 
					 		    (mode == FL_WRITING && (cfip->EraseSuspend & 0x2))))
 | 
				
			||||||
 | 
					 			goto sleep;
 | 
				
			||||||
@@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					--- a/drivers/mtd/devices/m25p80.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/devices/m25p80.c
 | 
				
			||||||
 | 
					@@ -45,6 +45,7 @@
 | 
				
			||||||
 | 
					 #define	OPCODE_BE_4K		0x20	/* Erase 4KiB block */
 | 
				
			||||||
 | 
					 #define	OPCODE_BE_32K		0x52	/* Erase 32KiB block */
 | 
				
			||||||
 | 
					 #define	OPCODE_CHIP_ERASE	0xc7	/* Erase whole flash chip */
 | 
				
			||||||
 | 
					+#define	OPCODE_BE_4K_PMC	0xd7	/* Erase 4KiB block on PMC chips*/
 | 
				
			||||||
 | 
					 #define	OPCODE_SE		0xd8	/* Sector erase (usually 64KiB) */
 | 
				
			||||||
 | 
					 #define	OPCODE_RDID		0x9f	/* Read JEDEC ID */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -591,6 +592,7 @@ struct flash_info {
 | 
				
			||||||
 | 
					 	u16		flags;
 | 
				
			||||||
 | 
					 #define	SECT_4K		0x01		/* OPCODE_BE_4K works uniformly */
 | 
				
			||||||
 | 
					 #define	M25P_NO_ERASE	0x02		/* No erase command needed */
 | 
				
			||||||
 | 
					+#define	SECT_4K_PMC	0x04		/* OPCODE_BE_4K_PMC works uniformly */
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define INFO(_jedec_id, _ext_id, _sector_size, _n_sectors, _flags)	\
 | 
				
			||||||
 | 
					@@ -665,6 +667,10 @@ static const struct spi_device_id m25p_i
 | 
				
			||||||
 | 
					 	{ "n25q128a13",  INFO(0x20ba18, 0, 64 * 1024, 256, 0) },
 | 
				
			||||||
 | 
					 	{ "n25q256a", INFO(0x20ba19, 0, 64 * 1024, 512, SECT_4K) },
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	/* PMC -- pm25x "blocks" are 32K, sectors are 4K */
 | 
				
			||||||
 | 
					+	{ "pm25lv512", INFO(0, 0, 32 * 1024, 2, SECT_4K_PMC) },
 | 
				
			||||||
 | 
					+	{ "pm25lv010", INFO(0, 0, 32 * 1024, 4, SECT_4K_PMC) },
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	/* Spansion -- single (large) sector size only, at least
 | 
				
			||||||
 | 
					 	 * for the chips listed here (without boot sectors).
 | 
				
			||||||
 | 
					 	 */
 | 
				
			||||||
 | 
					@@ -909,6 +915,9 @@ static int m25p_probe(struct spi_device
 | 
				
			||||||
 | 
					 	if (info->flags & SECT_4K) {
 | 
				
			||||||
 | 
					 		flash->erase_opcode = OPCODE_BE_4K;
 | 
				
			||||||
 | 
					 		flash->mtd.erasesize = 4096;
 | 
				
			||||||
 | 
					+	} else if (info->flags & SECT_4K_PMC) {
 | 
				
			||||||
 | 
					+		flash->erase_opcode = OPCODE_BE_4K_PMC;
 | 
				
			||||||
 | 
					+		flash->mtd.erasesize = 4096;
 | 
				
			||||||
 | 
					 	} else {
 | 
				
			||||||
 | 
					 		flash->erase_opcode = OPCODE_SE;
 | 
				
			||||||
 | 
					 		flash->mtd.erasesize = info->sector_size;
 | 
				
			||||||
@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					--- a/drivers/mtd/devices/m25p80.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/devices/m25p80.c
 | 
				
			||||||
 | 
					@@ -750,6 +750,7 @@ static const struct spi_device_id m25p_i
 | 
				
			||||||
 | 
					 	{ "w25q64", INFO(0xef4017, 0, 64 * 1024, 128, SECT_4K) },
 | 
				
			||||||
 | 
					 	{ "w25q80", INFO(0xef5014, 0, 64 * 1024,  16, SECT_4K) },
 | 
				
			||||||
 | 
					 	{ "w25q80bl", INFO(0xef4014, 0, 64 * 1024,  16, SECT_4K) },
 | 
				
			||||||
 | 
					+	{ "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) },
 | 
				
			||||||
 | 
					 	{ "w25q256", INFO(0xef4019, 0, 64 * 1024, 512, SECT_4K) },
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* Catalyst / On Semiconductor -- non-JEDEC */
 | 
				
			||||||
@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					From: George Kashperko <george@znau.edu.ua>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Issue map read after Write Buffer Load command to ensure chip is ready
 | 
				
			||||||
 | 
					to receive data.
 | 
				
			||||||
 | 
					Signed-off-by: George Kashperko <george@znau.edu.ua>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 drivers/mtd/chips/cfi_cmdset_0002.c |    1 +
 | 
				
			||||||
 | 
					 1 file changed, 1 insertion(+)
 | 
				
			||||||
 | 
					--- a/drivers/mtd/chips/cfi_cmdset_0002.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
 | 
				
			||||||
 | 
					@@ -1480,6 +1480,7 @@ static int __xipram do_write_buffer(stru
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* Write Buffer Load */
 | 
				
			||||||
 | 
					 	map_write(map, CMD(0x25), cmd_adr);
 | 
				
			||||||
 | 
					+	(void) map_read(map, cmd_adr);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	chip->state = FL_WRITING_TO_BUFFER;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					--- a/drivers/mtd/devices/Kconfig
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/devices/Kconfig
 | 
				
			||||||
 | 
					@@ -110,6 +110,14 @@ config MTD_SPEAR_SMI
 | 
				
			||||||
 | 
					 	help
 | 
				
			||||||
 | 
					 	  This enable SNOR support on SPEAR platforms using SMI controller
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+config M25PXX_PREFER_SMALL_SECTOR_ERASE
 | 
				
			||||||
 | 
					+	bool "Prefer small sector erase"
 | 
				
			||||||
 | 
					+	depends on MTD_M25P80
 | 
				
			||||||
 | 
					+	default y
 | 
				
			||||||
 | 
					+	help
 | 
				
			||||||
 | 
					+	  This option enables use of the small erase sectors if that is
 | 
				
			||||||
 | 
					+	  supported by the flash chip.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 config MTD_SST25L
 | 
				
			||||||
 | 
					 	tristate "Support SST25L (non JEDEC) SPI Flash chips"
 | 
				
			||||||
 | 
					 	depends on SPI_MASTER
 | 
				
			||||||
 | 
					--- a/drivers/mtd/devices/m25p80.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/devices/m25p80.c
 | 
				
			||||||
 | 
					@@ -76,6 +76,12 @@
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define JEDEC_MFR(_jedec_id)	((_jedec_id) >> 16)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#ifdef CONFIG_M25PXX_PREFER_SMALL_SECTOR_ERASE
 | 
				
			||||||
 | 
					+#define PREFER_SMALL_SECTOR_ERASE 1
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+#define PREFER_SMALL_SECTOR_ERASE 0
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 /****************************************************************************/
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 struct m25p {
 | 
				
			||||||
 | 
					@@ -913,7 +919,7 @@ static int m25p_probe(struct spi_device
 | 
				
			||||||
 | 
					 		flash->mtd._write = m25p80_write;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* prefer "small sector" erase if possible */
 | 
				
			||||||
 | 
					-	if (info->flags & SECT_4K) {
 | 
				
			||||||
 | 
					+	if (PREFER_SMALL_SECTOR_ERASE && (info->flags & SECT_4K)) {
 | 
				
			||||||
 | 
					 		flash->erase_opcode = OPCODE_BE_4K;
 | 
				
			||||||
 | 
					 		flash->mtd.erasesize = 4096;
 | 
				
			||||||
 | 
					 	} else if (info->flags & SECT_4K_PMC) {
 | 
				
			||||||
@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					--- a/drivers/mtd/mtdpart.c
 | 
				
			||||||
 | 
					+++ b/drivers/mtd/mtdpart.c
 | 
				
			||||||
 | 
					@@ -330,7 +330,14 @@ static int part_lock(struct mtd_info *mt
 | 
				
			||||||
 | 
					 static int part_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	struct mtd_part *part = PART(mtd);
 | 
				
			||||||
 | 
					-	return part->master->_unlock(part->master, ofs + part->offset, len);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	ofs += part->offset;
 | 
				
			||||||
 | 
					+	if (mtd->flags & MTD_ERASE_PARTIAL) {
 | 
				
			||||||
 | 
					+		/* round up len to next erasesize and round down offset to prev block */
 | 
				
			||||||
 | 
					+		len = (mtd_div_by_eb(len, part->master) + 1) * part->master->erasesize;
 | 
				
			||||||
 | 
					+		ofs &= ~(part->master->erasesize - 1);
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+	return part->master->_unlock(part->master, ofs, len);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static int part_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len)
 | 
				
			||||||
@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					--- a/fs/Kconfig
 | 
				
			||||||
 | 
					+++ b/fs/Kconfig
 | 
				
			||||||
 | 
					@@ -39,6 +39,7 @@ source "fs/gfs2/Kconfig"
 | 
				
			||||||
 | 
					 source "fs/ocfs2/Kconfig"
 | 
				
			||||||
 | 
					 source "fs/btrfs/Kconfig"
 | 
				
			||||||
 | 
					 source "fs/nilfs2/Kconfig"
 | 
				
			||||||
 | 
					+source "fs/yaffs2/Kconfig"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 endif # BLOCK
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					--- a/fs/Makefile
 | 
				
			||||||
 | 
					+++ b/fs/Makefile
 | 
				
			||||||
 | 
					@@ -128,3 +128,5 @@ obj-$(CONFIG_F2FS_FS)		+= f2fs/
 | 
				
			||||||
 | 
					 obj-y				+= exofs/ # Multiple modules
 | 
				
			||||||
 | 
					 obj-$(CONFIG_CEPH_FS)		+= ceph/
 | 
				
			||||||
 | 
					 obj-$(CONFIG_PSTORE)		+= pstore/
 | 
				
			||||||
 | 
					+obj-$(CONFIG_YAFFS_FS)		+= yaffs2/
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					From 2505e8b0a13d3d5c5bbeaaae4eb889864f44c9df Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Charles Manning <cdhmanning@gmail.com>
 | 
				
			||||||
 | 
					Date: Thu, 3 Feb 2011 05:55:30 +1300
 | 
				
			||||||
 | 
					Subject: [PATCH] yaffs: Fix directory unlinking in yaffs1 mode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					commit 964b3425a71890e6701c830e38b04d8557c04f49 upstream.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Treat both yaffs2 and yaffs1 paths the same.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Charles Manning <cdhmanning@gmail.com>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 yaffs_guts.c |    8 +-------
 | 
				
			||||||
 | 
					 1 file changed, 1 insertion(+), 7 deletions(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yaffs_guts.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_guts.c
 | 
				
			||||||
 | 
					@@ -1708,13 +1708,7 @@ static int yaffs_change_obj_name(yaffs_o
 | 
				
			||||||
 | 
					 		YBUG();
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	/* TODO: Do we need this different handling for YAFFS2 and YAFFS1?? */
 | 
				
			||||||
 | 
					-	if (obj->my_dev->param.is_yaffs2)
 | 
				
			||||||
 | 
					-		unlinkOp = (new_dir == obj->my_dev->unlinked_dir);
 | 
				
			||||||
 | 
					-	else
 | 
				
			||||||
 | 
					-		unlinkOp = (new_dir == obj->my_dev->unlinked_dir
 | 
				
			||||||
 | 
					-			    && obj->variant_type == YAFFS_OBJECT_TYPE_FILE);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+	unlinkOp = (new_dir == obj->my_dev->unlinked_dir);
 | 
				
			||||||
 | 
					 	deleteOp = (new_dir == obj->my_dev->del_dir);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	existingTarget = yaffs_find_by_name(new_dir, new_name);
 | 
				
			||||||
@@ -0,0 +1,138 @@
 | 
				
			|||||||
 | 
					From c0c289363e84c53b5872f7c0c5069045096dca07 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Charles Manning <cdhmanning@gmail.com>
 | 
				
			||||||
 | 
					Date: Wed, 3 Nov 2010 16:01:12 +1300
 | 
				
			||||||
 | 
					Subject: [PATCH] yaffs: Switch from semaphores to mutexes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					commit 73c54aa8c1de3f61a4c211cd47431293a6092f18 upstream.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Mutex is faster and init_MUTEX has been deprecated, so we'll just switch
 | 
				
			||||||
 | 
					to mutexes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Charles Manning <cdhmanning@gmail.com>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 yaffs_linux.h     |    2 +-
 | 
				
			||||||
 | 
					 yaffs_vfs.c       |   24 ++++++++++++------------
 | 
				
			||||||
 | 
					 yaffs_vfs_multi.c |   26 +++++++++++++-------------
 | 
				
			||||||
 | 
					 3 files changed, 26 insertions(+), 26 deletions(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yaffs_linux.h
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_linux.h
 | 
				
			||||||
 | 
					@@ -25,7 +25,7 @@ struct yaffs_LinuxContext {
 | 
				
			||||||
 | 
					 	struct super_block * superBlock;
 | 
				
			||||||
 | 
					 	struct task_struct *bgThread; /* Background thread for this device */
 | 
				
			||||||
 | 
					 	int bgRunning;
 | 
				
			||||||
 | 
					-        struct semaphore grossLock;     /* Gross locking semaphore */
 | 
				
			||||||
 | 
					+	struct mutex grossLock;	/* Gross locking mutex*/
 | 
				
			||||||
 | 
					 	__u8 *spareBuffer;      /* For mtdif2 use. Don't know the size of the buffer
 | 
				
			||||||
 | 
					 				 * at compile time so we have to allocate it.
 | 
				
			||||||
 | 
					 				 */
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					@@ -515,14 +515,14 @@ static unsigned yaffs_gc_control_callbac
 | 
				
			||||||
 | 
					 static void yaffs_gross_lock(yaffs_dev_t *dev)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_LOCK, (TSTR("yaffs locking %p\n"), current));
 | 
				
			||||||
 | 
					-	down(&(yaffs_dev_to_lc(dev)->grossLock));
 | 
				
			||||||
 | 
					+	mutex_lock(&(yaffs_dev_to_lc(dev)->grossLock));
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_LOCK, (TSTR("yaffs locked %p\n"), current));
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static void yaffs_gross_unlock(yaffs_dev_t *dev)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_LOCK, (TSTR("yaffs unlocking %p\n"), current));
 | 
				
			||||||
 | 
					-	up(&(yaffs_dev_to_lc(dev)->grossLock));
 | 
				
			||||||
 | 
					+	mutex_unlock(&(yaffs_dev_to_lc(dev)->grossLock));
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #ifdef YAFFS_COMPILE_EXPORTFS
 | 
				
			||||||
 | 
					@@ -2542,7 +2542,7 @@ static void yaffs_read_inode(struct inod
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static YLIST_HEAD(yaffs_context_list);
 | 
				
			||||||
 | 
					-struct semaphore yaffs_context_lock;
 | 
				
			||||||
 | 
					+struct mutex yaffs_context_lock;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static void yaffs_put_super(struct super_block *sb)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					@@ -2568,9 +2568,9 @@ static void yaffs_put_super(struct super
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	yaffs_gross_unlock(dev);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	down(&yaffs_context_lock);
 | 
				
			||||||
 | 
					+	mutex_lock(&yaffs_context_lock);
 | 
				
			||||||
 | 
					 	ylist_del_init(&(yaffs_dev_to_lc(dev)->contextList));
 | 
				
			||||||
 | 
					-	up(&yaffs_context_lock);
 | 
				
			||||||
 | 
					+	mutex_unlock(&yaffs_context_lock);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (yaffs_dev_to_lc(dev)->spareBuffer) {
 | 
				
			||||||
 | 
					 		YFREE(yaffs_dev_to_lc(dev)->spareBuffer);
 | 
				
			||||||
 | 
					@@ -3016,7 +3016,7 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 	param->skip_checkpt_rd = options.skip_checkpoint_read;
 | 
				
			||||||
 | 
					 	param->skip_checkpt_wr = options.skip_checkpoint_write;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	down(&yaffs_context_lock);
 | 
				
			||||||
 | 
					+	mutex_lock(&yaffs_context_lock);
 | 
				
			||||||
 | 
					 	/* Get a mount id */
 | 
				
			||||||
 | 
					 	found = 0;
 | 
				
			||||||
 | 
					 	for(mount_id=0; ! found; mount_id++){
 | 
				
			||||||
 | 
					@@ -3030,13 +3030,13 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 	context->mount_id = mount_id;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	ylist_add_tail(&(yaffs_dev_to_lc(dev)->contextList), &yaffs_context_list);
 | 
				
			||||||
 | 
					-	up(&yaffs_context_lock);
 | 
				
			||||||
 | 
					+	mutex_unlock(&yaffs_context_lock);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					         /* Directory search handling...*/
 | 
				
			||||||
 | 
					         YINIT_LIST_HEAD(&(yaffs_dev_to_lc(dev)->searchContexts));
 | 
				
			||||||
 | 
					         param->remove_obj_fn = yaffs_remove_obj_callback;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	init_MUTEX(&(yaffs_dev_to_lc(dev)->grossLock));
 | 
				
			||||||
 | 
					+	mutex_init(&(yaffs_dev_to_lc(dev)->grossLock));
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	yaffs_gross_lock(dev);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -3268,7 +3268,7 @@ static int yaffs_proc_read(char *page,
 | 
				
			||||||
 | 
					 	else {
 | 
				
			||||||
 | 
					 		step-=2;
 | 
				
			||||||
 | 
					 		
 | 
				
			||||||
 | 
					-		down(&yaffs_context_lock);
 | 
				
			||||||
 | 
					+		mutex_lock(&yaffs_context_lock);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		/* Locate and print the Nth entry.  Order N-squared but N is small. */
 | 
				
			||||||
 | 
					 		ylist_for_each(item, &yaffs_context_list) {
 | 
				
			||||||
 | 
					@@ -3287,7 +3287,7 @@ static int yaffs_proc_read(char *page,
 | 
				
			||||||
 | 
					 			
 | 
				
			||||||
 | 
					 			break;
 | 
				
			||||||
 | 
					 		}
 | 
				
			||||||
 | 
					-		up(&yaffs_context_lock);
 | 
				
			||||||
 | 
					+		mutex_unlock(&yaffs_context_lock);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	return buf - page < count ? buf - page : count;
 | 
				
			||||||
 | 
					@@ -3301,7 +3301,7 @@ static int yaffs_stats_proc_read(char *p
 | 
				
			||||||
 | 
					 	char *buf = page;
 | 
				
			||||||
 | 
					 	int n = 0;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	down(&yaffs_context_lock);
 | 
				
			||||||
 | 
					+	mutex_lock(&yaffs_context_lock);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* Locate and print the Nth entry.  Order N-squared but N is small. */
 | 
				
			||||||
 | 
					 	ylist_for_each(item, &yaffs_context_list) {
 | 
				
			||||||
 | 
					@@ -3317,7 +3317,7 @@ static int yaffs_stats_proc_read(char *p
 | 
				
			||||||
 | 
					 				dev->bg_gcs, dev->oldest_dirty_gc_count,
 | 
				
			||||||
 | 
					 				dev->n_obj, dev->n_tnodes);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					-	up(&yaffs_context_lock);
 | 
				
			||||||
 | 
					+	mutex_unlock(&yaffs_context_lock);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	return buf - page < count ? buf - page : count;
 | 
				
			||||||
 | 
					@@ -3494,7 +3494,7 @@ static int __init init_yaffs_fs(void)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	init_MUTEX(&yaffs_context_lock);
 | 
				
			||||||
 | 
					+	mutex_init(&yaffs_context_lock);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* Install the proc_fs entries */
 | 
				
			||||||
 | 
					 	my_proc_entry = create_proc_entry("yaffs",
 | 
				
			||||||
@@ -0,0 +1,72 @@
 | 
				
			|||||||
 | 
					From cd6657c4bde20886b0805ea9f2cbac7ec25ac2e5 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Charles Manning <cdhmanning@gmail.com>
 | 
				
			||||||
 | 
					Date: Tue, 30 Nov 2010 16:01:28 +1300
 | 
				
			||||||
 | 
					Subject: [PATCH 1/2] yaffs: Replace yaffs_dir_llseek with Linux generic
 | 
				
			||||||
 | 
					 llseek
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					commit ed8188fb7659cfb65b5adbe154d143190ade0324 upstream.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					There was not much point in having the yaffs version as it is
 | 
				
			||||||
 | 
					functionally equivalent to the kernel one.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This also gets rid of using BKL in yaffs2.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Charles Manning <cdhmanning@gmail.com>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 yaffs_vfs.c       |   30 +-----------------------------
 | 
				
			||||||
 | 
					 yaffs_vfs_multi.c |   30 +-----------------------------
 | 
				
			||||||
 | 
					 2 files changed, 2 insertions(+), 58 deletions(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					@@ -342,8 +342,6 @@ static int yaffs_follow_link(struct dent
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static void yaffs_touch_super(yaffs_dev_t *dev);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-static loff_t yaffs_dir_llseek(struct file *file, loff_t offset, int origin);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 static int yaffs_vfs_setattr(struct inode *, struct iattr *);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -460,7 +458,7 @@ static const struct file_operations yaff
 | 
				
			||||||
 | 
					 	.read = generic_read_dir,
 | 
				
			||||||
 | 
					 	.readdir = yaffs_readdir,
 | 
				
			||||||
 | 
					 	.fsync = yaffs_sync_object,
 | 
				
			||||||
 | 
					-	.llseek = yaffs_dir_llseek,
 | 
				
			||||||
 | 
					+	.llseek = generic_file_llseek,
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static const struct super_operations yaffs_super_ops = {
 | 
				
			||||||
 | 
					@@ -1534,32 +1532,6 @@ static void yaffs_release_space(struct f
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-static loff_t yaffs_dir_llseek(struct file *file, loff_t offset, int origin)
 | 
				
			||||||
 | 
					-{
 | 
				
			||||||
 | 
					-	long long retval;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	lock_kernel();
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	switch (origin){
 | 
				
			||||||
 | 
					-	case 2:
 | 
				
			||||||
 | 
					-		offset += i_size_read(file->f_path.dentry->d_inode);
 | 
				
			||||||
 | 
					-		break;
 | 
				
			||||||
 | 
					-	case 1:
 | 
				
			||||||
 | 
					-		offset += file->f_pos;
 | 
				
			||||||
 | 
					-	}
 | 
				
			||||||
 | 
					-	retval = -EINVAL;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	if (offset >= 0){
 | 
				
			||||||
 | 
					-		if (offset != file->f_pos)
 | 
				
			||||||
 | 
					-			file->f_pos = offset;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-		retval = offset;
 | 
				
			||||||
 | 
					-	}
 | 
				
			||||||
 | 
					-	unlock_kernel();
 | 
				
			||||||
 | 
					-	return retval;
 | 
				
			||||||
 | 
					-}
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	yaffs_obj_t *obj;
 | 
				
			||||||
@@ -0,0 +1,110 @@
 | 
				
			|||||||
 | 
					From e1537a700c2e750c5eacc5ad93f30821f1e94424 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Charles Manning <cdhmanning@gmail.com>
 | 
				
			||||||
 | 
					Date: Mon, 15 Aug 2011 11:40:30 +1200
 | 
				
			||||||
 | 
					Subject: [PATCH 2/2] Mods for Linux 3.0 and fix a typo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					commit a7b5dcf904ba6f7890e4b77ce1f56388b855d0f6 upstream.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Roll in NCB's patch and some other changes for Linux 3.0.
 | 
				
			||||||
 | 
					Also fix a dumb type retired_writes->retried_writes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Charles Manning <cdhmanning@gmail.com>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 patch-ker.sh      |    2 +-
 | 
				
			||||||
 | 
					 yaffs_vfs_glue.c |   42 ++++++++++++++++++++++++++++++++++--------
 | 
				
			||||||
 | 
					 2 files changed, 35 insertions(+), 9 deletions(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					@@ -72,7 +72,9 @@
 | 
				
			||||||
 | 
					 #include <linux/init.h>
 | 
				
			||||||
 | 
					 #include <linux/fs.h>
 | 
				
			||||||
 | 
					 #include <linux/proc_fs.h>
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39))
 | 
				
			||||||
 | 
					 #include <linux/smp_lock.h>
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 #include <linux/pagemap.h>
 | 
				
			||||||
 | 
					 #include <linux/mtd/mtd.h>
 | 
				
			||||||
 | 
					 #include <linux/interrupt.h>
 | 
				
			||||||
 | 
					@@ -236,7 +238,9 @@ static int yaffs_file_flush(struct file
 | 
				
			||||||
 | 
					 static int yaffs_file_flush(struct file *file);
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34))
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39))
 | 
				
			||||||
 | 
					+static int yaffs_sync_object(struct file *file, loff_t start, loff_t end, int datasync);
 | 
				
			||||||
 | 
					+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34))
 | 
				
			||||||
 | 
					 static int yaffs_sync_object(struct file *file, int datasync);
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					 static int yaffs_sync_object(struct file *file, struct dentry *dentry,
 | 
				
			||||||
 | 
					@@ -1864,7 +1868,9 @@ static int yaffs_symlink(struct inode *d
 | 
				
			||||||
 | 
					 	return -ENOMEM;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34))
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39))
 | 
				
			||||||
 | 
					+static int yaffs_sync_object(struct file *file, loff_t start, loff_t end, int datasync)
 | 
				
			||||||
 | 
					+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 34))
 | 
				
			||||||
 | 
					 static int yaffs_sync_object(struct file *file, int datasync)
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					 static int yaffs_sync_object(struct file *file, struct dentry *dentry,
 | 
				
			||||||
 | 
					@@ -3067,7 +3073,13 @@ static int yaffs_internal_read_super_mtd
 | 
				
			||||||
 | 
					 	return yaffs_internal_read_super(1, sb, data, silent) ? 0 : -EINVAL;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39))
 | 
				
			||||||
 | 
					+static struct dentry *yaffs_mount(struct file_system_type *fs_type, int flags,
 | 
				
			||||||
 | 
					+        const char *dev_name, void *data)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+    return mount_bdev(fs_type, flags, dev_name, data, yaffs_internal_read_super_mtd);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
 | 
				
			||||||
 | 
					 static int yaffs_read_super(struct file_system_type *fs,
 | 
				
			||||||
 | 
					 			    int flags, const char *dev_name,
 | 
				
			||||||
 | 
					 			    void *data, struct vfsmount *mnt)
 | 
				
			||||||
 | 
					@@ -3090,8 +3102,12 @@ static struct super_block *yaffs_read_su
 | 
				
			||||||
 | 
					 static struct file_system_type yaffs_fs_type = {
 | 
				
			||||||
 | 
					 	.owner = THIS_MODULE,
 | 
				
			||||||
 | 
					 	.name = "yaffs",
 | 
				
			||||||
 | 
					-	.get_sb = yaffs_read_super,
 | 
				
			||||||
 | 
					-	.kill_sb = kill_block_super,
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39))
 | 
				
			||||||
 | 
					+        .mount = yaffs_mount,
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+        .get_sb = yaffs_read_super,
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+     	.kill_sb = kill_block_super,
 | 
				
			||||||
 | 
					 	.fs_flags = FS_REQUIRES_DEV,
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					@@ -3115,7 +3131,13 @@ static int yaffs2_internal_read_super_mt
 | 
				
			||||||
 | 
					 	return yaffs_internal_read_super(2, sb, data, silent) ? 0 : -EINVAL;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39))
 | 
				
			||||||
 | 
					+static struct dentry *yaffs2_mount(struct file_system_type *fs_type, int flags,
 | 
				
			||||||
 | 
					+        const char *dev_name, void *data)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+        return mount_bdev(fs_type, flags, dev_name, data, yaffs2_internal_read_super_mtd);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
 | 
				
			||||||
 | 
					 static int yaffs2_read_super(struct file_system_type *fs,
 | 
				
			||||||
 | 
					 			int flags, const char *dev_name, void *data,
 | 
				
			||||||
 | 
					 			struct vfsmount *mnt)
 | 
				
			||||||
 | 
					@@ -3137,8 +3159,12 @@ static struct super_block *yaffs2_read_s
 | 
				
			||||||
 | 
					 static struct file_system_type yaffs2_fs_type = {
 | 
				
			||||||
 | 
					 	.owner = THIS_MODULE,
 | 
				
			||||||
 | 
					 	.name = "yaffs2",
 | 
				
			||||||
 | 
					-	.get_sb = yaffs2_read_super,
 | 
				
			||||||
 | 
					-	.kill_sb = kill_block_super,
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39))
 | 
				
			||||||
 | 
					+        .mount = yaffs2_mount,
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+        .get_sb = yaffs2_read_super,
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+     	.kill_sb = kill_block_super,
 | 
				
			||||||
 | 
					 	.fs_flags = FS_REQUIRES_DEV,
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					--- a/fs/yaffs2/yaffs_mtdif1.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_mtdif1.c
 | 
				
			||||||
 | 
					@@ -127,7 +127,7 @@ int nandmtd1_WriteChunkWithTagsToNAND(ya
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	memset(&ops, 0, sizeof(ops));
 | 
				
			||||||
 | 
					-	ops.mode = MTD_OOB_AUTO;
 | 
				
			||||||
 | 
					+	ops.mode = MTD_OPS_AUTO_OOB;
 | 
				
			||||||
 | 
					 	ops.len = (data) ? chunkBytes : 0;
 | 
				
			||||||
 | 
					 	ops.ooblen = YTAG1_SIZE;
 | 
				
			||||||
 | 
					 	ops.datbuf = (__u8 *)data;
 | 
				
			||||||
 | 
					@@ -179,7 +179,7 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y
 | 
				
			||||||
 | 
					 	int deleted;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	memset(&ops, 0, sizeof(ops));
 | 
				
			||||||
 | 
					-	ops.mode = MTD_OOB_AUTO;
 | 
				
			||||||
 | 
					+	ops.mode = MTD_OPS_AUTO_OOB;
 | 
				
			||||||
 | 
					 	ops.len = (data) ? chunkBytes : 0;
 | 
				
			||||||
 | 
					 	ops.ooblen = YTAG1_SIZE;
 | 
				
			||||||
 | 
					 	ops.datbuf = data;
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yaffs_mtdif2.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_mtdif2.c
 | 
				
			||||||
 | 
					@@ -71,7 +71,7 @@ int nandmtd2_WriteChunkWithTagsToNAND(ya
 | 
				
			||||||
 | 
					 		yaffs_PackTags2(&pt, tags, !dev->param.no_tags_ecc);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
 | 
				
			||||||
 | 
					-	ops.mode = MTD_OOB_AUTO;
 | 
				
			||||||
 | 
					+	ops.mode = MTD_OPS_AUTO_OOB;
 | 
				
			||||||
 | 
					 	ops.ooblen = (dev->param.inband_tags) ? 0 : packed_tags_size;
 | 
				
			||||||
 | 
					 	ops.len = dev->param.total_bytes_per_chunk;
 | 
				
			||||||
 | 
					 	ops.ooboffs = 0;
 | 
				
			||||||
 | 
					@@ -136,7 +136,7 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y
 | 
				
			||||||
 | 
					 		retval = mtd->read(mtd, addr, dev->param.total_bytes_per_chunk,
 | 
				
			||||||
 | 
					 				&dummy, data);
 | 
				
			||||||
 | 
					 	else if (tags) {
 | 
				
			||||||
 | 
					-		ops.mode = MTD_OOB_AUTO;
 | 
				
			||||||
 | 
					+		ops.mode = MTD_OPS_AUTO_OOB;
 | 
				
			||||||
 | 
					 		ops.ooblen = packed_tags_size;
 | 
				
			||||||
 | 
					 		ops.len = data ? dev->data_bytes_per_chunk : packed_tags_size;
 | 
				
			||||||
 | 
					 		ops.ooboffs = 0;
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yaffs_mtdif.h
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_mtdif.h
 | 
				
			||||||
 | 
					@@ -24,4 +24,11 @@ extern struct nand_oobinfo yaffs_noeccin
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 int nandmtd_EraseBlockInNAND(yaffs_dev_t *dev, int blockNumber);
 | 
				
			||||||
 | 
					 int nandmtd_InitialiseNAND(yaffs_dev_t *dev);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0))
 | 
				
			||||||
 | 
					+#include <mtd/mtd-abi.h>
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+#define MTD_OPS_AUTO_OOB 	MTD_OOB_AUTO
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
@@ -0,0 +1,78 @@
 | 
				
			|||||||
 | 
					--- a/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					@@ -220,6 +220,29 @@ static struct inode *yaffs_iget(struct s
 | 
				
			||||||
 | 
					 #define yaffs_SuperToDevice(sb)	((yaffs_dev_t *)sb->u.generic_sbp)
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0))
 | 
				
			||||||
 | 
					+static inline void yaffs_set_nlink(struct inode *inode, unsigned int nlink)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	set_nlink(inode, nlink);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void yaffs_dec_link_count(struct inode *inode)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	inode_dec_link_count(inode);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+static inline void yaffs_set_nlink(struct inode *inode, unsigned int nlink)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	inode->i_nlink = nlink;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void yaffs_dec_link_count(struct inode *inode)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	inode->i_nlink--;
 | 
				
			||||||
 | 
					+	mark_inode_dirty(inode)
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define update_dir_time(dir) do {\
 | 
				
			||||||
 | 
					 			(dir)->i_ctime = (dir)->i_mtime = CURRENT_TIME; \
 | 
				
			||||||
 | 
					@@ -1362,7 +1385,7 @@ static void yaffs_fill_inode_from_obj(st
 | 
				
			||||||
 | 
					 		inode->i_size = yaffs_get_obj_length(obj);
 | 
				
			||||||
 | 
					 		inode->i_blocks = (inode->i_size + 511) >> 9;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-		inode->i_nlink = yaffs_get_obj_link_count(obj);
 | 
				
			||||||
 | 
					+		yaffs_set_nlink(inode, yaffs_get_obj_link_count(obj));
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		T(YAFFS_TRACE_OS,
 | 
				
			||||||
 | 
					 			(TSTR("yaffs_fill_inode mode %x uid %d gid %d size %d count %d\n"),
 | 
				
			||||||
 | 
					@@ -1784,10 +1807,9 @@ static int yaffs_unlink(struct inode *di
 | 
				
			||||||
 | 
					 	retVal = yaffs_unlinker(obj, dentry->d_name.name);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (retVal == YAFFS_OK) {
 | 
				
			||||||
 | 
					-		dentry->d_inode->i_nlink--;
 | 
				
			||||||
 | 
					+		yaffs_dec_link_count(dentry->d_inode);
 | 
				
			||||||
 | 
					 		dir->i_version++;
 | 
				
			||||||
 | 
					 		yaffs_gross_unlock(dev);
 | 
				
			||||||
 | 
					-		mark_inode_dirty(dentry->d_inode);
 | 
				
			||||||
 | 
					 		update_dir_time(dir);
 | 
				
			||||||
 | 
					 		return 0;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					@@ -1818,7 +1840,8 @@ static int yaffs_link(struct dentry *old
 | 
				
			||||||
 | 
					 			obj);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (link) {
 | 
				
			||||||
 | 
					-		old_dentry->d_inode->i_nlink = yaffs_get_obj_link_count(obj);
 | 
				
			||||||
 | 
					+		yaffs_set_nlink(old_dentry->d_inode,
 | 
				
			||||||
 | 
					+				yaffs_get_obj_link_count(obj));
 | 
				
			||||||
 | 
					 		d_instantiate(dentry, old_dentry->d_inode);
 | 
				
			||||||
 | 
					 		atomic_inc(&old_dentry->d_inode->i_count);
 | 
				
			||||||
 | 
					 		T(YAFFS_TRACE_OS,
 | 
				
			||||||
 | 
					@@ -1937,11 +1960,9 @@ static int yaffs_rename(struct inode *ol
 | 
				
			||||||
 | 
					 	yaffs_gross_unlock(dev);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (retVal == YAFFS_OK) {
 | 
				
			||||||
 | 
					-		if (target) {
 | 
				
			||||||
 | 
					-			new_dentry->d_inode->i_nlink--;
 | 
				
			||||||
 | 
					-			mark_inode_dirty(new_dentry->d_inode);
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					-		
 | 
				
			||||||
 | 
					+		if (target)
 | 
				
			||||||
 | 
					+			yaffs_dec_link_count(new_dentry->d_inode);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 		update_dir_time(old_dir);
 | 
				
			||||||
 | 
					 		if(old_dir != new_dir)
 | 
				
			||||||
 | 
					 			update_dir_time(new_dir);
 | 
				
			||||||
							
								
								
									
										71
									
								
								target/linux/generic/patches-3.8/507-yaffs-3.3_fix.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								target/linux/generic/patches-3.8/507-yaffs-3.3_fix.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,71 @@
 | 
				
			|||||||
 | 
					--- a/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					@@ -273,8 +273,13 @@ static int yaffs_sync_object(struct file
 | 
				
			||||||
 | 
					 static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
 | 
				
			||||||
 | 
					+static int yaffs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 | 
				
			||||||
 | 
					+			struct nameidata *n);
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					 static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode,
 | 
				
			||||||
 | 
					 			struct nameidata *n);
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry,
 | 
				
			||||||
 | 
					 					struct nameidata *n);
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					@@ -286,9 +291,17 @@ static int yaffs_link(struct dentry *old
 | 
				
			||||||
 | 
					 static int yaffs_unlink(struct inode *dir, struct dentry *dentry);
 | 
				
			||||||
 | 
					 static int yaffs_symlink(struct inode *dir, struct dentry *dentry,
 | 
				
			||||||
 | 
					 			const char *symname);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
 | 
				
			||||||
 | 
					+static int yaffs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode);
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					 static int yaffs_mkdir(struct inode *dir, struct dentry *dentry, int mode);
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
 | 
				
			||||||
 | 
					+static int yaffs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode,
 | 
				
			||||||
 | 
					+			dev_t dev);
 | 
				
			||||||
 | 
					+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
 | 
					 static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
 | 
				
			||||||
 | 
					 			dev_t dev);
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					@@ -1679,7 +1692,10 @@ out:
 | 
				
			||||||
 | 
					 #define YCRED(x) (x->cred)
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
 | 
				
			||||||
 | 
					+static int yaffs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode,
 | 
				
			||||||
 | 
					+			dev_t rdev)
 | 
				
			||||||
 | 
					+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
 | 
					 static int yaffs_mknod(struct inode *dir, struct dentry *dentry, int mode,
 | 
				
			||||||
 | 
					 			dev_t rdev)
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					@@ -1769,7 +1785,11 @@ static int yaffs_mknod(struct inode *dir
 | 
				
			||||||
 | 
					 	return error;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
 | 
				
			||||||
 | 
					+static int yaffs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					 static int yaffs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	int retVal;
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR("yaffs_mkdir\n")));
 | 
				
			||||||
 | 
					@@ -1777,7 +1797,10 @@ static int yaffs_mkdir(struct inode *dir
 | 
				
			||||||
 | 
					 	return retVal;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
 | 
				
			||||||
 | 
					+static int yaffs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 | 
				
			||||||
 | 
					+			struct nameidata *n)
 | 
				
			||||||
 | 
					+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
 | 
					 static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode,
 | 
				
			||||||
 | 
					 			struct nameidata *n)
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
@@ -0,0 +1,160 @@
 | 
				
			|||||||
 | 
					--- a/fs/yaffs2/yaffs_mtdif1.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_mtdif1.c
 | 
				
			||||||
 | 
					@@ -133,7 +133,7 @@ int nandmtd1_WriteChunkWithTagsToNAND(ya
 | 
				
			||||||
 | 
					 	ops.datbuf = (__u8 *)data;
 | 
				
			||||||
 | 
					 	ops.oobbuf = (__u8 *)&pt1;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	retval = mtd->write_oob(mtd, addr, &ops);
 | 
				
			||||||
 | 
					+	retval = mtd_write_oob(mtd, addr, &ops);
 | 
				
			||||||
 | 
					 	if (retval) {
 | 
				
			||||||
 | 
					 		T(YAFFS_TRACE_MTD,
 | 
				
			||||||
 | 
					 			(TSTR("write_oob failed, chunk %d, mtd error %d"TENDSTR),
 | 
				
			||||||
 | 
					@@ -194,7 +194,7 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y
 | 
				
			||||||
 | 
					 	/* Read page and oob using MTD.
 | 
				
			||||||
 | 
					 	 * Check status and determine ECC result.
 | 
				
			||||||
 | 
					 	 */
 | 
				
			||||||
 | 
					-	retval = mtd->read_oob(mtd, addr, &ops);
 | 
				
			||||||
 | 
					+	retval = mtd_read_oob(mtd, addr, &ops);
 | 
				
			||||||
 | 
					 	if (retval) {
 | 
				
			||||||
 | 
					 		T(YAFFS_TRACE_MTD,
 | 
				
			||||||
 | 
					 			(TSTR("read_oob failed, chunk %d, mtd error %d"TENDSTR),
 | 
				
			||||||
 | 
					@@ -218,7 +218,7 @@ int nandmtd1_ReadChunkWithTagsFromNAND(y
 | 
				
			||||||
 | 
					 		/* fall into... */
 | 
				
			||||||
 | 
					 	default:
 | 
				
			||||||
 | 
					 		rettags(etags, YAFFS_ECC_RESULT_UNFIXED, 0);
 | 
				
			||||||
 | 
					-		etags->block_bad = (mtd->block_isbad)(mtd, addr);
 | 
				
			||||||
 | 
					+		etags->block_bad = mtd_block_isbad(mtd, addr);
 | 
				
			||||||
 | 
					 		return YAFFS_FAIL;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -286,7 +286,7 @@ int nandmtd1_MarkNANDBlockBad(struct yaf
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_BAD_BLOCKS,(TSTR("marking block %d bad"TENDSTR), block_no));
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	retval = mtd->block_markbad(mtd, (loff_t)blocksize * block_no);
 | 
				
			||||||
 | 
					+	retval = mtd_block_markbad(mtd, (loff_t)blocksize * block_no);
 | 
				
			||||||
 | 
					 	return (retval) ? YAFFS_FAIL : YAFFS_OK;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -336,7 +336,7 @@ int nandmtd1_QueryNANDBlock(struct yaffs
 | 
				
			||||||
 | 
					 		return YAFFS_FAIL;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	retval = nandmtd1_ReadChunkWithTagsFromNAND(dev, chunkNo, NULL, &etags);
 | 
				
			||||||
 | 
					-	etags.block_bad = (mtd->block_isbad)(mtd, addr);
 | 
				
			||||||
 | 
					+	etags.block_bad = mtd_block_isbad(mtd, addr);
 | 
				
			||||||
 | 
					 	if (etags.block_bad) {
 | 
				
			||||||
 | 
					 		T(YAFFS_TRACE_BAD_BLOCKS,
 | 
				
			||||||
 | 
					 			(TSTR("block %d is marked bad"TENDSTR), block_no));
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					@@ -2607,8 +2607,8 @@ static void yaffs_MTDPutSuper(struct sup
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	struct mtd_info *mtd = yaffs_dev_to_mtd(yaffs_SuperToDevice(sb));
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	if (mtd->sync)
 | 
				
			||||||
 | 
					-		mtd->sync(mtd);
 | 
				
			||||||
 | 
					+	if (mtd)
 | 
				
			||||||
 | 
					+		mtd_sync(mtd);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	put_mtd_device(mtd);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yaffs_mtdif2.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_mtdif2.c
 | 
				
			||||||
 | 
					@@ -77,7 +77,7 @@ int nandmtd2_WriteChunkWithTagsToNAND(ya
 | 
				
			||||||
 | 
					 	ops.ooboffs = 0;
 | 
				
			||||||
 | 
					 	ops.datbuf = (__u8 *)data;
 | 
				
			||||||
 | 
					 	ops.oobbuf = (dev->param.inband_tags) ? NULL : packed_tags_ptr;
 | 
				
			||||||
 | 
					-	retval = mtd->write_oob(mtd, addr, &ops);
 | 
				
			||||||
 | 
					+	retval = mtd_write_oob(mtd, addr, &ops);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					 	if (!dev->param.inband_tags) {
 | 
				
			||||||
 | 
					@@ -133,7 +133,7 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
 | 
				
			||||||
 | 
					 	if (dev->param.inband_tags || (data && !tags))
 | 
				
			||||||
 | 
					-		retval = mtd->read(mtd, addr, dev->param.total_bytes_per_chunk,
 | 
				
			||||||
 | 
					+		retval = mtd_read(mtd, addr, dev->param.total_bytes_per_chunk,
 | 
				
			||||||
 | 
					 				&dummy, data);
 | 
				
			||||||
 | 
					 	else if (tags) {
 | 
				
			||||||
 | 
					 		ops.mode = MTD_OPS_AUTO_OOB;
 | 
				
			||||||
 | 
					@@ -142,7 +142,7 @@ int nandmtd2_ReadChunkWithTagsFromNAND(y
 | 
				
			||||||
 | 
					 		ops.ooboffs = 0;
 | 
				
			||||||
 | 
					 		ops.datbuf = data;
 | 
				
			||||||
 | 
					 		ops.oobbuf = yaffs_dev_to_lc(dev)->spareBuffer;
 | 
				
			||||||
 | 
					-		retval = mtd->read_oob(mtd, addr, &ops);
 | 
				
			||||||
 | 
					+		retval = mtd_read_oob(mtd, addr, &ops);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					 	if (!dev->param.inband_tags && data && tags) {
 | 
				
			||||||
 | 
					@@ -201,7 +201,7 @@ int nandmtd2_MarkNANDBlockBad(struct yaf
 | 
				
			||||||
 | 
					 	  (TSTR("nandmtd2_MarkNANDBlockBad %d" TENDSTR), block_no));
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	retval =
 | 
				
			||||||
 | 
					-	    mtd->block_markbad(mtd,
 | 
				
			||||||
 | 
					+	    mtd_block_markbad(mtd,
 | 
				
			||||||
 | 
					 			       block_no * dev->param.chunks_per_block *
 | 
				
			||||||
 | 
					 			       dev->param.total_bytes_per_chunk);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -221,7 +221,7 @@ int nandmtd2_QueryNANDBlock(struct yaffs
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_MTD,
 | 
				
			||||||
 | 
					 	  (TSTR("nandmtd2_QueryNANDBlock %d" TENDSTR), block_no));
 | 
				
			||||||
 | 
					 	retval =
 | 
				
			||||||
 | 
					-	    mtd->block_isbad(mtd,
 | 
				
			||||||
 | 
					+	    mtd_block_isbad(mtd,
 | 
				
			||||||
 | 
					 			     block_no * dev->param.chunks_per_block *
 | 
				
			||||||
 | 
					 			     dev->param.total_bytes_per_chunk);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yaffs_mtdif.h
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_mtdif.h
 | 
				
			||||||
 | 
					@@ -31,4 +31,39 @@ int nandmtd_InitialiseNAND(yaffs_dev_t *
 | 
				
			||||||
 | 
					 #define MTD_OPS_AUTO_OOB 	MTD_OOB_AUTO
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0))
 | 
				
			||||||
 | 
					+static inline int mtd_erase(struct mdt_info *mtd, struct erase_info *ei)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return mtd->erase(mtd, ei);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return mtd->block_mark_bad(mtd, ofs);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return mtd->block_is_bad(mtd, ofs);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline int mtd_read_oob(struct mtd_info *mtd, loff_t from,
 | 
				
			||||||
 | 
					+			       struct mtd_oob_ops *ops)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return mtd->read_oob(mtd, from, ops);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline int mtd_write_oob(struct mtd_info *mtd, loff_t to,
 | 
				
			||||||
 | 
					+				struct mtd_oob_ops *ops)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return mtd->write_oob(mtd, to, ops);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void mtd_sync(struct mtd_info *mtd)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	if (mtd->sync)
 | 
				
			||||||
 | 
					+		mtd->sync(mtd);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yaffs_mtdif.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_mtdif.c
 | 
				
			||||||
 | 
					@@ -41,7 +41,7 @@ int nandmtd_EraseBlockInNAND(yaffs_dev_t
 | 
				
			||||||
 | 
					 	ei.callback = NULL;
 | 
				
			||||||
 | 
					 	ei.priv = (u_long) dev;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	retval = mtd->erase(mtd, &ei);
 | 
				
			||||||
 | 
					+	retval = mtd_erase(mtd, &ei);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (retval == 0)
 | 
				
			||||||
 | 
					 		return YAFFS_OK;
 | 
				
			||||||
@@ -0,0 +1,72 @@
 | 
				
			|||||||
 | 
					--- a/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					@@ -2793,6 +2793,15 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 		return NULL;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
 | 
				
			||||||
 | 
					+	T(YAFFS_TRACE_OS, (TSTR(" erase %p\n"), mtd->_erase));
 | 
				
			||||||
 | 
					+	T(YAFFS_TRACE_OS, (TSTR(" read %p\n"), mtd->_read));
 | 
				
			||||||
 | 
					+	T(YAFFS_TRACE_OS, (TSTR(" write %p\n"), mtd->_write));
 | 
				
			||||||
 | 
					+	T(YAFFS_TRACE_OS, (TSTR(" readoob %p\n"), mtd->_read_oob));
 | 
				
			||||||
 | 
					+	T(YAFFS_TRACE_OS, (TSTR(" writeoob %p\n"), mtd->_write_oob));
 | 
				
			||||||
 | 
					+	T(YAFFS_TRACE_OS, (TSTR(" block_isbad %p\n"), mtd->_block_isbad));
 | 
				
			||||||
 | 
					+	T(YAFFS_TRACE_OS, (TSTR(" block_markbad %p\n"), mtd->_block_markbad));
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR(" erase %p\n"), mtd->erase));
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR(" read %p\n"), mtd->read));
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR(" write %p\n"), mtd->write));
 | 
				
			||||||
 | 
					@@ -2800,6 +2809,7 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR(" writeoob %p\n"), mtd->write_oob));
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR(" block_isbad %p\n"), mtd->block_isbad));
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR(" block_markbad %p\n"), mtd->block_markbad));
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR(" %s %d\n"), WRITE_SIZE_STR, WRITE_SIZE(mtd)));
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR(" oobsize %d\n"), mtd->oobsize));
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR(" erasesize %d\n"), mtd->erasesize));
 | 
				
			||||||
 | 
					@@ -2828,6 +2838,15 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (yaffs_version == 2) {
 | 
				
			||||||
 | 
					 		/* Check for version 2 style functions */
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0))
 | 
				
			||||||
 | 
					+		if (!mtd->_erase ||
 | 
				
			||||||
 | 
					+		    !mtd->_block_isbad ||
 | 
				
			||||||
 | 
					+		    !mtd->_block_markbad ||
 | 
				
			||||||
 | 
					+		    !mtd->_read ||
 | 
				
			||||||
 | 
					+		    !mtd->_write ||
 | 
				
			||||||
 | 
					+		    !mtd->_read_oob ||
 | 
				
			||||||
 | 
					+		    !mtd->_write_oob) {
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					 		if (!mtd->erase ||
 | 
				
			||||||
 | 
					 		    !mtd->block_isbad ||
 | 
				
			||||||
 | 
					 		    !mtd->block_markbad ||
 | 
				
			||||||
 | 
					@@ -2839,6 +2858,7 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 		    !mtd->write_ecc ||
 | 
				
			||||||
 | 
					 		    !mtd->read_ecc || !mtd->read_oob || !mtd->write_oob) {
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 			T(YAFFS_TRACE_ALWAYS,
 | 
				
			||||||
 | 
					 			  (TSTR("yaffs: MTD device does not support required "
 | 
				
			||||||
 | 
					 			   "functions\n")));
 | 
				
			||||||
 | 
					@@ -2855,6 +2875,13 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 		}
 | 
				
			||||||
 | 
					 	} else {
 | 
				
			||||||
 | 
					 		/* Check for V1 style functions */
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0))
 | 
				
			||||||
 | 
					+		if (!mtd->_erase ||
 | 
				
			||||||
 | 
					+		    !mtd->_read ||
 | 
				
			||||||
 | 
					+		    !mtd->_write ||
 | 
				
			||||||
 | 
					+		    !mtd->_read_oob ||
 | 
				
			||||||
 | 
					+		    !mtd->_write_oob) {
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					 		if (!mtd->erase ||
 | 
				
			||||||
 | 
					 		    !mtd->read ||
 | 
				
			||||||
 | 
					 		    !mtd->write ||
 | 
				
			||||||
 | 
					@@ -2864,6 +2891,7 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 		    !mtd->write_ecc ||
 | 
				
			||||||
 | 
					 		    !mtd->read_ecc || !mtd->read_oob || !mtd->write_oob) {
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 			T(YAFFS_TRACE_ALWAYS,
 | 
				
			||||||
 | 
					 			  (TSTR("yaffs: MTD device does not support required "
 | 
				
			||||||
 | 
					 			   "functions\n")));
 | 
				
			||||||
@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					--- a/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					@@ -3119,7 +3119,11 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR("yaffs_read_super: got root inode\n")));
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0))
 | 
				
			||||||
 | 
					+	root = d_make_root(inode);
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					 	root = d_alloc_root(inode);
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR("yaffs_read_super: d_alloc_root done\n")));
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					--- a/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					@@ -924,7 +924,11 @@ static void yaffs_evict_inode( struct in
 | 
				
			||||||
 | 
					 	if (!inode->i_nlink && !is_bad_inode(inode))
 | 
				
			||||||
 | 
					 		deleteme = 1;
 | 
				
			||||||
 | 
					 	truncate_inode_pages(&inode->i_data,0);
 | 
				
			||||||
 | 
					-	end_writeback(inode);
 | 
				
			||||||
 | 
					+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
 | 
				
			||||||
 | 
					+	clear_inode(inode);
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+ 	end_writeback(inode);
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if(deleteme && obj){
 | 
				
			||||||
 | 
					 		dev = obj->my_dev;
 | 
				
			||||||
@@ -0,0 +1,570 @@
 | 
				
			|||||||
 | 
					--- a/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					@@ -243,11 +243,10 @@ static inline void yaffs_dec_link_count(
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 #define update_dir_time(dir) do {\
 | 
				
			||||||
 | 
					 			(dir)->i_ctime = (dir)->i_mtime = CURRENT_TIME; \
 | 
				
			||||||
 | 
					 		} while(0)
 | 
				
			||||||
 | 
					-		
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static void yaffs_put_super(struct super_block *sb);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static ssize_t yaffs_file_write(struct file *f, const char *buf, size_t n,
 | 
				
			||||||
 | 
					@@ -397,6 +396,33 @@ static struct address_space_operations y
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0))
 | 
				
			||||||
 | 
					+#define YCRED_FSUID()	from_kuid(&init_user_ns, current_fsuid())
 | 
				
			||||||
 | 
					+#define YCRED_FSGID()	from_kgid(&init_user_ns, current_fsgid())
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+#define YCRED_FSUID()	YCRED(current)->fsuid
 | 
				
			||||||
 | 
					+#define YCRED_FSGID()	YCRED(current)->fsgid
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline uid_t i_uid_read(const struct inode *inode)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return inode->i_uid;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline gid_t i_gid_read(const struct inode *inode)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return inode->i_gid;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void i_uid_write(struct inode *inode, uid_t uid)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	inode->i_uid = uid;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void i_gid_write(struct inode *inode, gid_t gid)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	inode->i_gid = gid;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 22))
 | 
				
			||||||
 | 
					 static const struct file_operations yaffs_file_operations = {
 | 
				
			||||||
 | 
					@@ -549,7 +575,7 @@ static unsigned yaffs_gc_control_callbac
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	return yaffs_gc_control;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					-                	                                                                                          	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static void yaffs_gross_lock(yaffs_dev_t *dev)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_LOCK, (TSTR("yaffs locking %p\n"), current));
 | 
				
			||||||
 | 
					@@ -1379,8 +1405,8 @@ static void yaffs_fill_inode_from_obj(st
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		inode->i_ino = obj->obj_id;
 | 
				
			||||||
 | 
					 		inode->i_mode = obj->yst_mode;
 | 
				
			||||||
 | 
					-		inode->i_uid = obj->yst_uid;
 | 
				
			||||||
 | 
					-		inode->i_gid = obj->yst_gid;
 | 
				
			||||||
 | 
					+		i_uid_write(inode, obj->yst_uid);
 | 
				
			||||||
 | 
					+		i_gid_write(inode, obj->yst_gid);
 | 
				
			||||||
 | 
					 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
 | 
				
			||||||
 | 
					 		inode->i_blksize = inode->i_sb->s_blocksize;
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					@@ -1406,7 +1432,7 @@ static void yaffs_fill_inode_from_obj(st
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		T(YAFFS_TRACE_OS,
 | 
				
			||||||
 | 
					 			(TSTR("yaffs_fill_inode mode %x uid %d gid %d size %d count %d\n"),
 | 
				
			||||||
 | 
					-			inode->i_mode, inode->i_uid, inode->i_gid,
 | 
				
			||||||
 | 
					+			inode->i_mode, i_uid_read(inode), i_gid_read(inode),
 | 
				
			||||||
 | 
					 			(int)inode->i_size, atomic_read(&inode->i_count)));
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		switch (obj->yst_mode & S_IFMT) {
 | 
				
			||||||
 | 
					@@ -1715,8 +1741,8 @@ static int yaffs_mknod(struct inode *dir
 | 
				
			||||||
 | 
					 	yaffs_obj_t *parent = yaffs_InodeToObject(dir);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	int error = -ENOSPC;
 | 
				
			||||||
 | 
					-	uid_t uid = YCRED(current)->fsuid;
 | 
				
			||||||
 | 
					-	gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : YCRED(current)->fsgid;
 | 
				
			||||||
 | 
					+	uid_t uid = YCRED_FSUID();
 | 
				
			||||||
 | 
					+	gid_t gid = (dir->i_mode & S_ISGID) ? i_gid_read(dir) : YCRED_FSGID();
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if ((dir->i_mode & S_ISGID) && S_ISDIR(mode))
 | 
				
			||||||
 | 
					 		mode |= S_ISGID;
 | 
				
			||||||
 | 
					@@ -1892,8 +1918,8 @@ static int yaffs_symlink(struct inode *d
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	yaffs_obj_t *obj;
 | 
				
			||||||
 | 
					 	yaffs_dev_t *dev;
 | 
				
			||||||
 | 
					-	uid_t uid = YCRED(current)->fsuid;
 | 
				
			||||||
 | 
					-	gid_t gid = (dir->i_mode & S_ISGID) ? dir->i_gid : YCRED(current)->fsgid;
 | 
				
			||||||
 | 
					+	uid_t uid = YCRED_FSUID();
 | 
				
			||||||
 | 
					+	gid_t gid = (dir->i_mode & S_ISGID) ? i_gid_read(dir) : YCRED_FSGID();
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR("yaffs_symlink\n")));
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -2009,7 +2035,7 @@ static int yaffs_setattr(struct dentry *
 | 
				
			||||||
 | 
					 		(TSTR("yaffs_setattr of object %d\n"),
 | 
				
			||||||
 | 
					 		yaffs_InodeToObject(inode)->obj_id));
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	/* Fail if a requested resize >= 2GB */		
 | 
				
			||||||
 | 
					+	/* Fail if a requested resize >= 2GB */
 | 
				
			||||||
 | 
					 	if (attr->ia_valid & ATTR_SIZE &&
 | 
				
			||||||
 | 
					 		(attr->ia_size >> 31))
 | 
				
			||||||
 | 
					 		error = -EINVAL;
 | 
				
			||||||
 | 
					@@ -2240,7 +2266,7 @@ static void yaffs_flush_inodes(struct su
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	struct inode *iptr;
 | 
				
			||||||
 | 
					 	yaffs_obj_t *obj;
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	list_for_each_entry(iptr,&sb->s_inodes, i_sb_list){
 | 
				
			||||||
 | 
					 		obj = yaffs_InodeToObject(iptr);
 | 
				
			||||||
 | 
					 		if(obj){
 | 
				
			||||||
 | 
					@@ -2254,10 +2280,10 @@ static void yaffs_flush_inodes(struct su
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static void yaffs_flush_super(struct super_block *sb, int do_checkpoint)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					-	yaffs_dev_t *dev = yaffs_SuperToDevice(sb);	
 | 
				
			||||||
 | 
					+	yaffs_dev_t *dev = yaffs_SuperToDevice(sb);
 | 
				
			||||||
 | 
					 	if(!dev)
 | 
				
			||||||
 | 
					 		return;
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	yaffs_flush_inodes(sb);
 | 
				
			||||||
 | 
					 	yaffs_update_dirty_dirs(dev);
 | 
				
			||||||
 | 
					 	yaffs_flush_whole_cache(dev);
 | 
				
			||||||
 | 
					@@ -2325,7 +2351,7 @@ static int yaffs_do_sync_fs(struct super
 | 
				
			||||||
 | 
					  * yaffs_bg_start() launches the background thread.
 | 
				
			||||||
 | 
					  * yaffs_bg_stop() cleans up the background thread.
 | 
				
			||||||
 | 
					  *
 | 
				
			||||||
 | 
					- * NB: 
 | 
				
			||||||
 | 
					+ * NB:
 | 
				
			||||||
 | 
					  * The thread should only run after the yaffs is initialised
 | 
				
			||||||
 | 
					  * The thread should be stopped before yaffs is unmounted.
 | 
				
			||||||
 | 
					  * The thread should not do any writing while the fs is in read only.
 | 
				
			||||||
 | 
					@@ -2924,7 +2950,7 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	dev = kmalloc(sizeof(yaffs_dev_t), GFP_KERNEL);
 | 
				
			||||||
 | 
					 	context = kmalloc(sizeof(struct yaffs_LinuxContext),GFP_KERNEL);
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	if(!dev || !context ){
 | 
				
			||||||
 | 
					 		if(dev)
 | 
				
			||||||
 | 
					 			kfree(dev);
 | 
				
			||||||
 | 
					@@ -2957,7 +2983,7 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					 	sb->u.generic_sbp = dev;
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	dev->driver_context = mtd;
 | 
				
			||||||
 | 
					 	param->name = mtd->name;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -3057,7 +3083,7 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 	param->gc_control = yaffs_gc_control_callback;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	yaffs_dev_to_lc(dev)->superBlock= sb;
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #ifndef CONFIG_YAFFS_DOES_ECC
 | 
				
			||||||
 | 
					 	param->use_nand_ecc = 1;
 | 
				
			||||||
 | 
					@@ -3099,10 +3125,10 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS,
 | 
				
			||||||
 | 
					 	  (TSTR("yaffs_read_super: guts initialised %s\n"),
 | 
				
			||||||
 | 
					 	   (err == YAFFS_OK) ? "OK" : "FAILED"));
 | 
				
			||||||
 | 
					-	   
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	if(err == YAFFS_OK)
 | 
				
			||||||
 | 
					 		yaffs_bg_start(dev);
 | 
				
			||||||
 | 
					-		
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	if(!context->bgThread)
 | 
				
			||||||
 | 
					 		param->defered_dir_update = 0;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -3345,7 +3371,7 @@ static int yaffs_proc_read(char *page,
 | 
				
			||||||
 | 
					 		buf += sprintf(buf,"\n");
 | 
				
			||||||
 | 
					 	else {
 | 
				
			||||||
 | 
					 		step-=2;
 | 
				
			||||||
 | 
					-		
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 		mutex_lock(&yaffs_context_lock);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		/* Locate and print the Nth entry.  Order N-squared but N is small. */
 | 
				
			||||||
 | 
					@@ -3362,7 +3388,7 @@ static int yaffs_proc_read(char *page,
 | 
				
			||||||
 | 
					 				buf = yaffs_dump_dev_part0(buf, dev);
 | 
				
			||||||
 | 
					 			} else
 | 
				
			||||||
 | 
					 				buf = yaffs_dump_dev_part1(buf, dev);
 | 
				
			||||||
 | 
					-			
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 			break;
 | 
				
			||||||
 | 
					 		}
 | 
				
			||||||
 | 
					 		mutex_unlock(&yaffs_context_lock);
 | 
				
			||||||
 | 
					@@ -3389,7 +3415,7 @@ static int yaffs_stats_proc_read(char *p
 | 
				
			||||||
 | 
					 		int erasedChunks;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		erasedChunks = dev->n_erased_blocks * dev->param.chunks_per_block;
 | 
				
			||||||
 | 
					-		
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 		buf += sprintf(buf,"%d, %d, %d, %u, %u, %u, %u\n",
 | 
				
			||||||
 | 
					 				n, dev->n_free_chunks, erasedChunks,
 | 
				
			||||||
 | 
					 				dev->bg_gcs, dev->oldest_dirty_gc_count,
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yaffs_guts.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_guts.c
 | 
				
			||||||
 | 
					@@ -370,7 +370,7 @@ static int yaffs_verify_chunk_written(ya
 | 
				
			||||||
 | 
					 	yaffs_ext_tags tempTags;
 | 
				
			||||||
 | 
					 	__u8 *buffer = yaffs_get_temp_buffer(dev,__LINE__);
 | 
				
			||||||
 | 
					 	int result;
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	result = yaffs_rd_chunk_tags_nand(dev,nand_chunk,buffer,&tempTags);
 | 
				
			||||||
 | 
					 	if(memcmp(buffer,data,dev->data_bytes_per_chunk) ||
 | 
				
			||||||
 | 
					 		tempTags.obj_id != tags->obj_id ||
 | 
				
			||||||
 | 
					@@ -424,7 +424,7 @@ static int yaffs_write_new_chunk(struct
 | 
				
			||||||
 | 
					 		 * lot of checks that are most likely not needed.
 | 
				
			||||||
 | 
					 		 *
 | 
				
			||||||
 | 
					 		 * Mods to the above
 | 
				
			||||||
 | 
					-		 * If an erase check fails or the write fails we skip the 
 | 
				
			||||||
 | 
					+		 * If an erase check fails or the write fails we skip the
 | 
				
			||||||
 | 
					 		 * rest of the block.
 | 
				
			||||||
 | 
					 		 */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -486,7 +486,7 @@ static int yaffs_write_new_chunk(struct
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					- 
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * Block retiring for handling a broken block.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					@@ -496,7 +496,7 @@ static void yaffs_retire_block(yaffs_dev
 | 
				
			||||||
 | 
					 	yaffs_block_info_t *bi = yaffs_get_block_info(dev, flash_block);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	yaffs2_checkpt_invalidate(dev);
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	yaffs2_clear_oldest_dirty_seq(dev,bi);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (yaffs_mark_bad(dev, flash_block) != YAFFS_OK) {
 | 
				
			||||||
 | 
					@@ -899,7 +899,7 @@ static int yaffs_find_chunk_in_group(yaf
 | 
				
			||||||
 | 
					 	for (j = 0; theChunk && j < dev->chunk_grp_size; j++) {
 | 
				
			||||||
 | 
					 		if (yaffs_check_chunk_bit(dev, theChunk / dev->param.chunks_per_block,
 | 
				
			||||||
 | 
					 				theChunk % dev->param.chunks_per_block)) {
 | 
				
			||||||
 | 
					-			
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 			if(dev->chunk_grp_size == 1)
 | 
				
			||||||
 | 
					 				return theChunk;
 | 
				
			||||||
 | 
					 			else {
 | 
				
			||||||
 | 
					@@ -1802,7 +1802,7 @@ int yaffs_rename_obj(yaffs_obj_t *old_di
 | 
				
			||||||
 | 
					 		yaffs_update_parent(old_dir);
 | 
				
			||||||
 | 
					 		if(new_dir != old_dir)
 | 
				
			||||||
 | 
					 			yaffs_update_parent(new_dir);
 | 
				
			||||||
 | 
					-		
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 		return result;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 	return YAFFS_FAIL;
 | 
				
			||||||
 | 
					@@ -2125,7 +2125,7 @@ static int yaffs_gc_block(yaffs_dev_t *d
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if(bi->block_state == YAFFS_BLOCK_STATE_FULL)
 | 
				
			||||||
 | 
					 		bi->block_state = YAFFS_BLOCK_STATE_COLLECTING;
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	bi->has_shrink_hdr = 0;	/* clear the flag so that the block can erase */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	dev->gc_disable = 1;
 | 
				
			||||||
 | 
					@@ -2207,7 +2207,7 @@ static int yaffs_gc_block(yaffs_dev_t *d
 | 
				
			||||||
 | 
					 					 * No need to copy this, just forget about it and
 | 
				
			||||||
 | 
					 					 * fix up the object.
 | 
				
			||||||
 | 
					 					 */
 | 
				
			||||||
 | 
					-					 
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 					/* Free chunks already includes softdeleted chunks.
 | 
				
			||||||
 | 
					 					 * How ever this chunk is going to soon be really deleted
 | 
				
			||||||
 | 
					 					 * which will increment free chunks.
 | 
				
			||||||
 | 
					@@ -2752,7 +2752,7 @@ int yaffs_put_chunk_in_file(yaffs_obj_t
 | 
				
			||||||
 | 
					 					NULL);
 | 
				
			||||||
 | 
					 	if (!tn)
 | 
				
			||||||
 | 
					 		return YAFFS_FAIL;
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	if(!nand_chunk)
 | 
				
			||||||
 | 
					 		/* Dummy insert, bail now */
 | 
				
			||||||
 | 
					 		return YAFFS_OK;
 | 
				
			||||||
 | 
					@@ -2881,7 +2881,7 @@ void yaffs_chunk_del(yaffs_dev_t *dev, i
 | 
				
			||||||
 | 
					 			 chunk_id));
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	bi = yaffs_get_block_info(dev, block);
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	yaffs2_update_oldest_dirty_seq(dev, block, bi);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_DELETION,
 | 
				
			||||||
 | 
					@@ -2966,8 +2966,8 @@ static int yaffs_wr_data_obj(yaffs_obj_t
 | 
				
			||||||
 | 
					 		(TSTR("Writing %d bytes to chunk!!!!!!!!!" TENDSTR), n_bytes));
 | 
				
			||||||
 | 
					 		YBUG();
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					-		
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	newChunkId =
 | 
				
			||||||
 | 
					 	    yaffs_write_new_chunk(dev, buffer, &newTags,
 | 
				
			||||||
 | 
					 					      useReserve);
 | 
				
			||||||
 | 
					@@ -3795,14 +3795,14 @@ int yaffs_resize_file(yaffs_obj_t *in, l
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (new_size == oldFileSize)
 | 
				
			||||||
 | 
					 		return YAFFS_OK;
 | 
				
			||||||
 | 
					-		
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	if(new_size > oldFileSize){
 | 
				
			||||||
 | 
					 		yaffs2_handle_hole(in,new_size);
 | 
				
			||||||
 | 
					 		in->variant.file_variant.file_size = new_size;
 | 
				
			||||||
 | 
					 	} else {
 | 
				
			||||||
 | 
					-		/* new_size < oldFileSize */ 
 | 
				
			||||||
 | 
					+		/* new_size < oldFileSize */
 | 
				
			||||||
 | 
					 		yaffs_resize_file_down(in, new_size);
 | 
				
			||||||
 | 
					-	} 
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* Write a new object header to reflect the resize.
 | 
				
			||||||
 | 
					 	 * show we've shrunk the file, if need be
 | 
				
			||||||
 | 
					@@ -4231,7 +4231,7 @@ static void yaffs_strip_deleted_objs(yaf
 | 
				
			||||||
 | 
					  * This fixes the problem where directories might have inadvertently been deleted
 | 
				
			||||||
 | 
					  * leaving the object "hanging" without being rooted in the directory tree.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					- 
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static int yaffs_has_null_parent(yaffs_dev_t *dev, yaffs_obj_t *obj)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	return (obj == dev->del_dir ||
 | 
				
			||||||
 | 
					@@ -4262,7 +4262,7 @@ static void yaffs_fix_hanging_objs(yaffs
 | 
				
			||||||
 | 
					 			if (lh) {
 | 
				
			||||||
 | 
					 				obj = ylist_entry(lh, yaffs_obj_t, hash_link);
 | 
				
			||||||
 | 
					 				parent= obj->parent;
 | 
				
			||||||
 | 
					-				
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 				if(yaffs_has_null_parent(dev,obj)){
 | 
				
			||||||
 | 
					 					/* These directories are not hanging */
 | 
				
			||||||
 | 
					 					hanging = 0;
 | 
				
			||||||
 | 
					@@ -4311,7 +4311,7 @@ static void yaffs_del_dir_contents(yaffs
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if(dir->variant_type != YAFFS_OBJECT_TYPE_DIRECTORY)
 | 
				
			||||||
 | 
					 		YBUG();
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	ylist_for_each_safe(lh, n, &dir->variant.dir_variant.children) {
 | 
				
			||||||
 | 
					 		if (lh) {
 | 
				
			||||||
 | 
					 			obj = ylist_entry(lh, yaffs_obj_t, siblings);
 | 
				
			||||||
 | 
					@@ -4325,10 +4325,10 @@ static void yaffs_del_dir_contents(yaffs
 | 
				
			||||||
 | 
					 			/* Need to use UnlinkObject since Delete would not handle
 | 
				
			||||||
 | 
					 			 * hardlinked objects correctly.
 | 
				
			||||||
 | 
					 			 */
 | 
				
			||||||
 | 
					-			yaffs_unlink_obj(obj); 
 | 
				
			||||||
 | 
					+			yaffs_unlink_obj(obj);
 | 
				
			||||||
 | 
					 		}
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					-			
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static void yaffs_empty_l_n_f(yaffs_dev_t *dev)
 | 
				
			||||||
 | 
					@@ -4410,7 +4410,7 @@ static void yaffs_check_obj_details_load
 | 
				
			||||||
 | 
					  * If the directory updating is defered then yaffs_update_dirty_dirs must be
 | 
				
			||||||
 | 
					  * called periodically.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					- 
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static void yaffs_update_parent(yaffs_obj_t *obj)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	yaffs_dev_t *dev;
 | 
				
			||||||
 | 
					@@ -4422,8 +4422,8 @@ static void yaffs_update_parent(yaffs_ob
 | 
				
			||||||
 | 
					 	obj->dirty = 1;
 | 
				
			||||||
 | 
					 	obj->yst_mtime = obj->yst_ctime = Y_CURRENT_TIME;
 | 
				
			||||||
 | 
					 	if(dev->param.defered_dir_update){
 | 
				
			||||||
 | 
					-		struct ylist_head *link = &obj->variant.dir_variant.dirty; 
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+		struct ylist_head *link = &obj->variant.dir_variant.dirty;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 		if(ylist_empty(link)){
 | 
				
			||||||
 | 
					 			ylist_add(link,&dev->dirty_dirs);
 | 
				
			||||||
 | 
					 			T(YAFFS_TRACE_BACKGROUND, (TSTR("Added object %d to dirty directories" TENDSTR),obj->obj_id));
 | 
				
			||||||
 | 
					@@ -4446,7 +4446,7 @@ void yaffs_update_dirty_dirs(yaffs_dev_t
 | 
				
			||||||
 | 
					 	while(!ylist_empty(&dev->dirty_dirs)){
 | 
				
			||||||
 | 
					 		link = dev->dirty_dirs.next;
 | 
				
			||||||
 | 
					 		ylist_del_init(link);
 | 
				
			||||||
 | 
					-		
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 		dS=ylist_entry(link,yaffs_dir_s,dirty);
 | 
				
			||||||
 | 
					 		oV = ylist_entry(dS,yaffs_obj_variant,dir_variant);
 | 
				
			||||||
 | 
					 		obj = ylist_entry(oV,yaffs_obj_t,variant);
 | 
				
			||||||
 | 
					@@ -4474,7 +4474,7 @@ static void yaffs_remove_obj_from_dir(ya
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	ylist_del_init(&obj->siblings);
 | 
				
			||||||
 | 
					 	obj->parent = NULL;
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	yaffs_verify_dir(parent);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -4645,7 +4645,7 @@ yaffs_obj_t *yaffs_get_equivalent_obj(ya
 | 
				
			||||||
 | 
					  * system to share files.
 | 
				
			||||||
 | 
					  *
 | 
				
			||||||
 | 
					  * These automatic unicode are stored slightly differently...
 | 
				
			||||||
 | 
					- *  - If the name can fit in the ASCII character space then they are saved as 
 | 
				
			||||||
 | 
					+ *  - If the name can fit in the ASCII character space then they are saved as
 | 
				
			||||||
 | 
					  *    ascii names as per above.
 | 
				
			||||||
 | 
					  *  - If the name needs Unicode then the name is saved in Unicode
 | 
				
			||||||
 | 
					  *    starting at oh->name[1].
 | 
				
			||||||
 | 
					@@ -4686,7 +4686,7 @@ static void yaffs_load_name_from_oh(yaff
 | 
				
			||||||
 | 
					 				asciiOhName++;
 | 
				
			||||||
 | 
					 				n--;
 | 
				
			||||||
 | 
					 			}
 | 
				
			||||||
 | 
					-		} else 
 | 
				
			||||||
 | 
					+		} else
 | 
				
			||||||
 | 
					 			yaffs_strncpy(name,ohName+1, bufferSize -1);
 | 
				
			||||||
 | 
					 	} else
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					@@ -4705,7 +4705,7 @@ static void yaffs_load_oh_from_name(yaff
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		isAscii = 1;
 | 
				
			||||||
 | 
					 		w = name;
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 		/* Figure out if the name will fit in ascii character set */
 | 
				
			||||||
 | 
					 		while(isAscii && *w){
 | 
				
			||||||
 | 
					 			if((*w) & 0xff00)
 | 
				
			||||||
 | 
					@@ -4729,7 +4729,7 @@ static void yaffs_load_oh_from_name(yaff
 | 
				
			||||||
 | 
					 			yaffs_strncpy(ohName+1,name, YAFFS_MAX_NAME_LENGTH -2);
 | 
				
			||||||
 | 
					 		}
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					-	else 
 | 
				
			||||||
 | 
					+	else
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 		yaffs_strncpy(ohName,name, YAFFS_MAX_NAME_LENGTH - 1);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -4738,12 +4738,12 @@ static void yaffs_load_oh_from_name(yaff
 | 
				
			||||||
 | 
					 int yaffs_get_obj_name(yaffs_obj_t * obj, YCHAR * name, int buffer_size)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	memset(name, 0, buffer_size * sizeof(YCHAR));
 | 
				
			||||||
 | 
					-	
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	yaffs_check_obj_details_loaded(obj);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (obj->obj_id == YAFFS_OBJECTID_LOSTNFOUND) {
 | 
				
			||||||
 | 
					 		yaffs_strncpy(name, YAFFS_LOSTNFOUND_NAME, buffer_size - 1);
 | 
				
			||||||
 | 
					-	} 
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					 #ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM
 | 
				
			||||||
 | 
					 	else if (obj->short_name[0]) {
 | 
				
			||||||
 | 
					 		yaffs_strcpy(name, obj->short_name);
 | 
				
			||||||
 | 
					@@ -4861,9 +4861,9 @@ int yaffs_set_attribs(yaffs_obj_t *obj,
 | 
				
			||||||
 | 
					 	if (valid & ATTR_MODE)
 | 
				
			||||||
 | 
					 		obj->yst_mode = attr->ia_mode;
 | 
				
			||||||
 | 
					 	if (valid & ATTR_UID)
 | 
				
			||||||
 | 
					-		obj->yst_uid = attr->ia_uid;
 | 
				
			||||||
 | 
					+		obj->yst_uid = ia_uid_read(attr);
 | 
				
			||||||
 | 
					 	if (valid & ATTR_GID)
 | 
				
			||||||
 | 
					-		obj->yst_gid = attr->ia_gid;
 | 
				
			||||||
 | 
					+		obj->yst_gid = ia_gid_read(attr);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (valid & ATTR_ATIME)
 | 
				
			||||||
 | 
					 		obj->yst_atime = Y_TIME_CONVERT(attr->ia_atime);
 | 
				
			||||||
 | 
					@@ -4886,9 +4886,9 @@ int yaffs_get_attribs(yaffs_obj_t *obj,
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	attr->ia_mode = obj->yst_mode;
 | 
				
			||||||
 | 
					 	valid |= ATTR_MODE;
 | 
				
			||||||
 | 
					-	attr->ia_uid = obj->yst_uid;
 | 
				
			||||||
 | 
					+	ia_uid_write(attr, obj->yst_uid);
 | 
				
			||||||
 | 
					 	valid |= ATTR_UID;
 | 
				
			||||||
 | 
					-	attr->ia_gid = obj->yst_gid;
 | 
				
			||||||
 | 
					+	ia_gid_write(attr, obj->yst_gid);
 | 
				
			||||||
 | 
					 	valid |= ATTR_GID;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	Y_TIME_CONVERT(attr->ia_atime) = obj->yst_atime;
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yportenv.h
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yportenv.h
 | 
				
			||||||
 | 
					@@ -170,7 +170,7 @@
 | 
				
			||||||
 | 
					 #define O_RDWR		02
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#ifndef O_CREAT		
 | 
				
			||||||
 | 
					+#ifndef O_CREAT
 | 
				
			||||||
 | 
					 #define O_CREAT 	0100
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -218,7 +218,7 @@
 | 
				
			||||||
 | 
					 #define EACCES	13
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#ifndef EXDEV	
 | 
				
			||||||
 | 
					+#ifndef EXDEV
 | 
				
			||||||
 | 
					 #define EXDEV	18
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -281,7 +281,7 @@
 | 
				
			||||||
 | 
					 #define S_IFREG		0100000
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#ifndef S_IREAD 
 | 
				
			||||||
 | 
					+#ifndef S_IREAD
 | 
				
			||||||
 | 
					 #define S_IREAD		0000400
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/devextras.h
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/devextras.h
 | 
				
			||||||
 | 
					@@ -87,6 +87,8 @@ struct iattr {
 | 
				
			||||||
 | 
					 	unsigned int ia_attr_flags;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+/* TODO: add ia_* functions */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					@@ -95,7 +97,48 @@ struct iattr {
 | 
				
			||||||
 | 
					 #include <linux/fs.h>
 | 
				
			||||||
 | 
					 #include <linux/stat.h>
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0))
 | 
				
			||||||
 | 
					+static inline uid_t ia_uid_read(const struct iattr *iattr)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return from_kuid(&init_user_ns, iattr->ia_uid);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline gid_t ia_gid_read(const struct iattr *iattr)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return from_kgid(&init_user_ns, iattr->ia_gid);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void ia_uid_write(struct iattr *iattr, uid_t uid)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	iattr->ia_uid = make_kuid(&init_user_ns, uid);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void ia_gid_write(struct iattr *iattr, gid_t gid)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	iattr->ia_gid = make_kgid(&init_user_ns, gid);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+static inline uid_t ia_uid_read(const struct iattr *iattr)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return iattr->ia_uid;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline gid_t ia_gid_read(const struct iattr *inode)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return iattr->ia_gid;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void ia_uid_write(struct iattr *iattr, uid_t uid)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	iattr->ia_uid = uid;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void ia_gid_write(struct iattr *iattr, gid_t gid)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	iattr->ia_gid = gid;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
@@ -0,0 +1,60 @@
 | 
				
			|||||||
 | 
					--- a/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					@@ -271,20 +271,29 @@ static int yaffs_sync_object(struct file
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static int yaffs_readdir(struct file *f, void *dirent, filldir_t filldir);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
 | 
					-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
 | 
				
			||||||
 | 
					+static int yaffs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 | 
				
			||||||
 | 
					+			bool excl);
 | 
				
			||||||
 | 
					+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
 | 
				
			||||||
 | 
					 static int yaffs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 | 
				
			||||||
 | 
					 			struct nameidata *n);
 | 
				
			||||||
 | 
					-#else
 | 
				
			||||||
 | 
					+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
 | 
					 static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode,
 | 
				
			||||||
 | 
					 			struct nameidata *n);
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode);
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
 | 
				
			||||||
 | 
					+static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry,
 | 
				
			||||||
 | 
					+					unsigned int flags);
 | 
				
			||||||
 | 
					+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
 | 
					 static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry,
 | 
				
			||||||
 | 
					 					struct nameidata *n);
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					-static int yaffs_create(struct inode *dir, struct dentry *dentry, int mode);
 | 
				
			||||||
 | 
					 static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry);
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static int yaffs_link(struct dentry *old_dentry, struct inode *dir,
 | 
				
			||||||
 | 
					 			struct dentry *dentry);
 | 
				
			||||||
 | 
					 static int yaffs_unlink(struct inode *dir, struct dentry *dentry);
 | 
				
			||||||
 | 
					@@ -837,7 +846,10 @@ struct inode *yaffs_get_inode(struct sup
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * Lookup is used to find objects in the fs
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
 | 
				
			||||||
 | 
					+static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry,
 | 
				
			||||||
 | 
					+				   unsigned int flags)
 | 
				
			||||||
 | 
					+#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static struct dentry *yaffs_lookup(struct inode *dir, struct dentry *dentry,
 | 
				
			||||||
 | 
					 				struct nameidata *n)
 | 
				
			||||||
 | 
					@@ -1827,7 +1839,10 @@ static int yaffs_mkdir(struct inode *dir
 | 
				
			||||||
 | 
					 	return retVal;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
 | 
				
			||||||
 | 
					+static int yaffs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 | 
				
			||||||
 | 
					+			bool excl)
 | 
				
			||||||
 | 
					+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
 | 
				
			||||||
 | 
					 static int yaffs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 | 
				
			||||||
 | 
					 			struct nameidata *n)
 | 
				
			||||||
 | 
					 #elif (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
@@ -0,0 +1,180 @@
 | 
				
			|||||||
 | 
					--- a/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_vfs_glue.c
 | 
				
			||||||
 | 
					@@ -393,6 +393,84 @@ static void yaffs_touch_super(yaffs_dev_
 | 
				
			||||||
 | 
					 static int yaffs_vfs_setattr(struct inode *, struct iattr *);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#define yaffs_super_to_dev(sb)    ((struct yaffs_dev_s *)sb->s_fs_info)
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline struct yaffs_LinuxContext *
 | 
				
			||||||
 | 
					+yaffs_sb_to_ylc(struct super_block *sb)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct yaffs_dev_s *ydev;
 | 
				
			||||||
 | 
					+	struct yaffs_LinuxContext *ylc;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	ydev = yaffs_super_to_dev(sb);
 | 
				
			||||||
 | 
					+	ylc = yaffs_dev_to_lc(ydev);
 | 
				
			||||||
 | 
					+	return ylc;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline struct super_block *yaffs_work_to_sb(struct work_struct *work)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct delayed_work *dwork;
 | 
				
			||||||
 | 
					+	struct yaffs_LinuxContext *ylc;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	dwork = container_of(work, struct delayed_work, work);
 | 
				
			||||||
 | 
					+	ylc = container_of(dwork, struct yaffs_LinuxContext, sb_sync_dwork);
 | 
				
			||||||
 | 
					+	return ylc->superBlock;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void yaffs_sb_sync_dwork_func(struct work_struct *work)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct super_block *sb = yaffs_work_to_sb(work);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	yaffs_write_super(sb);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void yaffs_init_sb_sync_dwork(struct yaffs_LinuxContext *ylc)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	INIT_DELAYED_WORK(&ylc->sb_sync_dwork, yaffs_sb_sync_dwork_func);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void yaffs_cancel_sb_sync_dwork(struct super_block *sb)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct yaffs_LinuxContext *ylc = yaffs_sb_to_ylc(sb);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	cancel_delayed_work_sync(&ylc->sb_sync_dwork);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline bool yaffs_sb_is_dirty(struct super_block *sb)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct yaffs_LinuxContext *ylc = yaffs_sb_to_ylc(sb);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return !!ylc->sb_dirty;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void yaffs_sb_set_dirty(struct super_block *sb, int dirty)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct yaffs_LinuxContext *ylc = yaffs_sb_to_ylc(sb);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (ylc->sb_dirty == dirty)
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	ylc->sb_dirty = dirty;
 | 
				
			||||||
 | 
					+	if (dirty)
 | 
				
			||||||
 | 
					+		queue_delayed_work(system_long_wq, &ylc->sb_sync_dwork,
 | 
				
			||||||
 | 
					+				   msecs_to_jiffies(5000));
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+static inline bool yaffs_sb_is_dirty(struct super_block *sb)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return !!sb->s_dirt;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void yaffs_sb_set_dirty(struct super_block *sb, int dirty)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	sb->s_dirt = dirty;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void yaffs_init_sb_sync_dwork(struct yaffs_LinuxContext *ylc) {}
 | 
				
			||||||
 | 
					+static inline void yaffs_cancel_sb_sync_dwork(struct super_block *sb) {}
 | 
				
			||||||
 | 
					+#endif /* >= 3.6.0 */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static struct address_space_operations yaffs_file_address_operations = {
 | 
				
			||||||
 | 
					 	.readpage = yaffs_readpage,
 | 
				
			||||||
 | 
					 	.writepage = yaffs_writepage,
 | 
				
			||||||
 | 
					@@ -553,7 +631,9 @@ static const struct super_operations yaf
 | 
				
			||||||
 | 
					 	.clear_inode = yaffs_clear_inode,
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 	.sync_fs = yaffs_sync_fs,
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
 | 
				
			||||||
 | 
					 	.write_super = yaffs_write_super,
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -2340,7 +2420,7 @@ static int yaffs_do_sync_fs(struct super
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS | YAFFS_TRACE_SYNC | YAFFS_TRACE_BACKGROUND,
 | 
				
			||||||
 | 
					 		(TSTR("yaffs_do_sync_fs: gc-urgency %d %s %s%s\n"),
 | 
				
			||||||
 | 
					 		gc_urgent,
 | 
				
			||||||
 | 
					-		sb->s_dirt ? "dirty" : "clean",
 | 
				
			||||||
 | 
					+		yaffs_sb_is_dirty(sb) ? "dirty" : "clean",
 | 
				
			||||||
 | 
					 		request_checkpoint ? "checkpoint requested" : "no checkpoint",
 | 
				
			||||||
 | 
					 		oneshot_checkpoint ? " one-shot" : "" ));
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -2349,9 +2429,9 @@ static int yaffs_do_sync_fs(struct super
 | 
				
			||||||
 | 
					 			oneshot_checkpoint) &&
 | 
				
			||||||
 | 
					 			!dev->is_checkpointed;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	if (sb->s_dirt || do_checkpoint) {
 | 
				
			||||||
 | 
					+	if (yaffs_sb_is_dirty(sb) || do_checkpoint) {
 | 
				
			||||||
 | 
					 		yaffs_flush_super(sb, !dev->is_checkpointed && do_checkpoint);
 | 
				
			||||||
 | 
					-		sb->s_dirt = 0;
 | 
				
			||||||
 | 
					+		yaffs_sb_set_dirty(sb, 0);
 | 
				
			||||||
 | 
					 		if(oneshot_checkpoint)
 | 
				
			||||||
 | 
					 			yaffs_auto_checkpoint &= ~4;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					@@ -2627,6 +2707,8 @@ static void yaffs_put_super(struct super
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	yaffs_flush_super(sb,1);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	yaffs_cancel_sb_sync_dwork(sb);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	if (yaffs_dev_to_lc(dev)->putSuperFunc)
 | 
				
			||||||
 | 
					 		yaffs_dev_to_lc(dev)->putSuperFunc(sb);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -2665,7 +2747,7 @@ static void yaffs_touch_super(yaffs_dev_
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_OS, (TSTR("yaffs_touch_super() sb = %p\n"), sb));
 | 
				
			||||||
 | 
					 	if (sb)
 | 
				
			||||||
 | 
					-		sb->s_dirt = 1;
 | 
				
			||||||
 | 
					+		yaffs_sb_set_dirty(sb, 1);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 typedef struct {
 | 
				
			||||||
 | 
					@@ -2991,6 +3073,8 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 	context->dev = dev;
 | 
				
			||||||
 | 
					 	context->superBlock = sb;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	yaffs_init_sb_sync_dwork(context);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	dev->read_only = read_only;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 | 
				
			||||||
 | 
					@@ -3177,7 +3261,7 @@ static struct super_block *yaffs_interna
 | 
				
			||||||
 | 
					 		return NULL;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 	sb->s_root = root;
 | 
				
			||||||
 | 
					-	sb->s_dirt = !dev->is_checkpointed;
 | 
				
			||||||
 | 
					+	yaffs_sb_set_dirty(sb, !dev->is_checkpointed);
 | 
				
			||||||
 | 
					 	T(YAFFS_TRACE_ALWAYS,
 | 
				
			||||||
 | 
					 		(TSTR("yaffs_read_super: is_checkpointed %d\n"),
 | 
				
			||||||
 | 
					 		dev->is_checkpointed));
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yaffs_linux.h
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yaffs_linux.h
 | 
				
			||||||
 | 
					@@ -34,6 +34,11 @@ struct yaffs_LinuxContext {
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	struct task_struct *readdirProcess;
 | 
				
			||||||
 | 
					 	unsigned mount_id;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
 | 
				
			||||||
 | 
					+	struct delayed_work sb_sync_dwork;	/* superblock write-out work */
 | 
				
			||||||
 | 
					+	int sb_dirty;				/* superblock is dirty */
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define yaffs_dev_to_lc(dev) ((struct yaffs_LinuxContext *)((dev)->os_context))
 | 
				
			||||||
 | 
					--- a/fs/yaffs2/yportenv.h
 | 
				
			||||||
 | 
					+++ b/fs/yaffs2/yportenv.h
 | 
				
			||||||
 | 
					@@ -49,6 +49,9 @@
 | 
				
			||||||
 | 
					 #include <linux/slab.h>
 | 
				
			||||||
 | 
					 #include <linux/vmalloc.h>
 | 
				
			||||||
 | 
					 #include <linux/xattr.h>
 | 
				
			||||||
 | 
					+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
 | 
				
			||||||
 | 
					+#include <linux/workqueue.h>
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define YCHAR char
 | 
				
			||||||
 | 
					 #define YUCHAR unsigned char
 | 
				
			||||||
@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					From f31b7c0efa255dd17a5f584022a319387f09b0d8 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Jonas Gorski <jonas.gorski@gmail.com>
 | 
				
			||||||
 | 
					Date: Tue, 12 Apr 2011 19:55:41 +0200
 | 
				
			||||||
 | 
					Subject: [PATCH] squashfs: update xz compressor options struct.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Update the xz compressor options struct to match the squashfs userspace
 | 
				
			||||||
 | 
					one.
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 fs/squashfs/xz_wrapper.c |    4 +++-
 | 
				
			||||||
 | 
					 1 files changed, 3 insertions(+), 1 deletions(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/fs/squashfs/xz_wrapper.c
 | 
				
			||||||
 | 
					+++ b/fs/squashfs/xz_wrapper.c
 | 
				
			||||||
 | 
					@@ -39,8 +39,10 @@ struct squashfs_xz {
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 struct comp_opts {
 | 
				
			||||||
 | 
					-	__le32 dictionary_size;
 | 
				
			||||||
 | 
					 	__le32 flags;
 | 
				
			||||||
 | 
					+	__le16 bit_opts;
 | 
				
			||||||
 | 
					+	__le16 fb;
 | 
				
			||||||
 | 
					+	__le32 dictionary_size;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static void *squashfs_xz_init(struct squashfs_sb_info *msblk, void *buff,
 | 
				
			||||||
							
								
								
									
										5142
									
								
								target/linux/generic/patches-3.8/530-jffs2_make_lzma_available.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5142
									
								
								target/linux/generic/patches-3.8/530-jffs2_make_lzma_available.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										485
									
								
								target/linux/generic/patches-3.8/531-debloat_lzma.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										485
									
								
								target/linux/generic/patches-3.8/531-debloat_lzma.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,485 @@
 | 
				
			|||||||
 | 
					--- a/include/linux/lzma/LzmaDec.h
 | 
				
			||||||
 | 
					+++ b/include/linux/lzma/LzmaDec.h
 | 
				
			||||||
 | 
					@@ -31,14 +31,6 @@ typedef struct _CLzmaProps
 | 
				
			||||||
 | 
					   UInt32 dicSize;
 | 
				
			||||||
 | 
					 } CLzmaProps;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-/* LzmaProps_Decode - decodes properties
 | 
				
			||||||
 | 
					-Returns:
 | 
				
			||||||
 | 
					-  SZ_OK
 | 
				
			||||||
 | 
					-  SZ_ERROR_UNSUPPORTED - Unsupported properties
 | 
				
			||||||
 | 
					-*/
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* ---------- LZMA Decoder state ---------- */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -70,8 +62,6 @@ typedef struct
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void LzmaDec_Init(CLzmaDec *p);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 /* There are two types of LZMA streams:
 | 
				
			||||||
 | 
					      0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
 | 
				
			||||||
 | 
					      1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
 | 
				
			||||||
 | 
					@@ -108,97 +98,6 @@ typedef enum
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* ELzmaStatus is used only as output value for function call */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-/* ---------- Interfaces ---------- */
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-/* There are 3 levels of interfaces:
 | 
				
			||||||
 | 
					-     1) Dictionary Interface
 | 
				
			||||||
 | 
					-     2) Buffer Interface
 | 
				
			||||||
 | 
					-     3) One Call Interface
 | 
				
			||||||
 | 
					-   You can select any of these interfaces, but don't mix functions from different
 | 
				
			||||||
 | 
					-   groups for same object. */
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-/* There are two variants to allocate state for Dictionary Interface:
 | 
				
			||||||
 | 
					-     1) LzmaDec_Allocate / LzmaDec_Free
 | 
				
			||||||
 | 
					-     2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
 | 
				
			||||||
 | 
					-   You can use variant 2, if you set dictionary buffer manually.
 | 
				
			||||||
 | 
					-   For Buffer Interface you must always use variant 1.
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-LzmaDec_Allocate* can return:
 | 
				
			||||||
 | 
					-  SZ_OK
 | 
				
			||||||
 | 
					-  SZ_ERROR_MEM         - Memory allocation error
 | 
				
			||||||
 | 
					-  SZ_ERROR_UNSUPPORTED - Unsupported properties
 | 
				
			||||||
 | 
					-*/
 | 
				
			||||||
 | 
					-   
 | 
				
			||||||
 | 
					-SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
 | 
				
			||||||
 | 
					-void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
 | 
				
			||||||
 | 
					-void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-/* ---------- Dictionary Interface ---------- */
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-/* You can use it, if you want to eliminate the overhead for data copying from
 | 
				
			||||||
 | 
					-   dictionary to some other external buffer.
 | 
				
			||||||
 | 
					-   You must work with CLzmaDec variables directly in this interface.
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-   STEPS:
 | 
				
			||||||
 | 
					-     LzmaDec_Constr()
 | 
				
			||||||
 | 
					-     LzmaDec_Allocate()
 | 
				
			||||||
 | 
					-     for (each new stream)
 | 
				
			||||||
 | 
					-     {
 | 
				
			||||||
 | 
					-       LzmaDec_Init()
 | 
				
			||||||
 | 
					-       while (it needs more decompression)
 | 
				
			||||||
 | 
					-       {
 | 
				
			||||||
 | 
					-         LzmaDec_DecodeToDic()
 | 
				
			||||||
 | 
					-         use data from CLzmaDec::dic and update CLzmaDec::dicPos
 | 
				
			||||||
 | 
					-       }
 | 
				
			||||||
 | 
					-     }
 | 
				
			||||||
 | 
					-     LzmaDec_Free()
 | 
				
			||||||
 | 
					-*/
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-/* LzmaDec_DecodeToDic
 | 
				
			||||||
 | 
					-   
 | 
				
			||||||
 | 
					-   The decoding to internal dictionary buffer (CLzmaDec::dic).
 | 
				
			||||||
 | 
					-   You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-finishMode:
 | 
				
			||||||
 | 
					-  It has meaning only if the decoding reaches output limit (dicLimit).
 | 
				
			||||||
 | 
					-  LZMA_FINISH_ANY - Decode just dicLimit bytes.
 | 
				
			||||||
 | 
					-  LZMA_FINISH_END - Stream must be finished after dicLimit.
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-Returns:
 | 
				
			||||||
 | 
					-  SZ_OK
 | 
				
			||||||
 | 
					-    status:
 | 
				
			||||||
 | 
					-      LZMA_STATUS_FINISHED_WITH_MARK
 | 
				
			||||||
 | 
					-      LZMA_STATUS_NOT_FINISHED
 | 
				
			||||||
 | 
					-      LZMA_STATUS_NEEDS_MORE_INPUT
 | 
				
			||||||
 | 
					-      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
 | 
				
			||||||
 | 
					-  SZ_ERROR_DATA - Data error
 | 
				
			||||||
 | 
					-*/
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
 | 
				
			||||||
 | 
					-    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-/* ---------- Buffer Interface ---------- */
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-/* It's zlib-like interface.
 | 
				
			||||||
 | 
					-   See LzmaDec_DecodeToDic description for information about STEPS and return results,
 | 
				
			||||||
 | 
					-   but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
 | 
				
			||||||
 | 
					-   to work with CLzmaDec variables manually.
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-finishMode:
 | 
				
			||||||
 | 
					-  It has meaning only if the decoding reaches output limit (*destLen).
 | 
				
			||||||
 | 
					-  LZMA_FINISH_ANY - Decode just destLen bytes.
 | 
				
			||||||
 | 
					-  LZMA_FINISH_END - Stream must be finished after (*destLen).
 | 
				
			||||||
 | 
					-*/
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
 | 
				
			||||||
 | 
					-    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 /* ---------- One Call Interface ---------- */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* LzmaDecode
 | 
				
			||||||
 | 
					--- a/lib/lzma/LzmaDec.c
 | 
				
			||||||
 | 
					+++ b/lib/lzma/LzmaDec.c
 | 
				
			||||||
 | 
					@@ -682,7 +682,7 @@ static void LzmaDec_InitRc(CLzmaDec *p,
 | 
				
			||||||
 | 
					   p->needFlush = 0;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
 | 
				
			||||||
 | 
					+static void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   p->needFlush = 1;
 | 
				
			||||||
 | 
					   p->remainLen = 0;
 | 
				
			||||||
 | 
					@@ -698,7 +698,7 @@ void LzmaDec_InitDicAndState(CLzmaDec *p
 | 
				
			||||||
 | 
					     p->needInitState = 1;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void LzmaDec_Init(CLzmaDec *p)
 | 
				
			||||||
 | 
					+static void LzmaDec_Init(CLzmaDec *p)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   p->dicPos = 0;
 | 
				
			||||||
 | 
					   LzmaDec_InitDicAndState(p, True, True);
 | 
				
			||||||
 | 
					@@ -716,7 +716,7 @@ static void LzmaDec_InitStateReal(CLzmaD
 | 
				
			||||||
 | 
					   p->needInitState = 0;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
 | 
				
			||||||
 | 
					+static SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
 | 
				
			||||||
 | 
					     ELzmaFinishMode finishMode, ELzmaStatus *status)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   SizeT inSize = *srcLen;
 | 
				
			||||||
 | 
					@@ -837,7 +837,7 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, Si
 | 
				
			||||||
 | 
					   return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
 | 
				
			||||||
 | 
					+static __maybe_unused SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   SizeT outSize = *destLen;
 | 
				
			||||||
 | 
					   SizeT inSize = *srcLen;
 | 
				
			||||||
 | 
					@@ -877,7 +877,7 @@ SRes LzmaDec_DecodeToBuf(CLzmaDec *p, By
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
 | 
				
			||||||
 | 
					+static void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   alloc->Free(alloc, p->probs);
 | 
				
			||||||
 | 
					   p->probs = 0;
 | 
				
			||||||
 | 
					@@ -889,13 +889,13 @@ static void LzmaDec_FreeDict(CLzmaDec *p
 | 
				
			||||||
 | 
					   p->dic = 0;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
 | 
				
			||||||
 | 
					+static void __maybe_unused LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   LzmaDec_FreeProbs(p, alloc);
 | 
				
			||||||
 | 
					   LzmaDec_FreeDict(p, alloc);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
 | 
				
			||||||
 | 
					+static SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   UInt32 dicSize;
 | 
				
			||||||
 | 
					   Byte d;
 | 
				
			||||||
 | 
					@@ -935,7 +935,7 @@ static SRes LzmaDec_AllocateProbs2(CLzma
 | 
				
			||||||
 | 
					   return SZ_OK;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
 | 
				
			||||||
 | 
					+static SRes __maybe_unused LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   CLzmaProps propNew;
 | 
				
			||||||
 | 
					   RINOK(LzmaProps_Decode(&propNew, props, propsSize));
 | 
				
			||||||
 | 
					@@ -944,7 +944,7 @@ SRes LzmaDec_AllocateProbs(CLzmaDec *p,
 | 
				
			||||||
 | 
					   return SZ_OK;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
 | 
				
			||||||
 | 
					+static SRes __maybe_unused LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   CLzmaProps propNew;
 | 
				
			||||||
 | 
					   SizeT dicBufSize;
 | 
				
			||||||
 | 
					--- a/include/linux/lzma/LzmaEnc.h
 | 
				
			||||||
 | 
					+++ b/include/linux/lzma/LzmaEnc.h
 | 
				
			||||||
 | 
					@@ -31,9 +31,6 @@ typedef struct _CLzmaEncProps
 | 
				
			||||||
 | 
					 } CLzmaEncProps;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 void LzmaEncProps_Init(CLzmaEncProps *p);
 | 
				
			||||||
 | 
					-void LzmaEncProps_Normalize(CLzmaEncProps *p);
 | 
				
			||||||
 | 
					-UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* ---------- CLzmaEncHandle Interface ---------- */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -53,26 +50,9 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *
 | 
				
			||||||
 | 
					 void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);
 | 
				
			||||||
 | 
					 SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);
 | 
				
			||||||
 | 
					 SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);
 | 
				
			||||||
 | 
					-SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,
 | 
				
			||||||
 | 
					-    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
 | 
				
			||||||
 | 
					 SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
 | 
				
			||||||
 | 
					     int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-/* ---------- One Call Interface ---------- */
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-/* LzmaEncode
 | 
				
			||||||
 | 
					-Return code:
 | 
				
			||||||
 | 
					-  SZ_OK               - OK
 | 
				
			||||||
 | 
					-  SZ_ERROR_MEM        - Memory allocation error
 | 
				
			||||||
 | 
					-  SZ_ERROR_PARAM      - Incorrect paramater
 | 
				
			||||||
 | 
					-  SZ_ERROR_OUTPUT_EOF - output buffer overflow
 | 
				
			||||||
 | 
					-  SZ_ERROR_THREAD     - errors in multithreading functions (only for Mt version)
 | 
				
			||||||
 | 
					-*/
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
 | 
				
			||||||
 | 
					-    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
 | 
				
			||||||
 | 
					-    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 #ifdef __cplusplus
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					--- a/lib/lzma/LzmaEnc.c
 | 
				
			||||||
 | 
					+++ b/lib/lzma/LzmaEnc.c
 | 
				
			||||||
 | 
					@@ -53,7 +53,7 @@ void LzmaEncProps_Init(CLzmaEncProps *p)
 | 
				
			||||||
 | 
					   p->writeEndMark = 0;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void LzmaEncProps_Normalize(CLzmaEncProps *p)
 | 
				
			||||||
 | 
					+static void LzmaEncProps_Normalize(CLzmaEncProps *p)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   int level = p->level;
 | 
				
			||||||
 | 
					   if (level < 0) level = 5;
 | 
				
			||||||
 | 
					@@ -76,7 +76,7 @@ void LzmaEncProps_Normalize(CLzmaEncProp
 | 
				
			||||||
 | 
					       #endif
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
 | 
				
			||||||
 | 
					+static UInt32 __maybe_unused LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   CLzmaEncProps props = *props2;
 | 
				
			||||||
 | 
					   LzmaEncProps_Normalize(&props);
 | 
				
			||||||
 | 
					@@ -93,7 +93,7 @@ UInt32 LzmaEncProps_GetDictSize(const CL
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-UInt32 GetPosSlot1(UInt32 pos)
 | 
				
			||||||
 | 
					+static UInt32 GetPosSlot1(UInt32 pos)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   UInt32 res;
 | 
				
			||||||
 | 
					   BSR2_RET(pos, res);
 | 
				
			||||||
 | 
					@@ -107,7 +107,7 @@ UInt32 GetPosSlot1(UInt32 pos)
 | 
				
			||||||
 | 
					 #define kNumLogBits (9 + (int)sizeof(size_t) / 2)
 | 
				
			||||||
 | 
					 #define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void LzmaEnc_FastPosInit(Byte *g_FastPos)
 | 
				
			||||||
 | 
					+static void LzmaEnc_FastPosInit(Byte *g_FastPos)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   int c = 2, slotFast;
 | 
				
			||||||
 | 
					   g_FastPos[0] = 0;
 | 
				
			||||||
 | 
					@@ -339,7 +339,7 @@ typedef struct
 | 
				
			||||||
 | 
					   CSaveState saveState;
 | 
				
			||||||
 | 
					 } CLzmaEnc;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void LzmaEnc_SaveState(CLzmaEncHandle pp)
 | 
				
			||||||
 | 
					+static void __maybe_unused LzmaEnc_SaveState(CLzmaEncHandle pp)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   CLzmaEnc *p = (CLzmaEnc *)pp;
 | 
				
			||||||
 | 
					   CSaveState *dest = &p->saveState;
 | 
				
			||||||
 | 
					@@ -365,7 +365,7 @@ void LzmaEnc_SaveState(CLzmaEncHandle pp
 | 
				
			||||||
 | 
					   memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void LzmaEnc_RestoreState(CLzmaEncHandle pp)
 | 
				
			||||||
 | 
					+static void __maybe_unused LzmaEnc_RestoreState(CLzmaEncHandle pp)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   CLzmaEnc *dest = (CLzmaEnc *)pp;
 | 
				
			||||||
 | 
					   const CSaveState *p = &dest->saveState;
 | 
				
			||||||
 | 
					@@ -600,7 +600,7 @@ static void LitEnc_EncodeMatched(CRangeE
 | 
				
			||||||
 | 
					   while (symbol < 0x10000);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
 | 
				
			||||||
 | 
					+static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   UInt32 i;
 | 
				
			||||||
 | 
					   for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))
 | 
				
			||||||
 | 
					@@ -1676,7 +1676,7 @@ static void FillDistancesPrices(CLzmaEnc
 | 
				
			||||||
 | 
					   p->matchPriceCount = 0;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void LzmaEnc_Construct(CLzmaEnc *p)
 | 
				
			||||||
 | 
					+static void LzmaEnc_Construct(CLzmaEnc *p)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   RangeEnc_Construct(&p->rc);
 | 
				
			||||||
 | 
					   MatchFinder_Construct(&p->matchFinderBase);
 | 
				
			||||||
 | 
					@@ -1709,7 +1709,7 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *
 | 
				
			||||||
 | 
					   return p;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
 | 
				
			||||||
 | 
					+static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   alloc->Free(alloc, p->litProbs);
 | 
				
			||||||
 | 
					   alloc->Free(alloc, p->saveState.litProbs);
 | 
				
			||||||
 | 
					@@ -2074,7 +2074,7 @@ SRes LzmaEnc_MemPrepare(CLzmaEncHandle p
 | 
				
			||||||
 | 
					   return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void LzmaEnc_Finish(CLzmaEncHandle pp)
 | 
				
			||||||
 | 
					+static void LzmaEnc_Finish(CLzmaEncHandle pp)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   #ifndef _7ZIP_ST
 | 
				
			||||||
 | 
					   CLzmaEnc *p = (CLzmaEnc *)pp;
 | 
				
			||||||
 | 
					@@ -2108,7 +2108,7 @@ static size_t MyWrite(void *pp, const vo
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
 | 
				
			||||||
 | 
					+static UInt32 __maybe_unused LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   const CLzmaEnc *p = (CLzmaEnc *)pp;
 | 
				
			||||||
 | 
					   return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
 | 
				
			||||||
 | 
					@@ -2120,7 +2120,7 @@ const Byte *LzmaEnc_GetCurBuf(CLzmaEncHa
 | 
				
			||||||
 | 
					   return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
 | 
				
			||||||
 | 
					+static SRes __maybe_unused LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
 | 
				
			||||||
 | 
					     Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   CLzmaEnc *p = (CLzmaEnc *)pp;
 | 
				
			||||||
 | 
					@@ -2248,7 +2248,7 @@ SRes LzmaEnc_MemEncode(CLzmaEncHandle pp
 | 
				
			||||||
 | 
					   return res;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
 | 
				
			||||||
 | 
					+static __maybe_unused SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
 | 
				
			||||||
 | 
					     const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
 | 
				
			||||||
 | 
					     ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					--- a/include/linux/lzma/LzFind.h
 | 
				
			||||||
 | 
					+++ b/include/linux/lzma/LzFind.h
 | 
				
			||||||
 | 
					@@ -55,11 +55,6 @@ typedef struct _CMatchFinder
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-int MatchFinder_NeedMove(CMatchFinder *p);
 | 
				
			||||||
 | 
					-Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);
 | 
				
			||||||
 | 
					-void MatchFinder_MoveBlock(CMatchFinder *p);
 | 
				
			||||||
 | 
					-void MatchFinder_ReadIfRequired(CMatchFinder *p);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 void MatchFinder_Construct(CMatchFinder *p);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* Conditions:
 | 
				
			||||||
 | 
					@@ -70,12 +65,6 @@ int MatchFinder_Create(CMatchFinder *p,
 | 
				
			||||||
 | 
					     UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
 | 
				
			||||||
 | 
					     ISzAlloc *alloc);
 | 
				
			||||||
 | 
					 void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);
 | 
				
			||||||
 | 
					-void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);
 | 
				
			||||||
 | 
					-void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,
 | 
				
			||||||
 | 
					-    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,
 | 
				
			||||||
 | 
					-    UInt32 *distances, UInt32 maxLen);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					 Conditions:
 | 
				
			||||||
 | 
					@@ -102,12 +91,6 @@ typedef struct _IMatchFinder
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void MatchFinder_Init(CMatchFinder *p);
 | 
				
			||||||
 | 
					-UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
 | 
				
			||||||
 | 
					-UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
 | 
				
			||||||
 | 
					-void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
 | 
				
			||||||
 | 
					-void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 #ifdef __cplusplus
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					--- a/lib/lzma/LzFind.c
 | 
				
			||||||
 | 
					+++ b/lib/lzma/LzFind.c
 | 
				
			||||||
 | 
					@@ -42,12 +42,12 @@ static int LzInWindow_Create(CMatchFinde
 | 
				
			||||||
 | 
					   return (p->bufferBase != 0);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
 | 
				
			||||||
 | 
					-Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
 | 
				
			||||||
 | 
					+static Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
 | 
				
			||||||
 | 
					+static Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
 | 
				
			||||||
 | 
					+static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
 | 
				
			||||||
 | 
					+static void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   p->posLimit -= subValue;
 | 
				
			||||||
 | 
					   p->pos -= subValue;
 | 
				
			||||||
 | 
					@@ -268,7 +268,7 @@ static void MatchFinder_SetLimits(CMatch
 | 
				
			||||||
 | 
					   p->posLimit = p->pos + limit;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void MatchFinder_Init(CMatchFinder *p)
 | 
				
			||||||
 | 
					+static void MatchFinder_Init(CMatchFinder *p)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   UInt32 i;
 | 
				
			||||||
 | 
					   for (i = 0; i < p->hashSizeSum; i++)
 | 
				
			||||||
 | 
					@@ -287,7 +287,7 @@ static UInt32 MatchFinder_GetSubValue(CM
 | 
				
			||||||
 | 
					   return (p->pos - p->historySize - 1) & kNormalizeMask;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
 | 
				
			||||||
 | 
					+static void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   UInt32 i;
 | 
				
			||||||
 | 
					   for (i = 0; i < numItems; i++)
 | 
				
			||||||
 | 
					@@ -350,7 +350,7 @@ static UInt32 * Hc_GetMatchesSpec(UInt32
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
 | 
				
			||||||
 | 
					+static UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
 | 
				
			||||||
 | 
					     UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
 | 
				
			||||||
 | 
					     UInt32 *distances, UInt32 maxLen)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					@@ -492,7 +492,7 @@ static UInt32 Bt2_MatchFinder_GetMatches
 | 
				
			||||||
 | 
					   GET_MATCHES_FOOTER(offset, 1)
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
 | 
				
			||||||
 | 
					+static __maybe_unused UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   UInt32 offset;
 | 
				
			||||||
 | 
					   GET_MATCHES_HEADER(3)
 | 
				
			||||||
 | 
					@@ -632,7 +632,7 @@ static UInt32 Hc4_MatchFinder_GetMatches
 | 
				
			||||||
 | 
					   MOVE_POS_RET
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
 | 
				
			||||||
 | 
					+static __maybe_unused UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   UInt32 offset;
 | 
				
			||||||
 | 
					   GET_MATCHES_HEADER(3)
 | 
				
			||||||
 | 
					@@ -657,7 +657,7 @@ static void Bt2_MatchFinder_Skip(CMatchF
 | 
				
			||||||
 | 
					   while (--num != 0);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
 | 
				
			||||||
 | 
					+static __maybe_unused void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   do
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					@@ -718,7 +718,7 @@ static void Hc4_MatchFinder_Skip(CMatchF
 | 
				
			||||||
 | 
					   while (--num != 0);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
 | 
				
			||||||
 | 
					+static __maybe_unused void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					   do
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
							
								
								
									
										53
									
								
								target/linux/generic/patches-3.8/532-jffs2_eofdetect.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								target/linux/generic/patches-3.8/532-jffs2_eofdetect.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					--- a/fs/jffs2/build.c
 | 
				
			||||||
 | 
					+++ b/fs/jffs2/build.c
 | 
				
			||||||
 | 
					@@ -114,6 +114,16 @@ static int jffs2_build_filesystem(struct
 | 
				
			||||||
 | 
					 	dbg_fsbuild("scanned flash completely\n");
 | 
				
			||||||
 | 
					 	jffs2_dbg_dump_block_lists_nolock(c);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	if (c->flags & (1 << 7)) {
 | 
				
			||||||
 | 
					+		printk("%s(): unlocking the mtd device... ", __func__);
 | 
				
			||||||
 | 
					+		mtd_unlock(c->mtd, 0, c->mtd->size);
 | 
				
			||||||
 | 
					+		printk("done.\n");
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		printk("%s(): erasing all blocks after the end marker... ", __func__);
 | 
				
			||||||
 | 
					+		jffs2_erase_pending_blocks(c, -1);
 | 
				
			||||||
 | 
					+		printk("done.\n");
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	dbg_fsbuild("pass 1 starting\n");
 | 
				
			||||||
 | 
					 	c->flags |= JFFS2_SB_FLAG_BUILDING;
 | 
				
			||||||
 | 
					 	/* Now scan the directory tree, increasing nlink according to every dirent found. */
 | 
				
			||||||
 | 
					--- a/fs/jffs2/scan.c
 | 
				
			||||||
 | 
					+++ b/fs/jffs2/scan.c
 | 
				
			||||||
 | 
					@@ -148,8 +148,11 @@ int jffs2_scan_medium(struct jffs2_sb_in
 | 
				
			||||||
 | 
					 		/* reset summary info for next eraseblock scan */
 | 
				
			||||||
 | 
					 		jffs2_sum_reset_collected(s);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-		ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
 | 
				
			||||||
 | 
					-						buf_size, s);
 | 
				
			||||||
 | 
					+		if (c->flags & (1 << 7))
 | 
				
			||||||
 | 
					+			ret = BLK_STATE_ALLFF;
 | 
				
			||||||
 | 
					+		else
 | 
				
			||||||
 | 
					+			ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
 | 
				
			||||||
 | 
					+							buf_size, s);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		if (ret < 0)
 | 
				
			||||||
 | 
					 			goto out;
 | 
				
			||||||
 | 
					@@ -556,6 +559,17 @@ static int jffs2_scan_eraseblock (struct
 | 
				
			||||||
 | 
					 			return err;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	if ((buf[0] == 0xde) &&
 | 
				
			||||||
 | 
					+		(buf[1] == 0xad) &&
 | 
				
			||||||
 | 
					+		(buf[2] == 0xc0) &&
 | 
				
			||||||
 | 
					+		(buf[3] == 0xde)) {
 | 
				
			||||||
 | 
					+		/* end of filesystem. erase everything after this point */
 | 
				
			||||||
 | 
					+		printk("%s(): End of filesystem marker found at 0x%x\n", __func__, jeb->offset);
 | 
				
			||||||
 | 
					+		c->flags |= (1 << 7);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		return BLK_STATE_ALLFF;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	/* We temporarily use 'ofs' as a pointer into the buffer/jeb */
 | 
				
			||||||
 | 
					 	ofs = 0;
 | 
				
			||||||
 | 
					 	max_ofs = EMPTY_SCAN_SIZE(c->sector_size);
 | 
				
			||||||
@@ -0,0 +1,146 @@
 | 
				
			|||||||
 | 
					--- a/crypto/Kconfig
 | 
				
			||||||
 | 
					+++ b/crypto/Kconfig
 | 
				
			||||||
 | 
					@@ -1223,6 +1223,13 @@ config CRYPTO_842
 | 
				
			||||||
 | 
					 	help
 | 
				
			||||||
 | 
					 	  This is the 842 algorithm.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+config CRYPTO_XZ
 | 
				
			||||||
 | 
					+	tristate "XZ compression algorithm"
 | 
				
			||||||
 | 
					+	select CRYPTO_ALGAPI
 | 
				
			||||||
 | 
					+	select XZ_DEC
 | 
				
			||||||
 | 
					+	help
 | 
				
			||||||
 | 
					+	  This is the XZ algorithm. Only decompression is supported for now.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 comment "Random Number Generation"
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config CRYPTO_ANSI_CPRNG
 | 
				
			||||||
 | 
					--- a/crypto/Makefile
 | 
				
			||||||
 | 
					+++ b/crypto/Makefile
 | 
				
			||||||
 | 
					@@ -83,6 +83,7 @@ obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += mich
 | 
				
			||||||
 | 
					 obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o authencesn.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_CRYPTO_LZO) += lzo.o
 | 
				
			||||||
 | 
					+obj-$(CONFIG_CRYPTO_XZ) += xz.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_CRYPTO_842) += 842.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_CRYPTO_RNG2) += rng.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_CRYPTO_RNG2) += krng.o
 | 
				
			||||||
 | 
					--- /dev/null
 | 
				
			||||||
 | 
					+++ b/crypto/xz.c
 | 
				
			||||||
 | 
					@@ -0,0 +1,117 @@
 | 
				
			||||||
 | 
					+/*
 | 
				
			||||||
 | 
					+ * Cryptographic API.
 | 
				
			||||||
 | 
					+ *
 | 
				
			||||||
 | 
					+ * XZ decompression support.
 | 
				
			||||||
 | 
					+ *
 | 
				
			||||||
 | 
					+ * Copyright (c) 2012 Gabor Juhos <juhosg@openwrt.org>
 | 
				
			||||||
 | 
					+ *
 | 
				
			||||||
 | 
					+ * This program is free software; you can redistribute it and/or modify it
 | 
				
			||||||
 | 
					+ * under the terms of the GNU General Public License version 2 as published by
 | 
				
			||||||
 | 
					+ * the Free Software Foundation.
 | 
				
			||||||
 | 
					+ *
 | 
				
			||||||
 | 
					+ */
 | 
				
			||||||
 | 
					+#include <linux/init.h>
 | 
				
			||||||
 | 
					+#include <linux/module.h>
 | 
				
			||||||
 | 
					+#include <linux/crypto.h>
 | 
				
			||||||
 | 
					+#include <linux/xz.h>
 | 
				
			||||||
 | 
					+#include <linux/interrupt.h>
 | 
				
			||||||
 | 
					+#include <linux/mm.h>
 | 
				
			||||||
 | 
					+#include <linux/net.h>
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+struct xz_comp_ctx {
 | 
				
			||||||
 | 
					+	struct xz_dec	*decomp_state;
 | 
				
			||||||
 | 
					+	struct xz_buf	decomp_buf;
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int crypto_xz_decomp_init(struct xz_comp_ctx *ctx)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	ctx->decomp_state = xz_dec_init(XZ_SINGLE, 0);
 | 
				
			||||||
 | 
					+	if (!ctx->decomp_state)
 | 
				
			||||||
 | 
					+		return -ENOMEM;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void crypto_xz_decomp_exit(struct xz_comp_ctx *ctx)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	xz_dec_end(ctx->decomp_state);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int crypto_xz_init(struct crypto_tfm *tfm)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct xz_comp_ctx *ctx = crypto_tfm_ctx(tfm);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return crypto_xz_decomp_init(ctx);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void crypto_xz_exit(struct crypto_tfm *tfm)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct xz_comp_ctx *ctx = crypto_tfm_ctx(tfm);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	crypto_xz_decomp_exit(ctx);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int crypto_xz_compress(struct crypto_tfm *tfm, const u8 *src,
 | 
				
			||||||
 | 
					+			      unsigned int slen, u8 *dst, unsigned int *dlen)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return -EOPNOTSUPP;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int crypto_xz_decompress(struct crypto_tfm *tfm, const u8 *src,
 | 
				
			||||||
 | 
					+				unsigned int slen, u8 *dst, unsigned int *dlen)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct xz_comp_ctx *dctx = crypto_tfm_ctx(tfm);
 | 
				
			||||||
 | 
					+	struct xz_buf *xz_buf = &dctx->decomp_buf;
 | 
				
			||||||
 | 
					+	int ret;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	memset(xz_buf, '\0', sizeof(struct xz_buf));
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	xz_buf->in = (u8 *) src;
 | 
				
			||||||
 | 
					+	xz_buf->in_pos = 0;
 | 
				
			||||||
 | 
					+	xz_buf->in_size = slen;
 | 
				
			||||||
 | 
					+	xz_buf->out = (u8 *) dst;
 | 
				
			||||||
 | 
					+	xz_buf->out_pos = 0;
 | 
				
			||||||
 | 
					+	xz_buf->out_size = *dlen;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	ret = xz_dec_run(dctx->decomp_state, xz_buf);
 | 
				
			||||||
 | 
					+	if (ret != XZ_STREAM_END) {
 | 
				
			||||||
 | 
					+		ret = -EINVAL;
 | 
				
			||||||
 | 
					+		goto out;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	*dlen = xz_buf->out_pos;
 | 
				
			||||||
 | 
					+	ret = 0;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+out:
 | 
				
			||||||
 | 
					+	return ret;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static struct crypto_alg crypto_xz_alg = {
 | 
				
			||||||
 | 
					+	.cra_name		= "xz",
 | 
				
			||||||
 | 
					+	.cra_flags		= CRYPTO_ALG_TYPE_COMPRESS,
 | 
				
			||||||
 | 
					+	.cra_ctxsize		= sizeof(struct xz_comp_ctx),
 | 
				
			||||||
 | 
					+	.cra_module		= THIS_MODULE,
 | 
				
			||||||
 | 
					+	.cra_list		= LIST_HEAD_INIT(crypto_xz_alg.cra_list),
 | 
				
			||||||
 | 
					+	.cra_init		= crypto_xz_init,
 | 
				
			||||||
 | 
					+	.cra_exit		= crypto_xz_exit,
 | 
				
			||||||
 | 
					+	.cra_u			= { .compress = {
 | 
				
			||||||
 | 
					+	.coa_compress 		= crypto_xz_compress,
 | 
				
			||||||
 | 
					+	.coa_decompress  	= crypto_xz_decompress } }
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int __init crypto_xz_mod_init(void)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return crypto_register_alg(&crypto_xz_alg);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void __exit crypto_xz_mod_exit(void)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	crypto_unregister_alg(&crypto_xz_alg);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+module_init(crypto_xz_mod_init);
 | 
				
			||||||
 | 
					+module_exit(crypto_xz_mod_exit);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+MODULE_LICENSE("GPL v2");
 | 
				
			||||||
 | 
					+MODULE_DESCRIPTION("Crypto XZ decompression support");
 | 
				
			||||||
 | 
					+MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
 | 
				
			||||||
@@ -0,0 +1,92 @@
 | 
				
			|||||||
 | 
					--- a/fs/ubifs/Kconfig
 | 
				
			||||||
 | 
					+++ b/fs/ubifs/Kconfig
 | 
				
			||||||
 | 
					@@ -5,8 +5,10 @@ config UBIFS_FS
 | 
				
			||||||
 | 
					 	select CRYPTO if UBIFS_FS_ADVANCED_COMPR
 | 
				
			||||||
 | 
					 	select CRYPTO if UBIFS_FS_LZO
 | 
				
			||||||
 | 
					 	select CRYPTO if UBIFS_FS_ZLIB
 | 
				
			||||||
 | 
					+	select CRYPTO if UBIFS_FS_XZ
 | 
				
			||||||
 | 
					 	select CRYPTO_LZO if UBIFS_FS_LZO
 | 
				
			||||||
 | 
					 	select CRYPTO_DEFLATE if UBIFS_FS_ZLIB
 | 
				
			||||||
 | 
					+	select CRYPTO_XZ if UBIFS_FS_XZ
 | 
				
			||||||
 | 
					 	depends on MTD_UBI
 | 
				
			||||||
 | 
					 	help
 | 
				
			||||||
 | 
					 	  UBIFS is a file system for flash devices which works on top of UBI.
 | 
				
			||||||
 | 
					@@ -35,3 +37,12 @@ config UBIFS_FS_ZLIB
 | 
				
			||||||
 | 
					 	default y
 | 
				
			||||||
 | 
					 	help
 | 
				
			||||||
 | 
					 	  Zlib compresses better than LZO but it is slower. Say 'Y' if unsure.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+config UBIFS_FS_XZ
 | 
				
			||||||
 | 
					+	bool "XZ decompression support" if UBIFS_FS_ADVANCED_COMPR
 | 
				
			||||||
 | 
					+	depends on UBIFS_FS
 | 
				
			||||||
 | 
					+	default y
 | 
				
			||||||
 | 
					+	help
 | 
				
			||||||
 | 
					+	  XZ compresses better the ZLIB but it is slower..
 | 
				
			||||||
 | 
					+	  Say 'Y' if unsure.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					--- a/fs/ubifs/compress.c
 | 
				
			||||||
 | 
					+++ b/fs/ubifs/compress.c
 | 
				
			||||||
 | 
					@@ -71,6 +71,24 @@ static struct ubifs_compressor zlib_comp
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#ifdef CONFIG_UBIFS_FS_XZ
 | 
				
			||||||
 | 
					+static DEFINE_MUTEX(xz_enc_mutex);
 | 
				
			||||||
 | 
					+static DEFINE_MUTEX(xz_dec_mutex);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static struct ubifs_compressor xz_compr = {
 | 
				
			||||||
 | 
					+	.compr_type = UBIFS_COMPR_XZ,
 | 
				
			||||||
 | 
					+	.comp_mutex = &xz_enc_mutex,
 | 
				
			||||||
 | 
					+	.decomp_mutex = &xz_dec_mutex,
 | 
				
			||||||
 | 
					+	.name = "xz",
 | 
				
			||||||
 | 
					+	.capi_name = "xz",
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+static struct ubifs_compressor xz_compr = {
 | 
				
			||||||
 | 
					+	.compr_type = UBIFS_COMPR_XZ,
 | 
				
			||||||
 | 
					+	.name = "xz",
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 /* All UBIFS compressors */
 | 
				
			||||||
 | 
					 struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT];
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -232,9 +250,15 @@ int __init ubifs_compressors_init(void)
 | 
				
			||||||
 | 
					 	if (err)
 | 
				
			||||||
 | 
					 		goto out_lzo;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	err = compr_init(&xz_compr);
 | 
				
			||||||
 | 
					+	if (err)
 | 
				
			||||||
 | 
					+		goto out_zlib;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	ubifs_compressors[UBIFS_COMPR_NONE] = &none_compr;
 | 
				
			||||||
 | 
					 	return 0;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+out_zlib:
 | 
				
			||||||
 | 
					+	compr_exit(&zlib_compr);
 | 
				
			||||||
 | 
					 out_lzo:
 | 
				
			||||||
 | 
					 	compr_exit(&lzo_compr);
 | 
				
			||||||
 | 
					 	return err;
 | 
				
			||||||
 | 
					@@ -247,4 +271,5 @@ void ubifs_compressors_exit(void)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	compr_exit(&lzo_compr);
 | 
				
			||||||
 | 
					 	compr_exit(&zlib_compr);
 | 
				
			||||||
 | 
					+	compr_exit(&xz_compr);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					--- a/fs/ubifs/ubifs-media.h
 | 
				
			||||||
 | 
					+++ b/fs/ubifs/ubifs-media.h
 | 
				
			||||||
 | 
					@@ -332,12 +332,14 @@ enum {
 | 
				
			||||||
 | 
					  * UBIFS_COMPR_NONE: no compression
 | 
				
			||||||
 | 
					  * UBIFS_COMPR_LZO: LZO compression
 | 
				
			||||||
 | 
					  * UBIFS_COMPR_ZLIB: ZLIB compression
 | 
				
			||||||
 | 
					+ * UBIFS_COMPR_XZ: XZ compression
 | 
				
			||||||
 | 
					  * UBIFS_COMPR_TYPES_CNT: count of supported compression types
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					 enum {
 | 
				
			||||||
 | 
					 	UBIFS_COMPR_NONE,
 | 
				
			||||||
 | 
					 	UBIFS_COMPR_LZO,
 | 
				
			||||||
 | 
					 	UBIFS_COMPR_ZLIB,
 | 
				
			||||||
 | 
					+	UBIFS_COMPR_XZ,
 | 
				
			||||||
 | 
					 	UBIFS_COMPR_TYPES_CNT,
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					--- a/fs/ubifs/file.c
 | 
				
			||||||
 | 
					+++ b/fs/ubifs/file.c
 | 
				
			||||||
 | 
					@@ -1574,6 +1574,12 @@ const struct inode_operations ubifs_syml
 | 
				
			||||||
 | 
					 	.follow_link = ubifs_follow_link,
 | 
				
			||||||
 | 
					 	.setattr     = ubifs_setattr,
 | 
				
			||||||
 | 
					 	.getattr     = ubifs_getattr,
 | 
				
			||||||
 | 
					+#ifdef CONFIG_UBIFS_FS_XATTR
 | 
				
			||||||
 | 
					+	.setxattr    = ubifs_setxattr,
 | 
				
			||||||
 | 
					+	.getxattr    = ubifs_getxattr,
 | 
				
			||||||
 | 
					+	.listxattr   = ubifs_listxattr,
 | 
				
			||||||
 | 
					+	.removexattr = ubifs_removexattr,
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 const struct file_operations ubifs_file_operations = {
 | 
				
			||||||
 | 
					--- a/fs/ubifs/journal.c
 | 
				
			||||||
 | 
					+++ b/fs/ubifs/journal.c
 | 
				
			||||||
 | 
					@@ -553,7 +553,8 @@ int ubifs_jnl_update(struct ubifs_info *
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	dbg_jnl("ino %lu, dent '%.*s', data len %d in dir ino %lu",
 | 
				
			||||||
 | 
					 		inode->i_ino, nm->len, nm->name, ui->data_len, dir->i_ino);
 | 
				
			||||||
 | 
					-	ubifs_assert(dir_ui->data_len == 0);
 | 
				
			||||||
 | 
					+	if (!xent)
 | 
				
			||||||
 | 
					+		ubifs_assert(dir_ui->data_len == 0);
 | 
				
			||||||
 | 
					 	ubifs_assert(mutex_is_locked(&dir_ui->ui_mutex));
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	dlen = UBIFS_DENT_NODE_SZ + nm->len + 1;
 | 
				
			||||||
 | 
					@@ -573,6 +574,13 @@ int ubifs_jnl_update(struct ubifs_info *
 | 
				
			||||||
 | 
					 	aligned_dlen = ALIGN(dlen, 8);
 | 
				
			||||||
 | 
					 	aligned_ilen = ALIGN(ilen, 8);
 | 
				
			||||||
 | 
					 	len = aligned_dlen + aligned_ilen + UBIFS_INO_NODE_SZ;
 | 
				
			||||||
 | 
					+	if (xent) {
 | 
				
			||||||
 | 
					+		/*
 | 
				
			||||||
 | 
					+		 * Make sure to account for dir_ui->data_len in
 | 
				
			||||||
 | 
					+		 * length calculation in case there is extended attribute.
 | 
				
			||||||
 | 
					+		 */
 | 
				
			||||||
 | 
					+		len += dir_ui->data_len;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					 	dent = kmalloc(len, GFP_NOFS);
 | 
				
			||||||
 | 
					 	if (!dent)
 | 
				
			||||||
 | 
					 		return -ENOMEM;
 | 
				
			||||||
 | 
					@@ -649,7 +657,8 @@ int ubifs_jnl_update(struct ubifs_info *
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	ino_key_init(c, &ino_key, dir->i_ino);
 | 
				
			||||||
 | 
					 	ino_offs += aligned_ilen;
 | 
				
			||||||
 | 
					-	err = ubifs_tnc_add(c, &ino_key, lnum, ino_offs, UBIFS_INO_NODE_SZ);
 | 
				
			||||||
 | 
					+	err = ubifs_tnc_add(c, &ino_key, lnum, ino_offs,
 | 
				
			||||||
 | 
					+			    UBIFS_INO_NODE_SZ + dir_ui->data_len);
 | 
				
			||||||
 | 
					 	if (err)
 | 
				
			||||||
 | 
					 		goto out_ro;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					--- a/fs/ubifs/xattr.c
 | 
				
			||||||
 | 
					+++ b/fs/ubifs/xattr.c
 | 
				
			||||||
 | 
					@@ -209,12 +209,12 @@ static int change_xattr(struct ubifs_inf
 | 
				
			||||||
 | 
					 		goto out_free;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 	inode->i_size = ui->ui_size = size;
 | 
				
			||||||
 | 
					-	ui->data_len = size;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	mutex_lock(&host_ui->ui_mutex);
 | 
				
			||||||
 | 
					 	host->i_ctime = ubifs_current_time(host);
 | 
				
			||||||
 | 
					 	host_ui->xattr_size -= CALC_XATTR_BYTES(ui->data_len);
 | 
				
			||||||
 | 
					 	host_ui->xattr_size += CALC_XATTR_BYTES(size);
 | 
				
			||||||
 | 
					+	ui->data_len = size;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/*
 | 
				
			||||||
 | 
					 	 * It is important to write the host inode after the xattr inode
 | 
				
			||||||
							
								
								
									
										2141
									
								
								target/linux/generic/patches-3.8/600-netfilter_layer7_2.22.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2141
									
								
								target/linux/generic/patches-3.8/600-netfilter_layer7_2.22.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -0,0 +1,108 @@
 | 
				
			|||||||
 | 
					--- a/include/linux/netfilter/xt_layer7.h
 | 
				
			||||||
 | 
					+++ b/include/linux/netfilter/xt_layer7.h
 | 
				
			||||||
 | 
					@@ -8,6 +8,7 @@ struct xt_layer7_info {
 | 
				
			||||||
 | 
					     char protocol[MAX_PROTOCOL_LEN];
 | 
				
			||||||
 | 
					     char pattern[MAX_PATTERN_LEN];
 | 
				
			||||||
 | 
					     u_int8_t invert;
 | 
				
			||||||
 | 
					+    u_int8_t pkt;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #endif /* _XT_LAYER7_H */
 | 
				
			||||||
 | 
					--- a/net/netfilter/xt_layer7.c
 | 
				
			||||||
 | 
					+++ b/net/netfilter/xt_layer7.c
 | 
				
			||||||
 | 
					@@ -314,33 +314,35 @@ static int match_no_append(struct nf_con
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* add the new app data to the conntrack.  Return number of bytes added. */
 | 
				
			||||||
 | 
					-static int add_data(struct nf_conn * master_conntrack,
 | 
				
			||||||
 | 
					-                    char * app_data, int appdatalen)
 | 
				
			||||||
 | 
					+static int add_datastr(char *target, int offset, char *app_data, int len)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	int length = 0, i;
 | 
				
			||||||
 | 
					-	int oldlength = master_conntrack->layer7.app_data_len;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	/* This is a fix for a race condition by Deti Fliegl. However, I'm not 
 | 
				
			||||||
 | 
					-	   clear on whether the race condition exists or whether this really 
 | 
				
			||||||
 | 
					-	   fixes it.  I might just be being dense... Anyway, if it's not really 
 | 
				
			||||||
 | 
					-	   a fix, all it does is waste a very small amount of time. */
 | 
				
			||||||
 | 
					-	if(!master_conntrack->layer7.app_data) return 0;
 | 
				
			||||||
 | 
					+	if (!target) return 0;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* Strip nulls. Make everything lower case (our regex lib doesn't
 | 
				
			||||||
 | 
					 	do case insensitivity).  Add it to the end of the current data. */
 | 
				
			||||||
 | 
					-	for(i = 0; i < maxdatalen-oldlength-1 &&
 | 
				
			||||||
 | 
					-		   i < appdatalen; i++) {
 | 
				
			||||||
 | 
					+ 	for(i = 0; i < maxdatalen-offset-1 && i < len; i++) {
 | 
				
			||||||
 | 
					 		if(app_data[i] != '\0') {
 | 
				
			||||||
 | 
					 			/* the kernel version of tolower mungs 'upper ascii' */
 | 
				
			||||||
 | 
					-			master_conntrack->layer7.app_data[length+oldlength] =
 | 
				
			||||||
 | 
					+			target[length+offset] =
 | 
				
			||||||
 | 
					 				isascii(app_data[i])? 
 | 
				
			||||||
 | 
					 					tolower(app_data[i]) : app_data[i];
 | 
				
			||||||
 | 
					 			length++;
 | 
				
			||||||
 | 
					 		}
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					+	target[length+offset] = '\0';
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return length;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+/* add the new app data to the conntrack.  Return number of bytes added. */
 | 
				
			||||||
 | 
					+static int add_data(struct nf_conn * master_conntrack,
 | 
				
			||||||
 | 
					+                    char * app_data, int appdatalen)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	int length;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	master_conntrack->layer7.app_data[length+oldlength] = '\0';
 | 
				
			||||||
 | 
					-	master_conntrack->layer7.app_data_len = length + oldlength;
 | 
				
			||||||
 | 
					+	length = add_datastr(master_conntrack->layer7.app_data, master_conntrack->layer7.app_data_len, app_data, appdatalen);
 | 
				
			||||||
 | 
					+	master_conntrack->layer7.app_data_len += length;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	return length;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					@@ -438,7 +440,7 @@ match(const struct sk_buff *skbin,
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	enum ip_conntrack_info master_ctinfo, ctinfo;
 | 
				
			||||||
 | 
					 	struct nf_conn *master_conntrack, *conntrack;
 | 
				
			||||||
 | 
					-	unsigned char * app_data;
 | 
				
			||||||
 | 
					+	unsigned char *app_data, *tmp_data;
 | 
				
			||||||
 | 
					 	unsigned int pattern_result, appdatalen;
 | 
				
			||||||
 | 
					 	regexp * comppattern;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -466,8 +468,8 @@ match(const struct sk_buff *skbin,
 | 
				
			||||||
 | 
					 		master_conntrack = master_ct(master_conntrack);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* if we've classified it or seen too many packets */
 | 
				
			||||||
 | 
					-	if(total_acct_packets(master_conntrack) > num_packets ||
 | 
				
			||||||
 | 
					-	   master_conntrack->layer7.app_proto) {
 | 
				
			||||||
 | 
					+	if(!info->pkt && (total_acct_packets(master_conntrack) > num_packets ||
 | 
				
			||||||
 | 
					+	   master_conntrack->layer7.app_proto)) {
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		pattern_result = match_no_append(conntrack, master_conntrack, 
 | 
				
			||||||
 | 
					 						 ctinfo, master_ctinfo, info);
 | 
				
			||||||
 | 
					@@ -500,6 +502,25 @@ match(const struct sk_buff *skbin,
 | 
				
			||||||
 | 
					 	/* the return value gets checked later, when we're ready to use it */
 | 
				
			||||||
 | 
					 	comppattern = compile_and_cache(info->pattern, info->protocol);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	if (info->pkt) {
 | 
				
			||||||
 | 
					+		tmp_data = kmalloc(maxdatalen, GFP_ATOMIC);
 | 
				
			||||||
 | 
					+		if(!tmp_data){
 | 
				
			||||||
 | 
					+			if (net_ratelimit())
 | 
				
			||||||
 | 
					+				printk(KERN_ERR "layer7: out of memory in match, bailing.\n");
 | 
				
			||||||
 | 
					+			return info->invert;
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		tmp_data[0] = '\0';
 | 
				
			||||||
 | 
					+		add_datastr(tmp_data, 0, app_data, appdatalen);
 | 
				
			||||||
 | 
					+		pattern_result = ((comppattern && regexec(comppattern, tmp_data)) ? 1 : 0);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		kfree(tmp_data);
 | 
				
			||||||
 | 
					+		tmp_data = NULL;
 | 
				
			||||||
 | 
					+		spin_unlock_bh(&l7_lock);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		return (pattern_result ^ info->invert);
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	/* On the first packet of a connection, allocate space for app data */
 | 
				
			||||||
 | 
					 	if(total_acct_packets(master_conntrack) == 1 && !skb->cb[0] && 
 | 
				
			||||||
 | 
					 	   !master_conntrack->layer7.app_data){
 | 
				
			||||||
@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					--- a/net/netfilter/xt_layer7.c
 | 
				
			||||||
 | 
					+++ b/net/netfilter/xt_layer7.c
 | 
				
			||||||
 | 
					@@ -415,7 +415,9 @@ static int layer7_write_proc(struct file
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static bool
 | 
				
			||||||
 | 
					-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
 | 
				
			||||||
 | 
					+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
 | 
				
			||||||
 | 
					+match(const struct sk_buff *skbin, struct xt_action_param *par)
 | 
				
			||||||
 | 
					+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
 | 
				
			||||||
 | 
					 match(const struct sk_buff *skbin, const struct xt_match_param *par)
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					 match(const struct sk_buff *skbin,
 | 
				
			||||||
 | 
					@@ -597,14 +599,19 @@ match(const struct sk_buff *skbin,
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 // load nf_conntrack_ipv4
 | 
				
			||||||
 | 
					+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
 | 
				
			||||||
 | 
					+static int
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					+static bool
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
 | 
				
			||||||
 | 
					-static bool check(const struct xt_mtchk_param *par)
 | 
				
			||||||
 | 
					+check(const struct xt_mtchk_param *par)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					         if (nf_ct_l3proto_try_module_get(par->match->family) < 0) {
 | 
				
			||||||
 | 
					                 printk(KERN_WARNING "can't load conntrack support for "
 | 
				
			||||||
 | 
					                                     "proto=%d\n", par->match->family);
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					-static bool check(const char *tablename, const void *inf,
 | 
				
			||||||
 | 
					+check(const char *tablename, const void *inf,
 | 
				
			||||||
 | 
					 		 const struct xt_match *match, void *matchinfo,
 | 
				
			||||||
 | 
					 		 unsigned int hook_mask)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					@@ -612,9 +619,15 @@ static bool check(const char *tablename,
 | 
				
			||||||
 | 
					                 printk(KERN_WARNING "can't load conntrack support for "
 | 
				
			||||||
 | 
					                                     "proto=%d\n", match->family);
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
 | 
				
			||||||
 | 
					+		return -EINVAL;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+#else
 | 
				
			||||||
 | 
					                 return 0;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					 	return 1;
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
@@ -0,0 +1,61 @@
 | 
				
			|||||||
 | 
					--- a/net/netfilter/Kconfig
 | 
				
			||||||
 | 
					+++ b/net/netfilter/Kconfig
 | 
				
			||||||
 | 
					@@ -980,6 +980,27 @@ config NETFILTER_XT_MATCH_IPVS
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	  If unsure, say N.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+config NETFILTER_XT_MATCH_LAYER7
 | 
				
			||||||
 | 
					+	tristate '"layer7" match support'
 | 
				
			||||||
 | 
					+	depends on EXPERIMENTAL
 | 
				
			||||||
 | 
					+	depends on NETFILTER_XTABLES
 | 
				
			||||||
 | 
					+	depends on NETFILTER_ADVANCED
 | 
				
			||||||
 | 
					+	depends on NF_CONNTRACK
 | 
				
			||||||
 | 
					+	help
 | 
				
			||||||
 | 
					+	  Say Y if you want to be able to classify connections (and their
 | 
				
			||||||
 | 
					+	  packets) based on regular expression matching of their application
 | 
				
			||||||
 | 
					+	  layer data.   This is one way to classify applications such as
 | 
				
			||||||
 | 
					+	  peer-to-peer filesharing systems that do not always use the same
 | 
				
			||||||
 | 
					+	  port.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	  To compile it as a module, choose M here.  If unsure, say N.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+config NETFILTER_XT_MATCH_LAYER7_DEBUG
 | 
				
			||||||
 | 
					+	bool 'Layer 7 debugging output'
 | 
				
			||||||
 | 
					+	depends on NETFILTER_XT_MATCH_LAYER7
 | 
				
			||||||
 | 
					+	help
 | 
				
			||||||
 | 
					+	  Say Y to get lots of debugging output.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 config NETFILTER_XT_MATCH_LENGTH
 | 
				
			||||||
 | 
					 	tristate '"length" match support'
 | 
				
			||||||
 | 
					 	depends on NETFILTER_ADVANCED
 | 
				
			||||||
 | 
					@@ -1176,26 +1197,11 @@ config NETFILTER_XT_MATCH_STATE
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	  To compile it as a module, choose M here.  If unsure, say N.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-config NETFILTER_XT_MATCH_LAYER7
 | 
				
			||||||
 | 
					-	tristate '"layer7" match support'
 | 
				
			||||||
 | 
					-	depends on NETFILTER_XTABLES
 | 
				
			||||||
 | 
					-	depends on EXPERIMENTAL && (IP_NF_CONNTRACK || NF_CONNTRACK)
 | 
				
			||||||
 | 
					-       depends on NETFILTER_ADVANCED
 | 
				
			||||||
 | 
					-	help
 | 
				
			||||||
 | 
					-	  Say Y if you want to be able to classify connections (and their
 | 
				
			||||||
 | 
					-	  packets) based on regular expression matching of their application
 | 
				
			||||||
 | 
					-	  layer data.   This is one way to classify applications such as
 | 
				
			||||||
 | 
					-	  peer-to-peer filesharing systems that do not always use the same
 | 
				
			||||||
 | 
					-	  port.
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	  To compile it as a module, choose M here.  If unsure, say N.
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 config NETFILTER_XT_MATCH_LAYER7_DEBUG
 | 
				
			||||||
 | 
					-        bool 'Layer 7 debugging output'
 | 
				
			||||||
 | 
					-        depends on NETFILTER_XT_MATCH_LAYER7
 | 
				
			||||||
 | 
					-        help
 | 
				
			||||||
 | 
					-          Say Y to get lots of debugging output.
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+	bool 'Layer 7 debugging output'
 | 
				
			||||||
 | 
					+	depends on NETFILTER_XT_MATCH_LAYER7
 | 
				
			||||||
 | 
					+	help
 | 
				
			||||||
 | 
					+	  Say Y to get lots of debugging output.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 config NETFILTER_XT_MATCH_STATISTIC
 | 
				
			||||||
 | 
					 	tristate '"statistic" match support'
 | 
				
			||||||
@@ -0,0 +1,118 @@
 | 
				
			|||||||
 | 
					--- a/include/linux/netfilter/nf_conntrack_sip.h
 | 
				
			||||||
 | 
					+++ b/include/linux/netfilter/nf_conntrack_sip.h
 | 
				
			||||||
 | 
					@@ -4,12 +4,15 @@
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #include <net/netfilter/nf_conntrack_expect.h>
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#include <linux/types.h>
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 #define SIP_PORT	5060
 | 
				
			||||||
 | 
					 #define SIP_TIMEOUT	3600
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 struct nf_ct_sip_master {
 | 
				
			||||||
 | 
					 	unsigned int	register_cseq;
 | 
				
			||||||
 | 
					 	unsigned int	invite_cseq;
 | 
				
			||||||
 | 
					+	__be16		forced_dport;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 enum sip_expectation_classes {
 | 
				
			||||||
 | 
					--- a/net/netfilter/nf_nat_sip.c
 | 
				
			||||||
 | 
					+++ b/net/netfilter/nf_nat_sip.c
 | 
				
			||||||
 | 
					@@ -95,6 +95,7 @@ static int map_addr(struct sk_buff *skb,
 | 
				
			||||||
 | 
					 	enum ip_conntrack_info ctinfo;
 | 
				
			||||||
 | 
					 	struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
 | 
				
			||||||
 | 
					 	enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
 | 
				
			||||||
 | 
					+	struct nf_ct_sip_master *ct_sip_info = nfct_help_data(ct);
 | 
				
			||||||
 | 
					 	char buffer[INET6_ADDRSTRLEN + sizeof("[]:nnnnn")];
 | 
				
			||||||
 | 
					 	unsigned int buflen;
 | 
				
			||||||
 | 
					 	union nf_inet_addr newaddr;
 | 
				
			||||||
 | 
					@@ -107,7 +108,8 @@ static int map_addr(struct sk_buff *skb,
 | 
				
			||||||
 | 
					 	} else if (nf_inet_addr_cmp(&ct->tuplehash[dir].tuple.dst.u3, addr) &&
 | 
				
			||||||
 | 
					 		   ct->tuplehash[dir].tuple.dst.u.udp.port == port) {
 | 
				
			||||||
 | 
					 		newaddr = ct->tuplehash[!dir].tuple.src.u3;
 | 
				
			||||||
 | 
					-		newport = ct->tuplehash[!dir].tuple.src.u.udp.port;
 | 
				
			||||||
 | 
					+		newport = ct_sip_info->forced_dport ? ct_sip_info->forced_dport :
 | 
				
			||||||
 | 
					+			  ct->tuplehash[!dir].tuple.src.u.udp.port;
 | 
				
			||||||
 | 
					 	} else
 | 
				
			||||||
 | 
					 		return 1;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -144,6 +146,7 @@ static unsigned int nf_nat_sip(struct sk
 | 
				
			||||||
 | 
					 	enum ip_conntrack_info ctinfo;
 | 
				
			||||||
 | 
					 	struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
 | 
				
			||||||
 | 
					 	enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
 | 
				
			||||||
 | 
					+	struct nf_ct_sip_master *ct_sip_info = nfct_help_data(ct);
 | 
				
			||||||
 | 
					 	unsigned int coff, matchoff, matchlen;
 | 
				
			||||||
 | 
					 	enum sip_header_types hdr;
 | 
				
			||||||
 | 
					 	union nf_inet_addr addr;
 | 
				
			||||||
 | 
					@@ -258,6 +261,20 @@ next:
 | 
				
			||||||
 | 
					 	    !map_sip_addr(skb, protoff, dataoff, dptr, datalen, SIP_HDR_TO))
 | 
				
			||||||
 | 
					 		return NF_DROP;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	/* Mangle destination port for Cisco phones, then fix up checksums */
 | 
				
			||||||
 | 
					+	if (dir == IP_CT_DIR_REPLY && ct_sip_info->forced_dport) {
 | 
				
			||||||
 | 
					+		struct udphdr *uh;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		if (!skb_make_writable(skb, skb->len))
 | 
				
			||||||
 | 
					+			return NF_DROP;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		uh = (void *)skb->data + protoff;
 | 
				
			||||||
 | 
					+		uh->dest = ct_sip_info->forced_dport;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		if (!nf_nat_mangle_udp_packet(skb, ct, ctinfo, protoff, 0, 0, NULL, 0))
 | 
				
			||||||
 | 
					+			return NF_DROP;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	return NF_ACCEPT;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -311,8 +328,10 @@ static unsigned int nf_nat_sip_expect(st
 | 
				
			||||||
 | 
					 	enum ip_conntrack_info ctinfo;
 | 
				
			||||||
 | 
					 	struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
 | 
				
			||||||
 | 
					 	enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
 | 
				
			||||||
 | 
					+	struct nf_ct_sip_master *ct_sip_info = nfct_help_data(ct);
 | 
				
			||||||
 | 
					 	union nf_inet_addr newaddr;
 | 
				
			||||||
 | 
					 	u_int16_t port;
 | 
				
			||||||
 | 
					+	__be16 srcport;
 | 
				
			||||||
 | 
					 	char buffer[INET6_ADDRSTRLEN + sizeof("[]:nnnnn")];
 | 
				
			||||||
 | 
					 	unsigned int buflen;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -326,8 +345,9 @@ static unsigned int nf_nat_sip_expect(st
 | 
				
			||||||
 | 
					 	/* If the signalling port matches the connection's source port in the
 | 
				
			||||||
 | 
					 	 * original direction, try to use the destination port in the opposite
 | 
				
			||||||
 | 
					 	 * direction. */
 | 
				
			||||||
 | 
					-	if (exp->tuple.dst.u.udp.port ==
 | 
				
			||||||
 | 
					-	    ct->tuplehash[dir].tuple.src.u.udp.port)
 | 
				
			||||||
 | 
					+	srcport = ct_sip_info->forced_dport ? ct_sip_info->forced_dport :
 | 
				
			||||||
 | 
					+		  ct->tuplehash[dir].tuple.src.u.udp.port;
 | 
				
			||||||
 | 
					+	if (exp->tuple.dst.u.udp.port == srcport)
 | 
				
			||||||
 | 
					 		port = ntohs(ct->tuplehash[!dir].tuple.dst.u.udp.port);
 | 
				
			||||||
 | 
					 	else
 | 
				
			||||||
 | 
					 		port = ntohs(exp->tuple.dst.u.udp.port);
 | 
				
			||||||
 | 
					--- a/net/netfilter/nf_conntrack_sip.c
 | 
				
			||||||
 | 
					+++ b/net/netfilter/nf_conntrack_sip.c
 | 
				
			||||||
 | 
					@@ -1440,8 +1440,25 @@ static int process_sip_request(struct sk
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	enum ip_conntrack_info ctinfo;
 | 
				
			||||||
 | 
					 	struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
 | 
				
			||||||
 | 
					+	struct nf_ct_sip_master *ct_sip_info = nfct_help_data(ct);
 | 
				
			||||||
 | 
					+	enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
 | 
				
			||||||
 | 
					 	unsigned int matchoff, matchlen;
 | 
				
			||||||
 | 
					 	unsigned int cseq, i;
 | 
				
			||||||
 | 
					+	union nf_inet_addr addr;
 | 
				
			||||||
 | 
					+	__be16 port;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* Many Cisco IP phones use a high source port for SIP requests, but
 | 
				
			||||||
 | 
					+	 * listen for the response on port 5060.  If we are the local
 | 
				
			||||||
 | 
					+	 * router for one of these phones, save the port number from the
 | 
				
			||||||
 | 
					+	 * Via: header so that nf_nat_sip can redirect the responses to
 | 
				
			||||||
 | 
					+	 * the correct port.
 | 
				
			||||||
 | 
					+	 */
 | 
				
			||||||
 | 
					+	if (ct_sip_parse_header_uri(ct, *dptr, NULL, *datalen,
 | 
				
			||||||
 | 
					+				    SIP_HDR_VIA_UDP, NULL, &matchoff,
 | 
				
			||||||
 | 
					+				    &matchlen, &addr, &port) > 0 &&
 | 
				
			||||||
 | 
					+	    port != ct->tuplehash[dir].tuple.src.u.udp.port &&
 | 
				
			||||||
 | 
					+	    nf_inet_addr_cmp(&addr, &ct->tuplehash[dir].tuple.src.u3))
 | 
				
			||||||
 | 
					+		ct_sip_info->forced_dport = port;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	for (i = 0; i < ARRAY_SIZE(sip_handlers); i++) {
 | 
				
			||||||
 | 
					 		const struct sip_handler *handler;
 | 
				
			||||||
@@ -0,0 +1,93 @@
 | 
				
			|||||||
 | 
					--- a/include/uapi/linux/netfilter_ipv4/ip_tables.h
 | 
				
			||||||
 | 
					+++ b/include/uapi/linux/netfilter_ipv4/ip_tables.h
 | 
				
			||||||
 | 
					@@ -87,6 +87,7 @@ struct ipt_ip {
 | 
				
			||||||
 | 
					 #define IPT_F_FRAG		0x01	/* Set if rule is a fragment rule */
 | 
				
			||||||
 | 
					 #define IPT_F_GOTO		0x02	/* Set if jump is a goto */
 | 
				
			||||||
 | 
					 #define IPT_F_MASK		0x03	/* All possible flag bits mask. */
 | 
				
			||||||
 | 
					+#define IPT_F_NO_DEF_MATCH	0x80	/* Internal: no default match rules present */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* Values for "inv" field in struct ipt_ip. */
 | 
				
			||||||
 | 
					 #define IPT_INV_VIA_IN		0x01	/* Invert the sense of IN IFACE. */
 | 
				
			||||||
 | 
					--- a/net/ipv4/netfilter/ip_tables.c
 | 
				
			||||||
 | 
					+++ b/net/ipv4/netfilter/ip_tables.c
 | 
				
			||||||
 | 
					@@ -81,6 +81,9 @@ ip_packet_match(const struct iphdr *ip,
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define FWINV(bool, invflg) ((bool) ^ !!(ipinfo->invflags & (invflg)))
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
 | 
				
			||||||
 | 
					+		return true;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	if (FWINV((ip->saddr&ipinfo->smsk.s_addr) != ipinfo->src.s_addr,
 | 
				
			||||||
 | 
					 		  IPT_INV_SRCIP) ||
 | 
				
			||||||
 | 
					 	    FWINV((ip->daddr&ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr,
 | 
				
			||||||
 | 
					@@ -134,6 +137,29 @@ ip_packet_match(const struct iphdr *ip,
 | 
				
			||||||
 | 
					 	return true;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+static void
 | 
				
			||||||
 | 
					+ip_checkdefault(struct ipt_ip *ip)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	static const char iface_mask[IFNAMSIZ] = {};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (ip->invflags || ip->flags & IPT_F_FRAG)
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (memcmp(ip->iniface_mask, iface_mask, IFNAMSIZ) != 0)
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (memcmp(ip->outiface_mask, iface_mask, IFNAMSIZ) != 0)
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (ip->smsk.s_addr || ip->dmsk.s_addr)
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (ip->proto)
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	ip->flags |= IPT_F_NO_DEF_MATCH;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static bool
 | 
				
			||||||
 | 
					 ip_checkentry(const struct ipt_ip *ip)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					@@ -560,7 +586,7 @@ static void cleanup_match(struct xt_entr
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static int
 | 
				
			||||||
 | 
					-check_entry(const struct ipt_entry *e, const char *name)
 | 
				
			||||||
 | 
					+check_entry(struct ipt_entry *e, const char *name)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	const struct xt_entry_target *t;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -569,6 +595,8 @@ check_entry(const struct ipt_entry *e, c
 | 
				
			||||||
 | 
					 		return -EINVAL;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	ip_checkdefault(&e->ip);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	if (e->target_offset + sizeof(struct xt_entry_target) >
 | 
				
			||||||
 | 
					 	    e->next_offset)
 | 
				
			||||||
 | 
					 		return -EINVAL;
 | 
				
			||||||
 | 
					@@ -930,6 +958,7 @@ copy_entries_to_user(unsigned int total_
 | 
				
			||||||
 | 
					 	const struct xt_table_info *private = table->private;
 | 
				
			||||||
 | 
					 	int ret = 0;
 | 
				
			||||||
 | 
					 	const void *loc_cpu_entry;
 | 
				
			||||||
 | 
					+	u8 flags;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	counters = alloc_counters(table);
 | 
				
			||||||
 | 
					 	if (IS_ERR(counters))
 | 
				
			||||||
 | 
					@@ -960,6 +989,14 @@ copy_entries_to_user(unsigned int total_
 | 
				
			||||||
 | 
					 			ret = -EFAULT;
 | 
				
			||||||
 | 
					 			goto free_counters;
 | 
				
			||||||
 | 
					 		}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		flags = e->ip.flags & IPT_F_MASK;
 | 
				
			||||||
 | 
					+		if (copy_to_user(userptr + off
 | 
				
			||||||
 | 
					+				 + offsetof(struct ipt_entry, ip.flags),
 | 
				
			||||||
 | 
					+				 &flags, sizeof(flags)) != 0) {
 | 
				
			||||||
 | 
					+			ret = -EFAULT;
 | 
				
			||||||
 | 
					+			goto free_counters;
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		for (i = sizeof(struct ipt_entry);
 | 
				
			||||||
 | 
					 		     i < e->target_offset;
 | 
				
			||||||
@@ -0,0 +1,81 @@
 | 
				
			|||||||
 | 
					--- a/net/ipv4/netfilter/ip_tables.c
 | 
				
			||||||
 | 
					+++ b/net/ipv4/netfilter/ip_tables.c
 | 
				
			||||||
 | 
					@@ -309,6 +309,33 @@ struct ipt_entry *ipt_next_entry(const s
 | 
				
			||||||
 | 
					 	return (void *)entry + entry->next_offset;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+static bool
 | 
				
			||||||
 | 
					+ipt_handle_default_rule(struct ipt_entry *e, unsigned int *verdict)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct xt_entry_target *t;
 | 
				
			||||||
 | 
					+	struct xt_standard_target *st;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (e->target_offset != sizeof(struct ipt_entry))
 | 
				
			||||||
 | 
					+		return false;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (!(e->ip.flags & IPT_F_NO_DEF_MATCH))
 | 
				
			||||||
 | 
					+		return false;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	t = ipt_get_target(e);
 | 
				
			||||||
 | 
					+	if (t->u.kernel.target->target)
 | 
				
			||||||
 | 
					+		return false;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	st = (struct xt_standard_target *) t;
 | 
				
			||||||
 | 
					+	if (st->verdict == XT_RETURN)
 | 
				
			||||||
 | 
					+		return false;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (st->verdict >= 0)
 | 
				
			||||||
 | 
					+		return false;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	*verdict = (unsigned)(-st->verdict) - 1;
 | 
				
			||||||
 | 
					+	return true;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 /* Returns one of the generic firewall policies, like NF_ACCEPT. */
 | 
				
			||||||
 | 
					 unsigned int
 | 
				
			||||||
 | 
					 ipt_do_table(struct sk_buff *skb,
 | 
				
			||||||
 | 
					@@ -333,6 +360,25 @@ ipt_do_table(struct sk_buff *skb,
 | 
				
			||||||
 | 
					 	ip = ip_hdr(skb);
 | 
				
			||||||
 | 
					 	indev = in ? in->name : nulldevname;
 | 
				
			||||||
 | 
					 	outdev = out ? out->name : nulldevname;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	IP_NF_ASSERT(table->valid_hooks & (1 << hook));
 | 
				
			||||||
 | 
					+	local_bh_disable();
 | 
				
			||||||
 | 
					+	addend = xt_write_recseq_begin();
 | 
				
			||||||
 | 
					+	private = table->private;
 | 
				
			||||||
 | 
					+	cpu        = smp_processor_id();
 | 
				
			||||||
 | 
					+	table_base = private->entries[cpu];
 | 
				
			||||||
 | 
					+	jumpstack  = (struct ipt_entry **)private->jumpstack[cpu];
 | 
				
			||||||
 | 
					+	stackptr   = per_cpu_ptr(private->stackptr, cpu);
 | 
				
			||||||
 | 
					+	origptr    = *stackptr;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	e = get_entry(table_base, private->hook_entry[hook]);
 | 
				
			||||||
 | 
					+	if (ipt_handle_default_rule(e, &verdict)) {
 | 
				
			||||||
 | 
					+		ADD_COUNTER(e->counters, skb->len, 1);
 | 
				
			||||||
 | 
					+		xt_write_recseq_end(addend);
 | 
				
			||||||
 | 
					+		local_bh_enable();
 | 
				
			||||||
 | 
					+		return verdict;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	/* We handle fragments by dealing with the first fragment as
 | 
				
			||||||
 | 
					 	 * if it was a normal packet.  All other fragments are treated
 | 
				
			||||||
 | 
					 	 * normally, except that they will NEVER match rules that ask
 | 
				
			||||||
 | 
					@@ -347,18 +393,6 @@ ipt_do_table(struct sk_buff *skb,
 | 
				
			||||||
 | 
					 	acpar.family  = NFPROTO_IPV4;
 | 
				
			||||||
 | 
					 	acpar.hooknum = hook;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	IP_NF_ASSERT(table->valid_hooks & (1 << hook));
 | 
				
			||||||
 | 
					-	local_bh_disable();
 | 
				
			||||||
 | 
					-	addend = xt_write_recseq_begin();
 | 
				
			||||||
 | 
					-	private = table->private;
 | 
				
			||||||
 | 
					-	cpu        = smp_processor_id();
 | 
				
			||||||
 | 
					-	table_base = private->entries[cpu];
 | 
				
			||||||
 | 
					-	jumpstack  = (struct ipt_entry **)private->jumpstack[cpu];
 | 
				
			||||||
 | 
					-	stackptr   = per_cpu_ptr(private->stackptr, cpu);
 | 
				
			||||||
 | 
					-	origptr    = *stackptr;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	e = get_entry(table_base, private->hook_entry[hook]);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 	pr_debug("Entering %s(hook %u); sp at %u (UF %p)\n",
 | 
				
			||||||
 | 
					 		 table->name, hook, origptr,
 | 
				
			||||||
 | 
					 		 get_entry(table_base, private->underflow[hook]));
 | 
				
			||||||
@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					--- a/net/ipv4/netfilter/ip_tables.c
 | 
				
			||||||
 | 
					+++ b/net/ipv4/netfilter/ip_tables.c
 | 
				
			||||||
 | 
					@@ -84,9 +84,11 @@ ip_packet_match(const struct iphdr *ip,
 | 
				
			||||||
 | 
					 	if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
 | 
				
			||||||
 | 
					 		return true;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	if (FWINV((ip->saddr&ipinfo->smsk.s_addr) != ipinfo->src.s_addr,
 | 
				
			||||||
 | 
					+	if (FWINV(ipinfo->smsk.s_addr &&
 | 
				
			||||||
 | 
					+		  (ip->saddr&ipinfo->smsk.s_addr) != ipinfo->src.s_addr,
 | 
				
			||||||
 | 
					 		  IPT_INV_SRCIP) ||
 | 
				
			||||||
 | 
					-	    FWINV((ip->daddr&ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr,
 | 
				
			||||||
 | 
					+	    FWINV(ipinfo->dmsk.s_addr &&
 | 
				
			||||||
 | 
					+		  (ip->daddr&ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr,
 | 
				
			||||||
 | 
					 		  IPT_INV_DSTIP)) {
 | 
				
			||||||
 | 
					 		dprintf("Source or dest mismatch.\n");
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
@@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					--- a/net/netfilter/nf_conntrack_proto_tcp.c
 | 
				
			||||||
 | 
					+++ b/net/netfilter/nf_conntrack_proto_tcp.c
 | 
				
			||||||
 | 
					@@ -29,6 +29,9 @@
 | 
				
			||||||
 | 
					 #include <net/netfilter/ipv4/nf_conntrack_ipv4.h>
 | 
				
			||||||
 | 
					 #include <net/netfilter/ipv6/nf_conntrack_ipv6.h>
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+/* Do not check the TCP window for incoming packets  */
 | 
				
			||||||
 | 
					+static int nf_ct_tcp_no_window_check __read_mostly = 1;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 /* "Be conservative in what you do,
 | 
				
			||||||
 | 
					     be liberal in what you accept from others."
 | 
				
			||||||
 | 
					     If it's non-zero, we mark only out of window RST segments as INVALID. */
 | 
				
			||||||
 | 
					@@ -526,6 +529,9 @@ static bool tcp_in_window(const struct n
 | 
				
			||||||
 | 
					 	s16 receiver_offset;
 | 
				
			||||||
 | 
					 	bool res;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	if (nf_ct_tcp_no_window_check)
 | 
				
			||||||
 | 
					+		return true;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	/*
 | 
				
			||||||
 | 
					 	 * Get the required data from the packet.
 | 
				
			||||||
 | 
					 	 */
 | 
				
			||||||
 | 
					@@ -1438,6 +1444,13 @@ static struct ctl_table tcp_sysctl_table
 | 
				
			||||||
 | 
					 		.mode		= 0644,
 | 
				
			||||||
 | 
					 		.proc_handler	= proc_dointvec,
 | 
				
			||||||
 | 
					 	},
 | 
				
			||||||
 | 
					+	{
 | 
				
			||||||
 | 
					+		.procname       = "nf_conntrack_tcp_no_window_check",
 | 
				
			||||||
 | 
					+		.data           = &nf_ct_tcp_no_window_check,
 | 
				
			||||||
 | 
					+		.maxlen         = sizeof(unsigned int),
 | 
				
			||||||
 | 
					+		.mode           = 0644,
 | 
				
			||||||
 | 
					+		.proc_handler   = proc_dointvec,
 | 
				
			||||||
 | 
					+	},
 | 
				
			||||||
 | 
					 	{ }
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
							
								
								
									
										791
									
								
								target/linux/generic/patches-3.8/620-sched_esfq.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										791
									
								
								target/linux/generic/patches-3.8/620-sched_esfq.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,791 @@
 | 
				
			|||||||
 | 
					--- a/include/uapi/linux/pkt_sched.h
 | 
				
			||||||
 | 
					+++ b/include/uapi/linux/pkt_sched.h
 | 
				
			||||||
 | 
					@@ -214,6 +214,33 @@ struct tc_sfq_xstats {
 | 
				
			||||||
 | 
					 	__s32		allot;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+/* ESFQ section */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+enum
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+        /* traditional */
 | 
				
			||||||
 | 
					+	TCA_SFQ_HASH_CLASSIC,
 | 
				
			||||||
 | 
					+	TCA_SFQ_HASH_DST,
 | 
				
			||||||
 | 
					+	TCA_SFQ_HASH_SRC,
 | 
				
			||||||
 | 
					+	TCA_SFQ_HASH_FWMARK,
 | 
				
			||||||
 | 
					+	/* conntrack */
 | 
				
			||||||
 | 
					+	TCA_SFQ_HASH_CTORIGDST,
 | 
				
			||||||
 | 
					+	TCA_SFQ_HASH_CTORIGSRC,
 | 
				
			||||||
 | 
					+	TCA_SFQ_HASH_CTREPLDST,
 | 
				
			||||||
 | 
					+	TCA_SFQ_HASH_CTREPLSRC,
 | 
				
			||||||
 | 
					+	TCA_SFQ_HASH_CTNATCHG,
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+struct tc_esfq_qopt
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	unsigned	quantum;	/* Bytes per round allocated to flow */
 | 
				
			||||||
 | 
					+	int		perturb_period;	/* Period of hash perturbation */
 | 
				
			||||||
 | 
					+	__u32		limit;		/* Maximal packets in queue */
 | 
				
			||||||
 | 
					+	unsigned	divisor;	/* Hash divisor  */
 | 
				
			||||||
 | 
					+	unsigned	flows;		/* Maximal number of flows  */
 | 
				
			||||||
 | 
					+	unsigned	hash_kind;	/* Hash function to use for flow identification */
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 /* RED section */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 enum {
 | 
				
			||||||
 | 
					--- a/net/sched/Kconfig
 | 
				
			||||||
 | 
					+++ b/net/sched/Kconfig
 | 
				
			||||||
 | 
					@@ -148,6 +148,37 @@ config NET_SCH_SFQ
 | 
				
			||||||
 | 
					 	  To compile this code as a module, choose M here: the
 | 
				
			||||||
 | 
					 	  module will be called sch_sfq.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+config NET_SCH_ESFQ
 | 
				
			||||||
 | 
					+	tristate "Enhanced Stochastic Fairness Queueing (ESFQ)"
 | 
				
			||||||
 | 
					+	---help---
 | 
				
			||||||
 | 
					+	  Say Y here if you want to use the Enhanced Stochastic Fairness
 | 
				
			||||||
 | 
					+	  Queueing (ESFQ) packet scheduling algorithm for some of your network
 | 
				
			||||||
 | 
					+	  devices or as a leaf discipline for a classful qdisc such as HTB or
 | 
				
			||||||
 | 
					+	  CBQ (see the top of <file:net/sched/sch_esfq.c> for details and
 | 
				
			||||||
 | 
					+	  references to the SFQ algorithm).
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	  This is an enchanced SFQ version which allows you to control some
 | 
				
			||||||
 | 
					+	  hardcoded values in the SFQ scheduler.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	  ESFQ also adds control of the hash function used to identify packet
 | 
				
			||||||
 | 
					+	  flows. The original SFQ discipline hashes by connection; ESFQ add
 | 
				
			||||||
 | 
					+	  several other hashing methods, such as by src IP or by dst IP, which
 | 
				
			||||||
 | 
					+	  can be more fair to users in some networking situations.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	  To compile this code as a module, choose M here: the
 | 
				
			||||||
 | 
					+	  module will be called sch_esfq.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+config NET_SCH_ESFQ_NFCT
 | 
				
			||||||
 | 
					+	bool "Connection Tracking Hash Types"
 | 
				
			||||||
 | 
					+	depends on NET_SCH_ESFQ && NF_CONNTRACK
 | 
				
			||||||
 | 
					+	---help---
 | 
				
			||||||
 | 
					+	  Say Y here to enable support for hashing based on netfilter connection
 | 
				
			||||||
 | 
					+	  tracking information. This is useful for a router that is also using
 | 
				
			||||||
 | 
					+	  NAT to connect privately-addressed hosts to the Internet. If you want
 | 
				
			||||||
 | 
					+	  to provide fair distribution of upstream bandwidth, ESFQ must use
 | 
				
			||||||
 | 
					+	  connection tracking information, since all outgoing packets will share
 | 
				
			||||||
 | 
					+	  the same source address.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 config NET_SCH_TEQL
 | 
				
			||||||
 | 
					 	tristate "True Link Equalizer (TEQL)"
 | 
				
			||||||
 | 
					 	---help---
 | 
				
			||||||
 | 
					--- a/net/sched/Makefile
 | 
				
			||||||
 | 
					+++ b/net/sched/Makefile
 | 
				
			||||||
 | 
					@@ -26,6 +26,7 @@ obj-$(CONFIG_NET_SCH_INGRESS)	+= sch_ing
 | 
				
			||||||
 | 
					 obj-$(CONFIG_NET_SCH_DSMARK)	+= sch_dsmark.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_NET_SCH_SFB)	+= sch_sfb.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_NET_SCH_SFQ)	+= sch_sfq.o
 | 
				
			||||||
 | 
					+obj-$(CONFIG_NET_SCH_ESFQ)	+= sch_esfq.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_NET_SCH_TBF)	+= sch_tbf.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_NET_SCH_TEQL)	+= sch_teql.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_NET_SCH_PRIO)	+= sch_prio.o
 | 
				
			||||||
 | 
					--- /dev/null
 | 
				
			||||||
 | 
					+++ b/net/sched/sch_esfq.c
 | 
				
			||||||
 | 
					@@ -0,0 +1,702 @@
 | 
				
			||||||
 | 
					+/*
 | 
				
			||||||
 | 
					+ * net/sched/sch_esfq.c	Extended Stochastic Fairness Queueing discipline.
 | 
				
			||||||
 | 
					+ *
 | 
				
			||||||
 | 
					+ *		This program is free software; you can redistribute it and/or
 | 
				
			||||||
 | 
					+ *		modify it under the terms of the GNU General Public License
 | 
				
			||||||
 | 
					+ *		as published by the Free Software Foundation; either version
 | 
				
			||||||
 | 
					+ *		2 of the License, or (at your option) any later version.
 | 
				
			||||||
 | 
					+ *
 | 
				
			||||||
 | 
					+ * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
 | 
				
			||||||
 | 
					+ *
 | 
				
			||||||
 | 
					+ * Changes:	Alexander Atanasov, <alex@ssi.bg>
 | 
				
			||||||
 | 
					+ *		Added dynamic depth,limit,divisor,hash_kind options.
 | 
				
			||||||
 | 
					+ *		Added dst and src hashes.
 | 
				
			||||||
 | 
					+ *
 | 
				
			||||||
 | 
					+ * 		Alexander Clouter, <alex@digriz.org.uk>
 | 
				
			||||||
 | 
					+ *		Ported ESFQ to Linux 2.6.
 | 
				
			||||||
 | 
					+ *
 | 
				
			||||||
 | 
					+ * 		Corey Hickey, <bugfood-c@fatooh.org>
 | 
				
			||||||
 | 
					+ *		Maintenance of the Linux 2.6 port.
 | 
				
			||||||
 | 
					+ *		Added fwmark hash (thanks to Robert Kurjata).
 | 
				
			||||||
 | 
					+ *		Added usage of jhash.
 | 
				
			||||||
 | 
					+ *		Added conntrack support.
 | 
				
			||||||
 | 
					+ *		Added ctnatchg hash (thanks to Ben Pfountz).
 | 
				
			||||||
 | 
					+ */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#include <linux/module.h>
 | 
				
			||||||
 | 
					+#include <asm/uaccess.h>
 | 
				
			||||||
 | 
					+#include <linux/bitops.h>
 | 
				
			||||||
 | 
					+#include <linux/types.h>
 | 
				
			||||||
 | 
					+#include <linux/kernel.h>
 | 
				
			||||||
 | 
					+#include <linux/jiffies.h>
 | 
				
			||||||
 | 
					+#include <linux/string.h>
 | 
				
			||||||
 | 
					+#include <linux/mm.h>
 | 
				
			||||||
 | 
					+#include <linux/socket.h>
 | 
				
			||||||
 | 
					+#include <linux/sockios.h>
 | 
				
			||||||
 | 
					+#include <linux/in.h>
 | 
				
			||||||
 | 
					+#include <linux/errno.h>
 | 
				
			||||||
 | 
					+#include <linux/interrupt.h>
 | 
				
			||||||
 | 
					+#include <linux/if_ether.h>
 | 
				
			||||||
 | 
					+#include <linux/inet.h>
 | 
				
			||||||
 | 
					+#include <linux/netdevice.h>
 | 
				
			||||||
 | 
					+#include <linux/etherdevice.h>
 | 
				
			||||||
 | 
					+#include <linux/notifier.h>
 | 
				
			||||||
 | 
					+#include <linux/init.h>
 | 
				
			||||||
 | 
					+#include <net/ip.h>
 | 
				
			||||||
 | 
					+#include <net/netlink.h>
 | 
				
			||||||
 | 
					+#include <linux/ipv6.h>
 | 
				
			||||||
 | 
					+#include <net/route.h>
 | 
				
			||||||
 | 
					+#include <linux/skbuff.h>
 | 
				
			||||||
 | 
					+#include <net/sock.h>
 | 
				
			||||||
 | 
					+#include <net/pkt_sched.h>
 | 
				
			||||||
 | 
					+#include <linux/jhash.h>
 | 
				
			||||||
 | 
					+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
 | 
				
			||||||
 | 
					+#include <net/netfilter/nf_conntrack.h>
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+/*	Stochastic Fairness Queuing algorithm.
 | 
				
			||||||
 | 
					+	For more comments look at sch_sfq.c.
 | 
				
			||||||
 | 
					+	The difference is that you can change limit, depth,
 | 
				
			||||||
 | 
					+	hash table size and choose alternate hash types.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	classic:	same as in sch_sfq.c
 | 
				
			||||||
 | 
					+	dst:		destination IP address
 | 
				
			||||||
 | 
					+	src:		source IP address
 | 
				
			||||||
 | 
					+	fwmark:		netfilter mark value
 | 
				
			||||||
 | 
					+	ctorigdst:	original destination IP address
 | 
				
			||||||
 | 
					+	ctorigsrc:	original source IP address
 | 
				
			||||||
 | 
					+	ctrepldst:	reply destination IP address
 | 
				
			||||||
 | 
					+	ctreplsrc:	reply source IP
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+*/
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#define ESFQ_HEAD 0
 | 
				
			||||||
 | 
					+#define ESFQ_TAIL 1
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+/* This type should contain at least SFQ_DEPTH*2 values */
 | 
				
			||||||
 | 
					+typedef unsigned int esfq_index;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+struct esfq_head
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	esfq_index	next;
 | 
				
			||||||
 | 
					+	esfq_index	prev;
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+struct esfq_sched_data
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+/* Parameters */
 | 
				
			||||||
 | 
					+	int		perturb_period;
 | 
				
			||||||
 | 
					+	unsigned	quantum;	/* Allotment per round: MUST BE >= MTU */
 | 
				
			||||||
 | 
					+	int		limit;
 | 
				
			||||||
 | 
					+	unsigned	depth;
 | 
				
			||||||
 | 
					+	unsigned	hash_divisor;
 | 
				
			||||||
 | 
					+	unsigned	hash_kind;
 | 
				
			||||||
 | 
					+/* Variables */
 | 
				
			||||||
 | 
					+	struct timer_list perturb_timer;
 | 
				
			||||||
 | 
					+	int		perturbation;
 | 
				
			||||||
 | 
					+	esfq_index	tail;		/* Index of current slot in round */
 | 
				
			||||||
 | 
					+	esfq_index	max_depth;	/* Maximal depth */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	esfq_index	*ht;			/* Hash table */
 | 
				
			||||||
 | 
					+	esfq_index	*next;			/* Active slots link */
 | 
				
			||||||
 | 
					+	short		*allot;			/* Current allotment per slot */
 | 
				
			||||||
 | 
					+	unsigned short	*hash;			/* Hash value indexed by slots */
 | 
				
			||||||
 | 
					+	struct sk_buff_head	*qs;		/* Slot queue */
 | 
				
			||||||
 | 
					+	struct esfq_head	*dep;		/* Linked list of slots, indexed by depth */
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+/* This contains the info we will hash. */
 | 
				
			||||||
 | 
					+struct esfq_packet_info
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	u32	proto;		/* protocol or port */
 | 
				
			||||||
 | 
					+	u32	src;		/* source from packet header */
 | 
				
			||||||
 | 
					+	u32	dst;		/* destination from packet header */
 | 
				
			||||||
 | 
					+	u32	ctorigsrc;	/* original source from conntrack */
 | 
				
			||||||
 | 
					+	u32	ctorigdst;	/* original destination from conntrack */
 | 
				
			||||||
 | 
					+	u32	ctreplsrc;	/* reply source from conntrack */
 | 
				
			||||||
 | 
					+	u32	ctrepldst;	/* reply destination from conntrack */
 | 
				
			||||||
 | 
					+	u32	mark;		/* netfilter mark (fwmark) */
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static __inline__ unsigned esfq_jhash_1word(struct esfq_sched_data *q,u32 a)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return jhash_1word(a, q->perturbation) & (q->hash_divisor-1);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static __inline__ unsigned esfq_jhash_2words(struct esfq_sched_data *q, u32 a, u32 b)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return jhash_2words(a, b, q->perturbation) & (q->hash_divisor-1);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static __inline__ unsigned esfq_jhash_3words(struct esfq_sched_data *q, u32 a, u32 b, u32 c)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return jhash_3words(a, b, c, q->perturbation) & (q->hash_divisor-1);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static unsigned esfq_hash(struct esfq_sched_data *q, struct sk_buff *skb)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct esfq_packet_info info;
 | 
				
			||||||
 | 
					+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
 | 
				
			||||||
 | 
					+	enum ip_conntrack_info ctinfo;
 | 
				
			||||||
 | 
					+	struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	switch (skb->protocol) {
 | 
				
			||||||
 | 
					+	case __constant_htons(ETH_P_IP):
 | 
				
			||||||
 | 
					+	{
 | 
				
			||||||
 | 
					+		struct iphdr *iph = ip_hdr(skb);
 | 
				
			||||||
 | 
					+		info.dst = iph->daddr;
 | 
				
			||||||
 | 
					+		info.src = iph->saddr;
 | 
				
			||||||
 | 
					+		if (!(iph->frag_off&htons(IP_MF|IP_OFFSET)) &&
 | 
				
			||||||
 | 
					+		    (iph->protocol == IPPROTO_TCP ||
 | 
				
			||||||
 | 
					+		     iph->protocol == IPPROTO_UDP ||
 | 
				
			||||||
 | 
					+		     iph->protocol == IPPROTO_SCTP ||
 | 
				
			||||||
 | 
					+		     iph->protocol == IPPROTO_DCCP ||
 | 
				
			||||||
 | 
					+		     iph->protocol == IPPROTO_ESP))
 | 
				
			||||||
 | 
					+			info.proto = *(((u32*)iph) + iph->ihl);
 | 
				
			||||||
 | 
					+		else
 | 
				
			||||||
 | 
					+			info.proto = iph->protocol;
 | 
				
			||||||
 | 
					+		break;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+	case __constant_htons(ETH_P_IPV6):
 | 
				
			||||||
 | 
					+	{
 | 
				
			||||||
 | 
					+		struct ipv6hdr *iph = ipv6_hdr(skb);
 | 
				
			||||||
 | 
					+		/* Hash ipv6 addresses into a u32. This isn't ideal,
 | 
				
			||||||
 | 
					+		 * but the code is simple. */
 | 
				
			||||||
 | 
					+		info.dst = jhash2(iph->daddr.s6_addr32, 4, q->perturbation);
 | 
				
			||||||
 | 
					+		info.src = jhash2(iph->saddr.s6_addr32, 4, q->perturbation);
 | 
				
			||||||
 | 
					+		if (iph->nexthdr == IPPROTO_TCP ||
 | 
				
			||||||
 | 
					+		    iph->nexthdr == IPPROTO_UDP ||
 | 
				
			||||||
 | 
					+		    iph->nexthdr == IPPROTO_SCTP ||
 | 
				
			||||||
 | 
					+		    iph->nexthdr == IPPROTO_DCCP ||
 | 
				
			||||||
 | 
					+		    iph->nexthdr == IPPROTO_ESP)
 | 
				
			||||||
 | 
					+			info.proto = *(u32*)&iph[1];
 | 
				
			||||||
 | 
					+		else
 | 
				
			||||||
 | 
					+			info.proto = iph->nexthdr;
 | 
				
			||||||
 | 
					+		break;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+	default:
 | 
				
			||||||
 | 
					+		info.dst   = (u32)(unsigned long)skb_dst(skb);
 | 
				
			||||||
 | 
					+		info.src   = (u32)(unsigned long)skb->sk;
 | 
				
			||||||
 | 
					+		info.proto = skb->protocol;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	info.mark = skb->mark;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
 | 
				
			||||||
 | 
					+	/* defaults if there is no conntrack info */
 | 
				
			||||||
 | 
					+	info.ctorigsrc = info.src;
 | 
				
			||||||
 | 
					+	info.ctorigdst = info.dst;
 | 
				
			||||||
 | 
					+	info.ctreplsrc = info.dst;
 | 
				
			||||||
 | 
					+	info.ctrepldst = info.src;
 | 
				
			||||||
 | 
					+	/* collect conntrack info */
 | 
				
			||||||
 | 
					+	if (ct && ct != &nf_conntrack_untracked) {
 | 
				
			||||||
 | 
					+		if (skb->protocol == __constant_htons(ETH_P_IP)) {
 | 
				
			||||||
 | 
					+			info.ctorigsrc = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip;
 | 
				
			||||||
 | 
					+			info.ctorigdst = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip;
 | 
				
			||||||
 | 
					+			info.ctreplsrc = ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip;
 | 
				
			||||||
 | 
					+			info.ctrepldst = ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip;
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+		else if (skb->protocol == __constant_htons(ETH_P_IPV6)) {
 | 
				
			||||||
 | 
					+			/* Again, hash ipv6 addresses into a single u32. */
 | 
				
			||||||
 | 
					+			info.ctorigsrc = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip6, 4, q->perturbation);
 | 
				
			||||||
 | 
					+			info.ctorigdst = jhash2(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip6, 4, q->perturbation);
 | 
				
			||||||
 | 
					+			info.ctreplsrc = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip6, 4, q->perturbation);
 | 
				
			||||||
 | 
					+			info.ctrepldst = jhash2(ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip6, 4, q->perturbation);
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	switch(q->hash_kind) {
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_CLASSIC:
 | 
				
			||||||
 | 
					+		return esfq_jhash_3words(q, info.dst, info.src, info.proto);
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_DST:
 | 
				
			||||||
 | 
					+		return esfq_jhash_1word(q, info.dst);
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_SRC:
 | 
				
			||||||
 | 
					+		return esfq_jhash_1word(q, info.src);
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_FWMARK:
 | 
				
			||||||
 | 
					+		return esfq_jhash_1word(q, info.mark);
 | 
				
			||||||
 | 
					+#ifdef CONFIG_NET_SCH_ESFQ_NFCT
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_CTORIGDST:
 | 
				
			||||||
 | 
					+		return esfq_jhash_1word(q, info.ctorigdst);
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_CTORIGSRC:
 | 
				
			||||||
 | 
					+		return esfq_jhash_1word(q, info.ctorigsrc);
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_CTREPLDST:
 | 
				
			||||||
 | 
					+		return esfq_jhash_1word(q, info.ctrepldst);
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_CTREPLSRC:
 | 
				
			||||||
 | 
					+		return esfq_jhash_1word(q, info.ctreplsrc);
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_CTNATCHG:
 | 
				
			||||||
 | 
					+	{
 | 
				
			||||||
 | 
					+		if (info.ctorigdst == info.ctreplsrc)
 | 
				
			||||||
 | 
					+			return esfq_jhash_1word(q, info.ctorigsrc);
 | 
				
			||||||
 | 
					+		return esfq_jhash_1word(q, info.ctreplsrc);
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+	default:
 | 
				
			||||||
 | 
					+		if (net_ratelimit())
 | 
				
			||||||
 | 
					+			printk(KERN_WARNING "ESFQ: Unknown hash method. Falling back to classic.\n");
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+	return esfq_jhash_3words(q, info.dst, info.src, info.proto);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void esfq_link(struct esfq_sched_data *q, esfq_index x)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	esfq_index p, n;
 | 
				
			||||||
 | 
					+	int d = q->qs[x].qlen + q->depth;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	p = d;
 | 
				
			||||||
 | 
					+	n = q->dep[d].next;
 | 
				
			||||||
 | 
					+	q->dep[x].next = n;
 | 
				
			||||||
 | 
					+	q->dep[x].prev = p;
 | 
				
			||||||
 | 
					+	q->dep[p].next = q->dep[n].prev = x;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void esfq_dec(struct esfq_sched_data *q, esfq_index x)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	esfq_index p, n;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	n = q->dep[x].next;
 | 
				
			||||||
 | 
					+	p = q->dep[x].prev;
 | 
				
			||||||
 | 
					+	q->dep[p].next = n;
 | 
				
			||||||
 | 
					+	q->dep[n].prev = p;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (n == p && q->max_depth == q->qs[x].qlen + 1)
 | 
				
			||||||
 | 
					+		q->max_depth--;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	esfq_link(q, x);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline void esfq_inc(struct esfq_sched_data *q, esfq_index x)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	esfq_index p, n;
 | 
				
			||||||
 | 
					+	int d;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	n = q->dep[x].next;
 | 
				
			||||||
 | 
					+	p = q->dep[x].prev;
 | 
				
			||||||
 | 
					+	q->dep[p].next = n;
 | 
				
			||||||
 | 
					+	q->dep[n].prev = p;
 | 
				
			||||||
 | 
					+	d = q->qs[x].qlen;
 | 
				
			||||||
 | 
					+	if (q->max_depth < d)
 | 
				
			||||||
 | 
					+		q->max_depth = d;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	esfq_link(q, x);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static unsigned int esfq_drop(struct Qdisc *sch)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct esfq_sched_data *q = qdisc_priv(sch);
 | 
				
			||||||
 | 
					+	esfq_index d = q->max_depth;
 | 
				
			||||||
 | 
					+	struct sk_buff *skb;
 | 
				
			||||||
 | 
					+	unsigned int len;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* Queue is full! Find the longest slot and
 | 
				
			||||||
 | 
					+	   drop a packet from it */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (d > 1) {
 | 
				
			||||||
 | 
					+		esfq_index x = q->dep[d+q->depth].next;
 | 
				
			||||||
 | 
					+		skb = q->qs[x].prev;
 | 
				
			||||||
 | 
					+		len = skb->len;
 | 
				
			||||||
 | 
					+		__skb_unlink(skb, &q->qs[x]);
 | 
				
			||||||
 | 
					+		kfree_skb(skb);
 | 
				
			||||||
 | 
					+		esfq_dec(q, x);
 | 
				
			||||||
 | 
					+		sch->q.qlen--;
 | 
				
			||||||
 | 
					+		sch->qstats.drops++;
 | 
				
			||||||
 | 
					+		sch->qstats.backlog -= len;
 | 
				
			||||||
 | 
					+		return len;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (d == 1) {
 | 
				
			||||||
 | 
					+		/* It is difficult to believe, but ALL THE SLOTS HAVE LENGTH 1. */
 | 
				
			||||||
 | 
					+		d = q->next[q->tail];
 | 
				
			||||||
 | 
					+		q->next[q->tail] = q->next[d];
 | 
				
			||||||
 | 
					+		q->allot[q->next[d]] += q->quantum;
 | 
				
			||||||
 | 
					+		skb = q->qs[d].prev;
 | 
				
			||||||
 | 
					+		len = skb->len;
 | 
				
			||||||
 | 
					+		__skb_unlink(skb, &q->qs[d]);
 | 
				
			||||||
 | 
					+		kfree_skb(skb);
 | 
				
			||||||
 | 
					+		esfq_dec(q, d);
 | 
				
			||||||
 | 
					+		sch->q.qlen--;
 | 
				
			||||||
 | 
					+		q->ht[q->hash[d]] = q->depth;
 | 
				
			||||||
 | 
					+		sch->qstats.drops++;
 | 
				
			||||||
 | 
					+		sch->qstats.backlog -= len;
 | 
				
			||||||
 | 
					+		return len;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void esfq_q_enqueue(struct sk_buff *skb, struct esfq_sched_data *q, unsigned int end)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	unsigned hash = esfq_hash(q, skb);
 | 
				
			||||||
 | 
					+	unsigned depth = q->depth;
 | 
				
			||||||
 | 
					+	esfq_index x;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	x = q->ht[hash];
 | 
				
			||||||
 | 
					+	if (x == depth) {
 | 
				
			||||||
 | 
					+		q->ht[hash] = x = q->dep[depth].next;
 | 
				
			||||||
 | 
					+		q->hash[x] = hash;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (end == ESFQ_TAIL)
 | 
				
			||||||
 | 
					+		__skb_queue_tail(&q->qs[x], skb);
 | 
				
			||||||
 | 
					+	else
 | 
				
			||||||
 | 
					+		__skb_queue_head(&q->qs[x], skb);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	esfq_inc(q, x);
 | 
				
			||||||
 | 
					+	if (q->qs[x].qlen == 1) {		/* The flow is new */
 | 
				
			||||||
 | 
					+		if (q->tail == depth) {	/* It is the first flow */
 | 
				
			||||||
 | 
					+			q->tail = x;
 | 
				
			||||||
 | 
					+			q->next[x] = x;
 | 
				
			||||||
 | 
					+			q->allot[x] = q->quantum;
 | 
				
			||||||
 | 
					+		} else {
 | 
				
			||||||
 | 
					+			q->next[x] = q->next[q->tail];
 | 
				
			||||||
 | 
					+			q->next[q->tail] = x;
 | 
				
			||||||
 | 
					+			q->tail = x;
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int esfq_enqueue(struct sk_buff *skb, struct Qdisc* sch)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct esfq_sched_data *q = qdisc_priv(sch);
 | 
				
			||||||
 | 
					+	esfq_q_enqueue(skb, q, ESFQ_TAIL);
 | 
				
			||||||
 | 
					+	sch->qstats.backlog += skb->len;
 | 
				
			||||||
 | 
					+	if (++sch->q.qlen < q->limit-1) {
 | 
				
			||||||
 | 
					+		sch->bstats.bytes += skb->len;
 | 
				
			||||||
 | 
					+		sch->bstats.packets++;
 | 
				
			||||||
 | 
					+		return 0;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	sch->qstats.drops++;
 | 
				
			||||||
 | 
					+	esfq_drop(sch);
 | 
				
			||||||
 | 
					+	return NET_XMIT_CN;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static struct sk_buff *esfq_peek(struct Qdisc* sch)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct esfq_sched_data *q = qdisc_priv(sch);
 | 
				
			||||||
 | 
					+	esfq_index a;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* No active slots */
 | 
				
			||||||
 | 
					+	if (q->tail == q->depth)
 | 
				
			||||||
 | 
					+		return NULL;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	a = q->next[q->tail];
 | 
				
			||||||
 | 
					+	return skb_peek(&q->qs[a]);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static struct sk_buff *esfq_q_dequeue(struct esfq_sched_data *q)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct sk_buff *skb;
 | 
				
			||||||
 | 
					+	unsigned depth = q->depth;
 | 
				
			||||||
 | 
					+	esfq_index a, old_a;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* No active slots */
 | 
				
			||||||
 | 
					+	if (q->tail == depth)
 | 
				
			||||||
 | 
					+		return NULL;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	a = old_a = q->next[q->tail];
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* Grab packet */
 | 
				
			||||||
 | 
					+	skb = __skb_dequeue(&q->qs[a]);
 | 
				
			||||||
 | 
					+	esfq_dec(q, a);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* Is the slot empty? */
 | 
				
			||||||
 | 
					+	if (q->qs[a].qlen == 0) {
 | 
				
			||||||
 | 
					+		q->ht[q->hash[a]] = depth;
 | 
				
			||||||
 | 
					+		a = q->next[a];
 | 
				
			||||||
 | 
					+		if (a == old_a) {
 | 
				
			||||||
 | 
					+			q->tail = depth;
 | 
				
			||||||
 | 
					+			return skb;
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+		q->next[q->tail] = a;
 | 
				
			||||||
 | 
					+		q->allot[a] += q->quantum;
 | 
				
			||||||
 | 
					+	} else if ((q->allot[a] -= skb->len) <= 0) {
 | 
				
			||||||
 | 
					+		q->tail = a;
 | 
				
			||||||
 | 
					+		a = q->next[a];
 | 
				
			||||||
 | 
					+		q->allot[a] += q->quantum;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return skb;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static struct sk_buff *esfq_dequeue(struct Qdisc* sch)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct esfq_sched_data *q = qdisc_priv(sch);
 | 
				
			||||||
 | 
					+	struct sk_buff *skb;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	skb = esfq_q_dequeue(q);
 | 
				
			||||||
 | 
					+	if (skb == NULL)
 | 
				
			||||||
 | 
					+		return NULL;
 | 
				
			||||||
 | 
					+	sch->q.qlen--;
 | 
				
			||||||
 | 
					+	sch->qstats.backlog -= skb->len;
 | 
				
			||||||
 | 
					+	return skb;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void esfq_q_destroy(struct esfq_sched_data *q)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	del_timer(&q->perturb_timer);
 | 
				
			||||||
 | 
					+	if(q->ht)
 | 
				
			||||||
 | 
					+		kfree(q->ht);
 | 
				
			||||||
 | 
					+	if(q->dep)
 | 
				
			||||||
 | 
					+		kfree(q->dep);
 | 
				
			||||||
 | 
					+	if(q->next)
 | 
				
			||||||
 | 
					+		kfree(q->next);
 | 
				
			||||||
 | 
					+	if(q->allot)
 | 
				
			||||||
 | 
					+		kfree(q->allot);
 | 
				
			||||||
 | 
					+	if(q->hash)
 | 
				
			||||||
 | 
					+		kfree(q->hash);
 | 
				
			||||||
 | 
					+	if(q->qs)
 | 
				
			||||||
 | 
					+		kfree(q->qs);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void esfq_destroy(struct Qdisc *sch)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct esfq_sched_data *q = qdisc_priv(sch);
 | 
				
			||||||
 | 
					+	esfq_q_destroy(q);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void esfq_reset(struct Qdisc* sch)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct sk_buff *skb;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	while ((skb = esfq_dequeue(sch)) != NULL)
 | 
				
			||||||
 | 
					+		kfree_skb(skb);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void esfq_perturbation(unsigned long arg)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct Qdisc *sch = (struct Qdisc*)arg;
 | 
				
			||||||
 | 
					+	struct esfq_sched_data *q = qdisc_priv(sch);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	q->perturbation = net_random()&0x1F;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (q->perturb_period) {
 | 
				
			||||||
 | 
					+		q->perturb_timer.expires = jiffies + q->perturb_period;
 | 
				
			||||||
 | 
					+		add_timer(&q->perturb_timer);
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static unsigned int esfq_check_hash(unsigned int kind)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	switch (kind) {
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_CTORIGDST:
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_CTORIGSRC:
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_CTREPLDST:
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_CTREPLSRC:
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_CTNATCHG:
 | 
				
			||||||
 | 
					+#ifndef CONFIG_NET_SCH_ESFQ_NFCT
 | 
				
			||||||
 | 
					+	{
 | 
				
			||||||
 | 
					+		if (net_ratelimit())
 | 
				
			||||||
 | 
					+			printk(KERN_WARNING "ESFQ: Conntrack hash types disabled in kernel config. Falling back to classic.\n");
 | 
				
			||||||
 | 
					+		return TCA_SFQ_HASH_CLASSIC;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+#endif
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_CLASSIC:
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_DST:
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_SRC:
 | 
				
			||||||
 | 
					+	case TCA_SFQ_HASH_FWMARK:
 | 
				
			||||||
 | 
					+		return kind;
 | 
				
			||||||
 | 
					+	default:
 | 
				
			||||||
 | 
					+	{
 | 
				
			||||||
 | 
					+		if (net_ratelimit())
 | 
				
			||||||
 | 
					+			printk(KERN_WARNING "ESFQ: Unknown hash type. Falling back to classic.\n");
 | 
				
			||||||
 | 
					+		return TCA_SFQ_HASH_CLASSIC;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int esfq_q_init(struct esfq_sched_data *q, struct nlattr *opt)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct tc_esfq_qopt *ctl = nla_data(opt);
 | 
				
			||||||
 | 
					+	esfq_index p = ~0U/2;
 | 
				
			||||||
 | 
					+	int i;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (opt && opt->nla_len < nla_attr_size(sizeof(*ctl)))
 | 
				
			||||||
 | 
					+		return -EINVAL;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	q->perturbation = 0;
 | 
				
			||||||
 | 
					+	q->hash_kind = TCA_SFQ_HASH_CLASSIC;
 | 
				
			||||||
 | 
					+	q->max_depth = 0;
 | 
				
			||||||
 | 
					+	if (opt == NULL) {
 | 
				
			||||||
 | 
					+		q->perturb_period = 0;
 | 
				
			||||||
 | 
					+		q->hash_divisor = 1024;
 | 
				
			||||||
 | 
					+		q->tail = q->limit = q->depth = 128;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	} else {
 | 
				
			||||||
 | 
					+		struct tc_esfq_qopt *ctl = nla_data(opt);
 | 
				
			||||||
 | 
					+		if (ctl->quantum)
 | 
				
			||||||
 | 
					+			q->quantum = ctl->quantum;
 | 
				
			||||||
 | 
					+		q->perturb_period = ctl->perturb_period*HZ;
 | 
				
			||||||
 | 
					+		q->hash_divisor = ctl->divisor ? : 1024;
 | 
				
			||||||
 | 
					+		q->tail = q->limit = q->depth = ctl->flows ? : 128;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		if ( q->depth > p - 1 )
 | 
				
			||||||
 | 
					+			return -EINVAL;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		if (ctl->limit)
 | 
				
			||||||
 | 
					+			q->limit = min_t(u32, ctl->limit, q->depth);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		if (ctl->hash_kind) {
 | 
				
			||||||
 | 
					+			q->hash_kind = esfq_check_hash(ctl->hash_kind);
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	q->ht = kmalloc(q->hash_divisor*sizeof(esfq_index), GFP_KERNEL);
 | 
				
			||||||
 | 
					+	if (!q->ht)
 | 
				
			||||||
 | 
					+		goto err_case;
 | 
				
			||||||
 | 
					+	q->dep = kmalloc((1+q->depth*2)*sizeof(struct esfq_head), GFP_KERNEL);
 | 
				
			||||||
 | 
					+	if (!q->dep)
 | 
				
			||||||
 | 
					+		goto err_case;
 | 
				
			||||||
 | 
					+	q->next = kmalloc(q->depth*sizeof(esfq_index), GFP_KERNEL);
 | 
				
			||||||
 | 
					+	if (!q->next)
 | 
				
			||||||
 | 
					+		goto err_case;
 | 
				
			||||||
 | 
					+	q->allot = kmalloc(q->depth*sizeof(short), GFP_KERNEL);
 | 
				
			||||||
 | 
					+	if (!q->allot)
 | 
				
			||||||
 | 
					+		goto err_case;
 | 
				
			||||||
 | 
					+	q->hash = kmalloc(q->depth*sizeof(unsigned short), GFP_KERNEL);
 | 
				
			||||||
 | 
					+	if (!q->hash)
 | 
				
			||||||
 | 
					+		goto err_case;
 | 
				
			||||||
 | 
					+	q->qs = kmalloc(q->depth*sizeof(struct sk_buff_head), GFP_KERNEL);
 | 
				
			||||||
 | 
					+	if (!q->qs)
 | 
				
			||||||
 | 
					+		goto err_case;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	for (i=0; i< q->hash_divisor; i++)
 | 
				
			||||||
 | 
					+		q->ht[i] = q->depth;
 | 
				
			||||||
 | 
					+	for (i=0; i<q->depth; i++) {
 | 
				
			||||||
 | 
					+		skb_queue_head_init(&q->qs[i]);
 | 
				
			||||||
 | 
					+		q->dep[i+q->depth].next = i+q->depth;
 | 
				
			||||||
 | 
					+		q->dep[i+q->depth].prev = i+q->depth;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	for (i=0; i<q->depth; i++)
 | 
				
			||||||
 | 
					+		esfq_link(q, i);
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+err_case:
 | 
				
			||||||
 | 
					+	esfq_q_destroy(q);
 | 
				
			||||||
 | 
					+	return -ENOBUFS;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int esfq_init(struct Qdisc *sch, struct nlattr *opt)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct esfq_sched_data *q = qdisc_priv(sch);
 | 
				
			||||||
 | 
					+	int err;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	q->quantum = psched_mtu(qdisc_dev(sch)); /* default */
 | 
				
			||||||
 | 
					+	if ((err = esfq_q_init(q, opt)))
 | 
				
			||||||
 | 
					+		return err;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	init_timer(&q->perturb_timer);
 | 
				
			||||||
 | 
					+	q->perturb_timer.data = (unsigned long)sch;
 | 
				
			||||||
 | 
					+	q->perturb_timer.function = esfq_perturbation;
 | 
				
			||||||
 | 
					+	if (q->perturb_period) {
 | 
				
			||||||
 | 
					+		q->perturb_timer.expires = jiffies + q->perturb_period;
 | 
				
			||||||
 | 
					+		add_timer(&q->perturb_timer);
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int esfq_change(struct Qdisc *sch, struct nlattr *opt)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct esfq_sched_data *q = qdisc_priv(sch);
 | 
				
			||||||
 | 
					+	struct esfq_sched_data new;
 | 
				
			||||||
 | 
					+	struct sk_buff *skb;
 | 
				
			||||||
 | 
					+	int err;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* set up new queue */
 | 
				
			||||||
 | 
					+	memset(&new, 0, sizeof(struct esfq_sched_data));
 | 
				
			||||||
 | 
					+	new.quantum = psched_mtu(qdisc_dev(sch)); /* default */
 | 
				
			||||||
 | 
					+	if ((err = esfq_q_init(&new, opt)))
 | 
				
			||||||
 | 
					+		return err;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* copy all packets from the old queue to the new queue */
 | 
				
			||||||
 | 
					+	sch_tree_lock(sch);
 | 
				
			||||||
 | 
					+	while ((skb = esfq_q_dequeue(q)) != NULL)
 | 
				
			||||||
 | 
					+		esfq_q_enqueue(skb, &new, ESFQ_TAIL);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* clean up the old queue */
 | 
				
			||||||
 | 
					+	esfq_q_destroy(q);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* copy elements of the new queue into the old queue */
 | 
				
			||||||
 | 
					+	q->perturb_period = new.perturb_period;
 | 
				
			||||||
 | 
					+	q->quantum        = new.quantum;
 | 
				
			||||||
 | 
					+	q->limit          = new.limit;
 | 
				
			||||||
 | 
					+	q->depth          = new.depth;
 | 
				
			||||||
 | 
					+	q->hash_divisor   = new.hash_divisor;
 | 
				
			||||||
 | 
					+	q->hash_kind      = new.hash_kind;
 | 
				
			||||||
 | 
					+	q->tail           = new.tail;
 | 
				
			||||||
 | 
					+	q->max_depth      = new.max_depth;
 | 
				
			||||||
 | 
					+	q->ht    = new.ht;
 | 
				
			||||||
 | 
					+	q->dep   = new.dep;
 | 
				
			||||||
 | 
					+	q->next  = new.next;
 | 
				
			||||||
 | 
					+	q->allot = new.allot;
 | 
				
			||||||
 | 
					+	q->hash  = new.hash;
 | 
				
			||||||
 | 
					+	q->qs    = new.qs;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* finish up */
 | 
				
			||||||
 | 
					+	if (q->perturb_period) {
 | 
				
			||||||
 | 
					+		q->perturb_timer.expires = jiffies + q->perturb_period;
 | 
				
			||||||
 | 
					+		add_timer(&q->perturb_timer);
 | 
				
			||||||
 | 
					+	} else {
 | 
				
			||||||
 | 
					+		q->perturbation = 0;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+	sch_tree_unlock(sch);
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int esfq_dump(struct Qdisc *sch, struct sk_buff *skb)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct esfq_sched_data *q = qdisc_priv(sch);
 | 
				
			||||||
 | 
					+	unsigned char *b = skb_tail_pointer(skb);
 | 
				
			||||||
 | 
					+	struct tc_esfq_qopt opt;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	opt.quantum = q->quantum;
 | 
				
			||||||
 | 
					+	opt.perturb_period = q->perturb_period/HZ;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	opt.limit = q->limit;
 | 
				
			||||||
 | 
					+	opt.divisor = q->hash_divisor;
 | 
				
			||||||
 | 
					+	opt.flows = q->depth;
 | 
				
			||||||
 | 
					+	opt.hash_kind = q->hash_kind;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (nla_put(skb, TCA_OPTIONS, sizeof(opt), &opt))
 | 
				
			||||||
 | 
					+		goto nla_put_failure;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return skb->len;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+nla_put_failure:
 | 
				
			||||||
 | 
					+	nlmsg_trim(skb, b);
 | 
				
			||||||
 | 
					+	return -1;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static struct Qdisc_ops esfq_qdisc_ops =
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	.next		=	NULL,
 | 
				
			||||||
 | 
					+	.cl_ops		=	NULL,
 | 
				
			||||||
 | 
					+	.id		=	"esfq",
 | 
				
			||||||
 | 
					+	.priv_size	=	sizeof(struct esfq_sched_data),
 | 
				
			||||||
 | 
					+	.enqueue	=	esfq_enqueue,
 | 
				
			||||||
 | 
					+	.dequeue	=	esfq_dequeue,
 | 
				
			||||||
 | 
					+	.peek		=	esfq_peek,
 | 
				
			||||||
 | 
					+	.drop		=	esfq_drop,
 | 
				
			||||||
 | 
					+	.init		=	esfq_init,
 | 
				
			||||||
 | 
					+	.reset		=	esfq_reset,
 | 
				
			||||||
 | 
					+	.destroy	=	esfq_destroy,
 | 
				
			||||||
 | 
					+	.change		=	esfq_change,
 | 
				
			||||||
 | 
					+	.dump		=	esfq_dump,
 | 
				
			||||||
 | 
					+	.owner		=	THIS_MODULE,
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int __init esfq_module_init(void)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return register_qdisc(&esfq_qdisc_ops);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+static void __exit esfq_module_exit(void)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	unregister_qdisc(&esfq_qdisc_ops);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+module_init(esfq_module_init)
 | 
				
			||||||
 | 
					+module_exit(esfq_module_exit)
 | 
				
			||||||
 | 
					+MODULE_LICENSE("GPL");
 | 
				
			||||||
							
								
								
									
										172
									
								
								target/linux/generic/patches-3.8/621-sched_act_connmark.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								target/linux/generic/patches-3.8/621-sched_act_connmark.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,172 @@
 | 
				
			|||||||
 | 
					--- /dev/null
 | 
				
			||||||
 | 
					+++ b/net/sched/act_connmark.c
 | 
				
			||||||
 | 
					@@ -0,0 +1,137 @@
 | 
				
			||||||
 | 
					+/*
 | 
				
			||||||
 | 
					+ * Copyright (c) 2011 Felix Fietkau <nbd@openwrt.org>
 | 
				
			||||||
 | 
					+ *
 | 
				
			||||||
 | 
					+ * This program is free software; you can redistribute it and/or modify it
 | 
				
			||||||
 | 
					+ * under the terms and conditions of the GNU General Public License,
 | 
				
			||||||
 | 
					+ * version 2, as published by the Free Software Foundation.
 | 
				
			||||||
 | 
					+ *
 | 
				
			||||||
 | 
					+ * This program is distributed in the hope it will be useful, but WITHOUT
 | 
				
			||||||
 | 
					+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
				
			||||||
 | 
					+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | 
				
			||||||
 | 
					+ * more details.
 | 
				
			||||||
 | 
					+ *
 | 
				
			||||||
 | 
					+ * You should have received a copy of the GNU General Public License along with
 | 
				
			||||||
 | 
					+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 | 
				
			||||||
 | 
					+ * Place - Suite 330, Boston, MA 02111-1307 USA.
 | 
				
			||||||
 | 
					+ */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#include <linux/module.h>
 | 
				
			||||||
 | 
					+#include <linux/init.h>
 | 
				
			||||||
 | 
					+#include <linux/kernel.h>
 | 
				
			||||||
 | 
					+#include <linux/skbuff.h>
 | 
				
			||||||
 | 
					+#include <linux/rtnetlink.h>
 | 
				
			||||||
 | 
					+#include <linux/pkt_cls.h>
 | 
				
			||||||
 | 
					+#include <linux/ip.h>
 | 
				
			||||||
 | 
					+#include <linux/ipv6.h>
 | 
				
			||||||
 | 
					+#include <net/netlink.h>
 | 
				
			||||||
 | 
					+#include <net/pkt_sched.h>
 | 
				
			||||||
 | 
					+#include <net/act_api.h>
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#include <net/netfilter/nf_conntrack.h>
 | 
				
			||||||
 | 
					+#include <net/netfilter/nf_conntrack_core.h>
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#define TCA_ACT_CONNMARK	20
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#define CONNMARK_TAB_MASK     3
 | 
				
			||||||
 | 
					+static struct tcf_common *tcf_connmark_ht[CONNMARK_TAB_MASK + 1];
 | 
				
			||||||
 | 
					+static u32 connmark_idx_gen;
 | 
				
			||||||
 | 
					+static DEFINE_RWLOCK(connmark_lock);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static struct tcf_hashinfo connmark_hash_info = {
 | 
				
			||||||
 | 
					+	.htab	=	tcf_connmark_ht,
 | 
				
			||||||
 | 
					+	.hmask	=	CONNMARK_TAB_MASK,
 | 
				
			||||||
 | 
					+	.lock	=	&connmark_lock,
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int tcf_connmark(struct sk_buff *skb, const struct tc_action *a,
 | 
				
			||||||
 | 
					+		       struct tcf_result *res)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct nf_conn *c;
 | 
				
			||||||
 | 
					+	enum ip_conntrack_info ctinfo;
 | 
				
			||||||
 | 
					+	int proto;
 | 
				
			||||||
 | 
					+	int r;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (skb->protocol == htons(ETH_P_IP)) {
 | 
				
			||||||
 | 
					+		if (skb->len < sizeof(struct iphdr))
 | 
				
			||||||
 | 
					+			goto out;
 | 
				
			||||||
 | 
					+		proto = PF_INET;
 | 
				
			||||||
 | 
					+	} else if (skb->protocol == htons(ETH_P_IPV6)) {
 | 
				
			||||||
 | 
					+		if (skb->len < sizeof(struct ipv6hdr))
 | 
				
			||||||
 | 
					+			goto out;
 | 
				
			||||||
 | 
					+		proto = PF_INET6;
 | 
				
			||||||
 | 
					+	} else
 | 
				
			||||||
 | 
					+		goto out;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	r = nf_conntrack_in(dev_net(skb->dev), proto, NF_INET_PRE_ROUTING, skb);
 | 
				
			||||||
 | 
					+	if (r != NF_ACCEPT)
 | 
				
			||||||
 | 
					+		goto out;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	c = nf_ct_get(skb, &ctinfo);
 | 
				
			||||||
 | 
					+	if (!c)
 | 
				
			||||||
 | 
					+		goto out;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	skb->mark = c->mark;
 | 
				
			||||||
 | 
					+	nf_conntrack_put(skb->nfct);
 | 
				
			||||||
 | 
					+	skb->nfct = NULL;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+out:
 | 
				
			||||||
 | 
					+	return TC_ACT_PIPE;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int tcf_connmark_init(struct nlattr *nla, struct nlattr *est,
 | 
				
			||||||
 | 
					+			 struct tc_action *a, int ovr, int bind)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct tcf_common *pc;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	pc = tcf_hash_create(0, est, a, sizeof(*pc), bind,
 | 
				
			||||||
 | 
					+			     &connmark_idx_gen, &connmark_hash_info);
 | 
				
			||||||
 | 
					+	if (IS_ERR(pc))
 | 
				
			||||||
 | 
					+	    return PTR_ERR(pc);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	tcf_hash_insert(pc, &connmark_hash_info);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return ACT_P_CREATED;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline int tcf_connmark_cleanup(struct tc_action *a, int bind)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	if (a->priv)
 | 
				
			||||||
 | 
					+		return tcf_hash_release(a->priv, bind, &connmark_hash_info);
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static inline int tcf_connmark_dump(struct sk_buff *skb, struct tc_action *a,
 | 
				
			||||||
 | 
					+				int bind, int ref)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return skb->len;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static struct tc_action_ops act_connmark_ops = {
 | 
				
			||||||
 | 
					+	.kind		=	"connmark",
 | 
				
			||||||
 | 
					+	.hinfo		=	&connmark_hash_info,
 | 
				
			||||||
 | 
					+	.type		=	TCA_ACT_CONNMARK,
 | 
				
			||||||
 | 
					+	.capab		=	TCA_CAP_NONE,
 | 
				
			||||||
 | 
					+	.owner		=	THIS_MODULE,
 | 
				
			||||||
 | 
					+	.act		=	tcf_connmark,
 | 
				
			||||||
 | 
					+	.dump		=	tcf_connmark_dump,
 | 
				
			||||||
 | 
					+	.cleanup	=	tcf_connmark_cleanup,
 | 
				
			||||||
 | 
					+	.init		=	tcf_connmark_init,
 | 
				
			||||||
 | 
					+	.walk		=	tcf_generic_walker,
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+MODULE_AUTHOR("Felix Fietkau <nbd@openwrt.org>");
 | 
				
			||||||
 | 
					+MODULE_DESCRIPTION("Connection tracking mark restoring");
 | 
				
			||||||
 | 
					+MODULE_LICENSE("GPL");
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static int __init connmark_init_module(void)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return tcf_register_action(&act_connmark_ops);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static void __exit connmark_cleanup_module(void)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	tcf_unregister_action(&act_connmark_ops);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+module_init(connmark_init_module);
 | 
				
			||||||
 | 
					+module_exit(connmark_cleanup_module);
 | 
				
			||||||
 | 
					--- a/net/sched/Kconfig
 | 
				
			||||||
 | 
					+++ b/net/sched/Kconfig
 | 
				
			||||||
 | 
					@@ -670,6 +670,19 @@ config NET_ACT_CSUM
 | 
				
			||||||
 | 
					 	  To compile this code as a module, choose M here: the
 | 
				
			||||||
 | 
					 	  module will be called act_csum.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+config NET_ACT_CONNMARK
 | 
				
			||||||
 | 
					+        tristate "Connection Tracking Marking"
 | 
				
			||||||
 | 
					+        depends on NET_CLS_ACT
 | 
				
			||||||
 | 
					+        depends on NF_CONNTRACK
 | 
				
			||||||
 | 
					+	 depends on NF_CONNTRACK_MARK
 | 
				
			||||||
 | 
					+        ---help---
 | 
				
			||||||
 | 
					+	  Say Y here to restore the connmark from a scheduler action
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	  If unsure, say N.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	  To compile this code as a module, choose M here: the
 | 
				
			||||||
 | 
					+	  module will be called act_connmark.
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 config NET_CLS_IND
 | 
				
			||||||
 | 
					 	bool "Incoming device classification"
 | 
				
			||||||
 | 
					 	depends on NET_CLS_U32 || NET_CLS_FW
 | 
				
			||||||
 | 
					--- a/net/sched/Makefile
 | 
				
			||||||
 | 
					+++ b/net/sched/Makefile
 | 
				
			||||||
 | 
					@@ -16,6 +16,7 @@ obj-$(CONFIG_NET_ACT_PEDIT)	+= act_pedit
 | 
				
			||||||
 | 
					 obj-$(CONFIG_NET_ACT_SIMP)	+= act_simple.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_NET_ACT_SKBEDIT)	+= act_skbedit.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_NET_ACT_CSUM)	+= act_csum.o
 | 
				
			||||||
 | 
					+obj-$(CONFIG_NET_ACT_CONNMARK)	+= act_connmark.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_NET_SCH_FIFO)	+= sch_fifo.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_NET_SCH_CBQ)	+= sch_cbq.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_NET_SCH_HTB)	+= sch_htb.o
 | 
				
			||||||
							
								
								
									
										134
									
								
								target/linux/generic/patches-3.8/630-packet_socket_type.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								target/linux/generic/patches-3.8/630-packet_socket_type.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,134 @@
 | 
				
			|||||||
 | 
					This patch allows the user to specify desired packet types (outgoing,
 | 
				
			||||||
 | 
					broadcast, unicast, etc.) on packet sockets via setsockopt.
 | 
				
			||||||
 | 
					This can reduce the load in situations where only a limited number
 | 
				
			||||||
 | 
					of packet types are necessary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Felix Fietkau <nbd@openwrt.org>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/include/uapi/linux/if_packet.h
 | 
				
			||||||
 | 
					+++ b/include/uapi/linux/if_packet.h
 | 
				
			||||||
 | 
					@@ -29,6 +29,8 @@ struct sockaddr_ll {
 | 
				
			||||||
 | 
					 /* These ones are invisible by user level */
 | 
				
			||||||
 | 
					 #define PACKET_LOOPBACK		5		/* MC/BRD frame looped back */
 | 
				
			||||||
 | 
					 #define PACKET_FASTROUTE	6		/* Fastrouted frame	*/
 | 
				
			||||||
 | 
					+#define PACKET_MASK_ANY		0xffffffff	/* mask for packet type bits */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* Packet socket options */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -51,6 +53,7 @@ struct sockaddr_ll {
 | 
				
			||||||
 | 
					 #define PACKET_TIMESTAMP		17
 | 
				
			||||||
 | 
					 #define PACKET_FANOUT			18
 | 
				
			||||||
 | 
					 #define PACKET_TX_HAS_OFF		19
 | 
				
			||||||
 | 
					+#define PACKET_RECV_TYPE		20
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #define PACKET_FANOUT_HASH		0
 | 
				
			||||||
 | 
					 #define PACKET_FANOUT_LB		1
 | 
				
			||||||
 | 
					--- a/net/packet/af_packet.c
 | 
				
			||||||
 | 
					+++ b/net/packet/af_packet.c
 | 
				
			||||||
 | 
					@@ -1273,6 +1273,7 @@ static int packet_rcv_spkt(struct sk_buf
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	struct sock *sk;
 | 
				
			||||||
 | 
					 	struct sockaddr_pkt *spkt;
 | 
				
			||||||
 | 
					+	struct packet_sock *po;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/*
 | 
				
			||||||
 | 
					 	 *	When we registered the protocol we saved the socket in the data
 | 
				
			||||||
 | 
					@@ -1280,6 +1281,7 @@ static int packet_rcv_spkt(struct sk_buf
 | 
				
			||||||
 | 
					 	 */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	sk = pt->af_packet_priv;
 | 
				
			||||||
 | 
					+	po = pkt_sk(sk);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/*
 | 
				
			||||||
 | 
					 	 *	Yank back the headers [hope the device set this
 | 
				
			||||||
 | 
					@@ -1292,7 +1294,7 @@ static int packet_rcv_spkt(struct sk_buf
 | 
				
			||||||
 | 
					 	 *	so that this procedure is noop.
 | 
				
			||||||
 | 
					 	 */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	if (skb->pkt_type == PACKET_LOOPBACK)
 | 
				
			||||||
 | 
					+	if (!(po->pkt_type & (1 << skb->pkt_type)))
 | 
				
			||||||
 | 
					 		goto out;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (!net_eq(dev_net(dev), sock_net(sk)))
 | 
				
			||||||
 | 
					@@ -1498,12 +1500,12 @@ static int packet_rcv(struct sk_buff *sk
 | 
				
			||||||
 | 
					 	int skb_len = skb->len;
 | 
				
			||||||
 | 
					 	unsigned int snaplen, res;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	if (skb->pkt_type == PACKET_LOOPBACK)
 | 
				
			||||||
 | 
					-		goto drop;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 	sk = pt->af_packet_priv;
 | 
				
			||||||
 | 
					 	po = pkt_sk(sk);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	if (!(po->pkt_type & (1 << skb->pkt_type)))
 | 
				
			||||||
 | 
					+		goto drop;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	if (!net_eq(dev_net(dev), sock_net(sk)))
 | 
				
			||||||
 | 
					 		goto drop;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -1622,12 +1624,12 @@ static int tpacket_rcv(struct sk_buff *s
 | 
				
			||||||
 | 
					 	struct timespec ts;
 | 
				
			||||||
 | 
					 	struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	if (skb->pkt_type == PACKET_LOOPBACK)
 | 
				
			||||||
 | 
					-		goto drop;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 	sk = pt->af_packet_priv;
 | 
				
			||||||
 | 
					 	po = pkt_sk(sk);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	if (!(po->pkt_type & (1 << skb->pkt_type)))
 | 
				
			||||||
 | 
					+		goto drop;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	if (!net_eq(dev_net(dev), sock_net(sk)))
 | 
				
			||||||
 | 
					 		goto drop;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -2537,6 +2539,7 @@ static int packet_create(struct net *net
 | 
				
			||||||
 | 
					 	spin_lock_init(&po->bind_lock);
 | 
				
			||||||
 | 
					 	mutex_init(&po->pg_vec_lock);
 | 
				
			||||||
 | 
					 	po->prot_hook.func = packet_rcv;
 | 
				
			||||||
 | 
					+	po->pkt_type = PACKET_MASK_ANY & ~(1 << PACKET_LOOPBACK);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (sock->type == SOCK_PACKET)
 | 
				
			||||||
 | 
					 		po->prot_hook.func = packet_rcv_spkt;
 | 
				
			||||||
 | 
					@@ -3150,6 +3153,16 @@ packet_setsockopt(struct socket *sock, i
 | 
				
			||||||
 | 
					 		po->tp_tx_has_off = !!val;
 | 
				
			||||||
 | 
					 		return 0;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					+        case PACKET_RECV_TYPE:
 | 
				
			||||||
 | 
					+        {
 | 
				
			||||||
 | 
					+                unsigned int val;
 | 
				
			||||||
 | 
					+                if (optlen != sizeof(val))
 | 
				
			||||||
 | 
					+                        return -EINVAL;
 | 
				
			||||||
 | 
					+                if (copy_from_user(&val, optval, sizeof(val)))
 | 
				
			||||||
 | 
					+                        return -EFAULT;
 | 
				
			||||||
 | 
					+                po->pkt_type = val & ~PACKET_LOOPBACK;
 | 
				
			||||||
 | 
					+                return 0;
 | 
				
			||||||
 | 
					+        }
 | 
				
			||||||
 | 
					 	default:
 | 
				
			||||||
 | 
					 		return -ENOPROTOOPT;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					@@ -3204,6 +3217,13 @@ static int packet_getsockopt(struct sock
 | 
				
			||||||
 | 
					 	case PACKET_VNET_HDR:
 | 
				
			||||||
 | 
					 		val = po->has_vnet_hdr;
 | 
				
			||||||
 | 
					 		break;
 | 
				
			||||||
 | 
					+	case PACKET_RECV_TYPE:
 | 
				
			||||||
 | 
					+		if (len > sizeof(unsigned int))
 | 
				
			||||||
 | 
					+			len = sizeof(unsigned int);
 | 
				
			||||||
 | 
					+		val = po->pkt_type;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		data = &val;
 | 
				
			||||||
 | 
					+		break;
 | 
				
			||||||
 | 
					 	case PACKET_VERSION:
 | 
				
			||||||
 | 
					 		val = po->tp_version;
 | 
				
			||||||
 | 
					 		break;
 | 
				
			||||||
 | 
					--- a/net/packet/internal.h
 | 
				
			||||||
 | 
					+++ b/net/packet/internal.h
 | 
				
			||||||
 | 
					@@ -112,6 +112,7 @@ struct packet_sock {
 | 
				
			||||||
 | 
					 	unsigned int		tp_tx_has_off:1;
 | 
				
			||||||
 | 
					 	unsigned int		tp_tstamp;
 | 
				
			||||||
 | 
					 	struct packet_type	prot_hook ____cacheline_aligned_in_smp;
 | 
				
			||||||
 | 
					+	unsigned int		pkt_type;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static struct packet_sock *pkt_sk(struct sock *sk)
 | 
				
			||||||
@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					--- a/net/bridge/br_input.c
 | 
				
			||||||
 | 
					+++ b/net/bridge/br_input.c
 | 
				
			||||||
 | 
					@@ -75,7 +75,11 @@ int br_handle_frame_finish(struct sk_buf
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	dst = NULL;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	if (is_broadcast_ether_addr(dest))
 | 
				
			||||||
 | 
					+	if (skb->protocol == htons(ETH_P_PAE)) {
 | 
				
			||||||
 | 
					+		skb2 = skb;
 | 
				
			||||||
 | 
					+		/* Do not forward 802.1x/EAP frames */
 | 
				
			||||||
 | 
					+		skb = NULL;
 | 
				
			||||||
 | 
					+	} else if (is_broadcast_ether_addr(dest))
 | 
				
			||||||
 | 
					 		skb2 = skb;
 | 
				
			||||||
 | 
					 	else if (is_multicast_ether_addr(dest)) {
 | 
				
			||||||
 | 
					 		mdst = br_mdb_get(br, skb);
 | 
				
			||||||
@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					--- a/net/bridge/br_input.c
 | 
				
			||||||
 | 
					+++ b/net/bridge/br_input.c
 | 
				
			||||||
 | 
					@@ -62,7 +62,7 @@ int br_handle_frame_finish(struct sk_buf
 | 
				
			||||||
 | 
					 	    br_multicast_rcv(br, p, skb))
 | 
				
			||||||
 | 
					 		goto drop;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	if (p->state == BR_STATE_LEARNING)
 | 
				
			||||||
 | 
					+	if ((p->state == BR_STATE_LEARNING) && skb->protocol != htons(ETH_P_PAE))
 | 
				
			||||||
 | 
					 		goto drop;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	BR_INPUT_SKB_CB(skb)->brdev = br->dev;
 | 
				
			||||||
							
								
								
									
										103
									
								
								target/linux/generic/patches-3.8/642-bridge_port_isolate.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								target/linux/generic/patches-3.8/642-bridge_port_isolate.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,103 @@
 | 
				
			|||||||
 | 
					--- a/net/bridge/br_private.h
 | 
				
			||||||
 | 
					+++ b/net/bridge/br_private.h
 | 
				
			||||||
 | 
					@@ -139,6 +139,7 @@ struct net_bridge_port
 | 
				
			||||||
 | 
					 #define BR_BPDU_GUARD           0x00000002
 | 
				
			||||||
 | 
					 #define BR_ROOT_BLOCK		0x00000004
 | 
				
			||||||
 | 
					 #define BR_MULTICAST_FAST_LEAVE	0x00000008
 | 
				
			||||||
 | 
					+#define BR_ISOLATE_MODE		0x00000010
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
 | 
				
			||||||
 | 
					 	u32				multicast_startup_queries_sent;
 | 
				
			||||||
 | 
					--- a/net/bridge/br_sysfs_if.c
 | 
				
			||||||
 | 
					+++ b/net/bridge/br_sysfs_if.c
 | 
				
			||||||
 | 
					@@ -159,6 +159,22 @@ BRPORT_ATTR_FLAG(hairpin_mode, BR_HAIRPI
 | 
				
			||||||
 | 
					 BRPORT_ATTR_FLAG(bpdu_guard, BR_BPDU_GUARD);
 | 
				
			||||||
 | 
					 BRPORT_ATTR_FLAG(root_block, BR_ROOT_BLOCK);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+static ssize_t show_isolate_mode(struct net_bridge_port *p, char *buf)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	int isolate_mode = (p->flags & BR_ISOLATE_MODE) ? 1 : 0;
 | 
				
			||||||
 | 
					+	return sprintf(buf, "%d\n", isolate_mode);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+static ssize_t store_isolate_mode(struct net_bridge_port *p, unsigned long v)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	if (v)
 | 
				
			||||||
 | 
					+		p->flags |= BR_ISOLATE_MODE;
 | 
				
			||||||
 | 
					+	else
 | 
				
			||||||
 | 
					+		p->flags &= ~BR_ISOLATE_MODE;
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+static BRPORT_ATTR(isolate_mode, S_IRUGO | S_IWUSR,
 | 
				
			||||||
 | 
					+		   show_isolate_mode, store_isolate_mode);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
 | 
				
			||||||
 | 
					 static ssize_t show_multicast_router(struct net_bridge_port *p, char *buf)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					@@ -199,6 +215,7 @@ static const struct brport_attribute *br
 | 
				
			||||||
 | 
					 	&brport_attr_multicast_router,
 | 
				
			||||||
 | 
					 	&brport_attr_multicast_fast_leave,
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					+	&brport_attr_isolate_mode,
 | 
				
			||||||
 | 
					 	NULL
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					--- a/net/bridge/br_input.c
 | 
				
			||||||
 | 
					+++ b/net/bridge/br_input.c
 | 
				
			||||||
 | 
					@@ -95,7 +95,8 @@ int br_handle_frame_finish(struct sk_buf
 | 
				
			||||||
 | 
					 			skb2 = skb;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		br->dev->stats.multicast++;
 | 
				
			||||||
 | 
					-	} else if ((dst = __br_fdb_get(br, dest)) && dst->is_local) {
 | 
				
			||||||
 | 
					+	} else if ((p->flags & BR_ISOLATE_MODE) ||
 | 
				
			||||||
 | 
					+		   ((dst = __br_fdb_get(br, dest)) && dst->is_local)) {
 | 
				
			||||||
 | 
					 		skb2 = skb;
 | 
				
			||||||
 | 
					 		/* Do not forward the packet since it's local. */
 | 
				
			||||||
 | 
					 		skb = NULL;
 | 
				
			||||||
 | 
					--- a/net/bridge/br_forward.c
 | 
				
			||||||
 | 
					+++ b/net/bridge/br_forward.c
 | 
				
			||||||
 | 
					@@ -110,7 +110,7 @@ void br_deliver(const struct net_bridge_
 | 
				
			||||||
 | 
					 /* called with rcu_read_lock */
 | 
				
			||||||
 | 
					 void br_forward(const struct net_bridge_port *to, struct sk_buff *skb, struct sk_buff *skb0)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					-	if (should_deliver(to, skb)) {
 | 
				
			||||||
 | 
					+	if (should_deliver(to, skb) && !(to->flags & BR_ISOLATE_MODE)) {
 | 
				
			||||||
 | 
					 		if (skb0)
 | 
				
			||||||
 | 
					 			deliver_clone(to, skb, __br_forward);
 | 
				
			||||||
 | 
					 		else
 | 
				
			||||||
 | 
					@@ -165,7 +165,8 @@ out:
 | 
				
			||||||
 | 
					 static void br_flood(struct net_bridge *br, struct sk_buff *skb,
 | 
				
			||||||
 | 
					 		     struct sk_buff *skb0,
 | 
				
			||||||
 | 
					 		     void (*__packet_hook)(const struct net_bridge_port *p,
 | 
				
			||||||
 | 
					-					   struct sk_buff *skb))
 | 
				
			||||||
 | 
					+					   struct sk_buff *skb),
 | 
				
			||||||
 | 
					+		     bool forward)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	struct net_bridge_port *p;
 | 
				
			||||||
 | 
					 	struct net_bridge_port *prev;
 | 
				
			||||||
 | 
					@@ -173,6 +174,9 @@ static void br_flood(struct net_bridge *
 | 
				
			||||||
 | 
					 	prev = NULL;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	list_for_each_entry_rcu(p, &br->port_list, list) {
 | 
				
			||||||
 | 
					+		if (forward && (p->flags & BR_ISOLATE_MODE))
 | 
				
			||||||
 | 
					+			continue;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 		prev = maybe_deliver(prev, p, skb, __packet_hook);
 | 
				
			||||||
 | 
					 		if (IS_ERR(prev))
 | 
				
			||||||
 | 
					 			goto out;
 | 
				
			||||||
 | 
					@@ -196,14 +200,14 @@ out:
 | 
				
			||||||
 | 
					 /* called with rcu_read_lock */
 | 
				
			||||||
 | 
					 void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					-	br_flood(br, skb, NULL, __br_deliver);
 | 
				
			||||||
 | 
					+	br_flood(br, skb, NULL, __br_deliver, false);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* called under bridge lock */
 | 
				
			||||||
 | 
					 void br_flood_forward(struct net_bridge *br, struct sk_buff *skb,
 | 
				
			||||||
 | 
					 		      struct sk_buff *skb2)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					-	br_flood(br, skb, skb2, __br_forward);
 | 
				
			||||||
 | 
					+	br_flood(br, skb, skb2, __br_forward, true);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
 | 
				
			||||||
@@ -0,0 +1,107 @@
 | 
				
			|||||||
 | 
					--- a/include/net/addrconf.h
 | 
				
			||||||
 | 
					+++ b/include/net/addrconf.h
 | 
				
			||||||
 | 
					@@ -92,6 +92,12 @@ extern void			addrconf_join_solict(struc
 | 
				
			||||||
 | 
					 extern void			addrconf_leave_solict(struct inet6_dev *idev,
 | 
				
			||||||
 | 
					 					const struct in6_addr *addr);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+extern int			(*ipv6_dev_get_saddr_hook)(struct net *net,
 | 
				
			||||||
 | 
					+						struct net_device *dev,
 | 
				
			||||||
 | 
					+						const struct in6_addr *daddr,
 | 
				
			||||||
 | 
					+						unsigned int srcprefs,
 | 
				
			||||||
 | 
					+						struct in6_addr *saddr);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static inline unsigned long addrconf_timeout_fixup(u32 timeout,
 | 
				
			||||||
 | 
					 						   unsigned int unit)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					--- a/net/bridge/Kconfig
 | 
				
			||||||
 | 
					+++ b/net/bridge/Kconfig
 | 
				
			||||||
 | 
					@@ -6,7 +6,6 @@ config BRIDGE
 | 
				
			||||||
 | 
					 	tristate "802.1d Ethernet Bridging"
 | 
				
			||||||
 | 
					 	select LLC
 | 
				
			||||||
 | 
					 	select STP
 | 
				
			||||||
 | 
					-	depends on IPV6 || IPV6=n
 | 
				
			||||||
 | 
					 	---help---
 | 
				
			||||||
 | 
					 	  If you say Y here, then your Linux box will be able to act as an
 | 
				
			||||||
 | 
					 	  Ethernet bridge, which means that the different Ethernet segments it
 | 
				
			||||||
 | 
					--- a/net/ipv6/Makefile
 | 
				
			||||||
 | 
					+++ b/net/ipv6/Makefile
 | 
				
			||||||
 | 
					@@ -44,3 +44,4 @@ obj-y += addrconf_core.o exthdrs_core.o
 | 
				
			||||||
 | 
					 obj-$(CONFIG_INET) += output_core.o protocol.o $(ipv6-offload)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 obj-$(subst m,y,$(CONFIG_IPV6)) += inet6_hashtables.o
 | 
				
			||||||
 | 
					+obj-$(subst m,y,$(CONFIG_IPV6)) += inet6_stubs.o
 | 
				
			||||||
 | 
					--- a/net/ipv6/addrconf.c
 | 
				
			||||||
 | 
					+++ b/net/ipv6/addrconf.c
 | 
				
			||||||
 | 
					@@ -1246,7 +1246,7 @@ out:
 | 
				
			||||||
 | 
					 	return ret;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-int ipv6_dev_get_saddr(struct net *net, const struct net_device *dst_dev,
 | 
				
			||||||
 | 
					+static int __ipv6_dev_get_saddr(struct net *net, const struct net_device *dst_dev,
 | 
				
			||||||
 | 
					 		       const struct in6_addr *daddr, unsigned int prefs,
 | 
				
			||||||
 | 
					 		       struct in6_addr *saddr)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					@@ -1371,7 +1371,6 @@ try_nextdev:
 | 
				
			||||||
 | 
					 	in6_ifa_put(hiscore->ifa);
 | 
				
			||||||
 | 
					 	return 0;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					-EXPORT_SYMBOL(ipv6_dev_get_saddr);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr,
 | 
				
			||||||
 | 
					 		    unsigned char banned_flags)
 | 
				
			||||||
 | 
					@@ -4949,6 +4948,9 @@ int __init addrconf_init(void)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	ipv6_addr_label_rtnl_register();
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	BUG_ON(ipv6_dev_get_saddr_hook != NULL);
 | 
				
			||||||
 | 
					+	rcu_assign_pointer(ipv6_dev_get_saddr_hook, __ipv6_dev_get_saddr);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	return 0;
 | 
				
			||||||
 | 
					 errout:
 | 
				
			||||||
 | 
					 	rtnl_af_unregister(&inet6_ops);
 | 
				
			||||||
 | 
					@@ -4967,6 +4969,9 @@ void addrconf_cleanup(void)
 | 
				
			||||||
 | 
					 	struct net_device *dev;
 | 
				
			||||||
 | 
					 	int i;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	rcu_assign_pointer(ipv6_dev_get_saddr_hook, NULL);
 | 
				
			||||||
 | 
					+	synchronize_rcu();
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	unregister_netdevice_notifier(&ipv6_dev_notf);
 | 
				
			||||||
 | 
					 	unregister_pernet_subsys(&addrconf_ops);
 | 
				
			||||||
 | 
					 	ipv6_addr_label_cleanup();
 | 
				
			||||||
 | 
					--- /dev/null
 | 
				
			||||||
 | 
					+++ b/net/ipv6/inet6_stubs.c
 | 
				
			||||||
 | 
					@@ -0,0 +1,33 @@
 | 
				
			||||||
 | 
					+/*
 | 
				
			||||||
 | 
					+ *      This program is free software; you can redistribute it and/or
 | 
				
			||||||
 | 
					+ *      modify it under the terms of the GNU General Public License
 | 
				
			||||||
 | 
					+ *      as published by the Free Software Foundation; either version
 | 
				
			||||||
 | 
					+ *      2 of the License, or (at your option) any later version.
 | 
				
			||||||
 | 
					+ */
 | 
				
			||||||
 | 
					+#include <linux/export.h>
 | 
				
			||||||
 | 
					+#include <net/ipv6.h>
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+int (*ipv6_dev_get_saddr_hook)(struct net *net, struct net_device *dev,
 | 
				
			||||||
 | 
					+			const struct in6_addr *daddr, unsigned int srcprefs,
 | 
				
			||||||
 | 
					+			struct in6_addr *saddr);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+EXPORT_SYMBOL(ipv6_dev_get_saddr_hook);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+int ipv6_dev_get_saddr(struct net *net, struct net_device *dst_dev,
 | 
				
			||||||
 | 
					+			const struct in6_addr *daddr, unsigned int prefs,
 | 
				
			||||||
 | 
					+			struct in6_addr *saddr)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	int ret = -EADDRNOTAVAIL;
 | 
				
			||||||
 | 
					+	typeof(ipv6_dev_get_saddr_hook) dev_get_saddr;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	rcu_read_lock();
 | 
				
			||||||
 | 
					+	dev_get_saddr = rcu_dereference(ipv6_dev_get_saddr_hook);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (dev_get_saddr)
 | 
				
			||||||
 | 
					+		ret = dev_get_saddr(net, dst_dev, daddr, prefs, saddr);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	rcu_read_unlock();
 | 
				
			||||||
 | 
					+	return ret;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+EXPORT_SYMBOL(ipv6_dev_get_saddr);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
@@ -0,0 +1,146 @@
 | 
				
			|||||||
 | 
					--- a/net/bridge/br_forward.c
 | 
				
			||||||
 | 
					+++ b/net/bridge/br_forward.c
 | 
				
			||||||
 | 
					@@ -56,7 +56,7 @@ int br_dev_queue_push_xmit(struct sk_buf
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 int br_forward_finish(struct sk_buff *skb)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					-	return NF_HOOK(NFPROTO_BRIDGE, NF_BR_POST_ROUTING, skb, NULL, skb->dev,
 | 
				
			||||||
 | 
					+	return BR_HOOK(NFPROTO_BRIDGE, NF_BR_POST_ROUTING, skb, NULL, skb->dev,
 | 
				
			||||||
 | 
					 		       br_dev_queue_push_xmit);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					@@ -75,7 +75,7 @@ static void __br_deliver(const struct ne
 | 
				
			||||||
 | 
					 		return;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev,
 | 
				
			||||||
 | 
					+	BR_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev,
 | 
				
			||||||
 | 
					 		br_forward_finish);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -92,7 +92,7 @@ static void __br_forward(const struct ne
 | 
				
			||||||
 | 
					 	skb->dev = to->dev;
 | 
				
			||||||
 | 
					 	skb_forward_csum(skb);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	NF_HOOK(NFPROTO_BRIDGE, NF_BR_FORWARD, skb, indev, skb->dev,
 | 
				
			||||||
 | 
					+	BR_HOOK(NFPROTO_BRIDGE, NF_BR_FORWARD, skb, indev, skb->dev,
 | 
				
			||||||
 | 
					 		br_forward_finish);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					--- a/net/bridge/br_input.c
 | 
				
			||||||
 | 
					+++ b/net/bridge/br_input.c
 | 
				
			||||||
 | 
					@@ -37,7 +37,7 @@ static int br_pass_frame_up(struct sk_bu
 | 
				
			||||||
 | 
					 	indev = skb->dev;
 | 
				
			||||||
 | 
					 	skb->dev = brdev;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	return NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL,
 | 
				
			||||||
 | 
					+	return BR_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL,
 | 
				
			||||||
 | 
					 		       netif_receive_skb);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -184,7 +184,7 @@ rx_handler_result_t br_handle_frame(stru
 | 
				
			||||||
 | 
					 		}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 		/* Deliver packet to local host only */
 | 
				
			||||||
 | 
					-		if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN, skb, skb->dev,
 | 
				
			||||||
 | 
					+		if (BR_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN, skb, skb->dev,
 | 
				
			||||||
 | 
					 			    NULL, br_handle_local_finish)) {
 | 
				
			||||||
 | 
					 			return RX_HANDLER_CONSUMED; /* consumed by filter */
 | 
				
			||||||
 | 
					 		} else {
 | 
				
			||||||
 | 
					@@ -209,7 +209,7 @@ forward:
 | 
				
			||||||
 | 
					 		if (ether_addr_equal(p->br->dev->dev_addr, dest))
 | 
				
			||||||
 | 
					 			skb->pkt_type = PACKET_HOST;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-		NF_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
 | 
				
			||||||
 | 
					+		BR_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
 | 
				
			||||||
 | 
					 			br_handle_frame_finish);
 | 
				
			||||||
 | 
					 		break;
 | 
				
			||||||
 | 
					 	default:
 | 
				
			||||||
 | 
					--- a/net/bridge/br_multicast.c
 | 
				
			||||||
 | 
					+++ b/net/bridge/br_multicast.c
 | 
				
			||||||
 | 
					@@ -772,7 +772,7 @@ static void __br_multicast_send_query(st
 | 
				
			||||||
 | 
					 	if (port) {
 | 
				
			||||||
 | 
					 		__skb_push(skb, sizeof(struct ethhdr));
 | 
				
			||||||
 | 
					 		skb->dev = port->dev;
 | 
				
			||||||
 | 
					-		NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev,
 | 
				
			||||||
 | 
					+		BR_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev,
 | 
				
			||||||
 | 
					 			dev_queue_xmit);
 | 
				
			||||||
 | 
					 	} else
 | 
				
			||||||
 | 
					 		netif_rx(skb);
 | 
				
			||||||
 | 
					--- a/net/bridge/br_netfilter.c
 | 
				
			||||||
 | 
					+++ b/net/bridge/br_netfilter.c
 | 
				
			||||||
 | 
					@@ -73,6 +73,15 @@ static int brnf_pass_vlan_indev __read_m
 | 
				
			||||||
 | 
					 #define IS_ARP(skb) \
 | 
				
			||||||
 | 
					 	(!vlan_tx_tag_present(skb) && skb->protocol == htons(ETH_P_ARP))
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+int brnf_call_ebtables __read_mostly = 0;
 | 
				
			||||||
 | 
					+EXPORT_SYMBOL_GPL(brnf_call_ebtables);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+bool br_netfilter_run_hooks(void)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return brnf_call_iptables | brnf_call_ip6tables | brnf_call_arptables |
 | 
				
			||||||
 | 
					+	       brnf_call_ebtables;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static inline __be16 vlan_proto(const struct sk_buff *skb)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	if (vlan_tx_tag_present(skb))
 | 
				
			||||||
 | 
					--- a/net/bridge/br_private.h
 | 
				
			||||||
 | 
					+++ b/net/bridge/br_private.h
 | 
				
			||||||
 | 
					@@ -531,15 +531,29 @@ static inline bool br_multicast_is_route
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* br_netfilter.c */
 | 
				
			||||||
 | 
					 #ifdef CONFIG_BRIDGE_NETFILTER
 | 
				
			||||||
 | 
					+extern int brnf_call_ebtables;
 | 
				
			||||||
 | 
					 extern int br_netfilter_init(void);
 | 
				
			||||||
 | 
					 extern void br_netfilter_fini(void);
 | 
				
			||||||
 | 
					 extern void br_netfilter_rtable_init(struct net_bridge *);
 | 
				
			||||||
 | 
					+extern bool br_netfilter_run_hooks(void);
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					 #define br_netfilter_init()	(0)
 | 
				
			||||||
 | 
					 #define br_netfilter_fini()	do { } while(0)
 | 
				
			||||||
 | 
					 #define br_netfilter_rtable_init(x)
 | 
				
			||||||
 | 
					+#define br_netfilter_run_hooks()	false
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+static inline int
 | 
				
			||||||
 | 
					+BR_HOOK(uint8_t pf, unsigned int hook, struct sk_buff *skb,
 | 
				
			||||||
 | 
					+	struct net_device *in, struct net_device *out,
 | 
				
			||||||
 | 
					+	int (*okfn)(struct sk_buff *))
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	if (!br_netfilter_run_hooks())
 | 
				
			||||||
 | 
					+		return okfn(skb);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return NF_HOOK(pf, hook, skb, in, out, okfn);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 /* br_stp.c */
 | 
				
			||||||
 | 
					 extern void br_log_state(const struct net_bridge_port *p);
 | 
				
			||||||
 | 
					 extern struct net_bridge_port *br_get_port(struct net_bridge *br,
 | 
				
			||||||
 | 
					--- a/net/bridge/br_stp_bpdu.c
 | 
				
			||||||
 | 
					+++ b/net/bridge/br_stp_bpdu.c
 | 
				
			||||||
 | 
					@@ -52,7 +52,7 @@ static void br_send_bpdu(struct net_brid
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	skb_reset_mac_header(skb);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev,
 | 
				
			||||||
 | 
					+	BR_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev,
 | 
				
			||||||
 | 
					 		dev_queue_xmit);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					--- a/net/bridge/netfilter/ebtables.c
 | 
				
			||||||
 | 
					+++ b/net/bridge/netfilter/ebtables.c
 | 
				
			||||||
 | 
					@@ -2403,11 +2403,13 @@ static int __init ebtables_init(void)
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	printk(KERN_INFO "Ebtables v2.0 registered\n");
 | 
				
			||||||
 | 
					+	brnf_call_ebtables = 1;
 | 
				
			||||||
 | 
					 	return 0;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static void __exit ebtables_fini(void)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					+	brnf_call_ebtables = 0;
 | 
				
			||||||
 | 
					 	nf_unregister_sockopt(&ebt_sockopts);
 | 
				
			||||||
 | 
					 	xt_unregister_target(&ebt_standard_target);
 | 
				
			||||||
 | 
					 	printk(KERN_INFO "Ebtables v2.0 unregistered\n");
 | 
				
			||||||
							
								
								
									
										20
									
								
								target/linux/generic/patches-3.8/650-pppoe_header_pad.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								target/linux/generic/patches-3.8/650-pppoe_header_pad.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					--- a/drivers/net/ppp/pppoe.c
 | 
				
			||||||
 | 
					+++ b/drivers/net/ppp/pppoe.c
 | 
				
			||||||
 | 
					@@ -850,7 +850,7 @@ static int pppoe_sendmsg(struct kiocb *i
 | 
				
			||||||
 | 
					 		goto end;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	skb = sock_wmalloc(sk, total_len + dev->hard_header_len + 32,
 | 
				
			||||||
 | 
					+	skb = sock_wmalloc(sk, total_len + dev->hard_header_len + 32 + NET_SKB_PAD,
 | 
				
			||||||
 | 
					 			   0, GFP_KERNEL);
 | 
				
			||||||
 | 
					 	if (!skb) {
 | 
				
			||||||
 | 
					 		error = -ENOMEM;
 | 
				
			||||||
 | 
					@@ -858,7 +858,7 @@ static int pppoe_sendmsg(struct kiocb *i
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	/* Reserve space for headers. */
 | 
				
			||||||
 | 
					-	skb_reserve(skb, dev->hard_header_len);
 | 
				
			||||||
 | 
					+	skb_reserve(skb, dev->hard_header_len + NET_SKB_PAD);
 | 
				
			||||||
 | 
					 	skb_reset_network_header(skb);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	skb->dev = dev;
 | 
				
			||||||
@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					--- a/include/linux/netdevice.h
 | 
				
			||||||
 | 
					+++ b/include/linux/netdevice.h
 | 
				
			||||||
 | 
					@@ -134,7 +134,7 @@ static inline bool dev_xmit_complete(int
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #if defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)
 | 
				
			||||||
 | 
					-# if defined(CONFIG_MAC80211_MESH)
 | 
				
			||||||
 | 
					+# if 1 || defined(CONFIG_MAC80211_MESH)
 | 
				
			||||||
 | 
					 #  define LL_MAX_HEADER 128
 | 
				
			||||||
 | 
					 # else
 | 
				
			||||||
 | 
					 #  define LL_MAX_HEADER 96
 | 
				
			||||||
@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					--- a/include/uapi/linux/atm.h
 | 
				
			||||||
 | 
					+++ b/include/uapi/linux/atm.h
 | 
				
			||||||
 | 
					@@ -139,6 +139,9 @@ struct atm_trafprm {
 | 
				
			||||||
 | 
					 	int		min_pcr;	/* minimum PCR in cells per second */
 | 
				
			||||||
 | 
					 	int		max_cdv;	/* maximum CDV in microseconds */
 | 
				
			||||||
 | 
					 	int		max_sdu;	/* maximum SDU in bytes */
 | 
				
			||||||
 | 
					+	int		scr;		/* sustained rate in cells per second */
 | 
				
			||||||
 | 
					+	int		mbs;		/* maximum burst size (MBS) in cells */
 | 
				
			||||||
 | 
					+	int		cdv;		/* Cell delay varition */
 | 
				
			||||||
 | 
					         /* extra params for ABR */
 | 
				
			||||||
 | 
					         unsigned int 	icr;         	/* Initial Cell Rate (24-bit) */
 | 
				
			||||||
 | 
					         unsigned int	tbe;		/* Transient Buffer Exposure (24-bit) */ 
 | 
				
			||||||
@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					--- a/net/netlink/af_netlink.c
 | 
				
			||||||
 | 
					+++ b/net/netlink/af_netlink.c
 | 
				
			||||||
 | 
					@@ -898,25 +898,7 @@ void netlink_detachskb(struct sock *sk,
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static struct sk_buff *netlink_trim(struct sk_buff *skb, gfp_t allocation)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					-	int delta;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 	skb_orphan(skb);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	delta = skb->end - skb->tail;
 | 
				
			||||||
 | 
					-	if (delta * 2 < skb->truesize)
 | 
				
			||||||
 | 
					-		return skb;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	if (skb_shared(skb)) {
 | 
				
			||||||
 | 
					-		struct sk_buff *nskb = skb_clone(skb, allocation);
 | 
				
			||||||
 | 
					-		if (!nskb)
 | 
				
			||||||
 | 
					-			return skb;
 | 
				
			||||||
 | 
					-		consume_skb(skb);
 | 
				
			||||||
 | 
					-		skb = nskb;
 | 
				
			||||||
 | 
					-	}
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	if (!pskb_expand_head(skb, 0, -delta, allocation))
 | 
				
			||||||
 | 
					-		skb->truesize -= delta;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 	return skb;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
							
								
								
									
										11
									
								
								target/linux/generic/patches-3.8/655-increase_skb_pad.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								target/linux/generic/patches-3.8/655-increase_skb_pad.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					--- a/include/linux/skbuff.h
 | 
				
			||||||
 | 
					+++ b/include/linux/skbuff.h
 | 
				
			||||||
 | 
					@@ -1722,7 +1722,7 @@ static inline int pskb_network_may_pull(
 | 
				
			||||||
 | 
					  * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					 #ifndef NET_SKB_PAD
 | 
				
			||||||
 | 
					-#define NET_SKB_PAD	max(32, L1_CACHE_BYTES)
 | 
				
			||||||
 | 
					+#define NET_SKB_PAD	max(48, L1_CACHE_BYTES)
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user