Magellan Linux

Contents of /trunk/kernel26-alx/patches-2.6.27-r3/0150-2.6.27.51-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1176 - (show annotations) (download)
Thu Oct 14 15:11:06 2010 UTC (13 years, 6 months ago) by niro
File size: 14882 byte(s)
-2.6.27-alx-r3: new magellan 0.5.2 kernel
1 diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
2 index 001c099..07e27f7 100644
3 --- a/arch/x86/xen/enlighten.c
4 +++ b/arch/x86/xen/enlighten.c
5 @@ -1179,7 +1179,7 @@ static const struct pv_time_ops xen_time_ops __initdata = {
6 .set_wallclock = xen_set_wallclock,
7 .get_wallclock = xen_get_wallclock,
8 .get_tsc_khz = xen_tsc_khz,
9 - .sched_clock = xen_sched_clock,
10 + .sched_clock = xen_clocksource_read,
11 };
12
13 static const struct pv_cpu_ops xen_cpu_ops __initdata = {
14 diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
15 index 685b774..d0f176e 100644
16 --- a/arch/x86/xen/time.c
17 +++ b/arch/x86/xen/time.c
18 @@ -30,8 +30,6 @@
19 #define TIMER_SLOP 100000
20 #define NS_PER_TICK (1000000000LL / HZ)
21
22 -static cycle_t xen_clocksource_read(void);
23 -
24 /* runstate info updated by Xen */
25 static DEFINE_PER_CPU(struct vcpu_runstate_info, runstate);
26
27 @@ -158,45 +156,6 @@ static void do_stolen_accounting(void)
28 account_steal_time(idle_task(smp_processor_id()), ticks);
29 }
30
31 -/*
32 - * Xen sched_clock implementation. Returns the number of unstolen
33 - * nanoseconds, which is nanoseconds the VCPU spent in RUNNING+BLOCKED
34 - * states.
35 - */
36 -unsigned long long xen_sched_clock(void)
37 -{
38 - struct vcpu_runstate_info state;
39 - cycle_t now;
40 - u64 ret;
41 - s64 offset;
42 -
43 - /*
44 - * Ideally sched_clock should be called on a per-cpu basis
45 - * anyway, so preempt should already be disabled, but that's
46 - * not current practice at the moment.
47 - */
48 - preempt_disable();
49 -
50 - now = xen_clocksource_read();
51 -
52 - get_runstate_snapshot(&state);
53 -
54 - WARN_ON(state.state != RUNSTATE_running);
55 -
56 - offset = now - state.state_entry_time;
57 - if (offset < 0)
58 - offset = 0;
59 -
60 - ret = state.time[RUNSTATE_blocked] +
61 - state.time[RUNSTATE_running] +
62 - offset;
63 -
64 - preempt_enable();
65 -
66 - return ret;
67 -}
68 -
69 -
70 /* Get the TSC speed from Xen */
71 unsigned long xen_tsc_khz(void)
72 {
73 @@ -213,7 +172,7 @@ unsigned long xen_tsc_khz(void)
74 return xen_khz;
75 }
76
77 -static cycle_t xen_clocksource_read(void)
78 +cycle_t xen_clocksource_read(void)
79 {
80 struct pvclock_vcpu_time_info *src;
81 cycle_t ret;
82 diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h
83 index dd3c231..8a3c823 100644
84 --- a/arch/x86/xen/xen-ops.h
85 +++ b/arch/x86/xen/xen-ops.h
86 @@ -3,6 +3,7 @@
87
88 #include <linux/init.h>
89 #include <linux/irqreturn.h>
90 +#include <linux/clocksource.h>
91 #include <xen/xen-ops.h>
92
93 /* These are code, but not functions. Defined in entry.S */
94 @@ -37,7 +38,7 @@ unsigned long xen_tsc_khz(void);
95 void __init xen_time_init(void);
96 unsigned long xen_get_wallclock(void);
97 int xen_set_wallclock(unsigned long time);
98 -unsigned long long xen_sched_clock(void);
99 +cycle_t xen_clocksource_read(void);
100
101 irqreturn_t xen_debug_interrupt(int irq, void *dev_id);
102
103 diff --git a/drivers/char/nvram.c b/drivers/char/nvram.c
104 index 39f6357..1a5d40d 100644
105 --- a/drivers/char/nvram.c
106 +++ b/drivers/char/nvram.c
107 @@ -265,10 +265,16 @@ nvram_write(struct file *file, const char __user *buf, size_t count, loff_t *ppo
108 unsigned char contents[NVRAM_BYTES];
109 unsigned i = *ppos;
110 unsigned char *tmp;
111 - int len;
112
113 - len = (NVRAM_BYTES - i) < count ? (NVRAM_BYTES - i) : count;
114 - if (copy_from_user(contents, buf, len))
115 + if (i >= NVRAM_BYTES)
116 + return 0; /* Past EOF */
117 +
118 + if (count > NVRAM_BYTES - i)
119 + count = NVRAM_BYTES - i;
120 + if (count > NVRAM_BYTES)
121 + return -EFAULT; /* Can't happen, but prove it to gcc */
122 +
123 + if (copy_from_user(contents, buf, count))
124 return -EFAULT;
125
126 spin_lock_irq(&rtc_lock);
127 @@ -276,7 +282,7 @@ nvram_write(struct file *file, const char __user *buf, size_t count, loff_t *ppo
128 if (!__nvram_check_checksum())
129 goto checksum_err;
130
131 - for (tmp = contents; count-- > 0 && i < NVRAM_BYTES; ++i, ++tmp)
132 + for (tmp = contents; count--; ++i, ++tmp)
133 __nvram_write_byte(*tmp, i);
134
135 __nvram_set_checksum();
136 diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
137 index dbf51e9..6fcedbe 100644
138 --- a/drivers/md/raid10.c
139 +++ b/drivers/md/raid10.c
140 @@ -818,11 +818,29 @@ static int make_request(struct request_queue *q, struct bio * bio)
141 */
142 bp = bio_split(bio, bio_split_pool,
143 chunk_sects - (bio->bi_sector & (chunk_sects - 1)) );
144 +
145 + /* Each of these 'make_request' calls will call 'wait_barrier'.
146 + * If the first succeeds but the second blocks due to the resync
147 + * thread raising the barrier, we will deadlock because the
148 + * IO to the underlying device will be queued in generic_make_request
149 + * and will never complete, so will never reduce nr_pending.
150 + * So increment nr_waiting here so no new raise_barriers will
151 + * succeed, and so the second wait_barrier cannot block.
152 + */
153 + spin_lock_irq(&conf->resync_lock);
154 + conf->nr_waiting++;
155 + spin_unlock_irq(&conf->resync_lock);
156 +
157 if (make_request(q, &bp->bio1))
158 generic_make_request(&bp->bio1);
159 if (make_request(q, &bp->bio2))
160 generic_make_request(&bp->bio2);
161
162 + spin_lock_irq(&conf->resync_lock);
163 + conf->nr_waiting--;
164 + wake_up(&conf->wait_barrier);
165 + spin_unlock_irq(&conf->resync_lock);
166 +
167 bio_pair_release(bp);
168 return 0;
169 bad_map:
170 diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
171 index 5368689..e09684e 100644
172 --- a/drivers/pci/quirks.c
173 +++ b/drivers/pci/quirks.c
174 @@ -1833,6 +1833,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disabl
175 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3336, quirk_disable_all_msi);
176 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi);
177 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3364, quirk_disable_all_msi);
178 +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8380_0, quirk_disable_all_msi);
179
180 /* Disable MSI on chipsets that are known to not support it */
181 static void __devinit quirk_disable_msi(struct pci_dev *dev)
182 diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c
183 index bbc723a..45cb94c 100644
184 --- a/fs/ecryptfs/file.c
185 +++ b/fs/ecryptfs/file.c
186 @@ -199,7 +199,7 @@ static int ecryptfs_open(struct inode *inode, struct file *file)
187 "the persistent file for the dentry with name "
188 "[%s]; rc = [%d]\n", __func__,
189 ecryptfs_dentry->d_name.name, rc);
190 - goto out;
191 + goto out_free;
192 }
193 }
194 if ((ecryptfs_inode_to_private(inode)->lower_file->f_flags & O_RDONLY)
195 @@ -207,7 +207,7 @@ static int ecryptfs_open(struct inode *inode, struct file *file)
196 rc = -EPERM;
197 printk(KERN_WARNING "%s: Lower persistent file is RO; eCryptfs "
198 "file must hence be opened RO\n", __func__);
199 - goto out;
200 + goto out_free;
201 }
202 ecryptfs_set_file_lower(
203 file, ecryptfs_inode_to_private(inode)->lower_file);
204 @@ -303,12 +303,40 @@ static int ecryptfs_fasync(int fd, struct file *file, int flag)
205 return rc;
206 }
207
208 -static int ecryptfs_ioctl(struct inode *inode, struct file *file,
209 - unsigned int cmd, unsigned long arg);
210 +static long
211 +ecryptfs_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
212 +{
213 + struct file *lower_file = NULL;
214 + long rc = -ENOTTY;
215 +
216 + if (ecryptfs_file_to_private(file))
217 + lower_file = ecryptfs_file_to_lower(file);
218 + if (lower_file && lower_file->f_op && lower_file->f_op->unlocked_ioctl)
219 + rc = lower_file->f_op->unlocked_ioctl(lower_file, cmd, arg);
220 + return rc;
221 +}
222 +
223 +#ifdef CONFIG_COMPAT
224 +static long
225 +ecryptfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
226 +{
227 + struct file *lower_file = NULL;
228 + long rc = -ENOIOCTLCMD;
229 +
230 + if (ecryptfs_file_to_private(file))
231 + lower_file = ecryptfs_file_to_lower(file);
232 + if (lower_file && lower_file->f_op && lower_file->f_op->compat_ioctl)
233 + rc = lower_file->f_op->compat_ioctl(lower_file, cmd, arg);
234 + return rc;
235 +}
236 +#endif
237
238 const struct file_operations ecryptfs_dir_fops = {
239 .readdir = ecryptfs_readdir,
240 - .ioctl = ecryptfs_ioctl,
241 + .unlocked_ioctl = ecryptfs_unlocked_ioctl,
242 +#ifdef CONFIG_COMPAT
243 + .compat_ioctl = ecryptfs_compat_ioctl,
244 +#endif
245 .mmap = generic_file_mmap,
246 .open = ecryptfs_open,
247 .flush = ecryptfs_flush,
248 @@ -325,7 +353,10 @@ const struct file_operations ecryptfs_main_fops = {
249 .write = do_sync_write,
250 .aio_write = generic_file_aio_write,
251 .readdir = ecryptfs_readdir,
252 - .ioctl = ecryptfs_ioctl,
253 + .unlocked_ioctl = ecryptfs_unlocked_ioctl,
254 +#ifdef CONFIG_COMPAT
255 + .compat_ioctl = ecryptfs_compat_ioctl,
256 +#endif
257 .mmap = generic_file_mmap,
258 .open = ecryptfs_open,
259 .flush = ecryptfs_flush,
260 @@ -334,20 +365,3 @@ const struct file_operations ecryptfs_main_fops = {
261 .fasync = ecryptfs_fasync,
262 .splice_read = generic_file_splice_read,
263 };
264 -
265 -static int
266 -ecryptfs_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
267 - unsigned long arg)
268 -{
269 - int rc = 0;
270 - struct file *lower_file = NULL;
271 -
272 - if (ecryptfs_file_to_private(file))
273 - lower_file = ecryptfs_file_to_lower(file);
274 - if (lower_file && lower_file->f_op && lower_file->f_op->ioctl)
275 - rc = lower_file->f_op->ioctl(ecryptfs_inode_to_lower(inode),
276 - lower_file, cmd, arg);
277 - else
278 - rc = -ENOTTY;
279 - return rc;
280 -}
281 diff --git a/fs/jfs/xattr.c b/fs/jfs/xattr.c
282 index 9b7f2cd..f35a40b 100644
283 --- a/fs/jfs/xattr.c
284 +++ b/fs/jfs/xattr.c
285 @@ -85,46 +85,25 @@ struct ea_buffer {
286 #define EA_MALLOC 0x0008
287
288
289 +static int is_known_namespace(const char *name)
290 +{
291 + if (strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN) &&
292 + strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) &&
293 + strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) &&
294 + strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN))
295 + return false;
296 +
297 + return true;
298 +}
299 +
300 /*
301 * These three routines are used to recognize on-disk extended attributes
302 * that are in a recognized namespace. If the attribute is not recognized,
303 * "os2." is prepended to the name
304 */
305 -static inline int is_os2_xattr(struct jfs_ea *ea)
306 +static int is_os2_xattr(struct jfs_ea *ea)
307 {
308 - /*
309 - * Check for "system."
310 - */
311 - if ((ea->namelen >= XATTR_SYSTEM_PREFIX_LEN) &&
312 - !strncmp(ea->name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
313 - return false;
314 - /*
315 - * Check for "user."
316 - */
317 - if ((ea->namelen >= XATTR_USER_PREFIX_LEN) &&
318 - !strncmp(ea->name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN))
319 - return false;
320 - /*
321 - * Check for "security."
322 - */
323 - if ((ea->namelen >= XATTR_SECURITY_PREFIX_LEN) &&
324 - !strncmp(ea->name, XATTR_SECURITY_PREFIX,
325 - XATTR_SECURITY_PREFIX_LEN))
326 - return false;
327 - /*
328 - * Check for "trusted."
329 - */
330 - if ((ea->namelen >= XATTR_TRUSTED_PREFIX_LEN) &&
331 - !strncmp(ea->name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN))
332 - return false;
333 - /*
334 - * Add any other valid namespace prefixes here
335 - */
336 -
337 - /*
338 - * We assume it's OS/2's flat namespace
339 - */
340 - return true;
341 + return !is_known_namespace(ea->name);
342 }
343
344 static inline int name_size(struct jfs_ea *ea)
345 @@ -768,13 +747,23 @@ static int can_set_xattr(struct inode *inode, const char *name,
346 if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
347 return can_set_system_xattr(inode, name, value, value_len);
348
349 + if (!strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN)) {
350 + /*
351 + * This makes sure that we aren't trying to set an
352 + * attribute in a different namespace by prefixing it
353 + * with "os2."
354 + */
355 + if (is_known_namespace(name + XATTR_OS2_PREFIX_LEN))
356 + return -EOPNOTSUPP;
357 + return 0;
358 + }
359 +
360 /*
361 * Don't allow setting an attribute in an unknown namespace.
362 */
363 if (strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) &&
364 strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) &&
365 - strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) &&
366 - strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN))
367 + strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN))
368 return -EOPNOTSUPP;
369
370 return 0;
371 @@ -956,19 +945,8 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data,
372 int xattr_size;
373 ssize_t size;
374 int namelen = strlen(name);
375 - char *os2name = NULL;
376 char *value;
377
378 - if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) {
379 - os2name = kmalloc(namelen - XATTR_OS2_PREFIX_LEN + 1,
380 - GFP_KERNEL);
381 - if (!os2name)
382 - return -ENOMEM;
383 - strcpy(os2name, name + XATTR_OS2_PREFIX_LEN);
384 - name = os2name;
385 - namelen -= XATTR_OS2_PREFIX_LEN;
386 - }
387 -
388 down_read(&JFS_IP(inode)->xattr_sem);
389
390 xattr_size = ea_get(inode, &ea_buf, 0);
391 @@ -1006,8 +984,6 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data,
392 out:
393 up_read(&JFS_IP(inode)->xattr_sem);
394
395 - kfree(os2name);
396 -
397 return size;
398 }
399
400 @@ -1016,6 +992,19 @@ ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data,
401 {
402 int err;
403
404 + if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) {
405 + /*
406 + * skip past "os2." prefix
407 + */
408 + name += XATTR_OS2_PREFIX_LEN;
409 + /*
410 + * Don't allow retrieving properly prefixed attributes
411 + * by prepending them with "os2."
412 + */
413 + if (is_known_namespace(name))
414 + return -EOPNOTSUPP;
415 + }
416 +
417 err = __jfs_getxattr(dentry->d_inode, name, data, buf_size);
418
419 return err;
420 diff --git a/fs/signalfd.c b/fs/signalfd.c
421 index b07565c..d98bea8 100644
422 --- a/fs/signalfd.c
423 +++ b/fs/signalfd.c
424 @@ -87,6 +87,7 @@ static int signalfd_copyinfo(struct signalfd_siginfo __user *uinfo,
425 err |= __put_user(kinfo->si_tid, &uinfo->ssi_tid);
426 err |= __put_user(kinfo->si_overrun, &uinfo->ssi_overrun);
427 err |= __put_user((long) kinfo->si_ptr, &uinfo->ssi_ptr);
428 + err |= __put_user(kinfo->si_int, &uinfo->ssi_int);
429 break;
430 case __SI_POLL:
431 err |= __put_user(kinfo->si_band, &uinfo->ssi_band);
432 @@ -110,6 +111,7 @@ static int signalfd_copyinfo(struct signalfd_siginfo __user *uinfo,
433 err |= __put_user(kinfo->si_pid, &uinfo->ssi_pid);
434 err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid);
435 err |= __put_user((long) kinfo->si_ptr, &uinfo->ssi_ptr);
436 + err |= __put_user(kinfo->si_int, &uinfo->ssi_int);
437 break;
438 default:
439 /*
440 diff --git a/fs/splice.c b/fs/splice.c
441 index 2f2d8c1..4e1ea5e 100644
442 --- a/fs/splice.c
443 +++ b/fs/splice.c
444 @@ -366,17 +366,7 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
445 * If the page isn't uptodate, we may need to start io on it
446 */
447 if (!PageUptodate(page)) {
448 - /*
449 - * If in nonblock mode then dont block on waiting
450 - * for an in-flight io page
451 - */
452 - if (flags & SPLICE_F_NONBLOCK) {
453 - if (!trylock_page(page)) {
454 - error = -EAGAIN;
455 - break;
456 - }
457 - } else
458 - lock_page(page);
459 + lock_page(page);
460
461 /*
462 * Page was truncated, or invalidated by the
463 diff --git a/mm/backing-dev.c b/mm/backing-dev.c
464 index f2e574d..801c08b 100644
465 --- a/mm/backing-dev.c
466 +++ b/mm/backing-dev.c
467 @@ -176,6 +176,9 @@ int bdi_register(struct backing_dev_info *bdi, struct device *parent,
468 int ret = 0;
469 struct device *dev;
470
471 + if (bdi->dev) /* The driver needs to use separate queues per device */
472 + goto exit;
473 +
474 va_start(args, fmt);
475 dev = device_create_vargs(bdi_class, parent, MKDEV(0, 0), bdi, fmt, args);
476 va_end(args);