rebase and nuke patches
This commit is contained in:
		
							parent
							
								
									cbc61c988b
								
							
						
					
					
						commit
						123d535ad8
					
				| @ -1,53 +0,0 @@ | |||||||
| Improve our reboot handling for compatibility with Windows. Upstream in .38? |  | ||||||
| 
 |  | ||||||
| diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
 |  | ||||||
| index c495aa8..c770e66 100644
 |  | ||||||
| --- a/arch/x86/kernel/reboot.c
 |  | ||||||
| +++ b/arch/x86/kernel/reboot.c
 |  | ||||||
| @@ -34,7 +34,7 @@ EXPORT_SYMBOL(pm_power_off);
 |  | ||||||
|   |  | ||||||
|  static const struct desc_ptr no_idt = {}; |  | ||||||
|  static int reboot_mode; |  | ||||||
| -enum reboot_type reboot_type = BOOT_KBD;
 |  | ||||||
| +enum reboot_type reboot_type = BOOT_ACPI;
 |  | ||||||
|  int reboot_force; |  | ||||||
|   |  | ||||||
|  #if defined(CONFIG_X86_32) && defined(CONFIG_SMP) |  | ||||||
| @@ -538,9 +538,23 @@ void __attribute__((weak)) mach_reboot_fixups(void)
 |  | ||||||
|  { |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| +/*
 |  | ||||||
| + * Windows does the following on reboot:
 |  | ||||||
| + * 1) If the FADT has the ACPI reboot register flag set, try it
 |  | ||||||
| + * 2) If still alive, write to the keyboard controller
 |  | ||||||
| + * 3) If still alive, write to the ACPI reboot register again
 |  | ||||||
| + * 4) If still alive, write to the keyboard controller again
 |  | ||||||
| + *
 |  | ||||||
| + * If the machine is still alive at this stage, it gives up. We default to
 |  | ||||||
| + * following the same pattern, except that if we're still alive after (4) we'll
 |  | ||||||
| + * try to force a triple fault and then cycle between hitting the keyboard
 |  | ||||||
| + * controller and doing that
 |  | ||||||
| + */
 |  | ||||||
|  static void native_machine_emergency_restart(void) |  | ||||||
|  { |  | ||||||
|  	int i; |  | ||||||
| +	int attempt = 0;
 |  | ||||||
| +	int orig_reboot_type = reboot_type;
 |  | ||||||
|   |  | ||||||
|  	if (reboot_emergency) |  | ||||||
|  		emergency_vmx_disable_all(); |  | ||||||
| @@ -562,6 +576,13 @@ static void native_machine_emergency_restart(void)
 |  | ||||||
|  				outb(0xfe, 0x64); /* pulse reset low */ |  | ||||||
|  				udelay(50); |  | ||||||
|  			} |  | ||||||
| +			if (attempt == 0 && orig_reboot_type == BOOT_ACPI) {
 |  | ||||||
| +				attempt = 1;
 |  | ||||||
| +				reboot_type = BOOT_ACPI;
 |  | ||||||
| +			} else {
 |  | ||||||
| +				reboot_type = BOOT_TRIPLE;
 |  | ||||||
| +			}
 |  | ||||||
| +			break;
 |  | ||||||
|   |  | ||||||
|  		case BOOT_TRIPLE: |  | ||||||
|  			load_idt(&no_idt); |  | ||||||
| @ -99,9 +99,9 @@ index baa25ad..abc5bd7 100644 | |||||||
| --- a/drivers/hid/hid-core.c
 | --- a/drivers/hid/hid-core.c
 | ||||||
| +++ b/drivers/hid/hid-core.c
 | +++ b/drivers/hid/hid-core.c
 | ||||||
| @@ -1244,8 +1244,6 @@ static const struct hid_device_id hid_blacklist[] = {
 | @@ -1244,8 +1244,6 @@ static const struct hid_device_id hid_blacklist[] = {
 | ||||||
|  	{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) }, |  | ||||||
|  	{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) }, |  	{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) }, | ||||||
|  	{ HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) }, |  	{ HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) }, | ||||||
|  |  	{ HID_USB_DEVICE(USB_VENDOR_ID_ACTIONSTAR, USB_DEVICE_ID_ACTIONSTAR_1011) }, | ||||||
| -	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
 | -	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
 | ||||||
| -	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
 | -	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
 | ||||||
|  	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) }, |  	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) }, | ||||||
|  | |||||||
| @ -1,37 +0,0 @@ | |||||||
| From: Andy Ross <andy.ross@windriver.com> |  | ||||||
| Date: Mon, 9 May 2011 23:11:16 +0000 (-0700) |  | ||||||
| Subject: Bluetooth: Device ids for ath3k on Pegatron Lucid tablets |  | ||||||
| X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fpadovan%2Fbluetooth-next-2.6.git;a=commitdiff_plain;h=2a7bccccdb9604a717c2128a931f022267d35629 |  | ||||||
| 
 |  | ||||||
| Bluetooth: Device ids for ath3k on Pegatron Lucid tablets |  | ||||||
| 
 |  | ||||||
| New ath3k device IDs used on the Pegatron Lucid (ExoPC and WeTab) units. |  | ||||||
| 
 |  | ||||||
| Signed-off-by: Andy Ross <andy.ross@windriver.com> |  | ||||||
| Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi> |  | ||||||
| ---
 |  | ||||||
| 
 |  | ||||||
| diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
 |  | ||||||
| index 695d441..6bacef3 100644
 |  | ||||||
| --- a/drivers/bluetooth/ath3k.c
 |  | ||||||
| +++ b/drivers/bluetooth/ath3k.c
 |  | ||||||
