Annotation of /trunk/kernel26-alx/patches-2.6.27-r3/0134-2.6.27.35-all-fixes.patch
Parent Directory | Revision Log
Revision 1176 -
(hide annotations)
(download)
Thu Oct 14 15:11:06 2010 UTC (13 years, 11 months ago) by niro
File size: 16308 byte(s)
Thu Oct 14 15:11:06 2010 UTC (13 years, 11 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(¤t->mm->mmap_sem); | ||
325 | error = do_brk(elf_bss, last_bss - elf_bss); | ||
326 | up_write(¤t->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); |