From 123d535ad8de98fe5fd368bea098100171fdfb97 Mon Sep 17 00:00:00 2001 From: Kyle McMartin Date: May 30 2011 11:23:14 +0000 Subject: rebase and nuke patches --- diff --git a/acpi_reboot.patch b/acpi_reboot.patch deleted file mode 100644 index c67cf95..0000000 --- a/acpi_reboot.patch +++ /dev/null @@ -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); diff --git a/add-appleir-usb-driver.patch b/add-appleir-usb-driver.patch index af4f968..26477cc 100644 --- a/add-appleir-usb-driver.patch +++ b/add-appleir-usb-driver.patch @@ -99,9 +99,9 @@ index baa25ad..abc5bd7 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -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_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_IRCONTROL4) }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) }, diff --git a/bluetooth-device-ids-for-ath3k-on-pegatron-lucid-tablets.patch b/bluetooth-device-ids-for-ath3k-on-pegatron-lucid-tablets.patch deleted file mode 100644 index 7671055..0000000 --- a/bluetooth-device-ids-for-ath3k-on-pegatron-lucid-tablets.patch +++ /dev/null @@ -1,37 +0,0 @@ -From: Andy Ross -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 -Signed-off-by: Gustavo F. Padovan ---- - -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 }, diff --git a/drm-intel-make-lvds-work.patch b/drm-intel-make-lvds-work.patch index 209deb2..89f4e2d 100644 --- a/drm-intel-make-lvds-work.patch +++ b/drm-intel-make-lvds-work.patch @@ -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 +++ b/drivers/gpu/drm/i915/intel_display.c -@@ -4568,7 +4568,6 @@ void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, - struct drm_connector *connector, int dpms_mode) +@@ -5821,7 +5821,6 @@ void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, + struct intel_load_detect_pipe *old) { struct drm_encoder *encoder = &intel_encoder->base; - struct drm_device *dev = encoder->dev; struct drm_crtc *crtc = encoder->crtc; struct drm_encoder_helper_funcs *encoder_funcs = encoder->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, + + if (old->load_detect_temp) { 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->release_fb) + old->release_fb->funcs->destroy(old->release_fb); diff --git a/hid-multitouch-add-support-for-elo-touchsystems.patch b/hid-multitouch-add-support-for-elo-touchsystems.patch deleted file mode 100644 index 3203799..0000000 --- a/hid-multitouch-add-support-for-elo-touchsystems.patch +++ /dev/null @@ -1,80 +0,0 @@ -From: Benjamin Tissoires -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 -Tested-by: Bastien Nocera -Signed-off-by: Jiri Kosina - ---- 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, diff --git a/kernel.spec b/kernel.spec index b411611..2093111 100644 --- a/kernel.spec +++ b/kernel.spec @@ -623,8 +623,6 @@ Patch150: linux-2.6.29-sparc-IOC_TYPECHECK.patch Patch160: linux-2.6-32bit-mmap-exec-randomization.patch Patch161: linux-2.6-i386-nx-emulation.patch -Patch170: tmpfs-implement-generic-xattr-support.patch - Patch200: linux-2.6-debug-sizeof-structs.patch Patch202: linux-2.6-debug-taint-vm.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 -Patch12200: acpi_reboot.patch - # Runtime power management Patch12203: linux-2.6-usb-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 -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 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 -Patch12410: hid-multitouch-add-support-for-elo-touchsystems.patch -Patch12411: bluetooth-device-ids-for-ath3k-on-pegatron-lucid-tablets.patch - %endif BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root @@ -1181,13 +1173,12 @@ ApplyPatch linux-2.6.29-sparc-IOC_TYPECHECK.patch # # 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 # # bugfixes to drivers and filesystems # -ApplyPatch tmpfs-implement-generic-xattr-support.patch # ext4 @@ -1316,9 +1307,6 @@ ApplyPatch add-appleir-usb-driver.patch ApplyPatch neuter_intel_microcode_load.patch -# various fixes for Apple and EFI -ApplyPatch acpi_reboot.patch - # Runtime PM #ApplyPatch linux-2.6-usb-pci-autosuspend.patch ### Broken by implicit notify support & ACPICA rebase @@ -1328,14 +1316,10 @@ ApplyPatch acpi_reboot.patch # rhbz#605888 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-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 hid-multitouch-add-support-for-elo-touchsystems.patch -ApplyPatch bluetooth-device-ids-for-ath3k-on-pegatron-lucid-tablets.patch - # END OF PATCH APPLICATIONS %endif diff --git a/linux-2.6-silence-noise.patch b/linux-2.6-silence-noise.patch index 32c678b..6d25a8f 100644 --- a/linux-2.6-silence-noise.patch +++ b/linux-2.6-silence-noise.patch @@ -34,23 +34,24 @@ ratelimited. It isn't particularly useful, so just remove it. Signed-off-by: Dave Jones ---- linux-2.6.27.noarch/net/can/af_can.c~ 2008-12-11 16:53:48.000000000 -0500 -+++ linux-2.6.27.noarch/net/can/af_can.c 2008-12-11 16:54:42.000000000 -0500 -@@ -134,13 +134,9 @@ static int can_create(struct net *net, s +--- a/net/can/af_can.c ++++ b/net/can/af_can.c +@@ -157,13 +157,9 @@ static int can_create(struct net *net, struct socket *sock, int protocol, err = request_module("can-proto-%d", protocol); /* - * In case of error we only print a message but don't - * return the error code immediately. Below we will - * 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 */ - if (err && printk_ratelimit()) - printk(KERN_ERR "can: request_module " - "(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 in ye olde CVS tree. I have no idea why. Originally the pr_debug in diff --git a/mm-vmscan-correct-use-pgdat_balanced-in-sleeping_prematurely.patch b/mm-vmscan-correct-use-pgdat_balanced-in-sleeping_prematurely.patch deleted file mode 100644 index 907a74d..0000000 --- a/mm-vmscan-correct-use-pgdat_balanced-in-sleeping_prematurely.patch +++ /dev/null @@ -1,48 +0,0 @@ -From linux-fsdevel-owner@vger.kernel.org Fri May 13 10:03:38 2011 -From: Mel Gorman -To: Andrew Morton -Cc: James Bottomley , - Colin King , - Raghavendra D Prabhu , - Jan Kara , Chris Mason , - Christoph Lameter , - Pekka Enberg , - Rik van Riel , - Johannes Weiner , - linux-fsdevel , - linux-mm , - linux-kernel , - linux-ext4 , - Mel Gorman -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 -Will-sign-off-after-Johannes: Mel Gorman ---- - 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 diff --git a/tmpfs-implement-generic-xattr-support.patch b/tmpfs-implement-generic-xattr-support.patch deleted file mode 100644 index 9ca97d1..0000000 --- a/tmpfs-implement-generic-xattr-support.patch +++ /dev/null @@ -1,557 +0,0 @@ -From linux-fsdevel-owner@vger.kernel.org Fri May 13 07:16:45 2011 -From: Miklos Szeredi -To: Andrew Morton , - Hugh Dickins -Subject: [PATCH v2] tmpfs: implement generic xattr support -CC: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, - Michal Suchanek , - Serge Hallyn , - Eric Paris , - James Morris , - Christoph Hellwig -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 - -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 -Signed-off-by: Miklos Szeredi -Acked-by: Serge Hallyn ---- - 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 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 -+ 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 -