| @@ -62,6 +62,7 @@ static struct usb_device_id ath3k_table[] = {
 |  | ||||||
|   |  | ||||||
|  	/* Atheros AR3011 with sflash firmware*/ |  | ||||||
|  	{ USB_DEVICE(0x0CF3, 0x3002) }, |  | ||||||
| +	{ USB_DEVICE(0x13d3, 0x3304) },
 |  | ||||||
|   |  | ||||||
|  	/* Atheros AR9285 Malbec with sflash firmware */ |  | ||||||
|  	{ USB_DEVICE(0x03F0, 0x311D) }, |  | ||||||
| diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
 |  | ||||||
| index 762a510..c2de895 100644
 |  | ||||||
| --- a/drivers/bluetooth/btusb.c
 |  | ||||||
| +++ b/drivers/bluetooth/btusb.c
 |  | ||||||
| @@ -104,6 +104,7 @@ static struct usb_device_id blacklist_table[] = {
 |  | ||||||
|   |  | ||||||
|  	/* Atheros 3011 with sflash firmware */ |  | ||||||
|  	{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE }, |  | ||||||
| +	{ USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE },
 |  | ||||||
|   |  | ||||||
|  	/* Atheros AR9285 Malbec with sflash firmware */ |  | ||||||
|  	{ USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE }, |  | ||||||
| @ -1,23 +1,18 @@ | |||||||
|  drivers/gpu/drm/i915/intel_display.c |    2 -- |  | ||||||
|  1 files changed, 0 insertions(+), 2 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
 |  | ||||||
| index 990f065..171a797 100644
 |  | ||||||
| --- a/drivers/gpu/drm/i915/intel_display.c
 | --- a/drivers/gpu/drm/i915/intel_display.c
 | ||||||
| +++ b/drivers/gpu/drm/i915/intel_display.c
 | +++ b/drivers/gpu/drm/i915/intel_display.c
 | ||||||
| @@ -4568,7 +4568,6 @@ void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
 | @@ -5821,7 +5821,6 @@ void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
 | ||||||
|  				    struct drm_connector *connector, int dpms_mode) |  				    struct intel_load_detect_pipe *old) | ||||||
|  { |  { | ||||||
|  	struct drm_encoder *encoder = &intel_encoder->base; |  	struct drm_encoder *encoder = &intel_encoder->base; | ||||||
| -	struct drm_device *dev = encoder->dev;
 | -	struct drm_device *dev = encoder->dev;
 | ||||||
|  	struct drm_crtc *crtc = encoder->crtc; |  	struct drm_crtc *crtc = encoder->crtc; | ||||||
|  	struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; |  	struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; | ||||||
|  	struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; |  	struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | ||||||
| @@ -4578,7 +4577,6 @@ void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
 | @@ -5832,7 +5831,6 @@ void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
 | ||||||
|  		connector->encoder = NULL; |  | ||||||
|  		intel_encoder->load_detect_temp = false; |  | ||||||
|  		crtc->enabled = drm_helper_crtc_in_use(crtc); |  | ||||||
| -		drm_helper_disable_unused_functions(dev);
 |  | ||||||
|  	} |  | ||||||
|   |   | ||||||
|  	/* Switch crtc and encoder back off if necessary */ |  	if (old->load_detect_temp) { | ||||||
|  |  		connector->encoder = NULL; | ||||||
|  | -		drm_helper_disable_unused_functions(dev);
 | ||||||
|  |   | ||||||
|  |  		if (old->release_fb) | ||||||
|  |  			old->release_fb->funcs->destroy(old->release_fb); | ||||||
|  | |||||||
| @ -1,80 +0,0 @@ | |||||||
| From: Benjamin Tissoires <benjamin.tissoires@enac.fr> |  | ||||||
| Date: Thu, 19 May 2011 09:37:29 +0000 (+0200) |  | ||||||
| Subject: HID: hid-multitouch: add support for Elo TouchSystems 2515 IntelliTouch Plus |  | ||||||
| X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fjikos%2Fhid.git;a=commitdiff_plain;h=c04abeeff9d76a703cac1e6d312853b0fc8136f5 |  | ||||||
| 
 |  | ||||||
| HID: hid-multitouch: add support for Elo TouchSystems 2515 IntelliTouch Plus |  | ||||||
| 
 |  | ||||||
| This patch adds support for Elo TouchSystems 2515 IntelliTouch Plus |  | ||||||
| that can be found in Lenovo A700 all-in-one. |  | ||||||
| 
 |  | ||||||
| Signed-off-by: Benjamin Tissoires <benjamin.tissoires@enac.fr> |  | ||||||
| Tested-by: Bastien Nocera <hadess@hadess.net> |  | ||||||
| Signed-off-by: Jiri Kosina <jkosina@suse.cz> |  | ||||||
| 
 |  | ||||||
| --- linux-2.6.39.x86_64/drivers/hid/Kconfig	2011-05-19 00:06:34.000000000 -0400
 |  | ||||||
| +++ linux-2.6.39.x86_64/drivers/hid/Kconfig	2011-05-24 10:17:13.007752208 -0400
 |  | ||||||
| @@ -321,6 +321,7 @@
 |  | ||||||
|   |  | ||||||
|  	  Say Y here if you have one of the following devices: |  | ||||||
|  	  - Cypress TrueTouch panels |  | ||||||
| +	  - Elo TouchSystems IntelliTouch Plus panels
 |  | ||||||
|  	  - Hanvon dual touch panels |  | ||||||
|  	  - IrTouch Infrared USB panels |  | ||||||
|  	  - Pixcir dual touch panels |  | ||||||
| --- linux-2.6.39.x86_64/drivers/hid/hid-core.c	2011-05-24 10:14:17.000000000 -0400
 |  | ||||||
| +++ linux-2.6.39.x86_64/drivers/hid/hid-core.c	2011-05-24 10:17:47.418905357 -0400
 |  | ||||||
| @@ -1367,6 +1367,7 @@
 |  | ||||||
|  	{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH3) }, |  | ||||||
|  	{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH4) }, |  | ||||||
|  	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) }, |  | ||||||
| +	{ HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2515) },
 |  | ||||||
|  	{ HID_USB_DEVICE(USB_VENDOR_ID_EMS, USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II) }, |  | ||||||
|  	{ HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, |  | ||||||
|  	{ HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) }, |  | ||||||
| --- linux-2.6.39.x86_64/drivers/hid/hid-ids.h	2011-05-24 10:14:17.000000000 -0400
 |  | ||||||
| +++ linux-2.6.39.x86_64/drivers/hid/hid-ids.h	2011-05-24 10:19:25.946345418 -0400
 |  | ||||||
| @@ -223,6 +223,7 @@
 |  | ||||||
|  #define USB_VENDOR_ID_DREAM_CHEEKY	0x1d34 |  | ||||||
|   |  | ||||||
|  #define USB_VENDOR_ID_ELO		0x04E7 |  | ||||||
| +#define USB_DEVICE_ID_ELO_TS2515	0x0022
 |  | ||||||
|  #define USB_DEVICE_ID_ELO_TS2700	0x0020 |  | ||||||
|   |  | ||||||
|  #define USB_VENDOR_ID_EMS		0x2006 |  | ||||||
| --- linux-2.6.39.x86_64/drivers/hid/hid-multitouch.c	2011-05-19 00:06:34.000000000 -0400
 |  | ||||||
| +++ linux-2.6.39.x86_64/drivers/hid/hid-multitouch.c	2011-05-24 10:22:32.505183658 -0400
 |  | ||||||
| @@ -78,6 +78,7 @@
 |  | ||||||
|  #define MT_CLS_DUAL_INRANGE_CONTACTNUMBER	3 |  | ||||||
|  #define MT_CLS_CYPRESS				4 |  | ||||||
|  #define MT_CLS_EGALAX				5 |  | ||||||
| +#define MT_CLS_DUAL_NSMU_CONTACTID		6
 |  | ||||||
|   |  | ||||||
|  /* |  | ||||||
|   * these device-dependent functions determine what slot corresponds |  | ||||||
| @@ -136,6 +137,13 @@
 |  | ||||||
|  		.sn_move = 4096, |  | ||||||
|  		.sn_pressure = 32, |  | ||||||
|  	}, |  | ||||||
| +
 |  | ||||||
| +	{ .name = MT_CLS_DUAL_NSMU_CONTACTID,
 |  | ||||||
| +		.quirks = MT_QUIRK_NOT_SEEN_MEANS_UP |
 |  | ||||||
| +			MT_QUIRK_SLOT_IS_CONTACTID,
 |  | ||||||
| +		.maxcontacts = 2
 |  | ||||||
| +	},
 |  | ||||||
| +
 |  | ||||||
|  	{ } |  | ||||||
|  }; |  | ||||||
|   |  | ||||||
| @@ -493,6 +501,11 @@
 |  | ||||||
|  		HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, |  | ||||||
|  			USB_DEVICE_ID_CYPRESS_TRUETOUCH) }, |  | ||||||
|   |  | ||||||
| +	/* Elo TouchSystems IntelliTouch Plus panel */
 |  | ||||||
| +	{ .driver_data = MT_CLS_DUAL_NSMU_CONTACTID,
 |  | ||||||
| +		HID_USB_DEVICE(USB_VENDOR_ID_ELO,
 |  | ||||||
| +			USB_DEVICE_ID_ELO_TS2515) },
 |  | ||||||
| +
 |  | ||||||
