2.6.27.19-stable review
Subsystems (12)
cover 2.6.27.19-stable review
This is the start of the stable review cycle for the 2.6.27.19 release. There are 36 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let us know. If anyone is a maintainer of the proper subsystem, and wants to add a Signed-off-by: line to the patch, please respond with it.
These patches are sent out with a number of different people on the Cc:
line. If you wish to be a reviewer, please email [email protected] to add your name to the list. If you want to be off the reviewer list, also email us.
Responses should be made by Friday, Febuary 20, 2009, 21:00:00 UTC. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v2.6/stable-review/patch-2.6.27.19-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
Makefile | 2 +- arch/powerpc/kernel/align.c | 7 +- arch/x86/mm/pageattr.c | 14 + drivers/ata/pata_via.c | 4 +- drivers/ata/sata_nv.c | 14 +- drivers/bluetooth/btsdio.c | 3 +- drivers/net/3c505.c | 26 ++- drivers/pci/intel-iommu.c | 13 +- drivers/scsi/libiscsi.c | 1 + fs/ext2/super.c | 9 +- fs/ext4/balloc.c | 156 +++++++++++- fs/ext4/ext4.h | 41 +++- fs/ext4/ext4_sb.h | 4 +- fs/ext4/hash.c | 77 +++++- fs/ext4/ialloc.c | 166 ++++++++----- fs/ext4/inode.c | 59 ++++- fs/ext4/mballoc.c | 595 ++++++++++++++++++++++++++++++++----------- fs/ext4/mballoc.h | 51 ++-- fs/ext4/namei.c | 28 ++- fs/ext4/resize.c | 61 +---- fs/ext4/super.c | 46 +++- fs/jbd2/commit.c | 27 ++- include/linux/jbd2.h | 4 +- include/linux/pci_ids.h | 1 + include/linux/pid.h | 18 ++ ipc/mqueue.c | 3 +- 26 files changed, 1068 insertions(+), 362 deletions(-)
PATCH 1/36 pid: implement ns_of_pid
2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Eric W. Biederman <[email protected]>
commit f9fb860f67b9542cd78d1558dec7058092b57d8e upstream.
A current problem with the pid namespace is that it is easy to do pid related work after exit_task_namespaces which drops the nsproxy pointer.
However if we are doing pid namespace related work we are always operating on some struct pid which retains the pid_namespace pointer of the pid namespace it was allocated in.
So provide ns_of_pid which allows us to find the pid namespace a pid was allocated in.
Using this we have the needed infrastructure to do pid namespace related work at anytime we have a struct pid, removing the chance of accidentally having a NULL pointer dereference when accessing current->nsproxy.
--- include/linux/pid.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
include/linux/pid.h +18 -0
@@ -123,6 +123,24 @@ extern struct pid *alloc_pid(struct pid_extern void free_pid (struct pid *pid);/* +* ns_of_pid() returns the pid namespace in which the specified pid was +* allocated. +* +* NOTE: +* ns_of_pid() is expected to be called for a process (task) that has +* an attached 'struct pid' (see attach_pid(), detach_pid()) i.e @pid +* is expected to be non-NULL. If @pid is NULL, caller should handle +* the resulting NULL pid-ns. +*/ +static inline struct pid_namespace *ns_of_pid (struct pid *pid) +{ +struct pid_namespace *ns =NULL ; +if (pid) + ns = pid->numbers[pid->level].ns; +return ns; +} + +/* * the helpers to get the pid's id seen from different namespaces * * pid_nr() : global id, i.e. the id seen from the init namespace;
PATCH 2/36 mqueue: fix si_pid value in mqueue do_notify()
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Sukadev Bhattiprolu <[email protected]>
commit a6684999f7c6bddd75cf9755ad7ff44435f72fff upstream.
If a process registers for asynchronous notification on a POSIX message queue, it gets a signal and a siginfo_t structure when a message arrives on the message queue. The si_pid in the siginfo_t structure is set to the PID of the process that sent the message to the message queue.
The principle is the following:
. when mq_notify(SIGEV_SIGNAL) is called, the caller registers for
notification when a msg arrives. The associated pid structure is stroed into inode_info->notify_owner. Let's call this process P1.
. when mq_send() is called by say P2, P2 sends a signal to P1 to notify
him about msg arrival.
The way .si_pid is set today is not correct, since it doesn't take into account the fact that the process that is sending the message might not be in the same namespace as the notified one.
This patch proposes to set si_pid to the sender's pid into the notify_owner namespace.
--- ipc/mqueue.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
ipc/mqueue.c +2 -1
@@ -498,7 +498,8 @@ static void __do_notify(struct mqueue_in sig_i.si_errno =0 ; sig_i.si_code =SI_MESGQ ; sig_i.si_value = info->notify.sigev_value; - sig_i.si_pid =task_tgid_vnr (current); + sig_i.si_pid =task_tgid_nr_ns (current, +ns_of_pid (info->notify_owner)); sig_i.si_uid = current->uid; kill_pid_info(info->notify.sigev_signo,
PATCH 3/36 Fix Intel IOMMU write-buffer flushing
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: David Woodhouse <[email protected]>
commit ca77fde8e62cecb2c0769052228d15b901367af8 upstream.
This is the cause of the DMA faults and disk corruption that people have been seeing. Some chipsets neglect to report the RWBF "capability" -- the flag which says that we need to flush the chipset write-buffer when changing the DMA page tables, to ensure that the change is visible to the IOMMU.
Override that bit on the affected chipsets, and everything is happy again.
Thanks to Chris and Bhavesh and others for helping to debug.
--- drivers/pci/intel-iommu.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/pci/intel-iommu.c +12 -1
@@ -527,7 +527,7 @@ static void iommu_flush_write_buffer(stru32 val;unsigned long flag; -if (!cap_rwbf (iommu->cap)) +if (!rwbf_quirk && !cap_rwbf (iommu->cap))return ; val = iommu->gcmd |DMA_GCMD_WBF ;
@@ -1410,6 +1410,8 @@ static void domain_remove_dev_info(strucspin_unlock_irqrestore (&device_domain_lock, flags); } +static int rwbf_quirk =0 ; +/* * find_domain * Note: we use struct pci_dev->dev.archdata.iommu stores the info
@@ -2453,3 +2455,12 @@ int __init intel_iommu_init(void)return 0 ; } +static void __devinit quirk_iommu_rwbf (struct pci_dev *dev) +{ +/* Mobile 4 Series Chipset neglects to set RWBF capability, +but needs it */ +printk (KERN_INFO "DMAR: Forcing write-buffer flush capability\n" ); + rwbf_quirk =1 ; +} + +DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_INTEL ,0x2a40 , quirk_iommu_rwbf);
Re: [patch 03/36] Fix Intel IOMMU write-buffer flushing
This patch is broken compared to what's in:
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ca77fde8e62cecb2c0769052228d15b901367af8
attached patch fixes it
--
Thomas
[thomas@tmb linux-2.6.27.18.test]$ LC_ALL=C make drivers/pci/
CHK include/linux/version.h CHK include/linux/utsrelease.h CALL scripts/checksyscalls.sh CC drivers/pci/intel-iommu.o
drivers/pci/intel-iommu.c: In function 'iommu_flush_write_buffer':drivers/pci/intel-iommu.c:530: error: 'rwbf_quirk' undeclared (first use in this function) drivers/pci/intel-iommu.c:530: error: (Each undeclared identifier is reported only once drivers/pci/intel-iommu.c:530: error: for each function it appears in.) make[1]: *** [drivers/pci/intel-iommu.o] Error 1
make: *** [drivers/pci/] Error 2
drivers/pci/intel-iommu.c renamed from drivers/pci/intel-iommu.c.orig +2 -2
@@ -72,6 +72,8 @@ static struct deferred_flush_tables *def/* bitmap for indexing intel_iommus */ static int g_num_of_iommus; +static int rwbf_quirk =0 ; +static DEFINE_SPINLOCK (async_umap_flush_lock);static LIST_HEAD (unmaps_to_do);
@@ -1410,8 +1412,6 @@ static void domain_remove_dev_info(strucspin_unlock_irqrestore (&device_domain_lock, flags); } -static int rwbf_quirk =0 ; -/* * find_domain * Note: we use struct pci_dev->dev.archdata.iommu stores the info
Re: [patch 03/36] Fix Intel IOMMU write-buffer flushing
Thomas Backlund skrev:
Quoted 6 lines
This patch is broken compared to what's in:
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ca77fde8e62cecb2c0769052228d15b901367af8attached patch fixes it
As no-one responded yet...
I forgot to tell how to reproduce it:
on x86_64:
make defconfig
make
and you will end up with:
[thomas@tmb linux-2.6.27.19-rc1]$ LC_ALL=C make
CHK include/linux/version.h CHK include/linux/utsrelease.h CALL scripts/checksyscalls.sh CHK include/linux/compile.h CC drivers/pci/intel-iommu.o
drivers/pci/intel-iommu.c: In function 'iommu_flush_write_buffer':drivers/pci/intel-iommu.c:530: error: 'rwbf_quirk' undeclared (first use in this function) drivers/pci/intel-iommu.c:530: error: (Each undeclared identifier is reported only once drivers/pci/intel-iommu.c:530: error: for each function it appears in.) make[2]: *** [drivers/pci/intel-iommu.o] Error 1
make[1]: *** [drivers/pci] Error 2
make: *** [drivers] Error 2
[thomas@tmb linux-2.6.27.19-rc1]$
This happends because 'rwbf_quirk' is declared after it's first use.
The upstream git has 'rwbf_quirk' declared before any use of it.
That's what my patch fixes, by simply moving
static int rwbf_quirk = 0;
to the beginning of the file...
Hopefully this helps.
--
Thomas
Re: [patch 03/36] Fix Intel IOMMU write-buffer flushing
Quoted 6 lines · Thomas Backlund
Thomas Backlund skrev:
Quoted 3 lines
This patch is broken compared to what's in:
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ca77fde8e62cecb2c0769052228d15b901367af8
attached patch fixes itAs no-one responded yet...
Sorry for the delay, you're right, I messed this one up. I'll merge your fix into the patch before doing the release tomorrow.
Thanks for letting us know.
greg k-h
Re: [patch 03/36] Fix Intel IOMMU write-buffer flushing
Greg KH skrev:
Quoted 9 lines · Thomas Backlund
Quoted 4 lines
Thomas Backlund skrev:
Quoted 2 lines
This patch is broken compared to what's in:
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ca77fde8e62cecb2c0769052228d15b901367af8 attached patch fixes itAs no-one responded yet...
Sorry for the delay, you're right, I messed this one up. I'll merge your fix into the patch before doing the release tomorrow.
OK, Thanks.
Quoted 2 lines
Thanks for letting us know.
No problem....
I see you have the same patch & bug in the 2.6.28.7-rc1, so it needs the same fix...
The patch I already sent will apply with fuzz, but is applied correctly
--
Thomas
Re: [patch 03/36] Fix Intel IOMMU write-buffer flushing
In reply to Thomas BacklundQuoted 6 lines · Thomas Backlund
That's what my patch fixes, by simply moving
static int
rwbf_quirk= 0;to the beginning of the file...
s/ = 0//
It was originally hard-coded to something other than zero, and I neglected to remove the initialiser when I changed it to zero after working out the correct PCI ID to trigger on.
Signature · 13 lines
David Woodhouse Open Source Technology Centre [email protected] Intel Corporation --------------------------------------------------------------------- Intel Corporation (UK) Limited Registered No. 1134945 (England) Registered Office: Pipers Way, Swindon SN3 1RJ VAT No: 860 2173 47 This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
PATCH 4/36 powerpc/vsx: Fix VSX alignment handler for regs 32-63
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Michael Neuling <[email protected]>
commit 26456dcfb8d8e43b1b64b2a14710694cf7a72f05 upstream.
Fix the VSX alignment handler for VSX registers > 32. 32-63 are stored in the VMX part of the thread_struct not the FPR part.
--- arch/powerpc/kernel/align.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
arch/powerpc/kernel/align.c +6 -1
@@ -646,11 +646,16 @@ static int emulate_vsx(unsigned char __u unsigned int areg, struct pt_regs *regs, unsigned int flags, unsigned int length) { - char *ptr = (char *) ¤t->thread.TS_FPR(reg); + char *ptr;int ret =0 ;flush_vsx_to_thread (current); +if (reg <32 ) + ptr = (char *) ¤t->thread.TS_FPR (reg); +else + ptr = (char *) ¤t->thread.vr[reg -32 ]; +if (flags &ST ) ret =__copy_to_user (addr, ptr, length);else {
PATCH 5/36 sata_nv: give up hardreset on nf2
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Tejun Heo <[email protected]>
commit 7dac745b8e367c99175b8f0d014d996f0e5ed9e5 upstream.
Kernel bz#12176 reports that nf2 hardreset simply doesn't work. Give up. Argh...
--- drivers/ata/sata_nv.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/ata/sata_nv.c +8 -6
@@ -421,19 +421,21 @@ static struct ata_port_operations nv_gen .hardreset = ATA_OP_NULL, }; -/* OSDL bz3352 reports that nf2/3 controllers can't determine device -* signature reliably. Also, the following thread reports detection -* failure on cold boot with the standard debouncing timing. +/* nf2 is ripe with hardreset related problems. +* +* kernel bz#3352 reports nf2/3 controllers can't determine device +* signature reliably. The following thread reports detection failure +* on cold boot with the standard debouncing timing. * * http://thread.gmane.org/gmane.linux.ide/34098 * -* Debounce with hotplug timing and request follow-up SRST. +* And bz#12176 reports that hardreset simply doesn't work on nf2. +* Give up on it and just don't do hardreset. */ static struct ata_port_operations nv_nf2_ops = { - .inherits = &nv_common_ops, + .inherits = &nv_generic_ops, .freeze = nv_nf2_freeze, .thaw = nv_nf2_thaw, - .hardreset = nv_noclassify_hardreset, };/* For initial probing after boot and hot plugging, hardreset mostly
PATCH 6/36 3c505: do not set pcb->data.raw beyond its size
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Roel Kluin <[email protected]>
commit 501aa061bd68169a5b54c123641f8dfa9ad31545 upstream.
Ensure that we do not set pcb->data.raw beyond its size, print an error message and return false if we attempt to. A timout message was printed one too early.
--- drivers/net/3c505.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-)
drivers/net/3c505.c +16 -10
@@ -493,21 +493,27 @@ static bool receive_pcb(struct net_devic }/* read the data */ spin_lock_irqsave (&adapter->lock, flags); - i =0 ; -do { - j =0 ; -while (((stat =get_status (dev->base_addr)) &ACRF ) ==0 && j++ <20000 ); - pcb->data.raw[i++] =inb_command (dev->base_addr); -if (i >MAX_PCB_DATA ) -INVALID_PCB_MSG (i); - }while ((stat &ASF_PCB_MASK ) !=ASF_PCB_END && j <20000 ); +for (i =0 ; i <MAX_PCB_DATA ; i++) { +for (j =0 ; j <20000 ; j++) { + stat =get_status (dev->base_addr); +if (stat &ACRF ) +break ; + } + pcb->data.raw[i] =inb_command (dev->base_addr); +if ((stat &ASF_PCB_MASK ) ==ASF_PCB_END || j >=20000 ) +break ; + }spin_unlock_irqrestore (&adapter->lock, flags); +if (i >=MAX_PCB_DATA ) { +INVALID_PCB_MSG (i); +return false; + }if (j >=20000 ) {TIMEOUT_MSG (__LINE__);return false; } -/* woops, the last "data" byte was really the length! */ - total_length = pcb->data.raw[--i]; +/* the last "data" byte was really the length! */ + total_length = pcb->data.raw[i];/* safety check total length vs data length */ if (total_length != (pcb->length +2 )) {
PATCH 7/36 Add support for VT6415 PCIE PATA IDE Host Controller
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Zlatko Calusic <[email protected]>
commit 5955c7a2cfb6a35429adea5dc480002b15ca8cfc upstream.
--- drivers/ata/pata_via.c | 4 +++- include/linux/pci_ids.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-)
drivers/ata/pata_via.c +3 -1
@@ -111,7 +111,8 @@ static const struct via_isa_bridge { { "vt8237s", PCI_DEVICE_ID_VIA_8237S, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, { "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, { "cx700", PCI_DEVICE_ID_VIA_CX700, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_SATA_PATA }, - { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES}, + { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES }, + { "vt6415", PCI_DEVICE_ID_VIA_6415, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES }, { "vt8237a", PCI_DEVICE_ID_VIA_8237A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
@@ -594,6 +595,7 @@ static int via_reinit_one(struct pci_dev#endif static const struct pci_device_id via[] = { + {PCI_VDEVICE (VIA ,0x0415 ), }, {PCI_VDEVICE (VIA ,0x0571 ), }, {PCI_VDEVICE (VIA ,0x0581 ), }, {PCI_VDEVICE (VIA ,0x1571 ), },
include/linux/pci_ids.h +1 -0
@@ -1301,6 +1301,7 @@#define PCI_DEVICE_ID_VIA_VT3351 0x0351#define PCI_DEVICE_ID_VIA_VT3364 0x0364#define PCI_DEVICE_ID_VIA_8371_0 0x0391 +#define PCI_DEVICE_ID_VIA_6415 0x0415#define PCI_DEVICE_ID_VIA_8501_0 0x0501#define PCI_DEVICE_ID_VIA_82C561 0x0561#define PCI_DEVICE_ID_VIA_82C586_1 0x0571
PATCH 8/36 Bluetooth: Fix TX error path in btsdio driver
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Tomas Winkler <[email protected]>
commit 7644d63d1348ec044ccd8f775fefe5eb7cbcac69 upstream.
This patch fixes accumulating of the header in case packet was requeued in the error path.
--- drivers/bluetooth/btsdio.c | 1 + 1 file changed, 1 insertion(+)
drivers/bluetooth/btsdio.c +1 -0
@@ -91,6 +91,7 @@ static int btsdio_tx_packet(struct btsdi err =sdio_writesb (data->func,REG_TDAT , skb->data, skb->len);if (err <0 ) { +skb_pull (skb,4 );sdio_writeb (data->func,0x01 ,REG_PC_WRT ,NULL );return err; }
PATCH 9/36 btsdio: free sk_buff with kfree_skb
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Sergio Luis <[email protected]>
commit cbfd24a75f98fe731547d3bc995f3a1f1fed6b20 upstream.
free sk_buff with kfree_skb, instead of kree
--- drivers/bluetooth/btsdio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/bluetooth/btsdio.c +1 -1
@@ -153,7 +153,7 @@ static int btsdio_rx_packet(struct btsdi err =sdio_readsb (data->func, skb->data,REG_RDAT , len -4 );if (err <0 ) { -kfree (skb); +kfree_skb (skb);return err; }
PATCH 10/36 ext2/xip: refuse to change xip flag during remount with busy inodes
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Carsten Otte <[email protected]>
commit 0e4a9b59282914fe057ab17027f55123964bc2e2 upstream.
For a reason that I was unable to understand in three months of debugging, mount ext2 -o remount stopped working properly when remounting from regular operation to xip, or the other way around. According to a git bisect search, the problem was introduced with the VM_MIXEDMAP/PTE_SPECIAL rework in the vm:
commit 70688e4dd1647f0ceb502bbd5964fa344c5eb411
Author: Nick Piggin <[email protected]> Date: Mon Apr 28 02:13:02 2008 -0700
xip: support non-struct page backed memory
In the failing scenario, the filesystem is mounted read only via root= kernel parameter on s390x. During remount (in rc.sysinit), the inodes of the bash binary and its libraries are busy and cannot be invalidated (the bash which is running rc.sysinit resides on subject filesystem). Afterwards, another bash process (running ifup-eth) recurses into a subshell, runs dup_mm (via fork). Some of the mappings in this bash process were created from inodes that could not be invalidated during remount.
Both parent and child process crash some time later due to inconsistencies in their address spaces. The issue seems to be timing sensitive, various attempts to recreate it have failed.
This patch refuses to change the xip flag during remount in case some inodes cannot be invalidated. This patch keeps users from running into that issue.
--- fs/ext2/super.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
fs/ext2/super.c +6 -3
@@ -1177,9 +1177,12 @@ static int ext2_remount (struct super_bl es = sbi->s_es;if (((sbi->s_mount_opt &EXT2_MOUNT_XIP ) != (old_mount_opt &EXT2_MOUNT_XIP )) && -invalidate_inodes (sb)) -ext2_warning (sb, __func__,"busy inodes while remounting " \ -"xip remain in cache (no functional problem)" ); +invalidate_inodes (sb)) { +ext2_warning (sb, __func__,"refusing change of xip flag " +"with busy inodes while remounting" ); + sbi->s_mount_opt &= ~EXT2_MOUNT_XIP ; + sbi->s_mount_opt |= old_mount_opt &EXT2_MOUNT_XIP ; + }if ((*flags &MS_RDONLY ) == (sb->s_flags &MS_RDONLY ))return 0 ;if (*flags &MS_RDONLY ) {
PATCH 11/36 SCSI: libiscsi: fix iscsi pool leak
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Mike Christie <[email protected]>
commit 2f5899a39dcffb404c9a3d06ad438aff3e03bf04 upstream.
I am not sure what happened. It looks like we have always leaked the q->queue that is allocated from the kfifo_init call. nab finally noticed that we were leaking and this patch fixes it by adding a kfree call to iscsi_pool_free. kfifo_free is not used per kfifo_init's instructions to use kfree.
--- drivers/scsi/libiscsi.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/libiscsi.c +1 -0
@@ -1844,6 +1844,7 @@ void iscsi_pool_free(struct iscsi_pool *kfree (q->pool[i]);if (q->pool)kfree (q->pool); +kfree (q->queue); }EXPORT_SYMBOL_GPL (iscsi_pool_free);
PATCH 12/36 x86/cpa: make sure cpa is safe to call in lazy mmu mode
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jeremy Fitzhardinge <[email protected]>
commit 4f06b0436b2ddbd3b67b10e77098a6862787b3eb upstream.
Impact: fix race leading to crash under KVM and Xen
The CPA code may be called while we're in lazy mmu update mode - for example, when using DEBUG_PAGE_ALLOC and doing a slab allocation in an interrupt handler which interrupted a lazy mmu update. In this case, the in-memory pagetable state may be out of date due to pending queued updates. We need to flush any pending updates before inspecting the page table. Similarly, we must explicitly flush any modifications CPA may have made (which comes down to flushing queued operations when flushing the TLB).
--- arch/x86/mm/pageattr.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
arch/x86/mm/pageattr.c +14 -0
@@ -619,6 +619,13 @@ static int __change_page_attr(struct cpaunsigned int level;pte_t *kpte, old_pte; +/* +* If we're called with lazy mmu updates enabled, the +* in-memory pte state may be stale. Flush pending updates to +* bring them up to date. +*/ +arch_flush_lazy_mmu_mode (); + repeat: kpte =lookup_address (address, &level);if (!kpte)
@@ -836,6 +843,13 @@ static int change_page_attr_set_clr(unsielse cpa_flush_all (cache); +/* +* If we've been called with lazy mmu updates enabled, then +* make sure that everything gets flushed out before we +* return. +*/ +arch_flush_lazy_mmu_mode (); + out:cpa_fill_pool (NULL );
PATCH 13/36 ext4: Add support for non-native signed/unsigned htree hash algorithms
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: "Theodore Ts'o" <[email protected]>
(cherry picked from commit f99b25897a86fcfff9140396a97261ae65fed872)
The original ext3 hash algorithms assumed that variables of type char were signed, as God and K&R intended. Unfortunately, this assumption is not true on some architectures. Userspace support for marking filesystems with non-native signed/unsigned chars was added two years ago, but the kernel-side support was never added (until now).
--- fs/ext4/ext4.h | 3 ++ fs/ext4/ext4_sb.h | 1 fs/ext4/hash.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++-------- fs/ext4/namei.c | 7 ++++ fs/ext4/super.c | 12 ++++++++ 5 files changed, 90 insertions(+), 10 deletions(-)
fs/ext4/ext4.h +3 -0
@@ -889,6 +889,9 @@ static inline __le16 ext4_rec_len_to_dis#define DX_HASH_LEGACY 0#define DX_HASH_HALF_MD4 1#define DX_HASH_TEA 2 +#define DX_HASH_LEGACY_UNSIGNED 3 +#define DX_HASH_HALF_MD4_UNSIGNED 4 +#define DX_HASH_TEA_UNSIGNED 5#ifdef __KERNEL__
fs/ext4/ext4_sb.h +1 -0
@@ -56,6 +56,7 @@ struct ext4_sb_info {u32 s_next_generation;u32 s_hash_seed[4 ];int s_def_hash_version; +int s_hash_unsigned;/* 3 if hash should be signed, 0 if not */ struct percpu_counter s_freeblocks_counter;struct percpu_counter s_freeinodes_counter;struct percpu_counter s_dirs_counter;
fs/ext4/hash.c +67 -10
126 lines not on this page · raw message
fs/ext4/namei.c +7 -0
@@ -371,6 +371,8 @@ dx_probe(struct dentry *dentry, struct i goto fail; } hinfo->hash_version = root->info.hash_version; +if (hinfo->hash_version <=DX_HASH_TEA ) + hinfo->hash_version +=EXT4_SB (dir->i_sb)->s_hash_unsigned; hinfo->seed =EXT4_SB (dir->i_sb)->s_hash_seed;if (dentry)ext4fs_dirhash (dentry->d_name.name, dentry->d_name.len, hinfo);
@@ -640,6 +642,9 @@ int ext4_htree_fill_tree(struct file *di dir = dir_file->f_path.dentry->d_inode;if (!(EXT4_I (dir)->i_flags &EXT4_INDEX_FL )) { hinfo.hash_version =EXT4_SB (dir->i_sb)->s_def_hash_version; +if (hinfo.hash_version <=DX_HASH_TEA ) + hinfo.hash_version += +EXT4_SB (dir->i_sb)->s_hash_unsigned; hinfo.seed =EXT4_SB (dir->i_sb)->s_hash_seed; count =htree_dirblock_to_tree (dir_file, dir,0 , &hinfo, start_hash, start_minor_hash);
@@ -1418,6 +1423,8 @@ static int make_indexed_dir(handle_t *ha/* Initialize as for dx_probe */ hinfo.hash_version = root->info.hash_version; +if (hinfo.hash_version <=DX_HASH_TEA ) + hinfo.hash_version +=EXT4_SB (dir->i_sb)->s_hash_unsigned; hinfo.seed =EXT4_SB (dir->i_sb)->s_hash_seed;ext4fs_dirhash (name, namelen, &hinfo); frame = frames;
fs/ext4/super.c +12 -0
@@ -2172,6 +2172,18 @@ static int ext4_fill_super(struct super_for (i =0 ; i <4 ; i++) sbi->s_hash_seed[i] =le32_to_cpu (es->s_hash_seed[i]); sbi->s_def_hash_version = es->s_def_hash_version; + i =le32_to_cpu (es->s_flags); +if (i &EXT2_FLAGS_UNSIGNED_HASH ) + sbi->s_hash_unsigned =3 ; +else if ((i &EXT2_FLAGS_SIGNED_HASH ) ==0 ) { +#ifdef __CHAR_UNSIGNED__ + es->s_flags |=cpu_to_le32 (EXT2_FLAGS_UNSIGNED_HASH ); + sbi->s_hash_unsigned =3 ; +#else + es->s_flags |=cpu_to_le32 (EXT2_FLAGS_SIGNED_HASH ); +#endif + sb->s_dirt =1 ; + }if (sbi->s_blocks_per_group > blocksize *8 ) { printk(KERN_ERR
PATCH 14/36 ext4: tone down ext4_da_writepages warnings
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: "Theodore Ts'o" <[email protected]>
(cherry picked from commit 2a21e37e48b94388f2cc8c0392f104f5443d4bb8)
If the filesystem has errors, ext4_da_writepages() will return a *lot* of errors, including lots and lots of stack dumps. While it's true that we are dropping user data on the floor, which is unfortunate, the stack dumps aren't helpful, and they tend to obscure the true original root cause of the problem. So in the case where the filesystem has aborted, return an EROFS right away.
--- fs/ext4/inode.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
fs/ext4/inode.c +15 -1
@@ -2298,6 +2298,20 @@ static int ext4_da_writepages(struct add*/ if (!mapping->nrpages || !mapping_tagged (mapping,PAGECACHE_TAG_DIRTY ))return 0 ; + +/* +* If the filesystem has aborted, it is read-only, so return +* right away instead of dumping stack traces later on that +* will obscure the real source of the problem. We test +* EXT4_MOUNT_ABORT instead of sb->s_flag's MS_RDONLY because +* the latter could be true if the filesystem is mounted +* read-only, and in that case, ext4_da_writepages should +* *never* be called, so if that ever happens, we would want +* the stack trace. +*/ +if (unlikely (sbi->s_mount_opt &EXT4_MOUNT_ABORT )) +return -EROFS ; +/* * Make sure nr_to_write is >= sbi->s_mb_stream_request * This make sure small files blocks are allocated in
@@ -2336,7 +2350,7 @@ restart_loop: handle =ext4_journal_start (inode, needed_blocks);if (IS_ERR (handle)) { ret =PTR_ERR (handle); -printk (KERN_EMERG "%s: jbd2_start: " +printk (KERN_CRIT "%s: jbd2_start: " "%ld pages, ino %lu; err %d\n" , __func__, wbc->nr_to_write, inode->i_ino, ret);dump_stack ();
PATCH 15/36 ext4: Fix the delalloc writepages to allocate blocks at the right offset.
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit 791b7f08954869d7b8ff438f3dac3cfb39778297)
When iterating through the pages which have mapped buffer_heads, we failed to update the b_state value. This results in allocating blocks at logical offset 0.
--- fs/ext4/inode.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-)
fs/ext4/inode.c +34 -5
@@ -1648,18 +1648,25 @@ struct mpage_da_data {*/ static int mpage_da_submit_io (struct mpage_da_data *mpd) { -struct address_space *mapping = mpd->inode->i_mapping; -int ret =0 , err, nr_pages, i; -unsigned long index, end; +long pages_skipped;struct pagevec pvec; +unsigned long index, end; +int ret =0 , err, nr_pages, i; +struct inode *inode = mpd->inode; +struct address_space *mapping = inode->i_mapping;BUG_ON (mpd->next_page <= mpd->first_page); -pagevec_init (&pvec,0 ); +/* +* We need to start from the first_page to the next_page - 1 +* to make sure we also write the mapped dirty buffer_heads. +* If we look at mpd->lbh.b_blocknr we would only be looking +* at the currently mapped buffer_heads. +*/ index = mpd->first_page; end = mpd->next_page -1 ; +pagevec_init (&pvec,0 );while (index <= end) { -/* XXX: optimize tail */ nr_pages =pagevec_lookup (&pvec, mapping, index,PAGEVEC_SIZE );if (nr_pages ==0 )break ;
@@ -1671,6 +1678,10 @@ static int mpage_da_submit_io(struct mpabreak ; index++; +BUG_ON (!PageLocked (page)); +BUG_ON (PageWriteback (page)); + + pages_skipped = mpd->wbc->pages_skipped; err = mapping->a_ops->writepage (page, mpd->wbc);if (!err) mpd->pages_written++;
@@ -1991,11 +2002,29 @@ static int __mpage_da_writepage(struct p bh = head;do {BUG_ON (buffer_locked (bh)); +/* +* We need to try to allocate +* unmapped blocks in the same page. +* Otherwise we won't make progress +* with the page in ext4_da_writepage +*/ if (buffer_dirty (bh) && (!buffer_mapped (bh) ||buffer_delay (bh))) {mpage_add_bh_to_extent (mpd, logical, bh);if (mpd->io_done)return MPAGE_DA_EXTENT_TAIL ; + }else if (buffer_dirty (bh) && (buffer_mapped (bh))) { +/* +* mapped dirty buffer. We need to update +* the b_state because we look at +* b_state in mpage_da_map_blocks. We don't +* update b_size because if we find an +* unmapped buffer_head later we need to +* use the b_state flag of that buffer_head. +*/ +if (mpd->lbh.b_size ==0 ) + mpd->lbh.b_state = + bh->b_state &BH_FLAGS ; } logical++; }while ((bh = bh->b_this_page) != head);
PATCH 16/36 ext4: avoid ext4_error when mounting a fs with a single bg
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit 565a9617b2151e21b22700e97a8b04e70e103153)
Remove some completely unneeded code which which caused an ext4_error to be generated when mounting a file system with only a single block group.
--- fs/ext4/super.c | 4 ---- 1 file changed, 4 deletions(-)
fs/ext4/super.c +0 -3
@@ -1493,7 +1493,6 @@ static int ext4_fill_flex_info(struct suext4_group_t flex_group_count;ext4_group_t flex_group;int groups_per_flex =0 ; -__u64 block_bitmap =0 ;int i;if (!sbi->s_es->s_log_groups_per_flex) {
@@ -1516,9 +1515,6 @@ static int ext4_fill_flex_info(struct su goto failed; } - gdp =ext4_get_group_desc (sb,1 , &bh); - block_bitmap =ext4_block_bitmap (sb, gdp) -1 ;
PATCH 17/36 ext4: Widen type of ext4_sb_info.s_mb_maxs[]
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Yasunori Goto <[email protected]>
(cherry picked from commit ff7ef329b268b603ea4a2303241ef1c3829fd574)
I chased the cause of following ext4 oops report which is tested on ia64 box.
http://bugzilla.kernel.org/show_bug.cgi?id=12018
The cause is the size of s_mb_maxs array that is defined as "unsigned short" in ext4_sb_info structure. If the file system's block size is 8k or greater, an unsigned short is not wide enough to contain the value fs->blocksize << 3.
--- fs/ext4/ext4_sb.h | 3 ++- fs/ext4/mballoc.c | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-)
fs/ext4/ext4_sb.h +2 -1
@@ -103,7 +103,8 @@ struct ext4_sb_info {struct list_head s_committed_transaction;spinlock_t s_md_lock;tid_t s_last_transaction; -unsigned short *s_mb_offsets, *s_mb_maxs; +unsigned short *s_mb_offsets; +unsigned int *s_mb_maxs;/* tunables */ unsigned long s_stripe;
fs/ext4/mballoc.c +2 -0
@@ -2495,6 +2495,8 @@ int ext4_mb_init(struct super_block *sb,clear_opt (sbi->s_mount_opt,MBALLOC );return -ENOMEM ; } + + i = (sb->s_blocksize_bits +2 ) *sizeof (unsigned int ); sbi->s_mb_maxs =kmalloc (i,GFP_KERNEL );if (sbi->s_mb_maxs ==NULL ) {clear_opt (sbi->s_mount_opt,MBALLOC );
PATCH 18/36 jbd2: Add barrier not supported test to journal_wait_on_commit_record
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: "Theodore Ts'o" <[email protected]>
(cherry picked from commit fd98496f467b3d26d05ab1498f41718b5ef13de5)
Xen doesn't report that barriers are not supported until buffer I/O is reported as completed, instead of when the buffer I/O is submitted. Add a check and a fallback codepath to journal_wait_on_commit_record() to detect this case, so that attempts to mount ext4 filesystems on LVM/devicemapper devices on Xen guests don't blow up with an "Aborting journal on device XXX"; "Remounting filesystem read-only" error.
Thanks to Andreas Sundstrom for reporting this issue.
--- fs/jbd2/commit.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-)
fs/jbd2/commit.c +25 -2
@@ -24,6 +24,7 @@#include <linux/crc32.h> #include <linux/writeback.h> #include <linux/backing-dev.h> +#include <linux/bio.h> /* * Default IO end handler for temporary BJ_IO buffer_heads.
@@ -170,12 +171,34 @@ static int journal_submit_commit_record(* This function along with journal_submit_commit_record * allows to write the commit record asynchronously. */ -static int journal_wait_on_commit_record (struct buffer_head *bh) +static int journal_wait_on_commit_record (journal_t *journal, +struct buffer_head *bh) {int ret =0 ; +retry:clear_buffer_dirty (bh);wait_on_buffer (bh); +if (buffer_eopnotsupp (bh) && (journal->j_flags &JBD2_BARRIER )) { +printk (KERN_WARNING +"JBD2: wait_on_commit_record: sync failed on %s - " +"disabling barriers\n" , journal->j_devname); +spin_lock (&journal->j_state_lock); + journal->j_flags &= ~JBD2_BARRIER ; +spin_unlock (&journal->j_state_lock); + +lock_buffer (bh); +clear_buffer_dirty (bh); +set_buffer_uptodate (bh); + bh->b_end_io = journal_end_buffer_io_sync; + + ret =submit_bh (WRITE_SYNC , bh); +if (ret) { +unlock_buffer (bh); +return ret; + } + goto retry; + }if (unlikely (!buffer_uptodate (bh))) ret = -EIO ;
@@ -795,7 +818,7 @@ wait_for_iobuf:__jbd2_journal_abort_hard (journal); }if (!err && !is_journal_aborted (journal)) - err =journal_wait_on_commit_record (cbh); + err =journal_wait_on_commit_record (journal, cbh);if (err)jbd2_journal_abort (journal, err);
PATCH 19/36 ext4: Dont overwrite allocation_context ac_status
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit 032115fcef837a00336ddf7bda584e89789ea498)
We can call ext4_mb_check_limits even after successfully allocating the requested blocks. In that case, make sure we don't overwrite ac_status if it already has the status AC_STATUS_FOUND. This fixes the lockdep warning:
=============================================
[ INFO: possible recursive locking detected ]
2.6.28-rc6-autokern1 #1
---------------------------------------------
fsstress/11948 is trying to acquire lock:
(&meta_group_info[i]->alloc_sem){----}, at: [<c04d9a49>] ext4_mb_load_buddy+0x9f/0x278
.....
stack backtrace:
.....
[<c04db974>] ext4_mb_regular_allocator+0xbb5/0xd44
.....
but task is already holding lock:
(&meta_group_info[i]->alloc_sem){----}, at: [<c04d9a49>] ext4_mb_load_buddy+0x9f/0x278
--- fs/ext4/mballoc.c | 2 ++ 1 file changed, 2 insertions(+)
fs/ext4/mballoc.c +2 -0
@@ -1326,6 +1326,8 @@ static void ext4_mb_check_limits(structstruct ext4_free_extent ex;int max; +if (ac->ac_status ==AC_STATUS_FOUND ) +return ;/* * We don't want to scan for a whole year */
PATCH 20/36 ext4: Add blocks added during resize to bitmap
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit e21675d4b63975d09eb75c443c48ebe663d23e18)
With this change new blocks added during resize are marked as free in the block bitmap and the group is flagged with EXT4_GROUP_INFO_NEED_INIT_BIT flag. This make sure when mballoc tries to allocate blocks from the new group we would reload the buddy information using the bitmap present in the disk.
--- fs/ext4/balloc.c | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/ext4/ext4.h | 6 +- fs/ext4/resize.c | 11 ---- 3 files changed, 132 insertions(+), 11 deletions(-)
fs/ext4/balloc.c +126 -0
@@ -20,6 +20,7 @@#include "ext4.h" #include "ext4_jbd2.h" #include "group.h" +#include "mballoc.h" /* * balloc.c contains the blocks allocation and deallocation routines
@@ -837,6 +838,131 @@ error_return: }/** +* ext4_add_groupblocks() -- Add given blocks to an existing group +* @handle: handle to this transaction +* @sb: super block +* @block: start physcial block to add to the block group +* @count: number of blocks to free +* +* This marks the blocks as free in the bitmap. We ask the +* mballoc to reload the buddy after this by setting group +* EXT4_GROUP_INFO_NEED_INIT_BIT flag +*/ +void ext4_add_groupblocks (handle_t *handle,struct super_block *sb, +ext4_fsblk_t block,unsigned long count) +{ +struct buffer_head *bitmap_bh =NULL ; +struct buffer_head *gd_bh; +ext4_group_t block_group; +ext4_grpblk_t bit; +unsigned long i; +struct ext4_group_desc *desc; +struct ext4_super_block *es; +struct ext4_sb_info *sbi; +int err =0 , ret; +ext4_grpblk_t blocks_freed; +struct ext4_group_info *grp; + + sbi =EXT4_SB (sb); + es = sbi->s_es; +ext4_debug ("Adding block(s) %llu-%llu\n" , block, block + count -1 ); + +ext4_get_group_no_and_offset (sb, block, &block_group, &bit); +/* +* Check to see if we are freeing blocks across a group +* boundary. +*/ +if (bit + count >EXT4_BLOCKS_PER_GROUP (sb)) + goto error_return; + + bitmap_bh =ext4_read_block_bitmap (sb, block_group); +if (!bitmap_bh) + goto error_return; + desc =ext4_get_group_desc (sb, block_group, &gd_bh); +if (!desc) + goto error_return; + +if (in_range (ext4_block_bitmap (sb, desc), block, count) || +in_range (ext4_inode_bitmap (sb, desc), block, count) || +in_range (block,ext4_inode_table (sb, desc), sbi->s_itb_per_group) || +in_range (block + count -1 ,ext4_inode_table (sb, desc), + sbi->s_itb_per_group)) { +ext4_error (sb, __func__, +"Adding blocks in system zones - " +"Block = %llu, count = %lu" , + block, count); + goto error_return; + } + +/* +* We are about to add blocks to the bitmap, +* so we need undo access. +*/ +BUFFER_TRACE (bitmap_bh,"getting undo access" ); + err =ext4_journal_get_undo_access (handle, bitmap_bh); +if (err) + goto error_return; + +/* +* We are about to modify some metadata. Call the journal APIs +* to unshare ->b_data if a currently-committing transaction is +* using it +*/ +BUFFER_TRACE (gd_bh,"get_write_access" ); + err =ext4_journal_get_write_access (handle, gd_bh); +if (err) + goto error_return; + +for (i =0 , blocks_freed =0 ; i < count; i++) { +BUFFER_TRACE (bitmap_bh,"clear bit" ); +if (!ext4_clear_bit_atomic (sb_bgl_lock (sbi, block_group), + bit + i, bitmap_bh->b_data)) { +ext4_error (sb, __func__, +"bit already cleared for block %llu" , + (ext4_fsblk_t)(block + i)); +BUFFER_TRACE (bitmap_bh,"bit already cleared" ); + }else { + blocks_freed++; + } + } +spin_lock (sb_bgl_lock (sbi, block_group)); +le16_add_cpu (&desc->bg_free_blocks_count, blocks_freed); + desc->bg_checksum =ext4_group_desc_csum (sbi, block_group, desc); +spin_unlock (sb_bgl_lock (sbi, block_group)); +percpu_counter_add (&sbi->s_freeblocks_counter, blocks_freed); + +if (sbi->s_log_groups_per_flex) { +ext4_group_t flex_group =ext4_flex_group (sbi, block_group); +spin_lock (sb_bgl_lock (sbi, flex_group)); + sbi->s_flex_groups[flex_group].free_blocks += blocks_freed; +spin_unlock (sb_bgl_lock (sbi, flex_group)); + } + +/* We dirtied the bitmap block */ +BUFFER_TRACE (bitmap_bh,"dirtied bitmap block" ); + err =ext4_journal_dirty_metadata (handle, bitmap_bh); + +/* And the group descriptor block */ +BUFFER_TRACE (gd_bh,"dirtied group descriptor block" ); + ret =ext4_journal_dirty_metadata (handle, gd_bh); +if (!err) + err = ret; + sb->s_dirt =1 ; +/* +* request to reload the buddy with the +* new bitmap information +*/ + grp =ext4_get_group_info (sb, block_group); +set_bit (EXT4_GROUP_INFO_NEED_INIT_BIT , &(grp->bb_state)); +ext4_mb_update_group_info (grp, blocks_freed); + +error_return: +brelse (bitmap_bh); +ext4_std_error (sb, err); +return ; +} + +/** * ext4_free_blocks() -- Free given blocks and update quota * @handle: handle for this transaction * @inode: inode
fs/ext4/ext4.h +4 -2
@@ -991,9 +991,11 @@ extern ext4_fsblk_t ext4_has_free_blocks ext4_fsblk_t nblocks);extern void ext4_free_blocks (handle_t *handle,struct inode *inode,ext4_fsblk_t block,unsigned long count,int metadata); -extern void ext4_free_blocks_sb (handle_t *handle,struct super_block *sb, -ext4_fsblk_t block,unsigned long count, +extern void ext4_free_blocks_sb (handle_t *handle,struct super_block *sb, +ext4_fsblk_t block,unsigned long count,unsigned long *pdquot_freed_blocks); +extern void ext4_add_groupblocks (handle_t *handle,struct super_block *sb, +ext4_fsblk_t block,unsigned long count);extern ext4_fsblk_t ext4_count_free_blocks (struct super_block *);extern void ext4_check_blocks_bitmap (struct super_block *); extern struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb,
fs/ext4/resize.c +2 -6
@@ -976,9 +976,7 @@ int ext4_group_extend(struct super_blockstruct buffer_head * bh;handle_t *handle;int err; -unsigned long freed_blocks;ext4_group_t group; -struct ext4_group_info *grp;/* We don't need to worry about locking wrt other resizers just * yet: we're going to revalidate es->s_blocks_count after
@@ -1077,7 +1075,8 @@ int ext4_group_extend(struct super_blockunlock_super (sb);ext4_debug ("freeing blocks %llu through %llu\n" , o_blocks_count, o_blocks_count + add); -ext4_free_blocks_sb (handle, sb, o_blocks_count, add, &freed_blocks); +/* We add the blocks to the bitmap and set the group need init bit */ +ext4_add_groupblocks (handle, sb, o_blocks_count, add);ext4_debug ("freed blocks %llu through %llu\n" , o_blocks_count, o_blocks_count + add);if ((err =ext4_journal_stop (handle)))
@@ -1113,12 +1112,6 @@ int ext4_group_extend(struct super_blockClearPageUptodate (page);page_cache_release (page); } - -/* Get the info on the last group */ - grp =ext4_get_group_info (sb, group);
PATCH 21/36 ext4: Use EXT4_GROUP_INFO_NEED_INIT_BIT during resize
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit 920313a726e04fef0f2c0bcb04ad8229c0e700d8)
The new groups added during resize are flagged as need_init group. Make sure we properly initialize these groups. When we have block size < page size and we are adding new groups the page may still be marked uptodate even though we haven't initialized the group. While forcing the init of buddy cache we need to make sure other groups part of the same page of buddy cache is not using the cache. group_info->alloc_sem is added to ensure the same.
--- fs/ext4/balloc.c | 21 ++-- fs/ext4/ext4.h | 7 - fs/ext4/mballoc.c | 259 +++++++++++++++++++++++++++++++++++++++++------------- fs/ext4/mballoc.h | 3 fs/ext4/resize.c | 42 +------- 5 files changed, 229 insertions(+), 103 deletions(-)
fs/ext4/balloc.c +13 -8
@@ -868,6 +868,7 @@ void ext4_add_groupblocks(handle_t *handext4_debug ("Adding block(s) %llu-%llu\n" , block, block + count -1 );ext4_get_group_no_and_offset (sb, block, &block_group, &bit); + grp =ext4_get_group_info (sb, block_group);/* * Check to see if we are freeing blocks across a group * boundary.
@@ -912,7 +913,11 @@ void ext4_add_groupblocks(handle_t *hand err =ext4_journal_get_write_access (handle, gd_bh);if (err) goto error_return; - +/* +* make sure we don't allow a parallel init on other groups in the +* same buddy cache +*/ +down_write (&grp->alloc_sem); for (i = 0, blocks_freed = 0; i < count; i++) { BUFFER_TRACE(bitmap_bh, "clear bit"); if (!ext4_clear_bit_atomic(sb_bgl_lock(sbi, block_group),
@@ -937,6 +942,13 @@ void ext4_add_groupblocks(handle_t *hand sbi->s_flex_groups[flex_group].free_blocks += blocks_freed;spin_unlock (sb_bgl_lock (sbi, flex_group)); } +/* +* request to reload the buddy with the +* new bitmap information +*/ +set_bit (EXT4_GROUP_INFO_NEED_INIT_BIT , &(grp->bb_state)); +ext4_mb_update_group_info (grp, blocks_freed); +up_write (&grp->alloc_sem);/* We dirtied the bitmap block */ BUFFER_TRACE (bitmap_bh,"dirtied bitmap block" );
@@ -948,13 +960,6 @@ void ext4_add_groupblocks(handle_t *handif (!err) err = ret; sb->s_dirt =1 ; -/* -* request to reload the buddy with the -* new bitmap information -*/ - grp =ext4_get_group_info (sb, block_group); -set_bit (EXT4_GROUP_INFO_NEED_INIT_BIT , &(grp->bb_state)); -ext4_mb_update_group_info (grp, blocks_freed); error_return:brelse (bitmap_bh);
fs/ext4/ext4.h +4 -3
@@ -1043,12 +1043,13 @@ extern int __init init_ext4_mballoc(voidextern void exit_ext4_mballoc (void );extern void ext4_mb_free_blocks (handle_t *,struct inode *,unsigned long ,unsigned long ,int ,unsigned long *); -extern int ext4_mb_add_more_groupinfo (struct super_block *sb, +extern int ext4_mb_add_groupinfo (struct super_block *sb,ext4_group_t i,struct ext4_group_desc *desc);extern void ext4_mb_update_group_info (struct ext4_group_info *grp,ext4_grpblk_t add); - - +extern int ext4_mb_get_buddy_cache_lock (struct super_block *,ext4_group_t ); +extern void ext4_mb_put_buddy_cache_lock (struct super_block *, +ext4_group_t ,int );/* inode.c */ int ext4_forget (handle_t *handle,int is_metadata,struct inode *inode,struct buffer_head *bh,ext4_fsblk_t blocknr);
fs/ext4/mballoc.c +201 -58
349 lines not on this page · raw message
fs/ext4/mballoc.h +3 -0
@@ -18,6 +18,7 @@#include <linux/pagemap.h> #include <linux/seq_file.h> #include <linux/version.h> +#include <linux/mutex.h> #include "ext4_jbd2.h" #include "ext4.h" #include "group.h"
@@ -122,6 +123,7 @@ struct ext4_group_info {#ifdef DOUBLE_CHECK void *bb_bitmap;#endif +struct rw_semaphore alloc_sem;unsigned short bb_counters[]; };
@@ -242,6 +244,7 @@ struct ext4_buddy {struct super_block *bd_sb;__u16 bd_blkbits;ext4_group_t bd_group; +struct rw_semaphore *alloc_semp; };#define EXT4_MB_BITMAP (e4b) ((e4b)->bd_bitmap)#define EXT4_MB_BUDDY (e4b) ((e4b)->bd_buddy)
fs/ext4/resize.c +8 -33
75 lines not on this page · raw message
PATCH 22/36 ext4: cleanup mballoc header files
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit c3a326a657562dab81acf05aee106dc1fe345eb4)
Move some of the forward declaration of the static functions to mballoc.c where they are used. This enables us to include mballoc.h in other .c files. Also correct the buddy cache documentation.
--- fs/ext4/mballoc.c | 22 ++++++++++++++++++---- fs/ext4/mballoc.h | 20 +------------------- 2 files changed, 19 insertions(+), 23 deletions(-)
fs/ext4/mballoc.c +18 -4
@@ -100,7 +100,7 @@* inode as: * * { page } -* [ group 0 buddy][ group 0 bitmap] [group 1][ group 1]... +* [ group 0 bitmap][ group 0 buddy] [group 1][ group 1]... * * * one block each for bitmap and buddy information. So for each group we
@@ -330,6 +330,15 @@* object * */ +static struct kmem_cache *ext4_pspace_cachep; +static struct kmem_cache *ext4_ac_cachep; +static void ext4_mb_generate_from_pa (struct super_block *sb,void *bitmap, +ext4_group_t group); +static int ext4_mb_init_per_dev_proc (struct super_block *sb); +static int ext4_mb_destroy_per_dev_proc (struct super_block *sb); +static void ext4_mb_free_committed_blocks (struct super_block *); +static void ext4_mb_poll_new_transaction (struct super_block *sb, +handle_t *handle);static inline void *mb_correct_addr_and_bit (int *bit,void *addr) {
@@ -718,7 +727,7 @@ static void ext4_mb_generate_buddy(struc* stored in the inode as * * { page } -* [ group 0 buddy][ group 0 bitmap] [group 1][ group 1]... +* [ group 0 bitmap][ group 0 buddy] [group 1][ group 1]... * * * one block each for bitmap and buddy information.
@@ -1320,8 +1329,13 @@ static void ext4_mb_use_best_found(struc ac->ac_tail = ret &0xffff ; ac->ac_buddy = ret >>16 ; -/* XXXXXXX: SUCH A HORRIBLE **CK */ -/*FIXME!! Why ? */ +/* +* take the page reference. We want the page to be pinned +* so that we don't get a ext4_mb_init_cache_call for this +* group until we update the bitmap. That would mean we +* double allocate blocks. The reference is dropped +* in ext4_mb_release_context +*/ ac->ac_bitmap_page = e4b->bd_bitmap_page;get_page (ac->ac_bitmap_page); ac->ac_buddy_page = e4b->bd_buddy_page;
fs/ext4/mballoc.h +0 -17
@@ -97,9 +97,6 @@*/ #define MB_DEFAULT_GROUP_PREALLOC 512 -static struct kmem_cache *ext4_pspace_cachep; -static struct kmem_cache *ext4_ac_cachep; -#ifdef EXT4_BB_MAX_BLOCKS #undef EXT4_BB_MAX_BLOCKS#endif
@@ -254,8 +251,6 @@ static inline void ext4_mb_store_history {return ; } -#else -static void ext4_mb_store_history (struct ext4_allocation_context *ac);#endif #define in_range (b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1)
@@ -263,19 +258,6 @@ static void ext4_mb_store_history(structstatic struct proc_dir_entry *proc_root_ext4;struct buffer_head *read_block_bitmap (struct super_block *,ext4_group_t ); -static void ext4_mb_generate_from_pa (struct super_block *sb,void *bitmap, -ext4_group_t group); -static void ext4_mb_poll_new_transaction (struct super_block *,handle_t *); -static void ext4_mb_free_committed_blocks (struct super_block *); -static void ext4_mb_return_to_preallocation (struct inode *inode, -struct ext4_buddy *e4b,sector_t block, -int count); -static void ext4_mb_put_pa (struct ext4_allocation_context *, -struct super_block *,struct ext4_prealloc_space *pa); -static int ext4_mb_init_per_dev_proc (struct super_block *sb); -static int ext4_mb_destroy_per_dev_proc (struct super_block *sb); -
PATCH 23/36 ext4: Use an rbtree for tracking blocks freed during transaction.
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit c894058d66637c7720569fbe12957f4de64d9991 to allow commit e21675d4 to be included in 2.6.27.y)
With this patch we track the block freed during a transaction using red-black tree. We also make sure contiguous blocks freed are collected in one node in the tree.
--- fs/ext4/mballoc.c | 186 ++++++++++++++++++++++++++++++++++-------------------- fs/ext4/mballoc.h | 25 ++++--- 2 files changed, 134 insertions(+), 77 deletions(-)
fs/ext4/mballoc.c +119 -67
@@ -332,6 +332,7 @@*/ static struct kmem_cache *ext4_pspace_cachep;static struct kmem_cache *ext4_ac_cachep; +static struct kmem_cache *ext4_free_ext_cachep;static void ext4_mb_generate_from_pa (struct super_block *sb,void *bitmap,ext4_group_t group);static int ext4_mb_init_per_dev_proc (struct super_block *sb);
@@ -2506,6 +2507,7 @@ int ext4_mb_add_groupinfo(struct super_bINIT_LIST_HEAD (&meta_group_info[i]->bb_prealloc_list);init_rwsem (&meta_group_info[i]->alloc_sem); + meta_group_info[i]->bb_free_root.rb_node =NULL ;;#ifdef DOUBLE_CHECK {
@@ -2819,13 +2821,11 @@ int ext4_mb_release(struct super_block * static noinline_for_stack voidext4_mb_free_committed_blocks (struct super_block *sb) { -struct ext4_sb_info *sbi =EXT4_SB (sb); -int err; -int i; -int count =0 ; -int count2 =0 ; -struct ext4_free_metadata *md;struct ext4_buddy e4b; +struct ext4_group_info *db; +struct ext4_sb_info *sbi =EXT4_SB (sb); +int err, count =0 , count2 =0 ; +struct ext4_free_data *entry;if (list_empty (&sbi->s_committed_transaction))return ;
@@ -2833,44 +2833,46 @@ ext4_mb_free_committed_blocks(struct sup/* there is committed blocks to be freed yet */ do {/* get next array of blocks */ - md =NULL ; + entry =NULL ;spin_lock (&sbi->s_md_lock);if (!list_empty (&sbi->s_committed_transaction)) { - md =list_entry (sbi->s_committed_transaction.next, - struct ext4_free_metadata, list); -list_del (&md->list); + entry =list_entry (sbi->s_committed_transaction.next, + struct ext4_free_data, list); +list_del (&entry->list); }spin_unlock (&sbi->s_md_lock); -if (md ==NULL ) +if (entry ==NULL )break ;mb_debug ("gonna free %u blocks in group %lu (0x%p):" , - md->num, md->group, md); + entry->count, entry->group, entry); - err =ext4_mb_load_buddy (sb, md->group, &e4b); + err =ext4_mb_load_buddy (sb, entry->group, &e4b);/* we expect to find existing buddy because it's pinned */ BUG_ON (err !=0 ); + db = e4b.bd_info;/* there are blocks to put in buddy to make them really free */ - count += md->num; + count += entry->count; count2++; -ext4_lock_group (sb, md->group); -for (i =0 ; i < md->num; i++) { -mb_debug (" %u" , md->blocks[i]); -mb_free_blocks (NULL , &e4b, md->blocks[i],1 ); - } -mb_debug ("\n" ); -ext4_unlock_group (sb, md->group); - -/* balance refcounts from ext4_mb_free_metadata() */ -page_cache_release (e4b.bd_buddy_page); -page_cache_release (e4b.bd_bitmap_page); +ext4_lock_group (sb, entry->group); +/* Take it out of per group rb tree */ +rb_erase (&entry->node, &(db->bb_free_root)); +mb_free_blocks (NULL , &e4b, entry->start_blk, entry->count); + +if (!db->bb_free_root.rb_node) { +/* No more items in the per group rb tree +* balance refcounts from ext4_mb_free_metadata() +*/ +page_cache_release (e4b.bd_buddy_page); +page_cache_release (e4b.bd_bitmap_page); + } +ext4_unlock_group (sb, entry->group); -kfree (md); +kmem_cache_free (ext4_free_ext_cachep, entry);ext4_mb_release_desc (&e4b); - - }while (md); + }while (1 );mb_debug ("freed %u blocks in %u structures\n" , count, count2); }
@@ -3025,6 +3027,16 @@ int __init init_ext4_mballoc(void)kmem_cache_destroy (ext4_pspace_cachep);return -ENOMEM ; } + + ext4_free_ext_cachep = +kmem_cache_create ("ext4_free_block_extents" , +sizeof (struct ext4_free_data ), +0 ,SLAB_RECLAIM_ACCOUNT ,NULL ); +if (ext4_free_ext_cachep ==NULL ) { +kmem_cache_destroy (ext4_pspace_cachep); +kmem_cache_destroy (ext4_ac_cachep); +return -ENOMEM ; + }#ifdef CONFIG_PROC_FS proc_root_ext4 =proc_mkdir ("fs/ext4" ,NULL );if (proc_root_ext4 ==NULL )
@@ -3041,6 +3053,7 @@ void exit_ext4_mballoc(void)#ifdef CONFIG_PROC_FS remove_proc_entry ("fs/ext4" ,NULL );#endif +kmem_cache_destroy (ext4_free_ext_cachep); }
@@ -3561,6 +3574,7 @@ ext4_mb_use_preallocated(struct ext4_all ac->ac_criteria =20 ;return 1 ; } +return 0 ; }
@@ -4678,6 +4692,21 @@ static void ext4_mb_poll_new_transactionext4_mb_free_committed_blocks (sb); } +/* +* We can merge two free data extents only if the physical blocks +* are contiguous, AND the extents were freed by the same transaction, +* AND the blocks are associated with the same group. +*/ +static int can_merge (struct ext4_free_data *entry1, +struct ext4_free_data *entry2) +{ +if ((entry1->t_tid == entry2->t_tid) && + (entry1->group == entry2->group) && + ((entry1->start_blk + entry1->count) == entry2->start_blk)) +return 1 ; +return 0 ; +} + static noinline_for_stack intext4_mb_free_metadata (handle_t *handle,struct ext4_buddy *e4b,ext4_group_t group,ext4_grpblk_t block,int count)
@@ -4685,57 +4714,80 @@ ext4_mb_free_metadata(handle_t *handle,struct ext4_group_info *db = e4b->bd_info;struct super_block *sb = e4b->bd_sb;struct ext4_sb_info *sbi =EXT4_SB (sb); -struct ext4_free_metadata *md; -int i; +struct ext4_free_data *entry, *new_entry; +struct rb_node **n = &db->bb_free_root.rb_node, *node; +struct rb_node *parent =NULL , *new_node; +BUG_ON (e4b->bd_bitmap_page ==NULL );BUG_ON (e4b->bd_buddy_page ==NULL ); + new_entry =kmem_cache_alloc (ext4_free_ext_cachep,GFP_NOFS ); + new_entry->start_blk = block; + new_entry->group = group; + new_entry->count = count; + new_entry->t_tid = handle->h_transaction->t_tid; + new_node = &new_entry->node; +ext4_lock_group (sb, group); -for (i =0 ; i < count; i++) { - md = db->bb_md_cur; -if (md && db->bb_tid != handle->h_transaction->t_tid) { - db->bb_md_cur =NULL ; - md =NULL ; +if (!*n) { +/* first free block exent. We need to +protect buddy cache from being freed, +* otherwise we'll refresh it from +* on-disk bitmap and lose not-yet-available +* blocks */ +page_cache_get (e4b->bd_buddy_page); +page_cache_get (e4b->bd_bitmap_page); + } +while (*n) { + parent = *n; + entry = rb_entry(parent, struct ext4_free_data, node); +if (block < entry->start_blk) + n = &(*n)->rb_left; +else if (block >= (entry->start_blk + entry->count)) + n = &(*n)->rb_right; +else { +ext4_error (sb, __func__, +"Double free of blocks %d (%d %d)\n" , + block, entry->start_blk, entry->count); +return 0 ; } + } -if (md ==NULL ) { -ext4_unlock_group (sb, group); - md =kmalloc (sizeof (*md),GFP_NOFS ); -if (md ==NULL ) -return -ENOMEM ; - md->num =0 ; - md->group = group; +rb_link_node (new_node, parent, n); +rb_insert_color (new_node, &db->bb_free_root); -ext4_lock_group (sb, group); -if (db->bb_md_cur ==NULL ) { -spin_lock (&sbi->s_md_lock); -list_add (&md->list, &sbi->s_active_transaction); -spin_unlock (&sbi->s_md_lock); -/* protect buddy cache from being freed, -* otherwise we'll refresh it from -* on-disk bitmap and lose not-yet-available -* blocks */ -page_cache_get (e4b->bd_buddy_page); -page_cache_get (e4b->bd_bitmap_page); - db->bb_md_cur = md; - db->bb_tid = handle->h_transaction->t_tid; -mb_debug ("new md 0x%p for group %lu\n" , - md, md->group); - }else { -kfree (md); - md = db->bb_md_cur; - } +/* Now try to see the extent can be merged to left and right */ + node =rb_prev (new_node); +if (node) { + entry = rb_entry(node, struct ext4_free_data, node); +if (can_merge (entry, new_entry)) { + new_entry->start_blk = entry->start_blk; + new_entry->count += entry->count; +rb_erase (node, &(db->bb_free_root)); +spin_lock (&sbi->s_md_lock); +list_del (&entry->list); +spin_unlock (&sbi->s_md_lock); +kmem_cache_free (ext4_free_ext_cachep, entry); } + } -BUG_ON (md->num >=EXT4_BB_MAX_BLOCKS ); - md->blocks[md->num] = block + i; - md->num++; -if (md->num ==EXT4_BB_MAX_BLOCKS ) { -/* no more space, put full container on a sb's list */ - db->bb_md_cur =NULL ; + node =rb_next (new_node); +if (node) { + entry = rb_entry(node, struct ext4_free_data, node); +if (can_merge (new_entry, entry)) { + new_entry->count += entry->count; +rb_erase (node, &(db->bb_free_root)); +spin_lock (&sbi->s_md_lock); +list_del (&entry->list); +spin_unlock (&sbi->s_md_lock); +kmem_cache_free (ext4_free_ext_cachep, entry); } } +/* Add the extent to active_transaction list */ +spin_lock (&sbi->s_md_lock); +list_add (&new_entry->list, &sbi->s_active_transaction); +spin_unlock (&sbi->s_md_lock);ext4_unlock_group (sb, group);return 0 ; }
fs/ext4/mballoc.h +15 -10
@@ -97,22 +97,27 @@*/ #define MB_DEFAULT_GROUP_PREALLOC 512 -#ifdef EXT4_BB_MAX_BLOCKS -#undef EXT4_BB_MAX_BLOCKS -#endif -#define EXT4_BB_MAX_BLOCKS 30 +struct ext4_free_data { +/* this links the free block information from group_info */ +struct rb_node node; -struct ext4_free_metadata { -ext4_group_t group; -unsigned short num; -ext4_grpblk_t blocks[EXT4_BB_MAX_BLOCKS ]; +/* this links the free block information from ext4_sb_info */ struct list_head list; + +/* group which free block extent belongs */ +ext4_group_t group; + +/* free block extent */ +ext4_grpblk_t start_blk; +ext4_grpblk_t count; + +/* transaction which freed this extent */ +tid_t t_tid; };struct ext4_group_info {unsigned long bb_state; -unsigned long bb_tid; -struct ext4_free_metadata *bb_md_cur; +struct rb_root bb_free_root;unsigned short bb_first_free;unsigned short bb_free;unsigned short bb_fragments;
PATCH 24/36 ext4: dont use blocks freed but not yet committed in buddy cache init
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit 7a2fcbf7f85737735fd44eb34b62315bccf6d6e4)
When we generate buddy cache (especially during resize) we need to make sure we don't use the blocks freed but not yet comitted. This makes sure we have the right value of free blocks count in the group info and also in the bitmap. This also ensures the ordered mode consistency
--- fs/ext4/mballoc.c | 82 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 60 insertions(+), 22 deletions(-)
fs/ext4/mballoc.c +60 -22
@@ -335,6 +335,8 @@ static struct kmem_cache *ext4_ac_cachepstatic struct kmem_cache *ext4_free_ext_cachep;static void ext4_mb_generate_from_pa (struct super_block *sb,void *bitmap,ext4_group_t group); +static void ext4_mb_generate_from_freelist (struct super_block *sb,void *bitmap, +ext4_group_t group);static int ext4_mb_init_per_dev_proc (struct super_block *sb);static int ext4_mb_destroy_per_dev_proc (struct super_block *sb);static void ext4_mb_free_committed_blocks (struct super_block *);
@@ -858,7 +860,9 @@ static int ext4_mb_init_cache(struct pag/* * incore got set to the group block bitmap below */ +ext4_lock_group (sb, group);ext4_mb_generate_buddy (sb, data, incore, group); +ext4_unlock_group (sb, group); incore =NULL ; }else {/* this is block of bitmap */
@@ -872,6 +876,7 @@ static int ext4_mb_init_cache(struct pag/* mark all preallocated blks used in in-core bitmap */ ext4_mb_generate_from_pa (sb, data, group); +ext4_mb_generate_from_freelist (sb, data, group);ext4_unlock_group (sb, group);/* set incore so that the buddy information can be
@@ -3579,6 +3584,32 @@ ext4_mb_use_preallocated(struct ext4_all }/* +* the function goes through all block freed in the group +* but not yet committed and marks them used in in-core bitmap. +* buddy must be generated from this bitmap +* Need to be called with ext4 group lock (ext4_lock_group) +*/ +static void ext4_mb_generate_from_freelist (struct super_block *sb,void *bitmap, +ext4_group_t group) +{ +struct rb_node *n; +struct ext4_group_info *grp; +struct ext4_free_data *entry; + + grp =ext4_get_group_info (sb, group); + n =rb_first (&(grp->bb_free_root)); + +while (n) { + entry = rb_entry(n, struct ext4_free_data, node); +mb_set_bits (sb_bgl_lock (EXT4_SB (sb), group), + bitmap, entry->start_blk, + entry->count); + n =rb_next (n); + } +return ; +} + +/* * the function goes through all preallocation in this group and marks them * used in in-core bitmap. buddy must be generated from this bitmap * Need to be called with ext4 group lock (ext4_lock_group)
@@ -4709,27 +4740,22 @@ static int can_merge(struct ext4_free_da static noinline_for_stack intext4_mb_free_metadata (handle_t *handle,struct ext4_buddy *e4b, -ext4_group_t group,ext4_grpblk_t block,int count) +struct ext4_free_data *new_entry) { +ext4_grpblk_t block; +struct ext4_free_data *entry;struct ext4_group_info *db = e4b->bd_info;struct super_block *sb = e4b->bd_sb;struct ext4_sb_info *sbi =EXT4_SB (sb); -struct ext4_free_data *entry, *new_entry;struct rb_node **n = &db->bb_free_root.rb_node, *node;struct rb_node *parent =NULL , *new_node; -BUG_ON (e4b->bd_bitmap_page ==NULL );BUG_ON (e4b->bd_buddy_page ==NULL ); - new_entry =kmem_cache_alloc (ext4_free_ext_cachep,GFP_NOFS ); - new_entry->start_blk = block; - new_entry->group = group; - new_entry->count = count; - new_entry->t_tid = handle->h_transaction->t_tid; new_node = &new_entry->node; + block = new_entry->start_blk; -ext4_lock_group (sb, group);if (!*n) {/* first free block exent. We need to protect buddy cache from being freed,
@@ -4788,7 +4814,6 @@ ext4_mb_free_metadata(handle_t *handle,spin_lock (&sbi->s_md_lock);list_add (&new_entry->list, &sbi->s_active_transaction);spin_unlock (&sbi->s_md_lock); -ext4_unlock_group (sb, group);return 0 ; }
@@ -4895,15 +4920,6 @@ do_more: BUG_ON(!mb_test_bit(bit + i, bitmap_bh->b_data)); }#endif -mb_clear_bits (sb_bgl_lock (sbi, block_group), bitmap_bh->b_data, - bit, count); - -/* We dirtied the bitmap block */ -BUFFER_TRACE (bitmap_bh,"dirtied bitmap block" ); - err =ext4_journal_dirty_metadata (handle, bitmap_bh); -if (err) - goto error_return; -if (ac) { ac->ac_b_ex.fe_group = block_group; ac->ac_b_ex.fe_start = bit;
@@ -4915,11 +4931,29 @@ do_more:if (err) goto error_return;if (metadata) { -/* blocks being freed are metadata. these blocks shouldn't -* be used until this transaction is committed */ -ext4_mb_free_metadata (handle, &e4b, block_group, bit, count); +struct ext4_free_data *new_entry; +/* +* blocks being freed are metadata. these blocks shouldn't +* be used until this transaction is committed +*/ + new_entry =kmem_cache_alloc (ext4_free_ext_cachep,GFP_NOFS ); + new_entry->start_blk = bit; + new_entry->group = block_group; + new_entry->count = count; + new_entry->t_tid = handle->h_transaction->t_tid; +ext4_lock_group (sb, block_group); +mb_clear_bits (sb_bgl_lock (sbi, block_group), bitmap_bh->b_data, + bit, count); +ext4_mb_free_metadata (handle, &e4b, new_entry); +ext4_unlock_group (sb, block_group); }else {ext4_lock_group (sb, block_group); +/* need to update group_info->bb_free and bitmap +* with group lock held. generate_buddy look at +* them with group lock_held +*/ +mb_clear_bits (sb_bgl_lock (sbi, block_group), bitmap_bh->b_data, + bit, count);mb_free_blocks (inode, &e4b, bit, count);ext4_mb_return_to_preallocation (inode, &e4b, block, count);ext4_unlock_group (sb, block_group);
@@ -4942,6 +4976,10 @@ do_more: *freed += count; +/* We dirtied the bitmap block */ +BUFFER_TRACE (bitmap_bh,"dirtied bitmap block" ); + err =ext4_journal_dirty_metadata (handle, bitmap_bh); +/* And the group descriptor block */ BUFFER_TRACE (gd_bh,"dirtied group descriptor block" ); ret =ext4_journal_dirty_metadata (handle, gd_bh);
PATCH 25/36 ext4: Fix race between read_block_bitmap() and mark_diskspace_used()
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit e8134b27e351e813414da3b95aa8eac6d3908088)
We need to make sure we update the block bitmap and clear EXT4_BG_BLOCK_UNINIT flag with sb_bgl_lock held, since ext4_read_block_bitmap() looks at EXT4_BG_BLOCK_UNINIT to decide whether to initialize the block bitmap each time it is called (introduced by commit c806e68f), and this can race with block allocations in ext4_mb_mark_diskspace_used().
ext4_read_block_bitmap does:
spin_lock(sb_bgl_lock(EXT4_SB(sb), block_group));
if (desc->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) {
ext4_init_block_bitmap(sb, bh, block_group, desc);Now on the block allocation side we do
mb_set_bits(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group), bitmap_bh->b_data,
ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
....
spin_lock(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group));
if (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) {
gdp->bg_flags &= cpu_to_le16(~EXT4_BG_BLOCK_UNINIT);ie on allocation we update the bitmap then we take the sb_bgl_lock and clear the EXT4_BG_BLOCK_UNINIT flag. What can happen is a parallel ext4_read_block_bitmap can zero out the bitmap in between the above mb_set_bits and spin_lock(sb_bg_lock..)
The race results in below user visible errors
EXT4-fs error (device sdb1): ext4_mb_release_inode_pa: free 100, pa_free 105 EXT4-fs error (device sdb1): mb_free_blocks: double-free of inode 0's block ..
--- fs/ext4/mballoc.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
fs/ext4/mballoc.c +8 -4
@@ -1070,7 +1070,10 @@ static void mb_clear_bits(spinlock_t *lo cur +=32 ;continue ; } -mb_clear_bit_atomic (lock, cur, bm); +if (lock) +mb_clear_bit_atomic (lock, cur, bm); +else +mb_clear_bit (cur, bm); cur++; } }
@@ -1088,7 +1091,10 @@ static void mb_set_bits(spinlock_t *lock cur +=32 ;continue ; } -mb_set_bit_atomic (lock, cur, bm); +if (lock) +mb_set_bit_atomic (lock, cur, bm); +else +mb_set_bit (cur, bm); cur++; } }
@@ -3143,10 +3149,9 @@ ext4_mb_mark_diskspace_used(struct ext4_ } }#endif -mb_set_bits (sb_bgl_lock (sbi, ac->ac_b_ex.fe_group), bitmap_bh->b_data, - ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
PATCH 26/36 ext4: Fix the race between read_inode_bitmap() and ext4_new_inode()
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit 393418676a7602e1d7d3f6e560159c65c8cbd50e)
We need to make sure we update the inode bitmap and clear EXT4_BG_INODE_UNINIT flag with sb_bgl_lock held, since ext4_read_inode_bitmap() looks at EXT4_BG_INODE_UNINIT to decide whether to initialize the inode bitmap each time it is called. (introduced by commit c806e68f.)
ext4_read_inode_bitmap does:
spin_lock(sb_bgl_lock(EXT4_SB(sb), block_group));
if (desc->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT)) {
ext4_init_inode_bitmap(sb, bh, block_group, desc);and ext4_new_inode does
if (!ext4_set_bit_atomic(sb_bgl_lock(sbi, group),
ino, inode_bitmap_bh->b_data)) ...... ...
spin_lock(sb_bgl_lock(sbi, group));
gdp->bg_flags &= cpu_to_le16(~EXT4_BG_INODE_UNINIT);
i.e., on allocation we update the bitmap then we take the sb_bgl_lock and clear the EXT4_BG_INODE_UNINIT flag. What can happen is a parallel ext4_read_inode_bitmap can zero out the bitmap in between the above ext4_set_bit_atomic and spin_lock(sb_bg_lock..)
The race results in below user visible errors
EXT4-fs error (device sdb1): ext4_free_inode: bit already cleared for inode 168449 EXT4-fs warning (device sdb1): ext4_unlink: Deleting nonexistent file ... EXT4-fs warning (device sdb1): ext4_rmdir: empty directory has too many links ...
ls: /mnt/tmp/f/p369/d3/d6/d39/db2/dee/d10f/d3f/l71: Stale NFS file handle
--- fs/ext4/ialloc.c | 140 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 83 insertions(+), 57 deletions(-)
fs/ext4/ialloc.c +80 -48
@@ -567,6 +567,77 @@ static int find_group_other(struct super }/* +* claim the inode from the inode bitmap. If the group +* is uninit we need to take the groups's sb_bgl_lock +* and clear the uninit flag. The inode bitmap update +* and group desc uninit flag clear should be done +* after holding sb_bgl_lock so that ext4_read_inode_bitmap +* doesn't race with the ext4_claim_inode +*/ +static int ext4_claim_inode (struct super_block *sb, +struct buffer_head *inode_bitmap_bh, +unsigned long ino,ext4_group_t group,int mode) +{ +int free =0 , retval =0 ; +struct ext4_sb_info *sbi =EXT4_SB (sb); +struct ext4_group_desc *gdp =ext4_get_group_desc (sb, group,NULL ); + +spin_lock (sb_bgl_lock (sbi, group)); +if (ext4_set_bit (ino, inode_bitmap_bh->b_data)) { +/* not a free inode */ + retval =1 ; + goto err_ret; + } + ino++; +if ((group ==0 && ino <EXT4_FIRST_INO (sb)) || + ino >EXT4_INODES_PER_GROUP (sb)) { +spin_unlock (sb_bgl_lock (sbi, group)); +ext4_error (sb, __func__, +"reserved inode or inode > inodes count - " +"block_group = %lu, inode=%lu" , group, + ino + group *EXT4_INODES_PER_GROUP (sb)); +return 1 ; + } +/* If we didn't allocate from within the initialized part of the inode +* table then we need to initialize up to this inode. */ +if (EXT4_HAS_RO_COMPAT_FEATURE (sb,EXT4_FEATURE_RO_COMPAT_GDT_CSUM )) { + +if (gdp->bg_flags &cpu_to_le16 (EXT4_BG_INODE_UNINIT )) { + gdp->bg_flags &=cpu_to_le16 (~EXT4_BG_INODE_UNINIT ); +/* When marking the block group with +* ~EXT4_BG_INODE_UNINIT we don't want to depend +* on the value of bg_itable_unused even though +* mke2fs could have initialized the same for us. +* Instead we calculated the value below +*/ + + free =0 ; + }else { + free =EXT4_INODES_PER_GROUP (sb) - +le16_to_cpu (gdp->bg_itable_unused); + } + +/* +* Check the relative inode number against the last used +* relative inode number in this group. if it is greater +* we need to update the bg_itable_unused count +* +*/ +if (ino > free) + gdp->bg_itable_unused = +cpu_to_le16 (EXT4_INODES_PER_GROUP (sb) - ino); + } +le16_add_cpu (&gdp->bg_free_inodes_count,-1 ); +if (S_ISDIR (mode)) { +le16_add_cpu (&gdp->bg_used_dirs_count,1 ); + } + gdp->bg_checksum =ext4_group_desc_csum (sbi, group, gdp); +err_ret: +spin_unlock (sb_bgl_lock (sbi, group)); +return retval; +} + +/* * There are two policies for allocating an inode. If the new inode is * a directory, then a forward search is made for a block group with both * free space and a low directory-to-inode ratio; if that fails, then of
@@ -649,8 +720,12 @@ repeat_in_this_group:if (err) goto fail; -if (!ext4_set_bit_atomic (sb_bgl_lock (sbi, group), - ino, bitmap_bh->b_data)) { +BUFFER_TRACE (bh2,"get_write_access" ); + err =ext4_journal_get_write_access (handle, bh2); +if (err) + goto fail; +if (!ext4_claim_inode (sb, bitmap_bh, + ino, group, mode)) {/* we won it */ BUFFER_TRACE (bitmap_bh,"call ext4_journal_dirty_metadata" );
@@ -658,10 +733,13 @@ repeat_in_this_group: bitmap_bh);if (err) goto fail; +/* zero bit is inode number 1*/ + ino++; goto got; }/* we lost it */ jbd2_journal_release_buffer (handle, bitmap_bh); +jbd2_journal_release_buffer (handle, bh2);if (++ino <EXT4_INODES_PER_GROUP (sb)) goto repeat_in_this_group;
@@ -681,21 +759,6 @@ repeat_in_this_group: goto out; got: - ino++; -if ((group ==0 && ino <EXT4_FIRST_INO (sb)) || - ino >EXT4_INODES_PER_GROUP (sb)) { -ext4_error (sb, __func__, -"reserved inode or inode > inodes count - " -"block_group = %lu, inode=%lu" , group, - ino + group *EXT4_INODES_PER_GROUP (sb)); - err = -EIO ; - goto fail; - } - -BUFFER_TRACE (bh2,"get_write_access" ); - err =ext4_journal_get_write_access (handle, bh2); -if (err) goto fail; -/* We may have to initialize the block bitmap if it isn't already */ if (EXT4_HAS_RO_COMPAT_FEATURE (sb,EXT4_FEATURE_RO_COMPAT_GDT_CSUM ) && gdp->bg_flags &cpu_to_le16 (EXT4_BG_BLOCK_UNINIT )) {
@@ -730,47 +793,10 @@ got:if (err) goto fail; } - -spin_lock (sb_bgl_lock (sbi, group)); -/* If we didn't allocate from within the initialized part of the inode -* table then we need to initialize up to this inode. */ -if (EXT4_HAS_RO_COMPAT_FEATURE (sb,EXT4_FEATURE_RO_COMPAT_GDT_CSUM )) { -if (gdp->bg_flags &cpu_to_le16 (EXT4_BG_INODE_UNINIT )) { - gdp->bg_flags &=cpu_to_le16 (~EXT4_BG_INODE_UNINIT ); - -/* When marking the block group with -* ~EXT4_BG_INODE_UNINIT we don't want to depend -* on the value of bg_itable_unused even though -* mke2fs could have initialized the same for us. -* Instead we calculated the value below -*/ - - free =0 ; - }else { - free =EXT4_INODES_PER_GROUP (sb) - -le16_to_cpu (gdp->bg_itable_unused); - } - -/* -* Check the relative inode number against the last used -* relative inode number in this group. if it is greater -* we need to update the bg_itable_unused count -* -*/ -if (ino > free) - gdp->bg_itable_unused = -cpu_to_le16 (EXT4_INODES_PER_GROUP (sb) - ino); - }
PATCH 27/36 jbd2: Add BH_JBDPrivateStart
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Mark Fasheh <[email protected]>
(cherry picked from commit e97fcd95a4778a8caf1980c6c72fdf68185a0838)
Add this so that file systems using JBD2 can safely allocate unused b_state bits.
In this case, we add it so that Ocfs2 can define a single bit for tracking the validation state of a buffer.
--- include/linux/jbd2.h | 1 + 1 file changed, 1 insertion(+)
include/linux/jbd2.h +1 -0
@@ -329,6 +329,7 @@ enum jbd_state_bits { BH_State,/* Pins most journal_head state */ BH_JournalHead,/* Pins bh->b_private and jh->b_bh */ BH_Unshadow,/* Dummy bit, for BJ_Shadow wakeup filtering */ + BH_JBDPrivateStart,/* First bit available for private use by FS */ };BUFFER_FNS (JBD , jbd)
PATCH 28/36 ext4: Use new buffer_head flag to check uninit group bitmaps initialization
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit 2ccb5fb9f113dae969d1ae9b6c10e80fa34f8cd3)
For uninit block group, the ondisk bitmap is not initialized. That implies we cannot depend on the uptodate flag on the bitmap buffer_head to find bitmap validity. Use a new buffer_head flag which would be set after we properly initialize the bitmap. This also prevent the initializing the uninit group bitmap initialization every time we do a ext4_read_block_bitmap.
--- fs/ext4/balloc.c | 25 ++++++++++++++++++++++++- fs/ext4/ext4.h | 18 ++++++++++++++++++ fs/ext4/ialloc.c | 24 +++++++++++++++++++++++- fs/ext4/mballoc.c | 24 +++++++++++++++++++++++- 4 files changed, 88 insertions(+), 3 deletions(-)
fs/ext4/balloc.c +24 -1
@@ -319,18 +319,41 @@ ext4_read_block_bitmap(struct super_bloc block_group, bitmap_blk);return NULL ; } -if (bh_uptodate_or_lock (bh)) + +if (bitmap_uptodate (bh))return bh; +lock_buffer (bh); +if (bitmap_uptodate (bh)) { +unlock_buffer (bh); +return bh; + }spin_lock (sb_bgl_lock (EXT4_SB (sb), block_group));if (desc->bg_flags &cpu_to_le16 (EXT4_BG_BLOCK_UNINIT )) {ext4_init_block_bitmap (sb, bh, block_group, desc); +set_bitmap_uptodate (bh);set_buffer_uptodate (bh);unlock_buffer (bh);spin_unlock (sb_bgl_lock (EXT4_SB (sb), block_group));return bh; }spin_unlock (sb_bgl_lock (EXT4_SB (sb), block_group)); +if (buffer_uptodate (bh)) { +/* +* if not uninit if bh is uptodate, +* bitmap is also uptodate +*/ +set_bitmap_uptodate (bh); +unlock_buffer (bh); +return bh; + } +/* +* submit the buffer_head for read. We can +* safely mark the bitmap as uptodate now. +* We do it here so the bitmap uptodate bit +* get set with buffer lock held. +*/ +set_bitmap_uptodate (bh);if (bh_submit_read (bh) <0 ) {put_bh (bh); ext4_error(sb, __func__,
fs/ext4/ext4.h +18 -0
@@ -19,6 +19,7 @@#include <linux/types.h> #include <linux/blkdev.h> #include <linux/magic.h> +#include <linux/jbd2.h> #include "ext4_i.h" /*
@@ -1250,6 +1251,23 @@ extern int ext4_get_blocks_wrap(handle_t sector_t block, unsigned long max_blocks, struct buffer_head *bh, int create, int extend_disksize, int flag); +/* +* Add new method to test wether block and inode bitmaps are properly +* initialized. With uninit_bg reading the block from disk is not enough +* to mark the bitmap uptodate. We need to also zero-out the bitmap +*/ +#define BH_BITMAP_UPTODATE BH_JBDPrivateStart + +static inline int bitmap_uptodate (struct buffer_head *bh) +{ +return (buffer_uptodate (bh) && +test_bit (BH_BITMAP_UPTODATE , &(bh)->b_state)); +} +static inline void set_bitmap_uptodate (struct buffer_head *bh) +{ +set_bit (BH_BITMAP_UPTODATE , &(bh)->b_state); +} +#endif /* __KERNEL__ */ #endif /* _EXT4_H */
fs/ext4/ialloc.c +23 -1
@@ -115,18 +115,40 @@ ext4_read_inode_bitmap(struct super_bloc block_group, bitmap_blk);return NULL ; } -if (bh_uptodate_or_lock (bh)) +if (bitmap_uptodate (bh))return bh; +lock_buffer (bh); +if (bitmap_uptodate (bh)) { +unlock_buffer (bh); +return bh; + }spin_lock (sb_bgl_lock (EXT4_SB (sb), block_group));if (desc->bg_flags &cpu_to_le16 (EXT4_BG_INODE_UNINIT )) {ext4_init_inode_bitmap (sb, bh, block_group, desc); +set_bitmap_uptodate (bh);set_buffer_uptodate (bh);unlock_buffer (bh);spin_unlock (sb_bgl_lock (EXT4_SB (sb), block_group));return bh; }spin_unlock (sb_bgl_lock (EXT4_SB (sb), block_group)); +if (buffer_uptodate (bh)) { +/* +* if not uninit if bh is uptodate, +* bitmap is also uptodate +*/ +set_bitmap_uptodate (bh); +unlock_buffer (bh); +return bh; + } +/* +* submit the buffer_head for read. We can +* safely mark the bitmap as uptodate now. +* We do it here so the bitmap uptodate bit +* get set with buffer lock held. +*/ +set_bitmap_uptodate (bh);if (bh_submit_read (bh) <0 ) {put_bh (bh); ext4_error(sb, __func__,
fs/ext4/mballoc.c +23 -1
@@ -796,20 +796,42 @@ static int ext4_mb_init_cache(struct pagif (bh[i] ==NULL ) goto out; -if (bh_uptodate_or_lock (bh[i])) +if (bitmap_uptodate (bh[i]))continue ; +lock_buffer (bh[i]); +if (bitmap_uptodate (bh[i])) { +unlock_buffer (bh[i]); +continue ; + }spin_lock (sb_bgl_lock (EXT4_SB (sb), first_group + i));if (desc->bg_flags &cpu_to_le16 (EXT4_BG_BLOCK_UNINIT )) {ext4_init_block_bitmap (sb, bh[i], first_group + i, desc); +set_bitmap_uptodate (bh[i]);set_buffer_uptodate (bh[i]);unlock_buffer (bh[i]);spin_unlock (sb_bgl_lock (EXT4_SB (sb), first_group + i));continue ; }spin_unlock (sb_bgl_lock (EXT4_SB (sb), first_group + i)); +if (buffer_uptodate (bh[i])) { +/* +* if not uninit if bh is uptodate, +* bitmap is also uptodate +*/ +set_bitmap_uptodate (bh[i]); +unlock_buffer (bh[i]); +continue ; + }get_bh (bh[i]); +/* +* submit the buffer_head for read. We can +* safely mark the bitmap as uptodate now. +* We do it here so the bitmap uptodate bit +* get set with buffer lock held. +*/ +set_bitmap_uptodate (bh[i]); bh[i]->b_end_io = end_buffer_read_sync;submit_bh (READ , bh[i]);mb_debug ("read bitmap for group %lu\n" , first_group + i);
PATCH 29/36 ext4: mark the blocks/inode bitmap beyond end of group as used
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit 648f5879f5892dddd3ba71cd0d285599f40f2512)
We need to mark the block/inode bitmap beyond the end of the group with '1'.
--- fs/ext4/ialloc.c | 2 +- fs/ext4/mballoc.c | 4 ++-- fs/ext4/resize.c | 6 ++---- 3 files changed, 5 insertions(+), 7 deletions(-)
fs/ext4/ialloc.c +1 -1
@@ -84,7 +84,7 @@ unsigned ext4_init_inode_bitmap(struct s }memset (bh->b_data,0 , (EXT4_INODES_PER_GROUP (sb) +7 ) /8 ); -mark_bitmap_end (EXT4_INODES_PER_GROUP (sb),EXT4_BLOCKS_PER_GROUP (sb), +mark_bitmap_end (EXT4_INODES_PER_GROUP (sb), sb->s_blocksize *8 , bh->b_data);return EXT4_INODES_PER_GROUP (sb);
fs/ext4/mballoc.c +2 -2
@@ -3148,8 +3148,8 @@ ext4_mb_mark_diskspace_used(struct ext4_ in_range(block + len - 1, ext4_inode_table(sb, gdp), EXT4_SB(sb)->s_itb_per_group)) {ext4_error (sb, __func__, -"Allocating block in system zone - block = %llu" , - block); +"Allocating block %llu in system zone of %d group\n" , + block, ac->ac_b_ex.fe_group);/* File system mounted not to panic on error * Fix the bitmap and repeat the block allocation * We leak some of the blocks here.
fs/ext4/resize.c +1 -2
@@ -284,11 +284,9 @@ static int setup_new_group_blocks(structif ((err =extend_or_restart_transaction (handle,2 , bh))) goto exit_bh; -mark_bitmap_end (input->blocks_count,EXT4_BLOCKS_PER_GROUP (sb), - bh->b_data); +mark_bitmap_end (input->blocks_count, sb->s_blocksize *8 , bh->b_data);ext4_journal_dirty_metadata (handle, bh);brelse (bh);
PATCH 30/36 ext4: Dont allow new groups to be added during block allocation
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit 8556e8f3b6c4c11601ce1e9ea8090a6d8bd5daae)
After we mark the blocks in the buddy cache as allocated, we need to ensure that we don't reinit the buddy cache until the block bitmap is updated. This commit achieves this by holding the group_info alloc_semaphore till ext4_mb_release_context
--- fs/ext4/mballoc.c | 18 ++++++++++++++---- fs/ext4/mballoc.h | 5 +++++ 2 files changed, 19 insertions(+), 4 deletions(-)
fs/ext4/mballoc.c +14 -4
@@ -1054,7 +1054,8 @@ static void ext4_mb_release_desc(structif (e4b->bd_buddy_page)page_cache_release (e4b->bd_buddy_page);/* Done with the buddy cache */ -up_read (e4b->alloc_semp); +if (e4b->alloc_semp) +up_read (e4b->alloc_semp); }
@@ -1374,7 +1375,9 @@ static void ext4_mb_use_best_found(strucget_page (ac->ac_bitmap_page); ac->ac_buddy_page = e4b->bd_buddy_page;get_page (ac->ac_buddy_page); - +/* on allocation we use ac to track the held semaphore */ + ac->alloc_semp = e4b->alloc_semp; + e4b->alloc_semp =NULL ;/* store last allocated for subsequent stream allocation */ if ((ac->ac_flags &EXT4_MB_HINT_DATA )) {spin_lock (&sbi->s_md_lock);
@@ -3148,7 +3151,7 @@ ext4_mb_mark_diskspace_used(struct ext4_ in_range(block + len - 1, ext4_inode_table(sb, gdp), EXT4_SB(sb)->s_itb_per_group)) {ext4_error (sb, __func__, -"Allocating block %llu in system zone of %d group\n" , +"Allocating block %llu in system zone of %lu group\n" , block, ac->ac_b_ex.fe_group);/* File system mounted not to panic on error * Fix the bitmap and repeat the block allocation
@@ -4399,6 +4402,7 @@ ext4_mb_initialize_context(struct ext4_a ac->ac_pa =NULL ; ac->ac_bitmap_page =NULL ; ac->ac_buddy_page =NULL ; + ac->alloc_semp =NULL ; ac->ac_lg =NULL ;/* we have to define context: we'll we work with a file or
@@ -4579,6 +4583,8 @@ static int ext4_mb_release_context(struc }ext4_mb_put_pa (ac, ac->ac_sb, pa); } +if (ac->alloc_semp) +up_read (ac->alloc_semp);if (ac->ac_bitmap_page)page_cache_release (ac->ac_bitmap_page);if (ac->ac_buddy_page)
@@ -4682,10 +4688,14 @@ repeat: ac->ac_o_ex.fe_len < ac->ac_b_ex.fe_len)ext4_mb_new_preallocation (ac); } -if (likely (ac->ac_status ==AC_STATUS_FOUND )) { *errp =ext4_mb_mark_diskspace_used (ac, handle);if (*errp == -EAGAIN ) { +/* +* drop the reference that we took +* in ext4_mb_use_best_found +*/ +ext4_mb_release_context (ac); ac->ac_b_ex.fe_group =0 ; ac->ac_b_ex.fe_start =0 ; ac->ac_b_ex.fe_len =0 ;
fs/ext4/mballoc.h +5 -0
@@ -213,6 +213,11 @@ struct ext4_allocation_context {__u8 ac_op;/* operation, for history only */ struct page *ac_bitmap_page;struct page *ac_buddy_page; +/* +* pointer to the held semaphore upon successful +* block allocation +*/ +struct rw_semaphore *alloc_semp;struct ext4_prealloc_space *ac_pa;struct ext4_locality_group *ac_lg; };
PATCH 31/36 ext4: Init the complete page while building buddy cache
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Aneesh Kumar K.V <[email protected]>
(cherry picked from commit 29eaf024980e07cc01f31ae4ea5d68c917f4b7da)
We need to init the complete page during buddy cache init by setting the contents to '1'. Otherwise we can see the following errors after doing an online resize of the filesystem:
EXT4-fs error (device sdb1): ext4_mb_mark_diskspace_used:
Allocating block 1040385 in system zone of 127 group
--- fs/ext4/mballoc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/ext4/mballoc.c +2 -1
@@ -848,6 +848,8 @@ static int ext4_mb_init_cache(struct pag err =0 ; first_block = page->index * blocks_per_page; +/* init the page */ +memset (page_address (page),0xff ,PAGE_CACHE_SIZE );for (i =0 ; i < blocks_per_page; i++) {int group;struct ext4_group_info *grinfo;
@@ -874,7 +876,6 @@ static int ext4_mb_init_cache(struct pagBUG_ON (incore ==NULL );mb_debug ("put buddy for group %u in page %lu/%x\n" , group, page->index, i * blocksize); -memset (data,0xff , blocksize); grinfo =ext4_get_group_info (sb, group); grinfo->bb_fragments =0 ; memset(grinfo->bb_counters, 0,
PATCH 32/36 ext4: Add sanity checks for the superblock before mounting the filesystem
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: "Theodore Ts'o" <[email protected]>
(cherry picked from commit 4ec110281379826c5cf6ed14735e47027c3c5765)
This avoids insane superblock configurations that could lead to kernel oops due to null pointer derefences.
http://bugzilla.kernel.org/show_bug.cgi?id=12371
Thanks to David Maciejak at Fortinet's FortiGuard Global Security Research Team who discovered this bug independently (but at approximately the same time) as Thiemo Nagel, who submitted the patch.
--- fs/ext4/super.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-)
fs/ext4/super.c +20 -10
@@ -1916,8 +1916,8 @@ static int ext4_fill_super(struct super_struct inode *root;int ret = -EINVAL ;int blocksize; -int db_count; -int i; +unsigned int db_count; +unsigned int i;int needs_recovery;__le32 features;__u64 blocks_count;
@@ -2207,20 +2207,30 @@ static int ext4_fill_super(struct super_if (EXT4_BLOCKS_PER_GROUP (sb) ==0 ) goto cantfind_ext4; -/* ensure blocks_count calculation below doesn't sign-extend */ -if (ext4_blocks_count (es) +EXT4_BLOCKS_PER_GROUP (sb) < -le32_to_cpu (es->s_first_data_block) +1 ) { -printk (KERN_WARNING "EXT4-fs: bad geometry: block count %llu, " -"first data block %u, blocks per group %lu\n" , -ext4_blocks_count (es), -le32_to_cpu (es->s_first_data_block), -EXT4_BLOCKS_PER_GROUP (sb)); +/* +* It makes no sense for the first data block to be beyond the end +* of the filesystem. +*/ +if (le32_to_cpu (es->s_first_data_block) >=ext4_blocks_count (es)) { +printk (KERN_WARNING "EXT4-fs: bad geometry: first data" +"block %u is beyond end of filesystem (%llu)\n" , +le32_to_cpu (es->s_first_data_block), +ext4_blocks_count (es)); goto failed_mount; } blocks_count = (ext4_blocks_count (es) -le32_to_cpu (es->s_first_data_block) +EXT4_BLOCKS_PER_GROUP (sb) -1 );do_div (blocks_count,EXT4_BLOCKS_PER_GROUP (sb)); +if (blocks_count > ((uint64_t )1 <<32 ) -EXT4_DESC_PER_BLOCK (sb)) { +printk (KERN_WARNING "EXT4-fs: groups count too large: %u " +"(block count %llu, first data block %u, " +"blocks per group %lu)\n" , sbi->s_groups_count, +ext4_blocks_count (es), +le32_to_cpu (es->s_first_data_block), +EXT4_BLOCKS_PER_GROUP (sb)); + goto failed_mount; + } sbi->s_groups_count = blocks_count; db_count = (sbi->s_groups_count +EXT4_DESC_PER_BLOCK (sb) -1 ) /EXT4_DESC_PER_BLOCK (sb);
PATCH 33/36 ext4: only use i_size_high for regular files
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: "Theodore Ts'o" <[email protected]>
(cherry picked from commit 06a279d636734da32bb62dd2f7b0ade666f65d7c)
Directories are not allowed to be bigger than 2GB, so don't use i_size_high for anything other than regular files. E2fsck should complain about these inodes, but the simplest thing to do for the kernel is to only use i_size_high for regular files.
This prevents an intentially corrupted filesystem from causing the kernel to burn a huge amount of CPU and issuing error messages such as:
EXT4-fs warning (device loop0): ext4_block_to_path: block 135090028 > max
Thanks to David Maciejak from Fortinet's FortiGuard Global Security Research Team for reporting this issue.
http://bugzilla.kernel.org/show_bug.cgi?id=12375
--- fs/ext4/ext4.h | 7 +++++-- fs/ext4/inode.c | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-)
fs/ext4/ext4.h +5 -2
@@ -1174,8 +1174,11 @@ static inline void ext4_r_blocks_count_sstatic inline loff_t ext4_isize (struct ext4_inode *raw_inode) { -return ((loff_t )le32_to_cpu (raw_inode->i_size_high) <<32 ) | -le32_to_cpu (raw_inode->i_size_lo); +if (S_ISREG (le16_to_cpu (raw_inode->i_mode))) +return ((loff_t )le32_to_cpu (raw_inode->i_size_high) <<32 ) | +le32_to_cpu (raw_inode->i_size_lo); +else +return (loff_t )le32_to_cpu (raw_inode->i_size_lo); }static inline void ext4_isize_set (struct ext4_inode *raw_inode,loff_t i_size)
fs/ext4/inode.c +2 -2
@@ -351,9 +351,9 @@ static int ext4_block_to_path(struct ino final = ptrs; }else {ext4_warning (inode->i_sb,"ext4_block_to_path" , -"block %lu > max" , +"block %lu > max in inode %lu" , i_block + direct_blocks + - indirect_blocks + double_blocks); + indirect_blocks + double_blocks, inode->i_ino); }if (boundary) *boundary = final -1 - (i_block & (ptrs -1 ));
PATCH 34/36 ext4: Add sanity check to make_indexed_dir
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: "Theodore Ts'o" <[email protected]>
(cherry picked from commit e6b8bc09ba2075cd91fbffefcd2778b1a00bd76f)
Make sure the rec_len field in the '..' entry is sane, lest we overrun the directory block and cause a kernel oops on a purposefully corrupted filesystem.
Thanks to Sami Liedes for reporting this bug.
http://bugzilla.kernel.org/show_bug.cgi?id=12430
--- fs/ext4/namei.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
fs/ext4/namei.c +15 -6
@@ -1382,7 +1382,7 @@ static int make_indexed_dir(handle_t *hastruct fake_dirent *fde; blocksize = dir->i_sb->s_blocksize; -dxtrace (printk ("Creating index\n" )); +dxtrace (printk (KERN_DEBUG "Creating index: inode %lu\n" , dir->i_ino)); retval =ext4_journal_get_write_access (handle, bh);if (retval) {ext4_std_error (dir->i_sb, retval);
@@ -1391,6 +1391,20 @@ static int make_indexed_dir(handle_t *ha } root = (struct dx_root *) bh->b_data; +/* The 0th block becomes the root, move the dirents out */ + fde = &root->dotdot; + de = (struct ext4_dir_entry_2 *)((char *)fde + +ext4_rec_len_from_disk (fde->rec_len)); +if ((char *) de >= (((char *) root) + blocksize)) { +ext4_error (dir->i_sb, __func__, +"invalid rec_len for '..' in inode %lu" , + dir->i_ino); +brelse (bh); +return -EIO ; + } + len = ((char *) root) + blocksize - (char *) de; + +/* Allocate new block for the 0th block's dirents */ bh2 =ext4_append (handle, dir, &block, &retval);if (!(bh2)) {brelse (bh);
@@ -1399,11 +1413,6 @@ static int make_indexed_dir(handle_t *haEXT4_I (dir)->i_flags |=EXT4_INDEX_FL ; data1 = bh2->b_data; -/* The 0th block becomes the root, move the dirents out */ - fde = &root->dotdot; - de = (struct ext4_dir_entry_2 *)((char *)fde + -ext4_rec_len_from_disk (fde->rec_len)); - len = ((char *) root) + blocksize - (char *) de;memcpy (data1, de, len); de = (struct ext4_dir_entry_2 *) data1; top = data1 + len;
PATCH 35/36 jbd2: On a __journal_expect() assertion failure printk "JBD2", not "EXT3-fs"
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: "Theodore Ts'o" <[email protected]>
(cherry picked from commit 08ec8c3878cea0bf91f2ba3c0badf44b383752d0)
Otherwise it can be very confusing to find a "EXT3-fs: " failure in the middle of EXT4-fs failures, and it makes it harder to track the source of the failure.
--- include/linux/jbd2.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
include/linux/jbd2.h +2 -1
@@ -308,7 +308,8 @@ void buffer_assertion_failure(struct bufint val = (expr); \if (!val) { \printk (KERN_ERR \ - "EXT3-fs unexpected failure: %s;\n",# expr); \ +"JBD2 unexpected failure: %s: %s;\n" , \ + __func__, #expr); \ printk(KERN_ERR why "\n"); \ } \ val; \
PATCH 36/36 ext4: Initialize the new group descriptor when resizing the filesystem
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: "Theodore Ts'o" <[email protected]>
(cherry picked from commit fdff73f094e7220602cc3f8959c7230517976412)
Make sure all of the fields of the group descriptor are properly initialized. Previously, we allowed bg_flags field to be contain random garbage, which could trigger non-deterministic behavior, including a kernel OOPS.
http://bugzilla.kernel.org/show_bug.cgi?id=12433
--- fs/ext4/resize.c | 2 ++ 1 file changed, 2 insertions(+)
fs/ext4/resize.c +2 -0
@@ -860,11 +860,13 @@ int ext4_group_add(struct super_block *s gdp = (struct ext4_group_desc *)((char *)primary->b_data + gdb_off *EXT4_DESC_SIZE (sb)); +memset (gdp,0 ,EXT4_DESC_SIZE (sb));ext4_block_bitmap_set (sb, gdp, input->block_bitmap);/* LV FIXME */ ext4_inode_bitmap_set (sb, gdp, input->inode_bitmap);/* LV FIXME */ ext4_inode_table_set (sb, gdp, input->inode_table);/* LV FIXME */ gdp->bg_free_blocks_count =cpu_to_le16 (input->free_blocks_count); gdp->bg_free_inodes_count =cpu_to_le16 (EXT4_INODES_PER_GROUP (sb)); + gdp->bg_flags =cpu_to_le16 (EXT4_BG_INODE_ZEROED ); gdp->bg_checksum =ext4_group_desc_csum (sbi, input->group, gdp);/*
Quoted 14 lines · Greg KH
This is the start of the stable review cycle for the 2.6.27.19 release. There are 36 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let us know. If anyone is a maintainer of the proper subsystem, and wants to add a Signed-off-by: line to the patch, please respond with it.
These patches are sent out with a number of different people on the Cc:
line. If you wish to be a reviewer, please email [email protected] to add your name to the list. If you want to be off the reviewer list, also email us.Responses should be made by Friday, Febuary 20, 2009, 21:00:00 UTC. Anything received after that time might be too late.
Quoted 8 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v2.6/stable-review/patch-2.6.27.19-rc1.gzand the diffstat can be found below.
thanks,
greg k-h
<snip>
Compiling 2.6.27.18 with gcc 4.3.3 (Debian 4.3.3-3) the following two warnings appear:
drivers/acpi/tables/tbfadt.c: In function 'acpi_tb_create_local_fadt':include/asm/string_32.h:75: warning: array subscript is above array bounds
drivers/usb/core/hcd.c: In function 'usb_hcd_poll_rh_status':include/asm/string_32.h:75: warning: array subscript is above array bounds
Find attached the .config file.
Are they serious?
Are thy fixed with 2.6.27.19?
Signature · 2 lines
Regards, Jörg-Volker.
#
# Automatically generated make config: don't edit # Linux kernel version: 2.6.27.18
# Wed Feb 18 22:28:02 2009
#
# CONFIG_64BIT is not setCONFIG_X86_32=y
# CONFIG_X86_64 is not setCONFIG_X86=y CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig" # CONFIG_GENERIC_LOCKBREAK is not set CONFIG_GENERIC_TIME=yCONFIG_GENERIC_CMOS_UPDATE=y CONFIG_CLOCKSOURCE_WATCHDOG=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_HAVE_LATENCYTOP_SUPPORT=y CONFIG_FAST_CMPXCHG_LOCAL=yCONFIG_MMU=yCONFIG_ZONE_DMA=yCONFIG_GENERIC_ISA_DMA=yCONFIG_GENERIC_IOMAP=yCONFIG_GENERIC_BUG=yCONFIG_GENERIC_HWEIGHT=y
# CONFIG_GENERIC_GPIO is not set CONFIG_ARCH_MAY_HAVE_PC_FDC=y
# CONFIG_RWSEM_GENERIC_SPINLOCK is not set CONFIG_RWSEM_XCHGADD_ALGORITHM=y
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
# CONFIG_ARCH_HAS_ILOG2_U64 is not set CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y CONFIG_GENERIC_CALIBRATE_DELAY=y
# CONFIG_GENERIC_TIME_VSYSCALL is not set CONFIG_ARCH_HAS_CPU_RELAX=y CONFIG_ARCH_HAS_DEFAULT_IDLE=y CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
# CONFIG_HAVE_CPUMASK_OF_CPU_MAP is not set CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y
# CONFIG_ZONE_DMA32 is not set CONFIG_ARCH_POPULATES_NODE_MAP=y
# CONFIG_AUDIT_ARCH is not set CONFIG_ARCH_SUPPORTS_AOUT=y CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y CONFIG_GENERIC_HARDIRQS=y CONFIG_GENERIC_IRQ_PROBE=y CONFIG_X86_BIOS_REBOOT=yCONFIG_KTIME_SCALAR=y CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
#
# General setup
#CONFIG_EXPERIMENTAL=yCONFIG_BROKEN_ON_SMP=yCONFIG_INIT_ENV_ARG_LIMIT=32CONFIG_LOCALVERSION=""CONFIG_LOCALVERSION_AUTO=yCONFIG_SWAP=yCONFIG_SYSVIPC=yCONFIG_SYSVIPC_SYSCTL=yCONFIG_POSIX_MQUEUE=yCONFIG_BSD_PROCESS_ACCT=y
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
# CONFIG_TASKSTATS is not set
# CONFIG_AUDIT is not setCONFIG_IKCONFIG=yCONFIG_IKCONFIG_PROC=yCONFIG_LOG_BUF_SHIFT=15
# CONFIG_CGROUPS is not setCONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
# CONFIG_GROUP_SCHED is not set
# CONFIG_SYSFS_DEPRECATED_V2 is not set
# CONFIG_RELAY is not setCONFIG_NAMESPACES=y
# CONFIG_UTS_NS is not set
# CONFIG_IPC_NS is not set
# CONFIG_USER_NS is not set
# CONFIG_PID_NS is not set
# CONFIG_BLK_DEV_INITRD is not set
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not setCONFIG_SYSCTL=y
# CONFIG_EMBEDDED is not setCONFIG_UID16=yCONFIG_SYSCTL_SYSCALL=yCONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_EXTRA_PASS is not setCONFIG_HOTPLUG=yCONFIG_PRINTK=yCONFIG_BUG=yCONFIG_ELF_CORE=yCONFIG_PCSPKR_PLATFORM=yCONFIG_COMPAT_BRK=yCONFIG_BASE_FULL=yCONFIG_FUTEX=yCONFIG_ANON_INODES=yCONFIG_EPOLL=yCONFIG_SIGNALFD=yCONFIG_TIMERFD=yCONFIG_EVENTFD=yCONFIG_SHMEM=yCONFIG_VM_EVENT_COUNTERS=yCONFIG_SLUB_DEBUG=y
# CONFIG_SLAB is not setCONFIG_SLUB=y
# CONFIG_SLOB is not set
# CONFIG_PROFILING is not set
# CONFIG_MARKERS is not setCONFIG_HAVE_OPROFILE=y
# CONFIG_KPROBES is not setCONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=yCONFIG_HAVE_IOREMAP_PROT=yCONFIG_HAVE_KPROBES=yCONFIG_HAVE_KRETPROBES=y
# CONFIG_HAVE_ARCH_TRACEHOOK is not set
# CONFIG_HAVE_DMA_ATTRS is not set
# CONFIG_USE_GENERIC_SMP_HELPERS is not set
# CONFIG_HAVE_CLK is not setCONFIG_PROC_PAGE_MONITOR=yCONFIG_HAVE_GENERIC_DMA_COHERENT=yCONFIG_SLABINFO=yCONFIG_RT_MUTEXES=y
# CONFIG_TINY_SHMEM is not setCONFIG_BASE_SMALL=0CONFIG_MODULES=y
# CONFIG_MODULE_FORCE_LOAD is not setCONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not setCONFIG_MODVERSIONS=y
# CONFIG_MODULE_SRCVERSION_ALL is not setCONFIG_KMOD=yCONFIG_BLOCK=y
# CONFIG_LBD is not set
# CONFIG_BLK_DEV_IO_TRACE is not set
# CONFIG_LSF is not set
# CONFIG_BLK_DEV_BSG is not set
# CONFIG_BLK_DEV_INTEGRITY is not set
#
# IO Schedulers
#CONFIG_IOSCHED_NOOP=y
# CONFIG_IOSCHED_AS is not set
# CONFIG_IOSCHED_DEADLINE is not setCONFIG_IOSCHED_CFQ=y
# CONFIG_DEFAULT_AS is not set
# CONFIG_DEFAULT_DEADLINE is not setCONFIG_DEFAULT_CFQ=y
# CONFIG_DEFAULT_NOOP is not setCONFIG_DEFAULT_IOSCHED="cfq"CONFIG_CLASSIC_RCU=y
#
# Processor type and features
#CONFIG_TICK_ONESHOT=yCONFIG_NO_HZ=yCONFIG_HIGH_RES_TIMERS=yCONFIG_GENERIC_CLOCKEVENTS_BUILD=y
# CONFIG_SMP is not setCONFIG_X86_PC=y
# CONFIG_X86_ELAN is not set
# CONFIG_X86_VOYAGER is not set
# CONFIG_X86_GENERICARCH is not set
# CONFIG_X86_VSMP is not set
# CONFIG_X86_RDC321X is not setCONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
# CONFIG_PARAVIRT_GUEST is not set
# CONFIG_MEMTEST is not set
# CONFIG_M386 is not set
# CONFIG_M486 is not set
# CONFIG_M586 is not set
# CONFIG_M586TSC is not set
# CONFIG_M586MMX is not set
# CONFIG_M686 is not set
# CONFIG_MPENTIUMII is not set
# CONFIG_MPENTIUMIII is not set
# CONFIG_MPENTIUMM is not setCONFIG_MPENTIUM4=y
# CONFIG_MK6 is not set
# CONFIG_MK7 is not set
# CONFIG_MK8 is not set
# CONFIG_MCRUSOE is not set
# CONFIG_MEFFICEON is not set
# CONFIG_MWINCHIPC6 is not set
# CONFIG_MWINCHIP2 is not set
# CONFIG_MWINCHIP3D is not set
# CONFIG_MGEODEGX1 is not set
# CONFIG_MGEODE_LX is not set
# CONFIG_MCYRIXIII is not set
# CONFIG_MVIAC3_2 is not set
# CONFIG_MVIAC7 is not set
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not set
# CONFIG_GENERIC_CPU is not set
# CONFIG_X86_GENERIC is not setCONFIG_X86_CPU=yCONFIG_X86_CMPXCHG=yCONFIG_X86_L1_CACHE_SHIFT=7CONFIG_X86_XADD=yCONFIG_X86_WP_WORKS_OK=yCONFIG_X86_INVLPG=yCONFIG_X86_BSWAP=yCONFIG_X86_POPAD_OK=yCONFIG_X86_INTEL_USERCOPY=yCONFIG_X86_USE_PPRO_CHECKSUM=yCONFIG_X86_TSC=yCONFIG_X86_CMOV=yCONFIG_X86_MINIMUM_CPU_FAMILY=4CONFIG_X86_DEBUGCTLMSR=yCONFIG_HPET_TIMER=yCONFIG_HPET_EMULATE_RTC=yCONFIG_DMI=y
# CONFIG_IOMMU_HELPER is not set
# CONFIG_PREEMPT_NONE is not setCONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set
# CONFIG_X86_UP_APIC is not setCONFIG_X86_MCE=y
# CONFIG_X86_MCE_NONFATAL is not setCONFIG_VM86=y
# CONFIG_TOSHIBA is not set
# CONFIG_I8K is not set
# CONFIG_X86_REBOOTFIXUPS is not set
# CONFIG_MICROCODE is not set
# CONFIG_X86_MSR is not set
# CONFIG_X86_CPUID is not setCONFIG_NOHIGHMEM=y
# CONFIG_HIGHMEM4G is not set
# CONFIG_HIGHMEM64G is not setCONFIG_PAGE_OFFSET=0xC0000000
# CONFIG_X86_PAE is not setCONFIG_ARCH_FLATMEM_ENABLE=yCONFIG_ARCH_SPARSEMEM_ENABLE=yCONFIG_ARCH_SELECT_MEMORY_MODEL=yCONFIG_SELECT_MEMORY_MODEL=yCONFIG_FLATMEM_MANUAL=y
# CONFIG_DISCONTIGMEM_MANUAL is not set
# CONFIG_SPARSEMEM_MANUAL is not setCONFIG_FLATMEM=yCONFIG_FLAT_NODE_MEM_MAP=yCONFIG_SPARSEMEM_STATIC=y
# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not setCONFIG_PAGEFLAGS_EXTENDED=yCONFIG_SPLIT_PTLOCK_CPUS=4
# CONFIG_RESOURCES_64BIT is not setCONFIG_ZONE_DMA_FLAG=1CONFIG_BOUNCE=yCONFIG_VIRT_TO_BUS=y
# CONFIG_X86_RESERVE_LOW_64K is not set
# CONFIG_MATH_EMULATION is not setCONFIG_MTRR=y
# CONFIG_MTRR_SANITIZER is not setCONFIG_X86_PAT=y
# CONFIG_EFI is not setCONFIG_SECCOMP=y
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not setCONFIG_HZ_300=y
# CONFIG_HZ_1000 is not setCONFIG_HZ=300CONFIG_SCHED_HRTICK=y
# CONFIG_KEXEC is not setCONFIG_PHYSICAL_START=0x100000
# CONFIG_RELOCATABLE is not setCONFIG_PHYSICAL_ALIGN=0x100000
# CONFIG_COMPAT_VDSO is not set
#
# Power management options
#CONFIG_PM=y
# CONFIG_PM_DEBUG is not setCONFIG_PM_SLEEP=yCONFIG_SUSPEND=yCONFIG_SUSPEND_FREEZER=y
# CONFIG_HIBERNATION is not setCONFIG_ACPI=yCONFIG_ACPI_SLEEP=y
# CONFIG_ACPI_PROCFS is not setCONFIG_ACPI_PROCFS_POWER=yCONFIG_ACPI_SYSFS_POWER=yCONFIG_ACPI_PROC_EVENT=yCONFIG_ACPI_AC=yCONFIG_ACPI_BATTERY=yCONFIG_ACPI_BUTTON=yCONFIG_ACPI_FAN=yCONFIG_ACPI_DOCK=y
# CONFIG_ACPI_BAY is not setCONFIG_ACPI_PROCESSOR=yCONFIG_ACPI_THERMAL=y
# CONFIG_ACPI_WMI is not set
# CONFIG_ACPI_ASUS is not set
# CONFIG_ACPI_TOSHIBA is not set
# CONFIG_ACPI_CUSTOM_DSDT is not setCONFIG_ACPI_BLACKLIST_YEAR=0
# CONFIG_ACPI_DEBUG is not setCONFIG_ACPI_EC=y
# CONFIG_ACPI_PCI_SLOT is not setCONFIG_ACPI_POWER=yCONFIG_ACPI_SYSTEM=yCONFIG_X86_PM_TIMER=y
# CONFIG_ACPI_CONTAINER is not set
# CONFIG_ACPI_SBS is not set
# CONFIG_APM is not set
#
# CPU Frequency scaling
#CONFIG_CPU_FREQ=yCONFIG_CPU_FREQ_TABLE=y
# CONFIG_CPU_FREQ_DEBUG is not set CONFIG_CPU_FREQ_STAT=y
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y
# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
#
# CPUFreq processor drivers
#
# CONFIG_X86_ACPI_CPUFREQ is not set
# CONFIG_X86_POWERNOW_K6 is not set
# CONFIG_X86_POWERNOW_K7 is not set
# CONFIG_X86_POWERNOW_K8 is not set
# CONFIG_X86_GX_SUSPMOD is not set
# CONFIG_X86_SPEEDSTEP_CENTRINO is not setCONFIG_X86_SPEEDSTEP_ICH=y
# CONFIG_X86_SPEEDSTEP_SMI is not set
# CONFIG_X86_P4_CLOCKMOD is not set
# CONFIG_X86_CPUFREQ_NFORCE2 is not set
# CONFIG_X86_LONGRUN is not set
# CONFIG_X86_LONGHAUL is not set
# CONFIG_X86_E_POWERSAVER is not set
#
# shared options # CONFIG_X86_SPEEDSTEP_LIB=y # CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set CONFIG_CPU_IDLE=y CONFIG_CPU_IDLE_GOV_LADDER=y CONFIG_CPU_IDLE_GOV_MENU=y
#
# Bus options (PCI etc.)
#CONFIG_PCI=y
# CONFIG_PCI_GOBIOS is not set
# CONFIG_PCI_GOMMCONFIG is not set
# CONFIG_PCI_GODIRECT is not set
# CONFIG_PCI_GOOLPC is not setCONFIG_PCI_GOANY=yCONFIG_PCI_BIOS=yCONFIG_PCI_DIRECT=yCONFIG_PCI_MMCONFIG=yCONFIG_PCI_DOMAINS=y
# CONFIG_PCIEPORTBUS is not set
# CONFIG_ARCH_SUPPORTS_MSI is not set
# CONFIG_PCI_LEGACY is not setCONFIG_ISA_DMA_API=y
# CONFIG_ISA is not set
# CONFIG_MCA is not set
# CONFIG_SCx200 is not set
# CONFIG_OLPC is not setCONFIG_PCCARD=y
# CONFIG_PCMCIA_DEBUG is not setCONFIG_PCMCIA=yCONFIG_PCMCIA_LOAD_CIS=y
# CONFIG_PCMCIA_IOCTL is not setCONFIG_CARDBUS=y
#
# PC-card bridges
#CONFIG_YENTA=yCONFIG_YENTA_O2=yCONFIG_YENTA_RICOH=yCONFIG_YENTA_TI=yCONFIG_YENTA_ENE_TUNE=yCONFIG_YENTA_TOSHIBA=y
# CONFIG_PD6729 is not set
# CONFIG_I82092 is not setCONFIG_PCCARD_NONSTATIC=y
# CONFIG_HOTPLUG_PCI is not set
#
# Executable file formats / Emulations
#CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_AOUT is not setCONFIG_BINFMT_MISC=mCONFIG_NET=y
#
# Networking options
#CONFIG_PACKET=yCONFIG_PACKET_MMAP=yCONFIG_UNIX=yCONFIG_XFRM=y
# CONFIG_XFRM_USER is not set
# CONFIG_XFRM_SUB_POLICY is not set
# CONFIG_XFRM_MIGRATE is not set
# CONFIG_XFRM_STATISTICS is not setCONFIG_XFRM_IPCOMP=m
# CONFIG_NET_KEY is not setCONFIG_INET=y
# CONFIG_IP_MULTICAST is not set
# CONFIG_IP_ADVANCED_ROUTER is not setCONFIG_IP_FIB_HASH=y
# CONFIG_IP_PNP is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_ARPD is not setCONFIG_SYN_COOKIES=yCONFIG_INET_AH=mCONFIG_INET_ESP=mCONFIG_INET_IPCOMP=mCONFIG_INET_XFRM_TUNNEL=mCONFIG_INET_TUNNEL=mCONFIG_INET_XFRM_MODE_TRANSPORT=yCONFIG_INET_XFRM_MODE_TUNNEL=yCONFIG_INET_XFRM_MODE_BEET=yCONFIG_INET_LRO=yCONFIG_INET_DIAG=yCONFIG_INET_TCP_DIAG=y
# CONFIG_TCP_CONG_ADVANCED is not setCONFIG_TCP_CONG_CUBIC=yCONFIG_DEFAULT_TCP_CONG="cubic"
# CONFIG_TCP_MD5SIG is not set
# CONFIG_IP_VS is not set
# CONFIG_IPV6 is not set
# CONFIG_NETWORK_SECMARK is not setCONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not setCONFIG_NETFILTER_ADVANCED=y
#
# Core Netfilter Configuration
#
# CONFIG_NETFILTER_NETLINK_QUEUE is not set
# CONFIG_NETFILTER_NETLINK_LOG is not setCONFIG_NF_CONNTRACK=m
# CONFIG_NF_CT_ACCT is not set
# CONFIG_NF_CONNTRACK_MARK is not set
# CONFIG_NF_CONNTRACK_EVENTS is not set
# CONFIG_NF_CT_PROTO_DCCP is not set
# CONFIG_NF_CT_PROTO_SCTP is not set
# CONFIG_NF_CT_PROTO_UDPLITE is not set
# CONFIG_NF_CONNTRACK_AMANDA is not setCONFIG_NF_CONNTRACK_FTP=m
# CONFIG_NF_CONNTRACK_H323 is not set
# CONFIG_NF_CONNTRACK_IRC is not set
# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
# CONFIG_NF_CONNTRACK_PPTP is not set
# CONFIG_NF_CONNTRACK_SANE is not set
# CONFIG_NF_CONNTRACK_SIP is not set
# CONFIG_NF_CONNTRACK_TFTP is not set
# CONFIG_NF_CT_NETLINK is not setCONFIG_NETFILTER_XTABLES=m
# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
# CONFIG_NETFILTER_XT_TARGET_MARK is not set
# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set
# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set
# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
# CONFIG_NETFILTER_XT_MATCH_ESP is not set
# CONFIG_NETFILTER_XT_MATCH_HELPER is not set
# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
# CONFIG_NETFILTER_XT_MATCH_MAC is not set
# CONFIG_NETFILTER_XT_MATCH_MARK is not set
# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
# CONFIG_NETFILTER_XT_MATCH_REALM is not set
# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
# CONFIG_NETFILTER_XT_MATCH_STATE is not set
# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
# CONFIG_NETFILTER_XT_MATCH_STRING is not set
# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
# CONFIG_NETFILTER_XT_MATCH_TIME is not set
# CONFIG_NETFILTER_XT_MATCH_U32 is not set
# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
#
# IP: Netfilter Configuration
#CONFIG_NF_CONNTRACK_IPV4=mCONFIG_NF_CONNTRACK_PROC_COMPAT=y
# CONFIG_IP_NF_QUEUE is not setCONFIG_IP_NF_IPTABLES=m
# CONFIG_IP_NF_MATCH_RECENT is not set
# CONFIG_IP_NF_MATCH_ECN is not set
# CONFIG_IP_NF_MATCH_AH is not set
# CONFIG_IP_NF_MATCH_TTL is not set
# CONFIG_IP_NF_MATCH_ADDRTYPE is not setCONFIG_IP_NF_FILTER=m
# CONFIG_IP_NF_TARGET_REJECT is not set
# CONFIG_IP_NF_TARGET_LOG is not set
# CONFIG_IP_NF_TARGET_ULOG is not setCONFIG_NF_NAT=mCONFIG_NF_NAT_NEEDED=y
# CONFIG_IP_NF_TARGET_MASQUERADE is not set
# CONFIG_IP_NF_TARGET_REDIRECT is not set
# CONFIG_IP_NF_TARGET_NETMAP is not set
# CONFIG_NF_NAT_SNMP_BASIC is not setCONFIG_NF_NAT_FTP=m
# CONFIG_NF_NAT_IRC is not set
# CONFIG_NF_NAT_TFTP is not set
# CONFIG_NF_NAT_AMANDA is not set
# CONFIG_NF_NAT_PPTP is not set
# CONFIG_NF_NAT_H323 is not set
# CONFIG_NF_NAT_SIP is not set
# CONFIG_IP_NF_MANGLE is not set
# CONFIG_IP_NF_RAW is not set
# CONFIG_IP_NF_ARPTABLES is not set
# CONFIG_IP_DCCP is not set
# CONFIG_IP_SCTP is not set
# CONFIG_TIPC is not set
# CONFIG_ATM is not set
# CONFIG_BRIDGE is not set
# CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_SCHED is not set
#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
# CONFIG_HAMRADIO is not set
# CONFIG_CAN is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
# CONFIG_AF_RXRPC is not set
#
# Wireless
#
# CONFIG_CFG80211 is not set
# CONFIG_WIRELESS_EXT is not set
# CONFIG_MAC80211 is not set
# CONFIG_IEEE80211 is not set
# CONFIG_RFKILL is not set
# CONFIG_NET_9P is not set
#
# Device Drivers
#
#
# Generic Driver Options
#CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"CONFIG_STANDALONE=yCONFIG_PREVENT_FIRMWARE_BUILD=yCONFIG_FW_LOADER=y
# CONFIG_FIRMWARE_IN_KERNEL is not setCONFIG_EXTRA_FIRMWARE=""
# CONFIG_SYS_HYPERVISOR is not set
# CONFIG_CONNECTOR is not set
# CONFIG_MTD is not setCONFIG_PARPORT=mCONFIG_PARPORT_PC=m
# CONFIG_PARPORT_SERIAL is not set
# CONFIG_PARPORT_PC_FIFO is not set
# CONFIG_PARPORT_PC_SUPERIO is not set
# CONFIG_PARPORT_PC_PCMCIA is not set
# CONFIG_PARPORT_GSC is not set
# CONFIG_PARPORT_AX88796 is not setCONFIG_PARPORT_1284=yCONFIG_PNP=y
# CONFIG_PNP_DEBUG is not set
#
# Protocols
#CONFIG_PNPACPI=yCONFIG_BLK_DEV=yCONFIG_BLK_DEV_FD=y
# CONFIG_PARIDE is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set
# CONFIG_BLK_DEV_COW_COMMON is not setCONFIG_BLK_DEV_LOOP=m
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
# CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_SX8 is not set
# CONFIG_BLK_DEV_UB is not set
# CONFIG_BLK_DEV_RAM is not set
# CONFIG_CDROM_PKTCDVD is not set
# CONFIG_ATA_OVER_ETH is not set
# CONFIG_BLK_DEV_HD is not set
# CONFIG_MISC_DEVICES is not setCONFIG_HAVE_IDE=y
# CONFIG_IDE is not set
#
# SCSI device support
#
# CONFIG_RAID_ATTRS is not setCONFIG_SCSI=yCONFIG_SCSI_DMA=y
# CONFIG_SCSI_TGT is not set
# CONFIG_SCSI_NETLINK is not set
# CONFIG_SCSI_PROC_FS is not set
#
# SCSI support type (disk, tape, CD-ROM)
#CONFIG_BLK_DEV_SD=y
# CONFIG_CHR_DEV_ST is not set
# CONFIG_CHR_DEV_OSST is not setCONFIG_BLK_DEV_SR=y
# CONFIG_BLK_DEV_SR_VENDOR is not setCONFIG_CHR_DEV_SG=m
# CONFIG_CHR_DEV_SCH is not set
#
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs #CONFIG_SCSI_MULTI_LUN=yCONFIG_SCSI_CONSTANTS=y
# CONFIG_SCSI_LOGGING is not set
# CONFIG_SCSI_SCAN_ASYNC is not set CONFIG_SCSI_WAIT_SCAN=m
#
# SCSI Transports
#
# CONFIG_SCSI_SPI_ATTRS is not set
# CONFIG_SCSI_FC_ATTRS is not set
# CONFIG_SCSI_ISCSI_ATTRS is not set
# CONFIG_SCSI_SAS_LIBSAS is not set
# CONFIG_SCSI_SRP_ATTRS is not setCONFIG_SCSI_LOWLEVEL=y
# CONFIG_ISCSI_TCP is not set
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
# CONFIG_SCSI_3W_9XXX is not set
# CONFIG_SCSI_ACARD is not set
# CONFIG_SCSI_AACRAID is not set
# CONFIG_SCSI_AIC7XXX is not set
# CONFIG_SCSI_AIC7XXX_OLD is not set
# CONFIG_SCSI_AIC79XX is not set
# CONFIG_SCSI_AIC94XX is not set
# CONFIG_SCSI_DPT_I2O is not set
# CONFIG_SCSI_ADVANSYS is not set
# CONFIG_SCSI_ARCMSR is not set
# CONFIG_MEGARAID_NEWGEN is not set
# CONFIG_MEGARAID_LEGACY is not set
# CONFIG_MEGARAID_SAS is not set
# CONFIG_SCSI_HPTIOP is not set
# CONFIG_SCSI_BUSLOGIC is not set
# CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_EATA is not set
# CONFIG_SCSI_FUTURE_DOMAIN is not set
# CONFIG_SCSI_GDTH is not set
# CONFIG_SCSI_IPS is not set
# CONFIG_SCSI_INITIO is not set
# CONFIG_SCSI_INIA100 is not set
# CONFIG_SCSI_PPA is not set
# CONFIG_SCSI_IMM is not set
# CONFIG_SCSI_MVSAS is not set
# CONFIG_SCSI_STEX is not set
# CONFIG_SCSI_SYM53C8XX_2 is not set
# CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_QLOGIC_1280 is not set
# CONFIG_SCSI_QLA_FC is not set
# CONFIG_SCSI_QLA_ISCSI is not set
# CONFIG_SCSI_LPFC is not set
# CONFIG_SCSI_DC395x is not set
# CONFIG_SCSI_DC390T is not set
# CONFIG_SCSI_NSP32 is not set
# CONFIG_SCSI_DEBUG is not set
# CONFIG_SCSI_SRP is not set
# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
# CONFIG_SCSI_DH is not setCONFIG_ATA=y
# CONFIG_ATA_NONSTANDARD is not setCONFIG_ATA_ACPI=y
# CONFIG_SATA_PMP is not set
# CONFIG_SATA_AHCI is not set
# CONFIG_SATA_SIL24 is not setCONFIG_ATA_SFF=y
# CONFIG_SATA_SVW is not setCONFIG_ATA_PIIX=y
# CONFIG_SATA_MV is not set
# CONFIG_SATA_NV is not set
# CONFIG_PDC_ADMA is not set
# CONFIG_SATA_QSTOR is not set
# CONFIG_SATA_PROMISE is not set
# CONFIG_SATA_SX4 is not set
# CONFIG_SATA_SIL is not set
# CONFIG_SATA_SIS is not set
# CONFIG_SATA_ULI is not set
# CONFIG_SATA_VIA is not set
# CONFIG_SATA_VITESSE is not set
# CONFIG_SATA_INIC162X is not set
# CONFIG_PATA_ACPI is not set
# CONFIG_PATA_ALI is not set
# CONFIG_PATA_AMD is not set
# CONFIG_PATA_ARTOP is not set
# CONFIG_PATA_ATIIXP is not set
# CONFIG_PATA_CMD640_PCI is not set
# CONFIG_PATA_CMD64X is not set
# CONFIG_PATA_CS5520 is not set
# CONFIG_PATA_CS5530 is not set
# CONFIG_PATA_CS5535 is not set
# CONFIG_PATA_CS5536 is not set
# CONFIG_PATA_CYPRESS is not set
# CONFIG_PATA_EFAR is not set
# CONFIG_ATA_GENERIC is not set
# CONFIG_PATA_HPT366 is not set
# CONFIG_PATA_HPT37X is not set
# CONFIG_PATA_HPT3X2N is not set
# CONFIG_PATA_HPT3X3 is not set
# CONFIG_PATA_IT821X is not set
# CONFIG_PATA_IT8213 is not set
# CONFIG_PATA_JMICRON is not set
# CONFIG_PATA_TRIFLEX is not set
# CONFIG_PATA_MARVELL is not set
# CONFIG_PATA_MPIIX is not set
# CONFIG_PATA_OLDPIIX is not set
# CONFIG_PATA_NETCELL is not set
# CONFIG_PATA_NINJA32 is not set
# CONFIG_PATA_NS87410 is not set
# CONFIG_PATA_NS87415 is not set
# CONFIG_PATA_OPTI is not set
# CONFIG_PATA_OPTIDMA is not setCONFIG_PATA_PCMCIA=m
# CONFIG_PATA_PDC_OLD is not set
# CONFIG_PATA_RADISYS is not set
# CONFIG_PATA_RZ1000 is not set
# CONFIG_PATA_SC1200 is not set
# CONFIG_PATA_SERVERWORKS is not set
# CONFIG_PATA_PDC2027X is not set
# CONFIG_PATA_SIL680 is not set
# CONFIG_PATA_SIS is not set
# CONFIG_PATA_VIA is not set
# CONFIG_PATA_WINBOND is not set
# CONFIG_PATA_SCH is not set
# CONFIG_MD is not set
# CONFIG_FUSION is not set
#
# IEEE 1394 (FireWire) support
#
#
# Enable only one of the two stacks, unless you know what you are doing #
# CONFIG_FIREWIRE is not set
# CONFIG_IEEE1394 is not set
# CONFIG_I2O is not set
# CONFIG_MACINTOSH_DRIVERS is not setCONFIG_NETDEVICES=yCONFIG_DUMMY=m
# CONFIG_BONDING is not set
# CONFIG_MACVLAN is not set
# CONFIG_EQUALIZER is not setCONFIG_TUN=m
# CONFIG_VETH is not set
# CONFIG_NET_SB1000 is not set
# CONFIG_ARCNET is not set
# CONFIG_PHYLIB is not setCONFIG_NET_ETHERNET=yCONFIG_MII=m
# CONFIG_HAPPYMEAL is not set
# CONFIG_SUNGEM is not set
# CONFIG_CASSINI is not setCONFIG_NET_VENDOR_3COM=yCONFIG_VORTEX=m
# CONFIG_TYPHOON is not setCONFIG_NET_TULIP=y
# CONFIG_DE2104X is not setCONFIG_TULIP=m
# CONFIG_TULIP_MWI is not set
# CONFIG_TULIP_MMIO is not set
# CONFIG_TULIP_NAPI is not set
# CONFIG_DE4X5 is not set
# CONFIG_WINBOND_840 is not set
# CONFIG_DM9102 is not set
# CONFIG_ULI526X is not set
# CONFIG_PCMCIA_XIRCOM is not set
# CONFIG_HP100 is not set
# CONFIG_IBM_NEW_EMAC_ZMII is not set
# CONFIG_IBM_NEW_EMAC_RGMII is not set
# CONFIG_IBM_NEW_EMAC_TAH is not set
# CONFIG_IBM_NEW_EMAC_EMAC4 is not setCONFIG_NET_PCI=y
# CONFIG_PCNET32 is not set
# CONFIG_AMD8111_ETH is not set
# CONFIG_ADAPTEC_STARFIRE is not set
# CONFIG_B44 is not set
# CONFIG_FORCEDETH is not setCONFIG_EEPRO100=mCONFIG_E100=m
# CONFIG_FEALNX is not set
# CONFIG_NATSEMI is not set
# CONFIG_NE2K_PCI is not set
# CONFIG_8139CP is not set
# CONFIG_8139TOO is not set
# CONFIG_R6040 is not set
# CONFIG_SIS900 is not set
# CONFIG_EPIC100 is not set
# CONFIG_SUNDANCE is not set
# CONFIG_TLAN is not set
# CONFIG_VIA_RHINE is not set
# CONFIG_SC92031 is not set
# CONFIG_NET_POCKET is not set
# CONFIG_NETDEV_1000 is not set
# CONFIG_NETDEV_10000 is not set
# CONFIG_TR is not set
#
# Wireless LAN
#
# CONFIG_WLAN_PRE80211 is not set
# CONFIG_WLAN_80211 is not set
# CONFIG_IWLWIFI_LEDS is not set
#
# USB Network Adapters
#
# CONFIG_USB_CATC is not set
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_RTL8150 is not set
# CONFIG_USB_USBNET is not set
# CONFIG_NET_PCMCIA is not set
# CONFIG_WAN is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PLIP is not setCONFIG_PPP=m
# CONFIG_PPP_MULTILINK is not setCONFIG_PPP_FILTER=yCONFIG_PPP_ASYNC=mCONFIG_PPP_SYNC_TTY=mCONFIG_PPP_DEFLATE=mCONFIG_PPP_BSDCOMP=m
# CONFIG_PPP_MPPE is not setCONFIG_PPPOE=m
# CONFIG_PPPOL2TP is not set
# CONFIG_SLIP is not setCONFIG_SLHC=m
# CONFIG_NET_FC is not set
# CONFIG_NETCONSOLE is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# CONFIG_ISDN is not set
# CONFIG_PHONE is not set
#
# Input device support
#CONFIG_INPUT=y
# CONFIG_INPUT_FF_MEMLESS is not set
# CONFIG_INPUT_POLLDEV is not set
#
# Userland interfaces
#CONFIG_INPUT_MOUSEDEV=y
# CONFIG_INPUT_MOUSEDEV_PSAUX is not setCONFIG_INPUT_MOUSEDEV_SCREEN_X=1024CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not setCONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set
#
# Input Device Drivers
#CONFIG_INPUT_KEYBOARD=yCONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not set
# CONFIG_KEYBOARD_STOWAWAY is not setCONFIG_INPUT_MOUSE=yCONFIG_MOUSE_PS2=mCONFIG_MOUSE_PS2_ALPS=yCONFIG_MOUSE_PS2_LOGIPS2PP=yCONFIG_MOUSE_PS2_SYNAPTICS=yCONFIG_MOUSE_PS2_LIFEBOOK=yCONFIG_MOUSE_PS2_TRACKPOINT=y
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
# CONFIG_MOUSE_SERIAL is not set
# CONFIG_MOUSE_APPLETOUCH is not set
# CONFIG_MOUSE_BCM5974 is not set
# CONFIG_MOUSE_VSXXXAA is not set
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TABLET is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
# CONFIG_INPUT_MISC is not set
#
# Hardware I/O ports
#CONFIG_SERIO=yCONFIG_SERIO_I8042=y
# CONFIG_SERIO_SERPORT is not set
# CONFIG_SERIO_CT82C710 is not set
# CONFIG_SERIO_PARKBD is not set
# CONFIG_SERIO_PCIPS2 is not setCONFIG_SERIO_LIBPS2=y
# CONFIG_SERIO_RAW is not set
# CONFIG_GAMEPORT is not set
#
# Character devices
#CONFIG_VT=yCONFIG_CONSOLE_TRANSLATIONS=yCONFIG_VT_CONSOLE=yCONFIG_HW_CONSOLE=y
# CONFIG_VT_HW_CONSOLE_BINDING is not set
# CONFIG_DEVKMEM is not set
# CONFIG_SERIAL_NONSTANDARD is not set
# CONFIG_NOZOMI is not set
#
# Serial drivers
#CONFIG_SERIAL_8250=mCONFIG_FIX_EARLYCON_MEM=yCONFIG_SERIAL_8250_PCI=mCONFIG_SERIAL_8250_PNP=mCONFIG_SERIAL_8250_CS=mCONFIG_SERIAL_8250_NR_UARTS=4CONFIG_SERIAL_8250_RUNTIME_UARTS=4CONFIG_SERIAL_8250_EXTENDED=y
# CONFIG_SERIAL_8250_MANY_PORTS is not set
# CONFIG_SERIAL_8250_SHARE_IRQ is not set
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
# CONFIG_SERIAL_8250_RSA is not set
#
# Non-8250 serial port support
#CONFIG_SERIAL_CORE=m
# CONFIG_SERIAL_JSM is not setCONFIG_UNIX98_PTYS=y
# CONFIG_LEGACY_PTYS is not setCONFIG_PRINTER=m
# CONFIG_LP_CONSOLE is not set
# CONFIG_PPDEV is not set
# CONFIG_IPMI_HANDLER is not set
# CONFIG_HW_RANDOM is not set
# CONFIG_NVRAM is not setCONFIG_RTC=y
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
# CONFIG_SONYPI is not set
#
# PCMCIA character devices
#
# CONFIG_SYNCLINK_CS is not set
# CONFIG_CARDMAN_4000 is not set
# CONFIG_CARDMAN_4040 is not set
# CONFIG_IPWIRELESS is not set
# CONFIG_MWAVE is not set
# CONFIG_PC8736x_GPIO is not set
# CONFIG_NSC_GPIO is not set
# CONFIG_CS5535_GPIO is not set
# CONFIG_RAW_DRIVER is not set
# CONFIG_HPET is not set
# CONFIG_HANGCHECK_TIMER is not set
# CONFIG_TCG_TPM is not set
# CONFIG_TELCLOCK is not setCONFIG_DEVPORT=y
# CONFIG_I2C is not set
# CONFIG_SPI is not setCONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
# CONFIG_GPIOLIB is not set
# CONFIG_W1 is not setCONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not set
# CONFIG_PDA_POWER is not set
# CONFIG_BATTERY_DS2760 is not set
# CONFIG_HWMON is not setCONFIG_THERMAL=y
# CONFIG_WATCHDOG is not set
#
# Sonics Silicon Backplane
#CONFIG_SSB_POSSIBLE=y
# CONFIG_SSB is not set
#
# Multifunction device drivers
#
# CONFIG_MFD_CORE is not set
# CONFIG_MFD_SM501 is not set
# CONFIG_HTC_PASIC3 is not set
# CONFIG_MFD_TMIO is not set
#
# Multimedia devices
#
#
# Multimedia core support
#
# CONFIG_VIDEO_DEV is not set
# CONFIG_DVB_CORE is not set
# CONFIG_VIDEO_MEDIA is not set
#
# Multimedia drivers
#
# CONFIG_DAB is not set
#
# Graphics support
#CONFIG_AGP=y
# CONFIG_AGP_ALI is not set
# CONFIG_AGP_ATI is not set
# CONFIG_AGP_AMD is not set
# CONFIG_AGP_AMD64 is not setCONFIG_AGP_INTEL=y
# CONFIG_AGP_NVIDIA is not set
# CONFIG_AGP_SIS is not set
# CONFIG_AGP_SWORKS is not set
# CONFIG_AGP_VIA is not set
# CONFIG_AGP_EFFICEON is not setCONFIG_DRM=y
# CONFIG_DRM_TDFX is not set
# CONFIG_DRM_R128 is not setCONFIG_DRM_RADEON=m
# CONFIG_DRM_I810 is not set
# CONFIG_DRM_I830 is not set
# CONFIG_DRM_I915 is not set
# CONFIG_DRM_MGA is not set
# CONFIG_DRM_SIS is not set
# CONFIG_DRM_VIA is not set
# CONFIG_DRM_SAVAGE is not set
# CONFIG_VGASTATE is not setCONFIG_VIDEO_OUTPUT_CONTROL=m
# CONFIG_FB is not set
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
#
# Display device support
#
# CONFIG_DISPLAY_SUPPORT is not set
#
# Console display driver support
#CONFIG_VGA_CONSOLE=y
# CONFIG_VGACON_SOFT_SCROLLBACK is not set
# CONFIG_VIDEO_SELECT is not setCONFIG_DUMMY_CONSOLE=yCONFIG_SOUND=mCONFIG_SND=mCONFIG_SND_TIMER=mCONFIG_SND_PCM=mCONFIG_SND_SEQUENCER=m
# CONFIG_SND_SEQ_DUMMY is not set
# CONFIG_SND_MIXER_OSS is not set
# CONFIG_SND_PCM_OSS is not set
# CONFIG_SND_SEQUENCER_OSS is not setCONFIG_SND_RTCTIMER=mCONFIG_SND_SEQ_RTCTIMER_DEFAULT=y
# CONFIG_SND_DYNAMIC_MINORS is not setCONFIG_SND_SUPPORT_OLD_API=yCONFIG_SND_VERBOSE_PROCFS=y
# CONFIG_SND_VERBOSE_PRINTK is not set
# CONFIG_SND_DEBUG is not setCONFIG_SND_VMASTER=yCONFIG_SND_AC97_CODEC=mCONFIG_SND_DRIVERS=y
# CONFIG_SND_PCSP is not set
# CONFIG_SND_DUMMY is not set
# CONFIG_SND_VIRMIDI is not set
# CONFIG_SND_MTPAV is not set
# CONFIG_SND_MTS64 is not set
# CONFIG_SND_SERIAL_U16550 is not set
# CONFIG_SND_MPU401 is not set
# CONFIG_SND_PORTMAN2X4 is not setCONFIG_SND_AC97_POWER_SAVE=yCONFIG_SND_AC97_POWER_SAVE_DEFAULT=3CONFIG_SND_PCI=y
# CONFIG_SND_AD1889 is not set
# CONFIG_SND_ALS300 is not set
# CONFIG_SND_ALS4000 is not set
# CONFIG_SND_ALI5451 is not set
# CONFIG_SND_ATIIXP is not set
# CONFIG_SND_ATIIXP_MODEM is not set
# CONFIG_SND_AU8810 is not set
# CONFIG_SND_AU8820 is not set
# CONFIG_SND_AU8830 is not set
# CONFIG_SND_AW2 is not set
# CONFIG_SND_AZT3328 is not set
# CONFIG_SND_BT87X is not set
# CONFIG_SND_CA0106 is not set
# CONFIG_SND_CMIPCI is not set
# CONFIG_SND_OXYGEN is not set
# CONFIG_SND_CS4281 is not set
# CONFIG_SND_CS46XX is not set
# CONFIG_SND_CS5530 is not set
# CONFIG_SND_CS5535AUDIO is not set
# CONFIG_SND_DARLA20 is not set
# CONFIG_SND_GINA20 is not set
# CONFIG_SND_LAYLA20 is not set
# CONFIG_SND_DARLA24 is not set
# CONFIG_SND_GINA24 is not set
# CONFIG_SND_LAYLA24 is not set
# CONFIG_SND_MONA is not set
# CONFIG_SND_MIA is not set
# CONFIG_SND_ECHO3G is not set
# CONFIG_SND_INDIGO is not set
# CONFIG_SND_INDIGOIO is not set
# CONFIG_SND_INDIGODJ is not set
# CONFIG_SND_EMU10K1 is not set
# CONFIG_SND_EMU10K1X is not set
# CONFIG_SND_ENS1370 is not set
# CONFIG_SND_ENS1371 is not set
# CONFIG_SND_ES1938 is not set
# CONFIG_SND_ES1968 is not set
# CONFIG_SND_FM801 is not set
# CONFIG_SND_HDA_INTEL is not set
# CONFIG_SND_HDSP is not set
# CONFIG_SND_HDSPM is not set
# CONFIG_SND_HIFIER is not set
# CONFIG_SND_ICE1712 is not set
# CONFIG_SND_ICE1724 is not setCONFIG_SND_INTEL8X0=m
# CONFIG_SND_INTEL8X0M is not set
# CONFIG_SND_KORG1212 is not set
# CONFIG_SND_MAESTRO3 is not set
# CONFIG_SND_MIXART is not set
# CONFIG_SND_NM256 is not set
# CONFIG_SND_PCXHR is not set
# CONFIG_SND_RIPTIDE is not set
# CONFIG_SND_RME32 is not set
# CONFIG_SND_RME96 is not set
# CONFIG_SND_RME9652 is not set
# CONFIG_SND_SIS7019 is not set
# CONFIG_SND_SONICVIBES is not set
# CONFIG_SND_TRIDENT is not set
# CONFIG_SND_VIA82XX is not set
# CONFIG_SND_VIA82XX_MODEM is not set
# CONFIG_SND_VIRTUOSO is not set
# CONFIG_SND_VX222 is not set
# CONFIG_SND_YMFPCI is not set
# CONFIG_SND_USB is not set
# CONFIG_SND_PCMCIA is not set
# CONFIG_SND_SOC is not set
# CONFIG_SOUND_PRIME is not setCONFIG_AC97_BUS=mCONFIG_HID_SUPPORT=yCONFIG_HID=y
# CONFIG_HID_DEBUG is not set
# CONFIG_HIDRAW is not set
#
# USB Input Devices
#CONFIG_USB_HID=m
# CONFIG_USB_HIDINPUT_POWERBOOK is not set
# CONFIG_HID_FF is not set
# CONFIG_USB_HIDDEV is not set
#
# USB HID Boot Protocol drivers
#
# CONFIG_USB_KBD is not set
# CONFIG_USB_MOUSE is not setCONFIG_USB_SUPPORT=yCONFIG_USB_ARCH_HAS_HCD=yCONFIG_USB_ARCH_HAS_OHCI=yCONFIG_USB_ARCH_HAS_EHCI=yCONFIG_USB=y
# CONFIG_USB_DEBUG is not set
# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
#
# Miscellaneous USB options
#CONFIG_USB_DEVICEFS=y
# CONFIG_USB_DEVICE_CLASS is not set
# CONFIG_USB_DYNAMIC_MINORS is not setCONFIG_USB_SUSPEND=y
# CONFIG_USB_OTG is not setCONFIG_USB_MON=y
#
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not setCONFIG_USB_EHCI_HCD=y
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
# CONFIG_USB_ISP116X_HCD is not set
# CONFIG_USB_ISP1760_HCD is not setCONFIG_USB_OHCI_HCD=y
# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not setCONFIG_USB_OHCI_LITTLE_ENDIAN=y
# CONFIG_USB_UHCI_HCD is not set
# CONFIG_USB_SL811_HCD is not set
# CONFIG_USB_R8A66597_HCD is not set
#
# USB Device Class drivers
#
# CONFIG_USB_ACM is not setCONFIG_USB_PRINTER=m
# CONFIG_USB_WDM is not set
#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' #
#
# may also be needed; see USB_STORAGE Help for more information # CONFIG_USB_STORAGE=m # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_DPCM is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_LIBUSUAL is not set
#
# USB Imaging devices
#
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_MICROTEK is not set
#
# USB port drivers
#
# CONFIG_USB_USS720 is not set
# CONFIG_USB_SERIAL is not set
#
# USB Miscellaneous drivers
#
# CONFIG_USB_EMI62 is not set
# CONFIG_USB_EMI26 is not set
# CONFIG_USB_ADUTUX is not set
# CONFIG_USB_RIO500 is not set
# CONFIG_USB_LEGOTOWER is not set
# CONFIG_USB_LCD is not set
# CONFIG_USB_BERRY_CHARGE is not set
# CONFIG_USB_LED is not set
# CONFIG_USB_CYPRESS_CY7C63 is not set
# CONFIG_USB_CYTHERM is not set
# CONFIG_USB_PHIDGET is not set
# CONFIG_USB_IDMOUSE is not set
# CONFIG_USB_FTDI_ELAN is not set
# CONFIG_USB_APPLEDISPLAY is not set
# CONFIG_USB_SISUSBVGA is not set
# CONFIG_USB_LD is not set
# CONFIG_USB_TRANCEVIBRATOR is not set
# CONFIG_USB_IOWARRIOR is not set
# CONFIG_USB_TEST is not set
# CONFIG_USB_ISIGHTFW is not set
# CONFIG_USB_GADGET is not set
# CONFIG_MMC is not set
# CONFIG_MEMSTICK is not set
# CONFIG_NEW_LEDS is not set
# CONFIG_ACCESSIBILITY is not set
# CONFIG_INFINIBAND is not set
# CONFIG_EDAC is not set
# CONFIG_RTC_CLASS is not set
# CONFIG_DMADEVICES is not set
# CONFIG_AUXDISPLAY is not set
# CONFIG_UIO is not set
#
# Firmware Drivers
#
# CONFIG_EDD is not setCONFIG_FIRMWARE_MEMMAP=y
# CONFIG_DELL_RBU is not set
# CONFIG_DCDBAS is not setCONFIG_DMIID=y
# CONFIG_ISCSI_IBFT_FIND is not set
#
# File systems
#CONFIG_EXT2_FS=m
# CONFIG_EXT2_FS_XATTR is not set
# CONFIG_EXT2_FS_XIP is not setCONFIG_EXT3_FS=yCONFIG_EXT3_FS_XATTR=y
# CONFIG_EXT3_FS_POSIX_ACL is not set
# CONFIG_EXT3_FS_SECURITY is not set
# CONFIG_EXT4DEV_FS is not setCONFIG_JBD=yCONFIG_FS_MBCACHE=y
# CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not set
# CONFIG_FS_POSIX_ACL is not set
# CONFIG_XFS_FS is not set
# CONFIG_OCFS2_FS is not setCONFIG_DNOTIFY=yCONFIG_INOTIFY=yCONFIG_INOTIFY_USER=y
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS_FS is not setCONFIG_AUTOFS4_FS=m
# CONFIG_FUSE_FS is not set
#
# CD-ROM/DVD Filesystems
#CONFIG_ISO9660_FS=yCONFIG_JOLIET=y
# CONFIG_ZISOFS is not setCONFIG_UDF_FS=mCONFIG_UDF_NLS=y
#
# DOS/FAT/NT Filesystems
#CONFIG_FAT_FS=mCONFIG_MSDOS_FS=mCONFIG_VFAT_FS=mCONFIG_FAT_DEFAULT_CODEPAGE=437CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
# CONFIG_NTFS_FS is not set
#
# Pseudo filesystems
#CONFIG_PROC_FS=y
# CONFIG_PROC_KCORE is not setCONFIG_PROC_SYSCTL=yCONFIG_SYSFS=yCONFIG_TMPFS=y
# CONFIG_TMPFS_POSIX_ACL is not set
# CONFIG_HUGETLBFS is not set
# CONFIG_HUGETLB_PAGE is not setCONFIG_CONFIGFS_FS=y
#
# Miscellaneous filesystems
#
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_CRAMFS is not set
# CONFIG_VXFS_FS is not setCONFIG_MINIX_FS=m
# CONFIG_OMFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
# CONFIG_ROMFS_FS is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
# CONFIG_NETWORK_FILESYSTEMS is not set
#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not setCONFIG_MSDOS_PARTITION=yCONFIG_NLS=yCONFIG_NLS_DEFAULT="iso8859-1"CONFIG_NLS_CODEPAGE_437=mCONFIG_NLS_CODEPAGE_737=m
# CONFIG_NLS_CODEPAGE_775 is not setCONFIG_NLS_CODEPAGE_850=m
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not setCONFIG_NLS_CODEPAGE_869=m
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not setCONFIG_NLS_ASCII=mCONFIG_NLS_ISO8859_1=m
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not setCONFIG_NLS_ISO8859_7=m
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not setCONFIG_NLS_ISO8859_15=m
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not setCONFIG_NLS_UTF8=m
# CONFIG_DLM is not set
#
# Kernel hacking
#CONFIG_TRACE_IRQFLAGS_SUPPORT=y
# CONFIG_PRINTK_TIME is not setCONFIG_ENABLE_WARN_DEPRECATED=yCONFIG_ENABLE_MUST_CHECK=yCONFIG_FRAME_WARN=1024
# CONFIG_MAGIC_SYSRQ is not set
# CONFIG_UNUSED_SYMBOLS is not set
# CONFIG_DEBUG_FS is not set
# CONFIG_HEADERS_CHECK is not set
# CONFIG_DEBUG_KERNEL is not set
# CONFIG_SLUB_DEBUG_ON is not set
# CONFIG_SLUB_STATS is not setCONFIG_DEBUG_BUGVERBOSE=yCONFIG_DEBUG_MEMORY_INIT=y
# CONFIG_LATENCYTOP is not setCONFIG_SYSCTL_SYSCALL_CHECK=yCONFIG_HAVE_FTRACE=yCONFIG_HAVE_DYNAMIC_FTRACE=y
# CONFIG_FTRACE is not set
# CONFIG_IRQSOFF_TRACER is not set
# CONFIG_SYSPROF_TRACER is not set
# CONFIG_SCHED_TRACER is not set
# CONFIG_CONTEXT_SWITCH_TRACER is not set
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
# CONFIG_SAMPLES is not setCONFIG_HAVE_ARCH_KGDB=y
# CONFIG_STRICT_DEVMEM is not setCONFIG_X86_VERBOSE_BOOTUP=yCONFIG_EARLY_PRINTK=y
# CONFIG_4KSTACKS is not setCONFIG_DOUBLEFAULT=yCONFIG_IO_DELAY_TYPE_0X80=0CONFIG_IO_DELAY_TYPE_0XED=1CONFIG_IO_DELAY_TYPE_UDELAY=2CONFIG_IO_DELAY_TYPE_NONE=3CONFIG_IO_DELAY_0X80=y
# CONFIG_IO_DELAY_0XED is not set
# CONFIG_IO_DELAY_UDELAY is not set
# CONFIG_IO_DELAY_NONE is not setCONFIG_DEFAULT_IO_DELAY_TYPE=0CONFIG_OPTIMIZE_INLINING=y
#
# Security options
#
# CONFIG_KEYS is not set
# CONFIG_SECURITY is not set
# CONFIG_SECURITY_FILE_CAPABILITIES is not setCONFIG_CRYPTO=y
#
# Crypto core or helper
#CONFIG_CRYPTO_ALGAPI=yCONFIG_CRYPTO_AEAD=mCONFIG_CRYPTO_BLKCIPHER=mCONFIG_CRYPTO_HASH=yCONFIG_CRYPTO_MANAGER=yCONFIG_CRYPTO_GF128MUL=m
# CONFIG_CRYPTO_NULL is not set
# CONFIG_CRYPTO_CRYPTD is not setCONFIG_CRYPTO_AUTHENC=m
# CONFIG_CRYPTO_TEST is not set
#
# Authenticated Encryption with Associated Data
#CONFIG_CRYPTO_CCM=mCONFIG_CRYPTO_GCM=mCONFIG_CRYPTO_SEQIV=m
#
# Block modes
#CONFIG_CRYPTO_CBC=mCONFIG_CRYPTO_CTR=mCONFIG_CRYPTO_CTS=mCONFIG_CRYPTO_ECB=m
# CONFIG_CRYPTO_LRW is not setCONFIG_CRYPTO_PCBC=m
# CONFIG_CRYPTO_XTS is not set
#
# Hash modes
#CONFIG_CRYPTO_HMAC=y
# CONFIG_CRYPTO_XCBC is not set
#
# Digest
#
# CONFIG_CRYPTO_CRC32C is not set
# CONFIG_CRYPTO_MD4 is not setCONFIG_CRYPTO_MD5=m
# CONFIG_CRYPTO_MICHAEL_MIC is not set
# CONFIG_CRYPTO_RMD128 is not setCONFIG_CRYPTO_RMD160=mCONFIG_CRYPTO_RMD256=mCONFIG_CRYPTO_RMD320=mCONFIG_CRYPTO_SHA1=m
# CONFIG_CRYPTO_SHA256 is not set
# CONFIG_CRYPTO_SHA512 is not set
# CONFIG_CRYPTO_TGR192 is not set
# CONFIG_CRYPTO_WP512 is not set
#
# Ciphers
#CONFIG_CRYPTO_AES=mCONFIG_CRYPTO_AES_586=m
# CONFIG_CRYPTO_ANUBIS is not set
# CONFIG_CRYPTO_ARC4 is not set
# CONFIG_CRYPTO_BLOWFISH is not set
# CONFIG_CRYPTO_CAMELLIA is not set
# CONFIG_CRYPTO_CAST5 is not set
# CONFIG_CRYPTO_CAST6 is not setCONFIG_CRYPTO_DES=m
# CONFIG_CRYPTO_FCRYPT is not set
# CONFIG_CRYPTO_KHAZAD is not set
# CONFIG_CRYPTO_SALSA20 is not set
# CONFIG_CRYPTO_SALSA20_586 is not set
# CONFIG_CRYPTO_SEED is not set
# CONFIG_CRYPTO_SERPENT is not set
# CONFIG_CRYPTO_TEA is not set
# CONFIG_CRYPTO_TWOFISH is not set
# CONFIG_CRYPTO_TWOFISH_586 is not set
#
# Compression
#CONFIG_CRYPTO_DEFLATE=mCONFIG_CRYPTO_LZO=m
# CONFIG_CRYPTO_HW is not setCONFIG_HAVE_KVM=y
# CONFIG_VIRTUALIZATION is not set
#
# Library routines
#CONFIG_BITREVERSE=yCONFIG_GENERIC_FIND_FIRST_BIT=yCONFIG_GENERIC_FIND_NEXT_BIT=yCONFIG_CRC_CCITT=m
# CONFIG_CRC16 is not set
# CONFIG_CRC_T10DIF is not setCONFIG_CRC_ITU_T=mCONFIG_CRC32=y
# CONFIG_CRC7 is not set
# CONFIG_LIBCRC32C is not setCONFIG_ZLIB_INFLATE=mCONFIG_ZLIB_DEFLATE=mCONFIG_LZO_COMPRESS=mCONFIG_LZO_DECOMPRESS=mCONFIG_PLIST=yCONFIG_HAS_IOMEM=yCONFIG_HAS_IOPORT=yCONFIG_HAS_DMA=y