aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-03-27 21:29:53 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-03-27 21:29:53 -0400
commitfa453a625de5b8ee9ada0a5b329df3f88751c615 (patch)
tree7a9e04d4a44bb929e96bd9bebb7b97cb733d1ecb
parent30eebb54b13ef198a3f1a143ee9dd68f295c60de (diff)
parent3463ff4439661d8107ac024329b5fe01d6e5117b (diff)
Merge branch 'for-linus-3.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml
Pull UML changes from Richard Weinberger: "Mostly bug fixes and cleanups" * 'for-linus-3.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml: (35 commits) um: Update defconfig um: Switch to large mcmodel on x86_64 MTD: Relax dependencies um: Wire CONFIG_GENERIC_IO up um: Serve io_remap_pfn_range() Introduce CONFIG_GENERIC_IO um: allow SUBARCH=x86 um: most of the SUBARCH uses can be killed um: deadlock in line_write_interrupt() um: don't bother trying to rebuild CHECKFLAGS for USER_OBJS um: use the right ifdef around exports in user_syms.c um: a bunch of headers can be killed by using generic-y um: ptrace-generic.h doesn't need user.h um: kill HOST_TASK_PID um: remove pointless include of asm/fixmap.h from asm/pgtable.h um: asm-offsets.h might as well come from underlying arch... um: merge processor_{32,64}.h a bit... um: switch close_chan() to struct line um: race fix: initialize delayed_work *before* registering IRQ um: line->have_irq is never checked... ...
-rw-r--r--arch/um/Kconfig.common1
-rw-r--r--arch/um/Makefile5
-rw-r--r--arch/um/defconfig655
-rw-r--r--arch/um/drivers/chan.h18
-rw-r--r--arch/um/drivers/chan_kern.c198
-rw-r--r--arch/um/drivers/chan_user.h2
-rw-r--r--arch/um/drivers/line.c258
-rw-r--r--arch/um/drivers/line.h29
-rw-r--r--arch/um/drivers/mconsole_kern.c2
-rw-r--r--arch/um/drivers/net_kern.c2
-rw-r--r--arch/um/drivers/port_kern.c4
-rw-r--r--arch/um/drivers/random.c2
-rw-r--r--arch/um/drivers/ssl.c41
-rw-r--r--arch/um/drivers/stdio_console.c46
-rw-r--r--arch/um/drivers/ubd.h (renamed from arch/um/drivers/ubd_user.h)0
-rw-r--r--arch/um/drivers/ubd_kern.c46
-rw-r--r--arch/um/drivers/ubd_user.c8
-rw-r--r--arch/um/drivers/xterm_kern.c2
-rw-r--r--arch/um/include/asm/Kbuild2
-rw-r--r--arch/um/include/asm/asm-offsets.h1
-rw-r--r--arch/um/include/asm/auxvec.h4
-rw-r--r--arch/um/include/asm/current.h13
-rw-r--r--arch/um/include/asm/delay.h18
-rw-r--r--arch/um/include/asm/io.h57
-rw-r--r--arch/um/include/asm/mutex.h9
-rw-r--r--arch/um/include/asm/param.h20
-rw-r--r--arch/um/include/asm/pci.h6
-rw-r--r--arch/um/include/asm/pgalloc.h3
-rw-r--r--arch/um/include/asm/pgtable.h2
-rw-r--r--arch/um/include/asm/ptrace-generic.h1
-rw-r--r--arch/um/include/shared/common-offsets.h2
-rw-r--r--arch/um/include/shared/kern_util.h2
-rw-r--r--arch/um/kernel/Makefile2
-rw-r--r--arch/um/kernel/process.c4
-rw-r--r--arch/um/kernel/sigio.c2
-rw-r--r--arch/um/kernel/time.c2
-rw-r--r--arch/um/os-Linux/Makefile2
-rw-r--r--arch/um/os-Linux/user_syms.c2
-rw-r--r--arch/um/scripts/Makefile.rules7
-rw-r--r--arch/x86/Makefile.um4
-rw-r--r--arch/x86/um/Kconfig4
-rw-r--r--arch/x86/um/asm/processor.h10
-rw-r--r--arch/x86/um/asm/processor_32.h10
-rw-r--r--arch/x86/um/asm/processor_64.h10
-rw-r--r--arch/x86/um/bugs_32.c4
-rw-r--r--drivers/mtd/Kconfig2
-rw-r--r--drivers/mtd/devices/Kconfig1
-rw-r--r--drivers/mtd/maps/Kconfig1
-rw-r--r--drivers/mtd/nand/Kconfig2
-rw-r--r--drivers/mtd/onenand/Kconfig1
-rw-r--r--fs/hostfs/hostfs.h3
-rw-r--r--fs/hostfs/hostfs_kern.c5
-rw-r--r--fs/hostfs/hostfs_user.c4
-rw-r--r--lib/Kconfig5
54 files changed, 813 insertions, 733 deletions
diff --git a/arch/um/Kconfig.common b/arch/um/Kconfig.common
index b37ae706af3e..20a49ba93cb9 100644
--- a/arch/um/Kconfig.common
+++ b/arch/um/Kconfig.common
@@ -9,6 +9,7 @@ config UML
9 select HAVE_GENERIC_HARDIRQS 9 select HAVE_GENERIC_HARDIRQS
10 select GENERIC_IRQ_SHOW 10 select GENERIC_IRQ_SHOW
11 select GENERIC_CPU_DEVICES 11 select GENERIC_CPU_DEVICES
12 select GENERIC_IO
12 13
13config MMU 14config MMU
14 bool 15 bool
diff --git a/arch/um/Makefile b/arch/um/Makefile
index 28688e6d96d7..55c0661e2b5d 100644
--- a/arch/um/Makefile
+++ b/arch/um/Makefile
@@ -28,6 +28,7 @@ ifeq ($(SUBARCH),i386)
28endif 28endif
29ifeq ($(SUBARCH),x86_64) 29ifeq ($(SUBARCH),x86_64)
30 HEADER_ARCH := x86 30 HEADER_ARCH := x86
31 KBUILD_CFLAGS += -mcmodel=large
31endif 32endif
32 33
33HOST_DIR := arch/$(HEADER_ARCH) 34HOST_DIR := arch/$(HEADER_ARCH)
@@ -50,7 +51,7 @@ KBUILD_CPPFLAGS += -I$(srctree)/$(HOST_DIR)/um
50# 51#
51# These apply to USER_CFLAGS to. 52# These apply to USER_CFLAGS to.
52 53
53KBUILD_CFLAGS += $(CFLAGS) $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\" \ 54KBUILD_CFLAGS += $(CFLAGS) $(CFLAGS-y) -D__arch_um__ \
54 $(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap \ 55 $(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap \
55 -Din6addr_loopback=kernel_in6addr_loopback \ 56 -Din6addr_loopback=kernel_in6addr_loopback \
56 -Din6addr_any=kernel_in6addr_any -Dstrrchr=kernel_strrchr 57 -Din6addr_any=kernel_in6addr_any -Dstrrchr=kernel_strrchr
@@ -99,7 +100,7 @@ KBUILD_KCONFIG := $(HOST_DIR)/um/Kconfig
99 100
100archheaders: 101archheaders:
101 $(Q)$(MAKE) -C '$(srctree)' KBUILD_SRC= \ 102 $(Q)$(MAKE) -C '$(srctree)' KBUILD_SRC= \
102 ARCH=$(SUBARCH) O='$(objtree)' archheaders 103 ARCH=$(HEADER_ARCH) O='$(objtree)' archheaders
103 104
104archprepare: include/generated/user_constants.h 105archprepare: include/generated/user_constants.h
105 106
diff --git a/arch/um/defconfig b/arch/um/defconfig
index 761f5e1a657e..fdc97e2c3d73 100644
--- a/arch/um/defconfig
+++ b/arch/um/defconfig
@@ -1,10 +1,8 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated file; DO NOT EDIT.
3# Linux kernel version: 2.6.24 3# User Mode Linux/i386 3.3.0 Kernel Configuration
4# Thu Feb 7 11:48:55 2008
5# 4#
6CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig" 5CONFIG_DEFCONFIG_LIST="arch/$ARCH/defconfig"
7CONFIG_GENERIC_HARDIRQS=y
8CONFIG_UML=y 6CONFIG_UML=y
9CONFIG_MMU=y 7CONFIG_MMU=y
10CONFIG_NO_IOMEM=y 8CONFIG_NO_IOMEM=y
@@ -20,12 +18,10 @@ CONFIG_HZ=100
20# 18#
21# UML-specific options 19# UML-specific options
22# 20#
23# CONFIG_STATIC_LINK is not set
24 21
25# 22#
26# Host processor type and features 23# Host processor type and features
27# 24#
28# CONFIG_M386 is not set
29# CONFIG_M486 is not set 25# CONFIG_M486 is not set
30# CONFIG_M586 is not set 26# CONFIG_M586 is not set
31# CONFIG_M586TSC is not set 27# CONFIG_M586TSC is not set
@@ -41,17 +37,17 @@ CONFIG_M686=y
41# CONFIG_MCRUSOE is not set 37# CONFIG_MCRUSOE is not set
42# CONFIG_MEFFICEON is not set 38# CONFIG_MEFFICEON is not set
43# CONFIG_MWINCHIPC6 is not set 39# CONFIG_MWINCHIPC6 is not set
44# CONFIG_MWINCHIP2 is not set
45# CONFIG_MWINCHIP3D is not set 40# CONFIG_MWINCHIP3D is not set
41# CONFIG_MELAN is not set
46# CONFIG_MGEODEGX1 is not set 42# CONFIG_MGEODEGX1 is not set
47# CONFIG_MGEODE_LX is not set 43# CONFIG_MGEODE_LX is not set
48# CONFIG_MCYRIXIII is not set 44# CONFIG_MCYRIXIII is not set
49# CONFIG_MVIAC3_2 is not set 45# CONFIG_MVIAC3_2 is not set
50# CONFIG_MVIAC7 is not set 46# CONFIG_MVIAC7 is not set
51# CONFIG_MPSC is not set
52# CONFIG_MCORE2 is not set 47# CONFIG_MCORE2 is not set
53# CONFIG_GENERIC_CPU is not set 48# CONFIG_MATOM is not set
54# CONFIG_X86_GENERIC is not set 49# CONFIG_X86_GENERIC is not set
50CONFIG_X86_INTERNODE_CACHE_SHIFT=5
55CONFIG_X86_CMPXCHG=y 51CONFIG_X86_CMPXCHG=y
56CONFIG_X86_L1_CACHE_SHIFT=5 52CONFIG_X86_L1_CACHE_SHIFT=5
57CONFIG_X86_XADD=y 53CONFIG_X86_XADD=y
@@ -60,47 +56,59 @@ CONFIG_X86_WP_WORKS_OK=y
60CONFIG_X86_INVLPG=y 56CONFIG_X86_INVLPG=y
61CONFIG_X86_BSWAP=y 57CONFIG_X86_BSWAP=y
62CONFIG_X86_POPAD_OK=y 58CONFIG_X86_POPAD_OK=y
63CONFIG_X86_GOOD_APIC=y
64CONFIG_X86_USE_PPRO_CHECKSUM=y 59CONFIG_X86_USE_PPRO_CHECKSUM=y
65CONFIG_X86_TSC=y 60CONFIG_X86_TSC=y
61CONFIG_X86_CMPXCHG64=y
66CONFIG_X86_CMOV=y 62CONFIG_X86_CMOV=y
67CONFIG_X86_MINIMUM_CPU_FAMILY=4 63CONFIG_X86_MINIMUM_CPU_FAMILY=5
68CONFIG_X86_DEBUGCTLMSR=y 64CONFIG_CPU_SUP_INTEL=y
65CONFIG_CPU_SUP_CYRIX_32=y
66CONFIG_CPU_SUP_AMD=y
67CONFIG_CPU_SUP_CENTAUR=y
68CONFIG_CPU_SUP_TRANSMETA_32=y
69CONFIG_CPU_SUP_UMC_32=y
69CONFIG_UML_X86=y 70CONFIG_UML_X86=y
70CONFIG_X86_32=y
71CONFIG_RWSEM_XCHGADD_ALGORITHM=y
72# CONFIG_64BIT is not set 71# CONFIG_64BIT is not set
73CONFIG_SEMAPHORE_SLEEPERS=y 72CONFIG_X86_32=y
73# CONFIG_X86_64 is not set
74# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
75CONFIG_RWSEM_GENERIC_SPINLOCK=y
74# CONFIG_3_LEVEL_PGTABLES is not set 76# CONFIG_3_LEVEL_PGTABLES is not set
75CONFIG_ARCH_HAS_SC_SIGNALS=y 77CONFIG_ARCH_HAS_SC_SIGNALS=y
76CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y 78CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y
77CONFIG_GENERIC_HWEIGHT=y 79CONFIG_GENERIC_HWEIGHT=y
80# CONFIG_STATIC_LINK is not set
78CONFIG_SELECT_MEMORY_MODEL=y 81CONFIG_SELECT_MEMORY_MODEL=y
79CONFIG_FLATMEM_MANUAL=y 82CONFIG_FLATMEM_MANUAL=y
80# CONFIG_DISCONTIGMEM_MANUAL is not set
81# CONFIG_SPARSEMEM_MANUAL is not set
82CONFIG_FLATMEM=y 83CONFIG_FLATMEM=y
83CONFIG_FLAT_NODE_MEM_MAP=y 84CONFIG_FLAT_NODE_MEM_MAP=y
84# CONFIG_SPARSEMEM_STATIC is not set 85CONFIG_PAGEFLAGS_EXTENDED=y
85# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
86CONFIG_SPLIT_PTLOCK_CPUS=4 86CONFIG_SPLIT_PTLOCK_CPUS=4
87# CONFIG_RESOURCES_64BIT is not set 87# CONFIG_COMPACTION is not set
88# CONFIG_PHYS_ADDR_T_64BIT is not set
88CONFIG_ZONE_DMA_FLAG=0 89CONFIG_ZONE_DMA_FLAG=0
89CONFIG_VIRT_TO_BUS=y 90CONFIG_VIRT_TO_BUS=y
91# CONFIG_KSM is not set
92CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
93CONFIG_NEED_PER_CPU_KM=y
94# CONFIG_CLEANCACHE is not set
90CONFIG_TICK_ONESHOT=y 95CONFIG_TICK_ONESHOT=y
91CONFIG_NO_HZ=y 96CONFIG_NO_HZ=y
92CONFIG_HIGH_RES_TIMERS=y 97CONFIG_HIGH_RES_TIMERS=y
93CONFIG_GENERIC_CLOCKEVENTS_BUILD=y 98CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
94CONFIG_LD_SCRIPT_DYN=y 99CONFIG_LD_SCRIPT_DYN=y
95CONFIG_BINFMT_ELF=y 100CONFIG_BINFMT_ELF=y
101CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
102CONFIG_HAVE_AOUT=y
96# CONFIG_BINFMT_AOUT is not set 103# CONFIG_BINFMT_AOUT is not set
97CONFIG_BINFMT_MISC=m 104CONFIG_BINFMT_MISC=m
98CONFIG_HOSTFS=y 105CONFIG_HOSTFS=y
99# CONFIG_HPPFS is not set 106# CONFIG_HPPFS is not set
100CONFIG_MCONSOLE=y 107CONFIG_MCONSOLE=y
101CONFIG_MAGIC_SYSRQ=y 108CONFIG_MAGIC_SYSRQ=y
102# CONFIG_HIGHMEM is not set
103CONFIG_KERNEL_STACK_ORDER=0 109CONFIG_KERNEL_STACK_ORDER=0
110# CONFIG_MMAPPER is not set
111CONFIG_NO_DMA=y
104 112
105# 113#
106# General setup 114# General setup
@@ -108,99 +116,169 @@ CONFIG_KERNEL_STACK_ORDER=0
108CONFIG_EXPERIMENTAL=y 116CONFIG_EXPERIMENTAL=y
109CONFIG_BROKEN_ON_SMP=y 117CONFIG_BROKEN_ON_SMP=y
110CONFIG_INIT_ENV_ARG_LIMIT=128 118CONFIG_INIT_ENV_ARG_LIMIT=128
119CONFIG_CROSS_COMPILE=""
111CONFIG_LOCALVERSION="" 120CONFIG_LOCALVERSION=""
112CONFIG_LOCALVERSION_AUTO=y 121CONFIG_LOCALVERSION_AUTO=y
122CONFIG_DEFAULT_HOSTNAME="(none)"
113CONFIG_SWAP=y 123CONFIG_SWAP=y
114CONFIG_SYSVIPC=y 124CONFIG_SYSVIPC=y
115CONFIG_SYSVIPC_SYSCTL=y 125CONFIG_SYSVIPC_SYSCTL=y
116CONFIG_POSIX_MQUEUE=y 126CONFIG_POSIX_MQUEUE=y
127CONFIG_POSIX_MQUEUE_SYSCTL=y
117CONFIG_BSD_PROCESS_ACCT=y 128CONFIG_BSD_PROCESS_ACCT=y
118# CONFIG_BSD_PROCESS_ACCT_V3 is not set 129# CONFIG_BSD_PROCESS_ACCT_V3 is not set
130# CONFIG_FHANDLE is not set
119# CONFIG_TASKSTATS is not set 131# CONFIG_TASKSTATS is not set
120# CONFIG_USER_NS is not set
121# CONFIG_PID_NS is not set
122# CONFIG_AUDIT is not set 132# CONFIG_AUDIT is not set
133CONFIG_HAVE_GENERIC_HARDIRQS=y
134
135#
136# IRQ subsystem
137#
138CONFIG_GENERIC_HARDIRQS=y
139CONFIG_GENERIC_IRQ_SHOW=y
140
141#
142# RCU Subsystem
143#
144CONFIG_TINY_RCU=y
145# CONFIG_PREEMPT_RCU is not set
146# CONFIG_RCU_TRACE is not set
147# CONFIG_TREE_RCU_TRACE is not set
123CONFIG_IKCONFIG=y 148CONFIG_IKCONFIG=y
124CONFIG_IKCONFIG_PROC=y 149CONFIG_IKCONFIG_PROC=y
125CONFIG_LOG_BUF_SHIFT=14 150CONFIG_LOG_BUF_SHIFT=14
126# CONFIG_CGROUPS is not set 151CONFIG_CGROUPS=y
152# CONFIG_CGROUP_DEBUG is not set
153CONFIG_CGROUP_FREEZER=y
154CONFIG_CGROUP_DEVICE=y
155CONFIG_CPUSETS=y
156CONFIG_PROC_PID_CPUSET=y
157CONFIG_CGROUP_CPUACCT=y
158CONFIG_RESOURCE_COUNTERS=y
159CONFIG_CGROUP_MEM_RES_CTLR=y
160CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y
161# CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED is not set
162# CONFIG_CGROUP_MEM_RES_CTLR_KMEM is not set
163CONFIG_CGROUP_SCHED=y
127CONFIG_FAIR_GROUP_SCHED=y 164CONFIG_FAIR_GROUP_SCHED=y
128CONFIG_FAIR_USER_SCHED=y 165# CONFIG_CFS_BANDWIDTH is not set
129# CONFIG_FAIR_CGROUP_SCHED is not set 166# CONFIG_RT_GROUP_SCHED is not set
167CONFIG_BLK_CGROUP=m
168# CONFIG_DEBUG_BLK_CGROUP is not set
169# CONFIG_CHECKPOINT_RESTORE is not set
170CONFIG_NAMESPACES=y
171CONFIG_UTS_NS=y
172CONFIG_IPC_NS=y
173# CONFIG_USER_NS is not set
174# CONFIG_PID_NS is not set
175CONFIG_NET_NS=y
176# CONFIG_SCHED_AUTOGROUP is not set
177CONFIG_MM_OWNER=y
130CONFIG_SYSFS_DEPRECATED=y 178CONFIG_SYSFS_DEPRECATED=y
179# CONFIG_SYSFS_DEPRECATED_V2 is not set
131# CONFIG_RELAY is not set 180# CONFIG_RELAY is not set
132# CONFIG_BLK_DEV_INITRD is not set 181# CONFIG_BLK_DEV_INITRD is not set
133CONFIG_CC_OPTIMIZE_FOR_SIZE=y 182CONFIG_CC_OPTIMIZE_FOR_SIZE=y
134CONFIG_SYSCTL=y 183CONFIG_SYSCTL=y
184CONFIG_ANON_INODES=y
135# CONFIG_EXPERT is not set 185# CONFIG_EXPERT is not set
136CONFIG_UID16=y 186CONFIG_UID16=y
137CONFIG_SYSCTL_SYSCALL=y 187# CONFIG_SYSCTL_SYSCALL is not set
138CONFIG_KALLSYMS=y 188CONFIG_KALLSYMS=y
139# CONFIG_KALLSYMS_ALL is not set 189# CONFIG_KALLSYMS_ALL is not set
140CONFIG_KALLSYMS_EXTRA_PASS=y
141CONFIG_HOTPLUG=y 190CONFIG_HOTPLUG=y
142CONFIG_PRINTK=y 191CONFIG_PRINTK=y
143CONFIG_BUG=y 192CONFIG_BUG=y
144CONFIG_ELF_CORE=y 193CONFIG_ELF_CORE=y
145CONFIG_BASE_FULL=y 194CONFIG_BASE_FULL=y
146CONFIG_FUTEX=y 195CONFIG_FUTEX=y
147CONFIG_ANON_INODES=y
148CONFIG_EPOLL=y 196CONFIG_EPOLL=y
149CONFIG_SIGNALFD=y 197CONFIG_SIGNALFD=y
150CONFIG_TIMERFD=y 198CONFIG_TIMERFD=y
151CONFIG_EVENTFD=y 199CONFIG_EVENTFD=y
152CONFIG_SHMEM=y 200CONFIG_SHMEM=y
201CONFIG_AIO=y
202# CONFIG_EMBEDDED is not set
203
204#
205# Kernel Performance Events And Counters
206#
153CONFIG_VM_EVENT_COUNTERS=y 207CONFIG_VM_EVENT_COUNTERS=y
208CONFIG_COMPAT_BRK=y
154CONFIG_SLAB=y 209CONFIG_SLAB=y
155# CONFIG_SLUB is not set 210# CONFIG_SLUB is not set
156# CONFIG_SLOB is not set
157# CONFIG_PROFILING is not set 211# CONFIG_PROFILING is not set
158# CONFIG_MARKERS is not set 212
159# CONFIG_HAVE_OPROFILE is not set 213#
160# CONFIG_HAVE_KPROBES is not set 214# GCOV-based kernel profiling
161CONFIG_PROC_PAGE_MONITOR=y 215#
216# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
162CONFIG_SLABINFO=y 217CONFIG_SLABINFO=y
163CONFIG_RT_MUTEXES=y 218CONFIG_RT_MUTEXES=y
164# CONFIG_TINY_SHMEM is not set
165CONFIG_BASE_SMALL=0 219CONFIG_BASE_SMALL=0
166CONFIG_MODULES=y 220CONFIG_MODULES=y
221# CONFIG_MODULE_FORCE_LOAD is not set
167CONFIG_MODULE_UNLOAD=y 222CONFIG_MODULE_UNLOAD=y
168# CONFIG_MODULE_FORCE_UNLOAD is not set 223# CONFIG_MODULE_FORCE_UNLOAD is not set
169# CONFIG_MODVERSIONS is not set 224# CONFIG_MODVERSIONS is not set
170# CONFIG_MODULE_SRCVERSION_ALL is not set 225# CONFIG_MODULE_SRCVERSION_ALL is not set
171CONFIG_KMOD=y
172CONFIG_BLOCK=y 226CONFIG_BLOCK=y
173# CONFIG_LBD is not set 227CONFIG_LBDAF=y
174# CONFIG_BLK_DEV_IO_TRACE is not set
175# CONFIG_LSF is not set
176# CONFIG_BLK_DEV_BSG is not set 228# CONFIG_BLK_DEV_BSG is not set
229# CONFIG_BLK_DEV_BSGLIB is not set
230# CONFIG_BLK_DEV_INTEGRITY is not set
231
232#
233# Partition Types
234#
235# CONFIG_PARTITION_ADVANCED is not set
236CONFIG_MSDOS_PARTITION=y
177 237
178# 238#
179# IO Schedulers 239# IO Schedulers
180# 240#
181CONFIG_IOSCHED_NOOP=y 241CONFIG_IOSCHED_NOOP=y
182CONFIG_IOSCHED_AS=y
183CONFIG_IOSCHED_DEADLINE=y 242CONFIG_IOSCHED_DEADLINE=y
184CONFIG_IOSCHED_CFQ=y 243CONFIG_IOSCHED_CFQ=m
185CONFIG_DEFAULT_AS=y 244# CONFIG_CFQ_GROUP_IOSCHED is not set
186# CONFIG_DEFAULT_DEADLINE is not set 245CONFIG_DEFAULT_DEADLINE=y
187# CONFIG_DEFAULT_CFQ is not set 246# CONFIG_DEFAULT_CFQ is not set
188# CONFIG_DEFAULT_NOOP is not set 247# CONFIG_DEFAULT_NOOP is not set
189CONFIG_DEFAULT_IOSCHED="anticipatory" 248CONFIG_DEFAULT_IOSCHED="deadline"
190CONFIG_CLASSIC_RCU=y 249# CONFIG_INLINE_SPIN_TRYLOCK is not set
191# CONFIG_PREEMPT_RCU is not set 250# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
192CONFIG_BLK_DEV=y 251# CONFIG_INLINE_SPIN_LOCK is not set
193CONFIG_BLK_DEV_UBD=y 252# CONFIG_INLINE_SPIN_LOCK_BH is not set
194# CONFIG_BLK_DEV_UBD_SYNC is not set 253# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
195CONFIG_BLK_DEV_COW_COMMON=y 254# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
196CONFIG_BLK_DEV_LOOP=m 255CONFIG_INLINE_SPIN_UNLOCK=y
197# CONFIG_BLK_DEV_CRYPTOLOOP is not set 256# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
198CONFIG_BLK_DEV_NBD=m 257CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
199# CONFIG_BLK_DEV_RAM is not set 258# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
200# CONFIG_ATA_OVER_ETH is not set 259# CONFIG_INLINE_READ_TRYLOCK is not set
260# CONFIG_INLINE_READ_LOCK is not set
261# CONFIG_INLINE_READ_LOCK_BH is not set
262# CONFIG_INLINE_READ_LOCK_IRQ is not set
263# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
264CONFIG_INLINE_READ_UNLOCK=y
265# CONFIG_INLINE_READ_UNLOCK_BH is not set
266CONFIG_INLINE_READ_UNLOCK_IRQ=y
267# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
268# CONFIG_INLINE_WRITE_TRYLOCK is not set
269# CONFIG_INLINE_WRITE_LOCK is not set
270# CONFIG_INLINE_WRITE_LOCK_BH is not set
271# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
272# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
273CONFIG_INLINE_WRITE_UNLOCK=y
274# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
275CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
276# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
277# CONFIG_MUTEX_SPIN_ON_OWNER is not set
278CONFIG_FREEZER=y
201 279
202# 280#
203# Character Devices 281# UML Character Devices
204# 282#
205CONFIG_STDERR_CONSOLE=y 283CONFIG_STDERR_CONSOLE=y
206CONFIG_STDIO_CONSOLE=y 284CONFIG_STDIO_CONSOLE=y
@@ -214,40 +292,191 @@ CONFIG_XTERM_CHAN=y
214CONFIG_CON_ZERO_CHAN="fd:0,fd:1" 292CONFIG_CON_ZERO_CHAN="fd:0,fd:1"
215CONFIG_CON_CHAN="xterm" 293CONFIG_CON_CHAN="xterm"
216CONFIG_SSL_CHAN="pts" 294CONFIG_SSL_CHAN="pts"
217CONFIG_UNIX98_PTYS=y
218CONFIG_LEGACY_PTYS=y
219# CONFIG_RAW_DRIVER is not set
220CONFIG_LEGACY_PTY_COUNT=32
221# CONFIG_WATCHDOG is not set
222CONFIG_UML_SOUND=m 295CONFIG_UML_SOUND=m
223CONFIG_SOUND=m 296CONFIG_SOUND=m
297CONFIG_SOUND_OSS_CORE=y
224CONFIG_HOSTAUDIO=m 298CONFIG_HOSTAUDIO=m
225# CONFIG_HW_RANDOM is not set 299
226CONFIG_UML_RANDOM=y 300#
227# CONFIG_MMAPPER is not set 301# Device Drivers
302#
228 303
229# 304#
230# Generic Driver Options 305# Generic Driver Options
231# 306#
232CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 307CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
308CONFIG_DEVTMPFS=y
309CONFIG_DEVTMPFS_MOUNT=y
233CONFIG_STANDALONE=y 310CONFIG_STANDALONE=y
234CONFIG_PREVENT_FIRMWARE_BUILD=y 311CONFIG_PREVENT_FIRMWARE_BUILD=y
235# CONFIG_FW_LOADER is not set 312CONFIG_FW_LOADER=y
313CONFIG_FIRMWARE_IN_KERNEL=y
314CONFIG_EXTRA_FIRMWARE=""
236# CONFIG_DEBUG_DRIVER is not set 315# CONFIG_DEBUG_DRIVER is not set
237# CONFIG_DEBUG_DEVRES is not set 316# CONFIG_DEBUG_DEVRES is not set
238# CONFIG_SYS_HYPERVISOR is not set 317# CONFIG_SYS_HYPERVISOR is not set
318CONFIG_GENERIC_CPU_DEVICES=y
319# CONFIG_DMA_SHARED_BUFFER is not set
320# CONFIG_CONNECTOR is not set
321# CONFIG_MTD is not set
322CONFIG_BLK_DEV=y
323CONFIG_BLK_DEV_UBD=y
324# CONFIG_BLK_DEV_UBD_SYNC is not set
325CONFIG_BLK_DEV_COW_COMMON=y
326CONFIG_BLK_DEV_LOOP=m
327CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
328# CONFIG_BLK_DEV_CRYPTOLOOP is not set
329
330#
331# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
332#
333CONFIG_BLK_DEV_NBD=m
334# CONFIG_BLK_DEV_RAM is not set
335# CONFIG_ATA_OVER_ETH is not set
336# CONFIG_BLK_DEV_RBD is not set
337
338#
339# Misc devices
340#
341# CONFIG_ENCLOSURE_SERVICES is not set
342# CONFIG_C2PORT is not set
343
344#
345# EEPROM support
346#
347# CONFIG_EEPROM_93CX6 is not set
348
349#
350# Texas Instruments shared transport line discipline
351#
352
353#
354# Altera FPGA firmware download module
355#
356
357#
358# SCSI device support
359#
360CONFIG_SCSI_MOD=y
361# CONFIG_RAID_ATTRS is not set
362# CONFIG_SCSI is not set
363# CONFIG_SCSI_DMA is not set
364# CONFIG_SCSI_NETLINK is not set
365# CONFIG_MD is not set
366CONFIG_NETDEVICES=y
367CONFIG_NET_CORE=y
368# CONFIG_BONDING is not set
369CONFIG_DUMMY=m
370# CONFIG_EQUALIZER is not set
371# CONFIG_MII is not set
372# CONFIG_NET_TEAM is not set
373# CONFIG_MACVLAN is not set
374# CONFIG_NETCONSOLE is not set
375# CONFIG_NETPOLL is not set
376# CONFIG_NET_POLL_CONTROLLER is not set
377CONFIG_TUN=m
378# CONFIG_VETH is not set
379
380#
381# CAIF transport drivers
382#
383CONFIG_ETHERNET=y
384CONFIG_NET_VENDOR_CHELSIO=y
385CONFIG_NET_VENDOR_INTEL=y
386CONFIG_NET_VENDOR_I825XX=y
387CONFIG_NET_VENDOR_MARVELL=y
388CONFIG_NET_VENDOR_NATSEMI=y
389CONFIG_NET_VENDOR_8390=y
390# CONFIG_PHYLIB is not set
391CONFIG_PPP=m
392# CONFIG_PPP_BSDCOMP is not set
393# CONFIG_PPP_DEFLATE is not set
394# CONFIG_PPP_FILTER is not set
395# CONFIG_PPP_MPPE is not set
396# CONFIG_PPP_MULTILINK is not set
397# CONFIG_PPPOE is not set
398# CONFIG_PPP_ASYNC is not set
399# CONFIG_PPP_SYNC_TTY is not set
400CONFIG_SLIP=m
401CONFIG_SLHC=m
402# CONFIG_SLIP_COMPRESSED is not set
403# CONFIG_SLIP_SMART is not set
404# CONFIG_SLIP_MODE_SLIP6 is not set
405CONFIG_WLAN=y
406# CONFIG_HOSTAP is not set
407
408#
409# Enable WiMAX (Networking options) to see the WiMAX drivers
410#
411# CONFIG_WAN is not set
412
413#
414# Character devices
415#
416CONFIG_UNIX98_PTYS=y
417# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
418CONFIG_LEGACY_PTYS=y
419CONFIG_LEGACY_PTY_COUNT=32
420# CONFIG_N_GSM is not set
421# CONFIG_TRACE_SINK is not set
422CONFIG_DEVKMEM=y
423# CONFIG_HW_RANDOM is not set
424CONFIG_UML_RANDOM=y
425# CONFIG_R3964 is not set
426# CONFIG_NSC_GPIO is not set
427# CONFIG_RAW_DRIVER is not set
428
429#
430# PPS support
431#
432# CONFIG_PPS is not set
433
434#
435# PPS generators support
436#
437
438#
439# PTP clock support
440#
441
442#
443# Enable Device Drivers -> PPS to see the PTP clock options.
444#
445# CONFIG_POWER_SUPPLY is not set
446# CONFIG_THERMAL is not set
447# CONFIG_WATCHDOG is not set
448# CONFIG_REGULATOR is not set
449CONFIG_SOUND_OSS_CORE_PRECLAIM=y
450# CONFIG_MEMSTICK is not set
451# CONFIG_NEW_LEDS is not set
452# CONFIG_ACCESSIBILITY is not set
453# CONFIG_AUXDISPLAY is not set
454# CONFIG_UIO is not set
455
456#
457# Virtio drivers
458#
459# CONFIG_VIRTIO_BALLOON is not set
460
461#
462# Microsoft Hyper-V guest support
463#
464# CONFIG_STAGING is not set
239 465
240# 466#
241# Networking 467# Hardware Spinlock drivers
242# 468#
469CONFIG_IOMMU_SUPPORT=y
470# CONFIG_VIRT_DRIVERS is not set
471# CONFIG_PM_DEVFREQ is not set
243CONFIG_NET=y 472CONFIG_NET=y
244 473
245# 474#
246# Networking options 475# Networking options
247# 476#
248CONFIG_PACKET=y 477CONFIG_PACKET=y
249CONFIG_PACKET_MMAP=y
250CONFIG_UNIX=y 478CONFIG_UNIX=y
479# CONFIG_UNIX_DIAG is not set
251CONFIG_XFRM=y 480CONFIG_XFRM=y
252# CONFIG_XFRM_USER is not set 481# CONFIG_XFRM_USER is not set
253# CONFIG_XFRM_SUB_POLICY is not set 482# CONFIG_XFRM_SUB_POLICY is not set
@@ -257,10 +486,9 @@ CONFIG_XFRM=y
257CONFIG_INET=y 486CONFIG_INET=y
258# CONFIG_IP_MULTICAST is not set 487# CONFIG_IP_MULTICAST is not set
259# CONFIG_IP_ADVANCED_ROUTER is not set 488# CONFIG_IP_ADVANCED_ROUTER is not set
260CONFIG_IP_FIB_HASH=y
261# CONFIG_IP_PNP is not set 489# CONFIG_IP_PNP is not set
262# CONFIG_NET_IPIP is not set 490# CONFIG_NET_IPIP is not set
263# CONFIG_NET_IPGRE is not set 491# CONFIG_NET_IPGRE_DEMUX is not set
264# CONFIG_ARPD is not set 492# CONFIG_ARPD is not set
265# CONFIG_SYN_COOKIES is not set 493# CONFIG_SYN_COOKIES is not set
266# CONFIG_INET_AH is not set 494# CONFIG_INET_AH is not set
@@ -274,20 +502,23 @@ CONFIG_INET_XFRM_MODE_BEET=y
274# CONFIG_INET_LRO is not set 502# CONFIG_INET_LRO is not set
275CONFIG_INET_DIAG=y 503CONFIG_INET_DIAG=y
276CONFIG_INET_TCP_DIAG=y 504CONFIG_INET_TCP_DIAG=y
505# CONFIG_INET_UDP_DIAG is not set
277# CONFIG_TCP_CONG_ADVANCED is not set 506# CONFIG_TCP_CONG_ADVANCED is not set
278CONFIG_TCP_CONG_CUBIC=y 507CONFIG_TCP_CONG_CUBIC=y
279CONFIG_DEFAULT_TCP_CONG="cubic" 508CONFIG_DEFAULT_TCP_CONG="cubic"
280# CONFIG_TCP_MD5SIG is not set 509# CONFIG_TCP_MD5SIG is not set
281# CONFIG_IPV6 is not set 510# CONFIG_IPV6 is not set
282# CONFIG_INET6_XFRM_TUNNEL is not set
283# CONFIG_INET6_TUNNEL is not set
284# CONFIG_NETWORK_SECMARK is not set 511# CONFIG_NETWORK_SECMARK is not set
512# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
285# CONFIG_NETFILTER is not set 513# CONFIG_NETFILTER is not set
286# CONFIG_IP_DCCP is not set 514# CONFIG_IP_DCCP is not set
287# CONFIG_IP_SCTP is not set 515# CONFIG_IP_SCTP is not set
516# CONFIG_RDS is not set
288# CONFIG_TIPC is not set 517# CONFIG_TIPC is not set
289# CONFIG_ATM is not set 518# CONFIG_ATM is not set
519# CONFIG_L2TP is not set
290# CONFIG_BRIDGE is not set 520# CONFIG_BRIDGE is not set
521# CONFIG_NET_DSA is not set
291# CONFIG_VLAN_8021Q is not set 522# CONFIG_VLAN_8021Q is not set
292# CONFIG_DECNET is not set 523# CONFIG_DECNET is not set
293# CONFIG_LLC2 is not set 524# CONFIG_LLC2 is not set
@@ -297,7 +528,14 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
297# CONFIG_LAPB is not set 528# CONFIG_LAPB is not set
298# CONFIG_ECONET is not set 529# CONFIG_ECONET is not set
299# CONFIG_WAN_ROUTER is not set 530# CONFIG_WAN_ROUTER is not set
531# CONFIG_PHONET is not set
532# CONFIG_IEEE802154 is not set
300# CONFIG_NET_SCHED is not set 533# CONFIG_NET_SCHED is not set
534# CONFIG_DCB is not set
535# CONFIG_BATMAN_ADV is not set
536# CONFIG_OPENVSWITCH is not set
537# CONFIG_NETPRIO_CGROUP is not set
538CONFIG_BQL=y
301 539
302# 540#
303# Network testing 541# Network testing
@@ -308,16 +546,19 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
308# CONFIG_IRDA is not set 546# CONFIG_IRDA is not set
309# CONFIG_BT is not set 547# CONFIG_BT is not set
310# CONFIG_AF_RXRPC is not set 548# CONFIG_AF_RXRPC is not set
549CONFIG_WIRELESS=y
550# CONFIG_CFG80211 is not set
551# CONFIG_LIB80211 is not set
311 552
312# 553#
313# Wireless 554# CFG80211 needs to be enabled for MAC80211
314# 555#
315# CONFIG_CFG80211 is not set 556# CONFIG_WIMAX is not set
316# CONFIG_WIRELESS_EXT is not set
317# CONFIG_MAC80211 is not set
318# CONFIG_IEEE80211 is not set
319# CONFIG_RFKILL is not set 557# CONFIG_RFKILL is not set
320# CONFIG_NET_9P is not set 558# CONFIG_NET_9P is not set
559# CONFIG_CAIF is not set
560# CONFIG_CEPH_LIB is not set
561# CONFIG_NFC is not set
321 562
322# 563#
323# UML Network Devices 564# UML Network Devices
@@ -331,76 +572,51 @@ CONFIG_UML_NET_DAEMON=y
331CONFIG_UML_NET_MCAST=y 572CONFIG_UML_NET_MCAST=y
332# CONFIG_UML_NET_PCAP is not set 573# CONFIG_UML_NET_PCAP is not set
333CONFIG_UML_NET_SLIRP=y 574CONFIG_UML_NET_SLIRP=y
334CONFIG_NETDEVICES=y
335# CONFIG_NETDEVICES_MULTIQUEUE is not set
336CONFIG_DUMMY=m
337# CONFIG_BONDING is not set
338# CONFIG_MACVLAN is not set
339# CONFIG_EQUALIZER is not set
340CONFIG_TUN=m
341# CONFIG_VETH is not set
342
343#
344# Wireless LAN
345#
346# CONFIG_WLAN_PRE80211 is not set
347# CONFIG_WLAN_80211 is not set
348# CONFIG_WAN is not set
349CONFIG_PPP=m
350# CONFIG_PPP_MULTILINK is not set
351# CONFIG_PPP_FILTER is not set
352# CONFIG_PPP_ASYNC is not set
353# CONFIG_PPP_SYNC_TTY is not set
354# CONFIG_PPP_DEFLATE is not set
355# CONFIG_PPP_BSDCOMP is not set
356# CONFIG_PPP_MPPE is not set
357# CONFIG_PPPOE is not set
358# CONFIG_PPPOL2TP is not set
359CONFIG_SLIP=m
360# CONFIG_SLIP_COMPRESSED is not set
361CONFIG_SLHC=m
362# CONFIG_SLIP_SMART is not set
363# CONFIG_SLIP_MODE_SLIP6 is not set
364# CONFIG_NETCONSOLE is not set
365# CONFIG_NETPOLL is not set
366# CONFIG_NET_POLL_CONTROLLER is not set
367# CONFIG_CONNECTOR is not set
368 575
369# 576#
370# File systems 577# File systems
371# 578#
372CONFIG_EXT2_FS=y 579# CONFIG_EXT2_FS is not set
373# CONFIG_EXT2_FS_XATTR is not set 580# CONFIG_EXT3_FS is not set
374# CONFIG_EXT2_FS_XIP is not set 581CONFIG_EXT4_FS=y
375CONFIG_EXT3_FS=y 582CONFIG_EXT4_USE_FOR_EXT23=y
376# CONFIG_EXT3_FS_XATTR is not set 583CONFIG_EXT4_FS_XATTR=y
377# CONFIG_EXT4DEV_FS is not set 584# CONFIG_EXT4_FS_POSIX_ACL is not set
378CONFIG_JBD=y 585# CONFIG_EXT4_FS_SECURITY is not set
586# CONFIG_EXT4_DEBUG is not set
587CONFIG_JBD2=y
588CONFIG_FS_MBCACHE=y
379CONFIG_REISERFS_FS=y 589CONFIG_REISERFS_FS=y
380# CONFIG_REISERFS_CHECK is not set 590# CONFIG_REISERFS_CHECK is not set
381# CONFIG_REISERFS_PROC_INFO is not set 591# CONFIG_REISERFS_PROC_INFO is not set
382# CONFIG_REISERFS_FS_XATTR is not set 592# CONFIG_REISERFS_FS_XATTR is not set
383# CONFIG_JFS_FS is not set 593# CONFIG_JFS_FS is not set
384# CONFIG_FS_POSIX_ACL is not set
385# CONFIG_XFS_FS is not set 594# CONFIG_XFS_FS is not set
386# CONFIG_GFS2_FS is not set 595# CONFIG_GFS2_FS is not set
387# CONFIG_OCFS2_FS is not set 596# CONFIG_BTRFS_FS is not set
388# CONFIG_MINIX_FS is not set 597# CONFIG_NILFS2_FS is not set
389# CONFIG_ROMFS_FS is not set 598# CONFIG_FS_POSIX_ACL is not set
390CONFIG_INOTIFY=y 599CONFIG_FILE_LOCKING=y
600CONFIG_FSNOTIFY=y
601CONFIG_DNOTIFY=y
391CONFIG_INOTIFY_USER=y 602CONFIG_INOTIFY_USER=y
603# CONFIG_FANOTIFY is not set
392CONFIG_QUOTA=y 604CONFIG_QUOTA=y
393# CONFIG_QUOTA_NETLINK_INTERFACE is not set 605# CONFIG_QUOTA_NETLINK_INTERFACE is not set
394CONFIG_PRINT_QUOTA_WARNING=y 606CONFIG_PRINT_QUOTA_WARNING=y
607# CONFIG_QUOTA_DEBUG is not set
395# CONFIG_QFMT_V1 is not set 608# CONFIG_QFMT_V1 is not set
396# CONFIG_QFMT_V2 is not set 609# CONFIG_QFMT_V2 is not set
397CONFIG_QUOTACTL=y 610CONFIG_QUOTACTL=y
398CONFIG_DNOTIFY=y
399CONFIG_AUTOFS_FS=m
400CONFIG_AUTOFS4_FS=m 611CONFIG_AUTOFS4_FS=m
401# CONFIG_FUSE_FS is not set 612# CONFIG_FUSE_FS is not set
402 613
403# 614#
615# Caches
616#
617# CONFIG_FSCACHE is not set
618
619#
404# CD-ROM/DVD Filesystems 620# CD-ROM/DVD Filesystems
405# 621#
406CONFIG_ISO9660_FS=m 622CONFIG_ISO9660_FS=m
@@ -421,15 +637,14 @@ CONFIG_JOLIET=y
421CONFIG_PROC_FS=y 637CONFIG_PROC_FS=y
422CONFIG_PROC_KCORE=y 638CONFIG_PROC_KCORE=y
423CONFIG_PROC_SYSCTL=y 639CONFIG_PROC_SYSCTL=y
640CONFIG_PROC_PAGE_MONITOR=y
424CONFIG_SYSFS=y 641CONFIG_SYSFS=y
425CONFIG_TMPFS=y 642CONFIG_TMPFS=y
426# CONFIG_TMPFS_POSIX_ACL is not set 643# CONFIG_TMPFS_POSIX_ACL is not set
644# CONFIG_TMPFS_XATTR is not set
427# CONFIG_HUGETLB_PAGE is not set 645# CONFIG_HUGETLB_PAGE is not set
428# CONFIG_CONFIGFS_FS is not set 646# CONFIG_CONFIGFS_FS is not set
429 647CONFIG_MISC_FILESYSTEMS=y
430#
431# Miscellaneous filesystems
432#
433# CONFIG_ADFS_FS is not set 648# CONFIG_ADFS_FS is not set
434# CONFIG_AFFS_FS is not set 649# CONFIG_AFFS_FS is not set
435# CONFIG_HFS_FS is not set 650# CONFIG_HFS_FS is not set
@@ -437,26 +652,26 @@ CONFIG_TMPFS=y
437# CONFIG_BEFS_FS is not set 652# CONFIG_BEFS_FS is not set
438# CONFIG_BFS_FS is not set 653# CONFIG_BFS_FS is not set
439# CONFIG_EFS_FS is not set 654# CONFIG_EFS_FS is not set
655# CONFIG_LOGFS is not set
440# CONFIG_CRAMFS is not set 656# CONFIG_CRAMFS is not set
657# CONFIG_SQUASHFS is not set
441# CONFIG_VXFS_FS is not set 658# CONFIG_VXFS_FS is not set
659# CONFIG_MINIX_FS is not set
660# CONFIG_OMFS_FS is not set
442# CONFIG_HPFS_FS is not set 661# CONFIG_HPFS_FS is not set
443# CONFIG_QNX4FS_FS is not set 662# CONFIG_QNX4FS_FS is not set
663# CONFIG_ROMFS_FS is not set
664# CONFIG_PSTORE is not set
444# CONFIG_SYSV_FS is not set 665# CONFIG_SYSV_FS is not set
445# CONFIG_UFS_FS is not set 666# CONFIG_UFS_FS is not set
446CONFIG_NETWORK_FILESYSTEMS=y 667CONFIG_NETWORK_FILESYSTEMS=y
447# CONFIG_NFS_FS is not set 668# CONFIG_NFS_FS is not set
448# CONFIG_NFSD is not set 669# CONFIG_NFSD is not set
449# CONFIG_SMB_FS is not set 670# CONFIG_CEPH_FS is not set
450# CONFIG_CIFS is not set 671# CONFIG_CIFS is not set
451# CONFIG_NCP_FS is not set 672# CONFIG_NCP_FS is not set
452# CONFIG_CODA_FS is not set 673# CONFIG_CODA_FS is not set
453# CONFIG_AFS_FS is not set 674# CONFIG_AFS_FS is not set
454
455#
456# Partition Types
457#
458# CONFIG_PARTITION_ADVANCED is not set
459CONFIG_MSDOS_PARTITION=y
460CONFIG_NLS=y 675CONFIG_NLS=y
461CONFIG_NLS_DEFAULT="iso8859-1" 676CONFIG_NLS_DEFAULT="iso8859-1"
462# CONFIG_NLS_CODEPAGE_437 is not set 677# CONFIG_NLS_CODEPAGE_437 is not set
@@ -497,119 +712,191 @@ CONFIG_NLS_DEFAULT="iso8859-1"
497# CONFIG_NLS_KOI8_R is not set 712# CONFIG_NLS_KOI8_R is not set
498# CONFIG_NLS_KOI8_U is not set 713# CONFIG_NLS_KOI8_U is not set
499# CONFIG_NLS_UTF8 is not set 714# CONFIG_NLS_UTF8 is not set
500# CONFIG_DLM is not set
501 715
502# 716#
503# Security options 717# Security options
504# 718#
505# CONFIG_KEYS is not set 719# CONFIG_KEYS is not set
720# CONFIG_SECURITY_DMESG_RESTRICT is not set
506# CONFIG_SECURITY is not set 721# CONFIG_SECURITY is not set
507# CONFIG_SECURITY_FILE_CAPABILITIES is not set 722# CONFIG_SECURITYFS is not set
723CONFIG_DEFAULT_SECURITY_DAC=y
724CONFIG_DEFAULT_SECURITY=""
508CONFIG_CRYPTO=y 725CONFIG_CRYPTO=y
509# CONFIG_CRYPTO_SEQIV is not set 726
727#
728# Crypto core or helper
729#
730# CONFIG_CRYPTO_FIPS is not set
731CONFIG_CRYPTO_ALGAPI=m
732CONFIG_CRYPTO_ALGAPI2=m
733CONFIG_CRYPTO_RNG=m
734CONFIG_CRYPTO_RNG2=m
510# CONFIG_CRYPTO_MANAGER is not set 735# CONFIG_CRYPTO_MANAGER is not set
736# CONFIG_CRYPTO_MANAGER2 is not set
737# CONFIG_CRYPTO_USER is not set
738# CONFIG_CRYPTO_GF128MUL is not set
739# CONFIG_CRYPTO_NULL is not set
740# CONFIG_CRYPTO_CRYPTD is not set
741# CONFIG_CRYPTO_AUTHENC is not set
742# CONFIG_CRYPTO_TEST is not set
743
744#
745# Authenticated Encryption with Associated Data
746#
747# CONFIG_CRYPTO_CCM is not set
748# CONFIG_CRYPTO_GCM is not set
749# CONFIG_CRYPTO_SEQIV is not set
750
751#
752# Block modes
753#
754# CONFIG_CRYPTO_CBC is not set
755# CONFIG_CRYPTO_CTR is not set
756# CONFIG_CRYPTO_CTS is not set
757# CONFIG_CRYPTO_ECB is not set
758# CONFIG_CRYPTO_LRW is not set
759# CONFIG_CRYPTO_PCBC is not set
760# CONFIG_CRYPTO_XTS is not set
761
762#
763# Hash modes
764#
511# CONFIG_CRYPTO_HMAC is not set 765# CONFIG_CRYPTO_HMAC is not set
512# CONFIG_CRYPTO_XCBC is not set 766# CONFIG_CRYPTO_XCBC is not set
513# CONFIG_CRYPTO_NULL is not set 767# CONFIG_CRYPTO_VMAC is not set
768
769#
770# Digest
771#
772# CONFIG_CRYPTO_CRC32C is not set
773# CONFIG_CRYPTO_GHASH is not set
514# CONFIG_CRYPTO_MD4 is not set 774# CONFIG_CRYPTO_MD4 is not set
515# CONFIG_CRYPTO_MD5 is not set 775# CONFIG_CRYPTO_MD5 is not set
776# CONFIG_CRYPTO_MICHAEL_MIC is not set
777# CONFIG_CRYPTO_RMD128 is not set
778# CONFIG_CRYPTO_RMD160 is not set
779# CONFIG_CRYPTO_RMD256 is not set
780# CONFIG_CRYPTO_RMD320 is not set
516# CONFIG_CRYPTO_SHA1 is not set 781# CONFIG_CRYPTO_SHA1 is not set
517# CONFIG_CRYPTO_SHA256 is not set 782# CONFIG_CRYPTO_SHA256 is not set
518# CONFIG_CRYPTO_SHA512 is not set 783# CONFIG_CRYPTO_SHA512 is not set
519# CONFIG_CRYPTO_WP512 is not set
520# CONFIG_CRYPTO_TGR192 is not set 784# CONFIG_CRYPTO_TGR192 is not set
521# CONFIG_CRYPTO_GF128MUL is not set 785# CONFIG_CRYPTO_WP512 is not set
522# CONFIG_CRYPTO_ECB is not set 786
523# CONFIG_CRYPTO_CBC is not set 787#
524# CONFIG_CRYPTO_PCBC is not set 788# Ciphers
525# CONFIG_CRYPTO_LRW is not set 789#
526# CONFIG_CRYPTO_XTS is not set 790CONFIG_CRYPTO_AES=m
527# CONFIG_CRYPTO_CTR is not set
528# CONFIG_CRYPTO_GCM is not set
529# CONFIG_CRYPTO_CCM is not set
530# CONFIG_CRYPTO_CRYPTD is not set
531# CONFIG_CRYPTO_DES is not set
532# CONFIG_CRYPTO_FCRYPT is not set
533# CONFIG_CRYPTO_BLOWFISH is not set
534# CONFIG_CRYPTO_TWOFISH is not set
535# CONFIG_CRYPTO_TWOFISH_586 is not set
536# CONFIG_CRYPTO_SERPENT is not set
537# CONFIG_CRYPTO_AES is not set
538# CONFIG_CRYPTO_AES_586 is not set 791# CONFIG_CRYPTO_AES_586 is not set
792# CONFIG_CRYPTO_ANUBIS is not set
793# CONFIG_CRYPTO_ARC4 is not set
794# CONFIG_CRYPTO_BLOWFISH is not set
795# CONFIG_CRYPTO_CAMELLIA is not set
539# CONFIG_CRYPTO_CAST5 is not set 796# CONFIG_CRYPTO_CAST5 is not set
540# CONFIG_CRYPTO_CAST6 is not set 797# CONFIG_CRYPTO_CAST6 is not set
541# CONFIG_CRYPTO_TEA is not set 798# CONFIG_CRYPTO_DES is not set
542# CONFIG_CRYPTO_ARC4 is not set 799# CONFIG_CRYPTO_FCRYPT is not set
543# CONFIG_CRYPTO_KHAZAD is not set 800# CONFIG_CRYPTO_KHAZAD is not set
544# CONFIG_CRYPTO_ANUBIS is not set
545# CONFIG_CRYPTO_SEED is not set
546# CONFIG_CRYPTO_SALSA20 is not set 801# CONFIG_CRYPTO_SALSA20 is not set
547# CONFIG_CRYPTO_SALSA20_586 is not set 802# CONFIG_CRYPTO_SALSA20_586 is not set
803# CONFIG_CRYPTO_SEED is not set
804# CONFIG_CRYPTO_SERPENT is not set
805# CONFIG_CRYPTO_TEA is not set
806# CONFIG_CRYPTO_TWOFISH is not set
807# CONFIG_CRYPTO_TWOFISH_586 is not set
808
809#
810# Compression
811#
548# CONFIG_CRYPTO_DEFLATE is not set 812# CONFIG_CRYPTO_DEFLATE is not set
549# CONFIG_CRYPTO_MICHAEL_MIC is not set 813# CONFIG_CRYPTO_ZLIB is not set
550# CONFIG_CRYPTO_CRC32C is not set
551# CONFIG_CRYPTO_CAMELLIA is not set
552# CONFIG_CRYPTO_TEST is not set
553# CONFIG_CRYPTO_AUTHENC is not set
554# CONFIG_CRYPTO_LZO is not set 814# CONFIG_CRYPTO_LZO is not set
815
816#
817# Random Number Generation
818#
819CONFIG_CRYPTO_ANSI_CPRNG=m
820# CONFIG_CRYPTO_USER_API_HASH is not set
821# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
555CONFIG_CRYPTO_HW=y 822CONFIG_CRYPTO_HW=y
823# CONFIG_BINARY_PRINTF is not set
556 824
557# 825#
558# Library routines 826# Library routines
559# 827#
560CONFIG_BITREVERSE=m 828CONFIG_BITREVERSE=y
829CONFIG_GENERIC_FIND_FIRST_BIT=y
830CONFIG_GENERIC_IO=y
561# CONFIG_CRC_CCITT is not set 831# CONFIG_CRC_CCITT is not set
562# CONFIG_CRC16 is not set 832CONFIG_CRC16=y
833# CONFIG_CRC_T10DIF is not set
563# CONFIG_CRC_ITU_T is not set 834# CONFIG_CRC_ITU_T is not set
564CONFIG_CRC32=m 835CONFIG_CRC32=y
565# CONFIG_CRC7 is not set 836# CONFIG_CRC7 is not set
566# CONFIG_LIBCRC32C is not set 837# CONFIG_LIBCRC32C is not set
567CONFIG_PLIST=y 838# CONFIG_CRC8 is not set
568 839# CONFIG_XZ_DEC is not set
569# 840# CONFIG_XZ_DEC_BCJ is not set
570# SCSI device support 841CONFIG_DQL=y
571# 842CONFIG_NLATTR=y
572# CONFIG_RAID_ATTRS is not set 843# CONFIG_AVERAGE is not set
573# CONFIG_SCSI is not set 844# CONFIG_CORDIC is not set
574# CONFIG_SCSI_DMA is not set
575# CONFIG_SCSI_NETLINK is not set
576# CONFIG_MD is not set
577# CONFIG_INPUT is not set
578 845
579# 846#
580# Kernel hacking 847# Kernel hacking
581# 848#
582# CONFIG_PRINTK_TIME is not set 849# CONFIG_PRINTK_TIME is not set
850CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
583CONFIG_ENABLE_WARN_DEPRECATED=y 851CONFIG_ENABLE_WARN_DEPRECATED=y
584CONFIG_ENABLE_MUST_CHECK=y 852CONFIG_ENABLE_MUST_CHECK=y
853CONFIG_FRAME_WARN=1024
854# CONFIG_STRIP_ASM_SYMS is not set
585# CONFIG_UNUSED_SYMBOLS is not set 855# CONFIG_UNUSED_SYMBOLS is not set
586# CONFIG_DEBUG_FS is not set 856# CONFIG_DEBUG_FS is not set
857# CONFIG_DEBUG_SECTION_MISMATCH is not set
587CONFIG_DEBUG_KERNEL=y 858CONFIG_DEBUG_KERNEL=y
588# CONFIG_DEBUG_SHIRQ is not set 859# CONFIG_DEBUG_SHIRQ is not set
589CONFIG_DETECT_SOFTLOCKUP=y 860# CONFIG_LOCKUP_DETECTOR is not set
861# CONFIG_HARDLOCKUP_DETECTOR is not set
862# CONFIG_DETECT_HUNG_TASK is not set
590CONFIG_SCHED_DEBUG=y 863CONFIG_SCHED_DEBUG=y
591# CONFIG_SCHEDSTATS is not set 864# CONFIG_SCHEDSTATS is not set
592# CONFIG_TIMER_STATS is not set 865# CONFIG_TIMER_STATS is not set
866# CONFIG_DEBUG_OBJECTS is not set
593# CONFIG_DEBUG_SLAB is not set 867# CONFIG_DEBUG_SLAB is not set
594# CONFIG_DEBUG_RT_MUTEXES is not set 868# CONFIG_DEBUG_RT_MUTEXES is not set
595# CONFIG_RT_MUTEX_TESTER is not set 869# CONFIG_RT_MUTEX_TESTER is not set
596# CONFIG_DEBUG_SPINLOCK is not set 870# CONFIG_DEBUG_SPINLOCK is not set
597# CONFIG_DEBUG_MUTEXES is not set 871# CONFIG_DEBUG_MUTEXES is not set
598# CONFIG_DEBUG_SPINLOCK_SLEEP is not set 872# CONFIG_SPARSE_RCU_POINTER is not set
873# CONFIG_DEBUG_ATOMIC_SLEEP is not set
599# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set 874# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
875# CONFIG_DEBUG_STACK_USAGE is not set
600# CONFIG_DEBUG_KOBJECT is not set 876# CONFIG_DEBUG_KOBJECT is not set
601CONFIG_DEBUG_BUGVERBOSE=y 877CONFIG_DEBUG_BUGVERBOSE=y
602CONFIG_DEBUG_INFO=y 878CONFIG_DEBUG_INFO=y
879# CONFIG_DEBUG_INFO_REDUCED is not set
603# CONFIG_DEBUG_VM is not set 880# CONFIG_DEBUG_VM is not set
881# CONFIG_DEBUG_WRITECOUNT is not set
882CONFIG_DEBUG_MEMORY_INIT=y
604# CONFIG_DEBUG_LIST is not set 883# CONFIG_DEBUG_LIST is not set
884# CONFIG_TEST_LIST_SORT is not set
605# CONFIG_DEBUG_SG is not set 885# CONFIG_DEBUG_SG is not set
886# CONFIG_DEBUG_NOTIFIERS is not set
887# CONFIG_DEBUG_CREDENTIALS is not set
606CONFIG_FRAME_POINTER=y 888CONFIG_FRAME_POINTER=y
607CONFIG_FORCED_INLINING=y
608# CONFIG_BOOT_PRINTK_DELAY is not set 889# CONFIG_BOOT_PRINTK_DELAY is not set
609# CONFIG_RCU_TORTURE_TEST is not set 890# CONFIG_RCU_TORTURE_TEST is not set
610# CONFIG_BACKTRACE_SELF_TEST is not set 891# CONFIG_BACKTRACE_SELF_TEST is not set
892# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
893# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
611# CONFIG_FAULT_INJECTION is not set 894# CONFIG_FAULT_INJECTION is not set
895# CONFIG_SYSCTL_SYSCALL_CHECK is not set
896# CONFIG_DEBUG_PAGEALLOC is not set
897# CONFIG_ATOMIC64_SELFTEST is not set
612# CONFIG_SAMPLES is not set 898# CONFIG_SAMPLES is not set
899# CONFIG_TEST_KSTRTOX is not set
613# CONFIG_GPROF is not set 900# CONFIG_GPROF is not set
614# CONFIG_GCOV is not set 901# CONFIG_GCOV is not set
615# CONFIG_DEBUG_STACK_USAGE is not set 902CONFIG_EARLY_PRINTK=y
diff --git a/arch/um/drivers/chan.h b/arch/um/drivers/chan.h
index 8df0fd9024dc..02b5a76e98d9 100644
--- a/arch/um/drivers/chan.h
+++ b/arch/um/drivers/chan.h
@@ -27,24 +27,24 @@ struct chan {
27 void *data; 27 void *data;
28}; 28};
29 29
30extern void chan_interrupt(struct list_head *chans, struct delayed_work *task, 30extern void chan_interrupt(struct line *line,
31 struct tty_struct *tty, int irq); 31 struct tty_struct *tty, int irq);
32extern int parse_chan_pair(char *str, struct line *line, int device, 32extern int parse_chan_pair(char *str, struct line *line, int device,
33 const struct chan_opts *opts, char **error_out); 33 const struct chan_opts *opts, char **error_out);
34extern int write_chan(struct list_head *chans, const char *buf, int len, 34extern int write_chan(struct chan *chan, const char *buf, int len,
35 int write_irq); 35 int write_irq);
36extern int console_write_chan(struct list_head *chans, const char *buf, 36extern int console_write_chan(struct chan *chan, const char *buf,
37 int len); 37 int len);
38extern int console_open_chan(struct line *line, struct console *co); 38extern int console_open_chan(struct line *line, struct console *co);
39extern void deactivate_chan(struct list_head *chans, int irq); 39extern void deactivate_chan(struct chan *chan, int irq);
40extern void reactivate_chan(struct list_head *chans, int irq); 40extern void reactivate_chan(struct chan *chan, int irq);
41extern void chan_enable_winch(struct list_head *chans, struct tty_struct *tty); 41extern void chan_enable_winch(struct chan *chan, struct tty_struct *tty);
42extern int enable_chan(struct line *line); 42extern int enable_chan(struct line *line);
43extern void close_chan(struct list_head *chans, int delay_free_irq); 43extern void close_chan(struct line *line);
44extern int chan_window_size(struct list_head *chans, 44extern int chan_window_size(struct line *line,
45 unsigned short *rows_out, 45 unsigned short *rows_out,
46 unsigned short *cols_out); 46 unsigned short *cols_out);
47extern int chan_config_string(struct list_head *chans, char *str, int size, 47extern int chan_config_string(struct line *line, char *str, int size,
48 char **error_out); 48 char **error_out);
49 49
50#endif 50#endif
diff --git a/arch/um/drivers/chan_kern.c b/arch/um/drivers/chan_kern.c
index 420e2c800799..ca4c7ebfd0aa 100644
--- a/arch/um/drivers/chan_kern.c
+++ b/arch/um/drivers/chan_kern.c
@@ -140,18 +140,18 @@ static int open_chan(struct list_head *chans)
140 return err; 140 return err;
141} 141}
142 142
143void chan_enable_winch(struct list_head *chans, struct tty_struct *tty) 143void chan_enable_winch(struct chan *chan, struct tty_struct *tty)
144{ 144{
145 struct list_head *ele; 145 if (chan && chan->primary && chan->ops->winch)
146 struct chan *chan; 146 register_winch(chan->fd, tty);
147}
147 148
148 list_for_each(ele, chans) { 149static void line_timer_cb(struct work_struct *work)
149 chan = list_entry(ele, struct chan, list); 150{
150 if (chan->primary && chan->output && chan->ops->winch) { 151 struct line *line = container_of(work, struct line, task.work);
151 register_winch(chan->fd, tty); 152
152 return; 153 if (!line->throttled)
153 } 154 chan_interrupt(line, line->tty, line->driver->read_irq);
154 }
155} 155}
156 156
157int enable_chan(struct line *line) 157int enable_chan(struct line *line)
@@ -160,6 +160,8 @@ int enable_chan(struct line *line)
160 struct chan *chan; 160 struct chan *chan;
161 int err; 161 int err;
162 162
163 INIT_DELAYED_WORK(&line->task, line_timer_cb);
164
163 list_for_each(ele, &line->chan_list) { 165 list_for_each(ele, &line->chan_list) {
164 chan = list_entry(ele, struct chan, list); 166 chan = list_entry(ele, struct chan, list);
165 err = open_one_chan(chan); 167 err = open_one_chan(chan);
@@ -183,7 +185,7 @@ int enable_chan(struct line *line)
183 return 0; 185 return 0;
184 186
185 out_close: 187 out_close:
186 close_chan(&line->chan_list, 0); 188 close_chan(line);
187 return err; 189 return err;
188} 190}
189 191
@@ -244,7 +246,7 @@ static void close_one_chan(struct chan *chan, int delay_free_irq)
244 chan->fd = -1; 246 chan->fd = -1;
245} 247}
246 248
247void close_chan(struct list_head *chans, int delay_free_irq) 249void close_chan(struct line *line)
248{ 250{
249 struct chan *chan; 251 struct chan *chan;
250 252
@@ -253,77 +255,50 @@ void close_chan(struct list_head *chans, int delay_free_irq)
253 * state. Then, the first one opened will have the original state, 255 * state. Then, the first one opened will have the original state,
254 * so it must be the last closed. 256 * so it must be the last closed.
255 */ 257 */
256 list_for_each_entry_reverse(chan, chans, list) { 258 list_for_each_entry_reverse(chan, &line->chan_list, list) {
257 close_one_chan(chan, delay_free_irq); 259 close_one_chan(chan, 0);
258 } 260 }
259} 261}
260 262
261void deactivate_chan(struct list_head *chans, int irq) 263void deactivate_chan(struct chan *chan, int irq)
262{ 264{
263 struct list_head *ele; 265 if (chan && chan->enabled)
264 266 deactivate_fd(chan->fd, irq);
265 struct chan *chan;
266 list_for_each(ele, chans) {
267 chan = list_entry(ele, struct chan, list);
268
269 if (chan->enabled && chan->input)
270 deactivate_fd(chan->fd, irq);
271 }
272} 267}
273 268
274void reactivate_chan(struct list_head *chans, int irq) 269void reactivate_chan(struct chan *chan, int irq)
275{ 270{
276 struct list_head *ele; 271 if (chan && chan->enabled)
277 struct chan *chan; 272 reactivate_fd(chan->fd, irq);
278
279 list_for_each(ele, chans) {
280 chan = list_entry(ele, struct chan, list);
281
282 if (chan->enabled && chan->input)
283 reactivate_fd(chan->fd, irq);
284 }
285} 273}
286 274
287int write_chan(struct list_head *chans, const char *buf, int len, 275int write_chan(struct chan *chan, const char *buf, int len,
288 int write_irq) 276 int write_irq)
289{ 277{
290 struct list_head *ele;
291 struct chan *chan = NULL;
292 int n, ret = 0; 278 int n, ret = 0;
293 279
294 if (len == 0) 280 if (len == 0 || !chan || !chan->ops->write)
295 return 0; 281 return 0;
296 282
297 list_for_each(ele, chans) { 283 n = chan->ops->write(chan->fd, buf, len, chan->data);
298 chan = list_entry(ele, struct chan, list); 284 if (chan->primary) {
299 if (!chan->output || (chan->ops->write == NULL)) 285 ret = n;
300 continue; 286 if ((ret == -EAGAIN) || ((ret >= 0) && (ret < len)))
301 287 reactivate_fd(chan->fd, write_irq);
302 n = chan->ops->write(chan->fd, buf, len, chan->data);
303 if (chan->primary) {
304 ret = n;
305 if ((ret == -EAGAIN) || ((ret >= 0) && (ret < len)))
306 reactivate_fd(chan->fd, write_irq);
307 }
308 } 288 }
309 return ret; 289 return ret;
310} 290}
311 291
312int console_write_chan(struct list_head *chans, const char *buf, int len) 292int console_write_chan(struct chan *chan, const char *buf, int len)
313{ 293{
314 struct list_head *ele;
315 struct chan *chan;
316 int n, ret = 0; 294 int n, ret = 0;
317 295
318 list_for_each(ele, chans) { 296 if (!chan || !chan->ops->console_write)
319 chan = list_entry(ele, struct chan, list); 297 return 0;
320 if (!chan->output || (chan->ops->console_write == NULL))
321 continue;
322 298
323 n = chan->ops->console_write(chan->fd, buf, len); 299 n = chan->ops->console_write(chan->fd, buf, len);
324 if (chan->primary) 300 if (chan->primary)
325 ret = n; 301 ret = n;
326 }
327 return ret; 302 return ret;
328} 303}
329 304
@@ -340,20 +315,24 @@ int console_open_chan(struct line *line, struct console *co)
340 return 0; 315 return 0;
341} 316}
342 317
343int chan_window_size(struct list_head *chans, unsigned short *rows_out, 318int chan_window_size(struct line *line, unsigned short *rows_out,
344 unsigned short *cols_out) 319 unsigned short *cols_out)
345{ 320{
346 struct list_head *ele;
347 struct chan *chan; 321 struct chan *chan;
348 322
349 list_for_each(ele, chans) { 323 chan = line->chan_in;
350 chan = list_entry(ele, struct chan, list); 324 if (chan && chan->primary) {
351 if (chan->primary) { 325 if (chan->ops->window_size == NULL)
352 if (chan->ops->window_size == NULL) 326 return 0;
353 return 0; 327 return chan->ops->window_size(chan->fd, chan->data,
354 return chan->ops->window_size(chan->fd, chan->data, 328 rows_out, cols_out);
355 rows_out, cols_out); 329 }
356 } 330 chan = line->chan_out;
331 if (chan && chan->primary) {
332 if (chan->ops->window_size == NULL)
333 return 0;
334 return chan->ops->window_size(chan->fd, chan->data,
335 rows_out, cols_out);
357 } 336 }
358 return 0; 337 return 0;
359} 338}
@@ -429,21 +408,15 @@ static int chan_pair_config_string(struct chan *in, struct chan *out,
429 return n; 408 return n;
430} 409}
431 410
432int chan_config_string(struct list_head *chans, char *str, int size, 411int chan_config_string(struct line *line, char *str, int size,
433 char **error_out) 412 char **error_out)
434{ 413{
435 struct list_head *ele; 414 struct chan *in = line->chan_in, *out = line->chan_out;
436 struct chan *chan, *in = NULL, *out = NULL;
437 415
438 list_for_each(ele, chans) { 416 if (in && !in->primary)
439 chan = list_entry(ele, struct chan, list); 417 in = NULL;
440 if (!chan->primary) 418 if (out && !out->primary)
441 continue; 419 out = NULL;
442 if (chan->input)
443 in = chan;
444 if (chan->output)
445 out = chan;
446 }
447 420
448 return chan_pair_config_string(in, out, str, size, error_out); 421 return chan_pair_config_string(in, out, str, size, error_out);
449} 422}
@@ -547,10 +520,14 @@ int parse_chan_pair(char *str, struct line *line, int device,
547 char *in, *out; 520 char *in, *out;
548 521
549 if (!list_empty(chans)) { 522 if (!list_empty(chans)) {
523 line->chan_in = line->chan_out = NULL;
550 free_chan(chans); 524 free_chan(chans);
551 INIT_LIST_HEAD(chans); 525 INIT_LIST_HEAD(chans);
552 } 526 }
553 527
528 if (!str)
529 return 0;
530
554 out = strchr(str, ','); 531 out = strchr(str, ',');
555 if (out != NULL) { 532 if (out != NULL) {
556 in = str; 533 in = str;
@@ -562,6 +539,7 @@ int parse_chan_pair(char *str, struct line *line, int device,
562 539
563 new->input = 1; 540 new->input = 1;
564 list_add(&new->list, chans); 541 list_add(&new->list, chans);
542 line->chan_in = new;
565 543
566 new = parse_chan(line, out, device, opts, error_out); 544 new = parse_chan(line, out, device, opts, error_out);
567 if (new == NULL) 545 if (new == NULL)
@@ -569,6 +547,7 @@ int parse_chan_pair(char *str, struct line *line, int device,
569 547
570 list_add(&new->list, chans); 548 list_add(&new->list, chans);
571 new->output = 1; 549 new->output = 1;
550 line->chan_out = new;
572 } 551 }
573 else { 552 else {
574 new = parse_chan(line, str, device, opts, error_out); 553 new = parse_chan(line, str, device, opts, error_out);
@@ -578,43 +557,42 @@ int parse_chan_pair(char *str, struct line *line, int device,
578 list_add(&new->list, chans); 557 list_add(&new->list, chans);
579 new->input = 1; 558 new->input = 1;
580 new->output = 1; 559 new->output = 1;
560 line->chan_in = line->chan_out = new;
581 } 561 }
582 return 0; 562 return 0;
583} 563}
584 564
585void chan_interrupt(struct list_head *chans, struct delayed_work *task, 565void chan_interrupt(struct line *line, struct tty_struct *tty, int irq)
586 struct tty_struct *tty, int irq)
587{ 566{
588 struct list_head *ele, *next; 567 struct chan *chan = line->chan_in;
589 struct chan *chan;
590 int err; 568 int err;
591 char c; 569 char c;
592 570
593 list_for_each_safe(ele, next, chans) { 571 if (!chan || !chan->ops->read)
594 chan = list_entry(ele, struct chan, list); 572 goto out;
595 if (!chan->input || (chan->ops->read == NULL)) 573
596 continue; 574 do {
597 do { 575 if (tty && !tty_buffer_request_room(tty, 1)) {
598 if (tty && !tty_buffer_request_room(tty, 1)) { 576 schedule_delayed_work(&line->task, 1);
599 schedule_delayed_work(task, 1); 577 goto out;
600 goto out;
601 }
602 err = chan->ops->read(chan->fd, &c, chan->data);
603 if (err > 0)
604 tty_receive_char(tty, c);
605 } while (err > 0);
606
607 if (err == 0)
608 reactivate_fd(chan->fd, irq);
609 if (err == -EIO) {
610 if (chan->primary) {
611 if (tty != NULL)
612 tty_hangup(tty);
613 close_chan(chans, 1);
614 return;
615 }
616 else close_one_chan(chan, 1);
617 } 578 }
579 err = chan->ops->read(chan->fd, &c, chan->data);
580 if (err > 0)
581 tty_receive_char(tty, c);
582 } while (err > 0);
583
584 if (err == 0)
585 reactivate_fd(chan->fd, irq);
586 if (err == -EIO) {
587 if (chan->primary) {
588 if (tty != NULL)
589 tty_hangup(tty);
590 if (line->chan_out != chan)
591 close_one_chan(line->chan_out, 1);
592 }
593 close_one_chan(chan, 1);
594 if (chan->primary)
595 return;
618 } 596 }
619 out: 597 out:
620 if (tty) 598 if (tty)
diff --git a/arch/um/drivers/chan_user.h b/arch/um/drivers/chan_user.h
index 9b9ced85b703..6257b7a6e1af 100644
--- a/arch/um/drivers/chan_user.h
+++ b/arch/um/drivers/chan_user.h
@@ -14,8 +14,6 @@ struct chan_opts {
14 const int raw; 14 const int raw;
15}; 15};
16 16
17enum chan_init_pri { INIT_STATIC, INIT_ALL, INIT_ONE };
18
19struct chan_ops { 17struct chan_ops {
20 char *type; 18 char *type;
21 void *(*init)(char *, int, const struct chan_opts *); 19 void *(*init)(char *, int, const struct chan_opts *);
diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c
index c1cf2206b84b..4ab0d9c0911c 100644
--- a/arch/um/drivers/line.c
+++ b/arch/um/drivers/line.c
@@ -21,19 +21,10 @@ static irqreturn_t line_interrupt(int irq, void *data)
21 struct line *line = chan->line; 21 struct line *line = chan->line;
22 22
23 if (line) 23 if (line)
24 chan_interrupt(&line->chan_list, &line->task, line->tty, irq); 24 chan_interrupt(line, line->tty, irq);
25 return IRQ_HANDLED; 25 return IRQ_HANDLED;
26} 26}
27 27
28static void line_timer_cb(struct work_struct *work)
29{
30 struct line *line = container_of(work, struct line, task.work);
31
32 if (!line->throttled)
33 chan_interrupt(&line->chan_list, &line->task, line->tty,
34 line->driver->read_irq);
35}
36
37/* 28/*
38 * Returns the free space inside the ring buffer of this line. 29 * Returns the free space inside the ring buffer of this line.
39 * 30 *
@@ -145,7 +136,7 @@ static int flush_buffer(struct line *line)
145 /* line->buffer + LINE_BUFSIZE is the end of the buffer! */ 136 /* line->buffer + LINE_BUFSIZE is the end of the buffer! */
146 count = line->buffer + LINE_BUFSIZE - line->head; 137 count = line->buffer + LINE_BUFSIZE - line->head;
147 138
148 n = write_chan(&line->chan_list, line->head, count, 139 n = write_chan(line->chan_out, line->head, count,
149 line->driver->write_irq); 140 line->driver->write_irq);
150 if (n < 0) 141 if (n < 0)
151 return n; 142 return n;
@@ -162,7 +153,7 @@ static int flush_buffer(struct line *line)
162 } 153 }
163 154
164 count = line->tail - line->head; 155 count = line->tail - line->head;
165 n = write_chan(&line->chan_list, line->head, count, 156 n = write_chan(line->chan_out, line->head, count,
166 line->driver->write_irq); 157 line->driver->write_irq);
167 158
168 if (n < 0) 159 if (n < 0)
@@ -206,7 +197,7 @@ int line_write(struct tty_struct *tty, const unsigned char *buf, int len)
206 if (line->head != line->tail) 197 if (line->head != line->tail)
207 ret = buffer_data(line, buf, len); 198 ret = buffer_data(line, buf, len);
208 else { 199 else {
209 n = write_chan(&line->chan_list, buf, len, 200 n = write_chan(line->chan_out, buf, len,
210 line->driver->write_irq); 201 line->driver->write_irq);
211 if (n < 0) { 202 if (n < 0) {
212 ret = n; 203 ret = n;
@@ -318,7 +309,7 @@ void line_throttle(struct tty_struct *tty)
318{ 309{
319 struct line *line = tty->driver_data; 310 struct line *line = tty->driver_data;
320 311
321 deactivate_chan(&line->chan_list, line->driver->read_irq); 312 deactivate_chan(line->chan_in, line->driver->read_irq);
322 line->throttled = 1; 313 line->throttled = 1;
323} 314}
324 315
@@ -327,8 +318,7 @@ void line_unthrottle(struct tty_struct *tty)
327 struct line *line = tty->driver_data; 318 struct line *line = tty->driver_data;
328 319
329 line->throttled = 0; 320 line->throttled = 0;
330 chan_interrupt(&line->chan_list, &line->task, tty, 321 chan_interrupt(line, tty, line->driver->read_irq);
331 line->driver->read_irq);
332 322
333 /* 323 /*
334 * Maybe there is enough stuff pending that calling the interrupt 324 * Maybe there is enough stuff pending that calling the interrupt
@@ -336,7 +326,7 @@ void line_unthrottle(struct tty_struct *tty)
336 * again and we shouldn't turn the interrupt back on. 326 * again and we shouldn't turn the interrupt back on.
337 */ 327 */
338 if (!line->throttled) 328 if (!line->throttled)
339 reactivate_chan(&line->chan_list, line->driver->read_irq); 329 reactivate_chan(line->chan_in, line->driver->read_irq);
340} 330}
341 331
342static irqreturn_t line_write_interrupt(int irq, void *data) 332static irqreturn_t line_write_interrupt(int irq, void *data)
@@ -347,13 +337,14 @@ static irqreturn_t line_write_interrupt(int irq, void *data)
347 int err; 337 int err;
348 338
349 /* 339 /*
350 * Interrupts are disabled here because we registered the interrupt with 340 * Interrupts are disabled here because genirq keep irqs disabled when
351 * IRQF_DISABLED (see line_setup_irq). 341 * calling the action handler.
352 */ 342 */
353 343
354 spin_lock(&line->lock); 344 spin_lock(&line->lock);
355 err = flush_buffer(line); 345 err = flush_buffer(line);
356 if (err == 0) { 346 if (err == 0) {
347 spin_unlock(&line->lock);
357 return IRQ_NONE; 348 return IRQ_NONE;
358 } else if (err < 0) { 349 } else if (err < 0) {
359 line->head = line->buffer; 350 line->head = line->buffer;
@@ -371,7 +362,7 @@ static irqreturn_t line_write_interrupt(int irq, void *data)
371int line_setup_irq(int fd, int input, int output, struct line *line, void *data) 362int line_setup_irq(int fd, int input, int output, struct line *line, void *data)
372{ 363{
373 const struct line_driver *driver = line->driver; 364 const struct line_driver *driver = line->driver;
374 int err = 0, flags = IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM; 365 int err = 0, flags = IRQF_SHARED | IRQF_SAMPLE_RANDOM;
375 366
376 if (input) 367 if (input)
377 err = um_request_irq(driver->read_irq, fd, IRQ_READ, 368 err = um_request_irq(driver->read_irq, fd, IRQ_READ,
@@ -383,7 +374,6 @@ int line_setup_irq(int fd, int input, int output, struct line *line, void *data)
383 err = um_request_irq(driver->write_irq, fd, IRQ_WRITE, 374 err = um_request_irq(driver->write_irq, fd, IRQ_WRITE,
384 line_write_interrupt, flags, 375 line_write_interrupt, flags,
385 driver->write_irq_name, data); 376 driver->write_irq_name, data);
386 line->have_irq = 1;
387 return err; 377 return err;
388} 378}
389 379
@@ -409,7 +399,7 @@ int line_open(struct line *lines, struct tty_struct *tty)
409 struct line *line = &lines[tty->index]; 399 struct line *line = &lines[tty->index];
410 int err = -ENODEV; 400 int err = -ENODEV;
411 401
412 spin_lock(&line->count_lock); 402 mutex_lock(&line->count_lock);
413 if (!line->valid) 403 if (!line->valid)
414 goto out_unlock; 404 goto out_unlock;
415 405
@@ -421,25 +411,19 @@ int line_open(struct line *lines, struct tty_struct *tty)
421 tty->driver_data = line; 411 tty->driver_data = line;
422 line->tty = tty; 412 line->tty = tty;
423 413
424 spin_unlock(&line->count_lock);
425 err = enable_chan(line); 414 err = enable_chan(line);
426 if (err) /* line_close() will be called by our caller */ 415 if (err) /* line_close() will be called by our caller */
427 return err; 416 goto out_unlock;
428
429 INIT_DELAYED_WORK(&line->task, line_timer_cb);
430 417
431 if (!line->sigio) { 418 if (!line->sigio) {
432 chan_enable_winch(&line->chan_list, tty); 419 chan_enable_winch(line->chan_out, tty);
433 line->sigio = 1; 420 line->sigio = 1;
434 } 421 }
435 422
436 chan_window_size(&line->chan_list, &tty->winsize.ws_row, 423 chan_window_size(line, &tty->winsize.ws_row,
437 &tty->winsize.ws_col); 424 &tty->winsize.ws_col);
438
439 return 0;
440
441out_unlock: 425out_unlock:
442 spin_unlock(&line->count_lock); 426 mutex_unlock(&line->count_lock);
443 return err; 427 return err;
444} 428}
445 429
@@ -459,7 +443,7 @@ void line_close(struct tty_struct *tty, struct file * filp)
459 /* We ignore the error anyway! */ 443 /* We ignore the error anyway! */
460 flush_buffer(line); 444 flush_buffer(line);
461 445
462 spin_lock(&line->count_lock); 446 mutex_lock(&line->count_lock);
463 BUG_ON(!line->valid); 447 BUG_ON(!line->valid);
464 448
465 if (--line->count) 449 if (--line->count)
@@ -468,17 +452,13 @@ void line_close(struct tty_struct *tty, struct file * filp)
468 line->tty = NULL; 452 line->tty = NULL;
469 tty->driver_data = NULL; 453 tty->driver_data = NULL;
470 454
471 spin_unlock(&line->count_lock);
472
473 if (line->sigio) { 455 if (line->sigio) {
474 unregister_winch(tty); 456 unregister_winch(tty);
475 line->sigio = 0; 457 line->sigio = 0;
476 } 458 }
477 459
478 return;
479
480out_unlock: 460out_unlock:
481 spin_unlock(&line->count_lock); 461 mutex_unlock(&line->count_lock);
482} 462}
483 463
484void close_lines(struct line *lines, int nlines) 464void close_lines(struct line *lines, int nlines)
@@ -486,34 +466,60 @@ void close_lines(struct line *lines, int nlines)
486 int i; 466 int i;
487 467
488 for(i = 0; i < nlines; i++) 468 for(i = 0; i < nlines; i++)
489 close_chan(&lines[i].chan_list, 0); 469 close_chan(&lines[i]);
490} 470}
491 471
492static int setup_one_line(struct line *lines, int n, char *init, int init_prio, 472int setup_one_line(struct line *lines, int n, char *init,
493 char **error_out) 473 const struct chan_opts *opts, char **error_out)
494{ 474{
495 struct line *line = &lines[n]; 475 struct line *line = &lines[n];
476 struct tty_driver *driver = line->driver->driver;
496 int err = -EINVAL; 477 int err = -EINVAL;
497 478
498 spin_lock(&line->count_lock); 479 mutex_lock(&line->count_lock);
499 480
500 if (line->count) { 481 if (line->count) {
501 *error_out = "Device is already open"; 482 *error_out = "Device is already open";
502 goto out; 483 goto out;
503 } 484 }
504 485
505 if (line->init_pri <= init_prio) { 486 if (!strcmp(init, "none")) {
506 line->init_pri = init_prio; 487 if (line->valid) {
507 if (!strcmp(init, "none")) 488 line->valid = 0;
489 kfree(line->init_str);
490 tty_unregister_device(driver, n);
491 parse_chan_pair(NULL, line, n, opts, error_out);
492 err = 0;
493 }
494 } else {
495 char *new = kstrdup(init, GFP_KERNEL);
496 if (!new) {
497 *error_out = "Failed to allocate memory";
498 return -ENOMEM;
499 }
500 if (line->valid) {
501 tty_unregister_device(driver, n);
502 kfree(line->init_str);
503 }
504 line->init_str = new;
505 line->valid = 1;
506 err = parse_chan_pair(new, line, n, opts, error_out);
507 if (!err) {
508 struct device *d = tty_register_device(driver, n, NULL);
509 if (IS_ERR(d)) {
510 *error_out = "Failed to register device";
511 err = PTR_ERR(d);
512 parse_chan_pair(NULL, line, n, opts, error_out);
513 }
514 }
515 if (err) {
516 line->init_str = NULL;
508 line->valid = 0; 517 line->valid = 0;
509 else { 518 kfree(new);
510 line->init_str = init;
511 line->valid = 1;
512 } 519 }
513 } 520 }
514 err = 0;
515out: 521out:
516 spin_unlock(&line->count_lock); 522 mutex_unlock(&line->count_lock);
517 return err; 523 return err;
518} 524}
519 525
@@ -524,54 +530,43 @@ out:
524 * @error_out is an error string in the case of failure; 530 * @error_out is an error string in the case of failure;
525 */ 531 */
526 532
527int line_setup(struct line *lines, unsigned int num, char *init, 533int line_setup(char **conf, unsigned int num, char **def,
528 char **error_out) 534 char *init, char *name)
529{ 535{
530 int i, n, err; 536 char *error;
531 char *end;
532 537
533 if (*init == '=') { 538 if (*init == '=') {
534 /* 539 /*
535 * We said con=/ssl= instead of con#=, so we are configuring all 540 * We said con=/ssl= instead of con#=, so we are configuring all
536 * consoles at once. 541 * consoles at once.
537 */ 542 */
538 n = -1; 543 *def = init + 1;
539 } 544 } else {
540 else { 545 char *end;
541 n = simple_strtoul(init, &end, 0); 546 unsigned n = simple_strtoul(init, &end, 0);
547
542 if (*end != '=') { 548 if (*end != '=') {
543 *error_out = "Couldn't parse device number"; 549 error = "Couldn't parse device number";
544 return -EINVAL; 550 goto out;
545 } 551 }
546 init = end; 552 if (n >= num) {
547 } 553 error = "Device number out of range";
548 init++; 554 goto out;
549
550 if (n >= (signed int) num) {
551 *error_out = "Device number out of range";
552 return -EINVAL;
553 }
554 else if (n >= 0) {
555 err = setup_one_line(lines, n, init, INIT_ONE, error_out);
556 if (err)
557 return err;
558 }
559 else {
560 for(i = 0; i < num; i++) {
561 err = setup_one_line(lines, i, init, INIT_ALL,
562 error_out);
563 if (err)
564 return err;
565 } 555 }
556 conf[n] = end + 1;
566 } 557 }
567 return n == -1 ? num : n; 558 return 0;
559
560out:
561 printk(KERN_ERR "Failed to set up %s with "
562 "configuration string \"%s\" : %s\n", name, init, error);
563 return -EINVAL;
568} 564}
569 565
570int line_config(struct line *lines, unsigned int num, char *str, 566int line_config(struct line *lines, unsigned int num, char *str,
571 const struct chan_opts *opts, char **error_out) 567 const struct chan_opts *opts, char **error_out)
572{ 568{
573 struct line *line; 569 char *end;
574 char *new;
575 int n; 570 int n;
576 571
577 if (*str == '=') { 572 if (*str == '=') {
@@ -579,17 +574,17 @@ int line_config(struct line *lines, unsigned int num, char *str,
579 return -EINVAL; 574 return -EINVAL;
580 } 575 }
581 576
582 new = kstrdup(str, GFP_KERNEL); 577 n = simple_strtoul(str, &end, 0);
583 if (new == NULL) { 578 if (*end++ != '=') {
584 *error_out = "Failed to allocate memory"; 579 *error_out = "Couldn't parse device number";
585 return -ENOMEM; 580 return -EINVAL;
581 }
582 if (n >= num) {
583 *error_out = "Device number out of range";
584 return -EINVAL;
586 } 585 }
587 n = line_setup(lines, num, new, error_out);
588 if (n < 0)
589 return n;
590 586
591 line = &lines[n]; 587 return setup_one_line(lines, n, end, opts, error_out);
592 return parse_chan_pair(line->init_str, line, n, opts, error_out);
593} 588}
594 589
595int line_get_config(char *name, struct line *lines, unsigned int num, char *str, 590int line_get_config(char *name, struct line *lines, unsigned int num, char *str,
@@ -612,13 +607,13 @@ int line_get_config(char *name, struct line *lines, unsigned int num, char *str,
612 607
613 line = &lines[dev]; 608 line = &lines[dev];
614 609
615 spin_lock(&line->count_lock); 610 mutex_lock(&line->count_lock);
616 if (!line->valid) 611 if (!line->valid)
617 CONFIG_CHUNK(str, size, n, "none", 1); 612 CONFIG_CHUNK(str, size, n, "none", 1);
618 else if (line->tty == NULL) 613 else if (line->tty == NULL)
619 CONFIG_CHUNK(str, size, n, line->init_str, 1); 614 CONFIG_CHUNK(str, size, n, line->init_str, 1);
620 else n = chan_config_string(&line->chan_list, str, size, error_out); 615 else n = chan_config_string(line, str, size, error_out);
621 spin_unlock(&line->count_lock); 616 mutex_unlock(&line->count_lock);
622 617
623 return n; 618 return n;
624} 619}
@@ -640,25 +635,23 @@ int line_id(char **str, int *start_out, int *end_out)
640 635
641int line_remove(struct line *lines, unsigned int num, int n, char **error_out) 636int line_remove(struct line *lines, unsigned int num, int n, char **error_out)
642{ 637{
643 int err; 638 if (n >= num) {
644 char config[sizeof("conxxxx=none\0")]; 639 *error_out = "Device number out of range";
645 640 return -EINVAL;
646 sprintf(config, "%d=none", n); 641 }
647 err = line_setup(lines, num, config, error_out); 642 return setup_one_line(lines, n, "none", NULL, error_out);
648 if (err >= 0)
649 err = 0;
650 return err;
651} 643}
652 644
653struct tty_driver *register_lines(struct line_driver *line_driver, 645int register_lines(struct line_driver *line_driver,
654 const struct tty_operations *ops, 646 const struct tty_operations *ops,
655 struct line *lines, int nlines) 647 struct line *lines, int nlines)
656{ 648{
657 int i;
658 struct tty_driver *driver = alloc_tty_driver(nlines); 649 struct tty_driver *driver = alloc_tty_driver(nlines);
650 int err;
651 int i;
659 652
660 if (!driver) 653 if (!driver)
661 return NULL; 654 return -ENOMEM;
662 655
663 driver->driver_name = line_driver->name; 656 driver->driver_name = line_driver->name;
664 driver->name = line_driver->device_name; 657 driver->name = line_driver->device_name;
@@ -666,54 +659,33 @@ struct tty_driver *register_lines(struct line_driver *line_driver,
666 driver->minor_start = line_driver->minor_start; 659 driver->minor_start = line_driver->minor_start;
667 driver->type = line_driver->type; 660 driver->type = line_driver->type;
668 driver->subtype = line_driver->subtype; 661 driver->subtype = line_driver->subtype;
669 driver->flags = TTY_DRIVER_REAL_RAW; 662 driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
670 driver->init_termios = tty_std_termios; 663 driver->init_termios = tty_std_termios;
664
665 for (i = 0; i < nlines; i++) {
666 spin_lock_init(&lines[i].lock);
667 mutex_init(&lines[i].count_lock);
668 lines[i].driver = line_driver;
669 INIT_LIST_HEAD(&lines[i].chan_list);
670 }
671 tty_set_operations(driver, ops); 671 tty_set_operations(driver, ops);
672 672
673 if (tty_register_driver(driver)) { 673 err = tty_register_driver(driver);
674 if (err) {
674 printk(KERN_ERR "register_lines : can't register %s driver\n", 675 printk(KERN_ERR "register_lines : can't register %s driver\n",
675 line_driver->name); 676 line_driver->name);
676 put_tty_driver(driver); 677 put_tty_driver(driver);
677 return NULL; 678 return err;
678 }
679
680 for(i = 0; i < nlines; i++) {
681 if (!lines[i].valid)
682 tty_unregister_device(driver, i);
683 } 679 }
684 680
681 line_driver->driver = driver;
685 mconsole_register_dev(&line_driver->mc); 682 mconsole_register_dev(&line_driver->mc);
686 return driver; 683 return 0;
687} 684}
688 685
689static DEFINE_SPINLOCK(winch_handler_lock); 686static DEFINE_SPINLOCK(winch_handler_lock);
690static LIST_HEAD(winch_handlers); 687static LIST_HEAD(winch_handlers);
691 688
692void lines_init(struct line *lines, int nlines, struct chan_opts *opts)
693{
694 struct line *line;
695 char *error;
696 int i;
697
698 for(i = 0; i < nlines; i++) {
699 line = &lines[i];
700 INIT_LIST_HEAD(&line->chan_list);
701
702 if (line->init_str == NULL)
703 continue;
704
705 line->init_str = kstrdup(line->init_str, GFP_KERNEL);
706 if (line->init_str == NULL)
707 printk(KERN_ERR "lines_init - kstrdup returned NULL\n");
708
709 if (parse_chan_pair(line->init_str, line, i, opts, &error)) {
710 printk(KERN_ERR "parse_chan_pair failed for "
711 "device %d : %s\n", i, error);
712 line->valid = 0;
713 }
714 }
715}
716
717struct winch { 689struct winch {
718 struct list_head list; 690 struct list_head list;
719 int fd; 691 int fd;
@@ -777,7 +749,7 @@ static irqreturn_t winch_interrupt(int irq, void *data)
777 if (tty != NULL) { 749 if (tty != NULL) {
778 line = tty->driver_data; 750 line = tty->driver_data;
779 if (line != NULL) { 751 if (line != NULL) {
780 chan_window_size(&line->chan_list, &tty->winsize.ws_row, 752 chan_window_size(line, &tty->winsize.ws_row,
781 &tty->winsize.ws_col); 753 &tty->winsize.ws_col);
782 kill_pgrp(tty->pgrp, SIGWINCH, 1); 754 kill_pgrp(tty->pgrp, SIGWINCH, 1);
783 } 755 }
@@ -807,7 +779,7 @@ void register_winch_irq(int fd, int tty_fd, int pid, struct tty_struct *tty,
807 .stack = stack }); 779 .stack = stack });
808 780
809 if (um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt, 781 if (um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt,
810 IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, 782 IRQF_SHARED | IRQF_SAMPLE_RANDOM,
811 "winch", winch) < 0) { 783 "winch", winch) < 0) {
812 printk(KERN_ERR "register_winch_irq - failed to register " 784 printk(KERN_ERR "register_winch_irq - failed to register "
813 "IRQ\n"); 785 "IRQ\n");
diff --git a/arch/um/drivers/line.h b/arch/um/drivers/line.h
index 63df3ca02ac2..0a1834719dba 100644
--- a/arch/um/drivers/line.h
+++ b/arch/um/drivers/line.h
@@ -15,7 +15,7 @@
15#include "chan_user.h" 15#include "chan_user.h"
16#include "mconsole_kern.h" 16#include "mconsole_kern.h"
17 17
18/* There's only one modifiable field in this - .mc.list */ 18/* There's only two modifiable fields in this - .mc.list and .driver */
19struct line_driver { 19struct line_driver {
20 const char *name; 20 const char *name;
21 const char *device_name; 21 const char *device_name;
@@ -28,17 +28,18 @@ struct line_driver {
28 const int write_irq; 28 const int write_irq;
29 const char *write_irq_name; 29 const char *write_irq_name;
30 struct mc_device mc; 30 struct mc_device mc;
31 struct tty_driver *driver;
31}; 32};
32 33
33struct line { 34struct line {
34 struct tty_struct *tty; 35 struct tty_struct *tty;
35 spinlock_t count_lock; 36 struct mutex count_lock;
36 unsigned long count; 37 unsigned long count;
37 int valid; 38 int valid;
38 39
39 char *init_str; 40 char *init_str;
40 int init_pri;
41 struct list_head chan_list; 41 struct list_head chan_list;
42 struct chan *chan_in, *chan_out;
42 43
43 /*This lock is actually, mostly, local to*/ 44 /*This lock is actually, mostly, local to*/
44 spinlock_t lock; 45 spinlock_t lock;
@@ -55,21 +56,12 @@ struct line {
55 int sigio; 56 int sigio;
56 struct delayed_work task; 57 struct delayed_work task;
57 const struct line_driver *driver; 58 const struct line_driver *driver;
58 int have_irq;
59}; 59};
60 60
61#define LINE_INIT(str, d) \
62 { .count_lock = __SPIN_LOCK_UNLOCKED((str).count_lock), \
63 .init_str = str, \
64 .init_pri = INIT_STATIC, \
65 .valid = 1, \
66 .lock = __SPIN_LOCK_UNLOCKED((str).lock), \
67 .driver = d }
68
69extern void line_close(struct tty_struct *tty, struct file * filp); 61extern void line_close(struct tty_struct *tty, struct file * filp);
70extern int line_open(struct line *lines, struct tty_struct *tty); 62extern int line_open(struct line *lines, struct tty_struct *tty);
71extern int line_setup(struct line *lines, unsigned int sizeof_lines, 63extern int line_setup(char **conf, unsigned nlines, char **def,
72 char *init, char **error_out); 64 char *init, char *name);
73extern int line_write(struct tty_struct *tty, const unsigned char *buf, 65extern int line_write(struct tty_struct *tty, const unsigned char *buf,
74 int len); 66 int len);
75extern int line_put_char(struct tty_struct *tty, unsigned char ch); 67extern int line_put_char(struct tty_struct *tty, unsigned char ch);
@@ -87,10 +79,11 @@ extern char *add_xterm_umid(char *base);
87extern int line_setup_irq(int fd, int input, int output, struct line *line, 79extern int line_setup_irq(int fd, int input, int output, struct line *line,
88 void *data); 80 void *data);
89extern void line_close_chan(struct line *line); 81extern void line_close_chan(struct line *line);
90extern struct tty_driver *register_lines(struct line_driver *line_driver, 82extern int register_lines(struct line_driver *line_driver,
91 const struct tty_operations *driver, 83 const struct tty_operations *driver,
92 struct line *lines, int nlines); 84 struct line *lines, int nlines);
93extern void lines_init(struct line *lines, int nlines, struct chan_opts *opts); 85extern int setup_one_line(struct line *lines, int n, char *init,
86 const struct chan_opts *opts, char **error_out);
94extern void close_lines(struct line *lines, int nlines); 87extern void close_lines(struct line *lines, int nlines);
95 88
96extern int line_config(struct line *lines, unsigned int sizeof_lines, 89extern int line_config(struct line *lines, unsigned int sizeof_lines,
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c
index c70e047eed72..e672bd6d43e3 100644
--- a/arch/um/drivers/mconsole_kern.c
+++ b/arch/um/drivers/mconsole_kern.c
@@ -773,7 +773,7 @@ static int __init mconsole_init(void)
773 register_reboot_notifier(&reboot_notifier); 773 register_reboot_notifier(&reboot_notifier);
774 774
775 err = um_request_irq(MCONSOLE_IRQ, sock, IRQ_READ, mconsole_interrupt, 775 err = um_request_irq(MCONSOLE_IRQ, sock, IRQ_READ, mconsole_interrupt,
776 IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, 776 IRQF_SHARED | IRQF_SAMPLE_RANDOM,
777 "mconsole", (void *)sock); 777 "mconsole", (void *)sock);
778 if (err) { 778 if (err) {
779 printk(KERN_ERR "Failed to get IRQ for management console\n"); 779 printk(KERN_ERR "Failed to get IRQ for management console\n");
diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c
index d2996183e584..95f4416e6d9f 100644
--- a/arch/um/drivers/net_kern.c
+++ b/arch/um/drivers/net_kern.c
@@ -161,7 +161,7 @@ static int uml_net_open(struct net_device *dev)
161 } 161 }
162 162
163 err = um_request_irq(dev->irq, lp->fd, IRQ_READ, uml_net_interrupt, 163 err = um_request_irq(dev->irq, lp->fd, IRQ_READ, uml_net_interrupt,
164 IRQF_DISABLED | IRQF_SHARED, dev->name, dev); 164 IRQF_SHARED, dev->name, dev);
165 if (err != 0) { 165 if (err != 0) {
166 printk(KERN_ERR "uml_net_open: failed to get irq(%d)\n", err); 166 printk(KERN_ERR "uml_net_open: failed to get irq(%d)\n", err);
167 err = -ENETUNREACH; 167 err = -ENETUNREACH;
diff --git a/arch/um/drivers/port_kern.c b/arch/um/drivers/port_kern.c
index a11573be0961..e31680e662a4 100644
--- a/arch/um/drivers/port_kern.c
+++ b/arch/um/drivers/port_kern.c
@@ -100,7 +100,7 @@ static int port_accept(struct port_list *port)
100 .port = port }); 100 .port = port });
101 101
102 if (um_request_irq(TELNETD_IRQ, socket[0], IRQ_READ, pipe_interrupt, 102 if (um_request_irq(TELNETD_IRQ, socket[0], IRQ_READ, pipe_interrupt,
103 IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, 103 IRQF_SHARED | IRQF_SAMPLE_RANDOM,
104 "telnetd", conn)) { 104 "telnetd", conn)) {
105 printk(KERN_ERR "port_accept : failed to get IRQ for " 105 printk(KERN_ERR "port_accept : failed to get IRQ for "
106 "telnetd\n"); 106 "telnetd\n");
@@ -184,7 +184,7 @@ void *port_data(int port_num)
184 } 184 }
185 185
186 if (um_request_irq(ACCEPT_IRQ, fd, IRQ_READ, port_interrupt, 186 if (um_request_irq(ACCEPT_IRQ, fd, IRQ_READ, port_interrupt,
187 IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, 187 IRQF_SHARED | IRQF_SAMPLE_RANDOM,
188 "port", port)) { 188 "port", port)) {
189 printk(KERN_ERR "Failed to get IRQ for port %d\n", port_num); 189 printk(KERN_ERR "Failed to get IRQ for port %d\n", port_num);
190 goto out_close; 190 goto out_close;
diff --git a/arch/um/drivers/random.c b/arch/um/drivers/random.c
index 981085a93f30..b25296e6218a 100644
--- a/arch/um/drivers/random.c
+++ b/arch/um/drivers/random.c
@@ -131,7 +131,7 @@ static int __init rng_init (void)
131 random_fd = err; 131 random_fd = err;
132 132
133 err = um_request_irq(RANDOM_IRQ, random_fd, IRQ_READ, random_interrupt, 133 err = um_request_irq(RANDOM_IRQ, random_fd, IRQ_READ, random_interrupt,
134 IRQF_DISABLED | IRQF_SAMPLE_RANDOM, "random", 134 IRQF_SAMPLE_RANDOM, "random",
135 NULL); 135 NULL);
136 if (err) 136 if (err)
137 goto err_out_cleanup_hw; 137 goto err_out_cleanup_hw;
diff --git a/arch/um/drivers/ssl.c b/arch/um/drivers/ssl.c
index 9d8c20af6f80..e09801a1327b 100644
--- a/arch/um/drivers/ssl.c
+++ b/arch/um/drivers/ssl.c
@@ -20,12 +20,6 @@
20 20
21static const int ssl_version = 1; 21static const int ssl_version = 1;
22 22
23/* Referenced only by tty_driver below - presumably it's locked correctly
24 * by the tty driver.
25 */
26
27static struct tty_driver *ssl_driver;
28
29#define NR_PORTS 64 23#define NR_PORTS 64
30 24
31static void ssl_announce(char *dev_name, int dev) 25static void ssl_announce(char *dev_name, int dev)
@@ -71,8 +65,9 @@ static struct line_driver driver = {
71/* The array is initialized by line_init, at initcall time. The 65/* The array is initialized by line_init, at initcall time. The
72 * elements are locked individually as needed. 66 * elements are locked individually as needed.
73 */ 67 */
74static struct line serial_lines[NR_PORTS] = 68static char *conf[NR_PORTS];
75 { [0 ... NR_PORTS - 1] = LINE_INIT(CONFIG_SSL_CHAN, &driver) }; 69static char *def_conf = CONFIG_SSL_CHAN;
70static struct line serial_lines[NR_PORTS];
76 71
77static int ssl_config(char *str, char **error_out) 72static int ssl_config(char *str, char **error_out)
78{ 73{
@@ -156,14 +151,14 @@ static void ssl_console_write(struct console *c, const char *string,
156 unsigned long flags; 151 unsigned long flags;
157 152
158 spin_lock_irqsave(&line->lock, flags); 153 spin_lock_irqsave(&line->lock, flags);
159 console_write_chan(&line->chan_list, string, len); 154 console_write_chan(line->chan_out, string, len);
160 spin_unlock_irqrestore(&line->lock, flags); 155 spin_unlock_irqrestore(&line->lock, flags);
161} 156}
162 157
163static struct tty_driver *ssl_console_device(struct console *c, int *index) 158static struct tty_driver *ssl_console_device(struct console *c, int *index)
164{ 159{
165 *index = c->index; 160 *index = c->index;
166 return ssl_driver; 161 return driver.driver;
167} 162}
168 163
169static int ssl_console_setup(struct console *co, char *options) 164static int ssl_console_setup(struct console *co, char *options)
@@ -186,17 +181,30 @@ static struct console ssl_cons = {
186static int ssl_init(void) 181static int ssl_init(void)
187{ 182{
188 char *new_title; 183 char *new_title;
184 int err;
185 int i;
189 186
190 printk(KERN_INFO "Initializing software serial port version %d\n", 187 printk(KERN_INFO "Initializing software serial port version %d\n",
191 ssl_version); 188 ssl_version);
192 ssl_driver = register_lines(&driver, &ssl_ops, serial_lines, 189
190 err = register_lines(&driver, &ssl_ops, serial_lines,
193 ARRAY_SIZE(serial_lines)); 191 ARRAY_SIZE(serial_lines));
192 if (err)
193 return err;
194 194
195 new_title = add_xterm_umid(opts.xterm_title); 195 new_title = add_xterm_umid(opts.xterm_title);
196 if (new_title != NULL) 196 if (new_title != NULL)
197 opts.xterm_title = new_title; 197 opts.xterm_title = new_title;
198 198
199 lines_init(serial_lines, ARRAY_SIZE(serial_lines), &opts); 199 for (i = 0; i < NR_PORTS; i++) {
200 char *error;
201 char *s = conf[i];
202 if (!s)
203 s = def_conf;
204 if (setup_one_line(serial_lines, i, s, &opts, &error))
205 printk(KERN_ERR "setup_one_line failed for "
206 "device %d : %s\n", i, error);
207 }
200 208
201 ssl_init_done = 1; 209 ssl_init_done = 1;
202 register_console(&ssl_cons); 210 register_console(&ssl_cons);
@@ -214,14 +222,7 @@ __uml_exitcall(ssl_exit);
214 222
215static int ssl_chan_setup(char *str) 223static int ssl_chan_setup(char *str)
216{ 224{
217 char *error; 225 line_setup(conf, NR_PORTS, &def_conf, str, "serial line");
218 int ret;
219
220 ret = line_setup(serial_lines, ARRAY_SIZE(serial_lines), str, &error);
221 if(ret < 0)
222 printk(KERN_ERR "Failed to set up serial line with "
223 "configuration string \"%s\" : %s\n", str, error);
224
225 return 1; 226 return 1;
226} 227}
227 228
diff --git a/arch/um/drivers/stdio_console.c b/arch/um/drivers/stdio_console.c
index 088776f01908..7663541c372e 100644
--- a/arch/um/drivers/stdio_console.c
+++ b/arch/um/drivers/stdio_console.c
@@ -27,12 +27,6 @@
27 27
28#define MAX_TTYS (16) 28#define MAX_TTYS (16)
29 29
30/* Referenced only by tty_driver below - presumably it's locked correctly
31 * by the tty driver.
32 */
33
34static struct tty_driver *console_driver;
35
36static void stdio_announce(char *dev_name, int dev) 30static void stdio_announce(char *dev_name, int dev)
37{ 31{
38 printk(KERN_INFO "Virtual console %d assigned device '%s'\n", dev, 32 printk(KERN_INFO "Virtual console %d assigned device '%s'\n", dev,
@@ -76,9 +70,9 @@ static struct line_driver driver = {
76/* The array is initialized by line_init, at initcall time. The 70/* The array is initialized by line_init, at initcall time. The
77 * elements are locked individually as needed. 71 * elements are locked individually as needed.
78 */ 72 */
79static struct line vts[MAX_TTYS] = { LINE_INIT(CONFIG_CON_ZERO_CHAN, &driver), 73static char *vt_conf[MAX_TTYS];
80 [ 1 ... MAX_TTYS - 1 ] = 74static char *def_conf;
81 LINE_INIT(CONFIG_CON_CHAN, &driver) }; 75static struct line vts[MAX_TTYS];
82 76
83static int con_config(char *str, char **error_out) 77static int con_config(char *str, char **error_out)
84{ 78{
@@ -130,14 +124,14 @@ static void uml_console_write(struct console *console, const char *string,
130 unsigned long flags; 124 unsigned long flags;
131 125
132 spin_lock_irqsave(&line->lock, flags); 126 spin_lock_irqsave(&line->lock, flags);
133 console_write_chan(&line->chan_list, string, len); 127 console_write_chan(line->chan_out, string, len);
134 spin_unlock_irqrestore(&line->lock, flags); 128 spin_unlock_irqrestore(&line->lock, flags);
135} 129}
136 130
137static struct tty_driver *uml_console_device(struct console *c, int *index) 131static struct tty_driver *uml_console_device(struct console *c, int *index)
138{ 132{
139 *index = c->index; 133 *index = c->index;
140 return console_driver; 134 return driver.driver;
141} 135}
142 136
143static int uml_console_setup(struct console *co, char *options) 137static int uml_console_setup(struct console *co, char *options)
@@ -160,18 +154,31 @@ static struct console stdiocons = {
160static int stdio_init(void) 154static int stdio_init(void)
161{ 155{
162 char *new_title; 156 char *new_title;
157 int err;
158 int i;
163 159
164 console_driver = register_lines(&driver, &console_ops, vts, 160 err = register_lines(&driver, &console_ops, vts,
165 ARRAY_SIZE(vts)); 161 ARRAY_SIZE(vts));
166 if (console_driver == NULL) 162 if (err)
167 return -1; 163 return err;
164
168 printk(KERN_INFO "Initialized stdio console driver\n"); 165 printk(KERN_INFO "Initialized stdio console driver\n");
169 166
170 new_title = add_xterm_umid(opts.xterm_title); 167 new_title = add_xterm_umid(opts.xterm_title);
171 if(new_title != NULL) 168 if(new_title != NULL)
172 opts.xterm_title = new_title; 169 opts.xterm_title = new_title;
173 170
174 lines_init(vts, ARRAY_SIZE(vts), &opts); 171 for (i = 0; i < MAX_TTYS; i++) {
172 char *error;
173 char *s = vt_conf[i];
174 if (!s)
175 s = def_conf;
176 if (!s)
177 s = i ? CONFIG_CON_CHAN : CONFIG_CON_ZERO_CHAN;
178 if (setup_one_line(vts, i, s, &opts, &error))
179 printk(KERN_ERR "setup_one_line failed for "
180 "device %d : %s\n", i, error);
181 }
175 182
176 con_init_done = 1; 183 con_init_done = 1;
177 register_console(&stdiocons); 184 register_console(&stdiocons);
@@ -189,14 +196,7 @@ __uml_exitcall(console_exit);
189 196
190static int console_chan_setup(char *str) 197static int console_chan_setup(char *str)
191{ 198{
192 char *error; 199 line_setup(vt_conf, MAX_TTYS, &def_conf, str, "console");
193 int ret;
194
195 ret = line_setup(vts, ARRAY_SIZE(vts), str, &error);
196 if(ret < 0)
197 printk(KERN_ERR "Failed to set up console with "
198 "configuration string \"%s\" : %s\n", str, error);
199
200 return 1; 200 return 1;
201} 201}
202__setup("con", console_chan_setup); 202__setup("con", console_chan_setup);
diff --git a/arch/um/drivers/ubd_user.h b/arch/um/drivers/ubd.h
index 3845051f1b10..3845051f1b10 100644
--- a/arch/um/drivers/ubd_user.h
+++ b/arch/um/drivers/ubd.h
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c
index 944453a3ec99..20505cafa299 100644
--- a/arch/um/drivers/ubd_kern.c
+++ b/arch/um/drivers/ubd_kern.c
@@ -19,40 +19,26 @@
19 19
20#define UBD_SHIFT 4 20#define UBD_SHIFT 4
21 21
22#include "linux/kernel.h" 22#include <linux/module.h>
23#include "linux/module.h" 23#include <linux/init.h>
24#include "linux/blkdev.h" 24#include <linux/blkdev.h>
25#include "linux/ata.h" 25#include <linux/ata.h>
26#include "linux/hdreg.h" 26#include <linux/hdreg.h>
27#include "linux/init.h" 27#include <linux/cdrom.h>
28#include "linux/cdrom.h" 28#include <linux/proc_fs.h>
29#include "linux/proc_fs.h" 29#include <linux/seq_file.h>
30#include "linux/seq_file.h" 30#include <linux/ctype.h>
31#include "linux/ctype.h" 31#include <linux/slab.h>
32#include "linux/capability.h" 32#include <linux/vmalloc.h>
33#include "linux/mm.h" 33#include <linux/platform_device.h>
34#include "linux/slab.h" 34#include <linux/scatterlist.h>
35#include "linux/vmalloc.h" 35#include <asm/tlbflush.h>
36#include "linux/mutex.h"
37#include "linux/blkpg.h"
38#include "linux/genhd.h"
39#include "linux/spinlock.h"
40#include "linux/platform_device.h"
41#include "linux/scatterlist.h"
42#include "asm/segment.h"
43#include "asm/uaccess.h"
44#include "asm/irq.h"
45#include "asm/types.h"
46#include "asm/tlbflush.h"
47#include "mem_user.h"
48#include "kern_util.h" 36#include "kern_util.h"
49#include "mconsole_kern.h" 37#include "mconsole_kern.h"
50#include "init.h" 38#include "init.h"
51#include "irq_user.h"
52#include "irq_kern.h" 39#include "irq_kern.h"
53#include "ubd_user.h" 40#include "ubd.h"
54#include "os.h" 41#include "os.h"
55#include "mem.h"
56#include "cow.h" 42#include "cow.h"
57 43
58enum ubd_req { UBD_READ, UBD_WRITE }; 44enum ubd_req { UBD_READ, UBD_WRITE };
@@ -1115,7 +1101,7 @@ static int __init ubd_driver_init(void){
1115 return 0; 1101 return 0;
1116 } 1102 }
1117 err = um_request_irq(UBD_IRQ, thread_fd, IRQ_READ, ubd_intr, 1103 err = um_request_irq(UBD_IRQ, thread_fd, IRQ_READ, ubd_intr,
1118 IRQF_DISABLED, "ubd", ubd_devs); 1104 0, "ubd", ubd_devs);
1119 if(err != 0) 1105 if(err != 0)
1120 printk(KERN_ERR "um_request_irq failed - errno = %d\n", -err); 1106 printk(KERN_ERR "um_request_irq failed - errno = %d\n", -err);
1121 return 0; 1107 return 0;
diff --git a/arch/um/drivers/ubd_user.c b/arch/um/drivers/ubd_user.c
index 007b94d97726..ffe02c431dea 100644
--- a/arch/um/drivers/ubd_user.c
+++ b/arch/um/drivers/ubd_user.c
@@ -15,14 +15,12 @@
15#include <sys/socket.h> 15#include <sys/socket.h>
16#include <sys/mman.h> 16#include <sys/mman.h>
17#include <sys/param.h> 17#include <sys/param.h>
18#include "asm/types.h"
19#include "ubd_user.h"
20#include "os.h"
21#include "cow.h"
22
23#include <endian.h> 18#include <endian.h>
24#include <byteswap.h> 19#include <byteswap.h>
25 20
21#include "ubd.h"
22#include "os.h"
23
26void ignore_sigwinch_sig(void) 24void ignore_sigwinch_sig(void)
27{ 25{
28 signal(SIGWINCH, SIG_IGN); 26 signal(SIGWINCH, SIG_IGN);
diff --git a/arch/um/drivers/xterm_kern.c b/arch/um/drivers/xterm_kern.c
index b646bccef37a..8bd130f0bda3 100644
--- a/arch/um/drivers/xterm_kern.c
+++ b/arch/um/drivers/xterm_kern.c
@@ -50,7 +50,7 @@ int xterm_fd(int socket, int *pid_out)
50 init_completion(&data->ready); 50 init_completion(&data->ready);
51 51
52 err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt, 52 err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt,
53 IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, 53 IRQF_SHARED | IRQF_SAMPLE_RANDOM,
54 "xterm", data); 54 "xterm", data);
55 if (err) { 55 if (err) {
56 printk(KERN_ERR "xterm_fd : failed to get IRQ for xterm, " 56 printk(KERN_ERR "xterm_fd : failed to get IRQ for xterm, "
diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild
index 451f4517b334..8419f5cf2ac7 100644
--- a/arch/um/include/asm/Kbuild
+++ b/arch/um/include/asm/Kbuild
@@ -1,3 +1,3 @@
1generic-y += bug.h cputime.h device.h emergency-restart.h futex.h hardirq.h 1generic-y += bug.h cputime.h device.h emergency-restart.h futex.h hardirq.h
2generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h 2generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h
3generic-y += ftrace.h 3generic-y += ftrace.h pci.h io.h param.h delay.h mutex.h current.h
diff --git a/arch/um/include/asm/asm-offsets.h b/arch/um/include/asm/asm-offsets.h
deleted file mode 100644
index d370ee36a182..000000000000
--- a/arch/um/include/asm/asm-offsets.h
+++ /dev/null
@@ -1 +0,0 @@
1#include <generated/asm-offsets.h>
diff --git a/arch/um/include/asm/auxvec.h b/arch/um/include/asm/auxvec.h
deleted file mode 100644
index 1e5e1c2fc9b1..000000000000
--- a/arch/um/include/asm/auxvec.h
+++ /dev/null
@@ -1,4 +0,0 @@
1#ifndef __UM_AUXVEC_H
2#define __UM_AUXVEC_H
3
4#endif
diff --git a/arch/um/include/asm/current.h b/arch/um/include/asm/current.h
deleted file mode 100644
index c2191d9aa03d..000000000000
--- a/arch/um/include/asm/current.h
+++ /dev/null
@@ -1,13 +0,0 @@
1/*
2 * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
3 * Licensed under the GPL
4 */
5
6#ifndef __UM_CURRENT_H
7#define __UM_CURRENT_H
8
9#include "linux/thread_info.h"
10
11#define current (current_thread_info()->task)
12
13#endif
diff --git a/arch/um/include/asm/delay.h b/arch/um/include/asm/delay.h
deleted file mode 100644
index 8a5576d8eda5..000000000000
--- a/arch/um/include/asm/delay.h
+++ /dev/null
@@ -1,18 +0,0 @@
1#ifndef __UM_DELAY_H
2#define __UM_DELAY_H
3
4/* Undefined on purpose */
5extern void __bad_udelay(void);
6extern void __bad_ndelay(void);
7
8extern void __udelay(unsigned long usecs);
9extern void __ndelay(unsigned long usecs);
10extern void __delay(unsigned long loops);
11
12#define udelay(n) ((__builtin_constant_p(n) && (n) > 20000) ? \
13 __bad_udelay() : __udelay(n))
14
15#define ndelay(n) ((__builtin_constant_p(n) && (n) > 20000) ? \
16 __bad_ndelay() : __ndelay(n))
17
18#endif
diff --git a/arch/um/include/asm/io.h b/arch/um/include/asm/io.h
deleted file mode 100644
index 44e8b8c772ae..000000000000
--- a/arch/um/include/asm/io.h
+++ /dev/null
@@ -1,57 +0,0 @@
1#ifndef __UM_IO_H
2#define __UM_IO_H
3
4#include "asm/page.h"
5
6#define IO_SPACE_LIMIT 0xdeadbeef /* Sure hope nothing uses this */
7
8static inline int inb(unsigned long i) { return(0); }
9static inline void outb(char c, unsigned long i) { }
10
11/*
12 * Change virtual addresses to physical addresses and vv.
13 * These are pretty trivial
14 */
15static inline unsigned long virt_to_phys(volatile void * address)
16{
17 return __pa((void *) address);
18}
19
20static inline void * phys_to_virt(unsigned long address)
21{
22 return __va(address);
23}
24
25/*
26 * Convert a physical pointer to a virtual kernel pointer for /dev/mem
27 * access
28 */
29#define xlate_dev_mem_ptr(p) __va(p)
30
31/*
32 * Convert a virtual cached pointer to an uncached pointer
33 */
34#define xlate_dev_kmem_ptr(p) p
35
36static inline void writeb(unsigned char b, volatile void __iomem *addr)
37{
38 *(volatile unsigned char __force *) addr = b;
39}
40static inline void writew(unsigned short b, volatile void __iomem *addr)
41{
42 *(volatile unsigned short __force *) addr = b;
43}
44static inline void writel(unsigned int b, volatile void __iomem *addr)
45{
46 *(volatile unsigned int __force *) addr = b;
47}
48static inline void writeq(unsigned int b, volatile void __iomem *addr)
49{
50 *(volatile unsigned long long __force *) addr = b;
51}
52#define __raw_writeb writeb
53#define __raw_writew writew
54#define __raw_writel writel
55#define __raw_writeq writeq
56
57#endif
diff --git a/arch/um/include/asm/mutex.h b/arch/um/include/asm/mutex.h
deleted file mode 100644
index 458c1f7fbc18..000000000000
--- a/arch/um/include/asm/mutex.h
+++ /dev/null
@@ -1,9 +0,0 @@
1/*
2 * Pull in the generic implementation for the mutex fastpath.
3 *
4 * TODO: implement optimized primitives instead, or leave the generic
5 * implementation in place, or pick the atomic_xchg() based generic
6 * implementation. (see asm-generic/mutex-xchg.h for details)
7 */
8
9#include <asm-generic/mutex-dec.h>
diff --git a/arch/um/include/asm/param.h b/arch/um/include/asm/param.h
deleted file mode 100644
index e44f4e60d16d..000000000000
--- a/arch/um/include/asm/param.h
+++ /dev/null
@@ -1,20 +0,0 @@
1#ifndef _UM_PARAM_H
2#define _UM_PARAM_H
3
4#define EXEC_PAGESIZE 4096
5
6#ifndef NOGROUP
7#define NOGROUP (-1)
8#endif
9
10#define MAXHOSTNAMELEN 64 /* max length of hostname */
11
12#ifdef __KERNEL__
13#define HZ CONFIG_HZ
14#define USER_HZ 100 /* .. some user interfaces are in "ticks" */
15#define CLOCKS_PER_SEC (USER_HZ) /* frequency at which times() counts */
16#else
17#define HZ 100
18#endif
19
20#endif
diff --git a/arch/um/include/asm/pci.h b/arch/um/include/asm/pci.h
deleted file mode 100644
index b44cf59ede1e..000000000000
--- a/arch/um/include/asm/pci.h
+++ /dev/null
@@ -1,6 +0,0 @@
1#ifndef __UM_PCI_H
2#define __UM_PCI_H
3
4#define PCI_DMA_BUS_IS_PHYS (1)
5
6#endif
diff --git a/arch/um/include/asm/pgalloc.h b/arch/um/include/asm/pgalloc.h
index 32c8ce4e1515..bf90b2aa2002 100644
--- a/arch/um/include/asm/pgalloc.h
+++ b/arch/um/include/asm/pgalloc.h
@@ -8,8 +8,7 @@
8#ifndef __UM_PGALLOC_H 8#ifndef __UM_PGALLOC_H
9#define __UM_PGALLOC_H 9#define __UM_PGALLOC_H
10 10
11#include "linux/mm.h" 11#include <linux/mm.h>
12#include "asm/fixmap.h"
13 12
14#define pmd_populate_kernel(mm, pmd, pte) \ 13#define pmd_populate_kernel(mm, pmd, pte) \
15 set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) __pa(pte))) 14 set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) __pa(pte)))
diff --git a/arch/um/include/asm/pgtable.h b/arch/um/include/asm/pgtable.h
index 41474fb5eee7..6a3f9845743e 100644
--- a/arch/um/include/asm/pgtable.h
+++ b/arch/um/include/asm/pgtable.h
@@ -69,6 +69,8 @@ extern unsigned long end_iomem;
69#define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED) 69#define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
70#define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC) 70#define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC)
71 71
72#define io_remap_pfn_range remap_pfn_range
73
72/* 74/*
73 * The i386 can't do page protection for execute, and considers that the same 75 * The i386 can't do page protection for execute, and considers that the same
74 * are read. 76 * are read.
diff --git a/arch/um/include/asm/ptrace-generic.h b/arch/um/include/asm/ptrace-generic.h
index f605d3c4844c..e786a6a3ec5e 100644
--- a/arch/um/include/asm/ptrace-generic.h
+++ b/arch/um/include/asm/ptrace-generic.h
@@ -9,7 +9,6 @@
9#ifndef __ASSEMBLY__ 9#ifndef __ASSEMBLY__
10 10
11#include <asm/ptrace-abi.h> 11#include <asm/ptrace-abi.h>
12#include <asm/user.h>
13#include "sysdep/ptrace.h" 12#include "sysdep/ptrace.h"
14 13
15struct pt_regs { 14struct pt_regs {
diff --git a/arch/um/include/shared/common-offsets.h b/arch/um/include/shared/common-offsets.h
index d7fe563aa7e7..40db8f71deae 100644
--- a/arch/um/include/shared/common-offsets.h
+++ b/arch/um/include/shared/common-offsets.h
@@ -2,8 +2,6 @@
2 2
3DEFINE(KERNEL_MADV_REMOVE, MADV_REMOVE); 3DEFINE(KERNEL_MADV_REMOVE, MADV_REMOVE);
4 4
5OFFSET(HOST_TASK_PID, task_struct, pid);
6
7DEFINE(UM_KERN_PAGE_SIZE, PAGE_SIZE); 5DEFINE(UM_KERN_PAGE_SIZE, PAGE_SIZE);
8DEFINE(UM_KERN_PAGE_MASK, PAGE_MASK); 6DEFINE(UM_KERN_PAGE_MASK, PAGE_MASK);
9DEFINE(UM_KERN_PAGE_SHIFT, PAGE_SHIFT); 7DEFINE(UM_KERN_PAGE_SHIFT, PAGE_SHIFT);
diff --git a/arch/um/include/shared/kern_util.h b/arch/um/include/shared/kern_util.h
index 0f1483852460..00965d06d2ca 100644
--- a/arch/um/include/shared/kern_util.h
+++ b/arch/um/include/shared/kern_util.h
@@ -48,7 +48,7 @@ extern void do_uml_exitcalls(void);
48 * GFP_ATOMIC. 48 * GFP_ATOMIC.
49 */ 49 */
50extern int __cant_sleep(void); 50extern int __cant_sleep(void);
51extern void *get_current(void); 51extern int get_current_pid(void);
52extern int copy_from_user_proc(void *to, void *from, int size); 52extern int copy_from_user_proc(void *to, void *from, int size);
53extern int cpu(void); 53extern int cpu(void);
54extern char *uml_strdup(const char *string); 54extern char *uml_strdup(const char *string);
diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile
index bc494741b1f3..492bc4c1b62b 100644
--- a/arch/um/kernel/Makefile
+++ b/arch/um/kernel/Makefile
@@ -3,7 +3,7 @@
3# Licensed under the GPL 3# Licensed under the GPL
4# 4#
5 5
6CPPFLAGS_vmlinux.lds := -U$(SUBARCH) -DSTART=$(LDS_START) \ 6CPPFLAGS_vmlinux.lds := -DSTART=$(LDS_START) \
7 -DELF_ARCH=$(LDS_ELF_ARCH) \ 7 -DELF_ARCH=$(LDS_ELF_ARCH) \
8 -DELF_FORMAT=$(LDS_ELF_FORMAT) 8 -DELF_FORMAT=$(LDS_ELF_FORMAT)
9extra-y := vmlinux.lds 9extra-y := vmlinux.lds
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c
index 69f24905abdc..f386d04a84a5 100644
--- a/arch/um/kernel/process.c
+++ b/arch/um/kernel/process.c
@@ -126,9 +126,9 @@ void exit_thread(void)
126{ 126{
127} 127}
128 128
129void *get_current(void) 129int get_current_pid(void)
130{ 130{
131 return current; 131 return task_pid_nr(current);
132} 132}
133 133
134/* 134/*
diff --git a/arch/um/kernel/sigio.c b/arch/um/kernel/sigio.c
index 2b272b63b514..2a1639255763 100644
--- a/arch/um/kernel/sigio.c
+++ b/arch/um/kernel/sigio.c
@@ -25,7 +25,7 @@ int write_sigio_irq(int fd)
25 int err; 25 int err;
26 26
27 err = um_request_irq(SIGIO_WRITE_IRQ, fd, IRQ_READ, sigio_interrupt, 27 err = um_request_irq(SIGIO_WRITE_IRQ, fd, IRQ_READ, sigio_interrupt,
28 IRQF_DISABLED|IRQF_SAMPLE_RANDOM, "write sigio", 28 IRQF_SAMPLE_RANDOM, "write sigio",
29 NULL); 29 NULL);
30 if (err) { 30 if (err) {
31 printk(KERN_ERR "write_sigio_irq : um_request_irq failed, " 31 printk(KERN_ERR "write_sigio_irq : um_request_irq failed, "
diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c
index 82a6e22f1f35..d1a23fb3190d 100644
--- a/arch/um/kernel/time.c
+++ b/arch/um/kernel/time.c
@@ -82,7 +82,7 @@ static void __init setup_itimer(void)
82{ 82{
83 int err; 83 int err;
84 84
85 err = request_irq(TIMER_IRQ, um_timer, IRQF_DISABLED, "timer", NULL); 85 err = request_irq(TIMER_IRQ, um_timer, 0, "timer", NULL);
86 if (err != 0) 86 if (err != 0)
87 printk(KERN_ERR "register_timer : request_irq failed - " 87 printk(KERN_ERR "register_timer : request_irq failed - "
88 "errno = %d\n", -err); 88 "errno = %d\n", -err);
diff --git a/arch/um/os-Linux/Makefile b/arch/um/os-Linux/Makefile
index dd764101e488..08ff5094fcdd 100644
--- a/arch/um/os-Linux/Makefile
+++ b/arch/um/os-Linux/Makefile
@@ -13,8 +13,6 @@ USER_OBJS := $(user-objs-y) aio.o elf_aux.o execvp.o file.o helper.o irq.o \
13 main.o mem.o process.o registers.o sigio.o signal.o start_up.o time.o \ 13 main.o mem.o process.o registers.o sigio.o signal.o start_up.o time.o \
14 tty.o umid.o util.o 14 tty.o umid.o util.o
15 15
16CFLAGS_user_syms.o += -DSUBARCH_$(SUBARCH)
17
18HAVE_AIO_ABI := $(shell [ -r /usr/include/linux/aio_abi.h ] && \ 16HAVE_AIO_ABI := $(shell [ -r /usr/include/linux/aio_abi.h ] && \
19 echo -DHAVE_AIO_ABI ) 17 echo -DHAVE_AIO_ABI )
20CFLAGS_aio.o += $(HAVE_AIO_ABI) 18CFLAGS_aio.o += $(HAVE_AIO_ABI)
diff --git a/arch/um/os-Linux/user_syms.c b/arch/um/os-Linux/user_syms.c
index 45ffe46871e0..73926fa3f96b 100644
--- a/arch/um/os-Linux/user_syms.c
+++ b/arch/um/os-Linux/user_syms.c
@@ -45,7 +45,7 @@ EXPORT_SYMBOL(readdir64);
45extern void truncate64(void) __attribute__((weak)); 45extern void truncate64(void) __attribute__((weak));
46EXPORT_SYMBOL(truncate64); 46EXPORT_SYMBOL(truncate64);
47 47
48#ifdef SUBARCH_i386 48#ifdef CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA
49EXPORT_SYMBOL(vsyscall_ehdr); 49EXPORT_SYMBOL(vsyscall_ehdr);
50EXPORT_SYMBOL(vsyscall_end); 50EXPORT_SYMBOL(vsyscall_end);
51#endif 51#endif
diff --git a/arch/um/scripts/Makefile.rules b/arch/um/scripts/Makefile.rules
index 2eb2843b0634..d50270d26b42 100644
--- a/arch/um/scripts/Makefile.rules
+++ b/arch/um/scripts/Makefile.rules
@@ -9,8 +9,6 @@ USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file))
9 9
10$(USER_OBJS:.o=.%): \ 10$(USER_OBJS:.o=.%): \
11 c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) -include user.h $(CFLAGS_$(basetarget).o) 11 c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) -include user.h $(CFLAGS_$(basetarget).o)
12$(USER_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \
13 -Dunix -D__unix__ -D__$(SUBARCH)__ $(CF)
14 12
15# These are like USER_OBJS but filter USER_CFLAGS through unprofile instead of 13# These are like USER_OBJS but filter USER_CFLAGS through unprofile instead of
16# using it directly. 14# using it directly.
@@ -18,8 +16,9 @@ UNPROFILE_OBJS := $(foreach file,$(UNPROFILE_OBJS),$(obj)/$(file))
18 16
19$(UNPROFILE_OBJS:.o=.%): \ 17$(UNPROFILE_OBJS:.o=.%): \
20 c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) $(CFLAGS_$(basetarget).o) 18 c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) $(CFLAGS_$(basetarget).o)
21$(UNPROFILE_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \ 19
22 -Dunix -D__unix__ -D__$(SUBARCH)__ $(CF) 20$(USER_OBJS) $(UNPROFILE_OBJS): \
21 CHECKFLAGS := $(patsubst $(NOSTDINC_FLAGS),,$(CHECKFLAGS))
23 22
24# The stubs can't try to call mcount or update basic block data 23# The stubs can't try to call mcount or update basic block data
25define unprofile 24define unprofile
diff --git a/arch/x86/Makefile.um b/arch/x86/Makefile.um
index 36ddec6a41c9..4be406abeefd 100644
--- a/arch/x86/Makefile.um
+++ b/arch/x86/Makefile.um
@@ -8,15 +8,11 @@ ELF_ARCH := i386
8ELF_FORMAT := elf32-i386 8ELF_FORMAT := elf32-i386
9CHECKFLAGS += -D__i386__ 9CHECKFLAGS += -D__i386__
10 10
11ifeq ("$(origin SUBARCH)", "command line")
12ifneq ("$(shell uname -m | sed -e s/i.86/i386/)", "$(SUBARCH)")
13KBUILD_CFLAGS += $(call cc-option,-m32) 11KBUILD_CFLAGS += $(call cc-option,-m32)
14KBUILD_AFLAGS += $(call cc-option,-m32) 12KBUILD_AFLAGS += $(call cc-option,-m32)
15LINK-y += $(call cc-option,-m32) 13LINK-y += $(call cc-option,-m32)
16 14
17export LDFLAGS 15export LDFLAGS
18endif
19endif
20 16
21# First of all, tune CFLAGS for the specific CPU. This actually sets cflags-y. 17# First of all, tune CFLAGS for the specific CPU. This actually sets cflags-y.
22include $(srctree)/arch/x86/Makefile_32.cpu 18include $(srctree)/arch/x86/Makefile_32.cpu
diff --git a/arch/x86/um/Kconfig b/arch/x86/um/Kconfig
index b2b54d2edf53..9926e11a772d 100644
--- a/arch/x86/um/Kconfig
+++ b/arch/x86/um/Kconfig
@@ -15,8 +15,8 @@ config UML_X86
15 select GENERIC_FIND_FIRST_BIT 15 select GENERIC_FIND_FIRST_BIT
16 16
17config 64BIT 17config 64BIT
18 bool 18 bool "64-bit kernel" if SUBARCH = "x86"
19 default SUBARCH = "x86_64" 19 default SUBARCH != "i386"
20 20
21config X86_32 21config X86_32
22 def_bool !64BIT 22 def_bool !64BIT
diff --git a/arch/x86/um/asm/processor.h b/arch/x86/um/asm/processor.h
index 2c32df6fe231..04f82e020f2b 100644
--- a/arch/x86/um/asm/processor.h
+++ b/arch/x86/um/asm/processor.h
@@ -17,6 +17,16 @@
17#define ARCH_IS_STACKGROW(address) \ 17#define ARCH_IS_STACKGROW(address) \
18 (address + 65536 + 32 * sizeof(unsigned long) >= UPT_SP(&current->thread.regs.regs)) 18 (address + 65536 + 32 * sizeof(unsigned long) >= UPT_SP(&current->thread.regs.regs))
19 19
20#include <asm/user.h>
21
22/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
23static inline void rep_nop(void)
24{
25 __asm__ __volatile__("rep;nop": : :"memory");
26}
27
28#define cpu_relax() rep_nop()
29
20#include <asm/processor-generic.h> 30#include <asm/processor-generic.h>
21 31
22#endif 32#endif
diff --git a/arch/x86/um/asm/processor_32.h b/arch/x86/um/asm/processor_32.h
index 018f732704dd..6c6689e574ce 100644
--- a/arch/x86/um/asm/processor_32.h
+++ b/arch/x86/um/asm/processor_32.h
@@ -45,16 +45,6 @@ static inline void arch_copy_thread(struct arch_thread *from,
45 memcpy(&to->tls_array, &from->tls_array, sizeof(from->tls_array)); 45 memcpy(&to->tls_array, &from->tls_array, sizeof(from->tls_array));
46} 46}
47 47
48#include <asm/user.h>
49
50/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
51static inline void rep_nop(void)
52{
53 __asm__ __volatile__("rep;nop": : :"memory");
54}
55
56#define cpu_relax() rep_nop()
57
58/* 48/*
59 * Default implementation of macro that returns current 49 * Default implementation of macro that returns current
60 * instruction pointer ("program counter"). Stolen 50 * instruction pointer ("program counter"). Stolen
diff --git a/arch/x86/um/asm/processor_64.h b/arch/x86/um/asm/processor_64.h
index 61de92d916c3..4b02a8455bd1 100644
--- a/arch/x86/um/asm/processor_64.h
+++ b/arch/x86/um/asm/processor_64.h
@@ -14,14 +14,6 @@ struct arch_thread {
14 struct faultinfo faultinfo; 14 struct faultinfo faultinfo;
15}; 15};
16 16
17/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
18static inline void rep_nop(void)
19{
20 __asm__ __volatile__("rep;nop": : :"memory");
21}
22
23#define cpu_relax() rep_nop()
24
25#define INIT_ARCH_THREAD { .debugregs = { [ 0 ... 7 ] = 0 }, \ 17#define INIT_ARCH_THREAD { .debugregs = { [ 0 ... 7 ] = 0 }, \
26 .debugregs_seq = 0, \ 18 .debugregs_seq = 0, \
27 .fs = 0, \ 19 .fs = 0, \
@@ -37,8 +29,6 @@ static inline void arch_copy_thread(struct arch_thread *from,
37 to->fs = from->fs; 29 to->fs = from->fs;
38} 30}
39 31
40#include <asm/user.h>
41
42#define current_text_addr() \ 32#define current_text_addr() \
43 ({ void *pc; __asm__("movq $1f,%0\n1:":"=g" (pc)); pc; }) 33 ({ void *pc; __asm__("movq $1f,%0\n1:":"=g" (pc)); pc; })
44 34
diff --git a/arch/x86/um/bugs_32.c b/arch/x86/um/bugs_32.c
index a1fba5fb9dbe..17d88cf2c6c4 100644
--- a/arch/x86/um/bugs_32.c
+++ b/arch/x86/um/bugs_32.c
@@ -13,8 +13,6 @@
13static int host_has_cmov = 1; 13static int host_has_cmov = 1;
14static jmp_buf cmov_test_return; 14static jmp_buf cmov_test_return;
15 15
16#define TASK_PID(task) *((int *) &(((char *) (task))[HOST_TASK_PID]))
17
18static void cmov_sigill_test_handler(int sig) 16static void cmov_sigill_test_handler(int sig)
19{ 17{
20 host_has_cmov = 0; 18 host_has_cmov = 0;
@@ -51,7 +49,7 @@ void arch_examine_signal(int sig, struct uml_pt_regs *regs)
51 * This is testing for a cmov (0x0f 0x4x) instruction causing a 49 * This is testing for a cmov (0x0f 0x4x) instruction causing a
52 * SIGILL in init. 50 * SIGILL in init.
53 */ 51 */
54 if ((sig != SIGILL) || (TASK_PID(get_current()) != 1)) 52 if ((sig != SIGILL) || (get_current_pid() != 1))
55 return; 53 return;
56 54
57 if (copy_from_user_proc(tmp, (void *) UPT_IP(regs), 2)) { 55 if (copy_from_user_proc(tmp, (void *) UPT_IP(regs), 2)) {
diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
index 1be621841400..284cf3433720 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -1,6 +1,6 @@
1menuconfig MTD 1menuconfig MTD
2 tristate "Memory Technology Device (MTD) support" 2 tristate "Memory Technology Device (MTD) support"
3 depends on HAS_IOMEM 3 depends on GENERIC_IO
4 help 4 help
5 Memory Technology Devices are flash, RAM and similar chips, often 5 Memory Technology Devices are flash, RAM and similar chips, often
6 used for solid state file systems on embedded devices. This option 6 used for solid state file systems on embedded devices. This option
diff --git a/drivers/mtd/devices/Kconfig b/drivers/mtd/devices/Kconfig
index 37b05c3f2792..8d3dac40d7e6 100644
--- a/drivers/mtd/devices/Kconfig
+++ b/drivers/mtd/devices/Kconfig
@@ -1,5 +1,6 @@
1menu "Self-contained MTD device drivers" 1menu "Self-contained MTD device drivers"
2 depends on MTD!=n 2 depends on MTD!=n
3 depends on HAS_IOMEM
3 4
4config MTD_PMC551 5config MTD_PMC551
5 tristate "Ramix PMC551 PCI Mezzanine RAM card support" 6 tristate "Ramix PMC551 PCI Mezzanine RAM card support"
diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
index 6c5c431c64af..8af67cfd671a 100644
--- a/drivers/mtd/maps/Kconfig
+++ b/drivers/mtd/maps/Kconfig
@@ -1,5 +1,6 @@
1menu "Mapping drivers for chip access" 1menu "Mapping drivers for chip access"
2 depends on MTD!=n 2 depends on MTD!=n
3 depends on HAS_IOMEM
3 4
4config MTD_COMPLEX_MAPPINGS 5config MTD_COMPLEX_MAPPINGS
5 bool "Support non-linear mappings of flash chips" 6 bool "Support non-linear mappings of flash chips"
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
index 3d8d2d83995f..a3c4de551ebe 100644
--- a/drivers/mtd/nand/Kconfig
+++ b/drivers/mtd/nand/Kconfig
@@ -246,6 +246,7 @@ config MTD_NAND_BCM_UMI_HWCS
246config MTD_NAND_DISKONCHIP 246config MTD_NAND_DISKONCHIP
247 tristate "DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplementation) (EXPERIMENTAL)" 247 tristate "DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplementation) (EXPERIMENTAL)"
248 depends on EXPERIMENTAL 248 depends on EXPERIMENTAL
249 depends on HAS_IOMEM
249 select REED_SOLOMON 250 select REED_SOLOMON
250 select REED_SOLOMON_DEC16 251 select REED_SOLOMON_DEC16
251 help 252 help
@@ -431,6 +432,7 @@ config MTD_NAND_GPMI_NAND
431 432
432config MTD_NAND_PLATFORM 433config MTD_NAND_PLATFORM
433 tristate "Support for generic platform NAND driver" 434 tristate "Support for generic platform NAND driver"
435 depends on HAS_IOMEM
434 help 436 help
435 This implements a generic NAND driver for on-SOC platform 437 This implements a generic NAND driver for on-SOC platform
436 devices. You will need to provide platform-specific functions 438 devices. You will need to provide platform-specific functions
diff --git a/drivers/mtd/onenand/Kconfig b/drivers/mtd/onenand/Kconfig
index 772ad2966619..91467bb03634 100644
--- a/drivers/mtd/onenand/Kconfig
+++ b/drivers/mtd/onenand/Kconfig
@@ -1,6 +1,7 @@
1menuconfig MTD_ONENAND 1menuconfig MTD_ONENAND
2 tristate "OneNAND Device Support" 2 tristate "OneNAND Device Support"
3 depends on MTD 3 depends on MTD
4 depends on HAS_IOMEM
4 help 5 help
5 This enables support for accessing all type of OneNAND flash 6 This enables support for accessing all type of OneNAND flash
6 devices. For further information see 7 devices. For further information see
diff --git a/fs/hostfs/hostfs.h b/fs/hostfs/hostfs.h
index 3cbfa93cd782..1fe731337f07 100644
--- a/fs/hostfs/hostfs.h
+++ b/fs/hostfs/hostfs.h
@@ -67,7 +67,8 @@ extern int access_file(char *path, int r, int w, int x);
67extern int open_file(char *path, int r, int w, int append); 67extern int open_file(char *path, int r, int w, int append);
68extern void *open_dir(char *path, int *err_out); 68extern void *open_dir(char *path, int *err_out);
69extern char *read_dir(void *stream, unsigned long long *pos, 69extern char *read_dir(void *stream, unsigned long long *pos,
70 unsigned long long *ino_out, int *len_out); 70 unsigned long long *ino_out, int *len_out,
71 unsigned int *type_out);
71extern void close_file(void *stream); 72extern void close_file(void *stream);
72extern int replace_file(int oldfd, int fd); 73extern int replace_file(int oldfd, int fd);
73extern void close_dir(void *stream); 74extern void close_dir(void *stream);
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c
index 588d45885a6f..07c516bfea76 100644
--- a/fs/hostfs/hostfs_kern.c
+++ b/fs/hostfs/hostfs_kern.c
@@ -283,6 +283,7 @@ int hostfs_readdir(struct file *file, void *ent, filldir_t filldir)
283 char *name; 283 char *name;
284 unsigned long long next, ino; 284 unsigned long long next, ino;
285 int error, len; 285 int error, len;
286 unsigned int type;
286 287
287 name = dentry_name(file->f_path.dentry); 288 name = dentry_name(file->f_path.dentry);
288 if (name == NULL) 289 if (name == NULL)
@@ -292,9 +293,9 @@ int hostfs_readdir(struct file *file, void *ent, filldir_t filldir)
292 if (dir == NULL) 293 if (dir == NULL)
293 return -error; 294 return -error;
294 next = file->f_pos; 295 next = file->f_pos;
295 while ((name = read_dir(dir, &next, &ino, &len)) != NULL) { 296 while ((name = read_dir(dir, &next, &ino, &len, &type)) != NULL) {
296 error = (*filldir)(ent, name, len, file->f_pos, 297 error = (*filldir)(ent, name, len, file->f_pos,
297 ino, DT_UNKNOWN); 298 ino, type);
298 if (error) break; 299 if (error) break;
299 file->f_pos = next; 300 file->f_pos = next;
300 } 301 }
diff --git a/fs/hostfs/hostfs_user.c b/fs/hostfs/hostfs_user.c
index dd7bc38a3825..a74ad0d371c2 100644
--- a/fs/hostfs/hostfs_user.c
+++ b/fs/hostfs/hostfs_user.c
@@ -98,7 +98,8 @@ void *open_dir(char *path, int *err_out)
98} 98}
99 99
100char *read_dir(void *stream, unsigned long long *pos, 100char *read_dir(void *stream, unsigned long long *pos,
101 unsigned long long *ino_out, int *len_out) 101 unsigned long long *ino_out, int *len_out,
102 unsigned int *type_out)
102{ 103{
103 DIR *dir = stream; 104 DIR *dir = stream;
104 struct dirent *ent; 105 struct dirent *ent;
@@ -109,6 +110,7 @@ char *read_dir(void *stream, unsigned long long *pos,
109 return NULL; 110 return NULL;
110 *len_out = strlen(ent->d_name); 111 *len_out = strlen(ent->d_name);
111 *ino_out = ent->d_ino; 112 *ino_out = ent->d_ino;
113 *type_out = ent->d_type;
112 *pos = telldir(dir); 114 *pos = telldir(dir);
113 return ent->d_name; 115 return ent->d_name;
114} 116}
diff --git a/lib/Kconfig b/lib/Kconfig
index 43359bb1ca90..a0e5900a9d85 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -29,6 +29,10 @@ config GENERIC_IOMAP
29 bool 29 bool
30 select GENERIC_PCI_IOMAP 30 select GENERIC_PCI_IOMAP
31 31
32config GENERIC_IO
33 boolean
34 default n
35
32config CRC_CCITT 36config CRC_CCITT
33 tristate "CRC-CCITT functions" 37 tristate "CRC-CCITT functions"
34 help 38 help
@@ -277,6 +281,7 @@ config BTREE
277config HAS_IOMEM 281config HAS_IOMEM
278 boolean 282 boolean
279 depends on !NO_IOMEM 283 depends on !NO_IOMEM
284 select GENERIC_IO
280 default y 285 default y
281 286
282config HAS_IOPORT 287config HAS_IOPORT