|  	/* GeneralTouch panel */ |  | ||||||
|  	{ .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, |  | ||||||
|  		HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, |  | ||||||
							
								
								
									
										18
									
								
								kernel.spec
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								kernel.spec
									
									
									
									
									
								
							| @ -623,8 +623,6 @@ Patch150: linux-2.6.29-sparc-IOC_TYPECHECK.patch | |||||||
| Patch160: linux-2.6-32bit-mmap-exec-randomization.patch | Patch160: linux-2.6-32bit-mmap-exec-randomization.patch | ||||||
| Patch161: linux-2.6-i386-nx-emulation.patch | Patch161: linux-2.6-i386-nx-emulation.patch | ||||||
| 
 | 
 | ||||||
| Patch170: tmpfs-implement-generic-xattr-support.patch |  | ||||||
| 
 |  | ||||||
| Patch200: linux-2.6-debug-sizeof-structs.patch | Patch200: linux-2.6-debug-sizeof-structs.patch | ||||||
| Patch202: linux-2.6-debug-taint-vm.patch | Patch202: linux-2.6-debug-taint-vm.patch | ||||||
| Patch203: linux-2.6-debug-vm-would-have-oomkilled.patch | Patch203: linux-2.6-debug-vm-would-have-oomkilled.patch | ||||||
| @ -706,8 +704,6 @@ Patch12016: disable-i8042-check-on-apple-mac.patch | |||||||
| 
 | 
 | ||||||
| Patch12018: neuter_intel_microcode_load.patch | Patch12018: neuter_intel_microcode_load.patch | ||||||
| 
 | 
 | ||||||
| Patch12200: acpi_reboot.patch |  | ||||||
| 
 |  | ||||||
| # Runtime power management | # Runtime power management | ||||||
| Patch12203: linux-2.6-usb-pci-autosuspend.patch | Patch12203: linux-2.6-usb-pci-autosuspend.patch | ||||||
| Patch12204: linux-2.6-enable-more-pci-autosuspend.patch | Patch12204: linux-2.6-enable-more-pci-autosuspend.patch | ||||||
| @ -715,14 +711,10 @@ Patch12205: runtime_pm_fixups.patch | |||||||
| 
 | 
 | ||||||
| Patch12303: dmar-disable-when-ricoh-multifunction.patch | Patch12303: dmar-disable-when-ricoh-multifunction.patch | ||||||
| 
 | 
 | ||||||
| Patch12400: mm-vmscan-correct-use-pgdat_balanced-in-sleeping_prematurely.patch |  | ||||||
| Patch12401: mm-slub-do-not-wake-kswapd-for-slubs-speculative-high-order-allocations.patch | Patch12401: mm-slub-do-not-wake-kswapd-for-slubs-speculative-high-order-allocations.patch | ||||||
| Patch12402: mm-slub-do-not-take-expensive-steps-for-slubs-speculative-high-order-allocations.patch | Patch12402: mm-slub-do-not-take-expensive-steps-for-slubs-speculative-high-order-allocations.patch | ||||||
| Patch12403: mm-vmscan-if-kswapd-has-been-running-too-long-allow-it-to-sleep.patch | Patch12403: mm-vmscan-if-kswapd-has-been-running-too-long-allow-it-to-sleep.patch | ||||||
| 
 | 
 | ||||||
| Patch12410: hid-multitouch-add-support-for-elo-touchsystems.patch |  | ||||||
| Patch12411: bluetooth-device-ids-for-ath3k-on-pegatron-lucid-tablets.patch |  | ||||||
| 
 |  | ||||||
| %endif | %endif | ||||||
| 
 | 
 | ||||||
| BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root | BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root | ||||||
| @ -1181,13 +1173,12 @@ ApplyPatch linux-2.6.29-sparc-IOC_TYPECHECK.patch | |||||||
| # | # | ||||||
| # Exec shield | # Exec shield | ||||||
| # | # | ||||||
| ApplyPatch linux-2.6-i386-nx-emulation.patch | #ApplyPatch linux-2.6-i386-nx-emulation.patch ###FIX | ||||||
| ApplyPatch linux-2.6-32bit-mmap-exec-randomization.patch | ApplyPatch linux-2.6-32bit-mmap-exec-randomization.patch | ||||||
| 
 | 
 | ||||||
| # | # | ||||||
| # bugfixes to drivers and filesystems | # bugfixes to drivers and filesystems | ||||||
| # | # | ||||||
| ApplyPatch tmpfs-implement-generic-xattr-support.patch |  | ||||||
| 
 | 
 | ||||||
| # ext4 | # ext4 | ||||||
| 
 | 
 | ||||||
| @ -1316,9 +1307,6 @@ ApplyPatch add-appleir-usb-driver.patch | |||||||
| 
 | 
 | ||||||
| ApplyPatch neuter_intel_microcode_load.patch | ApplyPatch neuter_intel_microcode_load.patch | ||||||
| 
 | 
 | ||||||
| # various fixes for Apple and EFI |  | ||||||
| ApplyPatch acpi_reboot.patch |  | ||||||
| 
 |  | ||||||
| # Runtime PM | # Runtime PM | ||||||
| #ApplyPatch linux-2.6-usb-pci-autosuspend.patch | #ApplyPatch linux-2.6-usb-pci-autosuspend.patch | ||||||
| ### Broken by implicit notify support & ACPICA rebase | ### Broken by implicit notify support & ACPICA rebase | ||||||
| @ -1328,14 +1316,10 @@ ApplyPatch acpi_reboot.patch | |||||||
| # rhbz#605888 | # rhbz#605888 | ||||||
| ApplyPatch dmar-disable-when-ricoh-multifunction.patch | ApplyPatch dmar-disable-when-ricoh-multifunction.patch | ||||||
| 
 | 
 | ||||||
| ApplyPatch mm-vmscan-correct-use-pgdat_balanced-in-sleeping_prematurely.patch |  | ||||||
| ApplyPatch mm-slub-do-not-wake-kswapd-for-slubs-speculative-high-order-allocations.patch | ApplyPatch mm-slub-do-not-wake-kswapd-for-slubs-speculative-high-order-allocations.patch | ||||||
| ApplyPatch mm-slub-do-not-take-expensive-steps-for-slubs-speculative-high-order-allocations.patch | ApplyPatch mm-slub-do-not-take-expensive-steps-for-slubs-speculative-high-order-allocations.patch | ||||||
| ApplyPatch mm-vmscan-if-kswapd-has-been-running-too-long-allow-it-to-sleep.patch | ApplyPatch mm-vmscan-if-kswapd-has-been-running-too-long-allow-it-to-sleep.patch | ||||||
| 
 | 
 | ||||||
| ApplyPatch hid-multitouch-add-support-for-elo-touchsystems.patch |  | ||||||
| ApplyPatch bluetooth-device-ids-for-ath3k-on-pegatron-lucid-tablets.patch |  | ||||||
| 
 |  | ||||||
| # END OF PATCH APPLICATIONS | # END OF PATCH APPLICATIONS | ||||||
| 
 | 
 | ||||||
| %endif | %endif | ||||||
|  | |||||||
| @ -34,23 +34,24 @@ ratelimited. It isn't particularly useful, so just remove it. | |||||||
| 
 | 
 | ||||||
| Signed-off-by: Dave Jones <davej@redhat.com> | Signed-off-by: Dave Jones <davej@redhat.com> | ||||||
| 
 | 
 | ||||||
| --- linux-2.6.27.noarch/net/can/af_can.c~	2008-12-11 16:53:48.000000000 -0500
 | --- a/net/can/af_can.c
 | ||||||
| +++ linux-2.6.27.noarch/net/can/af_can.c	2008-12-11 16:54:42.000000000 -0500
 | +++ b/net/can/af_can.c
 | ||||||
| @@ -134,13 +134,9 @@ static int can_create(struct net *net, s
 | @@ -157,13 +157,9 @@ static int can_create(struct net *net, struct socket *sock, int protocol,
 | ||||||
|  		err = request_module("can-proto-%d", protocol); |  		err = request_module("can-proto-%d", protocol); | ||||||
|   |   | ||||||
|  		/* |  		/* | ||||||
| -		 * In case of error we only print a message but don't
 | -		 * In case of error we only print a message but don't
 | ||||||
| -		 * return the error code immediately.  Below we will
 | -		 * return the error code immediately.  Below we will
 | ||||||
| -		 * return -EPROTONOSUPPORT
 | -		 * return -EPROTONOSUPPORT
 | ||||||
| +		 * In case of error we don't return the error code immediately.
 | +		 * In case of error we but don't return the error code immediately.
 | ||||||
| +		 * Below we will return -EPROTONOSUPPORT
 | +		 * Below we will return -EPROTONOSUPPORT
 | ||||||
|  		 */ |  		 */ | ||||||
| -		if (err && printk_ratelimit())
 | -		if (err && printk_ratelimit())
 | ||||||
| -			printk(KERN_ERR "can: request_module "
 | -			printk(KERN_ERR "can: request_module "
 | ||||||
| -			       "(can-proto-%d) failed.\n", protocol);
 | -			       "(can-proto-%d) failed.\n", protocol);
 | ||||||
|  |   | ||||||
|  |  		cp = can_get_proto(protocol); | ||||||
|  	} |  	} | ||||||
|  #endif |  | ||||||
|   |   | ||||||
| This was removed in revision 1.6 of linux-2.6-silence-noise.patch | This was removed in revision 1.6 of linux-2.6-silence-noise.patch | ||||||
| in ye olde CVS tree. I have no idea why. Originally the pr_debug in | in ye olde CVS tree. I have no idea why. Originally the pr_debug in | ||||||
|  | |||||||
| @ -1,48 +0,0 @@ | |||||||
| From linux-fsdevel-owner@vger.kernel.org Fri May 13 10:03:38 2011 |  | ||||||
| From:	Mel Gorman <mgorman@suse.de> |  | ||||||
| To:	Andrew Morton <akpm@linux-foundation.org> |  | ||||||
| Cc:	James Bottomley <James.Bottomley@HansenPartnership.com>, |  | ||||||
| 	Colin King <colin.king@canonical.com>, |  | ||||||
| 	Raghavendra D Prabhu <raghu.prabhu13@gmail.com>, |  | ||||||
| 	Jan Kara <jack@suse.cz>, Chris Mason <chris.mason@oracle.com>, |  | ||||||
| 	Christoph Lameter <cl@linux.com>, |  | ||||||
| 	Pekka Enberg <penberg@kernel.org>, |  | ||||||
| 	Rik van Riel <riel@redhat.com>, |  | ||||||
| 	Johannes Weiner <hannes@cmpxchg.org>, |  | ||||||
| 	linux-fsdevel <linux-fsdevel@vger.kernel.org>, |  | ||||||
| 	linux-mm <linux-mm@kvack.org>, |  | ||||||
| 	linux-kernel <linux-kernel@vger.kernel.org>, |  | ||||||
| 	linux-ext4 <linux-ext4@vger.kernel.org>, |  | ||||||
| 	Mel Gorman <mgorman@suse.de> |  | ||||||
| Subject: [PATCH 1/4] mm: vmscan: Correct use of pgdat_balanced in sleeping_prematurely |  | ||||||
| Date:	Fri, 13 May 2011 15:03:21 +0100 |  | ||||||
| Message-Id: <1305295404-12129-2-git-send-email-mgorman@suse.de> |  | ||||||
| X-Mailing-List:	linux-fsdevel@vger.kernel.org |  | ||||||
| 
 |  | ||||||
| Johannes Weiner poined out that the logic in commit [1741c877: mm: |  | ||||||
| kswapd: keep kswapd awake for high-order allocations until a percentage |  | ||||||
| of the node is balanced] is backwards. Instead of allowing kswapd to go |  | ||||||
| to sleep when balancing for high order allocations, it keeps it kswapd |  | ||||||
| running uselessly. |  | ||||||
| 
 |  | ||||||
| From-but-was-not-signed-off-by: Johannes Weiner <hannes@cmpxchg.org> |  | ||||||
| Will-sign-off-after-Johannes: Mel Gorman <mgorman@suse.de> |  | ||||||
| ---
 |  | ||||||
|  mm/vmscan.c |    2 +- |  | ||||||
|  1 files changed, 1 insertions(+), 1 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/mm/vmscan.c b/mm/vmscan.c
 |  | ||||||
| index f6b435c..af24d1e 100644
 |  | ||||||
| --- a/mm/vmscan.c
 |  | ||||||
| +++ b/mm/vmscan.c
 |  | ||||||
| @@ -2286,7 +2286,7 @@ static bool sleeping_prematurely(pg_data_t *pgdat, int order, long remaining,
 |  | ||||||
|  	 * must be balanced |  | ||||||
|  	 */ |  | ||||||
|  	if (order) |  | ||||||
| -		return pgdat_balanced(pgdat, balanced, classzone_idx);
 |  | ||||||
| +		return !pgdat_balanced(pgdat, balanced, classzone_idx);
 |  | ||||||
|  	else |  | ||||||
|  		return !all_zones_ok; |  | ||||||
|  } |  | ||||||
| -- 
 |  | ||||||
| 1.7.3.4 |  | ||||||
| @ -1,557 +0,0 @@ | |||||||
| From linux-fsdevel-owner@vger.kernel.org Fri May 13 07:16:45 2011 |  | ||||||
| From:	Miklos Szeredi <miklos@szeredi.hu> |  | ||||||
| To:	Andrew Morton <akpm@linux-foundation.org>, |  | ||||||
| 	Hugh Dickins <hughd@google.com> |  | ||||||
| Subject: [PATCH v2] tmpfs: implement generic xattr support |  | ||||||
| CC:	linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, |  | ||||||
| 	Michal Suchanek <hramrach@centrum.cz>, |  | ||||||
| 	Serge Hallyn <serge.hallyn@ubuntu.com>, |  | ||||||
| 	Eric Paris <eparis@redhat.com>, |  | ||||||
| 	James Morris <jmorris@namei.org>, |  | ||||||
| 	Christoph Hellwig <hch@infradead.org> |  | ||||||
| Date:	Fri, 13 May 2011 13:16:35 +0200 |  | ||||||
| Message-ID: <871v02lujw.fsf@tucsk.pomaz.szeredi.hu> |  | ||||||
| X-Mailing-List:	linux-fsdevel@vger.kernel.org |  | ||||||
| 
 |  | ||||||
| [This update addresses comments from Hugh and Andrew] |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| From: Eric Paris <eparis@redhat.com> |  | ||||||
| 
 |  | ||||||
| This patch implements generic xattrs for tmpfs filesystems.  The feodra |  | ||||||
| project, while trying to replace suid apps with file capabilities, |  | ||||||
| realized that tmpfs, which is used on the build systems, does not |  | ||||||
| support file capabilities and thus cannot be used to build packages |  | ||||||
| which use file capabilities.  Xattrs are also needed for overlayfs. |  | ||||||
| 
 |  | ||||||
| The xattr interface is a bit, odd.  If a filesystem does not implement any |  | ||||||
| {get,set,list}xattr functions the VFS will call into some random LSM hooks and |  | ||||||
| the running LSM can then implement some method for handling xattrs.  SELinux |  | ||||||
| for example provides a method to support security.selinux but no other |  | ||||||
| security.* xattrs. |  | ||||||
| 
 |  | ||||||
| As it stands today when one enables CONFIG_TMPFS_POSIX_ACL tmpfs will have |  | ||||||
| xattr handler routines specifically to handle acls.  Because of this tmpfs |  | ||||||
| would loose the VFS/LSM helpers to support the running LSM.  To make up for |  | ||||||
| that tmpfs had stub functions that did nothing but call into the LSM hooks |  | ||||||
| which implement the helpers. |  | ||||||
| 
 |  | ||||||
| This new patch does not use the LSM fallback functions and instead |  | ||||||
| just implements a native get/set/list xattr feature for the full |  | ||||||
| security.* and trusted.* namespace like a normal filesystem.  This |  | ||||||
| means that tmpfs can now support both security.selinux and |  | ||||||
| security.capability, which was not previously possible. |  | ||||||
| 
 |  | ||||||
| The basic implementation is that I attach a: |  | ||||||
| 
 |  | ||||||
| struct shmem_xattr { |  | ||||||
| 	struct list_head list; /* anchored by shmem_inode_info->xattr_list */ |  | ||||||
| 	char *name; |  | ||||||
| 	size_t size; |  | ||||||
| 	char value[0]; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| Into the struct shmem_inode_info for each xattr that is set.  This |  | ||||||
| implementation could easily support the user.* namespace as well, |  | ||||||
| except some care needs to be taken to prevent large amounts of |  | ||||||
| unswappable memory being allocated for unprivileged users. |  | ||||||
| 
 |  | ||||||
| [miklos: new config option, suport trusted.*, support symlinks] |  | ||||||
| 
 |  | ||||||
| Signed-off-by: Eric Paris <eparis@redhat.com> |  | ||||||
| Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> |  | ||||||
| Acked-by: Serge Hallyn <serge.hallyn@ubuntu.com> |  | ||||||
| ---
 |  | ||||||
|  fs/Kconfig               |   18 ++ |  | ||||||
|  include/linux/shmem_fs.h |    8 + |  | ||||||
|  mm/shmem.c               |  320 +++++++++++++++++++++++++++++++++++++++-------- |  | ||||||
|  3 files changed, 290 insertions(+), 56 deletions(-) |  | ||||||
| 
 |  | ||||||
| Index: linux-2.6/fs/Kconfig
 |  | ||||||
| ===================================================================
 |  | ||||||
| --- linux-2.6.orig/fs/Kconfig	2011-05-13 12:26:31.000000000 +0200
 |  | ||||||
| +++ linux-2.6/fs/Kconfig	2011-05-13 12:29:34.000000000 +0200
 |  | ||||||
| @@ -121,9 +121,25 @@ config TMPFS
 |  | ||||||
|   |  | ||||||
|  	  See <file:Documentation/filesystems/tmpfs.txt> for details. |  | ||||||
|   |  | ||||||
| +config TMPFS_XATTR
 |  | ||||||
| +	bool "Tmpfs extended attributes"
 |  | ||||||
| +	depends on TMPFS
 |  | ||||||
| +	default n
 |  | ||||||
| +	help
 |  | ||||||
| +	  Extended attributes are name:value pairs associated with inodes by
 |  | ||||||
| +	  the kernel or by users (see the attr(5) manual page, or visit
 |  | ||||||
| +	  <http://acl.bestbits.at/> for details).
 |  | ||||||
| +
 |  | ||||||
| +	  Currently this enables support for the trusted.* and
 |  | ||||||
| +	  security.* namespaces.
 |  | ||||||
| +
 |  | ||||||
| +	  If unsure, say N.
 |  | ||||||
| +
 |  | ||||||
| +	  You need this for POSIX ACL support on tmpfs.
 |  | ||||||
| +
 |  | ||||||
|  config TMPFS_POSIX_ACL |  | ||||||
|  	bool "Tmpfs POSIX Access Control Lists" |  | ||||||
| -	depends on TMPFS
 |  | ||||||
| +	depends on TMPFS_XATTR
 |  | ||||||
|  	select GENERIC_ACL |  | ||||||
|  	help |  | ||||||
|  	  POSIX Access Control Lists (ACLs) support permissions for users and |  | ||||||
| Index: linux-2.6/include/linux/shmem_fs.h
 |  | ||||||
| ===================================================================
 |  | ||||||
| --- linux-2.6.orig/include/linux/shmem_fs.h	2011-05-13 12:26:31.000000000 +0200
 |  | ||||||
| +++ linux-2.6/include/linux/shmem_fs.h	2011-05-13 12:35:36.000000000 +0200
 |  | ||||||
| @@ -9,6 +9,8 @@
 |  | ||||||
|   |  | ||||||
|  #define SHMEM_NR_DIRECT 16 |  | ||||||
|   |  | ||||||
| +#define SHMEM_SYMLINK_INLINE_LEN (SHMEM_NR_DIRECT * sizeof(swp_entry_t))
 |  | ||||||
| +
 |  | ||||||
|  struct shmem_inode_info { |  | ||||||
|  	spinlock_t		lock; |  | ||||||
|  	unsigned long		flags; |  | ||||||
| @@ -17,8 +19,12 @@ struct shmem_inode_info {
 |  | ||||||
|  	unsigned long		next_index;	/* highest alloced index + 1 */ |  | ||||||
|  	struct shared_policy	policy;		/* NUMA memory alloc policy */ |  | ||||||
|  	struct page		*i_indirect;	/* top indirect blocks page */ |  | ||||||
| -	swp_entry_t		i_direct[SHMEM_NR_DIRECT]; /* first blocks */
 |  | ||||||
| +	union {
 |  | ||||||
| +		swp_entry_t	i_direct[SHMEM_NR_DIRECT]; /* first blocks */
 |  | ||||||
| +		char		inline_symlink[SHMEM_SYMLINK_INLINE_LEN];
 |  | ||||||
| +	};
 |  | ||||||
|  	struct list_head	swaplist;	/* chain of maybes on swap */ |  | ||||||
| +	struct list_head	xattr_list;	/* list of shmem_xattr */
 |  | ||||||
|  	struct inode		vfs_inode; |  | ||||||
|  }; |  | ||||||
|   |  | ||||||
| Index: linux-2.6/mm/shmem.c
 |  | ||||||
| ===================================================================
 |  | ||||||
| --- linux-2.6.orig/mm/shmem.c	2011-05-13 12:26:31.000000000 +0200
 |  | ||||||
| +++ linux-2.6/mm/shmem.c	2011-05-13 12:36:08.000000000 +0200
 |  | ||||||
| @@ -99,6 +99,13 @@ static struct vfsmount *shm_mnt;
 |  | ||||||
|  /* Pretend that each entry is of this size in directory's i_size */ |  | ||||||
|  #define BOGO_DIRENT_SIZE 20 |  | ||||||
|   |  | ||||||
| +struct shmem_xattr {
 |  | ||||||
| +	struct list_head list;	/* anchored by shmem_inode_info->xattr_list */
 |  | ||||||
| +	char *name;		/* xattr name */
 |  | ||||||
| +	size_t size;
 |  | ||||||
| +	char value[0];
 |  | ||||||
| +};
 |  | ||||||
| +
 |  | ||||||
|  /* Flag allocation requirements to shmem_getpage and shmem_swp_alloc */ |  | ||||||
|  enum sgp_type { |  | ||||||
|  	SGP_READ,	/* don't exceed i_size, don't allocate page */ |  | ||||||
| @@ -822,6 +829,7 @@ static int shmem_notify_change(struct de
 |  | ||||||
|  static void shmem_evict_inode(struct inode *inode) |  | ||||||
|  { |  | ||||||
|  	struct shmem_inode_info *info = SHMEM_I(inode); |  | ||||||
| +	struct shmem_xattr *xattr, *nxattr;
 |  | ||||||
|   |  | ||||||
|  	if (inode->i_mapping->a_ops == &shmem_aops) { |  | ||||||
|  		truncate_inode_pages(inode->i_mapping, 0); |  | ||||||
| @@ -834,6 +842,11 @@ static void shmem_evict_inode(struct ino
 |  | ||||||
|  			mutex_unlock(&shmem_swaplist_mutex); |  | ||||||
|  		} |  | ||||||
|  	} |  | ||||||
| +
 |  | ||||||
| +	list_for_each_entry_safe(xattr, nxattr, &info->xattr_list, list) {
 |  | ||||||
| +		kfree(xattr->name);
 |  | ||||||
| +		kfree(xattr);
 |  | ||||||
| +	}
 |  | ||||||
|  	BUG_ON(inode->i_blocks); |  | ||||||
|  	shmem_free_inode(inode->i_sb); |  | ||||||
|  	end_writeback(inode); |  | ||||||
| @@ -1616,6 +1629,7 @@ static struct inode *shmem_get_inode(str
 |  | ||||||
|  		spin_lock_init(&info->lock); |  | ||||||
|  		info->flags = flags & VM_NORESERVE; |  | ||||||
|  		INIT_LIST_HEAD(&info->swaplist); |  | ||||||
| +		INIT_LIST_HEAD(&info->xattr_list);
 |  | ||||||
|  		cache_no_acl(inode); |  | ||||||
|   |  | ||||||
|  		switch (mode & S_IFMT) { |  | ||||||
| @@ -2015,9 +2029,9 @@ static int shmem_symlink(struct inode *d
 |  | ||||||
|   |  | ||||||
|  	info = SHMEM_I(inode); |  | ||||||
|  	inode->i_size = len-1; |  | ||||||
| -	if (len <= (char *)inode - (char *)info) {
 |  | ||||||
| +	if (len <= SHMEM_SYMLINK_INLINE_LEN) {
 |  | ||||||
|  		/* do it inline */ |  | ||||||
| -		memcpy(info, symname, len);
 |  | ||||||
| +		memcpy(info->inline_symlink, symname, len);
 |  | ||||||
|  		inode->i_op = &shmem_symlink_inline_operations; |  | ||||||
|  	} else { |  | ||||||
|  		error = shmem_getpage(inode, 0, &page, SGP_WRITE, NULL); |  | ||||||
| @@ -2043,7 +2057,7 @@ static int shmem_symlink(struct inode *d
 |  | ||||||
|   |  | ||||||
|  static void *shmem_follow_link_inline(struct dentry *dentry, struct nameidata *nd) |  | ||||||
|  { |  | ||||||
| -	nd_set_link(nd, (char *)SHMEM_I(dentry->d_inode));
 |  | ||||||
| +	nd_set_link(nd, SHMEM_I(dentry->d_inode)->inline_symlink);
 |  | ||||||
|  	return NULL; |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| @@ -2067,63 +2081,253 @@ static void shmem_put_link(struct dentry
 |  | ||||||
|  	} |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| -static const struct inode_operations shmem_symlink_inline_operations = {
 |  | ||||||
| -	.readlink	= generic_readlink,
 |  | ||||||
| -	.follow_link	= shmem_follow_link_inline,
 |  | ||||||
| -};
 |  | ||||||
| -
 |  | ||||||
| -static const struct inode_operations shmem_symlink_inode_operations = {
 |  | ||||||
| -	.readlink	= generic_readlink,
 |  | ||||||
| -	.follow_link	= shmem_follow_link,
 |  | ||||||
| -	.put_link	= shmem_put_link,
 |  | ||||||
| -};
 |  | ||||||
| -
 |  | ||||||
| -#ifdef CONFIG_TMPFS_POSIX_ACL
 |  | ||||||
| +#ifdef CONFIG_TMPFS_XATTR
 |  | ||||||
|  /* |  | ||||||
| - * Superblocks without xattr inode operations will get security.* xattr
 |  | ||||||
| - * support from the VFS "for free". As soon as we have any other xattrs
 |  | ||||||
| + * Superblocks without xattr inode operations may get some security.* xattr
 |  | ||||||
| + * support from the LSM "for free". As soon as we have any other xattrs
 |  | ||||||
|   * like ACLs, we also need to implement the security.* handlers at |  | ||||||
|   * filesystem level, though. |  | ||||||
|   */ |  | ||||||
|   |  | ||||||
| -static size_t shmem_xattr_security_list(struct dentry *dentry, char *list,
 |  | ||||||
| -					size_t list_len, const char *name,
 |  | ||||||
| -					size_t name_len, int handler_flags)
 |  | ||||||
| +static int shmem_xattr_get(struct dentry *dentry, const char *name,
 |  | ||||||
| +			   void *buffer, size_t size)
 |  | ||||||
|  { |  | ||||||
| -	return security_inode_listsecurity(dentry->d_inode, list, list_len);
 |  | ||||||
| -}
 |  | ||||||
| +	struct shmem_inode_info *info;
 |  | ||||||
| +	struct shmem_xattr *xattr;
 |  | ||||||
| +	int ret = -ENODATA;
 |  | ||||||
|   |  | ||||||
| -static int shmem_xattr_security_get(struct dentry *dentry, const char *name,
 |  | ||||||
| -		void *buffer, size_t size, int handler_flags)
 |  | ||||||
| -{
 |  | ||||||
| -	if (strcmp(name, "") == 0)
 |  | ||||||
| -		return -EINVAL;
 |  | ||||||
| -	return xattr_getsecurity(dentry->d_inode, name, buffer, size);
 |  | ||||||
| +	info = SHMEM_I(dentry->d_inode);
 |  | ||||||
| +
 |  | ||||||
| +	spin_lock(&info->lock);
 |  | ||||||
| +	list_for_each_entry(xattr, &info->xattr_list, list) {
 |  | ||||||
| +		if (strcmp(name, xattr->name))
 |  | ||||||
| +			continue;
 |  | ||||||
| +
 |  | ||||||
| +		ret = xattr->size;
 |  | ||||||
| +		if (buffer) {
 |  | ||||||
| +			if (size < xattr->size)
 |  | ||||||
| +				ret = -ERANGE;
 |  | ||||||
| +			else
 |  | ||||||
| +				memcpy(buffer, xattr->value, xattr->size);
 |  | ||||||
| +		}
 |  | ||||||
| +		break;
 |  | ||||||
| +	}
 |  | ||||||
| +	spin_unlock(&info->lock);
 |  | ||||||
| +	return ret;
 |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| -static int shmem_xattr_security_set(struct dentry *dentry, const char *name,
 |  | ||||||
| -		const void *value, size_t size, int flags, int handler_flags)
 |  | ||||||
| +static int shmem_xattr_set(struct dentry *dentry, const char *name,
 |  | ||||||
| +			   const void *value, size_t size, int flags)
 |  | ||||||
|  { |  | ||||||
| -	if (strcmp(name, "") == 0)
 |  | ||||||
| -		return -EINVAL;
 |  | ||||||
| -	return security_inode_setsecurity(dentry->d_inode, name, value,
 |  | ||||||
| -					  size, flags);
 |  | ||||||
| +	struct inode *inode = dentry->d_inode;
 |  | ||||||
| +	struct shmem_inode_info *info = SHMEM_I(inode);
 |  | ||||||
| +	struct shmem_xattr *xattr;
 |  | ||||||
| +	struct shmem_xattr *new_xattr = NULL;
 |  | ||||||
| +	size_t len;
 |  | ||||||
| +	int err = 0;
 |  | ||||||
| +
 |  | ||||||
| +	/* value == NULL means remove */
 |  | ||||||
| +	if (value) {
 |  | ||||||
| +		/* wrap around? */
 |  | ||||||
| +		len = sizeof(*new_xattr) + size;
 |  | ||||||
| +		if (len <= sizeof(*new_xattr))
 |  | ||||||
| +			return -ENOMEM;
 |  | ||||||
| +
 |  | ||||||
| +		new_xattr = kmalloc(len, GFP_KERNEL);
 |  | ||||||
| +		if (!new_xattr)
 |  | ||||||
| +			return -ENOMEM;
 |  | ||||||
| +
 |  | ||||||
| +		new_xattr->name = kstrdup(name, GFP_KERNEL);
 |  | ||||||
| +		if (!new_xattr->name) {
 |  | ||||||
| +			kfree(new_xattr);
 |  | ||||||
| +			return -ENOMEM;
 |  | ||||||
| +		}
 |  | ||||||
| +
 |  | ||||||
| +		new_xattr->size = size;
 |  | ||||||
| +		memcpy(new_xattr->value, value, size);
 |  | ||||||
| +	}
 |  | ||||||
| +
 |  | ||||||
| +	spin_lock(&info->lock);
 |  | ||||||
| +	list_for_each_entry(xattr, &info->xattr_list, list) {
 |  | ||||||
| +		if (!strcmp(name, xattr->name)) {
 |  | ||||||
| +			if (flags & XATTR_CREATE) {
 |  | ||||||
| +				xattr = new_xattr;
 |  | ||||||
| +				err = -EEXIST;
 |  | ||||||
| +			} else if (new_xattr) {
 |  | ||||||
| +				list_replace(&xattr->list, &new_xattr->list);
 |  | ||||||
| +			} else {
 |  | ||||||
| +				list_del(&xattr->list);
 |  | ||||||
| +			}
 |  | ||||||
| +			goto out;
 |  | ||||||
| +		}
 |  | ||||||
| +	}
 |  | ||||||
| +	if (flags & XATTR_REPLACE) {
 |  | ||||||
| +		xattr = new_xattr;
 |  | ||||||
| +		err = -ENODATA;
 |  | ||||||
| +	} else {
 |  | ||||||
| +		list_add(&new_xattr->list, &info->xattr_list);
 |  | ||||||
| +		xattr = NULL;
 |  | ||||||
| +	}
 |  | ||||||
| +out:
 |  | ||||||
| +	spin_unlock(&info->lock);
 |  | ||||||
| +	if (xattr)
 |  | ||||||
| +		kfree(xattr->name);
 |  | ||||||
| +	kfree(xattr);
 |  | ||||||
| +	return err;
 |  | ||||||
|  } |  | ||||||
|   |  | ||||||
| -static const struct xattr_handler shmem_xattr_security_handler = {
 |  | ||||||
| -	.prefix = XATTR_SECURITY_PREFIX,
 |  | ||||||
| -	.list   = shmem_xattr_security_list,
 |  | ||||||
| -	.get    = shmem_xattr_security_get,
 |  | ||||||
| -	.set    = shmem_xattr_security_set,
 |  | ||||||
| -};
 |  | ||||||
|   |  | ||||||
|  static const struct xattr_handler *shmem_xattr_handlers[] = { |  | ||||||
| +#ifdef CONFIG_TMPFS_POSIX_ACL
 |  | ||||||
|  	&generic_acl_access_handler, |  | ||||||
|  	&generic_acl_default_handler, |  | ||||||
| -	&shmem_xattr_security_handler,
 |  | ||||||
| +#endif
 |  | ||||||
|  	NULL |  | ||||||
|  }; |  | ||||||
| +
 |  | ||||||
| +static int shmem_xattr_validate(const char *name)
 |  | ||||||
| +{
 |  | ||||||
| +	struct { const char *prefix; size_t len; } arr[] = {
 |  | ||||||
| +		{ XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN },
 |  | ||||||
| +		{ XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN }
 |  | ||||||
| +	};
 |  | ||||||
| +	int i;
 |  | ||||||
| +
 |  | ||||||
| +	for (i = 0; i < ARRAY_SIZE(arr); i++) {
 |  | ||||||
| +		size_t preflen = arr[i].len;
 |  | ||||||
| +		if (strncmp(name, arr[i].prefix, preflen) == 0) {
 |  | ||||||
| +			if (!name[preflen])
 |  | ||||||
| +				return -EINVAL;
 |  | ||||||
| +			return 0;
 |  | ||||||
| +		}
 |  | ||||||
| +	}
 |  | ||||||
| +	return -EOPNOTSUPP;
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +static ssize_t shmem_getxattr(struct dentry *dentry, const char *name,
 |  | ||||||
| +			      void *buffer, size_t size)
 |  | ||||||
| +{
 |  | ||||||
| +	int err;
 |  | ||||||
| +
 |  | ||||||
| +	/*
 |  | ||||||
| +	 * If this is a request for a synthetic attribute in the system.*
 |  | ||||||
| +	 * namespace use the generic infrastructure to resolve a handler
 |  | ||||||
| +	 * for it via sb->s_xattr.
 |  | ||||||
| +	 */
 |  | ||||||
| +	if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
 |  | ||||||
| +		return generic_getxattr(dentry, name, buffer, size);
 |  | ||||||
| +
 |  | ||||||
| +	err = shmem_xattr_validate(name);
 |  | ||||||
| +	if (err)
 |  | ||||||
| +		return err;
 |  | ||||||
| +
 |  | ||||||
| +	return shmem_xattr_get(dentry, name, buffer, size);
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +static int shmem_setxattr(struct dentry *dentry, const char *name,
 |  | ||||||
| +			  const void *value, size_t size, int flags)
 |  | ||||||
| +{
 |  | ||||||
| +	int err;
 |  | ||||||
| +
 |  | ||||||
| +	/*
 |  | ||||||
| +	 * If this is a request for a synthetic attribute in the system.*
 |  | ||||||
| +	 * namespace use the generic infrastructure to resolve a handler
 |  | ||||||
| +	 * for it via sb->s_xattr.
 |  | ||||||
| +	 */
 |  | ||||||
| +	if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
 |  | ||||||
| +		return generic_setxattr(dentry, name, value, size, flags);
 |  | ||||||
| +
 |  | ||||||
| +	err = shmem_xattr_validate(name);
 |  | ||||||
| +	if (err)
 |  | ||||||
| +		return err;
 |  | ||||||
| +
 |  | ||||||
| +	if (size == 0)
 |  | ||||||
| +		value = "";  /* empty EA, do not remove */
 |  | ||||||
| +
 |  | ||||||
| +	return shmem_xattr_set(dentry, name, value, size, flags);
 |  | ||||||
| +
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +static int shmem_removexattr(struct dentry *dentry, const char *name)
 |  | ||||||
| +{
 |  | ||||||
| +	int err;
 |  | ||||||
| +
 |  | ||||||
| +	/*
 |  | ||||||
| +	 * If this is a request for a synthetic attribute in the system.*
 |  | ||||||
| +	 * namespace use the generic infrastructure to resolve a handler
 |  | ||||||
| +	 * for it via sb->s_xattr.
 |  | ||||||
| +	 */
 |  | ||||||
| +	if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
 |  | ||||||
| +		return generic_removexattr(dentry, name);
 |  | ||||||
| +
 |  | ||||||
| +	err = shmem_xattr_validate(name);
 |  | ||||||
| +	if (err)
 |  | ||||||
| +		return err;
 |  | ||||||
| +
 |  | ||||||
| +	return shmem_xattr_set(dentry, name, NULL, 0, XATTR_REPLACE);
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +static bool xattr_is_trusted(const char *name)
 |  | ||||||
| +{
 |  | ||||||
| +	return !strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN);
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +static ssize_t shmem_listxattr(struct dentry *dentry, char *buffer, size_t size)
 |  | ||||||
| +{
 |  | ||||||
| +	bool trusted = capable(CAP_SYS_ADMIN);
 |  | ||||||
| +	struct shmem_xattr *xattr;
 |  | ||||||
| +	struct shmem_inode_info *info;
 |  | ||||||
| +	size_t used = 0;
 |  | ||||||
| +
 |  | ||||||
| +	info = SHMEM_I(dentry->d_inode);
 |  | ||||||
| +
 |  | ||||||
| +	spin_lock(&info->lock);
 |  | ||||||
| +	list_for_each_entry(xattr, &info->xattr_list, list) {
 |  | ||||||
| +		size_t len;
 |  | ||||||
| +
 |  | ||||||
| +		/* skip "trusted." attributes for unprivileged callers */
 |  | ||||||
| +		if (!trusted && xattr_is_trusted(xattr->name))
 |  | ||||||
| +			continue;
 |  | ||||||
| +
 |  | ||||||
| +		len = strlen(xattr->name) + 1;
 |  | ||||||
| +		used += len;
 |  | ||||||
| +		if (buffer) {
 |  | ||||||
| +			if (size < used) {
 |  | ||||||
| +				used = -ERANGE;
 |  | ||||||
| +				break;
 |  | ||||||
| +			}
 |  | ||||||
| +			memcpy(buffer, xattr->name, len);
 |  | ||||||
| +			buffer += len;
 |  | ||||||
| +		}
 |  | ||||||
| +	}
 |  | ||||||
| +	spin_unlock(&info->lock);
 |  | ||||||
| +
 |  | ||||||
| +	return used;
 |  | ||||||
| +}
 |  | ||||||
| +#endif /* CONFIG_TMPFS_XATTR */
 |  | ||||||
| +
 |  | ||||||
| +static const struct inode_operations shmem_symlink_inline_operations = {
 |  | ||||||
| +	.readlink	= generic_readlink,
 |  | ||||||
| +	.follow_link	= shmem_follow_link_inline,
 |  | ||||||
| +#ifdef CONFIG_TMPFS_XATTR
 |  | ||||||
| +	.setxattr	= shmem_setxattr,
 |  | ||||||
| +	.getxattr	= shmem_getxattr,
 |  | ||||||
| +	.listxattr	= shmem_listxattr,
 |  | ||||||
| +	.removexattr	= shmem_removexattr,
 |  | ||||||
| +#endif
 |  | ||||||
| +};
 |  | ||||||
| +
 |  | ||||||
| +static const struct inode_operations shmem_symlink_inode_operations = {
 |  | ||||||
| +	.readlink	= generic_readlink,
 |  | ||||||
| +	.follow_link	= shmem_follow_link,
 |  | ||||||
| +	.put_link	= shmem_put_link,
 |  | ||||||
| +#ifdef CONFIG_TMPFS_XATTR
 |  | ||||||
| +	.setxattr	= shmem_setxattr,
 |  | ||||||
| +	.getxattr	= shmem_getxattr,
 |  | ||||||
| +	.listxattr	= shmem_listxattr,
 |  | ||||||
| +	.removexattr	= shmem_removexattr,
 |  | ||||||
|  #endif |  | ||||||
| +};
 |  | ||||||
|   |  | ||||||
|  static struct dentry *shmem_get_parent(struct dentry *child) |  | ||||||
|  { |  | ||||||
| @@ -2403,8 +2607,10 @@ int shmem_fill_super(struct super_block
 |  | ||||||
|  	sb->s_magic = TMPFS_MAGIC; |  | ||||||
|  	sb->s_op = &shmem_ops; |  | ||||||
|  	sb->s_time_gran = 1; |  | ||||||
| -#ifdef CONFIG_TMPFS_POSIX_ACL
 |  | ||||||
| +#ifdef CONFIG_TMPFS_XATTR
 |  | ||||||
|  	sb->s_xattr = shmem_xattr_handlers; |  | ||||||
| +#endif
 |  | ||||||
| +#ifdef CONFIG_TMPFS_POSIX_ACL
 |  | ||||||
|  	sb->s_flags |= MS_POSIXACL; |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
| @@ -2502,11 +2708,13 @@ static const struct file_operations shme
 |  | ||||||
|  static const struct inode_operations shmem_inode_operations = { |  | ||||||
|  	.setattr	= shmem_notify_change, |  | ||||||
|  	.truncate_range	= shmem_truncate_range, |  | ||||||
| +#ifdef CONFIG_TMPFS_XATTR
 |  | ||||||
| +	.setxattr	= shmem_setxattr,
 |  | ||||||
| +	.getxattr	= shmem_getxattr,
 |  | ||||||
| +	.listxattr	= shmem_listxattr,
 |  | ||||||
| +	.removexattr	= shmem_removexattr,
 |  | ||||||
| +#endif
 |  | ||||||
|  #ifdef CONFIG_TMPFS_POSIX_ACL |  | ||||||
| -	.setxattr	= generic_setxattr,
 |  | ||||||
| -	.getxattr	= generic_getxattr,
 |  | ||||||
| -	.listxattr	= generic_listxattr,
 |  | ||||||
| -	.removexattr	= generic_removexattr,
 |  | ||||||
|  	.check_acl	= generic_check_acl, |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
| @@ -2524,23 +2732,27 @@ static const struct inode_operations shm
 |  | ||||||
|  	.mknod		= shmem_mknod, |  | ||||||
|  	.rename		= shmem_rename, |  | ||||||
|  #endif |  | ||||||
| +#ifdef CONFIG_TMPFS_XATTR
 |  | ||||||
| +	.setxattr	= shmem_setxattr,
 |  | ||||||
| +	.getxattr	= shmem_getxattr,
 |  | ||||||
| +	.listxattr	= shmem_listxattr,
 |  | ||||||
| +	.removexattr	= shmem_removexattr,
 |  | ||||||
| +#endif
 |  | ||||||
|  #ifdef CONFIG_TMPFS_POSIX_ACL |  | ||||||
|  	.setattr	= shmem_notify_change, |  | ||||||
| -	.setxattr	= generic_setxattr,
 |  | ||||||
| -	.getxattr	= generic_getxattr,
 |  | ||||||
| -	.listxattr	= generic_listxattr,
 |  | ||||||
| -	.removexattr	= generic_removexattr,
 |  | ||||||
|  	.check_acl	= generic_check_acl, |  | ||||||
|  #endif |  | ||||||
|  }; |  | ||||||
|   |  | ||||||
|  static const struct inode_operations shmem_special_inode_operations = { |  | ||||||
| +#ifdef CONFIG_TMPFS_XATTR
 |  | ||||||
| +	.setxattr	= shmem_setxattr,
 |  | ||||||
| +	.getxattr	= shmem_getxattr,
 |  | ||||||
| +	.listxattr	= shmem_listxattr,
 |  | ||||||
| +	.removexattr	= shmem_removexattr,
 |  | ||||||
| +#endif
 |  | ||||||
|  #ifdef CONFIG_TMPFS_POSIX_ACL |  | ||||||
|  	.setattr	= shmem_notify_change, |  | ||||||
| -	.setxattr	= generic_setxattr,
 |  | ||||||
| -	.getxattr	= generic_getxattr,
 |  | ||||||
| -	.listxattr	= generic_listxattr,
 |  | ||||||
| -	.removexattr	= generic_removexattr,
 |  | ||||||
|  	.check_acl	= generic_check_acl, |  | ||||||
|  #endif |  | ||||||
|  }; |  | ||||||
| --
 |  | ||||||
| To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in |  | ||||||
| the body of a message to majordomo@vger.kernel.org |  | ||||||
| More majordomo info at  http://vger.kernel.org/majordomo-info.html |  | ||||||
| 
 |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user