Magellan Linux

Annotation of /trunk/kernel26-alx/patches-2.6.27-r3/0134-2.6.27.35-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1176 - (hide annotations) (download)
Thu Oct 14 15:11:06 2010 UTC (13 years, 7 months ago) by niro
File size: 16308 byte(s)
-2.6.27-alx-r3: new magellan 0.5.2 kernel
1 niro 1176 diff --git a/arch/powerpc/include/asm/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h
2     index c2df53c..cd1f704 100644
3     --- a/arch/powerpc/include/asm/mmu-hash64.h
4     +++ b/arch/powerpc/include/asm/mmu-hash64.h
5     @@ -41,6 +41,7 @@ extern char initial_stab[];
6    
7     #define SLB_NUM_BOLTED 3
8     #define SLB_CACHE_ENTRIES 8
9     +#define SLB_MIN_SIZE 32
10    
11     /* Bits in the SLB ESID word */
12     #define SLB_ESID_V ASM_CONST(0x0000000008000000) /* valid */
13     @@ -299,6 +300,7 @@ extern void slb_flush_and_rebolt(void);
14     extern void stab_initialize(unsigned long stab);
15    
16     extern void slb_vmalloc_update(void);
17     +extern void slb_set_size(u16 size);
18     #endif /* __ASSEMBLY__ */
19    
20     /*
21     diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c
22     index b3eef30..c729910 100644
23     --- a/arch/powerpc/kernel/lparcfg.c
24     +++ b/arch/powerpc/kernel/lparcfg.c
25     @@ -35,6 +35,7 @@
26     #include <asm/prom.h>
27     #include <asm/vdso_datapage.h>
28     #include <asm/vio.h>
29     +#include <asm/mmu.h>
30    
31     #define MODULE_VERS "1.8"
32     #define MODULE_NAME "lparcfg"
33     @@ -485,6 +486,8 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
34    
35     seq_printf(m, "shared_processor_mode=%d\n", lppaca[0].shared_proc);
36    
37     + seq_printf(m, "slb_size=%d\n", mmu_slb_size);
38     +
39     return 0;
40     }
41    
42     diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
43     index 1f8505c..49e6d91 100644
44     --- a/arch/powerpc/kernel/rtas.c
45     +++ b/arch/powerpc/kernel/rtas.c
46     @@ -38,6 +38,7 @@
47     #include <asm/syscalls.h>
48     #include <asm/smp.h>
49     #include <asm/atomic.h>
50     +#include <asm/mmu.h>
51    
52     struct rtas_t rtas = {
53     .lock = SPIN_LOCK_UNLOCKED
54     @@ -665,6 +666,7 @@ static void rtas_percpu_suspend_me(void *info)
55     {
56     long rc;
57     unsigned long msr_save;
58     + u16 slb_size = mmu_slb_size;
59     int cpu;
60     struct rtas_suspend_me_data *data =
61     (struct rtas_suspend_me_data *)info;
62     @@ -686,13 +688,16 @@ static void rtas_percpu_suspend_me(void *info)
63     /* All other cpus are in H_JOIN, this cpu does
64     * the suspend.
65     */
66     + slb_set_size(SLB_MIN_SIZE);
67     printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n",
68     smp_processor_id());
69     data->error = rtas_call(data->token, 0, 1, NULL);
70    
71     - if (data->error)
72     + if (data->error) {
73     printk(KERN_DEBUG "ibm,suspend-me returned %d\n",
74     data->error);
75     + slb_set_size(slb_size);
76     + }
77     } else {
78     printk(KERN_ERR "H_JOIN on cpu %i failed with rc = %ld\n",
79     smp_processor_id(), rc);
80     diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c
81     index 89497fb..4d73765 100644
82     --- a/arch/powerpc/mm/slb.c
83     +++ b/arch/powerpc/mm/slb.c
84     @@ -247,14 +247,22 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
85     static inline void patch_slb_encoding(unsigned int *insn_addr,
86     unsigned int immed)
87     {
88     - /* Assume the instruction had a "0" immediate value, just
89     - * "or" in the new value
90     - */
91     - *insn_addr |= immed;
92     + *insn_addr = (*insn_addr & 0xffff0000) | immed;
93     flush_icache_range((unsigned long)insn_addr, 4+
94     (unsigned long)insn_addr);
95     }
96    
97     +void slb_set_size(u16 size)
98     +{
99     + extern unsigned int *slb_compare_rr_to_size;
100     +
101     + if (mmu_slb_size == size)
102     + return;
103     +
104     + mmu_slb_size = size;
105     + patch_slb_encoding(slb_compare_rr_to_size, mmu_slb_size);
106     +}
107     +
108     void slb_initialize(void)
109     {
110     unsigned long linear_llp, vmalloc_llp, io_llp;
111     diff --git a/arch/powerpc/platforms/pseries/reconfig.c b/arch/powerpc/platforms/pseries/reconfig.c
112     index 7637bd3..e67e18d 100644
113     --- a/arch/powerpc/platforms/pseries/reconfig.c
114     +++ b/arch/powerpc/platforms/pseries/reconfig.c
115     @@ -20,6 +20,7 @@
116     #include <asm/machdep.h>
117     #include <asm/uaccess.h>
118     #include <asm/pSeries_reconfig.h>
119     +#include <asm/mmu.h>
120    
121    
122    
123     @@ -439,9 +440,15 @@ static int do_update_property(char *buf, size_t bufsize)
124     if (!newprop)
125     return -ENOMEM;
126    
127     + if (!strcmp(name, "slb-size") || !strcmp(name, "ibm,slb-size"))
128     + slb_set_size(*(int *)value);
129     +
130     oldprop = of_find_property(np, name,NULL);
131     - if (!oldprop)
132     + if (!oldprop) {
133     + if (strlen(name))
134     + return prom_add_property(np, newprop);
135     return -ENODEV;
136     + }
137    
138     rc = prom_update_property(np, newprop, oldprop);
139     if (rc)
140     diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
141     index 2bcf350..5cdd821 100644
142     --- a/drivers/ata/libata-core.c
143     +++ b/drivers/ata/libata-core.c
144     @@ -565,7 +565,13 @@ u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev)
145     head = tf->device & 0xf;
146     sect = tf->lbal;
147    
148     - block = (cyl * dev->heads + head) * dev->sectors + sect;
149     + if (!sect) {
150     + ata_dev_printk(dev, KERN_WARNING, "device reported "
151     + "invalid CHS sector 0\n");
152     + sect = 1; /* oh well */
153     + }
154     +
155     + block = (cyl * dev->heads + head) * dev->sectors + sect - 1;
156     }
157    
158     return block;
159     diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c
160     index ed1879c..4180b55 100644
161     --- a/drivers/char/tpm/tpm_tis.c
162     +++ b/drivers/char/tpm/tpm_tis.c
163     @@ -450,6 +450,12 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
164     goto out_err;
165     }
166    
167     + /* Default timeouts */
168     + chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
169     + chip->vendor.timeout_b = msecs_to_jiffies(TIS_LONG_TIMEOUT);
170     + chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
171     + chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
172     +
173     if (request_locality(chip, 0) != 0) {
174     rc = -ENODEV;
175     goto out_err;
176     @@ -457,12 +463,6 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
177    
178     vendor = ioread32(chip->vendor.iobase + TPM_DID_VID(0));
179    
180     - /* Default timeouts */
181     - chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
182     - chip->vendor.timeout_b = msecs_to_jiffies(TIS_LONG_TIMEOUT);
183     - chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
184     - chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
185     -
186     dev_info(dev,
187     "1.2 TPM (device-id 0x%X, rev-id %d)\n",
188     vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0)));
189     diff --git a/drivers/ps3/ps3stor_lib.c b/drivers/ps3/ps3stor_lib.c
190     index 55955f1..40169a1 100644
191     --- a/drivers/ps3/ps3stor_lib.c
192     +++ b/drivers/ps3/ps3stor_lib.c
193     @@ -23,6 +23,65 @@
194     #include <asm/lv1call.h>
195     #include <asm/ps3stor.h>
196    
197     +/*
198     + * A workaround for flash memory I/O errors when the internal hard disk
199     + * has not been formatted for OtherOS use. Delay disk close until flash
200     + * memory is closed.
201     + */
202     +
203     +static struct ps3_flash_workaround {
204     + int flash_open;
205     + int disk_open;
206     + struct ps3_system_bus_device *disk_sbd;
207     +} ps3_flash_workaround;
208     +
209     +static int ps3stor_open_hv_device(struct ps3_system_bus_device *sbd)
210     +{
211     + int error = ps3_open_hv_device(sbd);
212     +
213     + if (error)
214     + return error;
215     +
216     + if (sbd->match_id == PS3_MATCH_ID_STOR_FLASH)
217     + ps3_flash_workaround.flash_open = 1;
218     +
219     + if (sbd->match_id == PS3_MATCH_ID_STOR_DISK)
220     + ps3_flash_workaround.disk_open = 1;
221     +
222     + return 0;
223     +}
224     +
225     +static int ps3stor_close_hv_device(struct ps3_system_bus_device *sbd)
226     +{
227     + int error;
228     +
229     + if (sbd->match_id == PS3_MATCH_ID_STOR_DISK
230     + && ps3_flash_workaround.disk_open
231     + && ps3_flash_workaround.flash_open) {
232     + ps3_flash_workaround.disk_sbd = sbd;
233     + return 0;
234     + }
235     +
236     + error = ps3_close_hv_device(sbd);
237     +
238     + if (error)
239     + return error;
240     +
241     + if (sbd->match_id == PS3_MATCH_ID_STOR_DISK)
242     + ps3_flash_workaround.disk_open = 0;
243     +
244     + if (sbd->match_id == PS3_MATCH_ID_STOR_FLASH) {
245     + ps3_flash_workaround.flash_open = 0;
246     +
247     + if (ps3_flash_workaround.disk_sbd) {
248     + ps3_close_hv_device(ps3_flash_workaround.disk_sbd);
249     + ps3_flash_workaround.disk_open = 0;
250     + ps3_flash_workaround.disk_sbd = NULL;
251     + }
252     + }
253     +
254     + return 0;
255     +}
256    
257     static int ps3stor_probe_access(struct ps3_storage_device *dev)
258     {
259     @@ -90,7 +149,7 @@ int ps3stor_setup(struct ps3_storage_device *dev, irq_handler_t handler)
260     int error, res, alignment;
261     enum ps3_dma_page_size page_size;
262    
263     - error = ps3_open_hv_device(&dev->sbd);
264     + error = ps3stor_open_hv_device(&dev->sbd);
265     if (error) {
266     dev_err(&dev->sbd.core,
267     "%s:%u: ps3_open_hv_device failed %d\n", __func__,
268     @@ -166,7 +225,7 @@ fail_free_irq:
269     fail_sb_event_receive_port_destroy:
270     ps3_sb_event_receive_port_destroy(&dev->sbd, dev->irq);
271     fail_close_device:
272     - ps3_close_hv_device(&dev->sbd);
273     + ps3stor_close_hv_device(&dev->sbd);
274     fail:
275     return error;
276     }
277     @@ -193,7 +252,7 @@ void ps3stor_teardown(struct ps3_storage_device *dev)
278     "%s:%u: destroy event receive port failed %d\n",
279     __func__, __LINE__, error);
280    
281     - error = ps3_close_hv_device(&dev->sbd);
282     + error = ps3stor_close_hv_device(&dev->sbd);
283     if (error)
284     dev_err(&dev->sbd.core,
285     "%s:%u: ps3_close_hv_device failed %d\n", __func__,
286     diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
287     index a6f8b8f..e012475 100644
288     --- a/fs/binfmt_elf.c
289     +++ b/fs/binfmt_elf.c
290     @@ -496,22 +496,22 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
291     }
292     }
293    
294     - /*
295     - * Now fill out the bss section. First pad the last page up
296     - * to the page boundary, and then perform a mmap to make sure
297     - * that there are zero-mapped pages up to and including the
298     - * last bss page.
299     - */
300     - if (padzero(elf_bss)) {
301     - error = -EFAULT;
302     - goto out_close;
303     - }
304     + if (last_bss > elf_bss) {
305     + /*
306     + * Now fill out the bss section. First pad the last page up
307     + * to the page boundary, and then perform a mmap to make sure
308     + * that there are zero-mapped pages up to and including the
309     + * last bss page.
310     + */
311     + if (padzero(elf_bss)) {
312     + error = -EFAULT;
313     + goto out_close;
314     + }
315    
316     - /* What we have mapped so far */
317     - elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1);
318     + /* What we have mapped so far */
319     + elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1);
320    
321     - /* Map the last of the bss segment */
322     - if (last_bss > elf_bss) {
323     + /* Map the last of the bss segment */
324     down_write(&current->mm->mmap_sem);
325     error = do_brk(elf_bss, last_bss - elf_bss);
326     up_write(&current->mm->mmap_sem);
327     diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c
328     index 4d617ea..988530d 100644
329     --- a/fs/nfsd/nfs3proc.c
330     +++ b/fs/nfsd/nfs3proc.c
331     @@ -201,6 +201,7 @@ nfsd3_proc_write(struct svc_rqst *rqstp, struct nfsd3_writeargs *argp,
332     struct nfsd3_writeres *resp)
333     {
334     __be32 nfserr;
335     + unsigned long cnt = argp->len;
336    
337     dprintk("nfsd: WRITE(3) %s %d bytes at %ld%s\n",
338     SVCFH_fmt(&argp->fh),
339     @@ -213,9 +214,9 @@ nfsd3_proc_write(struct svc_rqst *rqstp, struct nfsd3_writeargs *argp,
340     nfserr = nfsd_write(rqstp, &resp->fh, NULL,
341     argp->offset,
342     rqstp->rq_vec, argp->vlen,
343     - argp->len,
344     + &cnt,
345     &resp->committed);
346     - resp->count = argp->count;
347     + resp->count = cnt;
348     RETURN_STATUS(nfserr);
349     }
350    
351     diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
352     index e5b51ff..fddc656 100644
353     --- a/fs/nfsd/nfs4proc.c
354     +++ b/fs/nfsd/nfs4proc.c
355     @@ -685,6 +685,7 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
356     struct file *filp = NULL;
357     u32 *p;
358     __be32 status = nfs_ok;
359     + unsigned long cnt;
360    
361     /* no need to check permission - this will be done in nfsd_write() */
362    
363     @@ -703,7 +704,7 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
364     return status;
365     }
366    
367     - write->wr_bytes_written = write->wr_buflen;
368     + cnt = write->wr_buflen;
369     write->wr_how_written = write->wr_stable_how;
370     p = (u32 *)write->wr_verifier.data;
371     *p++ = nfssvc_boot.tv_sec;
372     @@ -711,10 +712,12 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
373    
374     status = nfsd_write(rqstp, &cstate->current_fh, filp,
375     write->wr_offset, rqstp->rq_vec, write->wr_vlen,
376     - write->wr_buflen, &write->wr_how_written);
377     + &cnt, &write->wr_how_written);
378     if (filp)
379     fput(filp);
380    
381     + write->wr_bytes_written = cnt;
382     +
383     if (status == nfserr_symlink)
384     status = nfserr_inval;
385     return status;
386     diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c
387     index 0766f95..20c63b2 100644
388     --- a/fs/nfsd/nfsproc.c
389     +++ b/fs/nfsd/nfsproc.c
390     @@ -179,6 +179,7 @@ nfsd_proc_write(struct svc_rqst *rqstp, struct nfsd_writeargs *argp,
391     {
392     __be32 nfserr;
393     int stable = 1;
394     + unsigned long cnt = argp->len;
395    
396     dprintk("nfsd: WRITE %s %d bytes at %d\n",
397     SVCFH_fmt(&argp->fh),
398     @@ -187,7 +188,7 @@ nfsd_proc_write(struct svc_rqst *rqstp, struct nfsd_writeargs *argp,
399     nfserr = nfsd_write(rqstp, fh_copy(&resp->fh, &argp->fh), NULL,
400     argp->offset,
401     rqstp->rq_vec, argp->vlen,
402     - argp->len,
403     + &cnt,
404     &stable);
405     return nfsd_return_attrs(nfserr, resp);
406     }
407     diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
408     index 18060be..ac31e0c 100644
409     --- a/fs/nfsd/vfs.c
410     +++ b/fs/nfsd/vfs.c
411     @@ -957,7 +957,7 @@ static void kill_suid(struct dentry *dentry)
412     static __be32
413     nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
414     loff_t offset, struct kvec *vec, int vlen,
415     - unsigned long cnt, int *stablep)
416     + unsigned long *cnt, int *stablep)
417     {
418     struct svc_export *exp;
419     struct dentry *dentry;
420     @@ -971,7 +971,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
421     err = nfserr_perm;
422    
423     if ((fhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
424     - (!lock_may_write(file->f_path.dentry->d_inode, offset, cnt)))
425     + (!lock_may_write(file->f_path.dentry->d_inode, offset, *cnt)))
426     goto out;
427     #endif
428    
429     @@ -1003,7 +1003,8 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
430     host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &offset);
431     set_fs(oldfs);
432     if (host_err >= 0) {
433     - nfsdstats.io_write += cnt;
434     + *cnt = host_err;
435     + nfsdstats.io_write += host_err;
436     fsnotify_modify(file->f_path.dentry);
437     }
438    
439     @@ -1050,7 +1051,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
440     dprintk("nfsd: write complete host_err=%d\n", host_err);
441     if (host_err >= 0)
442     err = 0;
443     - else
444     + else
445     err = nfserrno(host_err);
446     out:
447     return err;
448     @@ -1092,7 +1093,7 @@ out:
449     */
450     __be32
451     nfsd_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
452     - loff_t offset, struct kvec *vec, int vlen, unsigned long cnt,
453     + loff_t offset, struct kvec *vec, int vlen, unsigned long *cnt,
454     int *stablep)
455     {
456     __be32 err = 0;
457     diff --git a/fs/udf/lowlevel.c b/fs/udf/lowlevel.c
458     index 703843f..1b88fd5 100644
459     --- a/fs/udf/lowlevel.c
460     +++ b/fs/udf/lowlevel.c
461     @@ -56,7 +56,12 @@ unsigned long udf_get_last_block(struct super_block *sb)
462     struct block_device *bdev = sb->s_bdev;
463     unsigned long lblock = 0;
464    
465     - if (ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long) &lblock))
466     + /*
467     + * ioctl failed or returned obviously bogus value?
468     + * Try using the device size...
469     + */
470     + if (ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long) &lblock) ||
471     + lblock == 0)
472     lblock = bdev->bd_inode->i_size >> sb->s_blocksize_bits;
473    
474     if (lblock)
475     diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h
476     index 108f47e..9af9bca 100644
477     --- a/include/linux/nfsd/nfsd.h
478     +++ b/include/linux/nfsd/nfsd.h
479     @@ -105,7 +105,7 @@ void nfsd_close(struct file *);
480     __be32 nfsd_read(struct svc_rqst *, struct svc_fh *, struct file *,
481     loff_t, struct kvec *, int, unsigned long *);
482     __be32 nfsd_write(struct svc_rqst *, struct svc_fh *,struct file *,
483     - loff_t, struct kvec *,int, unsigned long, int *);
484     + loff_t, struct kvec *,int, unsigned long *, int *);
485     __be32 nfsd_readlink(struct svc_rqst *, struct svc_fh *,
486     char *, int *);
487     __be32 nfsd_symlink(struct svc_rqst *, struct svc_fh *,
488     diff --git a/sound/pci/cs46xx/cs46xx_lib.h b/sound/pci/cs46xx/cs46xx_lib.h
489     index 018a7de..ba12825 100644
490     --- a/sound/pci/cs46xx/cs46xx_lib.h
491     +++ b/sound/pci/cs46xx/cs46xx_lib.h
492     @@ -35,7 +35,7 @@
493    
494    
495     #ifdef CONFIG_SND_CS46XX_NEW_DSP
496     -#define CS46XX_MIN_PERIOD_SIZE 1
497     +#define CS46XX_MIN_PERIOD_SIZE 64
498     #define CS46XX_MAX_PERIOD_SIZE 1024*1024
499     #else
500     #define CS46XX_MIN_PERIOD_SIZE 2048
501     diff --git a/sound/pci/oxygen/oxygen_io.c b/sound/pci/oxygen/oxygen_io.c
502     index 83f135f..6ebd2f3 100644
503     --- a/sound/pci/oxygen/oxygen_io.c
504     +++ b/sound/pci/oxygen/oxygen_io.c
505     @@ -214,17 +214,8 @@ EXPORT_SYMBOL(oxygen_write_spi);
506    
507     void oxygen_write_i2c(struct oxygen *chip, u8 device, u8 map, u8 data)
508     {
509     - unsigned long timeout;
510     -
511     /* should not need more than about 300 us */
512     - timeout = jiffies + msecs_to_jiffies(1);
513     - do {
514     - if (!(oxygen_read16(chip, OXYGEN_2WIRE_BUS_STATUS)
515     - & OXYGEN_2WIRE_BUSY))
516     - break;
517     - udelay(1);
518     - cond_resched();
519     - } while (time_after_eq(timeout, jiffies));
520     + msleep(1);
521    
522     oxygen_write8(chip, OXYGEN_2WIRE_MAP, map);
523     oxygen_write8(chip, OXYGEN_2WIRE_DATA, data);