Annotation of /trunk/kernel26-magellan/patches-2.6.25-r5/0115-2.6.25.16-all-fixes.patch
Parent Directory | Revision Log
Revision 677 -
(hide annotations)
(download)
Wed Sep 10 21:27:27 2008 UTC (16 years ago) by niro
File size: 60934 byte(s)
Wed Sep 10 21:27:27 2008 UTC (16 years ago) by niro
File size: 60934 byte(s)
2.6.25-magellan-r5: - updated to linux-2.6.25.17
1 | niro | 677 | diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c |
2 | index ec016cb..6165841 100644 | ||
3 | --- a/arch/sparc64/kernel/signal.c | ||
4 | +++ b/arch/sparc64/kernel/signal.c | ||
5 | @@ -2,7 +2,7 @@ | ||
6 | * arch/sparc64/kernel/signal.c | ||
7 | * | ||
8 | * Copyright (C) 1991, 1992 Linus Torvalds | ||
9 | - * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | ||
10 | + * Copyright (C) 1995, 2008 David S. Miller (davem@davemloft.net) | ||
11 | * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx) | ||
12 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) | ||
13 | * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | ||
14 | @@ -90,7 +90,9 @@ asmlinkage void sparc64_set_context(struct pt_regs *regs) | ||
15 | err |= __get_user(regs->u_regs[UREG_G4], (&(*grp)[MC_G4])); | ||
16 | err |= __get_user(regs->u_regs[UREG_G5], (&(*grp)[MC_G5])); | ||
17 | err |= __get_user(regs->u_regs[UREG_G6], (&(*grp)[MC_G6])); | ||
18 | - err |= __get_user(regs->u_regs[UREG_G7], (&(*grp)[MC_G7])); | ||
19 | + | ||
20 | + /* Skip %g7 as that's the thread register in userspace. */ | ||
21 | + | ||
22 | err |= __get_user(regs->u_regs[UREG_I0], (&(*grp)[MC_O0])); | ||
23 | err |= __get_user(regs->u_regs[UREG_I1], (&(*grp)[MC_O1])); | ||
24 | err |= __get_user(regs->u_regs[UREG_I2], (&(*grp)[MC_O2])); | ||
25 | diff --git a/arch/um/Makefile b/arch/um/Makefile | ||
26 | index dbeab15..ca40397 100644 | ||
27 | --- a/arch/um/Makefile | ||
28 | +++ b/arch/um/Makefile | ||
29 | @@ -77,7 +77,6 @@ include $(srctree)/$(ARCH_DIR)/Makefile-os-$(OS) | ||
30 | KERNEL_DEFINES = $(strip -Derrno=kernel_errno -Dsigprocmask=kernel_sigprocmask \ | ||
31 | -Dmktime=kernel_mktime $(ARCH_KERNEL_DEFINES)) | ||
32 | KBUILD_CFLAGS += $(KERNEL_DEFINES) | ||
33 | -KBUILD_CFLAGS += $(call cc-option,-fno-unit-at-a-time,) | ||
34 | |||
35 | PHONY += linux | ||
36 | |||
37 | diff --git a/arch/um/Makefile-i386 b/arch/um/Makefile-i386 | ||
38 | index 561e373..302cbe5 100644 | ||
39 | --- a/arch/um/Makefile-i386 | ||
40 | +++ b/arch/um/Makefile-i386 | ||
41 | @@ -32,4 +32,11 @@ cflags-y += $(call cc-option,-mpreferred-stack-boundary=2) | ||
42 | # an unresolved reference. | ||
43 | cflags-y += -ffreestanding | ||
44 | |||
45 | +# Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use | ||
46 | +# a lot more stack due to the lack of sharing of stacklots. Also, gcc | ||
47 | +# 4.3.0 needs -funit-at-a-time for extern inline functions. | ||
48 | +KBUILD_CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then \ | ||
49 | + echo $(call cc-option,-fno-unit-at-a-time); \ | ||
50 | + else echo $(call cc-option,-funit-at-a-time); fi ;) | ||
51 | + | ||
52 | KBUILD_CFLAGS += $(cflags-y) | ||
53 | diff --git a/arch/um/Makefile-x86_64 b/arch/um/Makefile-x86_64 | ||
54 | index 8ed362f..a9cd7e7 100644 | ||
55 | --- a/arch/um/Makefile-x86_64 | ||
56 | +++ b/arch/um/Makefile-x86_64 | ||
57 | @@ -21,3 +21,6 @@ HEADER_ARCH := x86 | ||
58 | |||
59 | LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib64 | ||
60 | LINK-y += -m64 | ||
61 | + | ||
62 | +# Do unit-at-a-time unconditionally on x86_64, following the host | ||
63 | +KBUILD_CFLAGS += $(call cc-option,-funit-at-a-time) | ||
64 | diff --git a/arch/um/drivers/chan_user.c b/arch/um/drivers/chan_user.c | ||
65 | index 0257640..cfeb3f4 100644 | ||
66 | --- a/arch/um/drivers/chan_user.c | ||
67 | +++ b/arch/um/drivers/chan_user.c | ||
68 | @@ -11,6 +11,7 @@ | ||
69 | #include <termios.h> | ||
70 | #include <sys/ioctl.h> | ||
71 | #include "chan_user.h" | ||
72 | +#include "kern_constants.h" | ||
73 | #include "os.h" | ||
74 | #include "um_malloc.h" | ||
75 | #include "user.h" | ||
76 | diff --git a/arch/um/drivers/cow_sys.h b/arch/um/drivers/cow_sys.h | ||
77 | index ca8c9e1..f5701fd 100644 | ||
78 | --- a/arch/um/drivers/cow_sys.h | ||
79 | +++ b/arch/um/drivers/cow_sys.h | ||
80 | @@ -8,7 +8,7 @@ | ||
81 | |||
82 | static inline void *cow_malloc(int size) | ||
83 | { | ||
84 | - return kmalloc(size, UM_GFP_KERNEL); | ||
85 | + return uml_kmalloc(size, UM_GFP_KERNEL); | ||
86 | } | ||
87 | |||
88 | static inline void cow_free(void *ptr) | ||
89 | diff --git a/arch/um/drivers/daemon_user.c b/arch/um/drivers/daemon_user.c | ||
90 | index f23c109..f8e85e0 100644 | ||
91 | --- a/arch/um/drivers/daemon_user.c | ||
92 | +++ b/arch/um/drivers/daemon_user.c | ||
93 | @@ -34,7 +34,7 @@ static struct sockaddr_un *new_addr(void *name, int len) | ||
94 | { | ||
95 | struct sockaddr_un *sun; | ||
96 | |||
97 | - sun = kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL); | ||
98 | + sun = uml_kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL); | ||
99 | if (sun == NULL) { | ||
100 | printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un " | ||
101 | "failed\n"); | ||
102 | @@ -83,7 +83,7 @@ static int connect_to_switch(struct daemon_data *pri) | ||
103 | goto out_close; | ||
104 | } | ||
105 | |||
106 | - sun = kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL); | ||
107 | + sun = uml_kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL); | ||
108 | if (sun == NULL) { | ||
109 | printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un " | ||
110 | "failed\n"); | ||
111 | diff --git a/arch/um/drivers/fd.c b/arch/um/drivers/fd.c | ||
112 | index 0a2bb5b..f5a981a 100644 | ||
113 | --- a/arch/um/drivers/fd.c | ||
114 | +++ b/arch/um/drivers/fd.c | ||
115 | @@ -40,7 +40,7 @@ static void *fd_init(char *str, int device, const struct chan_opts *opts) | ||
116 | return NULL; | ||
117 | } | ||
118 | |||
119 | - data = kmalloc(sizeof(*data), UM_GFP_KERNEL); | ||
120 | + data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL); | ||
121 | if (data == NULL) | ||
122 | return NULL; | ||
123 | |||
124 | diff --git a/arch/um/drivers/mcast_user.c b/arch/um/drivers/mcast_user.c | ||
125 | index 5f647d7..ee19e91 100644 | ||
126 | --- a/arch/um/drivers/mcast_user.c | ||
127 | +++ b/arch/um/drivers/mcast_user.c | ||
128 | @@ -15,6 +15,7 @@ | ||
129 | #include <unistd.h> | ||
130 | #include <errno.h> | ||
131 | #include <netinet/in.h> | ||
132 | +#include "kern_constants.h" | ||
133 | #include "mcast.h" | ||
134 | #include "net_user.h" | ||
135 | #include "um_malloc.h" | ||
136 | @@ -24,7 +25,7 @@ static struct sockaddr_in *new_addr(char *addr, unsigned short port) | ||
137 | { | ||
138 | struct sockaddr_in *sin; | ||
139 | |||
140 | - sin = kmalloc(sizeof(struct sockaddr_in), UM_GFP_KERNEL); | ||
141 | + sin = uml_kmalloc(sizeof(struct sockaddr_in), UM_GFP_KERNEL); | ||
142 | if (sin == NULL) { | ||
143 | printk(UM_KERN_ERR "new_addr: allocation of sockaddr_in " | ||
144 | "failed\n"); | ||
145 | diff --git a/arch/um/drivers/net_user.c b/arch/um/drivers/net_user.c | ||
146 | index abf2653..9415dd9 100644 | ||
147 | --- a/arch/um/drivers/net_user.c | ||
148 | +++ b/arch/um/drivers/net_user.c | ||
149 | @@ -222,7 +222,7 @@ static void change(char *dev, char *what, unsigned char *addr, | ||
150 | netmask[2], netmask[3]); | ||
151 | |||
152 | output_len = UM_KERN_PAGE_SIZE; | ||
153 | - output = kmalloc(output_len, UM_GFP_KERNEL); | ||
154 | + output = uml_kmalloc(output_len, UM_GFP_KERNEL); | ||
155 | if (output == NULL) | ||
156 | printk(UM_KERN_ERR "change : failed to allocate output " | ||
157 | "buffer\n"); | ||
158 | diff --git a/arch/um/drivers/pcap_user.c b/arch/um/drivers/pcap_user.c | ||
159 | index e980935..5f90358 100644 | ||
160 | --- a/arch/um/drivers/pcap_user.c | ||
161 | +++ b/arch/um/drivers/pcap_user.c | ||
162 | @@ -50,7 +50,7 @@ static int pcap_open(void *data) | ||
163 | return -EIO; | ||
164 | } | ||
165 | |||
166 | - pri->compiled = kmalloc(sizeof(struct bpf_program), | ||
167 | + pri->compiled = uml_kmalloc(sizeof(struct bpf_program), | ||
168 | UM_GFP_KERNEL); | ||
169 | if (pri->compiled == NULL) { | ||
170 | printk(UM_KERN_ERR "pcap_open : kmalloc failed\n"); | ||
171 | diff --git a/arch/um/drivers/port_user.c b/arch/um/drivers/port_user.c | ||
172 | index addd759..8a191f1 100644 | ||
173 | --- a/arch/um/drivers/port_user.c | ||
174 | +++ b/arch/um/drivers/port_user.c | ||
175 | @@ -47,7 +47,7 @@ static void *port_init(char *str, int device, const struct chan_opts *opts) | ||
176 | if (kern_data == NULL) | ||
177 | return NULL; | ||
178 | |||
179 | - data = kmalloc(sizeof(*data), UM_GFP_KERNEL); | ||
180 | + data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL); | ||
181 | if (data == NULL) | ||
182 | goto err; | ||
183 | |||
184 | diff --git a/arch/um/drivers/pty.c b/arch/um/drivers/pty.c | ||
185 | index 49c79dd..1113911 100644 | ||
186 | --- a/arch/um/drivers/pty.c | ||
187 | +++ b/arch/um/drivers/pty.c | ||
188 | @@ -29,7 +29,7 @@ static void *pty_chan_init(char *str, int device, const struct chan_opts *opts) | ||
189 | { | ||
190 | struct pty_chan *data; | ||
191 | |||
192 | - data = kmalloc(sizeof(*data), UM_GFP_KERNEL); | ||
193 | + data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL); | ||
194 | if (data == NULL) | ||
195 | return NULL; | ||
196 | |||
197 | diff --git a/arch/um/drivers/slip_user.c b/arch/um/drivers/slip_user.c | ||
198 | index 8b80505..a1c2d2c 100644 | ||
199 | --- a/arch/um/drivers/slip_user.c | ||
200 | +++ b/arch/um/drivers/slip_user.c | ||
201 | @@ -96,7 +96,7 @@ static int slip_tramp(char **argv, int fd) | ||
202 | pid = err; | ||
203 | |||
204 | output_len = UM_KERN_PAGE_SIZE; | ||
205 | - output = kmalloc(output_len, UM_GFP_KERNEL); | ||
206 | + output = uml_kmalloc(output_len, UM_GFP_KERNEL); | ||
207 | if (output == NULL) { | ||
208 | printk(UM_KERN_ERR "slip_tramp : failed to allocate output " | ||
209 | "buffer\n"); | ||
210 | diff --git a/arch/um/drivers/tty.c b/arch/um/drivers/tty.c | ||
211 | index c930fed..495858a 100644 | ||
212 | --- a/arch/um/drivers/tty.c | ||
213 | +++ b/arch/um/drivers/tty.c | ||
214 | @@ -29,7 +29,7 @@ static void *tty_chan_init(char *str, int device, const struct chan_opts *opts) | ||
215 | } | ||
216 | str++; | ||
217 | |||
218 | - data = kmalloc(sizeof(*data), UM_GFP_KERNEL); | ||
219 | + data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL); | ||
220 | if (data == NULL) | ||
221 | return NULL; | ||
222 | *data = ((struct tty_chan) { .dev = str, | ||
223 | diff --git a/arch/um/drivers/xterm.c b/arch/um/drivers/xterm.c | ||
224 | index 8a1c18a..da2caa5 100644 | ||
225 | --- a/arch/um/drivers/xterm.c | ||
226 | +++ b/arch/um/drivers/xterm.c | ||
227 | @@ -30,7 +30,7 @@ static void *xterm_init(char *str, int device, const struct chan_opts *opts) | ||
228 | { | ||
229 | struct xterm_chan *data; | ||
230 | |||
231 | - data = kmalloc(sizeof(*data), UM_GFP_KERNEL); | ||
232 | + data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL); | ||
233 | if (data == NULL) | ||
234 | return NULL; | ||
235 | *data = ((struct xterm_chan) { .pid = -1, | ||
236 | diff --git a/arch/um/include/init.h b/arch/um/include/init.h | ||
237 | index b00a957..37dd097 100644 | ||
238 | --- a/arch/um/include/init.h | ||
239 | +++ b/arch/um/include/init.h | ||
240 | @@ -45,6 +45,8 @@ typedef void (*exitcall_t)(void); | ||
241 | # define __section(S) __attribute__ ((__section__(#S))) | ||
242 | #endif | ||
243 | |||
244 | +#if __GNUC__ == 3 | ||
245 | + | ||
246 | #if __GNUC_MINOR__ >= 3 | ||
247 | # define __used __attribute__((__used__)) | ||
248 | #else | ||
249 | @@ -52,6 +54,12 @@ typedef void (*exitcall_t)(void); | ||
250 | #endif | ||
251 | |||
252 | #else | ||
253 | +#if __GNUC__ == 4 | ||
254 | +# define __used __attribute__((__used__)) | ||
255 | +#endif | ||
256 | +#endif | ||
257 | + | ||
258 | +#else | ||
259 | #include <linux/compiler.h> | ||
260 | #endif | ||
261 | /* These are for everybody (although not all archs will actually | ||
262 | diff --git a/arch/um/include/os.h b/arch/um/include/os.h | ||
263 | index 32c799e..2d0a2a6 100644 | ||
264 | --- a/arch/um/include/os.h | ||
265 | +++ b/arch/um/include/os.h | ||
266 | @@ -298,6 +298,6 @@ extern int os_arch_prctl(int pid, int code, unsigned long *addr); | ||
267 | extern int get_pty(void); | ||
268 | |||
269 | /* sys-$ARCH/task_size.c */ | ||
270 | -extern unsigned long os_get_task_size(void); | ||
271 | +extern unsigned long os_get_top_address(void); | ||
272 | |||
273 | #endif | ||
274 | diff --git a/arch/um/include/process.h b/arch/um/include/process.h | ||
275 | index 5af9157..348f8a3 100644 | ||
276 | --- a/arch/um/include/process.h | ||
277 | +++ b/arch/um/include/process.h | ||
278 | @@ -8,8 +8,8 @@ | ||
279 | |||
280 | #include <signal.h> | ||
281 | |||
282 | -extern void sig_handler(int sig, struct sigcontext sc); | ||
283 | -extern void alarm_handler(int sig, struct sigcontext sc); | ||
284 | +extern void sig_handler(int sig, struct sigcontext *sc); | ||
285 | +extern void alarm_handler(int sig, struct sigcontext *sc); | ||
286 | |||
287 | #endif | ||
288 | |||
289 | diff --git a/arch/um/include/um_malloc.h b/arch/um/include/um_malloc.h | ||
290 | index 0ad17cb..c554d70 100644 | ||
291 | --- a/arch/um/include/um_malloc.h | ||
292 | +++ b/arch/um/include/um_malloc.h | ||
293 | @@ -8,15 +8,12 @@ | ||
294 | |||
295 | #include "kern_constants.h" | ||
296 | |||
297 | -extern void *__kmalloc(int size, int flags); | ||
298 | -static inline void *kmalloc(int size, int flags) | ||
299 | -{ | ||
300 | - return __kmalloc(size, flags); | ||
301 | -} | ||
302 | - | ||
303 | +extern void *uml_kmalloc(int size, int flags); | ||
304 | extern void kfree(const void *ptr); | ||
305 | |||
306 | extern void *vmalloc(unsigned long size); | ||
307 | extern void vfree(void *ptr); | ||
308 | |||
309 | #endif /* __UM_MALLOC_H__ */ | ||
310 | + | ||
311 | + | ||
312 | diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c | ||
313 | index 2eea1ff..b0ee646 100644 | ||
314 | --- a/arch/um/kernel/mem.c | ||
315 | +++ b/arch/um/kernel/mem.c | ||
316 | @@ -375,3 +375,8 @@ pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) | ||
317 | return pmd; | ||
318 | } | ||
319 | #endif | ||
320 | + | ||
321 | +void *uml_kmalloc(int size, int flags) | ||
322 | +{ | ||
323 | + return kmalloc(size, flags); | ||
324 | +} | ||
325 | diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c | ||
326 | index e066e84..5036c81 100644 | ||
327 | --- a/arch/um/kernel/time.c | ||
328 | +++ b/arch/um/kernel/time.c | ||
329 | @@ -74,7 +74,7 @@ static irqreturn_t um_timer(int irq, void *dev) | ||
330 | |||
331 | static cycle_t itimer_read(void) | ||
332 | { | ||
333 | - return os_nsecs(); | ||
334 | + return os_nsecs() / 1000; | ||
335 | } | ||
336 | |||
337 | static struct clocksource itimer_clocksource = { | ||
338 | @@ -82,7 +82,7 @@ static struct clocksource itimer_clocksource = { | ||
339 | .rating = 300, | ||
340 | .read = itimer_read, | ||
341 | .mask = CLOCKSOURCE_MASK(64), | ||
342 | - .mult = 1, | ||
343 | + .mult = 1000, | ||
344 | .shift = 0, | ||
345 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
346 | }; | ||
347 | diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c | ||
348 | index a6c1dd1..d1fe222 100644 | ||
349 | --- a/arch/um/kernel/um_arch.c | ||
350 | +++ b/arch/um/kernel/um_arch.c | ||
351 | @@ -259,6 +259,7 @@ int __init linux_main(int argc, char **argv) | ||
352 | unsigned long avail, diff; | ||
353 | unsigned long virtmem_size, max_physmem; | ||
354 | unsigned int i, add; | ||
355 | + unsigned long stack; | ||
356 | char * mode; | ||
357 | |||
358 | for (i = 1; i < argc; i++) { | ||
359 | @@ -272,7 +273,7 @@ int __init linux_main(int argc, char **argv) | ||
360 | if (have_root == 0) | ||
361 | add_arg(DEFAULT_COMMAND_LINE); | ||
362 | |||
363 | - host_task_size = os_get_task_size(); | ||
364 | + host_task_size = os_get_top_address(); | ||
365 | /* | ||
366 | * TASK_SIZE needs to be PGDIR_SIZE aligned or else exit_mmap craps | ||
367 | * out | ||
368 | @@ -347,7 +348,9 @@ int __init linux_main(int argc, char **argv) | ||
369 | } | ||
370 | |||
371 | virtmem_size = physmem_size; | ||
372 | - avail = TASK_SIZE - start_vm; | ||
373 | + stack = (unsigned long) argv; | ||
374 | + stack &= ~(1024 * 1024 - 1); | ||
375 | + avail = stack - start_vm; | ||
376 | if (physmem_size > avail) | ||
377 | virtmem_size = avail; | ||
378 | end_vm = start_vm + virtmem_size; | ||
379 | diff --git a/arch/um/os-Linux/drivers/ethertap_user.c b/arch/um/os-Linux/drivers/ethertap_user.c | ||
380 | index 6fb0b17..cc72cb2 100644 | ||
381 | --- a/arch/um/os-Linux/drivers/ethertap_user.c | ||
382 | +++ b/arch/um/os-Linux/drivers/ethertap_user.c | ||
383 | @@ -52,7 +52,7 @@ static void etap_change(int op, unsigned char *addr, unsigned char *netmask, | ||
384 | return; | ||
385 | } | ||
386 | |||
387 | - output = kmalloc(UM_KERN_PAGE_SIZE, UM_GFP_KERNEL); | ||
388 | + output = uml_kmalloc(UM_KERN_PAGE_SIZE, UM_GFP_KERNEL); | ||
389 | if (output == NULL) | ||
390 | printk(UM_KERN_ERR "etap_change : Failed to allocate output " | ||
391 | "buffer\n"); | ||
392 | @@ -165,7 +165,7 @@ static int etap_open(void *data) | ||
393 | err = etap_tramp(pri->dev_name, pri->gate_addr, control_fds[0], | ||
394 | control_fds[1], data_fds[0], data_fds[1]); | ||
395 | output_len = UM_KERN_PAGE_SIZE; | ||
396 | - output = kmalloc(output_len, UM_GFP_KERNEL); | ||
397 | + output = uml_kmalloc(output_len, UM_GFP_KERNEL); | ||
398 | read_output(control_fds[0], output, output_len); | ||
399 | |||
400 | if (output == NULL) | ||
401 | diff --git a/arch/um/os-Linux/helper.c b/arch/um/os-Linux/helper.c | ||
402 | index f4bd349..b6b1096 100644 | ||
403 | --- a/arch/um/os-Linux/helper.c | ||
404 | +++ b/arch/um/os-Linux/helper.c | ||
405 | @@ -7,6 +7,7 @@ | ||
406 | #include <unistd.h> | ||
407 | #include <errno.h> | ||
408 | #include <sched.h> | ||
409 | +#include <linux/limits.h> | ||
410 | #include <sys/socket.h> | ||
411 | #include <sys/wait.h> | ||
412 | #include "kern_constants.h" | ||
413 | @@ -70,8 +71,8 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv) | ||
414 | data.pre_data = pre_data; | ||
415 | data.argv = argv; | ||
416 | data.fd = fds[1]; | ||
417 | - data.buf = __cant_sleep() ? kmalloc(PATH_MAX, UM_GFP_ATOMIC) : | ||
418 | - kmalloc(PATH_MAX, UM_GFP_KERNEL); | ||
419 | + data.buf = __cant_sleep() ? uml_kmalloc(PATH_MAX, UM_GFP_ATOMIC) : | ||
420 | + uml_kmalloc(PATH_MAX, UM_GFP_KERNEL); | ||
421 | pid = clone(helper_child, (void *) sp, CLONE_VM, &data); | ||
422 | if (pid < 0) { | ||
423 | ret = -errno; | ||
424 | diff --git a/arch/um/os-Linux/main.c b/arch/um/os-Linux/main.c | ||
425 | index abb9b0f..eee69b9 100644 | ||
426 | --- a/arch/um/os-Linux/main.c | ||
427 | +++ b/arch/um/os-Linux/main.c | ||
428 | @@ -199,7 +199,7 @@ void *__wrap_malloc(int size) | ||
429 | return __real_malloc(size); | ||
430 | else if (size <= UM_KERN_PAGE_SIZE) | ||
431 | /* finding contiguous pages can be hard*/ | ||
432 | - ret = kmalloc(size, UM_GFP_KERNEL); | ||
433 | + ret = uml_kmalloc(size, UM_GFP_KERNEL); | ||
434 | else ret = vmalloc(size); | ||
435 | |||
436 | /* | ||
437 | diff --git a/arch/um/os-Linux/sigio.c b/arch/um/os-Linux/sigio.c | ||
438 | index abf47a7..0578481 100644 | ||
439 | --- a/arch/um/os-Linux/sigio.c | ||
440 | +++ b/arch/um/os-Linux/sigio.c | ||
441 | @@ -109,7 +109,7 @@ static int need_poll(struct pollfds *polls, int n) | ||
442 | if (n <= polls->size) | ||
443 | return 0; | ||
444 | |||
445 | - new = kmalloc(n * sizeof(struct pollfd), UM_GFP_ATOMIC); | ||
446 | + new = uml_kmalloc(n * sizeof(struct pollfd), UM_GFP_ATOMIC); | ||
447 | if (new == NULL) { | ||
448 | printk(UM_KERN_ERR "need_poll : failed to allocate new " | ||
449 | "pollfds\n"); | ||
450 | @@ -243,7 +243,7 @@ static struct pollfd *setup_initial_poll(int fd) | ||
451 | { | ||
452 | struct pollfd *p; | ||
453 | |||
454 | - p = kmalloc(sizeof(struct pollfd), UM_GFP_KERNEL); | ||
455 | + p = uml_kmalloc(sizeof(struct pollfd), UM_GFP_KERNEL); | ||
456 | if (p == NULL) { | ||
457 | printk(UM_KERN_ERR "setup_initial_poll : failed to allocate " | ||
458 | "poll\n"); | ||
459 | diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c | ||
460 | index 3f1694b..5aade60 100644 | ||
461 | --- a/arch/um/os-Linux/signal.c | ||
462 | +++ b/arch/um/os-Linux/signal.c | ||
463 | @@ -12,6 +12,7 @@ | ||
464 | #include "as-layout.h" | ||
465 | #include "kern_util.h" | ||
466 | #include "os.h" | ||
467 | +#include "process.h" | ||
468 | #include "sysdep/barrier.h" | ||
469 | #include "sysdep/sigcontext.h" | ||
470 | #include "user.h" | ||
471 | diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c | ||
472 | index 1e8cba6..2328098 100644 | ||
473 | --- a/arch/um/os-Linux/skas/process.c | ||
474 | +++ b/arch/um/os-Linux/skas/process.c | ||
475 | @@ -55,7 +55,7 @@ static int ptrace_dump_regs(int pid) | ||
476 | * Signals that are OK to receive in the stub - we'll just continue it. | ||
477 | * SIGWINCH will happen when UML is inside a detached screen. | ||
478 | */ | ||
479 | -#define STUB_SIG_MASK (1 << SIGVTALRM) | ||
480 | +#define STUB_SIG_MASK ((1 << SIGVTALRM) | (1 << SIGWINCH)) | ||
481 | |||
482 | /* Signals that the stub will finish with - anything else is an error */ | ||
483 | #define STUB_DONE_MASK (1 << SIGTRAP) | ||
484 | diff --git a/arch/um/os-Linux/start_up.c b/arch/um/os-Linux/start_up.c | ||
485 | index b616e15..fd71bdb 100644 | ||
486 | --- a/arch/um/os-Linux/start_up.c | ||
487 | +++ b/arch/um/os-Linux/start_up.c | ||
488 | @@ -122,8 +122,10 @@ static int stop_ptraced_child(int pid, int exitcode, int mustexit) | ||
489 | { | ||
490 | int status, n, ret = 0; | ||
491 | |||
492 | - if (ptrace(PTRACE_CONT, pid, 0, 0) < 0) | ||
493 | - fatal_perror("stop_ptraced_child : ptrace failed"); | ||
494 | + if (ptrace(PTRACE_CONT, pid, 0, 0) < 0) { | ||
495 | + perror("stop_ptraced_child : ptrace failed"); | ||
496 | + return -1; | ||
497 | + } | ||
498 | CATCH_EINTR(n = waitpid(pid, &status, 0)); | ||
499 | if (!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) { | ||
500 | int exit_with = WEXITSTATUS(status); | ||
501 | @@ -203,7 +205,7 @@ static void __init check_sysemu(void) | ||
502 | if (n < 0) | ||
503 | fatal_perror("check_sysemu : wait failed"); | ||
504 | if (!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP)) | ||
505 | - fatal("check_sysemu : expected SIGTRAP, got status = %d", | ||
506 | + fatal("check_sysemu : expected SIGTRAP, got status = %d\n", | ||
507 | status); | ||
508 | |||
509 | if (ptrace(PTRACE_GETREGS, pid, 0, regs) < 0) | ||
510 | @@ -245,9 +247,11 @@ static void __init check_sysemu(void) | ||
511 | |||
512 | if (WIFSTOPPED(status) && | ||
513 | (WSTOPSIG(status) == (SIGTRAP|0x80))) { | ||
514 | - if (!count) | ||
515 | - fatal("check_ptrace : SYSEMU_SINGLESTEP " | ||
516 | - "doesn't singlestep"); | ||
517 | + if (!count) { | ||
518 | + non_fatal("check_ptrace : SYSEMU_SINGLESTEP " | ||
519 | + "doesn't singlestep"); | ||
520 | + goto fail; | ||
521 | + } | ||
522 | n = ptrace(PTRACE_POKEUSR, pid, PT_SYSCALL_RET_OFFSET, | ||
523 | os_getpid()); | ||
524 | if (n < 0) | ||
525 | @@ -257,9 +261,12 @@ static void __init check_sysemu(void) | ||
526 | } | ||
527 | else if (WIFSTOPPED(status) && (WSTOPSIG(status) == SIGTRAP)) | ||
528 | count++; | ||
529 | - else | ||
530 | - fatal("check_ptrace : expected SIGTRAP or " | ||
531 | - "(SIGTRAP | 0x80), got status = %d", status); | ||
532 | + else { | ||
533 | + non_fatal("check_ptrace : expected SIGTRAP or " | ||
534 | + "(SIGTRAP | 0x80), got status = %d\n", | ||
535 | + status); | ||
536 | + goto fail; | ||
537 | + } | ||
538 | } | ||
539 | if (stop_ptraced_child(pid, 0, 0) < 0) | ||
540 | goto fail_stopped; | ||
541 | diff --git a/arch/um/os-Linux/sys-i386/task_size.c b/arch/um/os-Linux/sys-i386/task_size.c | ||
542 | index 48d211b..4d26d5d 100644 | ||
543 | --- a/arch/um/os-Linux/sys-i386/task_size.c | ||
544 | +++ b/arch/um/os-Linux/sys-i386/task_size.c | ||
545 | @@ -63,7 +63,7 @@ static int page_ok(unsigned long page) | ||
546 | return ok; | ||
547 | } | ||
548 | |||
549 | -unsigned long os_get_task_size(void) | ||
550 | +unsigned long os_get_top_address(void) | ||
551 | { | ||
552 | struct sigaction sa, old; | ||
553 | unsigned long bottom = 0; | ||
554 | @@ -76,9 +76,9 @@ unsigned long os_get_task_size(void) | ||
555 | * hosts, but shouldn't hurt otherwise. | ||
556 | */ | ||
557 | unsigned long top = 0xffffd000 >> UM_KERN_PAGE_SHIFT; | ||
558 | - unsigned long test; | ||
559 | + unsigned long test, original; | ||
560 | |||
561 | - printf("Locating the top of the address space ... "); | ||
562 | + printf("Locating the bottom of the address space ... "); | ||
563 | fflush(stdout); | ||
564 | |||
565 | /* | ||
566 | @@ -88,14 +88,32 @@ unsigned long os_get_task_size(void) | ||
567 | sa.sa_handler = segfault; | ||
568 | sigemptyset(&sa.sa_mask); | ||
569 | sa.sa_flags = SA_NODEFER; | ||
570 | - sigaction(SIGSEGV, &sa, &old); | ||
571 | + if (sigaction(SIGSEGV, &sa, &old)) { | ||
572 | + perror("os_get_top_address"); | ||
573 | + exit(1); | ||
574 | + } | ||
575 | |||
576 | - if (!page_ok(bottom)) { | ||
577 | - fprintf(stderr, "Address 0x%x no good?\n", | ||
578 | - bottom << UM_KERN_PAGE_SHIFT); | ||
579 | + /* Manually scan the address space, bottom-up, until we find | ||
580 | + * the first valid page (or run out of them). | ||
581 | + */ | ||
582 | + for (bottom = 0; bottom < top; bottom++) { | ||
583 | + if (page_ok(bottom)) | ||
584 | + break; | ||
585 | + } | ||
586 | + | ||
587 | + /* If we've got this far, we ran out of pages. */ | ||
588 | + if (bottom == top) { | ||
589 | + fprintf(stderr, "Unable to determine bottom of address " | ||
590 | + "space.\n"); | ||
591 | exit(1); | ||
592 | } | ||
593 | |||
594 | + printf("0x%x\n", bottom << UM_KERN_PAGE_SHIFT); | ||
595 | + printf("Locating the top of the address space ... "); | ||
596 | + fflush(stdout); | ||
597 | + | ||
598 | + original = bottom; | ||
599 | + | ||
600 | /* This could happen with a 4G/4G split */ | ||
601 | if (page_ok(top)) | ||
602 | goto out; | ||
603 | @@ -110,8 +128,10 @@ unsigned long os_get_task_size(void) | ||
604 | |||
605 | out: | ||
606 | /* Restore the old SIGSEGV handling */ | ||
607 | - sigaction(SIGSEGV, &old, NULL); | ||
608 | - | ||
609 | + if (sigaction(SIGSEGV, &old, NULL)) { | ||
610 | + perror("os_get_top_address"); | ||
611 | + exit(1); | ||
612 | + } | ||
613 | top <<= UM_KERN_PAGE_SHIFT; | ||
614 | printf("0x%x\n", top); | ||
615 | fflush(stdout); | ||
616 | diff --git a/arch/um/os-Linux/sys-x86_64/task_size.c b/arch/um/os-Linux/sys-x86_64/task_size.c | ||
617 | index fad6f57..26a0dd1 100644 | ||
618 | --- a/arch/um/os-Linux/sys-x86_64/task_size.c | ||
619 | +++ b/arch/um/os-Linux/sys-x86_64/task_size.c | ||
620 | @@ -1,4 +1,4 @@ | ||
621 | -unsigned long os_get_task_size(unsigned long shift) | ||
622 | +unsigned long os_get_top_address(unsigned long shift) | ||
623 | { | ||
624 | /* The old value of CONFIG_TOP_ADDR */ | ||
625 | return 0x7fc0000000; | ||
626 | diff --git a/arch/um/os-Linux/time.c b/arch/um/os-Linux/time.c | ||
627 | index e492805..dec5678 100644 | ||
628 | --- a/arch/um/os-Linux/time.c | ||
629 | +++ b/arch/um/os-Linux/time.c | ||
630 | @@ -9,7 +9,9 @@ | ||
631 | #include <time.h> | ||
632 | #include <sys/time.h> | ||
633 | #include "kern_constants.h" | ||
634 | +#include "kern_util.h" | ||
635 | #include "os.h" | ||
636 | +#include "process.h" | ||
637 | #include "user.h" | ||
638 | |||
639 | int set_interval(void) | ||
640 | @@ -58,12 +60,17 @@ static inline long long timeval_to_ns(const struct timeval *tv) | ||
641 | long long disable_timer(void) | ||
642 | { | ||
643 | struct itimerval time = ((struct itimerval) { { 0, 0 }, { 0, 0 } }); | ||
644 | + int remain, max = UM_NSEC_PER_SEC / UM_HZ; | ||
645 | |||
646 | if (setitimer(ITIMER_VIRTUAL, &time, &time) < 0) | ||
647 | printk(UM_KERN_ERR "disable_timer - setitimer failed, " | ||
648 | "errno = %d\n", errno); | ||
649 | |||
650 | - return timeval_to_ns(&time.it_value); | ||
651 | + remain = timeval_to_ns(&time.it_value); | ||
652 | + if (remain > max) | ||
653 | + remain = max; | ||
654 | + | ||
655 | + return remain; | ||
656 | } | ||
657 | |||
658 | long long os_nsecs(void) | ||
659 | @@ -79,7 +86,48 @@ static int after_sleep_interval(struct timespec *ts) | ||
660 | { | ||
661 | return 0; | ||
662 | } | ||
663 | + | ||
664 | +static void deliver_alarm(void) | ||
665 | +{ | ||
666 | + alarm_handler(SIGVTALRM, NULL); | ||
667 | +} | ||
668 | + | ||
669 | +static unsigned long long sleep_time(unsigned long long nsecs) | ||
670 | +{ | ||
671 | + return nsecs; | ||
672 | +} | ||
673 | + | ||
674 | #else | ||
675 | +unsigned long long last_tick; | ||
676 | +unsigned long long skew; | ||
677 | + | ||
678 | +static void deliver_alarm(void) | ||
679 | +{ | ||
680 | + unsigned long long this_tick = os_nsecs(); | ||
681 | + int one_tick = UM_NSEC_PER_SEC / UM_HZ; | ||
682 | + | ||
683 | + /* Protection against the host's time going backwards */ | ||
684 | + if ((last_tick != 0) && (this_tick < last_tick)) | ||
685 | + this_tick = last_tick; | ||
686 | + | ||
687 | + if (last_tick == 0) | ||
688 | + last_tick = this_tick - one_tick; | ||
689 | + | ||
690 | + skew += this_tick - last_tick; | ||
691 | + | ||
692 | + while (skew >= one_tick) { | ||
693 | + alarm_handler(SIGVTALRM, NULL); | ||
694 | + skew -= one_tick; | ||
695 | + } | ||
696 | + | ||
697 | + last_tick = this_tick; | ||
698 | +} | ||
699 | + | ||
700 | +static unsigned long long sleep_time(unsigned long long nsecs) | ||
701 | +{ | ||
702 | + return nsecs > skew ? nsecs - skew : 0; | ||
703 | +} | ||
704 | + | ||
705 | static inline long long timespec_to_us(const struct timespec *ts) | ||
706 | { | ||
707 | return ((long long) ts->tv_sec * UM_USEC_PER_SEC) + | ||
708 | @@ -102,6 +150,11 @@ static int after_sleep_interval(struct timespec *ts) | ||
709 | */ | ||
710 | if (start_usecs > usec) | ||
711 | start_usecs = usec; | ||
712 | + | ||
713 | + start_usecs -= skew / UM_NSEC_PER_USEC; | ||
714 | + if (start_usecs < 0) | ||
715 | + start_usecs = 0; | ||
716 | + | ||
717 | tv = ((struct timeval) { .tv_sec = start_usecs / UM_USEC_PER_SEC, | ||
718 | .tv_usec = start_usecs % UM_USEC_PER_SEC }); | ||
719 | interval = ((struct itimerval) { { 0, usec }, tv }); | ||
720 | @@ -113,8 +166,6 @@ static int after_sleep_interval(struct timespec *ts) | ||
721 | } | ||
722 | #endif | ||
723 | |||
724 | -extern void alarm_handler(int sig, struct sigcontext *sc); | ||
725 | - | ||
726 | void idle_sleep(unsigned long long nsecs) | ||
727 | { | ||
728 | struct timespec ts; | ||
729 | @@ -126,10 +177,12 @@ void idle_sleep(unsigned long long nsecs) | ||
730 | */ | ||
731 | if (nsecs == 0) | ||
732 | nsecs = UM_NSEC_PER_SEC / UM_HZ; | ||
733 | + | ||
734 | + nsecs = sleep_time(nsecs); | ||
735 | ts = ((struct timespec) { .tv_sec = nsecs / UM_NSEC_PER_SEC, | ||
736 | .tv_nsec = nsecs % UM_NSEC_PER_SEC }); | ||
737 | |||
738 | if (nanosleep(&ts, &ts) == 0) | ||
739 | - alarm_handler(SIGVTALRM, NULL); | ||
740 | + deliver_alarm(); | ||
741 | after_sleep_interval(&ts); | ||
742 | } | ||
743 | diff --git a/arch/um/sys-x86_64/ksyms.c b/arch/um/sys-x86_64/ksyms.c | ||
744 | index 12c5936..467879a 100644 | ||
745 | --- a/arch/um/sys-x86_64/ksyms.c | ||
746 | +++ b/arch/um/sys-x86_64/ksyms.c | ||
747 | @@ -13,4 +13,9 @@ EXPORT_SYMBOL(__down_failed_trylock); | ||
748 | EXPORT_SYMBOL(__up_wakeup); | ||
749 | |||
750 | /*XXX: we need them because they would be exported by x86_64 */ | ||
751 | +#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4 | ||
752 | +EXPORT_SYMBOL(memcpy); | ||
753 | +#else | ||
754 | EXPORT_SYMBOL(__memcpy); | ||
755 | +#endif | ||
756 | +EXPORT_SYMBOL(csum_partial); | ||
757 | diff --git a/arch/x86/boot/boot.h b/arch/x86/boot/boot.h | ||
758 | index 7822a49..4f199c1 100644 | ||
759 | --- a/arch/x86/boot/boot.h | ||
760 | +++ b/arch/x86/boot/boot.h | ||
761 | @@ -27,6 +27,8 @@ | ||
762 | #include <asm/boot.h> | ||
763 | #include <asm/setup.h> | ||
764 | |||
765 | +#define NCAPINTS 8 | ||
766 | + | ||
767 | /* Useful macros */ | ||
768 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) | ||
769 | |||
770 | @@ -244,6 +246,12 @@ int cmdline_find_option(const char *option, char *buffer, int bufsize); | ||
771 | int cmdline_find_option_bool(const char *option); | ||
772 | |||
773 | /* cpu.c, cpucheck.c */ | ||
774 | +struct cpu_features { | ||
775 | + int level; /* Family, or 64 for x86-64 */ | ||
776 | + int model; | ||
777 | + u32 flags[NCAPINTS]; | ||
778 | +}; | ||
779 | +extern struct cpu_features cpu; | ||
780 | int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr); | ||
781 | int validate_cpu(void); | ||
782 | |||
783 | diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c | ||
784 | index 769065b..b93b194 100644 | ||
785 | --- a/arch/x86/boot/cpucheck.c | ||
786 | +++ b/arch/x86/boot/cpucheck.c | ||
787 | @@ -32,13 +32,7 @@ | ||
788 | #include <asm/required-features.h> | ||
789 | #include <asm/msr-index.h> | ||
790 | |||
791 | -struct cpu_features { | ||
792 | - int level; /* Family, or 64 for x86-64 */ | ||
793 | - int model; | ||
794 | - u32 flags[NCAPINTS]; | ||
795 | -}; | ||
796 | - | ||
797 | -static struct cpu_features cpu; | ||
798 | +struct cpu_features cpu; | ||
799 | static u32 cpu_vendor[3]; | ||
800 | static u32 err_flags[NCAPINTS]; | ||
801 | |||
802 | diff --git a/arch/x86/boot/main.c b/arch/x86/boot/main.c | ||
803 | index 7828da5..3d86d65 100644 | ||
804 | --- a/arch/x86/boot/main.c | ||
805 | +++ b/arch/x86/boot/main.c | ||
806 | @@ -75,6 +75,10 @@ static void keyboard_set_repeat(void) | ||
807 | */ | ||
808 | static void query_ist(void) | ||
809 | { | ||
810 | + /* Some 486 BIOSes apparently crash on this call */ | ||
811 | + if (cpu.level < 6) | ||
812 | + return; | ||
813 | + | ||
814 | asm("int $0x15" | ||
815 | : "=a" (boot_params.ist_info.signature), | ||
816 | "=b" (boot_params.ist_info.command), | ||
817 | diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c | ||
818 | index a2c3a93..84d8341 100644 | ||
819 | --- a/block/scsi_ioctl.c | ||
820 | +++ b/block/scsi_ioctl.c | ||
821 | @@ -633,7 +633,7 @@ int scsi_cmd_ioctl(struct file *file, struct request_queue *q, | ||
822 | hdr.sbp = cgc.sense; | ||
823 | if (hdr.sbp) | ||
824 | hdr.mx_sb_len = sizeof(struct request_sense); | ||
825 | - hdr.timeout = cgc.timeout; | ||
826 | + hdr.timeout = jiffies_to_msecs(cgc.timeout); | ||
827 | hdr.cmdp = ((struct cdrom_generic_command __user*) arg)->cmd; | ||
828 | hdr.cmd_len = sizeof(cgc.cmd); | ||
829 | |||
830 | diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c | ||
831 | index 8b645c6..fd2123b 100644 | ||
832 | --- a/drivers/i2c/i2c-core.c | ||
833 | +++ b/drivers/i2c/i2c-core.c | ||
834 | @@ -1173,9 +1173,11 @@ i2c_new_probed_device(struct i2c_adapter *adap, | ||
835 | if ((addr_list[i] & ~0x07) == 0x30 | ||
836 | || (addr_list[i] & ~0x0f) == 0x50 | ||
837 | || !i2c_check_functionality(adap, I2C_FUNC_SMBUS_QUICK)) { | ||
838 | + union i2c_smbus_data data; | ||
839 | + | ||
840 | if (i2c_smbus_xfer(adap, addr_list[i], 0, | ||
841 | I2C_SMBUS_READ, 0, | ||
842 | - I2C_SMBUS_BYTE, NULL) >= 0) | ||
843 | + I2C_SMBUS_BYTE, &data) >= 0) | ||
844 | break; | ||
845 | } else { | ||
846 | if (i2c_smbus_xfer(adap, addr_list[i], 0, | ||
847 | diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c | ||
848 | index e54da02..17f19f7 100644 | ||
849 | --- a/drivers/ide/ide-cd.c | ||
850 | +++ b/drivers/ide/ide-cd.c | ||
851 | @@ -1411,6 +1411,7 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, | ||
852 | |||
853 | int stat; | ||
854 | struct request req; | ||
855 | + u32 blocklen; | ||
856 | |||
857 | ide_cd_init_rq(drive, &req); | ||
858 | |||
859 | @@ -1427,23 +1428,24 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, | ||
860 | /* | ||
861 | * Sanity check the given block size | ||
862 | */ | ||
863 | - switch (capbuf.blocklen) { | ||
864 | - case __constant_cpu_to_be32(512): | ||
865 | - case __constant_cpu_to_be32(1024): | ||
866 | - case __constant_cpu_to_be32(2048): | ||
867 | - case __constant_cpu_to_be32(4096): | ||
868 | + blocklen = be32_to_cpu(capbuf.blocklen); | ||
869 | + switch (blocklen) { | ||
870 | + case 512: | ||
871 | + case 1024: | ||
872 | + case 2048: | ||
873 | + case 4096: | ||
874 | break; | ||
875 | default: | ||
876 | printk(KERN_ERR "%s: weird block size %u\n", | ||
877 | - drive->name, capbuf.blocklen); | ||
878 | + drive->name, blocklen); | ||
879 | printk(KERN_ERR "%s: default to 2kb block size\n", | ||
880 | drive->name); | ||
881 | - capbuf.blocklen = __constant_cpu_to_be32(2048); | ||
882 | + blocklen = 2048; | ||
883 | break; | ||
884 | } | ||
885 | |||
886 | *capacity = 1 + be32_to_cpu(capbuf.lba); | ||
887 | - *sectors_per_frame = be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS; | ||
888 | + *sectors_per_frame = blocklen >> SECTOR_BITS; | ||
889 | return 0; | ||
890 | } | ||
891 | |||
892 | diff --git a/drivers/misc/acer-wmi.c b/drivers/misc/acer-wmi.c | ||
893 | index dd13a37..3a3e4c1 100644 | ||
894 | --- a/drivers/misc/acer-wmi.c | ||
895 | +++ b/drivers/misc/acer-wmi.c | ||
896 | @@ -742,11 +742,30 @@ static acpi_status get_u32(u32 *value, u32 cap) | ||
897 | |||
898 | static acpi_status set_u32(u32 value, u32 cap) | ||
899 | { | ||
900 | + acpi_status status; | ||
901 | + | ||
902 | if (interface->capability & cap) { | ||
903 | switch (interface->type) { | ||
904 | case ACER_AMW0: | ||
905 | return AMW0_set_u32(value, cap, interface); | ||
906 | case ACER_AMW0_V2: | ||
907 | + if (cap == ACER_CAP_MAILLED) | ||
908 | + return AMW0_set_u32(value, cap, interface); | ||
909 | + | ||
910 | + /* | ||
911 | + * On some models, some WMID methods don't toggle | ||
912 | + * properly. For those cases, we want to run the AMW0 | ||
913 | + * method afterwards to be certain we've really toggled | ||
914 | + * the device state. | ||
915 | + */ | ||
916 | + if (cap == ACER_CAP_WIRELESS || | ||
917 | + cap == ACER_CAP_BLUETOOTH) { | ||
918 | + status = WMID_set_u32(value, cap, interface); | ||
919 | + if (ACPI_FAILURE(status)) | ||
920 | + return status; | ||
921 | + | ||
922 | + return AMW0_set_u32(value, cap, interface); | ||
923 | + } | ||
924 | case ACER_WMID: | ||
925 | return WMID_set_u32(value, cap, interface); | ||
926 | default: | ||
927 | diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c | ||
928 | index 6572425..42d7c0a 100644 | ||
929 | --- a/drivers/net/r8169.c | ||
930 | +++ b/drivers/net/r8169.c | ||
931 | @@ -1438,8 +1438,10 @@ static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp) | ||
932 | |||
933 | rtl_hw_phy_config(dev); | ||
934 | |||
935 | - dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n"); | ||
936 | - RTL_W8(0x82, 0x01); | ||
937 | + if (tp->mac_version <= RTL_GIGA_MAC_VER_06) { | ||
938 | + dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n"); | ||
939 | + RTL_W8(0x82, 0x01); | ||
940 | + } | ||
941 | |||
942 | pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40); | ||
943 | |||
944 | diff --git a/drivers/scsi/hptiop.c b/drivers/scsi/hptiop.c | ||
945 | index ff149ad..611ed07 100644 | ||
946 | --- a/drivers/scsi/hptiop.c | ||
947 | +++ b/drivers/scsi/hptiop.c | ||
948 | @@ -1246,6 +1246,13 @@ static struct pci_device_id hptiop_id_table[] = { | ||
949 | { PCI_VDEVICE(TTI, 0x3522), (kernel_ulong_t)&hptiop_itl_ops }, | ||
950 | { PCI_VDEVICE(TTI, 0x3410), (kernel_ulong_t)&hptiop_itl_ops }, | ||
951 | { PCI_VDEVICE(TTI, 0x3540), (kernel_ulong_t)&hptiop_itl_ops }, | ||
952 | + { PCI_VDEVICE(TTI, 0x3530), (kernel_ulong_t)&hptiop_itl_ops }, | ||
953 | + { PCI_VDEVICE(TTI, 0x3560), (kernel_ulong_t)&hptiop_itl_ops }, | ||
954 | + { PCI_VDEVICE(TTI, 0x4322), (kernel_ulong_t)&hptiop_itl_ops }, | ||
955 | + { PCI_VDEVICE(TTI, 0x4210), (kernel_ulong_t)&hptiop_itl_ops }, | ||
956 | + { PCI_VDEVICE(TTI, 0x4211), (kernel_ulong_t)&hptiop_itl_ops }, | ||
957 | + { PCI_VDEVICE(TTI, 0x4310), (kernel_ulong_t)&hptiop_itl_ops }, | ||
958 | + { PCI_VDEVICE(TTI, 0x4311), (kernel_ulong_t)&hptiop_itl_ops }, | ||
959 | { PCI_VDEVICE(TTI, 0x3120), (kernel_ulong_t)&hptiop_mv_ops }, | ||
960 | { PCI_VDEVICE(TTI, 0x3122), (kernel_ulong_t)&hptiop_mv_ops }, | ||
961 | { PCI_VDEVICE(TTI, 0x3020), (kernel_ulong_t)&hptiop_mv_ops }, | ||
962 | diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c | ||
963 | index 4894dc8..6ca83a2 100644 | ||
964 | --- a/drivers/scsi/qla2xxx/qla_attr.c | ||
965 | +++ b/drivers/scsi/qla2xxx/qla_attr.c | ||
966 | @@ -947,26 +947,39 @@ qla2x00_get_starget_port_id(struct scsi_target *starget) | ||
967 | } | ||
968 | |||
969 | static void | ||
970 | -qla2x00_get_rport_loss_tmo(struct fc_rport *rport) | ||
971 | +qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) | ||
972 | { | ||
973 | - struct Scsi_Host *host = rport_to_shost(rport); | ||
974 | - scsi_qla_host_t *ha = shost_priv(host); | ||
975 | - | ||
976 | - rport->dev_loss_tmo = ha->port_down_retry_count + 5; | ||
977 | + if (timeout) | ||
978 | + rport->dev_loss_tmo = timeout; | ||
979 | + else | ||
980 | + rport->dev_loss_tmo = 1; | ||
981 | } | ||
982 | |||
983 | static void | ||
984 | -qla2x00_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) | ||
985 | +qla2x00_dev_loss_tmo_callbk(struct fc_rport *rport) | ||
986 | { | ||
987 | struct Scsi_Host *host = rport_to_shost(rport); | ||
988 | - scsi_qla_host_t *ha = shost_priv(host); | ||
989 | + fc_port_t *fcport = *(fc_port_t **)rport->dd_data; | ||
990 | + | ||
991 | + qla2x00_abort_fcport_cmds(fcport); | ||
992 | + | ||
993 | + /* | ||
994 | + * Transport has effectively 'deleted' the rport, clear | ||
995 | + * all local references. | ||
996 | + */ | ||
997 | + spin_lock_irq(host->host_lock); | ||
998 | + fcport->rport = NULL; | ||
999 | + *((fc_port_t **)rport->dd_data) = NULL; | ||
1000 | + spin_unlock_irq(host->host_lock); | ||
1001 | +} | ||
1002 | |||
1003 | - if (timeout) | ||
1004 | - ha->port_down_retry_count = timeout; | ||
1005 | - else | ||
1006 | - ha->port_down_retry_count = 1; | ||
1007 | +static void | ||
1008 | +qla2x00_terminate_rport_io(struct fc_rport *rport) | ||
1009 | +{ | ||
1010 | + fc_port_t *fcport = *(fc_port_t **)rport->dd_data; | ||
1011 | |||
1012 | - rport->dev_loss_tmo = ha->port_down_retry_count + 5; | ||
1013 | + qla2x00_abort_fcport_cmds(fcport); | ||
1014 | + scsi_target_unblock(&rport->dev); | ||
1015 | } | ||
1016 | |||
1017 | static int | ||
1018 | @@ -1222,11 +1235,12 @@ struct fc_function_template qla2xxx_transport_functions = { | ||
1019 | .get_starget_port_id = qla2x00_get_starget_port_id, | ||
1020 | .show_starget_port_id = 1, | ||
1021 | |||
1022 | - .get_rport_dev_loss_tmo = qla2x00_get_rport_loss_tmo, | ||
1023 | .set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo, | ||
1024 | .show_rport_dev_loss_tmo = 1, | ||
1025 | |||
1026 | .issue_fc_host_lip = qla2x00_issue_lip, | ||
1027 | + .dev_loss_tmo_callbk = qla2x00_dev_loss_tmo_callbk, | ||
1028 | + .terminate_rport_io = qla2x00_terminate_rport_io, | ||
1029 | .get_fc_host_stats = qla2x00_get_fc_host_stats, | ||
1030 | |||
1031 | .vport_create = qla24xx_vport_create, | ||
1032 | @@ -1265,11 +1279,12 @@ struct fc_function_template qla2xxx_transport_vport_functions = { | ||
1033 | .get_starget_port_id = qla2x00_get_starget_port_id, | ||
1034 | .show_starget_port_id = 1, | ||
1035 | |||
1036 | - .get_rport_dev_loss_tmo = qla2x00_get_rport_loss_tmo, | ||
1037 | .set_rport_dev_loss_tmo = qla2x00_set_rport_loss_tmo, | ||
1038 | .show_rport_dev_loss_tmo = 1, | ||
1039 | |||
1040 | .issue_fc_host_lip = qla2x00_issue_lip, | ||
1041 | + .dev_loss_tmo_callbk = qla2x00_dev_loss_tmo_callbk, | ||
1042 | + .terminate_rport_io = qla2x00_terminate_rport_io, | ||
1043 | .get_fc_host_stats = qla2x00_get_fc_host_stats, | ||
1044 | }; | ||
1045 | |||
1046 | diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h | ||
1047 | index 3750319..ab5928b 100644 | ||
1048 | --- a/drivers/scsi/qla2xxx/qla_def.h | ||
1049 | +++ b/drivers/scsi/qla2xxx/qla_def.h | ||
1050 | @@ -1548,7 +1548,6 @@ typedef struct fc_port { | ||
1051 | int login_retry; | ||
1052 | atomic_t port_down_timer; | ||
1053 | |||
1054 | - spinlock_t rport_lock; | ||
1055 | struct fc_rport *rport, *drport; | ||
1056 | u32 supported_classes; | ||
1057 | |||
1058 | diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h | ||
1059 | index 193f688..d6eccbe 100644 | ||
1060 | --- a/drivers/scsi/qla2xxx/qla_gbl.h | ||
1061 | +++ b/drivers/scsi/qla2xxx/qla_gbl.h | ||
1062 | @@ -68,6 +68,8 @@ extern int num_hosts; | ||
1063 | extern int qla2x00_loop_reset(scsi_qla_host_t *); | ||
1064 | extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int); | ||
1065 | |||
1066 | +extern void qla2x00_abort_fcport_cmds(fc_port_t *); | ||
1067 | + | ||
1068 | /* | ||
1069 | * Global Functions in qla_mid.c source file. | ||
1070 | */ | ||
1071 | diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c | ||
1072 | index 364be7d..6ffaf0e 100644 | ||
1073 | --- a/drivers/scsi/qla2xxx/qla_init.c | ||
1074 | +++ b/drivers/scsi/qla2xxx/qla_init.c | ||
1075 | @@ -1827,12 +1827,11 @@ qla2x00_rport_del(void *data) | ||
1076 | { | ||
1077 | fc_port_t *fcport = data; | ||
1078 | struct fc_rport *rport; | ||
1079 | - unsigned long flags; | ||
1080 | |||
1081 | - spin_lock_irqsave(&fcport->rport_lock, flags); | ||
1082 | + spin_lock_irq(fcport->ha->host->host_lock); | ||
1083 | rport = fcport->drport; | ||
1084 | fcport->drport = NULL; | ||
1085 | - spin_unlock_irqrestore(&fcport->rport_lock, flags); | ||
1086 | + spin_unlock_irq(fcport->ha->host->host_lock); | ||
1087 | if (rport) | ||
1088 | fc_remote_port_delete(rport); | ||
1089 | } | ||
1090 | @@ -1861,7 +1860,6 @@ qla2x00_alloc_fcport(scsi_qla_host_t *ha, gfp_t flags) | ||
1091 | atomic_set(&fcport->state, FCS_UNCONFIGURED); | ||
1092 | fcport->flags = FCF_RLC_SUPPORT; | ||
1093 | fcport->supported_classes = FC_COS_UNSPECIFIED; | ||
1094 | - spin_lock_init(&fcport->rport_lock); | ||
1095 | |||
1096 | return fcport; | ||
1097 | } | ||
1098 | @@ -2220,28 +2218,24 @@ qla2x00_reg_remote_port(scsi_qla_host_t *ha, fc_port_t *fcport) | ||
1099 | { | ||
1100 | struct fc_rport_identifiers rport_ids; | ||
1101 | struct fc_rport *rport; | ||
1102 | - unsigned long flags; | ||
1103 | |||
1104 | if (fcport->drport) | ||
1105 | qla2x00_rport_del(fcport); | ||
1106 | - if (fcport->rport) | ||
1107 | - return; | ||
1108 | |||
1109 | rport_ids.node_name = wwn_to_u64(fcport->node_name); | ||
1110 | rport_ids.port_name = wwn_to_u64(fcport->port_name); | ||
1111 | rport_ids.port_id = fcport->d_id.b.domain << 16 | | ||
1112 | fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa; | ||
1113 | rport_ids.roles = FC_RPORT_ROLE_UNKNOWN; | ||
1114 | - rport = fc_remote_port_add(ha->host, 0, &rport_ids); | ||
1115 | + fcport->rport = rport = fc_remote_port_add(ha->host, 0, &rport_ids); | ||
1116 | if (!rport) { | ||
1117 | qla_printk(KERN_WARNING, ha, | ||
1118 | "Unable to allocate fc remote port!\n"); | ||
1119 | return; | ||
1120 | } | ||
1121 | - spin_lock_irqsave(&fcport->rport_lock, flags); | ||
1122 | - fcport->rport = rport; | ||
1123 | + spin_lock_irq(fcport->ha->host->host_lock); | ||
1124 | *((fc_port_t **)rport->dd_data) = fcport; | ||
1125 | - spin_unlock_irqrestore(&fcport->rport_lock, flags); | ||
1126 | + spin_unlock_irq(fcport->ha->host->host_lock); | ||
1127 | |||
1128 | rport->supported_classes = fcport->supported_classes; | ||
1129 | |||
1130 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c | ||
1131 | index 0e8e092..6c03cd5 100644 | ||
1132 | --- a/drivers/scsi/qla2xxx/qla_os.c | ||
1133 | +++ b/drivers/scsi/qla2xxx/qla_os.c | ||
1134 | @@ -386,7 +386,7 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) | ||
1135 | } | ||
1136 | |||
1137 | /* Close window on fcport/rport state-transitioning. */ | ||
1138 | - if (!*(fc_port_t **)rport->dd_data) { | ||
1139 | + if (fcport->drport) { | ||
1140 | cmd->result = DID_IMM_RETRY << 16; | ||
1141 | goto qc_fail_command; | ||
1142 | } | ||
1143 | @@ -453,7 +453,7 @@ qla24xx_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) | ||
1144 | } | ||
1145 | |||
1146 | /* Close window on fcport/rport state-transitioning. */ | ||
1147 | - if (!*(fc_port_t **)rport->dd_data) { | ||
1148 | + if (fcport->drport) { | ||
1149 | cmd->result = DID_IMM_RETRY << 16; | ||
1150 | goto qc24_fail_command; | ||
1151 | } | ||
1152 | @@ -617,6 +617,40 @@ qla2x00_wait_for_loop_ready(scsi_qla_host_t *ha) | ||
1153 | return (return_status); | ||
1154 | } | ||
1155 | |||
1156 | +void | ||
1157 | +qla2x00_abort_fcport_cmds(fc_port_t *fcport) | ||
1158 | +{ | ||
1159 | + int cnt; | ||
1160 | + unsigned long flags; | ||
1161 | + srb_t *sp; | ||
1162 | + scsi_qla_host_t *ha = fcport->ha; | ||
1163 | + scsi_qla_host_t *pha = to_qla_parent(ha); | ||
1164 | + | ||
1165 | + spin_lock_irqsave(&pha->hardware_lock, flags); | ||
1166 | + for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { | ||
1167 | + sp = pha->outstanding_cmds[cnt]; | ||
1168 | + if (!sp) | ||
1169 | + continue; | ||
1170 | + if (sp->fcport != fcport) | ||
1171 | + continue; | ||
1172 | + | ||
1173 | + spin_unlock_irqrestore(&pha->hardware_lock, flags); | ||
1174 | + if (ha->isp_ops->abort_command(ha, sp)) { | ||
1175 | + DEBUG2(qla_printk(KERN_WARNING, ha, | ||
1176 | + "Abort failed -- %lx\n", sp->cmd->serial_number)); | ||
1177 | + } else { | ||
1178 | + if (qla2x00_eh_wait_on_command(ha, sp->cmd) != | ||
1179 | + QLA_SUCCESS) | ||
1180 | + DEBUG2(qla_printk(KERN_WARNING, ha, | ||
1181 | + "Abort failed while waiting -- %lx\n", | ||
1182 | + sp->cmd->serial_number)); | ||
1183 | + | ||
1184 | + } | ||
1185 | + spin_lock_irqsave(&pha->hardware_lock, flags); | ||
1186 | + } | ||
1187 | + spin_unlock_irqrestore(&pha->hardware_lock, flags); | ||
1188 | +} | ||
1189 | + | ||
1190 | static void | ||
1191 | qla2x00_block_error_handler(struct scsi_cmnd *cmnd) | ||
1192 | { | ||
1193 | @@ -1160,7 +1194,7 @@ qla2xxx_slave_configure(struct scsi_device *sdev) | ||
1194 | else | ||
1195 | scsi_deactivate_tcq(sdev, ha->max_q_depth); | ||
1196 | |||
1197 | - rport->dev_loss_tmo = ha->port_down_retry_count + 5; | ||
1198 | + rport->dev_loss_tmo = ha->port_down_retry_count; | ||
1199 | |||
1200 | return 0; | ||
1201 | } | ||
1202 | @@ -1883,7 +1917,6 @@ static inline void | ||
1203 | qla2x00_schedule_rport_del(struct scsi_qla_host *ha, fc_port_t *fcport, | ||
1204 | int defer) | ||
1205 | { | ||
1206 | - unsigned long flags; | ||
1207 | struct fc_rport *rport; | ||
1208 | |||
1209 | if (!fcport->rport) | ||
1210 | @@ -1891,19 +1924,13 @@ qla2x00_schedule_rport_del(struct scsi_qla_host *ha, fc_port_t *fcport, | ||
1211 | |||
1212 | rport = fcport->rport; | ||
1213 | if (defer) { | ||
1214 | - spin_lock_irqsave(&fcport->rport_lock, flags); | ||
1215 | + spin_lock_irq(ha->host->host_lock); | ||
1216 | fcport->drport = rport; | ||
1217 | - fcport->rport = NULL; | ||
1218 | - *(fc_port_t **)rport->dd_data = NULL; | ||
1219 | - spin_unlock_irqrestore(&fcport->rport_lock, flags); | ||
1220 | + spin_unlock_irq(ha->host->host_lock); | ||
1221 | set_bit(FCPORT_UPDATE_NEEDED, &ha->dpc_flags); | ||
1222 | - } else { | ||
1223 | - spin_lock_irqsave(&fcport->rport_lock, flags); | ||
1224 | - fcport->rport = NULL; | ||
1225 | - *(fc_port_t **)rport->dd_data = NULL; | ||
1226 | - spin_unlock_irqrestore(&fcport->rport_lock, flags); | ||
1227 | + qla2xxx_wake_dpc(ha); | ||
1228 | + } else | ||
1229 | fc_remote_port_delete(rport); | ||
1230 | - } | ||
1231 | } | ||
1232 | |||
1233 | /* | ||
1234 | diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c | ||
1235 | index 1fb6031..945e1fb 100644 | ||
1236 | --- a/drivers/scsi/scsi_transport_spi.c | ||
1237 | +++ b/drivers/scsi/scsi_transport_spi.c | ||
1238 | @@ -360,12 +360,14 @@ spi_transport_rd_attr(rti, "%d\n"); | ||
1239 | spi_transport_rd_attr(pcomp_en, "%d\n"); | ||
1240 | spi_transport_rd_attr(hold_mcs, "%d\n"); | ||
1241 | |||
1242 | -/* we only care about the first child device so we return 1 */ | ||
1243 | +/* we only care about the first child device that's a real SCSI device | ||
1244 | + * so we return 1 to terminate the iteration when we find it */ | ||
1245 | static int child_iter(struct device *dev, void *data) | ||
1246 | { | ||
1247 | - struct scsi_device *sdev = to_scsi_device(dev); | ||
1248 | + if (!scsi_is_sdev_device(dev)) | ||
1249 | + return 0; | ||
1250 | |||
1251 | - spi_dv_device(sdev); | ||
1252 | + spi_dv_device(to_scsi_device(dev)); | ||
1253 | return 1; | ||
1254 | } | ||
1255 | |||
1256 | diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c | ||
1257 | index f1f2f65..ef7a95e 100644 | ||
1258 | --- a/drivers/scsi/ses.c | ||
1259 | +++ b/drivers/scsi/ses.c | ||
1260 | @@ -345,14 +345,14 @@ static int ses_enclosure_find_by_addr(struct enclosure_device *edev, | ||
1261 | return 0; | ||
1262 | } | ||
1263 | |||
1264 | -#define VPD_INQUIRY_SIZE 512 | ||
1265 | +#define VPD_INQUIRY_SIZE 36 | ||
1266 | |||
1267 | static void ses_match_to_enclosure(struct enclosure_device *edev, | ||
1268 | struct scsi_device *sdev) | ||
1269 | { | ||
1270 | unsigned char *buf = kmalloc(VPD_INQUIRY_SIZE, GFP_KERNEL); | ||
1271 | unsigned char *desc; | ||
1272 | - int len; | ||
1273 | + u16 vpd_len; | ||
1274 | struct efd efd = { | ||
1275 | .addr = 0, | ||
1276 | }; | ||
1277 | @@ -372,9 +372,19 @@ static void ses_match_to_enclosure(struct enclosure_device *edev, | ||
1278 | VPD_INQUIRY_SIZE, NULL, SES_TIMEOUT, SES_RETRIES)) | ||
1279 | goto free; | ||
1280 | |||
1281 | - len = (buf[2] << 8) + buf[3]; | ||
1282 | + vpd_len = (buf[2] << 8) + buf[3]; | ||
1283 | + kfree(buf); | ||
1284 | + buf = kmalloc(vpd_len, GFP_KERNEL); | ||
1285 | + if (!buf) | ||
1286 | + return; | ||
1287 | + cmd[3] = vpd_len >> 8; | ||
1288 | + cmd[4] = vpd_len & 0xff; | ||
1289 | + if (scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, | ||
1290 | + vpd_len, NULL, SES_TIMEOUT, SES_RETRIES)) | ||
1291 | + goto free; | ||
1292 | + | ||
1293 | desc = buf + 4; | ||
1294 | - while (desc < buf + len) { | ||
1295 | + while (desc < buf + vpd_len) { | ||
1296 | enum scsi_protocol proto = desc[0] >> 4; | ||
1297 | u8 code_set = desc[0] & 0x0f; | ||
1298 | u8 piv = desc[1] & 0x80; | ||
1299 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
1300 | index af2bd47..c51233a 100644 | ||
1301 | --- a/drivers/usb/serial/ftdi_sio.c | ||
1302 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
1303 | @@ -283,6 +283,7 @@ static struct usb_device_id id_table_combined [] = { | ||
1304 | { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) }, | ||
1305 | { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) }, | ||
1306 | { USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) }, | ||
1307 | + { USB_DEVICE(FTDI_VID, FTDI_ELV_HS485_PID) }, | ||
1308 | { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) }, | ||
1309 | { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) }, | ||
1310 | { USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) }, | ||
1311 | @@ -366,6 +367,10 @@ static struct usb_device_id id_table_combined [] = { | ||
1312 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
1313 | { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID), | ||
1314 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
1315 | + { USB_DEVICE(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID), | ||
1316 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
1317 | + { USB_DEVICE(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID), | ||
1318 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
1319 | { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) }, | ||
1320 | { }, /* Optional parameter entry */ | ||
1321 | { } /* Terminating entry */ | ||
1322 | diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h | ||
1323 | index 0e1c569..00a452a 100644 | ||
1324 | --- a/drivers/usb/serial/ftdi_sio.h | ||
1325 | +++ b/drivers/usb/serial/ftdi_sio.h | ||
1326 | @@ -256,6 +256,7 @@ | ||
1327 | #define FTDI_ELV_WS300PC_PID 0xE0F6 /* PC-Wetterstation (WS 300 PC) */ | ||
1328 | #define FTDI_ELV_FHZ1300PC_PID 0xE0E8 /* FHZ 1300 PC */ | ||
1329 | #define FTDI_ELV_WS500_PID 0xE0E9 /* PC-Wetterstation (WS 500) */ | ||
1330 | +#define FTDI_ELV_HS485_PID 0xE0EA /* USB to RS-485 adapter */ | ||
1331 | #define FTDI_ELV_EM1010PC_PID 0xE0EF /* Engery monitor EM 1010 PC */ | ||
1332 | |||
1333 | /* | ||
1334 | @@ -547,6 +548,11 @@ | ||
1335 | #define OLIMEX_VID 0x15BA | ||
1336 | #define OLIMEX_ARM_USB_OCD_PID 0x0003 | ||
1337 | |||
1338 | +/* Luminary Micro Stellaris Boards, VID = FTDI_VID */ | ||
1339 | +/* FTDI 2332C Dual channel device, side A=245 FIFO (JTAG), Side B=RS232 UART */ | ||
1340 | +#define LMI_LM3S_DEVEL_BOARD_PID 0xbcd8 | ||
1341 | +#define LMI_LM3S_EVAL_BOARD_PID 0xbcd9 | ||
1342 | + | ||
1343 | /* www.elsterelectricity.com Elster Unicom III Optical Probe */ | ||
1344 | #define FTDI_ELSTER_UNICOM_PID 0xE700 /* Product Id */ | ||
1345 | |||
1346 | diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c | ||
1347 | index 4c1a70a..157b458 100644 | ||
1348 | --- a/drivers/usb/serial/pl2303.c | ||
1349 | +++ b/drivers/usb/serial/pl2303.c | ||
1350 | @@ -87,7 +87,6 @@ static struct usb_device_id id_table [] = { | ||
1351 | { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) }, | ||
1352 | { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) }, | ||
1353 | { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) }, | ||
1354 | - { USB_DEVICE(HL340_VENDOR_ID, HL340_PRODUCT_ID) }, | ||
1355 | { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) }, | ||
1356 | { } /* Terminating entry */ | ||
1357 | }; | ||
1358 | diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h | ||
1359 | index 3bdefe0..b4b9df2 100644 | ||
1360 | --- a/drivers/usb/serial/pl2303.h | ||
1361 | +++ b/drivers/usb/serial/pl2303.h | ||
1362 | @@ -105,10 +105,6 @@ | ||
1363 | #define COREGA_VENDOR_ID 0x07aa | ||
1364 | #define COREGA_PRODUCT_ID 0x002a | ||
1365 | |||
1366 | -/* HL HL-340 (ID: 4348:5523) */ | ||
1367 | -#define HL340_VENDOR_ID 0x4348 | ||
1368 | -#define HL340_PRODUCT_ID 0x5523 | ||
1369 | - | ||
1370 | /* Y.C. Cable U.S.A., Inc - USB to RS-232 */ | ||
1371 | #define YCCABLE_VENDOR_ID 0x05ad | ||
1372 | #define YCCABLE_PRODUCT_ID 0x0fba | ||
1373 | diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c | ||
1374 | index 2138ba8..ec7b96b 100644 | ||
1375 | --- a/drivers/usb/serial/usb-serial.c | ||
1376 | +++ b/drivers/usb/serial/usb-serial.c | ||
1377 | @@ -119,9 +119,6 @@ static void return_serial(struct usb_serial *serial) | ||
1378 | |||
1379 | dbg("%s", __FUNCTION__); | ||
1380 | |||
1381 | - if (serial == NULL) | ||
1382 | - return; | ||
1383 | - | ||
1384 | for (i = 0; i < serial->num_ports; ++i) { | ||
1385 | serial_table[serial->minor + i] = NULL; | ||
1386 | } | ||
1387 | @@ -140,7 +137,8 @@ static void destroy_serial(struct kref *kref) | ||
1388 | serial->type->shutdown(serial); | ||
1389 | |||
1390 | /* return the minor range that this device had */ | ||
1391 | - return_serial(serial); | ||
1392 | + if (serial->minor != SERIAL_TTY_NO_MINOR) | ||
1393 | + return_serial(serial); | ||
1394 | |||
1395 | for (i = 0; i < serial->num_ports; ++i) | ||
1396 | serial->port[i]->open_count = 0; | ||
1397 | @@ -635,6 +633,7 @@ static struct usb_serial * create_serial (struct usb_device *dev, | ||
1398 | serial->interface = interface; | ||
1399 | kref_init(&serial->kref); | ||
1400 | mutex_init(&serial->disc_mutex); | ||
1401 | + serial->minor = SERIAL_TTY_NO_MINOR; | ||
1402 | |||
1403 | return serial; | ||
1404 | } | ||
1405 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h | ||
1406 | index f1d14c9..83f6e80 100644 | ||
1407 | --- a/drivers/usb/storage/unusual_devs.h | ||
1408 | +++ b/drivers/usb/storage/unusual_devs.h | ||
1409 | @@ -357,14 +357,14 @@ UNUSUAL_DEV( 0x04b0, 0x040f, 0x0100, 0x0200, | ||
1410 | US_FL_FIX_CAPACITY), | ||
1411 | |||
1412 | /* Reported by Emil Larsson <emil@swip.net> */ | ||
1413 | -UNUSUAL_DEV( 0x04b0, 0x0411, 0x0100, 0x0110, | ||
1414 | +UNUSUAL_DEV( 0x04b0, 0x0411, 0x0100, 0x0111, | ||
1415 | "NIKON", | ||
1416 | "NIKON DSC D80", | ||
1417 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1418 | US_FL_FIX_CAPACITY), | ||
1419 | |||
1420 | /* Reported by Ortwin Glueck <odi@odi.ch> */ | ||
1421 | -UNUSUAL_DEV( 0x04b0, 0x0413, 0x0110, 0x0110, | ||
1422 | +UNUSUAL_DEV( 0x04b0, 0x0413, 0x0110, 0x0111, | ||
1423 | "NIKON", | ||
1424 | "NIKON DSC D40", | ||
1425 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1426 | @@ -1164,6 +1164,13 @@ UNUSUAL_DEV( 0x07c4, 0xa400, 0x0000, 0xffff, | ||
1427 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1428 | US_FL_FIX_INQUIRY ), | ||
1429 | |||
1430 | +/* Reported by Rauch Wolke <rauchwolke@gmx.net> */ | ||
1431 | +UNUSUAL_DEV( 0x07c4, 0xa4a5, 0x0000, 0xffff, | ||
1432 | + "Simple Tech/Datafab", | ||
1433 | + "CF+SM Reader", | ||
1434 | + US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1435 | + US_FL_IGNORE_RESIDUE ), | ||
1436 | + | ||
1437 | /* Casio QV 2x00/3x00/4000/8000 digital still cameras are not conformant | ||
1438 | * to the USB storage specification in two ways: | ||
1439 | * - They tell us they are using transport protocol CBI. In reality they | ||
1440 | @@ -1705,6 +1712,13 @@ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, | ||
1441 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1442 | US_FL_GO_SLOW ), | ||
1443 | |||
1444 | +/* Reported by Andrey Rahmatullin <wrar@altlinux.org> */ | ||
1445 | +UNUSUAL_DEV( 0x4102, 0x1020, 0x0100, 0x0100, | ||
1446 | + "iRiver", | ||
1447 | + "MP3 T10", | ||
1448 | + US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1449 | + US_FL_IGNORE_RESIDUE ), | ||
1450 | + | ||
1451 | /* | ||
1452 | * David Härdeman <david@2gen.com> | ||
1453 | * The key makes the SCSI stack print confusing (but harmless) messages | ||
1454 | diff --git a/drivers/video/aty/radeon_accel.c b/drivers/video/aty/radeon_accel.c | ||
1455 | index 3ca27cb..aa95f83 100644 | ||
1456 | --- a/drivers/video/aty/radeon_accel.c | ||
1457 | +++ b/drivers/video/aty/radeon_accel.c | ||
1458 | @@ -55,6 +55,10 @@ static void radeonfb_prim_fillrect(struct radeonfb_info *rinfo, | ||
1459 | OUTREG(DP_WRITE_MSK, 0xffffffff); | ||
1460 | OUTREG(DP_CNTL, (DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM)); | ||
1461 | |||
1462 | + radeon_fifo_wait(2); | ||
1463 | + OUTREG(DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL); | ||
1464 | + OUTREG(WAIT_UNTIL, (WAIT_2D_IDLECLEAN | WAIT_DMA_GUI_IDLE)); | ||
1465 | + | ||
1466 | radeon_fifo_wait(2); | ||
1467 | OUTREG(DST_Y_X, (region->dy << 16) | region->dx); | ||
1468 | OUTREG(DST_WIDTH_HEIGHT, (region->width << 16) | region->height); | ||
1469 | @@ -116,6 +120,10 @@ static void radeonfb_prim_copyarea(struct radeonfb_info *rinfo, | ||
1470 | OUTREG(DP_CNTL, (xdir>=0 ? DST_X_LEFT_TO_RIGHT : 0) | ||
1471 | | (ydir>=0 ? DST_Y_TOP_TO_BOTTOM : 0)); | ||
1472 | |||
1473 | + radeon_fifo_wait(2); | ||
1474 | + OUTREG(DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL); | ||
1475 | + OUTREG(WAIT_UNTIL, (WAIT_2D_IDLECLEAN | WAIT_DMA_GUI_IDLE)); | ||
1476 | + | ||
1477 | radeon_fifo_wait(3); | ||
1478 | OUTREG(SRC_Y_X, (sy << 16) | sx); | ||
1479 | OUTREG(DST_Y_X, (dy << 16) | dx); | ||
1480 | @@ -241,8 +249,8 @@ void radeonfb_engine_reset(struct radeonfb_info *rinfo) | ||
1481 | INREG(HOST_PATH_CNTL); | ||
1482 | OUTREG(HOST_PATH_CNTL, host_path_cntl); | ||
1483 | |||
1484 | - if (rinfo->family != CHIP_FAMILY_R300 || | ||
1485 | - rinfo->family != CHIP_FAMILY_R350 || | ||
1486 | + if (rinfo->family != CHIP_FAMILY_R300 && | ||
1487 | + rinfo->family != CHIP_FAMILY_R350 && | ||
1488 | rinfo->family != CHIP_FAMILY_RV350) | ||
1489 | OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset); | ||
1490 | |||
1491 | diff --git a/drivers/video/matrox/matroxfb_maven.c b/drivers/video/matrox/matroxfb_maven.c | ||
1492 | index 0cd58f8..8c416f7 100644 | ||
1493 | --- a/drivers/video/matrox/matroxfb_maven.c | ||
1494 | +++ b/drivers/video/matrox/matroxfb_maven.c | ||
1495 | @@ -1266,7 +1266,7 @@ static int maven_detect_client(struct i2c_adapter* adapter, int address, int kin | ||
1496 | ERROR4:; | ||
1497 | i2c_detach_client(new_client); | ||
1498 | ERROR3:; | ||
1499 | - kfree(new_client); | ||
1500 | + kfree(data); | ||
1501 | ERROR0:; | ||
1502 | return err; | ||
1503 | } | ||
1504 | diff --git a/fs/cifs/asn1.c b/fs/cifs/asn1.c | ||
1505 | index 5dbba89..9b9d960 100644 | ||
1506 | --- a/fs/cifs/asn1.c | ||
1507 | +++ b/fs/cifs/asn1.c | ||
1508 | @@ -400,7 +400,7 @@ asn1_oid_decode(struct asn1_ctx *ctx, | ||
1509 | size = eoc - ctx->pointer + 1; | ||
1510 | |||
1511 | /* first subid actually encodes first two subids */ | ||
1512 | - if (size < 2 || size > ULONG_MAX/sizeof(unsigned long)) | ||
1513 | + if (size < 2 || size > UINT_MAX/sizeof(unsigned long)) | ||
1514 | return 0; | ||
1515 | |||
1516 | *oid = kmalloc(size * sizeof(unsigned long), GFP_ATOMIC); | ||
1517 | diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c | ||
1518 | index b94fb5c..77f8770 100644 | ||
1519 | --- a/fs/cifs/cifsfs.c | ||
1520 | +++ b/fs/cifs/cifsfs.c | ||
1521 | @@ -175,6 +175,8 @@ out_no_root: | ||
1522 | if (inode) | ||
1523 | iput(inode); | ||
1524 | |||
1525 | + cifs_umount(sb, cifs_sb); | ||
1526 | + | ||
1527 | out_mount_failed: | ||
1528 | if (cifs_sb) { | ||
1529 | #ifdef CONFIG_CIFS_DFS_UPCALL | ||
1530 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c | ||
1531 | index e1031b9..78a7f5e 100644 | ||
1532 | --- a/fs/cifs/inode.c | ||
1533 | +++ b/fs/cifs/inode.c | ||
1534 | @@ -639,6 +639,7 @@ struct inode *cifs_iget(struct super_block *sb, unsigned long ino) | ||
1535 | inode->i_fop = &simple_dir_operations; | ||
1536 | inode->i_uid = cifs_sb->mnt_uid; | ||
1537 | inode->i_gid = cifs_sb->mnt_gid; | ||
1538 | + } else if (rc) { | ||
1539 | _FreeXid(xid); | ||
1540 | iget_failed(inode); | ||
1541 | return ERR_PTR(rc); | ||
1542 | diff --git a/include/asm-sparc64/futex.h b/include/asm-sparc64/futex.h | ||
1543 | index df1097d..9bf183b 100644 | ||
1544 | --- a/include/asm-sparc64/futex.h | ||
1545 | +++ b/include/asm-sparc64/futex.h | ||
1546 | @@ -59,7 +59,7 @@ static inline int futex_atomic_op_inuser(int encoded_op, int __user *uaddr) | ||
1547 | __futex_cas_op("or\t%2, %4, %1", ret, oldval, uaddr, oparg); | ||
1548 | break; | ||
1549 | case FUTEX_OP_ANDN: | ||
1550 | - __futex_cas_op("and\t%2, %4, %1", ret, oldval, uaddr, oparg); | ||
1551 | + __futex_cas_op("andn\t%2, %4, %1", ret, oldval, uaddr, oparg); | ||
1552 | break; | ||
1553 | case FUTEX_OP_XOR: | ||
1554 | __futex_cas_op("xor\t%2, %4, %1", ret, oldval, uaddr, oparg); | ||
1555 | diff --git a/include/asm-x86/spinlock.h b/include/asm-x86/spinlock.h | ||
1556 | index 23804c1..68d473c 100644 | ||
1557 | --- a/include/asm-x86/spinlock.h | ||
1558 | +++ b/include/asm-x86/spinlock.h | ||
1559 | @@ -75,7 +75,7 @@ static inline int __raw_spin_is_contended(raw_spinlock_t *lock) | ||
1560 | { | ||
1561 | int tmp = *(volatile signed int *)(&(lock)->slock); | ||
1562 | |||
1563 | - return (((tmp >> 8) & 0xff) - (tmp & 0xff)) > 1; | ||
1564 | + return (((tmp >> 8) - tmp) & 0xff) > 1; | ||
1565 | } | ||
1566 | |||
1567 | static inline void __raw_spin_lock(raw_spinlock_t *lock) | ||
1568 | @@ -141,7 +141,7 @@ static inline int __raw_spin_is_contended(raw_spinlock_t *lock) | ||
1569 | { | ||
1570 | int tmp = *(volatile signed int *)(&(lock)->slock); | ||
1571 | |||
1572 | - return (((tmp >> 16) & 0xffff) - (tmp & 0xffff)) > 1; | ||
1573 | + return (((tmp >> 16) - tmp) & 0xffff) > 1; | ||
1574 | } | ||
1575 | |||
1576 | static inline void __raw_spin_lock(raw_spinlock_t *lock) | ||
1577 | diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h | ||
1578 | index 21b4a1c..e6f623d 100644 | ||
1579 | --- a/include/linux/usb/serial.h | ||
1580 | +++ b/include/linux/usb/serial.h | ||
1581 | @@ -18,7 +18,8 @@ | ||
1582 | #include <linux/mutex.h> | ||
1583 | |||
1584 | #define SERIAL_TTY_MAJOR 188 /* Nice legal number now */ | ||
1585 | -#define SERIAL_TTY_MINORS 255 /* loads of devices :) */ | ||
1586 | +#define SERIAL_TTY_MINORS 254 /* loads of devices :) */ | ||
1587 | +#define SERIAL_TTY_NO_MINOR 255 /* No minor was assigned */ | ||
1588 | |||
1589 | /* The maximum number of ports one device can grab at once */ | ||
1590 | #define MAX_NUM_PORTS 8 | ||
1591 | diff --git a/include/video/radeon.h b/include/video/radeon.h | ||
1592 | index 83467e1..099ffa5 100644 | ||
1593 | --- a/include/video/radeon.h | ||
1594 | +++ b/include/video/radeon.h | ||
1595 | @@ -527,8 +527,9 @@ | ||
1596 | |||
1597 | |||
1598 | /* DSTCACHE_CTLSTAT bit constants */ | ||
1599 | -#define RB2D_DC_FLUSH (3 << 0) | ||
1600 | -#define RB2D_DC_FLUSH_ALL 0xf | ||
1601 | +#define RB2D_DC_FLUSH_2D (1 << 0) | ||
1602 | +#define RB2D_DC_FREE_2D (1 << 2) | ||
1603 | +#define RB2D_DC_FLUSH_ALL (RB2D_DC_FLUSH_2D | RB2D_DC_FREE_2D) | ||
1604 | #define RB2D_DC_BUSY (1 << 31) | ||
1605 | |||
1606 | |||
1607 | @@ -741,6 +742,10 @@ | ||
1608 | #define SOFT_RESET_RB (1 << 6) | ||
1609 | #define SOFT_RESET_HDP (1 << 7) | ||
1610 | |||
1611 | +/* WAIT_UNTIL bit constants */ | ||
1612 | +#define WAIT_DMA_GUI_IDLE (1 << 9) | ||
1613 | +#define WAIT_2D_IDLECLEAN (1 << 16) | ||
1614 | + | ||
1615 | /* SURFACE_CNTL bit consants */ | ||
1616 | #define SURF_TRANSLATION_DIS (1 << 8) | ||
1617 | #define NONSURF_AP0_SWP_16BPP (1 << 20) | ||
1618 | diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c | ||
1619 | index a9b0420..bd90854 100644 | ||
1620 | --- a/kernel/posix-timers.c | ||
1621 | +++ b/kernel/posix-timers.c | ||
1622 | @@ -290,21 +290,29 @@ void do_schedule_next_timer(struct siginfo *info) | ||
1623 | else | ||
1624 | schedule_next_timer(timr); | ||
1625 | |||
1626 | - info->si_overrun = timr->it_overrun_last; | ||
1627 | + info->si_overrun += timr->it_overrun_last; | ||
1628 | } | ||
1629 | |||
1630 | if (timr) | ||
1631 | unlock_timer(timr, flags); | ||
1632 | } | ||
1633 | |||
1634 | -int posix_timer_event(struct k_itimer *timr,int si_private) | ||
1635 | +int posix_timer_event(struct k_itimer *timr, int si_private) | ||
1636 | { | ||
1637 | - memset(&timr->sigq->info, 0, sizeof(siginfo_t)); | ||
1638 | + /* | ||
1639 | + * FIXME: if ->sigq is queued we can race with | ||
1640 | + * dequeue_signal()->do_schedule_next_timer(). | ||
1641 | + * | ||
1642 | + * If dequeue_signal() sees the "right" value of | ||
1643 | + * si_sys_private it calls do_schedule_next_timer(). | ||
1644 | + * We re-queue ->sigq and drop ->it_lock(). | ||
1645 | + * do_schedule_next_timer() locks the timer | ||
1646 | + * and re-schedules it while ->sigq is pending. | ||
1647 | + * Not really bad, but not that we want. | ||
1648 | + */ | ||
1649 | timr->sigq->info.si_sys_private = si_private; | ||
1650 | - /* Send signal to the process that owns this timer.*/ | ||
1651 | |||
1652 | timr->sigq->info.si_signo = timr->it_sigev_signo; | ||
1653 | - timr->sigq->info.si_errno = 0; | ||
1654 | timr->sigq->info.si_code = SI_TIMER; | ||
1655 | timr->sigq->info.si_tid = timr->it_id; | ||
1656 | timr->sigq->info.si_value = timr->it_sigev_value; | ||
1657 | @@ -438,6 +446,7 @@ static struct k_itimer * alloc_posix_timer(void) | ||
1658 | kmem_cache_free(posix_timers_cache, tmr); | ||
1659 | tmr = NULL; | ||
1660 | } | ||
1661 | + memset(&tmr->sigq->info, 0, sizeof(siginfo_t)); | ||
1662 | return tmr; | ||
1663 | } | ||
1664 | |||
1665 | diff --git a/kernel/relay.c b/kernel/relay.c | ||
1666 | index d6204a4..ee2e614 100644 | ||
1667 | --- a/kernel/relay.c | ||
1668 | +++ b/kernel/relay.c | ||
1669 | @@ -803,6 +803,10 @@ static void relay_file_read_consume(struct rchan_buf *buf, | ||
1670 | size_t n_subbufs = buf->chan->n_subbufs; | ||
1671 | size_t read_subbuf; | ||
1672 | |||
1673 | + if (buf->subbufs_produced == buf->subbufs_consumed && | ||
1674 | + buf->offset == buf->bytes_consumed) | ||
1675 | + return; | ||
1676 | + | ||
1677 | if (buf->bytes_consumed + bytes_consumed > subbuf_size) { | ||
1678 | relay_subbufs_consumed(buf->chan, buf->cpu, 1); | ||
1679 | buf->bytes_consumed = 0; | ||
1680 | @@ -834,6 +838,8 @@ static int relay_file_read_avail(struct rchan_buf *buf, size_t read_pos) | ||
1681 | |||
1682 | relay_file_read_consume(buf, read_pos, 0); | ||
1683 | |||
1684 | + consumed = buf->subbufs_consumed; | ||
1685 | + | ||
1686 | if (unlikely(buf->offset > subbuf_size)) { | ||
1687 | if (produced == consumed) | ||
1688 | return 0; | ||
1689 | @@ -852,8 +858,12 @@ static int relay_file_read_avail(struct rchan_buf *buf, size_t read_pos) | ||
1690 | if (consumed > produced) | ||
1691 | produced += n_subbufs * subbuf_size; | ||
1692 | |||
1693 | - if (consumed == produced) | ||
1694 | + if (consumed == produced) { | ||
1695 | + if (buf->offset == subbuf_size && | ||
1696 | + buf->subbufs_produced > buf->subbufs_consumed) | ||
1697 | + return 1; | ||
1698 | return 0; | ||
1699 | + } | ||
1700 | |||
1701 | return 1; | ||
1702 | } | ||
1703 | diff --git a/kernel/signal.c b/kernel/signal.c | ||
1704 | index 6af1210..286435b 100644 | ||
1705 | --- a/kernel/signal.c | ||
1706 | +++ b/kernel/signal.c | ||
1707 | @@ -1312,6 +1312,7 @@ int send_sigqueue(int sig, struct sigqueue *q, struct task_struct *p) | ||
1708 | ret = -1; | ||
1709 | goto out_err; | ||
1710 | } | ||
1711 | + q->info.si_overrun = 0; | ||
1712 | |||
1713 | if (unlikely(!list_empty(&q->list))) { | ||
1714 | /* | ||
1715 | diff --git a/lib/random32.c b/lib/random32.c | ||
1716 | index ca87d86..217d5c4 100644 | ||
1717 | --- a/lib/random32.c | ||
1718 | +++ b/lib/random32.c | ||
1719 | @@ -56,23 +56,12 @@ static u32 __random32(struct rnd_state *state) | ||
1720 | return (state->s1 ^ state->s2 ^ state->s3); | ||
1721 | } | ||
1722 | |||
1723 | -static void __set_random32(struct rnd_state *state, unsigned long s) | ||
1724 | +/* | ||
1725 | + * Handle minimum values for seeds | ||
1726 | + */ | ||
1727 | +static inline u32 __seed(u32 x, u32 m) | ||
1728 | { | ||
1729 | - if (s == 0) | ||
1730 | - s = 1; /* default seed is 1 */ | ||
1731 | - | ||
1732 | -#define LCG(n) (69069 * n) | ||
1733 | - state->s1 = LCG(s); | ||
1734 | - state->s2 = LCG(state->s1); | ||
1735 | - state->s3 = LCG(state->s2); | ||
1736 | - | ||
1737 | - /* "warm it up" */ | ||
1738 | - __random32(state); | ||
1739 | - __random32(state); | ||
1740 | - __random32(state); | ||
1741 | - __random32(state); | ||
1742 | - __random32(state); | ||
1743 | - __random32(state); | ||
1744 | + return (x < m) ? x + m : x; | ||
1745 | } | ||
1746 | |||
1747 | /** | ||
1748 | @@ -107,7 +96,7 @@ void srandom32(u32 entropy) | ||
1749 | */ | ||
1750 | for_each_possible_cpu (i) { | ||
1751 | struct rnd_state *state = &per_cpu(net_rand_state, i); | ||
1752 | - __set_random32(state, state->s1 ^ entropy); | ||
1753 | + state->s1 = __seed(state->s1 ^ entropy, 1); | ||
1754 | } | ||
1755 | } | ||
1756 | EXPORT_SYMBOL(srandom32); | ||
1757 | @@ -122,7 +111,19 @@ static int __init random32_init(void) | ||
1758 | |||
1759 | for_each_possible_cpu(i) { | ||
1760 | struct rnd_state *state = &per_cpu(net_rand_state,i); | ||
1761 | - __set_random32(state, i + jiffies); | ||
1762 | + | ||
1763 | +#define LCG(x) ((x) * 69069) /* super-duper LCG */ | ||
1764 | + state->s1 = __seed(LCG(i + jiffies), 1); | ||
1765 | + state->s2 = __seed(LCG(state->s1), 7); | ||
1766 | + state->s3 = __seed(LCG(state->s2), 15); | ||
1767 | + | ||
1768 | + /* "warm it up" */ | ||
1769 | + __random32(state); | ||
1770 | + __random32(state); | ||
1771 | + __random32(state); | ||
1772 | + __random32(state); | ||
1773 | + __random32(state); | ||
1774 | + __random32(state); | ||
1775 | } | ||
1776 | return 0; | ||
1777 | } | ||
1778 | @@ -135,13 +136,18 @@ core_initcall(random32_init); | ||
1779 | static int __init random32_reseed(void) | ||
1780 | { | ||
1781 | int i; | ||
1782 | - unsigned long seed; | ||
1783 | |||
1784 | for_each_possible_cpu(i) { | ||
1785 | struct rnd_state *state = &per_cpu(net_rand_state,i); | ||
1786 | + u32 seeds[3]; | ||
1787 | + | ||
1788 | + get_random_bytes(&seeds, sizeof(seeds)); | ||
1789 | + state->s1 = __seed(seeds[0], 1); | ||
1790 | + state->s2 = __seed(seeds[1], 7); | ||
1791 | + state->s3 = __seed(seeds[2], 15); | ||
1792 | |||
1793 | - get_random_bytes(&seed, sizeof(seed)); | ||
1794 | - __set_random32(state, seed); | ||
1795 | + /* mix it in */ | ||
1796 | + __random32(state); | ||
1797 | } | ||
1798 | return 0; | ||
1799 | } | ||
1800 | diff --git a/mm/memory.c b/mm/memory.c | ||
1801 | index df84668..2d7e606 100644 | ||
1802 | --- a/mm/memory.c | ||
1803 | +++ b/mm/memory.c | ||
1804 | @@ -2618,16 +2618,26 @@ int make_pages_present(unsigned long addr, unsigned long end) | ||
1805 | |||
1806 | vma = find_vma(current->mm, addr); | ||
1807 | if (!vma) | ||
1808 | - return -1; | ||
1809 | + return -ENOMEM; | ||
1810 | write = (vma->vm_flags & VM_WRITE) != 0; | ||
1811 | BUG_ON(addr >= end); | ||
1812 | BUG_ON(end > vma->vm_end); | ||
1813 | len = DIV_ROUND_UP(end, PAGE_SIZE) - addr/PAGE_SIZE; | ||
1814 | ret = get_user_pages(current, current->mm, addr, | ||
1815 | len, write, 0, NULL, NULL); | ||
1816 | - if (ret < 0) | ||
1817 | + if (ret < 0) { | ||
1818 | + /* | ||
1819 | + SUS require strange return value to mlock | ||
1820 | + - invalid addr generate to ENOMEM. | ||
1821 | + - out of memory should generate EAGAIN. | ||
1822 | + */ | ||
1823 | + if (ret == -EFAULT) | ||
1824 | + ret = -ENOMEM; | ||
1825 | + else if (ret == -ENOMEM) | ||
1826 | + ret = -EAGAIN; | ||
1827 | return ret; | ||
1828 | - return ret == len ? 0 : -1; | ||
1829 | + } | ||
1830 | + return ret == len ? 0 : -ENOMEM; | ||
1831 | } | ||
1832 | |||
1833 | #if !defined(__HAVE_ARCH_GATE_AREA) | ||
1834 | diff --git a/mm/mlock.c b/mm/mlock.c | ||
1835 | index 7b26560..01fbe93 100644 | ||
1836 | --- a/mm/mlock.c | ||
1837 | +++ b/mm/mlock.c | ||
1838 | @@ -78,8 +78,6 @@ success: | ||
1839 | |||
1840 | mm->locked_vm -= pages; | ||
1841 | out: | ||
1842 | - if (ret == -ENOMEM) | ||
1843 | - ret = -EAGAIN; | ||
1844 | return ret; | ||
1845 | } | ||
1846 | |||
1847 | diff --git a/net/dccp/proto.c b/net/dccp/proto.c | ||
1848 | index c91d3c1..c3e3acb 100644 | ||
1849 | --- a/net/dccp/proto.c | ||
1850 | +++ b/net/dccp/proto.c | ||
1851 | @@ -477,6 +477,11 @@ static int dccp_setsockopt_change(struct sock *sk, int type, | ||
1852 | |||
1853 | if (copy_from_user(&opt, optval, sizeof(opt))) | ||
1854 | return -EFAULT; | ||
1855 | + /* | ||
1856 | + * rfc4340: 6.1. Change Options | ||
1857 | + */ | ||
1858 | + if (opt.dccpsf_len < 1) | ||
1859 | + return -EINVAL; | ||
1860 | |||
1861 | val = kmalloc(opt.dccpsf_len, GFP_KERNEL); | ||
1862 | if (!val) | ||
1863 | diff --git a/net/ipv4/ipvs/ip_vs_est.c b/net/ipv4/ipvs/ip_vs_est.c | ||
1864 | index dfa0d71..f97ffc5 100644 | ||
1865 | --- a/net/ipv4/ipvs/ip_vs_est.c | ||
1866 | +++ b/net/ipv4/ipvs/ip_vs_est.c | ||
1867 | @@ -172,8 +172,11 @@ void ip_vs_kill_estimator(struct ip_vs_stats *stats) | ||
1868 | kfree(est); | ||
1869 | killed++; | ||
1870 | } | ||
1871 | - if (killed && est_list == NULL) | ||
1872 | - del_timer_sync(&est_timer); | ||
1873 | + while (killed && !est_list && try_to_del_timer_sync(&est_timer) < 0) { | ||
1874 | + write_unlock_bh(&est_lock); | ||
1875 | + cpu_relax(); | ||
1876 | + write_lock_bh(&est_lock); | ||
1877 | + } | ||
1878 | write_unlock_bh(&est_lock); | ||
1879 | } | ||
1880 | |||
1881 | diff --git a/net/ipv4/netfilter/nf_nat_snmp_basic.c b/net/ipv4/netfilter/nf_nat_snmp_basic.c | ||
1882 | index 5f35f0b..8e4148d 100644 | ||
1883 | --- a/net/ipv4/netfilter/nf_nat_snmp_basic.c | ||
1884 | +++ b/net/ipv4/netfilter/nf_nat_snmp_basic.c | ||
1885 | @@ -438,8 +438,8 @@ static unsigned char asn1_oid_decode(struct asn1_ctx *ctx, | ||
1886 | unsigned int *len) | ||
1887 | { | ||
1888 | unsigned long subid; | ||
1889 | - unsigned int size; | ||
1890 | unsigned long *optr; | ||
1891 | + size_t size; | ||
1892 | |||
1893 | size = eoc - ctx->pointer + 1; | ||
1894 | |||
1895 | diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c | ||
1896 | index 8b67ca0..fb1c192 100644 | ||
1897 | --- a/net/ipv6/ip6_output.c | ||
1898 | +++ b/net/ipv6/ip6_output.c | ||
1899 | @@ -229,6 +229,10 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | ||
1900 | skb_reset_network_header(skb); | ||
1901 | hdr = ipv6_hdr(skb); | ||
1902 | |||
1903 | + /* Allow local fragmentation. */ | ||
1904 | + if (ipfragok) | ||
1905 | + skb->local_df = 1; | ||
1906 | + | ||
1907 | /* | ||
1908 | * Fill in the IPv6 header | ||
1909 | */ |