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
|
||||
+++ 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) },
|
||||
|
@ -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
|
||||
+++ 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,
|
||||
connector->encoder = NULL;
|
||||
intel_encoder->load_detect_temp = false;
|
||||
crtc->enabled = drm_helper_crtc_in_use(crtc);
|
||||
- drm_helper_disable_unused_functions(dev);
|
||||
}
|
||||
@@ -5832,7 +5831,6 @@ void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
|
||||
|
||||
/* 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
|
||||
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
|
||||
|
@ -34,23 +34,24 @@ ratelimited. It isn't particularly useful, so just remove it.
|
||||
|
||||
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
|
||||
+++ 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
|
||||
|
@ -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