* JFFS2 & SMP @ 2004-10-27 12:35 Artem B. Bityuckiy 2004-10-27 12:59 ` David Woodhouse 0 siblings, 1 reply; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-10-27 12:35 UTC (permalink / raw) To: linux-mtd Hello. Do somebody work with JFFS2 on some SMP machine (or P4) ? -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-10-27 12:35 JFFS2 & SMP Artem B. Bityuckiy @ 2004-10-27 12:59 ` David Woodhouse 2004-10-27 13:19 ` Artem B. Bityuckiy 2004-10-27 13:35 ` Artem B. Bityuckiy 0 siblings, 2 replies; 19+ messages in thread From: David Woodhouse @ 2004-10-27 12:59 UTC (permalink / raw) To: Artem B. Bityuckiy; +Cc: linux-mtd On Wed, 2004-10-27 at 16:35 +0400, Artem B. Bityuckiy wrote: > Hello. > > Do somebody work with JFFS2 on some SMP machine (or P4) ? I've been known to. It should work fine. More people have used it with preempt. -- dwmw2 ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-10-27 12:59 ` David Woodhouse @ 2004-10-27 13:19 ` Artem B. Bityuckiy 2004-10-27 13:35 ` Artem B. Bityuckiy 1 sibling, 0 replies; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-10-27 13:19 UTC (permalink / raw) To: David Woodhouse; +Cc: linux-mtd I have problems with JFFS2 on P4 host. Kernel is 2.6.8.1 Preemption is enabled. SMP is enabled. :-( David Woodhouse wrote: > On Wed, 2004-10-27 at 16:35 +0400, Artem B. Bityuckiy wrote: > >>Hello. >> >>Do somebody work with JFFS2 on some SMP machine (or P4) ? > > > I've been known to. It should work fine. More people have used it with > preempt. > -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-10-27 12:59 ` David Woodhouse 2004-10-27 13:19 ` Artem B. Bityuckiy @ 2004-10-27 13:35 ` Artem B. Bityuckiy 2004-10-27 13:45 ` David Woodhouse 1 sibling, 1 reply; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-10-27 13:35 UTC (permalink / raw) To: David Woodhouse; +Cc: linux-mtd It is not very easy to reproduce the problem. If you are interesting, I'll try. David Woodhouse wrote: > On Wed, 2004-10-27 at 16:35 +0400, Artem B. Bityuckiy wrote: > >>Hello. >> >>Do somebody work with JFFS2 on some SMP machine (or P4) ? > > > I've been known to. It should work fine. More people have used it with > preempt. > -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-10-27 13:35 ` Artem B. Bityuckiy @ 2004-10-27 13:45 ` David Woodhouse 2004-10-27 14:09 ` Artem B. Bityuckiy ` (2 more replies) 0 siblings, 3 replies; 19+ messages in thread From: David Woodhouse @ 2004-10-27 13:45 UTC (permalink / raw) To: Artem B. Bityuckiy; +Cc: linux-mtd On Wed, 2004-10-27 at 17:35 +0400, Artem B. Bityuckiy wrote: > It is not very easy to reproduce the problem. If you are interesting, > I'll try. I'm very interesting. Please try :) -- dwmw2 ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-10-27 13:45 ` David Woodhouse @ 2004-10-27 14:09 ` Artem B. Bityuckiy 2004-10-27 14:59 ` Artem B. Bityuckiy 2004-10-28 12:33 ` Artem B. Bityuckiy 2 siblings, 0 replies; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-10-27 14:09 UTC (permalink / raw) To: David Woodhouse; +Cc: linux-mtd [-- Attachment #1: Type: text/plain, Size: 3062 bytes --] David Woodhouse wrote: > I'm very interesting. Please try :) Ok. My .config is attached. I didn't localize the problem, but may just show that it exists. I've attached a Perl script. This script just randomly creates/deletes different files/directories/nodes. To see the problem, run the script: ./parall_rw_dir_only.pl -p <flash-mount-point> -n1 -n is the number of threads which will create/delete directory. The problem appears even if -n = 1. Run the script and wait until your flash is full. When it is full, the script will print lots of messages like "cant create ...". Let the script work when flash is full several minutes. Then you may stop it (if you will be able). You may see the problem in this point - JFFS2 will "forever" print a string: gc.c: printk(KERN_WARNING "Raw node at 0x%08x wasn't in node lists for ino #%u\n", ref_offset(raw), f->inocache->ino); But this is not every time. If All is OK, try to unmount your file system and unload the jffs2 module. I see the following in that case: <4>VFS: Busy inodes after unmount. Self-destruct in 5 seconds. Have a nice day... <3>slab error in kmem_cache_destroy(): cache `jffs2_i': Can't free all objects <4> [<021088a7>] dump_stack+0x17/0x20 <4> [<021566d5>] kmem_cache_destroy+0xd5/0x130 <4> [<02143fa4>] sys_delete_module+0x124/0x170 <4> [<fffeb262>] 0xfffeb262 <6>JFFS2 version 2.2. (NAND) (C) 2001-2003 Red Hat, Inc. <4>kmem_cache_create: duplicate cache jffs2_i <4>------------[ cut here ]------------ <1>kernel BUG at mm/slab.c:1393! <1>invalid operand: 0000 [#1] <4>PREEMPT SMP DEBUG_PAGEALLOC <4>Modules linked in: jffs2 zlib_deflate mtdchar nandsim nand mtdpart nand_ids mtdcore nand_ecc nfsd exportfs md5 ipv6 autofs4 nfs lockd sunrpc sk98lin microcode uhci_hcd ehci_hcd button battery asus_acpi ac sr_mod sd_mod ext3 jbd dm_mod ata_piix libata scsi_mod <4>CPU: 0 <4>EIP: 0060:[<02155f7b>] Not tainted <4>EFLAGS: 00010202 (2.6.8-1.521smp-custom-preempt) <4>EIP is at kmem_cache_create+0x60b/0x820 <4>eax: 0000002b ebx: 105c2bf4 ecx: 024c4b98 edx: ffffffff <4>esi: 12ae85b4 edi: 12ae85b4 ebp: 08043f80 esp: 08043f44 <4>ds: 007b es: 007b ss: 0068 <4>Process modprobe (pid: 24553, threadinfo=08043000 task=0b156a40) <4>Stack: 02359400 12ae85ac 0ecfc738 00000000 00000001 ff000000 fffffffc 0ecfc680 <4> 00000004 00001000 12ae85ac 00000000 02395308 12aed700 08043000 08043f98 <4> 128481ac 80032c00 12ae19e0 00000000 02395308 08043fbc 02146003 0a3b0d64 <4>Call Trace: <4> [<0210887a>] show_stack+0x7a/0x90 <4> [<02108a05>] show_registers+0x155/0x200 <4> [<02108c44>] die+0x104/0x200 <4> [<0210907a>] do_invalid_op+0x9a/0xa0 <4> [<fffebf6e>] 0xfffebf6e <4> [<128481ac>] init_jffs2_fs+0x3c/0xe0 [jffs2] <4> [<02146003>] sys_init_module+0x153/0x2e0 <4> [<fffeb262>] 0xfffeb262 <4>Code: 0f 0b 71 05 98 8a 35 02 8b 0b e9 55 ff ff ff 8d b6 00 00 00 P.S. I don't use klogd. Sorry for such bad bug report. May be I'll see this closer and try to dig up the problem. -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. [-- Attachment #2: parall_rw_dir_only.pl --] [-- Type: text/plain, Size: 2313 bytes --] #!/usr/bin/perl -w use integer; use Getopt::Std; use strict; use threads; use IO::Seekable; sub run_dir_wr($); # SUPPORTED OPTIONS. my $path_opt = 'p'; my $num_opt = 'n'; # Number of processes my $task_opt = 't'; my %options; getopts ("${path_opt}:${num_opt}:${task_opt}:", \%options) or die "getopts() failed: $!."; die "Path wasn't specified (-$path_opt option)\n" unless $options{$path_opt}; my $num = $options{$num_opt} ? $options{$num_opt} : 1; if (!$options{$task_opt}) { for (my $i = 0; $i < $num; $i++) { my $thr; $thr = threads->new(\&run_dir_wr, "d" . ($i)); } <STDIN>; } elsif ($options{$task_opt} == '1') { run_file_wr('f0'); } elsif ($options{$task_opt} == '2') { run_dir_wr('d0'); } else { die "Wrong -$task_opt value\n"; } sub form_str($$) { my $ret; my $chr = $_[1]; my $tmp = 0; for (my $i = 0; $i < $_[0]; $i++) { $ret = $ret . chr int rand 256; $tmp ++; } return $ret; } sub run_dir_wr($) { print "Direntries write: $options{$path_opt}/$_[0]\n"; die "Can't create directory $options{$path_opt}/$_[0]/\n" unless mkdir "$options{$path_opt}/$_[0]/"; my $fcnt = 0; my $dcnt = 0; my $chcnt = 0; my $blkcnt = 0; my $fifocnt = 0; while (1) { my $rnd = rand 100; if ($rnd < 70) { my $rnd = rand 100; if ($rnd < 40) { open FF, ">$options{$path_opt}/$_[0]/f$fcnt"; close FF; $fcnt += 1; } elsif ($rnd < 80) { mkdir "$options{$path_opt}/$_[0]/d$dcnt"; $dcnt += 1; } elsif ($rnd < 87) { `mknod $options{$path_opt}/$_[0]/ch$chcnt c 0 0`; $chcnt += 1; } elsif ($rnd < 93) { `mknod $options{$path_opt}/$_[0]/blk$blkcnt b 0 0`; $blkcnt += 1; } else { `mknod $options{$path_opt}/$_[0]/fifo$fifocnt b 0 0`; $fifocnt += 1; } } else { my $rnd = rand 100; if ($rnd < 40) { my $n = int rand $fcnt + 1; `rm -rf $options{$path_opt}/$_[0]/f$fcnt`; } elsif ($rnd < 80) { my $n = int rand $dcnt + 1; `rm -rf $options{$path_opt}/$_[0]/d$dcnt`; } elsif ($rnd < 87) { my $n = int rand $chcnt + 1; `rm -rf $options{$path_opt}/$_[0]/ch$chcnt`; } elsif ($rnd < 93) { my $n = int rand $blkcnt + 1; `rm -rf $options{$path_opt}/$_[0]/blk$blkcnt`; } else { my $n = int rand $fifocnt + 1; `rm -rf $options{$path_opt}/$_[0]/fifo$fifocnt`; } } } } [-- Attachment #3: .config --] [-- Type: text/plain, Size: 49165 bytes --] # # Automatically generated make config: don't edit # CONFIG_X86=y CONFIG_MMU=y CONFIG_UID16=y CONFIG_GENERIC_ISA_DMA=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y # # General setup # CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y # CONFIG_BSD_PROCESS_ACCT_V3 is not set CONFIG_SYSCTL=y CONFIG_AUDIT=y CONFIG_AUDITSYSCALL=y CONFIG_LOG_BUF_SHIFT=18 CONFIG_HOTPLUG=y # CONFIG_IKCONFIG is not set # CONFIG_EMBEDDED is not set CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set # # Loadable module support # CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set CONFIG_OBSOLETE_MODPARM=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SIG is not set CONFIG_KMOD=y CONFIG_STOP_MACHINE=y # # Processor type and features # # CONFIG_X86_PC is not set # CONFIG_X86_ELAN is not set # CONFIG_X86_VOYAGER is not set # CONFIG_X86_NUMAQ is not set # CONFIG_X86_SUMMIT is not set # CONFIG_X86_BIGSMP is not set # CONFIG_X86_VISWS is not set CONFIG_X86_GENERICARCH=y # CONFIG_X86_ES7000 is not set CONFIG_X86_CYCLONE_TIMER=y # 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=y # CONFIG_MPENTIUMII is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUMM is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set # CONFIG_MK7 is not set # CONFIG_MK8 is not set # CONFIG_MCRUSOE is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP2 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set CONFIG_X86_GENERIC=y CONFIG_X86_CMPXCHG=y CONFIG_X86_XADD=y CONFIG_X86_L1_CACHE_SHIFT=7 CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_X86_PPRO_FENCE=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_X86_GOOD_APIC=y CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_4G=y CONFIG_X86_SWITCH_PAGETABLES=y CONFIG_X86_4G_VM_LAYOUT=y CONFIG_X86_UACCESS_INDIRECT=y CONFIG_X86_HIGH_ENTRY=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_SMP=y CONFIG_NR_CPUS=32 CONFIG_SCHED_SMT=y CONFIG_PREEMPT=y CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y CONFIG_X86_TSC=y CONFIG_X86_MCE=y # CONFIG_X86_MCE_NONFATAL is not set CONFIG_X86_MCE_P4THERMAL=y CONFIG_TOSHIBA=m CONFIG_I8K=m CONFIG_MICROCODE=m CONFIG_X86_MSR=m CONFIG_X86_CPUID=m # # Firmware Drivers # CONFIG_EDD=m # CONFIG_NOHIGHMEM is not set # CONFIG_HIGHMEM4G is not set CONFIG_HIGHMEM64G=y CONFIG_HIGHMEM=y CONFIG_X86_PAE=y # CONFIG_NUMA is not set CONFIG_HIGHPTE=y # CONFIG_MATH_EMULATION is not set CONFIG_MTRR=y # CONFIG_EFI is not set # CONFIG_IRQBALANCE is not set CONFIG_HAVE_DEC_LOCK=y CONFIG_REGPARM=y # # Power management options (ACPI, APM) # CONFIG_PM=y # CONFIG_SOFTWARE_SUSPEND is not set # CONFIG_PM_DISK is not set # # ACPI (Advanced Configuration and Power Interface) Support # CONFIG_ACPI=y CONFIG_ACPI_BOOT=y CONFIG_ACPI_INTERPRETER=y CONFIG_ACPI_SLEEP=y CONFIG_ACPI_SLEEP_PROC_FS=y CONFIG_ACPI_AC=m CONFIG_ACPI_BATTERY=m CONFIG_ACPI_BUTTON=m CONFIG_ACPI_FAN=y CONFIG_ACPI_PROCESSOR=y CONFIG_ACPI_THERMAL=y CONFIG_ACPI_ASUS=m CONFIG_ACPI_TOSHIBA=m # CONFIG_ACPI_DEBUG is not set CONFIG_ACPI_BUS=y CONFIG_ACPI_EC=y CONFIG_ACPI_POWER=y CONFIG_ACPI_PCI=y CONFIG_ACPI_SYSTEM=y CONFIG_X86_PM_TIMER=y # # APM (Advanced Power Management) BIOS Support # CONFIG_APM=y # CONFIG_APM_IGNORE_USER_SUSPEND is not set # CONFIG_APM_DO_ENABLE is not set CONFIG_APM_CPU_IDLE=y # CONFIG_APM_DISPLAY_BLANK is not set CONFIG_APM_RTC_IS_GMT=y # CONFIG_APM_ALLOW_INTS is not set # CONFIG_APM_REAL_MODE_POWER_OFF is not set # # CPU Frequency scaling # CONFIG_CPU_FREQ=y # CONFIG_CPU_FREQ_PROC_INTF is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=m CONFIG_CPU_FREQ_GOV_USERSPACE=y # CONFIG_CPU_FREQ_24_API is not set CONFIG_CPU_FREQ_TABLE=y # # CPUFreq processor drivers # CONFIG_X86_ACPI_CPUFREQ=m # CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set CONFIG_X86_POWERNOW_K6=m CONFIG_X86_POWERNOW_K7=y CONFIG_X86_POWERNOW_K8=m # CONFIG_X86_GX_SUSPMOD is not set CONFIG_X86_SPEEDSTEP_CENTRINO=y CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y CONFIG_X86_SPEEDSTEP_ICH=y CONFIG_X86_SPEEDSTEP_SMI=m CONFIG_X86_P4_CLOCKMOD=m CONFIG_X86_SPEEDSTEP_LIB=y # CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set CONFIG_X86_LONGRUN=y # CONFIG_X86_LONGHAUL is not set # # Bus options (PCI, PCMCIA, EISA, MCA, ISA) # CONFIG_PCI=y # CONFIG_PCI_GOBIOS is not set # CONFIG_PCI_GOMMCONFIG is not set # CONFIG_PCI_GODIRECT is not set CONFIG_PCI_GOANY=y CONFIG_PCI_BIOS=y CONFIG_PCI_DIRECT=y CONFIG_PCI_MMCONFIG=y CONFIG_PCI_MSI=y CONFIG_PCI_LEGACY_PROC=y # CONFIG_PCI_NAMES is not set CONFIG_ISA=y # CONFIG_EISA is not set # CONFIG_MCA is not set # CONFIG_SCx200 is not set # # PCMCIA/CardBus support # CONFIG_PCMCIA=m # CONFIG_PCMCIA_DEBUG is not set CONFIG_YENTA=m CONFIG_CARDBUS=y CONFIG_PD6729=m CONFIG_I82092=m CONFIG_I82365=m CONFIG_TCIC=m CONFIG_PCMCIA_PROBE=y # # PCI Hotplug Support # CONFIG_HOTPLUG_PCI=y # CONFIG_HOTPLUG_PCI_FAKE is not set CONFIG_HOTPLUG_PCI_COMPAQ=m # CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set CONFIG_HOTPLUG_PCI_IBM=m # CONFIG_HOTPLUG_PCI_ACPI is not set # CONFIG_HOTPLUG_PCI_CPCI is not set CONFIG_HOTPLUG_PCI_PCIE=m CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE=y CONFIG_HOTPLUG_PCI_SHPC=m CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE=y # # Executable file formats # CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_AOUT is not set CONFIG_BINFMT_MISC=y # # Device Drivers # # # Generic Driver Options # CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y # CONFIG_DEBUG_DRIVER is not set # # Memory Technology Devices (MTD) # CONFIG_MTD=m # CONFIG_MTD_DEBUG is not set CONFIG_MTD_PARTITIONS=y CONFIG_MTD_CONCAT=m CONFIG_MTD_REDBOOT_PARTS=m # CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set # CONFIG_MTD_REDBOOT_PARTS_READONLY is not set CONFIG_MTD_CMDLINE_PARTS=y # # User Modules And Translation Layers # CONFIG_MTD_CHAR=m CONFIG_MTD_BLOCK=m CONFIG_MTD_BLOCK_RO=m CONFIG_FTL=m CONFIG_NFTL=m CONFIG_NFTL_RW=y CONFIG_INFTL=m # # RAM/ROM/Flash chip drivers # CONFIG_MTD_CFI=m CONFIG_MTD_JEDECPROBE=m CONFIG_MTD_GEN_PROBE=m # CONFIG_MTD_CFI_ADV_OPTIONS is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_CFI_I4 is not set # CONFIG_MTD_CFI_I8 is not set CONFIG_MTD_CFI_INTELEXT=m CONFIG_MTD_CFI_AMDSTD=m CONFIG_MTD_CFI_AMDSTD_RETRY=3 CONFIG_MTD_CFI_STAA=m CONFIG_MTD_CFI_UTIL=m CONFIG_MTD_RAM=m CONFIG_MTD_ROM=m CONFIG_MTD_ABSENT=m # # Mapping drivers for chip access # CONFIG_MTD_COMPLEX_MAPPINGS=y # CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_PNC2000 is not set CONFIG_MTD_SC520CDP=m CONFIG_MTD_NETSC520=m CONFIG_MTD_SBC_GXX=m CONFIG_MTD_ELAN_104NC=m CONFIG_MTD_SCx200_DOCFLASH=m CONFIG_MTD_AMD76XROM=m # CONFIG_MTD_ICHXROM is not set CONFIG_MTD_SCB2_FLASH=m # CONFIG_MTD_NETtel is not set # CONFIG_MTD_DILNETPC is not set CONFIG_MTD_L440GX=m CONFIG_MTD_PCI=m # # Self-contained MTD device drivers # CONFIG_MTD_PMC551=m # CONFIG_MTD_PMC551_BUGFIX is not set # CONFIG_MTD_PMC551_DEBUG is not set # CONFIG_MTD_SLRAM is not set # CONFIG_MTD_PHRAM is not set CONFIG_MTD_MTDRAM=m CONFIG_MTDRAM_TOTAL_SIZE=4096 CONFIG_MTDRAM_ERASE_SIZE=128 # CONFIG_MTD_BLKMTD is not set # # Disk-On-Chip Device Drivers # CONFIG_MTD_DOC2000=m # CONFIG_MTD_DOC2001 is not set CONFIG_MTD_DOC2001PLUS=m CONFIG_MTD_DOCPROBE=m CONFIG_MTD_DOCECC=m # CONFIG_MTD_DOCPROBE_ADVANCED is not set CONFIG_MTD_DOCPROBE_ADDRESS=0 # # NAND Flash Device Drivers # CONFIG_MTD_NAND=m # CONFIG_MTD_NAND_VERIFY_WRITE is not set CONFIG_MTD_NAND_IDS=m # CONFIG_MTD_NAND_DISKONCHIP is not set # # Parallel port support # CONFIG_PARPORT=m CONFIG_PARPORT_PC=m CONFIG_PARPORT_PC_CML1=m CONFIG_PARPORT_SERIAL=m # CONFIG_PARPORT_PC_FIFO is not set # CONFIG_PARPORT_PC_SUPERIO is not set CONFIG_PARPORT_PC_PCMCIA=m # CONFIG_PARPORT_OTHER is not set CONFIG_PARPORT_1284=y # # Plug and Play support # CONFIG_PNP=y # CONFIG_PNP_DEBUG is not set # # Protocols # CONFIG_ISAPNP=y # CONFIG_PNPBIOS is not set # # Block devices # CONFIG_BLK_DEV_FD=m # CONFIG_BLK_DEV_XD is not set # CONFIG_PARIDE is not set CONFIG_BLK_CPQ_DA=m CONFIG_BLK_CPQ_CISS_DA=m CONFIG_CISS_SCSI_TAPE=y CONFIG_BLK_DEV_DAC960=m CONFIG_BLK_DEV_UMEM=m CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_CRYPTOLOOP=m CONFIG_BLK_DEV_NBD=m CONFIG_BLK_DEV_SX8=m CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=16384 CONFIG_BLK_DEV_INITRD=y CONFIG_LBD=y # # ATA/ATAPI/MFM/RLL support # CONFIG_IDE=y CONFIG_BLK_DEV_IDE=y # # Please see Documentation/ide.txt for help/info on IDE drives # # CONFIG_BLK_DEV_IDE_SATA is not set # CONFIG_BLK_DEV_HD_IDE is not set CONFIG_BLK_DEV_IDEDISK=y CONFIG_IDEDISK_MULTI_MODE=y CONFIG_BLK_DEV_IDECS=m CONFIG_BLK_DEV_IDECD=y CONFIG_BLK_DEV_IDETAPE=m CONFIG_BLK_DEV_IDEFLOPPY=y CONFIG_BLK_DEV_IDESCSI=m # CONFIG_IDE_TASK_IOCTL is not set # CONFIG_IDE_TASKFILE_IO is not set # # IDE chipset support/bugfixes # CONFIG_IDE_GENERIC=y # CONFIG_BLK_DEV_CMD640 is not set CONFIG_BLK_DEV_IDEPNP=y CONFIG_BLK_DEV_IDEPCI=y CONFIG_IDEPCI_SHARE_IRQ=y # CONFIG_BLK_DEV_OFFBOARD is not set CONFIG_BLK_DEV_GENERIC=y # CONFIG_BLK_DEV_OPTI621 is not set CONFIG_BLK_DEV_RZ1000=y CONFIG_BLK_DEV_IDEDMA_PCI=y # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set CONFIG_BLK_DEV_ADMA=y CONFIG_BLK_DEV_AEC62XX=y CONFIG_BLK_DEV_ALI15X3=y # CONFIG_WDC_ALI15X3 is not set CONFIG_BLK_DEV_AMD74XX=y CONFIG_BLK_DEV_ATIIXP=y CONFIG_BLK_DEV_CMD64X=y CONFIG_BLK_DEV_TRIFLEX=y CONFIG_BLK_DEV_CY82C693=y CONFIG_BLK_DEV_CS5520=y CONFIG_BLK_DEV_CS5530=y CONFIG_BLK_DEV_HPT34X=y # CONFIG_HPT34X_AUTODMA is not set CONFIG_BLK_DEV_HPT366=y # CONFIG_BLK_DEV_SC1200 is not set CONFIG_BLK_DEV_PIIX=y # CONFIG_BLK_DEV_NS87415 is not set CONFIG_BLK_DEV_PDC202XX_OLD=y # CONFIG_PDC202XX_BURST is not set CONFIG_BLK_DEV_PDC202XX_NEW=y CONFIG_PDC202XX_FORCE=y CONFIG_BLK_DEV_SVWKS=y CONFIG_BLK_DEV_SIIMAGE=y CONFIG_BLK_DEV_SIS5513=y CONFIG_BLK_DEV_SLC90E66=y # CONFIG_BLK_DEV_TRM290 is not set CONFIG_BLK_DEV_VIA82CXXX=y # CONFIG_IDE_ARM is not set # CONFIG_IDE_CHIPSETS is not set CONFIG_BLK_DEV_IDEDMA=y # CONFIG_IDEDMA_IVB is not set CONFIG_IDEDMA_AUTO=y # CONFIG_BLK_DEV_HD is not set # # SCSI device support # CONFIG_SCSI=m CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=m CONFIG_CHR_DEV_ST=m CONFIG_CHR_DEV_OSST=m CONFIG_BLK_DEV_SR=m CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m # # Some SCSI devices (e.g. CD jukebox) support multiple LUNs # # CONFIG_SCSI_MULTI_LUN is not set CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y # # SCSI Transport Attributes # CONFIG_SCSI_SPI_ATTRS=m CONFIG_SCSI_FC_ATTRS=m # # SCSI low-level drivers # CONFIG_BLK_DEV_3W_XXXX_RAID=m CONFIG_SCSI_3W_9XXX=m # CONFIG_SCSI_7000FASST is not set CONFIG_SCSI_ACARD=m CONFIG_SCSI_AHA152X=m CONFIG_SCSI_AHA1542=m CONFIG_SCSI_AACRAID=m CONFIG_SCSI_AIC7XXX=m CONFIG_AIC7XXX_CMDS_PER_DEVICE=4 CONFIG_AIC7XXX_RESET_DELAY_MS=15000 # CONFIG_AIC7XXX_BUILD_FIRMWARE is not set # CONFIG_AIC7XXX_DEBUG_ENABLE is not set CONFIG_AIC7XXX_DEBUG_MASK=0 # CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set CONFIG_SCSI_AIC7XXX_OLD=m CONFIG_SCSI_AIC79XX=m CONFIG_AIC79XX_CMDS_PER_DEVICE=4 CONFIG_AIC79XX_RESET_DELAY_MS=15000 # CONFIG_AIC79XX_BUILD_FIRMWARE is not set # CONFIG_AIC79XX_ENABLE_RD_STRM is not set # CONFIG_AIC79XX_DEBUG_ENABLE is not set CONFIG_AIC79XX_DEBUG_MASK=0 # CONFIG_AIC79XX_REG_PRETTY_PRINT is not set # CONFIG_SCSI_DPT_I2O is not set CONFIG_SCSI_IN2000=m CONFIG_SCSI_MEGARAID=m CONFIG_SCSI_SATA=y CONFIG_SCSI_SATA_SVW=m CONFIG_SCSI_ATA_PIIX=m CONFIG_SCSI_SATA_NV=m CONFIG_SCSI_SATA_PROMISE=m CONFIG_SCSI_SATA_SX4=m CONFIG_SCSI_SATA_SIL=m CONFIG_SCSI_SATA_SIS=m CONFIG_SCSI_SATA_VIA=m CONFIG_SCSI_SATA_VITESSE=m CONFIG_SCSI_BUSLOGIC=m # CONFIG_SCSI_OMIT_FLASHPOINT is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_DTC3280 is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_EATA_PIO is not set CONFIG_SCSI_FUTURE_DOMAIN=m CONFIG_SCSI_GDTH=m # CONFIG_SCSI_GENERIC_NCR5380 is not set # CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set CONFIG_SCSI_IPS=m CONFIG_SCSI_INIA100=m CONFIG_SCSI_PPA=m CONFIG_SCSI_IMM=m # CONFIG_SCSI_IZIP_EPP16 is not set # CONFIG_SCSI_IZIP_SLOW_CTR is not set # CONFIG_SCSI_NCR53C406A is not set CONFIG_SCSI_SYM53C8XX_2=m CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_PAS16 is not set # CONFIG_SCSI_PSI240I is not set CONFIG_SCSI_QLOGIC_FAS=m CONFIG_SCSI_QLOGIC_ISP=m # CONFIG_SCSI_QLOGIC_FC is not set CONFIG_SCSI_QLOGIC_1280=m CONFIG_SCSI_QLA2XXX=m CONFIG_SCSI_QLA21XX=m CONFIG_SCSI_QLA22XX=m CONFIG_SCSI_QLA2300=m CONFIG_SCSI_QLA2322=m CONFIG_SCSI_QLA6312=m CONFIG_SCSI_QLA6322=m # CONFIG_SCSI_SYM53C416 is not set # CONFIG_SCSI_DC395x is not set CONFIG_SCSI_DC390T=m # CONFIG_SCSI_T128 is not set # CONFIG_SCSI_U14_34F is not set # CONFIG_SCSI_ULTRASTOR is not set # CONFIG_SCSI_NSP32 is not set # CONFIG_SCSI_DEBUG is not set # # PCMCIA SCSI adapter support # CONFIG_PCMCIA_AHA152X=m CONFIG_PCMCIA_FDOMAIN=m CONFIG_PCMCIA_NINJA_SCSI=m CONFIG_PCMCIA_QLOGIC=m CONFIG_PCMCIA_SYM53C500=m # # Old CD-ROM drivers (not SCSI, not IDE) # # CONFIG_CD_NO_IDESCSI is not set # # Multi-device support (RAID and LVM) # CONFIG_MD=y CONFIG_BLK_DEV_MD=y CONFIG_MD_LINEAR=m CONFIG_MD_RAID0=m CONFIG_MD_RAID1=m CONFIG_MD_RAID5=m CONFIG_MD_RAID6=m CONFIG_MD_MULTIPATH=m CONFIG_BLK_DEV_DM=m CONFIG_DM_CRYPT=m CONFIG_DM_SNAPSHOT=m CONFIG_DM_MIRROR=m CONFIG_DM_ZERO=m # # Fusion MPT device support # CONFIG_FUSION=m CONFIG_FUSION_MAX_SGE=40 # CONFIG_FUSION_ISENSE is not set CONFIG_FUSION_CTL=m CONFIG_FUSION_LAN=m # # IEEE 1394 (FireWire) support # CONFIG_IEEE1394=m # # Subsystem Options # # CONFIG_IEEE1394_VERBOSEDEBUG is not set CONFIG_IEEE1394_OUI_DB=y # CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set # # Device Drivers # # CONFIG_IEEE1394_PCILYNX is not set CONFIG_IEEE1394_OHCI1394=m # # Protocol Drivers # CONFIG_IEEE1394_VIDEO1394=m CONFIG_IEEE1394_SBP2=m # CONFIG_IEEE1394_SBP2_PHYS_DMA is not set # CONFIG_IEEE1394_ETH1394 is not set CONFIG_IEEE1394_DV1394=m CONFIG_IEEE1394_RAWIO=m CONFIG_IEEE1394_CMP=m CONFIG_IEEE1394_AMDTP=m # # I2O device support # CONFIG_I2O=m CONFIG_I2O_CONFIG=m CONFIG_I2O_BLOCK=m CONFIG_I2O_SCSI=m CONFIG_I2O_PROC=m # # Networking support # CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_NETLINK_DEV=y CONFIG_UNIX=y CONFIG_NET_KEY=m CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_FWMARK=y CONFIG_IP_ROUTE_NAT=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_TOS=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=m CONFIG_NET_IPGRE=m CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y CONFIG_INET_AH=m CONFIG_INET_ESP=m CONFIG_INET_IPCOMP=m # # IP: Virtual Server Configuration # CONFIG_IP_VS=m # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_PROTO_ESP=y CONFIG_IP_VS_PROTO_AH=y # # IPVS scheduler # CONFIG_IP_VS_RR=m CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m CONFIG_IP_VS_WLC=m CONFIG_IP_VS_LBLC=m CONFIG_IP_VS_LBLCR=m CONFIG_IP_VS_DH=m CONFIG_IP_VS_SH=m CONFIG_IP_VS_SED=m CONFIG_IP_VS_NQ=m # # IPVS application helper # CONFIG_IP_VS_FTP=m CONFIG_IPV6=m CONFIG_IPV6_PRIVACY=y CONFIG_INET6_AH=m CONFIG_INET6_ESP=m CONFIG_INET6_IPCOMP=m CONFIG_IPV6_TUNNEL=m CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_BRIDGE_NETFILTER=y # # IP: Netfilter Configuration # CONFIG_IP_NF_CONNTRACK=m CONFIG_IP_NF_FTP=m CONFIG_IP_NF_IRC=m CONFIG_IP_NF_TFTP=m CONFIG_IP_NF_AMANDA=m CONFIG_IP_NF_QUEUE=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_LIMIT=m CONFIG_IP_NF_MATCH_IPRANGE=m CONFIG_IP_NF_MATCH_MAC=m CONFIG_IP_NF_MATCH_PKTTYPE=m CONFIG_IP_NF_MATCH_MARK=m CONFIG_IP_NF_MATCH_MULTIPORT=m CONFIG_IP_NF_MATCH_TOS=m CONFIG_IP_NF_MATCH_RECENT=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_DSCP=m CONFIG_IP_NF_MATCH_AH_ESP=m CONFIG_IP_NF_MATCH_LENGTH=m CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_MATCH_TCPMSS=m CONFIG_IP_NF_MATCH_HELPER=m CONFIG_IP_NF_MATCH_STATE=m CONFIG_IP_NF_MATCH_CONNTRACK=m CONFIG_IP_NF_MATCH_OWNER=m CONFIG_IP_NF_MATCH_PHYSDEV=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_SAME=m CONFIG_IP_NF_NAT_LOCAL=y CONFIG_IP_NF_NAT_SNMP_BASIC=m CONFIG_IP_NF_NAT_IRC=m CONFIG_IP_NF_NAT_FTP=m CONFIG_IP_NF_NAT_TFTP=m CONFIG_IP_NF_NAT_AMANDA=m CONFIG_IP_NF_MANGLE=m CONFIG_IP_NF_TARGET_TOS=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_DSCP=m CONFIG_IP_NF_TARGET_MARK=m CONFIG_IP_NF_TARGET_CLASSIFY=m CONFIG_IP_NF_TARGET_LOG=m CONFIG_IP_NF_TARGET_ULOG=m CONFIG_IP_NF_TARGET_TCPMSS=m CONFIG_IP_NF_ARPTABLES=m CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARP_MANGLE=m # CONFIG_IP_NF_COMPAT_IPCHAINS is not set # CONFIG_IP_NF_COMPAT_IPFWADM is not set CONFIG_IP_NF_TARGET_NOTRACK=m CONFIG_IP_NF_RAW=m CONFIG_IP_NF_MATCH_ADDRTYPE=m CONFIG_IP_NF_MATCH_REALM=m # # IPv6: Netfilter Configuration # # CONFIG_IP6_NF_QUEUE is not set CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_MATCH_LIMIT=m CONFIG_IP6_NF_MATCH_MAC=m CONFIG_IP6_NF_MATCH_RT=m CONFIG_IP6_NF_MATCH_OPTS=m CONFIG_IP6_NF_MATCH_FRAG=m CONFIG_IP6_NF_MATCH_HL=m CONFIG_IP6_NF_MATCH_MULTIPORT=m CONFIG_IP6_NF_MATCH_OWNER=m CONFIG_IP6_NF_MATCH_MARK=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_AHESP=m CONFIG_IP6_NF_MATCH_LENGTH=m CONFIG_IP6_NF_MATCH_EUI64=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_LOG=m CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_TARGET_MARK=m CONFIG_IP6_NF_RAW=m # # Bridge: Netfilter Configuration # CONFIG_BRIDGE_NF_EBTABLES=m CONFIG_BRIDGE_EBT_BROUTE=m CONFIG_BRIDGE_EBT_T_FILTER=m CONFIG_BRIDGE_EBT_T_NAT=m CONFIG_BRIDGE_EBT_802_3=m CONFIG_BRIDGE_EBT_AMONG=m CONFIG_BRIDGE_EBT_ARP=m CONFIG_BRIDGE_EBT_IP=m CONFIG_BRIDGE_EBT_LIMIT=m CONFIG_BRIDGE_EBT_MARK=m CONFIG_BRIDGE_EBT_PKTTYPE=m CONFIG_BRIDGE_EBT_STP=m CONFIG_BRIDGE_EBT_VLAN=m CONFIG_BRIDGE_EBT_ARPREPLY=m CONFIG_BRIDGE_EBT_DNAT=m CONFIG_BRIDGE_EBT_MARK_T=m CONFIG_BRIDGE_EBT_REDIRECT=m CONFIG_BRIDGE_EBT_SNAT=m CONFIG_BRIDGE_EBT_LOG=m CONFIG_XFRM=y CONFIG_XFRM_USER=y # # SCTP Configuration (EXPERIMENTAL) # CONFIG_IP_SCTP=m # CONFIG_SCTP_DBG_MSG is not set # CONFIG_SCTP_DBG_OBJCNT is not set # CONFIG_SCTP_HMAC_NONE is not set # CONFIG_SCTP_HMAC_SHA1 is not set CONFIG_SCTP_HMAC_MD5=y CONFIG_ATM=m CONFIG_ATM_CLIP=m # CONFIG_ATM_CLIP_NO_ICMP is not set CONFIG_ATM_LANE=m # CONFIG_ATM_MPOA is not set CONFIG_ATM_BR2684=m # CONFIG_ATM_BR2684_IPFILTER is not set CONFIG_BRIDGE=m CONFIG_VLAN_8021Q=m # CONFIG_DECNET is not set CONFIG_LLC=m # CONFIG_LLC2 is not set CONFIG_IPX=m # CONFIG_IPX_INTERN is not set CONFIG_ATALK=m CONFIG_DEV_APPLETALK=y CONFIG_LTPC=m CONFIG_COPS=m CONFIG_COPS_DAYNA=y CONFIG_COPS_TANGENT=y CONFIG_IPDDP=m CONFIG_IPDDP_ENCAP=y CONFIG_IPDDP_DECAP=y # CONFIG_X25 is not set # CONFIG_LAPB is not set CONFIG_NET_DIVERT=y # CONFIG_ECONET is not set CONFIG_WAN_ROUTER=m # CONFIG_NET_HW_FLOWCONTROL is not set # # QoS and/or fair queueing # CONFIG_NET_SCHED=y CONFIG_NET_SCH_CLK_JIFFIES=y # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set # CONFIG_NET_SCH_CLK_CPU is not set CONFIG_NET_SCH_CBQ=m CONFIG_NET_SCH_HTB=m CONFIG_NET_SCH_HFSC=m CONFIG_NET_SCH_ATM=m CONFIG_NET_SCH_PRIO=m CONFIG_NET_SCH_RED=m CONFIG_NET_SCH_SFQ=m CONFIG_NET_SCH_TEQL=m CONFIG_NET_SCH_TBF=m CONFIG_NET_SCH_GRED=m CONFIG_NET_SCH_DSMARK=m CONFIG_NET_SCH_NETEM=m CONFIG_NET_SCH_INGRESS=m CONFIG_NET_QOS=y CONFIG_NET_ESTIMATOR=y CONFIG_NET_CLS=y CONFIG_NET_CLS_TCINDEX=m CONFIG_NET_CLS_ROUTE4=m CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=m CONFIG_NET_CLS_U32=m CONFIG_CLS_U32_PERF=y CONFIG_NET_CLS_IND=y CONFIG_NET_CLS_RSVP=m CONFIG_NET_CLS_RSVP6=m # CONFIG_NET_CLS_ACT is not set CONFIG_NET_CLS_POLICE=y # # Network testing # # CONFIG_NET_PKTGEN is not set CONFIG_NETPOLL=y # CONFIG_NETPOLL_RX is not set CONFIG_NETPOLL_TRAP=y CONFIG_NET_POLL_CONTROLLER=y # CONFIG_HAMRADIO is not set CONFIG_IRDA=m # # IrDA protocols # CONFIG_IRLAN=m CONFIG_IRNET=m CONFIG_IRCOMM=m # CONFIG_IRDA_ULTRA is not set # # IrDA options # CONFIG_IRDA_CACHE_LAST_LSAP=y CONFIG_IRDA_FAST_RR=y # CONFIG_IRDA_DEBUG is not set # # Infrared-port device drivers # # # SIR device drivers # CONFIG_IRTTY_SIR=m # # Dongle support # CONFIG_DONGLE=y CONFIG_ESI_DONGLE=m CONFIG_ACTISYS_DONGLE=m CONFIG_TEKRAM_DONGLE=m CONFIG_LITELINK_DONGLE=m CONFIG_MA600_DONGLE=m CONFIG_GIRBIL_DONGLE=m CONFIG_MCP2120_DONGLE=m CONFIG_OLD_BELKIN_DONGLE=m CONFIG_ACT200L_DONGLE=m # # Old SIR device drivers # # # Old Serial dongle support # # # FIR device drivers # CONFIG_USB_IRDA=m CONFIG_SIGMATEL_FIR=m CONFIG_NSC_FIR=m # CONFIG_WINBOND_FIR is not set # CONFIG_TOSHIBA_FIR is not set # CONFIG_SMC_IRCC_FIR is not set # CONFIG_ALI_FIR is not set # CONFIG_VLSI_FIR is not set # CONFIG_VIA_FIR is not set CONFIG_BT=m CONFIG_BT_L2CAP=m CONFIG_BT_SCO=m CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y CONFIG_BT_BNEP=m CONFIG_BT_BNEP_MC_FILTER=y CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_CMTP=m CONFIG_BT_HIDP=m # # Bluetooth device drivers # CONFIG_BT_HCIUSB=m CONFIG_BT_HCIUSB_SCO=y CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_H4=y CONFIG_BT_HCIUART_BCSP=y CONFIG_BT_HCIUART_BCSP_TXCRC=y CONFIG_BT_HCIBCM203X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIDTL1=m CONFIG_BT_HCIBT3C=m CONFIG_BT_HCIBLUECARD=m CONFIG_BT_HCIBTUART=m CONFIG_BT_HCIVHCI=m # CONFIG_TUX is not set CONFIG_NETDEVICES=y CONFIG_DUMMY=m CONFIG_BONDING=m CONFIG_EQUALIZER=m CONFIG_TUN=m CONFIG_ETHERTAP=m CONFIG_NET_SB1000=m # # ARCnet devices # # CONFIG_ARCNET is not set # # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y CONFIG_MII=m CONFIG_HAPPYMEAL=m CONFIG_SUNGEM=m CONFIG_NET_VENDOR_3COM=y CONFIG_EL1=m CONFIG_EL2=m CONFIG_ELPLUS=m CONFIG_EL16=m CONFIG_EL3=m CONFIG_3C515=m CONFIG_VORTEX=m CONFIG_TYPHOON=m CONFIG_LANCE=m CONFIG_NET_VENDOR_SMC=y CONFIG_WD80x3=m CONFIG_ULTRA=m CONFIG_SMC9194=m CONFIG_NET_VENDOR_RACAL=y CONFIG_NI52=m CONFIG_NI65=m # # Tulip family network device support # CONFIG_NET_TULIP=y CONFIG_DE2104X=m CONFIG_TULIP=m # CONFIG_TULIP_MWI is not set CONFIG_TULIP_MMIO=y # CONFIG_TULIP_NAPI is not set CONFIG_DE4X5=m CONFIG_WINBOND_840=m CONFIG_DM9102=m CONFIG_PCMCIA_XIRCOM=m # CONFIG_AT1700 is not set CONFIG_DEPCA=m CONFIG_HP100=m # CONFIG_NET_ISA is not set CONFIG_NE2000=m CONFIG_NET_PCI=y CONFIG_PCNET32=m CONFIG_AMD8111_ETH=m CONFIG_AMD8111E_NAPI=y CONFIG_ADAPTEC_STARFIRE=m CONFIG_ADAPTEC_STARFIRE_NAPI=y CONFIG_AC3200=m CONFIG_APRICOT=m CONFIG_B44=m CONFIG_FORCEDETH=m CONFIG_CS89x0=m CONFIG_DGRS=m CONFIG_EEPRO100=m # CONFIG_EEPRO100_PIO is not set CONFIG_E100=m CONFIG_E100_NAPI=y CONFIG_FEALNX=m CONFIG_NATSEMI=m CONFIG_NE2K_PCI=m CONFIG_8139CP=m CONFIG_8139TOO=m CONFIG_8139TOO_PIO=y # CONFIG_8139TOO_TUNE_TWISTER is not set CONFIG_8139TOO_8129=y # CONFIG_8139_OLD_RX_RESET is not set CONFIG_SIS900=m CONFIG_EPIC100=m CONFIG_SUNDANCE=m # CONFIG_SUNDANCE_MMIO is not set CONFIG_TLAN=m CONFIG_VIA_RHINE=m CONFIG_VIA_RHINE_MMIO=y CONFIG_VIA_VELOCITY=m CONFIG_NET_POCKET=y CONFIG_ATP=m CONFIG_DE600=m CONFIG_DE620=m # # Ethernet (1000 Mbit) # CONFIG_ACENIC=m # CONFIG_ACENIC_OMIT_TIGON_I is not set CONFIG_DL2K=m CONFIG_E1000=m CONFIG_E1000_NAPI=y CONFIG_NS83820=m CONFIG_HAMACHI=m CONFIG_YELLOWFIN=m CONFIG_R8169=m CONFIG_SK98LIN=m CONFIG_TIGON3=m # # Ethernet (10000 Mbit) # CONFIG_IXGB=m CONFIG_IXGB_NAPI=y CONFIG_S2IO=m CONFIG_S2IO_NAPI=y # # Token Ring devices # # CONFIG_TR is not set # # Wireless LAN (non-hamradio) # CONFIG_NET_RADIO=y # # Obsolete Wireless cards support (pre-802.11) # # CONFIG_STRIP is not set # CONFIG_ARLAN is not set CONFIG_WAVELAN=m CONFIG_PCMCIA_WAVELAN=m CONFIG_PCMCIA_NETWAVE=m # # Wireless 802.11 Frequency Hopping cards support # # CONFIG_PCMCIA_RAYCS is not set # # Wireless 802.11b ISA/PCI cards support # CONFIG_AIRO=m CONFIG_HERMES=m CONFIG_PLX_HERMES=m CONFIG_TMD_HERMES=m CONFIG_PCI_HERMES=m CONFIG_ATMEL=m CONFIG_PCI_ATMEL=m # # Wireless 802.11b Pcmcia/Cardbus cards support # CONFIG_PCMCIA_HERMES=m CONFIG_AIRO_CS=m CONFIG_PCMCIA_ATMEL=m CONFIG_PCMCIA_WL3501=m # # Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support # CONFIG_PRISM54=m CONFIG_NET_WIRELESS=y # # PCMCIA network device support # CONFIG_NET_PCMCIA=y CONFIG_PCMCIA_3C589=m CONFIG_PCMCIA_3C574=m CONFIG_PCMCIA_FMVJ18X=m CONFIG_PCMCIA_PCNET=m CONFIG_PCMCIA_NMCLAN=m CONFIG_PCMCIA_SMC91C92=m CONFIG_PCMCIA_XIRC2PS=m CONFIG_PCMCIA_AXNET=m # # Wan interfaces # # CONFIG_WAN is not set # # ATM drivers # CONFIG_ATM_TCP=m CONFIG_ATM_LANAI=m CONFIG_ATM_ENI=m # CONFIG_ATM_ENI_DEBUG is not set # CONFIG_ATM_ENI_TUNE_BURST is not set CONFIG_ATM_FIRESTREAM=m # CONFIG_ATM_ZATM is not set CONFIG_ATM_NICSTAR=m # CONFIG_ATM_NICSTAR_USE_SUNI is not set # CONFIG_ATM_NICSTAR_USE_IDT77105 is not set CONFIG_ATM_IDT77252=m # CONFIG_ATM_IDT77252_DEBUG is not set # CONFIG_ATM_IDT77252_RCV_ALL is not set CONFIG_ATM_IDT77252_USE_SUNI=y CONFIG_ATM_AMBASSADOR=m # CONFIG_ATM_AMBASSADOR_DEBUG is not set CONFIG_ATM_HORIZON=m # CONFIG_ATM_HORIZON_DEBUG is not set # CONFIG_ATM_IA is not set CONFIG_ATM_FORE200E_MAYBE=m # CONFIG_ATM_FORE200E_PCA is not set CONFIG_ATM_HE=m # CONFIG_ATM_HE_USE_SUNI is not set CONFIG_FDDI=y # CONFIG_DEFXX is not set CONFIG_SKFP=m # CONFIG_HIPPI is not set CONFIG_PLIP=m CONFIG_PPP=m CONFIG_PPP_MULTILINK=y CONFIG_PPP_FILTER=y CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m CONFIG_PPP_DEFLATE=m # CONFIG_PPP_BSDCOMP is not set CONFIG_PPPOE=m CONFIG_PPPOATM=m # CONFIG_SLIP is not set CONFIG_NET_FC=y # CONFIG_SHAPER is not set CONFIG_NETCONSOLE=m CONFIG_NETDUMP=m # # ISDN subsystem # CONFIG_ISDN=m # # Old ISDN4Linux # CONFIG_ISDN_I4L=m CONFIG_ISDN_PPP=y CONFIG_ISDN_PPP_VJ=y CONFIG_ISDN_MPP=y CONFIG_IPPP_FILTER=y # CONFIG_ISDN_PPP_BSDCOMP is not set CONFIG_ISDN_AUDIO=y CONFIG_ISDN_TTY_FAX=y # # ISDN feature submodules # # # ISDN4Linux hardware drivers # # # Passive cards # CONFIG_ISDN_DRV_HISAX=m # # D-channel protocol features # CONFIG_HISAX_EURO=y CONFIG_DE_AOC=y CONFIG_HISAX_NO_SENDCOMPLETE=y CONFIG_HISAX_NO_LLC=y CONFIG_HISAX_NO_KEYPAD=y CONFIG_HISAX_1TR6=y CONFIG_HISAX_NI1=y CONFIG_HISAX_MAX_CARDS=8 # # HiSax supported cards # CONFIG_HISAX_16_0=y CONFIG_HISAX_16_3=y CONFIG_HISAX_TELESPCI=y CONFIG_HISAX_S0BOX=y CONFIG_HISAX_AVM_A1=y CONFIG_HISAX_FRITZPCI=y CONFIG_HISAX_AVM_A1_PCMCIA=y CONFIG_HISAX_ELSA=y CONFIG_HISAX_IX1MICROR2=y CONFIG_HISAX_DIEHLDIVA=y CONFIG_HISAX_ASUSCOM=y CONFIG_HISAX_TELEINT=y CONFIG_HISAX_HFCS=y CONFIG_HISAX_SEDLBAUER=y CONFIG_HISAX_SPORTSTER=y CONFIG_HISAX_MIC=y CONFIG_HISAX_NETJET=y CONFIG_HISAX_NETJET_U=y CONFIG_HISAX_NICCY=y CONFIG_HISAX_ISURF=y CONFIG_HISAX_HSTSAPHIR=y CONFIG_HISAX_BKM_A4T=y CONFIG_HISAX_SCT_QUADRO=y CONFIG_HISAX_GAZEL=y CONFIG_HISAX_HFC_PCI=y CONFIG_HISAX_W6692=y CONFIG_HISAX_HFC_SX=y CONFIG_HISAX_ENTERNOW_PCI=y # CONFIG_HISAX_DEBUG is not set # # HiSax PCMCIA card service modules # CONFIG_HISAX_SEDLBAUER_CS=m CONFIG_HISAX_ELSA_CS=m CONFIG_HISAX_AVM_A1_CS=m CONFIG_HISAX_TELES_CS=m # # HiSax sub driver modules # CONFIG_HISAX_ST5481=m CONFIG_HISAX_HFCUSB=m CONFIG_HISAX_FRITZ_PCIPNP=m CONFIG_HISAX_HDLC=y # # Active cards # CONFIG_ISDN_DRV_ICN=m CONFIG_ISDN_DRV_PCBIT=m CONFIG_ISDN_DRV_SC=m CONFIG_ISDN_DRV_ACT2000=m CONFIG_ISDN_DRV_TPAM=m # # CAPI subsystem # CONFIG_ISDN_CAPI=m CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y CONFIG_ISDN_CAPI_MIDDLEWARE=y CONFIG_ISDN_CAPI_CAPI20=m CONFIG_ISDN_CAPI_CAPIFS_BOOL=y CONFIG_ISDN_CAPI_CAPIFS=m CONFIG_ISDN_CAPI_CAPIDRV=m # # CAPI hardware drivers # # # Active AVM cards # CONFIG_CAPI_AVM=y # # Active Eicon DIVA Server cards # CONFIG_CAPI_EICON=y CONFIG_ISDN_DIVAS=m CONFIG_ISDN_DIVAS_BRIPCI=y CONFIG_ISDN_DIVAS_PRIPCI=y CONFIG_ISDN_DIVAS_DIVACAPI=m CONFIG_ISDN_DIVAS_USERIDI=m CONFIG_ISDN_DIVAS_MAINT=m # # Telephony Support # # CONFIG_PHONE is not set # # Input device support # CONFIG_INPUT=y # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=m # CONFIG_INPUT_TSDEV is not set CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input I/O drivers # CONFIG_GAMEPORT=m CONFIG_SOUND_GAMEPORT=m CONFIG_GAMEPORT_NS558=m CONFIG_GAMEPORT_L4=m CONFIG_GAMEPORT_EMU10K1=m CONFIG_GAMEPORT_VORTEX=m CONFIG_GAMEPORT_FM801=m CONFIG_GAMEPORT_CS461x=m CONFIG_SERIO=y CONFIG_SERIO_I8042=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_CT82C710 is not set # CONFIG_SERIO_PARKBD is not set # CONFIG_SERIO_PCIPS2 is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y CONFIG_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_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y CONFIG_MOUSE_SERIAL=m CONFIG_MOUSE_INPORT=m CONFIG_MOUSE_ATIXL=y CONFIG_MOUSE_LOGIBM=m CONFIG_MOUSE_PC110PAD=m CONFIG_MOUSE_VSXXXAA=m CONFIG_INPUT_JOYSTICK=y CONFIG_JOYSTICK_ANALOG=m CONFIG_JOYSTICK_A3D=m CONFIG_JOYSTICK_ADI=m CONFIG_JOYSTICK_COBRA=m CONFIG_JOYSTICK_GF2K=m CONFIG_JOYSTICK_GRIP=m CONFIG_JOYSTICK_GRIP_MP=m CONFIG_JOYSTICK_GUILLEMOT=m CONFIG_JOYSTICK_INTERACT=m CONFIG_JOYSTICK_SIDEWINDER=m CONFIG_JOYSTICK_TMDC=m CONFIG_JOYSTICK_IFORCE=m CONFIG_JOYSTICK_IFORCE_USB=y CONFIG_JOYSTICK_IFORCE_232=y CONFIG_JOYSTICK_WARRIOR=m CONFIG_JOYSTICK_MAGELLAN=m CONFIG_JOYSTICK_SPACEORB=m CONFIG_JOYSTICK_SPACEBALL=m CONFIG_JOYSTICK_STINGER=m CONFIG_JOYSTICK_TWIDDLER=m CONFIG_JOYSTICK_DB9=m CONFIG_JOYSTICK_GAMECON=m CONFIG_JOYSTICK_TURBOGRAFX=m # CONFIG_INPUT_JOYDUMP is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_GUNZE=m CONFIG_INPUT_MISC=y CONFIG_INPUT_PCSPKR=m # CONFIG_INPUT_UINPUT is not set # # Character devices # CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_HW_CONSOLE=y CONFIG_SERIAL_NONSTANDARD=y CONFIG_ROCKETPORT=m # CONFIG_CYCLADES is not set CONFIG_SYNCLINK=m CONFIG_SYNCLINKMP=m CONFIG_N_HDLC=m CONFIG_STALDRV=y # # Serial drivers # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CS=m # CONFIG_SERIAL_8250_ACPI is not set CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_MANY_PORTS is not set CONFIG_SERIAL_8250_SHARE_IRQ=y CONFIG_SERIAL_8250_DETECT_IRQ=y CONFIG_SERIAL_8250_MULTIPORT=y CONFIG_SERIAL_8250_RSA=y # # Non-8250 serial port support # CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_CRASH=m CONFIG_PRINTER=m CONFIG_LP_CONSOLE=y CONFIG_PPDEV=m CONFIG_TIPAR=m # CONFIG_QIC02_TAPE is not set # # IPMI # CONFIG_IPMI_HANDLER=m # CONFIG_IPMI_PANIC_EVENT is not set CONFIG_IPMI_DEVICE_INTERFACE=m CONFIG_IPMI_SI=m CONFIG_IPMI_WATCHDOG=m # # Watchdog Cards # CONFIG_WATCHDOG=y # CONFIG_WATCHDOG_NOWAYOUT is not set # # Watchdog Device Drivers # CONFIG_SOFT_WATCHDOG=m CONFIG_ACQUIRE_WDT=m CONFIG_ADVANTECH_WDT=m CONFIG_ALIM1535_WDT=m CONFIG_ALIM7101_WDT=m CONFIG_SC520_WDT=m CONFIG_EUROTECH_WDT=m CONFIG_IB700_WDT=m CONFIG_WAFER_WDT=m CONFIG_I8XX_TCO=m CONFIG_SC1200_WDT=m # CONFIG_SCx200_WDT is not set # CONFIG_60XX_WDT is not set CONFIG_CPU5_WDT=m CONFIG_W83627HF_WDT=m CONFIG_W83877F_WDT=m CONFIG_MACHZ_WDT=m # # ISA-based Watchdog Cards # CONFIG_PCWATCHDOG=m # CONFIG_MIXCOMWD is not set CONFIG_WDT=m # CONFIG_WDT_501 is not set # # PCI-based Watchdog Cards # CONFIG_PCIPCWATCHDOG=m CONFIG_WDTPCI=m CONFIG_WDT_501_PCI=y # # USB-based Watchdog Cards # CONFIG_USBPCWATCHDOG=m CONFIG_HW_RANDOM=m CONFIG_NVRAM=m CONFIG_RTC=y CONFIG_DTLK=m CONFIG_R3964=m # CONFIG_APPLICOM is not set CONFIG_SONYPI=m # # Ftape, the floppy tape device driver # CONFIG_AGP=y CONFIG_AGP_ALI=y CONFIG_AGP_ATI=y CONFIG_AGP_AMD=y CONFIG_AGP_AMD64=y CONFIG_AGP_INTEL=y CONFIG_AGP_INTEL_MCH=y CONFIG_AGP_NVIDIA=y CONFIG_AGP_SIS=y CONFIG_AGP_SWORKS=y CONFIG_AGP_VIA=y CONFIG_AGP_EFFICEON=y CONFIG_DRM=y CONFIG_DRM_TDFX=m CONFIG_DRM_GAMMA=m CONFIG_DRM_R128=m CONFIG_DRM_RADEON=m CONFIG_DRM_I810=m CONFIG_DRM_I830=m CONFIG_DRM_MGA=m CONFIG_DRM_SIS=m # # PCMCIA character devices # CONFIG_SYNCLINK_CS=m CONFIG_MWAVE=m # CONFIG_RAW_DRIVER is not set # CONFIG_HPET is not set CONFIG_HANGCHECK_TIMER=m # # I2C support # CONFIG_I2C=m CONFIG_I2C_CHARDEV=m # # I2C Algorithms # CONFIG_I2C_ALGOBIT=m CONFIG_I2C_ALGOPCF=m # # I2C Hardware Bus support # CONFIG_I2C_ALI1535=m CONFIG_I2C_ALI1563=m CONFIG_I2C_ALI15X3=m CONFIG_I2C_AMD756=m CONFIG_I2C_AMD8111=m CONFIG_I2C_I801=m CONFIG_I2C_I810=m CONFIG_I2C_ISA=m CONFIG_I2C_NFORCE2=m # CONFIG_I2C_PARPORT is not set # CONFIG_I2C_PARPORT_LIGHT is not set CONFIG_I2C_PIIX4=m CONFIG_I2C_PROSAVAGE=m CONFIG_I2C_SAVAGE4=m # CONFIG_SCx200_ACB is not set CONFIG_I2C_SIS5595=m CONFIG_I2C_SIS630=m CONFIG_I2C_SIS96X=m CONFIG_I2C_VIA=m CONFIG_I2C_VIAPRO=m CONFIG_I2C_VOODOO3=m # # Hardware Sensors Chip support # CONFIG_I2C_SENSOR=m CONFIG_SENSORS_ADM1021=m CONFIG_SENSORS_ADM1025=m CONFIG_SENSORS_ADM1031=m CONFIG_SENSORS_ASB100=m CONFIG_SENSORS_DS1621=m CONFIG_SENSORS_FSCHER=m CONFIG_SENSORS_GL518SM=m CONFIG_SENSORS_IT87=m CONFIG_SENSORS_LM75=m CONFIG_SENSORS_LM77=m CONFIG_SENSORS_LM78=m CONFIG_SENSORS_LM80=m CONFIG_SENSORS_LM83=m CONFIG_SENSORS_LM85=m CONFIG_SENSORS_LM90=m CONFIG_SENSORS_MAX1619=m CONFIG_SENSORS_VIA686A=m CONFIG_SENSORS_W83781D=m CONFIG_SENSORS_W83L785TS=m CONFIG_SENSORS_W83627HF=m # # Other I2C Chip support # CONFIG_SENSORS_EEPROM=m CONFIG_SENSORS_PCF8574=m CONFIG_SENSORS_PCF8591=m CONFIG_SENSORS_RTC8564=m # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # CONFIG_I2C_DEBUG_CHIP is not set # # Dallas's 1-wire bus # # CONFIG_W1 is not set # # Misc devices # CONFIG_IBM_ASM=m # # Multimedia devices # CONFIG_VIDEO_DEV=m # # Video For Linux # # # Video Adapters # CONFIG_VIDEO_BT848=m CONFIG_VIDEO_PMS=m CONFIG_VIDEO_BWQCAM=m CONFIG_VIDEO_CQCAM=m CONFIG_VIDEO_W9966=m CONFIG_VIDEO_CPIA=m CONFIG_VIDEO_CPIA_PP=m CONFIG_VIDEO_CPIA_USB=m CONFIG_VIDEO_SAA5246A=m CONFIG_VIDEO_SAA5249=m CONFIG_TUNER_3036=m CONFIG_VIDEO_STRADIS=m CONFIG_VIDEO_ZORAN=m CONFIG_VIDEO_ZORAN_BUZ=m CONFIG_VIDEO_ZORAN_DC10=m CONFIG_VIDEO_ZORAN_DC30=m CONFIG_VIDEO_ZORAN_LML33=m CONFIG_VIDEO_ZORAN_LML33R10=m CONFIG_VIDEO_SAA7134=m CONFIG_VIDEO_MXB=m CONFIG_VIDEO_DPC=m CONFIG_VIDEO_HEXIUM_ORION=m CONFIG_VIDEO_HEXIUM_GEMINI=m CONFIG_VIDEO_CX88=m CONFIG_VIDEO_OVCAMCHIP=m # # Radio Adapters # CONFIG_RADIO_CADET=m CONFIG_RADIO_RTRACK=m CONFIG_RADIO_RTRACK2=m CONFIG_RADIO_AZTECH=m CONFIG_RADIO_GEMTEK=m CONFIG_RADIO_GEMTEK_PCI=m CONFIG_RADIO_MAXIRADIO=m CONFIG_RADIO_MAESTRO=m CONFIG_RADIO_SF16FMI=m CONFIG_RADIO_SF16FMR2=m CONFIG_RADIO_TERRATEC=m CONFIG_RADIO_TRUST=m CONFIG_RADIO_TYPHOON=m CONFIG_RADIO_TYPHOON_PROC_FS=y CONFIG_RADIO_ZOLTRIX=m # # Digital Video Broadcasting Devices # CONFIG_DVB=y CONFIG_DVB_CORE=m # # Supported Frontend Modules # CONFIG_DVB_TWINHAN_DST=m CONFIG_DVB_STV0299=m # CONFIG_DVB_SP887X is not set # CONFIG_DVB_ALPS_TDLB7 is not set CONFIG_DVB_ALPS_TDMB7=m CONFIG_DVB_ATMEL_AT76C651=m CONFIG_DVB_CX24110=m CONFIG_DVB_GRUNDIG_29504_491=m CONFIG_DVB_GRUNDIG_29504_401=m CONFIG_DVB_MT312=m CONFIG_DVB_VES1820=m CONFIG_DVB_VES1X93=m # CONFIG_DVB_TDA1004X is not set CONFIG_DVB_NXT6000=m # # Supported SAA7146 based PCI Adapters # CONFIG_DVB_AV7110=m CONFIG_DVB_AV7110_OSD=y CONFIG_DVB_BUDGET=m CONFIG_DVB_BUDGET_CI=m CONFIG_DVB_BUDGET_AV=m CONFIG_DVB_BUDGET_PATCH=m # # Supported USB Adapters # CONFIG_DVB_TTUSB_BUDGET=m CONFIG_DVB_TTUSB_DEC=m # # Supported FlexCopII (B2C2) Adapters # CONFIG_DVB_B2C2_SKYSTAR=m # # Supported BT878 Adapters # CONFIG_DVB_BT8XX=m CONFIG_VIDEO_SAA7146=m CONFIG_VIDEO_SAA7146_VV=m CONFIG_VIDEO_VIDEOBUF=m CONFIG_VIDEO_TUNER=m CONFIG_VIDEO_BUF=m CONFIG_VIDEO_BTCX=m CONFIG_VIDEO_IR=m # # Graphics support # CONFIG_FB=y CONFIG_FB_CIRRUS=m # CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set CONFIG_FB_VGA16=m CONFIG_FB_VESA=y CONFIG_VIDEO_SELECT=y CONFIG_FB_HGA=m CONFIG_FB_HGA_ACCEL=y CONFIG_FB_RIVA=m # CONFIG_FB_RIVA_I2C is not set # CONFIG_FB_RIVA_DEBUG is not set CONFIG_FB_I810=m CONFIG_FB_I810_GTF=y CONFIG_FB_MATROX=m CONFIG_FB_MATROX_MILLENIUM=y CONFIG_FB_MATROX_MYSTIQUE=y CONFIG_FB_MATROX_G450=y CONFIG_FB_MATROX_G100=y CONFIG_FB_MATROX_I2C=m CONFIG_FB_MATROX_MAVEN=m CONFIG_FB_MATROX_MULTIHEAD=y # CONFIG_FB_RADEON_OLD is not set CONFIG_FB_RADEON=m CONFIG_FB_RADEON_I2C=y # CONFIG_FB_RADEON_DEBUG is not set CONFIG_FB_ATY128=m CONFIG_FB_ATY=m CONFIG_FB_ATY_CT=y CONFIG_FB_ATY_GX=y # CONFIG_FB_ATY_XL_INIT is not set # CONFIG_FB_SIS is not set CONFIG_FB_NEOMAGIC=m CONFIG_FB_KYRO=m CONFIG_FB_3DFX=m CONFIG_FB_3DFX_ACCEL=y CONFIG_FB_VOODOO1=m CONFIG_FB_TRIDENT=m CONFIG_FB_TRIDENT_ACCEL=y # CONFIG_FB_VIRTUAL is not set # # Console display driver support # CONFIG_VGA_CONSOLE=y CONFIG_MDA_CONSOLE=m CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # # Logo configuration # CONFIG_LOGO=y # CONFIG_LOGO_LINUX_MONO is not set # CONFIG_LOGO_LINUX_VGA16 is not set CONFIG_LOGO_LINUX_CLUT224=y # # Sound # CONFIG_SOUND=m # # Advanced Linux Sound Architecture # CONFIG_SND=m CONFIG_SND_TIMER=m CONFIG_SND_PCM=m CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_SEQUENCER=m CONFIG_SND_SEQ_DUMMY=m CONFIG_SND_OSSEMUL=y CONFIG_SND_MIXER_OSS=m CONFIG_SND_PCM_OSS=m CONFIG_SND_SEQUENCER_OSS=y CONFIG_SND_RTCTIMER=m # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set # # Generic devices # CONFIG_SND_MPU401_UART=m CONFIG_SND_OPL3_LIB=m CONFIG_SND_OPL4_LIB=m CONFIG_SND_VX_LIB=m CONFIG_SND_DUMMY=m CONFIG_SND_VIRMIDI=m CONFIG_SND_MTPAV=m # CONFIG_SND_SERIAL_U16550 is not set CONFIG_SND_MPU401=m # # ISA devices # CONFIG_SND_AD1816A=m CONFIG_SND_AD1848=m CONFIG_SND_CS4231=m CONFIG_SND_CS4232=m CONFIG_SND_CS4236=m CONFIG_SND_ES968=m CONFIG_SND_ES1688=m CONFIG_SND_ES18XX=m CONFIG_SND_GUSCLASSIC=m CONFIG_SND_GUSEXTREME=m CONFIG_SND_GUSMAX=m CONFIG_SND_INTERWAVE=m CONFIG_SND_INTERWAVE_STB=m CONFIG_SND_OPTI92X_AD1848=m CONFIG_SND_OPTI92X_CS4231=m CONFIG_SND_OPTI93X=m CONFIG_SND_SB8=m CONFIG_SND_SB16=m CONFIG_SND_SBAWE=m CONFIG_SND_SB16_CSP=y # CONFIG_SND_WAVEFRONT is not set CONFIG_SND_ALS100=m CONFIG_SND_AZT2320=m CONFIG_SND_CMI8330=m CONFIG_SND_DT019X=m CONFIG_SND_OPL3SA2=m CONFIG_SND_SGALAXY=m CONFIG_SND_SSCAPE=m # # PCI devices # CONFIG_SND_AC97_CODEC=m CONFIG_SND_ALI5451=m CONFIG_SND_ATIIXP=m CONFIG_SND_AU8810=m CONFIG_SND_AU8820=m CONFIG_SND_AU8830=m CONFIG_SND_AZT3328=m CONFIG_SND_BT87X=m CONFIG_SND_CS46XX=m CONFIG_SND_CS46XX_NEW_DSP=y CONFIG_SND_CS4281=m CONFIG_SND_EMU10K1=m CONFIG_SND_KORG1212=m CONFIG_SND_MIXART=m CONFIG_SND_NM256=m CONFIG_SND_RME32=m CONFIG_SND_RME96=m CONFIG_SND_RME9652=m CONFIG_SND_HDSP=m CONFIG_SND_TRIDENT=m CONFIG_SND_YMFPCI=m CONFIG_SND_ALS4000=m CONFIG_SND_CMIPCI=m CONFIG_SND_ENS1370=m CONFIG_SND_ENS1371=m CONFIG_SND_ES1938=m CONFIG_SND_ES1968=m CONFIG_SND_MAESTRO3=m CONFIG_SND_FM801=m CONFIG_SND_FM801_TEA575X=m CONFIG_SND_ICE1712=m CONFIG_SND_ICE1724=m CONFIG_SND_INTEL8X0=m CONFIG_SND_INTEL8X0M=m CONFIG_SND_SONICVIBES=m CONFIG_SND_VIA82XX=m CONFIG_SND_VX222=m # # ALSA USB devices # CONFIG_SND_USB_AUDIO=m # # PCMCIA devices # # CONFIG_SND_VXPOCKET is not set # CONFIG_SND_VXP440 is not set CONFIG_SND_PDAUDIOCF=m # # Open Sound System # # CONFIG_SOUND_PRIME is not set # # USB support # CONFIG_USB=y # CONFIG_USB_DEBUG is not set # # Miscellaneous USB options # CONFIG_USB_DEVICEFS=y # CONFIG_USB_BANDWIDTH is not set # CONFIG_USB_DYNAMIC_MINORS is not set # # USB Host Controller Drivers # CONFIG_USB_EHCI_HCD=m CONFIG_USB_EHCI_SPLIT_ISO=y CONFIG_USB_EHCI_ROOT_HUB_TT=y CONFIG_USB_OHCI_HCD=m CONFIG_USB_UHCI_HCD=m # # USB Device Class drivers # # CONFIG_USB_AUDIO is not set # # USB Bluetooth TTY can only be used with disabled Bluetooth subsystem # CONFIG_USB_MIDI=m CONFIG_USB_ACM=m CONFIG_USB_PRINTER=m CONFIG_USB_STORAGE=m # CONFIG_USB_STORAGE_DEBUG is not set CONFIG_USB_STORAGE_RW_DETECT=y CONFIG_USB_STORAGE_DATAFAB=y CONFIG_USB_STORAGE_FREECOM=y CONFIG_USB_STORAGE_ISD200=y CONFIG_USB_STORAGE_DPCM=y CONFIG_USB_STORAGE_HP8200e=y CONFIG_USB_STORAGE_SDDR09=y CONFIG_USB_STORAGE_SDDR55=y CONFIG_USB_STORAGE_JUMPSHOT=y # # USB Human Interface Devices (HID) # CONFIG_USB_HID=y CONFIG_USB_HIDINPUT=y CONFIG_HID_FF=y CONFIG_HID_PID=y CONFIG_LOGITECH_FF=y CONFIG_THRUSTMASTER_FF=y CONFIG_USB_HIDDEV=y CONFIG_USB_AIPTEK=m CONFIG_USB_WACOM=m CONFIG_USB_KBTAB=m CONFIG_USB_POWERMATE=m CONFIG_USB_MTOUCH=m CONFIG_USB_EGALAX=m CONFIG_USB_XPAD=m CONFIG_USB_ATI_REMOTE=m # # USB Imaging devices # CONFIG_USB_MDC800=m CONFIG_USB_MICROTEK=m CONFIG_USB_HPUSBSCSI=m # # USB Multimedia devices # CONFIG_USB_DABUSB=m CONFIG_USB_VICAM=m CONFIG_USB_DSBR=m CONFIG_USB_IBMCAM=m CONFIG_USB_KONICAWC=m CONFIG_USB_OV511=m CONFIG_USB_PWC=m CONFIG_USB_SE401=m CONFIG_USB_SN9C102=m CONFIG_USB_STV680=m CONFIG_USB_W9968CF=m # # USB Network adaptors # CONFIG_USB_CATC=m CONFIG_USB_KAWETH=m CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m CONFIG_USB_USBNET=m # # USB Host-to-Host Cables # CONFIG_USB_ALI_M5632=y CONFIG_USB_AN2720=y CONFIG_USB_BELKIN=y CONFIG_USB_GENESYS=y CONFIG_USB_NET1080=y CONFIG_USB_PL2301=y # # Intelligent USB Devices/Gadgets # CONFIG_USB_ARMLINUX=y CONFIG_USB_EPSON2888=y CONFIG_USB_ZAURUS=y CONFIG_USB_CDCETHER=y # # USB Network Adapters # CONFIG_USB_AX8817X=y # # USB port drivers # CONFIG_USB_USS720=m # # USB Serial Converter support # CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL_GENERIC=y CONFIG_USB_SERIAL_BELKIN=m CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m CONFIG_USB_SERIAL_EMPEG=m CONFIG_USB_SERIAL_FTDI_SIO=m CONFIG_USB_SERIAL_VISOR=m CONFIG_USB_SERIAL_IPAQ=m CONFIG_USB_SERIAL_IR=m CONFIG_USB_SERIAL_EDGEPORT=m CONFIG_USB_SERIAL_EDGEPORT_TI=m CONFIG_USB_SERIAL_KEYSPAN_PDA=m CONFIG_USB_SERIAL_KEYSPAN=m CONFIG_USB_SERIAL_KEYSPAN_MPR=y CONFIG_USB_SERIAL_KEYSPAN_USA28=y CONFIG_USB_SERIAL_KEYSPAN_USA28X=y CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y CONFIG_USB_SERIAL_KEYSPAN_USA19=y CONFIG_USB_SERIAL_KEYSPAN_USA18X=y CONFIG_USB_SERIAL_KEYSPAN_USA19W=y CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y CONFIG_USB_SERIAL_KEYSPAN_USA49W=y CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y CONFIG_USB_SERIAL_KLSI=m CONFIG_USB_SERIAL_KOBIL_SCT=m CONFIG_USB_SERIAL_MCT_U232=m CONFIG_USB_SERIAL_PL2303=m CONFIG_USB_SERIAL_SAFE=m CONFIG_USB_SERIAL_SAFE_PADDED=y CONFIG_USB_SERIAL_CYBERJACK=m CONFIG_USB_SERIAL_XIRCOM=m CONFIG_USB_SERIAL_OMNINET=m CONFIG_USB_EZUSB=y # # USB Miscellaneous drivers # CONFIG_USB_EMI62=m # CONFIG_USB_EMI26 is not set CONFIG_USB_TIGL=m CONFIG_USB_AUERSWALD=m CONFIG_USB_RIO500=m CONFIG_USB_LEGOTOWER=m CONFIG_USB_LCD=m CONFIG_USB_LED=m # CONFIG_USB_CYTHERM is not set CONFIG_USB_SPEEDTOUCH=m CONFIG_USB_PHIDGETSERVO=m CONFIG_USB_TEST=m # # USB Gadget Support # # CONFIG_USB_GADGET is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y CONFIG_EXT2_FS_SECURITY=y CONFIG_EXT3_FS=m CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y CONFIG_JBD=m # CONFIG_JBD_DEBUG is not set CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set CONFIG_REISERFS_PROC_INFO=y CONFIG_REISERFS_FS_XATTR=y CONFIG_REISERFS_FS_POSIX_ACL=y CONFIG_REISERFS_FS_SECURITY=y CONFIG_JFS_FS=m CONFIG_JFS_POSIX_ACL=y # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set CONFIG_FS_POSIX_ACL=y CONFIG_XFS_FS=m # CONFIG_XFS_RT is not set CONFIG_XFS_QUOTA=y CONFIG_XFS_SECURITY=y CONFIG_XFS_POSIX_ACL=y CONFIG_MINIX_FS=m CONFIG_ROMFS_FS=m CONFIG_QUOTA=y # CONFIG_QFMT_V1 is not set CONFIG_QFMT_V2=y CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=m CONFIG_AUTOFS4_FS=m # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_ZISOFS_FS=y CONFIG_UDF_FS=m CONFIG_UDF_NLS=y # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=m CONFIG_MSDOS_FS=m CONFIG_VFAT_FS=m CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="ascii" # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_SYSFS=y # CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS_XATTR=y CONFIG_DEVPTS_FS_SECURITY=y CONFIG_TMPFS=y CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y CONFIG_RAMFS=y # # Miscellaneous filesystems # # CONFIG_ADFS_FS is not set CONFIG_AFFS_FS=m CONFIG_HFS_FS=m CONFIG_HFSPLUS_FS=m CONFIG_BEFS_FS=m # CONFIG_BEFS_DEBUG is not set CONFIG_BFS_FS=m CONFIG_EFS_FS=m # CONFIG_JFFS_FS is not set CONFIG_JFFS2_FS=m CONFIG_JFFS2_FS_DEBUG=0 CONFIG_JFFS2_FS_NAND=y CONFIG_JFFS2_COMPRESSION_OPTIONS=y CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y CONFIG_JFFS2_RUBIN=y # CONFIG_JFFS2_CMODE_NONE is not set CONFIG_JFFS2_CMODE_PRIORITY=y # CONFIG_JFFS2_CMODE_SIZE is not set CONFIG_CRAMFS=m CONFIG_VXFS_FS=m # CONFIG_HPFS_FS is not set CONFIG_QNX4FS_FS=m # CONFIG_QNX4FS_RW is not set CONFIG_SYSV_FS=m CONFIG_UFS_FS=m # CONFIG_UFS_FS_WRITE is not set # # Network File Systems # CONFIG_NFS_FS=m CONFIG_NFS_V3=y CONFIG_NFS_V4=y CONFIG_NFS_DIRECTIO=y CONFIG_NFSD=m CONFIG_NFSD_V3=y CONFIG_NFSD_V4=y CONFIG_NFSD_TCP=y CONFIG_LOCKD=m CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=m CONFIG_SUNRPC=m CONFIG_SUNRPC_GSS=m CONFIG_RPCSEC_GSS_KRB5=m CONFIG_SMB_FS=m # CONFIG_SMB_NLS_DEFAULT is not set CONFIG_CIFS=m # CONFIG_CIFS_STATS is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_NCP_FS=m CONFIG_NCPFS_PACKET_SIGNING=y CONFIG_NCPFS_IOCTL_LOCKING=y CONFIG_NCPFS_STRONG=y CONFIG_NCPFS_NFS_NS=y CONFIG_NCPFS_OS2_NS=y CONFIG_NCPFS_SMALLDOS=y CONFIG_NCPFS_NLS=y CONFIG_NCPFS_EXTRAS=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set CONFIG_OSF_PARTITION=y # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y CONFIG_BSD_DISKLABEL=y CONFIG_MINIX_SUBPARTITION=y CONFIG_SOLARIS_X86_PARTITION=y CONFIG_UNIXWARE_DISKLABEL=y # CONFIG_LDM_PARTITION is not set CONFIG_SGI_PARTITION=y # CONFIG_ULTRIX_PARTITION is not set CONFIG_SUN_PARTITION=y CONFIG_EFI_PARTITION=y # # Native Language Support # CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_CODEPAGE_737=m CONFIG_NLS_CODEPAGE_775=m CONFIG_NLS_CODEPAGE_850=m CONFIG_NLS_CODEPAGE_852=m CONFIG_NLS_CODEPAGE_855=m CONFIG_NLS_CODEPAGE_857=m CONFIG_NLS_CODEPAGE_860=m CONFIG_NLS_CODEPAGE_861=m CONFIG_NLS_CODEPAGE_862=m CONFIG_NLS_CODEPAGE_863=m CONFIG_NLS_CODEPAGE_864=m CONFIG_NLS_CODEPAGE_865=m CONFIG_NLS_CODEPAGE_866=m CONFIG_NLS_CODEPAGE_869=m CONFIG_NLS_CODEPAGE_936=m CONFIG_NLS_CODEPAGE_950=m CONFIG_NLS_CODEPAGE_932=m CONFIG_NLS_CODEPAGE_949=m CONFIG_NLS_CODEPAGE_874=m CONFIG_NLS_ISO8859_8=m CONFIG_NLS_CODEPAGE_1250=m CONFIG_NLS_CODEPAGE_1251=m CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=m CONFIG_NLS_ISO8859_2=m CONFIG_NLS_ISO8859_3=m CONFIG_NLS_ISO8859_4=m CONFIG_NLS_ISO8859_5=m CONFIG_NLS_ISO8859_6=m CONFIG_NLS_ISO8859_7=m CONFIG_NLS_ISO8859_9=m CONFIG_NLS_ISO8859_13=m CONFIG_NLS_ISO8859_14=m CONFIG_NLS_ISO8859_15=m CONFIG_NLS_KOI8_R=m CONFIG_NLS_KOI8_U=m CONFIG_NLS_UTF8=m # # Profiling support # CONFIG_PROFILING=y CONFIG_OPROFILE=m # # Kernel hacking # CONFIG_DEBUG_KERNEL=y CONFIG_EARLY_PRINTK=y CONFIG_DEBUG_STACKOVERFLOW=y CONFIG_DEBUG_STACK_USAGE=y CONFIG_DEBUG_SLAB=y CONFIG_MAGIC_SYSRQ=y CONFIG_DEBUG_SPINLOCK=y CONFIG_DEBUG_PAGEALLOC=y CONFIG_DEBUG_HIGHMEM=y CONFIG_DEBUG_INFO=y CONFIG_DEBUG_SPINLOCK_SLEEP=y CONFIG_FRAME_POINTER=y CONFIG_X86_FIND_SMP_CONFIG=y CONFIG_X86_MPPARSE=y # # Security options # CONFIG_SECURITY=y CONFIG_SECURITY_NETWORK=y CONFIG_SECURITY_CAPABILITIES=y # CONFIG_SECURITY_ROOTPLUG is not set CONFIG_SECURITY_SELINUX=y CONFIG_SECURITY_SELINUX_BOOTPARAM=y CONFIG_SECURITY_SELINUX_DISABLE=y CONFIG_SECURITY_SELINUX_DEVELOP=y # CONFIG_SECURITY_SELINUX_MLS is not set # # Cryptographic options # CONFIG_CRYPTO=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_NULL=m CONFIG_CRYPTO_MD4=m CONFIG_CRYPTO_MD5=m CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_SHA512=m CONFIG_CRYPTO_DES=m CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_TWOFISH=m CONFIG_CRYPTO_SERPENT=m CONFIG_CRYPTO_AES_586=m CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST6=m CONFIG_CRYPTO_TEA=m CONFIG_CRYPTO_ARC4=m CONFIG_CRYPTO_KHAZAD=m CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_MICHAEL_MIC=m CONFIG_CRYPTO_CRC32C=m # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIGNATURE=y CONFIG_CRYPTO_SIGNATURE_DSA=y CONFIG_CRYPTO_MPILIB=y # # Library routines # CONFIG_CRC_CCITT=m CONFIG_CRC32=y CONFIG_LIBCRC32C=m CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=m CONFIG_X86_SMP=y CONFIG_X86_HT=y CONFIG_X86_BIOS_REBOOT=y CONFIG_X86_TRAMPOLINE=y CONFIG_PC=y ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-10-27 13:45 ` David Woodhouse 2004-10-27 14:09 ` Artem B. Bityuckiy @ 2004-10-27 14:59 ` Artem B. Bityuckiy 2004-10-27 15:07 ` Artem B. Bityuckiy 2004-10-28 12:33 ` Artem B. Bityuckiy 2 siblings, 1 reply; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-10-27 14:59 UTC (permalink / raw) To: David Woodhouse; +Cc: linux-mtd One more thing: I don't see the problem whe yhe JFFS2 debug level is > 0 David Woodhouse wrote: > On Wed, 2004-10-27 at 17:35 +0400, Artem B. Bityuckiy wrote: > >>It is not very easy to reproduce the problem. If you are interesting, >>I'll try. > > > I'm very interesting. Please try :) > -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-10-27 14:59 ` Artem B. Bityuckiy @ 2004-10-27 15:07 ` Artem B. Bityuckiy 2004-10-28 12:14 ` Artem B. Bityuckiy 0 siblings, 1 reply; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-10-27 15:07 UTC (permalink / raw) To: Artem B. Bityuckiy; +Cc: linux-mtd, David Woodhouse Artem B. Bityuckiy wrote: > One more thing: I don't see the problem whe yhe JFFS2 debug level is > 0 Ups, sorry, "whe yhe" = "when the" :-) :-) -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-10-27 15:07 ` Artem B. Bityuckiy @ 2004-10-28 12:14 ` Artem B. Bityuckiy 0 siblings, 0 replies; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-10-28 12:14 UTC (permalink / raw) To: Artem B. Bityuckiy; +Cc: linux-mtd, David Woodhouse It seems there is one more problem in JFFS2. It appears when the preemption is enabled even on UP systems. If you run several times the script I sent, you will see sometimes messages like this: Data CRC 20f41434 != calculated CRC fbe09a15 for node at 005e2000 If the preemtion is disabled, the messages do not appear. P.S. The flash is OK, these are some JFFS2 errors... -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-10-27 13:45 ` David Woodhouse 2004-10-27 14:09 ` Artem B. Bityuckiy 2004-10-27 14:59 ` Artem B. Bityuckiy @ 2004-10-28 12:33 ` Artem B. Bityuckiy 2004-10-28 13:57 ` Artem B. Bityuckiy 2 siblings, 1 reply; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-10-28 12:33 UTC (permalink / raw) To: David Woodhouse; +Cc: linux-mtd Hello, I have two problems with JFFS2 now. The first problem appears if SMP is enabled. I described is in the mtd-list. The second one is the CRC errors. I also mentioned it I've installed 4 variants of the Linux-2.6.8.1 kernel on my i686 test host: 1. SMP, Preemption 2. SMP, No preemption 3. UP, Preemption 4. UP, No preemption I've testes JFFS2 on all these configurations and have observed: The first problem appears only on configurations 1 and 2. The second problem appears only on configuration 1 and 3 The configuration number 4 has no problems. So I may suppose that: 1. The first problem is SMP-related. 2. The second problem is preemption-related. 3. Both problems relate to race conditions. Comments? -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-10-28 12:33 ` Artem B. Bityuckiy @ 2004-10-28 13:57 ` Artem B. Bityuckiy 2004-11-02 14:31 ` Estelle HAMMACHE 0 siblings, 1 reply; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-10-28 13:57 UTC (permalink / raw) To: David Woodhouse; +Cc: linux-mtd Hello, how the the wbuf and related variables in the jffs2_sb_info are protected? -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-10-28 13:57 ` Artem B. Bityuckiy @ 2004-11-02 14:31 ` Estelle HAMMACHE 2004-11-03 16:29 ` Artem B. Bityuckiy 2004-11-03 16:39 ` Artem B. Bityuckiy 0 siblings, 2 replies; 19+ messages in thread From: Estelle HAMMACHE @ 2004-11-02 14:31 UTC (permalink / raw) To: Artem B. Bityuckiy; +Cc: linux-mtd, David Woodhouse Hello Artem, Have you made any progress with this issue ? I believe this problem could be reproduced more easily by adding a long sleep() at the end of __jffs2_flush_wbuf between memset() and the affectation of c->wbuf_ofs. Then write and fsync a file and try to read it back during the sleep. I've done something similar on my non-linux setup (actually I use a longjmp to exit from __jffs2_flush_wbuf) and I obtain the following when I try to read back the file: <7>Node read from 00080160: node_crc ffffffff, calculated CRC f09e7845. dsize ffffffff, csize ffffffff, offset ffffffff, buf 1100a48 <4>Node CRC ffffffff != calculated CRC f09e7845 for node at 00080160 I think the wbuf variables are well protected against cuncurrent writes, however if the wbuf is being flushed (fsync or GC) and you try to _read_ the file which has a node in wbuf, there may be some inconsistency between wbuf_ofs and wbuf contents. I suggest to modify the end of __jffs2_flush_wbuf this way: c->wbuf_len = 0; /* do this FIRST so that reads won't attempt to use wbuf */ memset(c->wbuf,0xff,c->wbuf_pagesize); /* adjust write buffer offset, else we get a non contiguous write bug */ c->wbuf_ofs += c->wbuf_pagesize; Does this seem useful ? Estelle "Artem B. Bityuckiy" wrote: > > Hello, > > how the the wbuf and related variables in the jffs2_sb_info are protected? > > -- > Best Regards, > Artem B. Bityuckiy, > St.-Petersburg, Russia. > > ______________________________________________________ > Linux MTD discussion mailing list > http://lists.infradead.org/mailman/listinfo/linux-mtd/ -- Estelle Hammache Terminal Management Team (Mobile phones MCU Software Development) TINA : 044 8024 Phone : (+33) 1 58 07 80 24 ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-11-02 14:31 ` Estelle HAMMACHE @ 2004-11-03 16:29 ` Artem B. Bityuckiy 2004-11-04 9:03 ` Estelle HAMMACHE 2004-11-03 16:39 ` Artem B. Bityuckiy 1 sibling, 1 reply; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-11-03 16:29 UTC (permalink / raw) To: Estelle HAMMACHE; +Cc: linux-mtd, David Woodhouse [-- Attachment #1: Type: text/plain, Size: 2516 bytes --] Hello Estelle. It seems I now what is the problem. Thank you for your message. The wbuf is protected by the alloc_sem because of all the writes go through the space reservation (or in case of GC, it also holds the alloc_sem). When JFFS2 reads the flash, it also looks to the write buffer and if the NAND page which should be read is currently in the wbuf, it reads some data from the wbuf too. But there is no any protection there. I've introduced the new read/write semaphore (wbuf_sem). It seems the problem is fixed, but I'm not sure yet. Please, could you try the attached patch? The patch was made against the MTD snapshot of date 20041008 (ftp://ftp.uk.linux.org/pub/people/dwmw2/mtd/cvs/mtd-snapshot-20041008.tar.bz2). David, could you comment this? Estelle HAMMACHE wrote: > Hello Artem, > > Have you made any progress with this issue ? > > I believe this problem could be reproduced more easily > by adding a long sleep() at the end of __jffs2_flush_wbuf > between memset() and the affectation of c->wbuf_ofs. > Then write and fsync a file and try to read it back during > the sleep. > I've done something similar on my non-linux setup (actually > I use a longjmp to exit from __jffs2_flush_wbuf) and I obtain > the following when I try to read back the file: > <7>Node read from 00080160: node_crc ffffffff, calculated CRC f09e7845. dsize ffffffff, csize ffffffff, offset ffffffff, > buf 1100a48 > <4>Node CRC ffffffff != calculated CRC f09e7845 for node at 00080160 > > I think the wbuf variables are well protected against > cuncurrent writes, however if the wbuf is being flushed > (fsync or GC) and you try to _read_ the file which has a > node in wbuf, there may be some inconsistency between > wbuf_ofs and wbuf contents. > I suggest to modify the end of __jffs2_flush_wbuf this way: > > c->wbuf_len = 0; /* do this FIRST so that reads won't attempt to use wbuf */ > memset(c->wbuf,0xff,c->wbuf_pagesize); > /* adjust write buffer offset, else we get a non contiguous write bug */ > c->wbuf_ofs += c->wbuf_pagesize; > > Does this seem useful ? > Estelle > > "Artem B. Bityuckiy" wrote: > >>Hello, >> >>how the the wbuf and related variables in the jffs2_sb_info are protected? >> >>-- >>Best Regards, >>Artem B. Bityuckiy, >>St.-Petersburg, Russia. >> >>______________________________________________________ >>Linux MTD discussion mailing list >>http://lists.infradead.org/mailman/listinfo/linux-mtd/ > > -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. [-- Attachment #2: preempt-patch.diff --] [-- Type: text/x-patch, Size: 16621 bytes --] diff -auNr mtd-snapshot-20041008/fs/jffs2/build.c mtd-preepmpt-fix/fs/jffs2/build.c --- mtd-snapshot-20041008/fs/jffs2/build.c 2003-10-29 02:00:34.000000000 +0300 +++ mtd-preepmpt-fix/fs/jffs2/build.c 2004-11-03 19:20:49.769732102 +0300 @@ -314,6 +314,7 @@ init_MUTEX(&c->alloc_sem); init_MUTEX(&c->erase_free_sem); + init_rwsem(&c->wbuf_sem); init_waitqueue_head(&c->erase_wait); init_waitqueue_head(&c->inocache_wq); spin_lock_init(&c->erase_completion_lock); diff -auNr mtd-snapshot-20041008/fs/jffs2/wbuf.c mtd-preepmpt-fix/fs/jffs2/wbuf.c --- mtd-snapshot-20041008/fs/jffs2/wbuf.c 2004-09-12 02:00:12.000000000 +0400 +++ mtd-preepmpt-fix/fs/jffs2/wbuf.c 2004-11-03 19:20:49.761733507 +0300 @@ -392,7 +392,7 @@ 1: Pad, do not adjust nextblock free_size 2: Pad, adjust nextblock free_size */ -static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad) +static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad, int alloc_wbuf_sem) { int ret; size_t retlen; @@ -408,8 +408,11 @@ BUG(); } + if (alloc_wbuf_sem) + down_write(&c->wbuf_sem); + if(!c->wbuf || !c->wbuf_len) - return 0; + goto exit; /* claim remaining space on the page this happens, if we have a change to a new block, @@ -458,7 +461,7 @@ jffs2_wbuf_recover(c); - return ret; + goto exit; } spin_lock(&c->erase_completion_lock); @@ -497,6 +500,9 @@ /* adjust write buffer offset, else we get a non contiguous write bug */ c->wbuf_ofs += c->wbuf_pagesize; c->wbuf_len = 0; +exit: + if (alloc_wbuf_sem) + up_write(&c->wbuf_sem); return 0; } @@ -525,7 +531,7 @@ if (c->unchecked_size) { /* GC won't make any progress for a while */ D1(printk(KERN_DEBUG "jffs2_flush_wbuf_gc() padding. Not finished checking\n")); - ret = __jffs2_flush_wbuf(c, 2); + ret = __jffs2_flush_wbuf(c, 2, 1); } else while (old_wbuf_len && old_wbuf_ofs == c->wbuf_ofs) { @@ -537,7 +543,7 @@ if (ret) { /* GC failed. Flush it with padding instead */ down(&c->alloc_sem); - ret = __jffs2_flush_wbuf(c, 2); + ret = __jffs2_flush_wbuf(c, 2, 1); break; } down(&c->alloc_sem); @@ -552,10 +558,9 @@ /* Pad write-buffer to end and write it, wasting space. */ int jffs2_flush_wbuf_pad(struct jffs2_sb_info *c) { - return __jffs2_flush_wbuf(c, 1); + return __jffs2_flush_wbuf(c, 1, 1); } - #define PAGE_DIV(x) ( (x) & (~(c->wbuf_pagesize - 1)) ) #define PAGE_MOD(x) ( (x) & (c->wbuf_pagesize - 1) ) int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsigned long count, loff_t to, size_t *retlen, uint32_t ino) @@ -575,6 +580,8 @@ if (!c->wbuf) return jffs2_flash_direct_writev(c, invecs, count, to, retlen); + down_write(&c->wbuf_sem); + /* If wbuf_ofs is not initialized, set it to target address */ if (c->wbuf_ofs == 0xFFFFFFFF) { c->wbuf_ofs = PAGE_DIV(to); @@ -592,12 +599,12 @@ /* It's a write to a new block */ if (c->wbuf_len) { D1(printk(KERN_DEBUG "jffs2_flash_writev() to 0x%lx causes flush of wbuf at 0x%08x\n", (unsigned long)to, c->wbuf_ofs)); - ret = jffs2_flush_wbuf_pad(c); + ret = __jffs2_flush_wbuf(c, 1, 1); if (ret) { /* the underlying layer has to check wbuf_len to do the cleanup */ D1(printk(KERN_WARNING "jffs2_flush_wbuf() called from jffs2_flash_writev() failed %d\n", ret)); *retlen = 0; - return ret; + goto exit; } } /* set pointer to new block */ @@ -658,14 +665,14 @@ } /* write buffer is full, flush buffer */ - ret = __jffs2_flush_wbuf(c, 0); + ret = __jffs2_flush_wbuf(c, 0, 0); if (ret) { /* the underlying layer has to check wbuf_len to do the cleanup */ D1(printk(KERN_WARNING "jffs2_flush_wbuf() called from jffs2_flash_writev() failed %d\n", ret)); /* Retlen zero to make sure our caller doesn't mark the space dirty. We've already done everything that's necessary */ *retlen = 0; - return ret; + goto exit; } outvec_to += donelen; c->wbuf_ofs = outvec_to; @@ -709,7 +716,6 @@ if (splitvec != -1) { uint32_t remainder; - int ret; remainder = outvecs[splitvec].iov_len - split_ofs; outvecs[splitvec].iov_len = split_ofs; @@ -721,7 +727,7 @@ c->wbuf is empty. */ *retlen = donelen; - return ret; + goto exit; } donelen += wbuf_retlen; @@ -760,7 +766,11 @@ if (c->wbuf_len && ino) jffs2_wbuf_dirties_inode(c, ino); - return 0; + ret = 0; + +exit: + up_write(&c->wbuf_sem); + return ret; } /* @@ -789,6 +799,8 @@ /* Read flash */ if (!jffs2_can_mark_obsolete(c)) { + down_read(&c->wbuf_sem); + ret = c->mtd->read_ecc(c->mtd, ofs, len, retlen, buf, NULL, c->oobinfo); if ( (ret == -EBADMSG) && (*retlen == len) ) { @@ -811,23 +823,23 @@ /* if no writebuffer available or write buffer empty, return */ if (!c->wbuf_pagesize || !c->wbuf_len) - return ret; + goto exit; /* if we read in a different block, return */ if ( (ofs & ~(c->sector_size-1)) != (c->wbuf_ofs & ~(c->sector_size-1)) ) - return ret; + goto exit; if (ofs >= c->wbuf_ofs) { owbf = (ofs - c->wbuf_ofs); /* offset in write buffer */ if (owbf > c->wbuf_len) /* is read beyond write buffer ? */ - return ret; + goto exit; lwbf = c->wbuf_len - owbf; /* number of bytes to copy */ if (lwbf > len) lwbf = len; } else { orbf = (c->wbuf_ofs - ofs); /* offset in read buffer */ if (orbf > len) /* is write beyond write buffer ? */ - return ret; + goto exit; lwbf = len - orbf; /* number of bytes to copy */ if (lwbf > c->wbuf_len) lwbf = c->wbuf_len; @@ -835,6 +847,8 @@ if (lwbf > 0) memcpy(buf+orbf,c->wbuf+owbf,lwbf); +exit: + up_read(&c->wbuf_sem); return ret; } diff -auNr mtd-snapshot-20041008/include/linux/jffs2_fs_sb.h mtd-preepmpt-fix/include/linux/jffs2_fs_sb.h --- mtd-snapshot-20041008/include/linux/jffs2_fs_sb.h 2003-10-09 02:00:05.000000000 +0400 +++ mtd-preepmpt-fix/include/linux/jffs2_fs_sb.h 2004-11-03 19:20:50.058681364 +0300 @@ -36,8 +36,9 @@ struct semaphore alloc_sem; /* Used to protect all the following fields, and also to protect against out-of-order writing of nodes. - And GC. - */ + And GC. Also protects the write buffer + against concurrent writes. */ + struct rw_semaphore wbuf_sem; /* Protects the write buffer while it is read */ uint32_t cleanmarker_size; /* Size of an _inline_ CLEANMARKER (i.e. zero for OOB CLEANMARKER */ diff -auNr mtd-snapshot-20041008/patches/patchin.sh mtd-preepmpt-fix/patches/patchin.sh --- mtd-snapshot-20041008/patches/patchin.sh 1970-01-01 03:00:00.000000000 +0300 +++ mtd-preepmpt-fix/patches/patchin.sh 2004-10-04 02:00:14.000000000 +0400 @@ -0,0 +1,392 @@ +#!/bin/sh +# +# Patch mtd into kernel +# +# usage:patch [-j] kernelpath +# kernelpath must be given +# -j includes filesystems (jffs, jffs2) +# +# Works for Kernels >= 2.4.11 full functional +# Works for Kernels >= 2.4 and <= 2.4.10 partly (JFFS2 support is missing) +# For 2.2 Kernels it's actually disabled, as I have none to test it. +# +# You can use it for pristine kernels and for already patches kernels too. +# +# Detects Kernelversion and applies neccecary modifications +# For Kernelversions < 2.4.20 ZLIB-Patch is applied, if +# filesystem option is set and ZLIB-Patch is not already there +# +# Maybe some sed/awk experts would make it better, but I'm not +# one of them. Feel free to make it better +# +# Thomas (tglx@linutronix.de) +# +# $Id: patchin.sh,v 1.28 2004/10/02 22:14:38 gleixner Exp $ +# +# 24-05-2004 havasi Patch fs/Kconfig +# 05-05-2004 tglx Include include/mtd +# 12-06-2003 dwmw2 Leave out JFFS1, do Makefile.common only if it exists. +# 27-05-2003 dwmw2 Link Makefile to Makefile.common since we moved them around +# 02-10-2003 tglx replaced grep -m by head -n 1, as older grep versions don't support -m +# 03-08-2003 tglx -c option for copying files to kernel tree instead of linking +# moved file selection to variables + +# Preset variables +FILESYSTEMS="no" +BK="no" +VERSION=0 +PATCHLEVEL=0 +SUBLEVEL=0 +ZLIBPATCH="no" +RSLIBPATCH="no" +DOCPATCH="no" +CONFIG="Config.in" +LNCP="ln -sf" +METHOD="Link" + + +# MTD - files and directories +MTD_DIRS="drivers/mtd drivers/mtd/chips drivers/mtd/devices drivers/mtd/maps drivers/mtd/nand include/linux/mtd include/mtd" +MTD_FILES="*.[ch] Makefile Rules.make" + +# JFFS2 files and directories +FS_DIRS="fs/jffs2" +FS_FILES="*.[ch] Makefile Rules.make" +# kernel version < 2.4.20 needs zlib headers +FS_INC_BEL2420="jffs*.h workqueue.h z*.h rb*.h suspend.h" +# kernel version < 2.5.x +FS_INC_BEL25="jffs2*.h workqueue.h rb*.h suspend.h" +# kernelversion >= 2.5 +FS_INC_25="jffs2*.h" +FS_INC_DIR="include/linux" + +# shared ZLIB patch +ZLIB_DIRS="lib/zlib_deflate lib/zlib_inflate" +ZLIB_FILES="*.[ch] Makefile" +# shared REED_SOLOMON patch +RSLIB_DIRS="lib/reed_solomon" +RSLIB_FILES="*.[ch]" +RSLIB_INC_DIR="include/linux" +RSLIB_INC="rslib.h" +# Documentation +DOC_DIRS="Documentation/DocBook" +DOC_FILES="*.tmpl" + +# Make text utils not suck +export LANG=C +export LC_ALL=C + +# Display usage of this script +usage () { + echo "usage: $0 [-c] [-j] kernelpath" + echo " -c -- copy files to kernel tree instead of building links" + echo " -j -- include jffs2 filesystem" + echo " -b -- Check files out for write from BK" + exit 1 +} + +# Function to patch kernel source +patchit () { +for DIR in $PATCH_DIRS +do + echo $DIR + mkdir -p $DIR + cd $TOPDIR/$DIR + FILES=`ls $PATCH_FILES 2>/dev/null` + if [ "$BK" = "yes" -a -d $DIR/SCCS ]; then + pushd $LINUXDIR/$DIR + bk co -ql $FILES + popd + fi + for FILE in $FILES + do + # If there's a Makefile.common it goes in place of Makefile + if [ "$FILE" = "Makefile" -a -r $TOPDIR/$DIR/Makefile.common ]; then + if test $PATCHLEVEL -lt 5; then + rm -f $LINUXDIR/$DIR/Makefile.common 2>/dev/null + $LNCP $TOPDIR/$DIR/Makefile.common $LINUXDIR/$DIR/Makefile.common + SRCFILE=Makefile.24 + else + SRCFILE=Makefile.common + fi + else + SRCFILE=$FILE + fi + rm -f $LINUXDIR/$DIR/$FILE 2>/dev/null + $LNCP $TOPDIR/$DIR/$SRCFILE $LINUXDIR/$DIR/$FILE + done + cd $LINUXDIR +done +} + + +# Start of script + +# Get commandline options +while getopts cjb opt +do + case "$opt" in + j) FILESYSTEMS=yes;; + c) LNCP="cp -f"; METHOD="Copy";; + b) BK=yes;; + \?) + usage; + esac +done +shift `expr $OPTIND - 1` +LINUXDIR=$1 + +if [ -z $LINUXDIR ]; then + usage; +fi + +if [ ! -f $LINUXDIR/Makefile -a "$BK" = "yes" ]; then + pushd $LINUXDIR + bk co Makefile + popd +fi + +# Check if kerneldir contains a Makefile +if [ ! -f $LINUXDIR/Makefile ] +then + echo "Directory $LINUXDIR does not exist or is not a kernel source directory"; + exit 1; +fi + +# Get kernel version +VERSION=`grep -s VERSION <$LINUXDIR/Makefile | head -n 1 | sed s/'VERSION = '//` +PATCHLEVEL=`grep -s PATCHLEVEL <$LINUXDIR/Makefile | head -n 1 | sed s/'PATCHLEVEL = '//` +SUBLEVEL=`grep -s SUBLEVEL <$LINUXDIR/Makefile | head -n 1 | sed s/'SUBLEVEL = '//` + +# Can we handle this ? +if test $VERSION -ne 2 -o $PATCHLEVEL -lt 4 +then + echo "Cannot patch kernel version $VERSION.$PATCHLEVEL.$SUBLEVEL"; + exit 1; +fi + +# Use Kconfig instead of Config.in for Kernels >= 2.5 +if test $PATCHLEVEL -gt 4 +then + CONFIG="Kconfig"; +fi +MTD_FILES="$MTD_FILES $CONFIG" + +# Have we to use ZLIB PATCH ? +if [ "$FILESYSTEMS" = "yes" ] +then + PATCHDONE=`grep -s zlib_deflate $LINUXDIR/lib/Makefile | head -n 1` + if test $PATCHLEVEL -eq 4 -a $SUBLEVEL -lt 20 + then + if [ "$PATCHDONE" = "" ] + then + ZLIBPATCH=yes; + fi + fi +fi + +# Have we to use REED_SOLOMON PATCH ? +PATCHDONE=`grep -s reed_solomon $LINUXDIR/lib/Makefile | head -n 1` +if [ "$PATCHDONE" = "" ] +then + RSLIBPATCH=yes; +fi + +# Have we to use DOCUMENTATION PATCH ? +PATCHDONE=`grep -s mtdnand $LINUXDIR/$DOC_DIRS/Makefile | head -n 1` +if [ "$PATCHDONE" = "" ] +then + if test $PATCHLEVEL -gt 4 + then + DOCPATCH=yes; + fi +fi + +# Check which header files we need depending on kernel version +HDIR="include/linux" +if test $PATCHLEVEL -eq 4 +then + # 2.4 below 2.4.20 zlib headers are neccecary + if test $SUBLEVEL -lt 20 + then + JFFS2_H=$FS_INC_BEL2420 + else + JFFS2_H=$FS_INC_BEL25 + fi +else + # >= 2.5 + JFFS2_H=$FS_INC_25 +fi + +echo Patching $LINUXDIR +echo Include Filesytems: $FILESYSTEMS +echo Zlib-Patch needed: $ZLIBPATCH +echo RS-Lib-Patch needed: $RSLIBPATCH +echo Documentation Patch needed: $DOCPATCH +echo Method: $METHOD +read -p "Can we start now ? [y/N]" ANSWER +echo "" + +if [ "$ANSWER" != "y" ] +then + echo Patching Kernel cancelled + exit 1; +fi + +# Here we go +cd `dirname $0` +THISDIR=`pwd` +TOPDIR=`dirname $THISDIR` + +cd $LINUXDIR + +# make directories, if necessary +# remove existing files/links and link/copy the new ones +echo "Patching MTD" +PATCH_DIRS=$MTD_DIRS +PATCH_FILES=$MTD_FILES +patchit; + +# check, if we have to include JFFS(2) +if [ "$FILESYSTEMS" = "yes" ] +then + echo "Patching JFFS(2)" + + PATCH_DIRS=$FS_DIRS + PATCH_FILES=$FS_FILES + patchit; + + PATCH_DIRS=$FS_INC_DIR + PATCH_FILES=$JFFS2_H + patchit; + + # this is the ugly part + PATCHDONE=`grep -s jffs2 fs/Makefile | head -n 1` + if [ "$PATCHDONE" = "" ] + then + echo "Add JFFS2 to Makefile and Config.in manually. JFFS2 is included as of 2.4.12" + else + if test $PATCHLEVEL -lt 5 + then + JFFS=`grep -n JFFS fs/Config.in | head -n 1 | sed s/:.*//` + CRAMFS=`grep -n CRAMFS fs/Config.in | head -n 1 | sed s/:.*//` + let JFFS=JFFS-1 + let CRAMFS=CRAMFS-1 + sed "$JFFS"q fs/Config.in >Config.tmp + cat $TOPDIR/fs/Config.in >>Config.tmp + sed 1,"$CRAMFS"d fs/Config.in >>Config.tmp + mv -f Config.tmp fs/Config.in + + if [ -f include/linux/crc32.h ] + then + # check, if it is already defined there + CRC32=`grep -s 'crc32(' include/linux/crc32.h | head -n 1` + if [ "$CRC32" = "" ] + then + # patch in header from fs/jffs2 + LASTLINE=`grep -n '#endif' include/linux/crc32.h | head -n 1 | sed s/:.*//` + let LASTLINE=LASTLINE-1 + sed "$LASTLINE"q include/linux/crc32.h >Crc32.tmp + cat fs/jffs2/crc32.h >>Crc32.tmp + echo "#endif" >>Crc32.tmp + mv -f Crc32.tmp include/linux/crc32.h + fi + else + rm -f include/linux/crc32.h + $LNCP $TOPDIR/fs/jffs2/crc32.h include/linux + fi + + else + JFFS=`grep -n JFFS fs/Kconfig | head -n 1 | sed s/:.*//` + CRAMFS=`grep -n CRAMFS fs/Kconfig | head -n 1 | sed s/:.*//` + let JFFS=JFFS-1 + let CRAMFS=CRAMFS-1 + sed "$JFFS"q fs/Kconfig >Kconfig.tmp + cat $TOPDIR/fs/Kconfig >>Kconfig.tmp + sed 1,"$CRAMFS"d fs/Kconfig >>Kconfig.tmp + mv -f Kconfig.tmp fs/Kconfig + fi + fi +fi + +if [ "$ZLIBPATCH" = "yes" ] +then + echo "Patching ZLIB" + + PATCH_DIRS=$ZLIB_DIRS + PATCH_FILES=$ZLIB_FILES + patchit; + + patch -p1 -i $TOPDIR/lib/patch-Makefile +fi + +echo "Patching RS Lib" +if [ "$RSLIBPATCH" = "yes" ] +then + if test $PATCHLEVEL -eq 4 + then + patch -p1 -i $TOPDIR/lib/Makefile24-rs.diff + patch -p1 -i $TOPDIR/lib/Config.in-rs.diff + else + patch -p1 -i $TOPDIR/lib/Makefile26-rs.diff + patch -p1 -i $TOPDIR/lib/Kconfig-rs.diff + fi + + mkdir -p lib/reed_solomon + +fi + + PATCH_DIRS=$RSLIB_DIRS + PATCH_FILES=$RSLIB_FILES + patchit; + + PATCH_DIRS=$RSLIB_INC_DIR + PATCH_FILES=$RSLIB_INC + patchit; + if test $PATCHLEVEL -eq 6 + then + mv -f lib/reed_solomon/rslib.c lib/reed_solomon/reed_solomon.c + fi + +if test $PATCHLEVEL -eq 4 +then + PATCH_DIRS=$RSLIB_DIRS + PATCH_FILES="Makefile24" + patchit; + rm -f $LINUXDIR/lib/reed_solomon/Makefile 2>/dev/null + mv -f $LINUXDIR/lib/reed_solomon/Makefile24 $LINUXDIR/lib/reed_solomon/Makefile +else + PATCH_DIRS=$RSLIB_DIRS + PATCH_FILES="Makefile26" + patchit; + rm -f $LINUXDIR/lib/reed_solomon/Makefile 2>/dev/null + mv -f $LINUXDIR/lib/reed_solomon/Makefile26 $LINUXDIR/lib/reed_solomon/Makefile +fi + +echo "Patching Documentation" +if [ "$DOCPATCH" = "yes" ] +then + patch -p1 -i $TOPDIR/$DOC_DIRS/Makefile.diff +fi + +PATCH_DIRS=$DOC_DIRS +PATCH_FILES=$DOC_FILES +patchit; + + +echo "Patching done" + +# some BUG() definitions were moved to asm/bug.h in the 2.5 kernels +# so fake having one to avoid build errors. +if test $PATCHLEVEL -lt 5; then + if [ ! -r $LINUXDIR/include/asm/bug.h ]; then + touch $LINUXDIR/include/asm/bug.h + fi +fi + +if test $PATCHLEVEL -lt 5 +then + # FIXME: SED/AWK experts should know how to do it automagic + echo "Please update Documentation/Configure.help from $TOPDIR/Documentation/Configure.help" +fi + ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-11-03 16:29 ` Artem B. Bityuckiy @ 2004-11-04 9:03 ` Estelle HAMMACHE 2004-11-04 9:36 ` Artem B. Bityuckiy 0 siblings, 1 reply; 19+ messages in thread From: Estelle HAMMACHE @ 2004-11-04 9:03 UTC (permalink / raw) To: Artem B. Bityuckiy; +Cc: linux-mtd, David Woodhouse Hello Artem, as I mentionned before I don't have linux so I can't really test your patch right now. I agree with the principle of your patch. I believe it should work this way. I was hoping the problem could be solved without introducing a new mutex, however I didn't check all the functions which modify the wbuf variables so I don't know whether it is a realistic idea or not. bye Estelle "Artem B. Bityuckiy" wrote: > > Hello Estelle. > > It seems I now what is the problem. Thank you for your message. > > The wbuf is protected by the alloc_sem because of all the writes go > through the space reservation (or in case of GC, it also holds the > alloc_sem). > > When JFFS2 reads the flash, it also looks to the write buffer and if the > NAND page which should be read is currently in the wbuf, it reads some > data from the wbuf too. But there is no any protection there. > > I've introduced the new read/write semaphore (wbuf_sem). It seems the > problem is fixed, but I'm not sure yet. > > Please, could you try the attached patch? The patch was made against the > MTD snapshot of date 20041008 > (ftp://ftp.uk.linux.org/pub/people/dwmw2/mtd/cvs/mtd-snapshot-20041008.tar.bz2). > > David, could you comment this? > ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-11-04 9:03 ` Estelle HAMMACHE @ 2004-11-04 9:36 ` Artem B. Bityuckiy [not found] ` <418A591C.A4D46C9E@st.com> 0 siblings, 1 reply; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-11-04 9:36 UTC (permalink / raw) To: Estelle HAMMACHE; +Cc: linux-mtd, David Woodhouse Estelle, I'm glad not to introduce new mutes, but I don't really know how to do so easy way. > I didn't check all the functions which > modify the wbuf variables so I don't know whether it is a > realistic idea or not. I investigated this. These are: jffs2_flash_writev() __jffs2_flush_wbuf() jffs2_wbuf_recover() too, but it is called only from __jffs2_flush_wbuf(). Anyway, all such functions are in wbuf.c Basically, the c->alloc_sem protects the write buffer. It is logical to use it in the jffs2_flash_read() too. But the problem is that the jffs2_flash_read() is called by from many places and the c->alloc_sem may be already locked (when the jffs2_flash_read() is called from the Garbage Collector, for example) or not locked (when, for example, JFFS2 performs the read_node() superblock operation). Thus, we should introduce one more function parameter (like alloc_sem_is_set "boolean" flag) to distinguish if the alloc_sem is hold. It is possible too. But the jffs2_flash_read() functions is also called from many other functions, and we will need to add this parameter recursively to all of them (for example, jffs2_mark_node_obsolete()). It seems the "down_trylock" decision is will not work. So, I think this way is not very nice... Any suggestions? Estelle HAMMACHE wrote: > Hello Artem, > > as I mentionned before I don't have linux so I can't really test > your patch right now. I agree with the principle of your patch. > I believe it should work this way. > I was hoping the problem could be solved without introducing > a new mutex, however I didn't check all the functions which > modify the wbuf variables so I don't know whether it is a > realistic idea or not. > bye > Estelle > -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. ^ permalink raw reply [flat|nested] 19+ messages in thread
[parent not found: <418A591C.A4D46C9E@st.com>]
* Re: JFFS2 & SMP [not found] ` <418A591C.A4D46C9E@st.com> @ 2004-11-04 17:17 ` Artem B. Bityuckiy 2004-11-05 9:06 ` Estelle HAMMACHE 0 siblings, 1 reply; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-11-04 17:17 UTC (permalink / raw) To: Estelle HAMMACHE; +Cc: linux-mtd Estelle, I don't cleanly understand your Idea, I'll think more. Could you please answer: does it handle the following "use-case" (if yes, how?): Suppose we are reading node, which is in the wbuf so far. int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *retlen, u_char *buf) { loff_t orbf = 0, owbf = 0, lwbf = 0; int ret; /* Read flash */ if (!jffs2_can_mark_obsolete(c)) { ret = c->mtd->read_ecc(c->mtd, ofs, len, retlen, buf, NULL, c->oobinfo); if ( (ret == -EBADMSG) && (*retlen == len) ) { printk(KERN_WARNING "mtd->read(0x%zx bytes from 0x%llx) returned ECC error\n", len, ofs); /* * We have the raw data without ECC correction in the buffer, maybe * we are lucky and all data or parts are correct. We check the node. * If data are corrupted node check will sort it out. * We keep this block, it will fail on write or erase and the we * mark it bad. Or should we do that now? But we should give him a chance. * Maybe we had a system crash or power loss before the ecc write or * a erase was completed. * So we return success. :) */ ret = 0; } } else return c->mtd->read(c->mtd, ofs, len, retlen, buf); /*________________________ Suppose the page we have read is empty because of its data is still in wbuf. We have read all 0xFF. Suppose we are preempted at this point. Somebody else made write, the wbuf became full and was flushed to the correspondent flash page. Then we wake up. We see, the wbuf_len == 0. And we exit. Result: we have read all 0xFF instead of node.... ________________________*/ /* if no writebuffer available or write buffer empty, return */ if (!c->wbuf_pagesize || !c->wbuf_len) return ret; /* <---------------------- we exit here.... */ /* if we read in a different block, return */ if ( (ofs & ~(c->sector_size-1)) != (c->wbuf_ofs & ~(c->sector_size-1)) ) return ret; if (ofs >= c->wbuf_ofs) { owbf = (ofs - c->wbuf_ofs); /* offset in write buffer */ if (owbf > c->wbuf_len) /* is read beyond write buffer ? */ return ret; lwbf = c->wbuf_len - owbf; /* number of bytes to copy */ if (lwbf > len) lwbf = len; } else { orbf = (c->wbuf_ofs - ofs); /* offset in read buffer */ if (orbf > len) /* is write beyond write buffer ? */ return ret; lwbf = len - orbf; /* number of bytes to copy */ if (lwbf > c->wbuf_len) lwbf = c->wbuf_len; } if (lwbf > 0) memcpy(buf+orbf,c->wbuf+owbf,lwbf); return ret; } Estelle HAMMACHE wrote: > Artem, > > I meant that it might be possible to ensure a correct > read operation without relying on a mutex, by ensuring > that the wbuf variables are always coherent when reading > from wbuf is authorized (wbuf_len != 0). > I am not sure this idea is really a good one, because > it tends to make the whole implementation more complex > to understand and maintain. Whereas the mutex idea is > more visible and easier to understand. > > However here are my ideas: > > - in jffs2_flash_writev > In this function I believe there is no problem - as long as > callers call jffs2_flash_writev first, and they add the > node to the raw node ref lists and inode tree later. > The read function won't attempt to read a node which is > not yet in the nodes lists and trees. > As to nodes which were previously written, and which are > still (partly or totally) in wbuf, I think there is no > problem in this function itself (wbuf_len is only > increased in this function, until it is time to flush, > and wbuf_ofs is only modified after a flush). > > - in __jffs2_flush_wbuf > Here I think there is an inconsistency because wbuf_len > should be reset to 0 and/or wbuf_ofs should be incremented > before memset(wbuf, 0xFF, ), in order to prevent reading > the wbuf when it no longer contains valid data. > > - in jffs2_wbuf_recover > This function is more tricky - both wbuf and the raw > node refs are modified. > I think a more secure way to manage wbuf recovery would > be to > - keep the wbuf variables intact for most of the function > - write only full pages to the new block - with a padding > node if necessary. > During this step, any read attempt to nodes which end is > in wbuf will effectively read wbuf. > - modify the raw node refs to point to the newly written > pages (unchanged from current code) > During this step, depending on which nodes are read > and which raw node refs are already updated, wbuf may > be read or not. > After completion of this step, wbuf will never > be read again because all raw node refs point to the > newly written pages. > - lastly, reset wbuf_len to 0, and wbuf_ofs to the correct > offset, and memset(wbuf, 0xFF, ). wbuf is now empty. > > Corresponding patch is attached. I only tested that it > doesn't break JFFS2, I didn't test jffs2_wbuf_recover > thoroughly. > Now as I mentionned before I am not sure this is the way > to go. Maybe your patch is better. > > bye > Estelle > > > > "Artem B. Bityuckiy" wrote: > >>Estelle, I'm glad not to introduce new mutes, but I don't really know >>how to do so easy way. >> >> > I didn't check all the functions which >> > modify the wbuf variables so I don't know whether it is a >> > realistic idea or not. >>I investigated this. These are: >>jffs2_flash_writev() >>__jffs2_flush_wbuf() >>jffs2_wbuf_recover() too, but it is called only from __jffs2_flush_wbuf(). >> >>Anyway, all such functions are in wbuf.c >> >>Basically, the c->alloc_sem protects the write buffer. It is logical to >>use it in the jffs2_flash_read() too. But the problem is that the >>jffs2_flash_read() is called by from many places and the c->alloc_sem >>may be already locked (when the jffs2_flash_read() is called from the >>Garbage Collector, for example) or not locked (when, for example, JFFS2 >>performs the read_node() superblock operation). >> >>Thus, we should introduce one more function parameter (like >>alloc_sem_is_set "boolean" flag) to distinguish if the alloc_sem is >>hold. It is possible too. But the jffs2_flash_read() functions is also >>called from many other functions, and we will need to add this parameter >>recursively to all of them (for example, jffs2_mark_node_obsolete()). >> >>It seems the "down_trylock" decision is will not work. >> >>So, I think this way is not very nice... Any suggestions? >> >>Estelle HAMMACHE wrote: >> >>>Hello Artem, >>> >>>as I mentionned before I don't have linux so I can't really test >>>your patch right now. I agree with the principle of your patch. >>>I believe it should work this way. >>>I was hoping the problem could be solved without introducing >>>a new mutex, however I didn't check all the functions which >>>modify the wbuf variables so I don't know whether it is a >>>realistic idea or not. >>>bye >>>Estelle >>> >> >>-- >>Best Regards, >>Artem B. Bityuckiy, >>St.-Petersburg, Russia. >> >> >>------------------------------------------------------------------------ >> >>diff -auNr mtd/fs/jffs2/wbuf.c wbuf_mod.c >> >>--- mtd/fs/jffs2/wbuf.c 2004-09-12 00:00:12.000000000 +0200 >>+++ wbuf_mod.c 2004-11-04 16:42:14.737060000 +0100 >>@@ -140,7 +140,7 @@ >> size_t retlen; >> int ret; >> unsigned char *buf; >>- uint32_t start, end, ofs, len; >>+ uint32_t start, end, ofs, len, buflen; >> >> spin_lock(&c->erase_completion_lock); >> >>@@ -211,18 +211,23 @@ >> >> D1(printk(KERN_DEBUG "wbuf recover %08x-%08x\n", start, end)); >> >>- buf = NULL; >>+ buflen = (end - start) & (c->wbuf_pagesize - 1); >>+ if (buflen) >>+ buflen = c->wbuf_pagesize - buflen; >>+ buflen += end - start; >>+ buf = kmalloc(buflen, GFP_KERNEL); >>+ if (!buf) { >>+ printk(KERN_CRIT "Malloc failure in wbuf recovery. Data loss ensues.\n"); >>+ buf = kmalloc(c->wbuf_pagesize, GFP_KERNEL); >>+ if (!buf) >>+ return; >>+ goto read_failed; >>+ } >>+ >> if (start < c->wbuf_ofs) { >> /* First affected node was already partially written. >> * Attempt to reread the old data into our buffer. */ >> >>- buf = kmalloc(end - start, GFP_KERNEL); >>- if (!buf) { >>- printk(KERN_CRIT "Malloc failure in wbuf recovery. Data loss ensues.\n"); >>- >>- goto read_failed; >>- } >>- >> /* Do the read... */ >> ret = c->mtd->read_ecc(c->mtd, start, c->wbuf_ofs - start, &retlen, buf, NULL, c->oobinfo); >> if (ret == -EBADMSG && retlen == c->wbuf_ofs - start) { >>@@ -232,103 +237,116 @@ >> if (ret || retlen != c->wbuf_ofs - start) { >> printk(KERN_CRIT "Old data are already lost in wbuf recovery. Data loss ensues.\n"); >> >>- kfree(buf); >>- buf = NULL; >> read_failed: >> first_raw = &(*first_raw)->next_phys; >> /* If this was the only node to be recovered, give up */ >> if (!(*first_raw)) >>+ { >>+ kfree(buf); >> return; >>+ } >> >> /* It wasn't. Go on and try to recover nodes complete in the wbuf */ >> start = ref_offset(*first_raw); >>- } else { >>- /* Read succeeded. Copy the remaining data from the wbuf */ >>+ >>+ buflen = (end - start) & (c->wbuf_pagesize - 1); >>+ if (buflen) >>+ buflen = c->wbuf_pagesize - buflen; >>+ buflen += end - start; >>+ } >>+ else >>+ { >>+ /* find remainder of the data in wbuf */ >> memcpy(buf + (c->wbuf_ofs - start), c->wbuf, end - c->wbuf_ofs); >> } >> } >>- /* OK... we're to rewrite (end-start) bytes of data from first_raw onwards. >>- Either 'buf' contains the data, or we find it in the wbuf */ >>+ /* no need to read from flash or read failed */ >>+ if (start >= c->wbuf_ofs) >>+ { >>+ /* find data in wbuf */ >>+ memcpy(buf, c->wbuf + (start - c->wbuf_ofs), end - c->wbuf_ofs); >>+ } >>+ >>+ /* fill up with dirty mask or padding node */ >>+ if (buflen > (end - start)) >>+ { >>+ len = buflen - PAD(end-start); >>+ if ( len + sizeof(struct jffs2_unknown_node) < c->wbuf_pagesize) >>+ { >>+ struct jffs2_unknown_node *padnode = (void *)(buf + end - start); >>+ padnode->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); >>+ padnode->nodetype = cpu_to_je16(JFFS2_NODETYPE_PADDING); >>+ padnode->totlen = cpu_to_je32(len); >>+ padnode->hdr_crc = cpu_to_je32(crc32(0, padnode, sizeof(*padnode)-4)); >>+ } else { >>+ /* Pad with JFFS2_DIRTY_BITMASK */ >>+ memset(buf + end - start, 0, len); >>+ } >>+ } >> >>+ /* OK... we're to rewrite buflen bytes of data from first_raw onwards. */ >> >> /* ... and get an allocation of space from a shiny new block instead */ >>- ret = jffs2_reserve_space_gc(c, end-start, &ofs, &len); >>+ ret = jffs2_reserve_space_gc(c, buflen, &ofs, &len); >> if (ret) { >> printk(KERN_WARNING "Failed to allocate space for wbuf recovery. Data loss ensues.\n"); >> if (buf) >> kfree(buf); >> return; >> } >>- if (end-start >= c->wbuf_pagesize) { >>- /* Need to do another write immediately. This, btw, >>- means that we'll be writing from 'buf' and not from >>- the wbuf. Since if we're writing from the wbuf there >>- won't be more than a wbuf full of data, now will >>- there? :) */ >>- >>- uint32_t towrite = (end-start) - ((end-start)%c->wbuf_pagesize); >> >>- D1(printk(KERN_DEBUG "Write 0x%x bytes at 0x%08x in wbuf recover\n", >>- towrite, ofs)); >>+ /* write buflen immediately */ >>+ >>+ D1(printk(KERN_DEBUG "Write 0x%x bytes at 0x%08x in wbuf recover\n", >>+ buflen, ofs)); >> >> #ifdef BREAKMEHEADER >>- static int breakme; >>- if (breakme++ == 20) { >>- printk(KERN_NOTICE "Faking write error at 0x%08x\n", ofs); >>- breakme = 0; >>- c->mtd->write_ecc(c->mtd, ofs, towrite, &retlen, >>- brokenbuf, NULL, c->oobinfo); >>- ret = -EIO; >>- } else >>+ static int breakme; >>+ if (breakme++ == 20) { >>+ printk(KERN_NOTICE "Faking write error at 0x%08x\n", ofs); >>+ breakme = 0; >>+ c->mtd->write_ecc(c->mtd, ofs, buflen, &retlen, >>+ brokenbuf, NULL, c->oobinfo); >>+ ret = -EIO; >>+ } else >> #endif >>- ret = c->mtd->write_ecc(c->mtd, ofs, towrite, &retlen, >>+ ret = c->mtd->write_ecc(c->mtd, ofs, buflen, &retlen, >> buf, NULL, c->oobinfo); >> >>- if (ret || retlen != towrite) { >>- /* Argh. We tried. Really we did. */ >>- printk(KERN_CRIT "Recovery of wbuf failed due to a second write error\n"); >>- kfree(buf); >>- >>- if (retlen) { >>- struct jffs2_raw_node_ref *raw2; >>+ if (ret || retlen != buflen) { >>+ /* Argh. We tried. Really we did. */ >>+ printk(KERN_CRIT "Recovery of wbuf failed due to a second write error\n"); >>+ kfree(buf); >> >>- raw2 = jffs2_alloc_raw_node_ref(); >>- if (!raw2) >>- return; >>- >>- raw2->flash_offset = ofs | REF_OBSOLETE; >>- raw2->__totlen = ref_totlen(c, jeb, *first_raw); >>- raw2->next_phys = NULL; >>- raw2->next_in_ino = NULL; >>+ if (retlen) { >>+ struct jffs2_raw_node_ref *raw2; >>+ raw2 = jffs2_alloc_raw_node_ref(); >>+ if (!raw2) >>+ return; >> >>- jffs2_add_physical_node_ref(c, raw2); >>+ raw2->flash_offset = ofs | REF_OBSOLETE; >>+ raw2->__totlen = ref_totlen(c, jeb, *first_raw); >>+ raw2->next_phys = NULL; >>+ raw2->next_in_ino = NULL; >>+ jffs2_add_physical_node_ref(c, raw2); >> } >>- return; >>- } >>- printk(KERN_NOTICE "Recovery of wbuf succeeded to %08x\n", ofs); >>- >>- c->wbuf_len = (end - start) - towrite; >>- c->wbuf_ofs = ofs + towrite; >>- memcpy(c->wbuf, buf + towrite, c->wbuf_len); >>- /* Don't muck about with c->wbuf_inodes. False positives are harmless. */ >>- >>- kfree(buf); >>- } else { >>- /* OK, now we're left with the dregs in whichever buffer we're using */ >>- if (buf) { >>- memcpy(c->wbuf, buf, end-start); >>- kfree(buf); >>- } else { >>- memmove(c->wbuf, c->wbuf + (start - c->wbuf_ofs), end - start); >>- } >>- c->wbuf_ofs = ofs; >>- c->wbuf_len = end - start; >>+ return; >> } >>+ printk(KERN_NOTICE "Recovery of wbuf succeeded to %08x\n", ofs); >> >> /* Now sort out the jffs2_raw_node_refs, moving them from the old to the next block */ >> new_jeb = &c->blocks[ofs / c->sector_size]; >> >> spin_lock(&c->erase_completion_lock); >>+ /* if we padded : adjust sizes */ >>+ if (buflen > (end - start)) >>+ { >>+ len = buflen - PAD(end-start); >>+ new_jeb->free_size -= len; >>+ c->free_size -= len; >>+ new_jeb->wasted_size += len; >>+ c->wasted_size += len; >>+ } >> if (new_jeb->first_node) { >> /* Odd, but possible with ST flash later maybe */ >> new_jeb->last_node->next_phys = *first_raw; >>@@ -363,6 +381,12 @@ >> raw = &(*raw)->next_phys; >> } >> >>+ /* wbuf is empty after recovery */ >>+ c->wbuf_len = 0; >>+ c->wbuf_ofs = ofs + len; >>+ BUG_ON(c->wbuf_ofs & (c->wbuf_pagesize-1)); >>+ memset(c->wbuf, 0xFF, c->wbuf_pagesize); >>+ >> /* Fix up the original jeb now it's on the bad_list */ >> *first_raw = NULL; >> if (first_raw == &jeb->first_node) { >>@@ -493,10 +517,11 @@ >> jffs2_clear_wbuf_ino_list(c); >> spin_unlock(&c->erase_completion_lock); >> >>- memset(c->wbuf,0xff,c->wbuf_pagesize); >>+ /* reset length first, to prevent reading wbuf */ >>+ c->wbuf_len = 0; >> /* adjust write buffer offset, else we get a non contiguous write bug */ >> c->wbuf_ofs += c->wbuf_pagesize; >>- c->wbuf_len = 0; >>+ memset(c->wbuf,0xff,c->wbuf_pagesize); >> return 0; >> } >> -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-11-04 17:17 ` Artem B. Bityuckiy @ 2004-11-05 9:06 ` Estelle HAMMACHE 2004-11-05 11:51 ` Artem B. Bityuckiy 0 siblings, 1 reply; 19+ messages in thread From: Estelle HAMMACHE @ 2004-11-05 9:06 UTC (permalink / raw) To: Artem B. Bityuckiy; +Cc: linux-mtd Artem, you are right of course. The patch I proposed would only make sense in a very specific environment which is very different from the way JFFS2 and linux work. So you can forget about my previous message. I guess there is no way around using a mutex. Estelle "Artem B. Bityuckiy" wrote: > > Estelle, > > I don't cleanly understand your Idea, I'll think more. > > Could you please answer: does it handle the following "use-case" (if > yes, how?): > > Suppose we are reading node, which is in the wbuf so far. > > int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, > size_t *retlen, u_char *buf) > { > loff_t orbf = 0, owbf = 0, lwbf = 0; > int ret; > > /* Read flash */ > if (!jffs2_can_mark_obsolete(c)) { > ret = c->mtd->read_ecc(c->mtd, ofs, len, retlen, buf, > NULL, c->oobinfo); > > if ( (ret == -EBADMSG) && (*retlen == len) ) { > printk(KERN_WARNING "mtd->read(0x%zx bytes from > 0x%llx) returned ECC error\n", > len, ofs); > /* > * We have the raw data without ECC correction > in the buffer, maybe > * we are lucky and all data or parts are > correct. We check the node. > * If data are corrupted node check will sort > it out. > * We keep this block, it will fail on write or > erase and the we > * mark it bad. Or should we do that now? But > we should give him a chance. > * Maybe we had a system crash or power loss > before the ecc write or > * a erase was completed. > * So we return success. :) > */ > ret = 0; > } > } else > return c->mtd->read(c->mtd, ofs, len, retlen, buf); > /*________________________ > Suppose the page we have read is empty because of its data is still in > wbuf. We have read all 0xFF. Suppose we are preempted at this point. > Somebody else made write, the wbuf became full and was flushed to the > correspondent flash page. Then we wake up. We see, the wbuf_len == 0. > And we exit. Result: we have read all 0xFF instead of node.... > ________________________*/ > > /* if no writebuffer available or write buffer empty, return */ > if (!c->wbuf_pagesize || !c->wbuf_len) > return ret; /* <---------------------- we exit here.... */ > > /* if we read in a different block, return */ > if ( (ofs & ~(c->sector_size-1)) != (c->wbuf_ofs & > ~(c->sector_size-1)) ) > return ret; > > if (ofs >= c->wbuf_ofs) { > owbf = (ofs - c->wbuf_ofs); /* offset in write > buffer */ > if (owbf > c->wbuf_len) /* is read beyond write > buffer ? */ > return ret; > lwbf = c->wbuf_len - owbf; /* number of bytes to > copy */ > if (lwbf > len) > lwbf = len; > } else { > orbf = (c->wbuf_ofs - ofs); /* offset in read buffer */ > if (orbf > len) /* is write beyond > write buffer ? */ > return ret; > lwbf = len - orbf; /* number of bytes to > copy */ > if (lwbf > c->wbuf_len) > lwbf = c->wbuf_len; > } > if (lwbf > 0) > memcpy(buf+orbf,c->wbuf+owbf,lwbf); > > return ret; > } > ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-11-05 9:06 ` Estelle HAMMACHE @ 2004-11-05 11:51 ` Artem B. Bityuckiy 0 siblings, 0 replies; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-11-05 11:51 UTC (permalink / raw) To: Estelle HAMMACHE; +Cc: linux-mtd Estelle HAMMACHE wrote: > Artem, > > you are right of course. The patch I proposed would only make sense > in a very specific environment which is very different from the > way JFFS2 and linux work. So you can forget about my previous message. > I guess there is no way around using a mutex. > > Estelle > Thanks for discussion. -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: JFFS2 & SMP 2004-11-02 14:31 ` Estelle HAMMACHE 2004-11-03 16:29 ` Artem B. Bityuckiy @ 2004-11-03 16:39 ` Artem B. Bityuckiy 1 sibling, 0 replies; 19+ messages in thread From: Artem B. Bityuckiy @ 2004-11-03 16:39 UTC (permalink / raw) To: Estelle HAMMACHE; +Cc: linux-mtd, David Woodhouse [-- Attachment #1: Type: text/plain, Size: 161 bytes --] Sorry, the patch was made not very accurately and will not easily applied, please, use this one. -- Best Regards, Artem B. Bityuckiy, St.-Petersburg, Russia. [-- Attachment #2: preempt-patch.diff --] [-- Type: text/x-patch, Size: 6480 bytes --] diff -auNr mtd-snapshot-20041008/fs/jffs2/build.c mtd-preepmpt-fix/fs/jffs2/build.c --- mtd-snapshot-20041008/fs/jffs2/build.c 2003-10-29 02:00:34.000000000 +0300 +++ mtd-preepmpt-fix/fs/jffs2/build.c 2004-11-03 19:20:49.769732102 +0300 @@ -314,6 +314,7 @@ init_MUTEX(&c->alloc_sem); init_MUTEX(&c->erase_free_sem); + init_rwsem(&c->wbuf_sem); init_waitqueue_head(&c->erase_wait); init_waitqueue_head(&c->inocache_wq); spin_lock_init(&c->erase_completion_lock); diff -auNr mtd-snapshot-20041008/fs/jffs2/wbuf.c mtd-preepmpt-fix/fs/jffs2/wbuf.c --- mtd-snapshot-20041008/fs/jffs2/wbuf.c 2004-09-12 02:00:12.000000000 +0400 +++ mtd-preepmpt-fix/fs/jffs2/wbuf.c 2004-11-03 19:20:49.761733507 +0300 @@ -392,7 +392,7 @@ 1: Pad, do not adjust nextblock free_size 2: Pad, adjust nextblock free_size */ -static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad) +static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad, int alloc_wbuf_sem) { int ret; size_t retlen; @@ -408,8 +408,11 @@ BUG(); } + if (alloc_wbuf_sem) + down_write(&c->wbuf_sem); + if(!c->wbuf || !c->wbuf_len) - return 0; + goto exit; /* claim remaining space on the page this happens, if we have a change to a new block, @@ -458,7 +461,7 @@ jffs2_wbuf_recover(c); - return ret; + goto exit; } spin_lock(&c->erase_completion_lock); @@ -497,6 +500,9 @@ /* adjust write buffer offset, else we get a non contiguous write bug */ c->wbuf_ofs += c->wbuf_pagesize; c->wbuf_len = 0; +exit: + if (alloc_wbuf_sem) + up_write(&c->wbuf_sem); return 0; } @@ -525,7 +531,7 @@ if (c->unchecked_size) { /* GC won't make any progress for a while */ D1(printk(KERN_DEBUG "jffs2_flush_wbuf_gc() padding. Not finished checking\n")); - ret = __jffs2_flush_wbuf(c, 2); + ret = __jffs2_flush_wbuf(c, 2, 1); } else while (old_wbuf_len && old_wbuf_ofs == c->wbuf_ofs) { @@ -537,7 +543,7 @@ if (ret) { /* GC failed. Flush it with padding instead */ down(&c->alloc_sem); - ret = __jffs2_flush_wbuf(c, 2); + ret = __jffs2_flush_wbuf(c, 2, 1); break; } down(&c->alloc_sem); @@ -552,10 +558,9 @@ /* Pad write-buffer to end and write it, wasting space. */ int jffs2_flush_wbuf_pad(struct jffs2_sb_info *c) { - return __jffs2_flush_wbuf(c, 1); + return __jffs2_flush_wbuf(c, 1, 1); } - #define PAGE_DIV(x) ( (x) & (~(c->wbuf_pagesize - 1)) ) #define PAGE_MOD(x) ( (x) & (c->wbuf_pagesize - 1) ) int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsigned long count, loff_t to, size_t *retlen, uint32_t ino) @@ -575,6 +580,8 @@ if (!c->wbuf) return jffs2_flash_direct_writev(c, invecs, count, to, retlen); + down_write(&c->wbuf_sem); + /* If wbuf_ofs is not initialized, set it to target address */ if (c->wbuf_ofs == 0xFFFFFFFF) { c->wbuf_ofs = PAGE_DIV(to); @@ -592,12 +599,12 @@ /* It's a write to a new block */ if (c->wbuf_len) { D1(printk(KERN_DEBUG "jffs2_flash_writev() to 0x%lx causes flush of wbuf at 0x%08x\n", (unsigned long)to, c->wbuf_ofs)); - ret = jffs2_flush_wbuf_pad(c); + ret = __jffs2_flush_wbuf(c, 1, 1); if (ret) { /* the underlying layer has to check wbuf_len to do the cleanup */ D1(printk(KERN_WARNING "jffs2_flush_wbuf() called from jffs2_flash_writev() failed %d\n", ret)); *retlen = 0; - return ret; + goto exit; } } /* set pointer to new block */ @@ -658,14 +665,14 @@ } /* write buffer is full, flush buffer */ - ret = __jffs2_flush_wbuf(c, 0); + ret = __jffs2_flush_wbuf(c, 0, 0); if (ret) { /* the underlying layer has to check wbuf_len to do the cleanup */ D1(printk(KERN_WARNING "jffs2_flush_wbuf() called from jffs2_flash_writev() failed %d\n", ret)); /* Retlen zero to make sure our caller doesn't mark the space dirty. We've already done everything that's necessary */ *retlen = 0; - return ret; + goto exit; } outvec_to += donelen; c->wbuf_ofs = outvec_to; @@ -709,7 +716,6 @@ if (splitvec != -1) { uint32_t remainder; - int ret; remainder = outvecs[splitvec].iov_len - split_ofs; outvecs[splitvec].iov_len = split_ofs; @@ -721,7 +727,7 @@ c->wbuf is empty. */ *retlen = donelen; - return ret; + goto exit; } donelen += wbuf_retlen; @@ -760,7 +766,11 @@ if (c->wbuf_len && ino) jffs2_wbuf_dirties_inode(c, ino); - return 0; + ret = 0; + +exit: + up_write(&c->wbuf_sem); + return ret; } /* @@ -789,6 +799,8 @@ /* Read flash */ if (!jffs2_can_mark_obsolete(c)) { + down_read(&c->wbuf_sem); + ret = c->mtd->read_ecc(c->mtd, ofs, len, retlen, buf, NULL, c->oobinfo); if ( (ret == -EBADMSG) && (*retlen == len) ) { @@ -811,23 +823,23 @@ /* if no writebuffer available or write buffer empty, return */ if (!c->wbuf_pagesize || !c->wbuf_len) - return ret; + goto exit; /* if we read in a different block, return */ if ( (ofs & ~(c->sector_size-1)) != (c->wbuf_ofs & ~(c->sector_size-1)) ) - return ret; + goto exit; if (ofs >= c->wbuf_ofs) { owbf = (ofs - c->wbuf_ofs); /* offset in write buffer */ if (owbf > c->wbuf_len) /* is read beyond write buffer ? */ - return ret; + goto exit; lwbf = c->wbuf_len - owbf; /* number of bytes to copy */ if (lwbf > len) lwbf = len; } else { orbf = (c->wbuf_ofs - ofs); /* offset in read buffer */ if (orbf > len) /* is write beyond write buffer ? */ - return ret; + goto exit; lwbf = len - orbf; /* number of bytes to copy */ if (lwbf > c->wbuf_len) lwbf = c->wbuf_len; @@ -835,6 +847,8 @@ if (lwbf > 0) memcpy(buf+orbf,c->wbuf+owbf,lwbf); +exit: + up_read(&c->wbuf_sem); return ret; } diff -auNr mtd-snapshot-20041008/include/linux/jffs2_fs_sb.h mtd-preepmpt-fix/include/linux/jffs2_fs_sb.h --- mtd-snapshot-20041008/include/linux/jffs2_fs_sb.h 2003-10-09 02:00:05.000000000 +0400 +++ mtd-preepmpt-fix/include/linux/jffs2_fs_sb.h 2004-11-03 19:20:50.058681364 +0300 @@ -36,8 +36,9 @@ struct semaphore alloc_sem; /* Used to protect all the following fields, and also to protect against out-of-order writing of nodes. - And GC. - */ + And GC. Also protects the write buffer + against concurrent writes. */ + struct rw_semaphore wbuf_sem; /* Protects the write buffer while it is read */ uint32_t cleanmarker_size; /* Size of an _inline_ CLEANMARKER (i.e. zero for OOB CLEANMARKER */ ^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2004-11-05 11:52 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-10-27 12:35 JFFS2 & SMP Artem B. Bityuckiy
2004-10-27 12:59 ` David Woodhouse
2004-10-27 13:19 ` Artem B. Bityuckiy
2004-10-27 13:35 ` Artem B. Bityuckiy
2004-10-27 13:45 ` David Woodhouse
2004-10-27 14:09 ` Artem B. Bityuckiy
2004-10-27 14:59 ` Artem B. Bityuckiy
2004-10-27 15:07 ` Artem B. Bityuckiy
2004-10-28 12:14 ` Artem B. Bityuckiy
2004-10-28 12:33 ` Artem B. Bityuckiy
2004-10-28 13:57 ` Artem B. Bityuckiy
2004-11-02 14:31 ` Estelle HAMMACHE
2004-11-03 16:29 ` Artem B. Bityuckiy
2004-11-04 9:03 ` Estelle HAMMACHE
2004-11-04 9:36 ` Artem B. Bityuckiy
[not found] ` <418A591C.A4D46C9E@st.com>
2004-11-04 17:17 ` Artem B. Bityuckiy
2004-11-05 9:06 ` Estelle HAMMACHE
2004-11-05 11:51 ` Artem B. Bityuckiy
2004-11-03 16:39 ` Artem B. Bityuckiy
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox