Contents of /trunk/kernel26-alx/patches-2.6.17-r5/0105-2.6.17.12-all-fixes.patch
Parent Directory | Revision Log
Revision 199 -
(show annotations)
(download)
Fri May 18 11:04:36 2007 UTC (17 years, 5 months ago) by niro
File size: 51157 byte(s)
Fri May 18 11:04:36 2007 UTC (17 years, 5 months ago) by niro
File size: 51157 byte(s)
-import
1 | diff --git a/arch/ia64/sn/kernel/xpc_channel.c b/arch/ia64/sn/kernel/xpc_channel.c |
2 | index 8255a9b..7e8a4d1 100644 |
3 | --- a/arch/ia64/sn/kernel/xpc_channel.c |
4 | +++ b/arch/ia64/sn/kernel/xpc_channel.c |
5 | @@ -279,8 +279,8 @@ xpc_pull_remote_cachelines(struct xpc_pa |
6 | return part->reason; |
7 | } |
8 | |
9 | - bte_ret = xp_bte_copy((u64) src, (u64) ia64_tpa((u64) dst), |
10 | - (u64) cnt, (BTE_NORMAL | BTE_WACQUIRE), NULL); |
11 | + bte_ret = xp_bte_copy((u64) src, (u64) dst, (u64) cnt, |
12 | + (BTE_NORMAL | BTE_WACQUIRE), NULL); |
13 | if (bte_ret == BTE_SUCCESS) { |
14 | return xpcSuccess; |
15 | } |
16 | diff --git a/arch/ia64/sn/kernel/xpc_main.c b/arch/ia64/sn/kernel/xpc_main.c |
17 | index 99b123a..440039f 100644 |
18 | --- a/arch/ia64/sn/kernel/xpc_main.c |
19 | +++ b/arch/ia64/sn/kernel/xpc_main.c |
20 | @@ -1052,6 +1052,8 @@ xpc_do_exit(enum xpc_retval reason) |
21 | if (xpc_sysctl) { |
22 | unregister_sysctl_table(xpc_sysctl); |
23 | } |
24 | + |
25 | + kfree(xpc_remote_copy_buffer_base); |
26 | } |
27 | |
28 | |
29 | @@ -1212,24 +1214,20 @@ xpc_init(void) |
30 | partid_t partid; |
31 | struct xpc_partition *part; |
32 | pid_t pid; |
33 | + size_t buf_size; |
34 | |
35 | |
36 | if (!ia64_platform_is("sn2")) { |
37 | return -ENODEV; |
38 | } |
39 | |
40 | - /* |
41 | - * xpc_remote_copy_buffer is used as a temporary buffer for bte_copy'ng |
42 | - * various portions of a partition's reserved page. Its size is based |
43 | - * on the size of the reserved page header and part_nasids mask. So we |
44 | - * need to ensure that the other items will fit as well. |
45 | - */ |
46 | - if (XPC_RP_VARS_SIZE > XPC_RP_HEADER_SIZE + XP_NASID_MASK_BYTES) { |
47 | - dev_err(xpc_part, "xpc_remote_copy_buffer is not big enough\n"); |
48 | - return -EPERM; |
49 | - } |
50 | - DBUG_ON((u64) xpc_remote_copy_buffer != |
51 | - L1_CACHE_ALIGN((u64) xpc_remote_copy_buffer)); |
52 | + |
53 | + buf_size = max(XPC_RP_VARS_SIZE, |
54 | + XPC_RP_HEADER_SIZE + XP_NASID_MASK_BYTES); |
55 | + xpc_remote_copy_buffer = xpc_kmalloc_cacheline_aligned(buf_size, |
56 | + GFP_KERNEL, &xpc_remote_copy_buffer_base); |
57 | + if (xpc_remote_copy_buffer == NULL) |
58 | + return -ENOMEM; |
59 | |
60 | snprintf(xpc_part->bus_id, BUS_ID_SIZE, "part"); |
61 | snprintf(xpc_chan->bus_id, BUS_ID_SIZE, "chan"); |
62 | @@ -1293,6 +1291,8 @@ xpc_init(void) |
63 | if (xpc_sysctl) { |
64 | unregister_sysctl_table(xpc_sysctl); |
65 | } |
66 | + |
67 | + kfree(xpc_remote_copy_buffer_base); |
68 | return -EBUSY; |
69 | } |
70 | |
71 | @@ -1311,6 +1311,8 @@ xpc_init(void) |
72 | if (xpc_sysctl) { |
73 | unregister_sysctl_table(xpc_sysctl); |
74 | } |
75 | + |
76 | + kfree(xpc_remote_copy_buffer_base); |
77 | return -EBUSY; |
78 | } |
79 | |
80 | @@ -1362,6 +1364,8 @@ xpc_init(void) |
81 | if (xpc_sysctl) { |
82 | unregister_sysctl_table(xpc_sysctl); |
83 | } |
84 | + |
85 | + kfree(xpc_remote_copy_buffer_base); |
86 | return -EBUSY; |
87 | } |
88 | |
89 | diff --git a/arch/ia64/sn/kernel/xpc_partition.c b/arch/ia64/sn/kernel/xpc_partition.c |
90 | index 2a89cfc..57c723f 100644 |
91 | --- a/arch/ia64/sn/kernel/xpc_partition.c |
92 | +++ b/arch/ia64/sn/kernel/xpc_partition.c |
93 | @@ -71,19 +71,15 @@ struct xpc_partition xpc_partitions[XP_M |
94 | * Generic buffer used to store a local copy of portions of a remote |
95 | * partition's reserved page (either its header and part_nasids mask, |
96 | * or its vars). |
97 | - * |
98 | - * xpc_discovery runs only once and is a seperate thread that is |
99 | - * very likely going to be processing in parallel with receiving |
100 | - * interrupts. |
101 | */ |
102 | -char ____cacheline_aligned xpc_remote_copy_buffer[XPC_RP_HEADER_SIZE + |
103 | - XP_NASID_MASK_BYTES]; |
104 | +char *xpc_remote_copy_buffer; |
105 | +void *xpc_remote_copy_buffer_base; |
106 | |
107 | |
108 | /* |
109 | * Guarantee that the kmalloc'd memory is cacheline aligned. |
110 | */ |
111 | -static void * |
112 | +void * |
113 | xpc_kmalloc_cacheline_aligned(size_t size, gfp_t flags, void **base) |
114 | { |
115 | /* see if kmalloc will give us cachline aligned memory by default */ |
116 | @@ -148,7 +144,7 @@ xpc_get_rsvd_page_pa(int nasid) |
117 | } |
118 | } |
119 | |
120 | - bte_res = xp_bte_copy(rp_pa, ia64_tpa(buf), buf_len, |
121 | + bte_res = xp_bte_copy(rp_pa, buf, buf_len, |
122 | (BTE_NOTIFY | BTE_WACQUIRE), NULL); |
123 | if (bte_res != BTE_SUCCESS) { |
124 | dev_dbg(xpc_part, "xp_bte_copy failed %i\n", bte_res); |
125 | @@ -447,7 +443,7 @@ xpc_check_remote_hb(void) |
126 | |
127 | /* pull the remote_hb cache line */ |
128 | bres = xp_bte_copy(part->remote_vars_pa, |
129 | - ia64_tpa((u64) remote_vars), |
130 | + (u64) remote_vars, |
131 | XPC_RP_VARS_SIZE, |
132 | (BTE_NOTIFY | BTE_WACQUIRE), NULL); |
133 | if (bres != BTE_SUCCESS) { |
134 | @@ -498,8 +494,7 @@ xpc_get_remote_rp(int nasid, u64 *discov |
135 | |
136 | |
137 | /* pull over the reserved page header and part_nasids mask */ |
138 | - |
139 | - bres = xp_bte_copy(*remote_rp_pa, ia64_tpa((u64) remote_rp), |
140 | + bres = xp_bte_copy(*remote_rp_pa, (u64) remote_rp, |
141 | XPC_RP_HEADER_SIZE + xp_nasid_mask_bytes, |
142 | (BTE_NOTIFY | BTE_WACQUIRE), NULL); |
143 | if (bres != BTE_SUCCESS) { |
144 | @@ -554,11 +549,8 @@ xpc_get_remote_vars(u64 remote_vars_pa, |
145 | return xpcVarsNotSet; |
146 | } |
147 | |
148 | - |
149 | /* pull over the cross partition variables */ |
150 | - |
151 | - bres = xp_bte_copy(remote_vars_pa, ia64_tpa((u64) remote_vars), |
152 | - XPC_RP_VARS_SIZE, |
153 | + bres = xp_bte_copy(remote_vars_pa, (u64) remote_vars, XPC_RP_VARS_SIZE, |
154 | (BTE_NOTIFY | BTE_WACQUIRE), NULL); |
155 | if (bres != BTE_SUCCESS) { |
156 | return xpc_map_bte_errors(bres); |
157 | @@ -1239,7 +1231,7 @@ xpc_initiate_partid_to_nasids(partid_t p |
158 | |
159 | part_nasid_pa = (u64) XPC_RP_PART_NASIDS(part->remote_rp_pa); |
160 | |
161 | - bte_res = xp_bte_copy(part_nasid_pa, ia64_tpa((u64) nasid_mask), |
162 | + bte_res = xp_bte_copy(part_nasid_pa, (u64) nasid_mask, |
163 | xp_nasid_mask_bytes, (BTE_NOTIFY | BTE_WACQUIRE), NULL); |
164 | |
165 | return xpc_map_bte_errors(bte_res); |
166 | diff --git a/arch/sparc64/mm/generic.c b/arch/sparc64/mm/generic.c |
167 | index 8cb0620..af9d81d 100644 |
168 | --- a/arch/sparc64/mm/generic.c |
169 | +++ b/arch/sparc64/mm/generic.c |
170 | @@ -69,6 +69,8 @@ static inline void io_remap_pte_range(st |
171 | } else |
172 | offset += PAGE_SIZE; |
173 | |
174 | + if (pte_write(entry)) |
175 | + entry = pte_mkdirty(entry); |
176 | do { |
177 | BUG_ON(!pte_none(*pte)); |
178 | set_pte_at(mm, address, pte, entry); |
179 | diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c |
180 | index 3e677c4..9914a78 100644 |
181 | --- a/drivers/ide/pci/via82cxxx.c |
182 | +++ b/drivers/ide/pci/via82cxxx.c |
183 | @@ -6,7 +6,7 @@ |
184 | * |
185 | * vt82c576, vt82c586, vt82c586a, vt82c586b, vt82c596a, vt82c596b, |
186 | * vt82c686, vt82c686a, vt82c686b, vt8231, vt8233, vt8233c, vt8233a, |
187 | - * vt8235, vt8237 |
188 | + * vt8235, vt8237, vt8237a |
189 | * |
190 | * Copyright (c) 2000-2002 Vojtech Pavlik |
191 | * |
192 | @@ -82,6 +82,7 @@ static struct via_isa_bridge { |
193 | { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
194 | { "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
195 | { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
196 | + { "vt8237a", PCI_DEVICE_ID_VIA_8237A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
197 | { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
198 | { "vt8233a", PCI_DEVICE_ID_VIA_8233A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
199 | { "vt8233c", PCI_DEVICE_ID_VIA_8233C_0, 0x00, 0x2f, VIA_UDMA_100 }, |
200 | diff --git a/drivers/md/dm-exception-store.c b/drivers/md/dm-exception-store.c |
201 | index cc07bbe..34a7593 100644 |
202 | --- a/drivers/md/dm-exception-store.c |
203 | +++ b/drivers/md/dm-exception-store.c |
204 | @@ -91,7 +91,6 @@ struct pstore { |
205 | struct dm_snapshot *snap; /* up pointer to my snapshot */ |
206 | int version; |
207 | int valid; |
208 | - uint32_t chunk_size; |
209 | uint32_t exceptions_per_area; |
210 | |
211 | /* |
212 | @@ -133,7 +132,7 @@ static int alloc_area(struct pstore *ps) |
213 | int r = -ENOMEM; |
214 | size_t len; |
215 | |
216 | - len = ps->chunk_size << SECTOR_SHIFT; |
217 | + len = ps->snap->chunk_size << SECTOR_SHIFT; |
218 | |
219 | /* |
220 | * Allocate the chunk_size block of memory that will hold |
221 | @@ -160,8 +159,8 @@ static int chunk_io(struct pstore *ps, u |
222 | unsigned long bits; |
223 | |
224 | where.bdev = ps->snap->cow->bdev; |
225 | - where.sector = ps->chunk_size * chunk; |
226 | - where.count = ps->chunk_size; |
227 | + where.sector = ps->snap->chunk_size * chunk; |
228 | + where.count = ps->snap->chunk_size; |
229 | |
230 | return dm_io_sync_vm(1, &where, rw, ps->area, &bits); |
231 | } |
232 | @@ -188,7 +187,7 @@ static int area_io(struct pstore *ps, ui |
233 | |
234 | static int zero_area(struct pstore *ps, uint32_t area) |
235 | { |
236 | - memset(ps->area, 0, ps->chunk_size << SECTOR_SHIFT); |
237 | + memset(ps->area, 0, ps->snap->chunk_size << SECTOR_SHIFT); |
238 | return area_io(ps, area, WRITE); |
239 | } |
240 | |
241 | @@ -196,6 +195,7 @@ static int read_header(struct pstore *ps |
242 | { |
243 | int r; |
244 | struct disk_header *dh; |
245 | + chunk_t chunk_size; |
246 | |
247 | r = chunk_io(ps, 0, READ); |
248 | if (r) |
249 | @@ -210,8 +210,29 @@ static int read_header(struct pstore *ps |
250 | *new_snapshot = 0; |
251 | ps->valid = le32_to_cpu(dh->valid); |
252 | ps->version = le32_to_cpu(dh->version); |
253 | - ps->chunk_size = le32_to_cpu(dh->chunk_size); |
254 | - |
255 | + chunk_size = le32_to_cpu(dh->chunk_size); |
256 | + if (ps->snap->chunk_size != chunk_size) { |
257 | + DMWARN("chunk size %llu in device metadata overrides " |
258 | + "table chunk size of %llu.", |
259 | + (unsigned long long)chunk_size, |
260 | + (unsigned long long)ps->snap->chunk_size); |
261 | + |
262 | + /* We had a bogus chunk_size. Fix stuff up. */ |
263 | + dm_io_put(sectors_to_pages(ps->snap->chunk_size)); |
264 | + free_area(ps); |
265 | + |
266 | + ps->snap->chunk_size = chunk_size; |
267 | + ps->snap->chunk_mask = chunk_size - 1; |
268 | + ps->snap->chunk_shift = ffs(chunk_size) - 1; |
269 | + |
270 | + r = alloc_area(ps); |
271 | + if (r) |
272 | + return r; |
273 | + |
274 | + r = dm_io_get(sectors_to_pages(chunk_size)); |
275 | + if (r) |
276 | + return r; |
277 | + } |
278 | } else { |
279 | DMWARN("Invalid/corrupt snapshot"); |
280 | r = -ENXIO; |
281 | @@ -224,13 +245,13 @@ static int write_header(struct pstore *p |
282 | { |
283 | struct disk_header *dh; |
284 | |
285 | - memset(ps->area, 0, ps->chunk_size << SECTOR_SHIFT); |
286 | + memset(ps->area, 0, ps->snap->chunk_size << SECTOR_SHIFT); |
287 | |
288 | dh = (struct disk_header *) ps->area; |
289 | dh->magic = cpu_to_le32(SNAP_MAGIC); |
290 | dh->valid = cpu_to_le32(ps->valid); |
291 | dh->version = cpu_to_le32(ps->version); |
292 | - dh->chunk_size = cpu_to_le32(ps->chunk_size); |
293 | + dh->chunk_size = cpu_to_le32(ps->snap->chunk_size); |
294 | |
295 | return chunk_io(ps, 0, WRITE); |
296 | } |
297 | @@ -365,7 +386,7 @@ static void persistent_destroy(struct ex |
298 | { |
299 | struct pstore *ps = get_info(store); |
300 | |
301 | - dm_io_put(sectors_to_pages(ps->chunk_size)); |
302 | + dm_io_put(sectors_to_pages(ps->snap->chunk_size)); |
303 | vfree(ps->callbacks); |
304 | free_area(ps); |
305 | kfree(ps); |
306 | @@ -384,6 +405,16 @@ static int persistent_read_metadata(stru |
307 | return r; |
308 | |
309 | /* |
310 | + * Now we know correct chunk_size, complete the initialisation. |
311 | + */ |
312 | + ps->exceptions_per_area = (ps->snap->chunk_size << SECTOR_SHIFT) / |
313 | + sizeof(struct disk_exception); |
314 | + ps->callbacks = dm_vcalloc(ps->exceptions_per_area, |
315 | + sizeof(*ps->callbacks)); |
316 | + if (!ps->callbacks) |
317 | + return -ENOMEM; |
318 | + |
319 | + /* |
320 | * Do we need to setup a new snapshot ? |
321 | */ |
322 | if (new_snapshot) { |
323 | @@ -533,9 +564,6 @@ int dm_create_persistent(struct exceptio |
324 | ps->snap = store->snap; |
325 | ps->valid = 1; |
326 | ps->version = SNAPSHOT_DISK_VERSION; |
327 | - ps->chunk_size = chunk_size; |
328 | - ps->exceptions_per_area = (chunk_size << SECTOR_SHIFT) / |
329 | - sizeof(struct disk_exception); |
330 | ps->next_free = 2; /* skipping the header and first area */ |
331 | ps->current_committed = 0; |
332 | |
333 | @@ -543,18 +571,9 @@ int dm_create_persistent(struct exceptio |
334 | if (r) |
335 | goto bad; |
336 | |
337 | - /* |
338 | - * Allocate space for all the callbacks. |
339 | - */ |
340 | ps->callback_count = 0; |
341 | atomic_set(&ps->pending_count, 0); |
342 | - ps->callbacks = dm_vcalloc(ps->exceptions_per_area, |
343 | - sizeof(*ps->callbacks)); |
344 | - |
345 | - if (!ps->callbacks) { |
346 | - r = -ENOMEM; |
347 | - goto bad; |
348 | - } |
349 | + ps->callbacks = NULL; |
350 | |
351 | store->destroy = persistent_destroy; |
352 | store->read_metadata = persistent_read_metadata; |
353 | diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c |
354 | index 8edd643..f7e7436 100644 |
355 | --- a/drivers/md/dm-ioctl.c |
356 | +++ b/drivers/md/dm-ioctl.c |
357 | @@ -102,8 +102,10 @@ static struct hash_cell *__get_name_cell |
358 | unsigned int h = hash_str(str); |
359 | |
360 | list_for_each_entry (hc, _name_buckets + h, name_list) |
361 | - if (!strcmp(hc->name, str)) |
362 | + if (!strcmp(hc->name, str)) { |
363 | + dm_get(hc->md); |
364 | return hc; |
365 | + } |
366 | |
367 | return NULL; |
368 | } |
369 | @@ -114,8 +116,10 @@ static struct hash_cell *__get_uuid_cell |
370 | unsigned int h = hash_str(str); |
371 | |
372 | list_for_each_entry (hc, _uuid_buckets + h, uuid_list) |
373 | - if (!strcmp(hc->uuid, str)) |
374 | + if (!strcmp(hc->uuid, str)) { |
375 | + dm_get(hc->md); |
376 | return hc; |
377 | + } |
378 | |
379 | return NULL; |
380 | } |
381 | @@ -191,7 +195,7 @@ static int unregister_with_devfs(struct |
382 | */ |
383 | static int dm_hash_insert(const char *name, const char *uuid, struct mapped_device *md) |
384 | { |
385 | - struct hash_cell *cell; |
386 | + struct hash_cell *cell, *hc; |
387 | |
388 | /* |
389 | * Allocate the new cells. |
390 | @@ -204,14 +208,19 @@ static int dm_hash_insert(const char *na |
391 | * Insert the cell into both hash tables. |
392 | */ |
393 | down_write(&_hash_lock); |
394 | - if (__get_name_cell(name)) |
395 | + hc = __get_name_cell(name); |
396 | + if (hc) { |
397 | + dm_put(hc->md); |
398 | goto bad; |
399 | + } |
400 | |
401 | list_add(&cell->name_list, _name_buckets + hash_str(name)); |
402 | |
403 | if (uuid) { |
404 | - if (__get_uuid_cell(uuid)) { |
405 | + hc = __get_uuid_cell(uuid); |
406 | + if (hc) { |
407 | list_del(&cell->name_list); |
408 | + dm_put(hc->md); |
409 | goto bad; |
410 | } |
411 | list_add(&cell->uuid_list, _uuid_buckets + hash_str(uuid)); |
412 | @@ -289,6 +298,7 @@ static int dm_hash_rename(const char *ol |
413 | if (hc) { |
414 | DMWARN("asked to rename to an already existing name %s -> %s", |
415 | old, new); |
416 | + dm_put(hc->md); |
417 | up_write(&_hash_lock); |
418 | kfree(new_name); |
419 | return -EBUSY; |
420 | @@ -328,6 +338,7 @@ static int dm_hash_rename(const char *ol |
421 | dm_table_put(table); |
422 | } |
423 | |
424 | + dm_put(hc->md); |
425 | up_write(&_hash_lock); |
426 | kfree(old_name); |
427 | return 0; |
428 | @@ -611,10 +622,8 @@ static struct hash_cell *__find_device_h |
429 | return __get_name_cell(param->name); |
430 | |
431 | md = dm_get_md(huge_decode_dev(param->dev)); |
432 | - if (md) { |
433 | + if (md) |
434 | mdptr = dm_get_mdptr(md); |
435 | - dm_put(md); |
436 | - } |
437 | |
438 | return mdptr; |
439 | } |
440 | @@ -628,7 +637,6 @@ static struct mapped_device *find_device |
441 | hc = __find_device_hash_cell(param); |
442 | if (hc) { |
443 | md = hc->md; |
444 | - dm_get(md); |
445 | |
446 | /* |
447 | * Sneakily write in both the name and the uuid |
448 | @@ -653,6 +661,7 @@ static struct mapped_device *find_device |
449 | static int dev_remove(struct dm_ioctl *param, size_t param_size) |
450 | { |
451 | struct hash_cell *hc; |
452 | + struct mapped_device *md; |
453 | |
454 | down_write(&_hash_lock); |
455 | hc = __find_device_hash_cell(param); |
456 | @@ -663,8 +672,11 @@ static int dev_remove(struct dm_ioctl *p |
457 | return -ENXIO; |
458 | } |
459 | |
460 | + md = hc->md; |
461 | + |
462 | __hash_remove(hc); |
463 | up_write(&_hash_lock); |
464 | + dm_put(md); |
465 | param->data_size = 0; |
466 | return 0; |
467 | } |
468 | @@ -790,7 +802,6 @@ static int do_resume(struct dm_ioctl *pa |
469 | } |
470 | |
471 | md = hc->md; |
472 | - dm_get(md); |
473 | |
474 | new_map = hc->new_map; |
475 | hc->new_map = NULL; |
476 | @@ -1078,6 +1089,7 @@ static int table_clear(struct dm_ioctl * |
477 | { |
478 | int r; |
479 | struct hash_cell *hc; |
480 | + struct mapped_device *md; |
481 | |
482 | down_write(&_hash_lock); |
483 | |
484 | @@ -1096,7 +1108,9 @@ static int table_clear(struct dm_ioctl * |
485 | param->flags &= ~DM_INACTIVE_PRESENT_FLAG; |
486 | |
487 | r = __dev_status(hc->md, param); |
488 | + md = hc->md; |
489 | up_write(&_hash_lock); |
490 | + dm_put(md); |
491 | return r; |
492 | } |
493 | |
494 | diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c |
495 | index d12cf3e..2cab46e 100644 |
496 | --- a/drivers/md/dm-raid1.c |
497 | +++ b/drivers/md/dm-raid1.c |
498 | @@ -106,12 +106,42 @@ struct region { |
499 | struct bio_list delayed_bios; |
500 | }; |
501 | |
502 | + |
503 | +/*----------------------------------------------------------------- |
504 | + * Mirror set structures. |
505 | + *---------------------------------------------------------------*/ |
506 | +struct mirror { |
507 | + atomic_t error_count; |
508 | + struct dm_dev *dev; |
509 | + sector_t offset; |
510 | +}; |
511 | + |
512 | +struct mirror_set { |
513 | + struct dm_target *ti; |
514 | + struct list_head list; |
515 | + struct region_hash rh; |
516 | + struct kcopyd_client *kcopyd_client; |
517 | + |
518 | + spinlock_t lock; /* protects the next two lists */ |
519 | + struct bio_list reads; |
520 | + struct bio_list writes; |
521 | + |
522 | + /* recovery */ |
523 | + region_t nr_regions; |
524 | + int in_sync; |
525 | + |
526 | + struct mirror *default_mirror; /* Default mirror */ |
527 | + |
528 | + unsigned int nr_mirrors; |
529 | + struct mirror mirror[0]; |
530 | +}; |
531 | + |
532 | /* |
533 | * Conversion fns |
534 | */ |
535 | static inline region_t bio_to_region(struct region_hash *rh, struct bio *bio) |
536 | { |
537 | - return bio->bi_sector >> rh->region_shift; |
538 | + return (bio->bi_sector - rh->ms->ti->begin) >> rh->region_shift; |
539 | } |
540 | |
541 | static inline sector_t region_to_sector(struct region_hash *rh, region_t region) |
542 | @@ -223,7 +253,9 @@ static struct region *__rh_alloc(struct |
543 | struct region *reg, *nreg; |
544 | |
545 | read_unlock(&rh->hash_lock); |
546 | - nreg = mempool_alloc(rh->region_pool, GFP_NOIO); |
547 | + nreg = mempool_alloc(rh->region_pool, GFP_ATOMIC); |
548 | + if (unlikely(!nreg)) |
549 | + nreg = kmalloc(sizeof(struct region), GFP_NOIO); |
550 | nreg->state = rh->log->type->in_sync(rh->log, region, 1) ? |
551 | RH_CLEAN : RH_NOSYNC; |
552 | nreg->rh = rh; |
553 | @@ -541,35 +573,6 @@ static void rh_start_recovery(struct reg |
554 | wake(); |
555 | } |
556 | |
557 | -/*----------------------------------------------------------------- |
558 | - * Mirror set structures. |
559 | - *---------------------------------------------------------------*/ |
560 | -struct mirror { |
561 | - atomic_t error_count; |
562 | - struct dm_dev *dev; |
563 | - sector_t offset; |
564 | -}; |
565 | - |
566 | -struct mirror_set { |
567 | - struct dm_target *ti; |
568 | - struct list_head list; |
569 | - struct region_hash rh; |
570 | - struct kcopyd_client *kcopyd_client; |
571 | - |
572 | - spinlock_t lock; /* protects the next two lists */ |
573 | - struct bio_list reads; |
574 | - struct bio_list writes; |
575 | - |
576 | - /* recovery */ |
577 | - region_t nr_regions; |
578 | - int in_sync; |
579 | - |
580 | - struct mirror *default_mirror; /* Default mirror */ |
581 | - |
582 | - unsigned int nr_mirrors; |
583 | - struct mirror mirror[0]; |
584 | -}; |
585 | - |
586 | /* |
587 | * Every mirror should look like this one. |
588 | */ |
589 | @@ -1115,7 +1118,7 @@ static int mirror_map(struct dm_target * |
590 | struct mirror *m; |
591 | struct mirror_set *ms = ti->private; |
592 | |
593 | - map_context->ll = bio->bi_sector >> ms->rh.region_shift; |
594 | + map_context->ll = bio_to_region(&ms->rh, bio); |
595 | |
596 | if (rw == WRITE) { |
597 | queue_bio(ms, bio, rw); |
598 | diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c |
599 | index 08312b4..b84bc1a 100644 |
600 | --- a/drivers/md/dm-snap.c |
601 | +++ b/drivers/md/dm-snap.c |
602 | @@ -530,7 +530,7 @@ static int snapshot_ctr(struct dm_target |
603 | } |
604 | |
605 | ti->private = s; |
606 | - ti->split_io = chunk_size; |
607 | + ti->split_io = s->chunk_size; |
608 | |
609 | return 0; |
610 | |
611 | @@ -1204,7 +1204,7 @@ static int origin_status(struct dm_targe |
612 | |
613 | static struct target_type origin_target = { |
614 | .name = "snapshot-origin", |
615 | - .version = {1, 1, 0}, |
616 | + .version = {1, 4, 0}, |
617 | .module = THIS_MODULE, |
618 | .ctr = origin_ctr, |
619 | .dtr = origin_dtr, |
620 | @@ -1215,7 +1215,7 @@ static struct target_type origin_target |
621 | |
622 | static struct target_type snapshot_target = { |
623 | .name = "snapshot", |
624 | - .version = {1, 1, 0}, |
625 | + .version = {1, 4, 0}, |
626 | .module = THIS_MODULE, |
627 | .ctr = snapshot_ctr, |
628 | .dtr = snapshot_dtr, |
629 | diff --git a/drivers/md/dm.c b/drivers/md/dm.c |
630 | index 4d710b7..dfd0378 100644 |
631 | --- a/drivers/md/dm.c |
632 | +++ b/drivers/md/dm.c |
633 | @@ -26,6 +26,7 @@ static const char *_name = DM_NAME; |
634 | static unsigned int major = 0; |
635 | static unsigned int _major = 0; |
636 | |
637 | +static DEFINE_SPINLOCK(_minor_lock); |
638 | /* |
639 | * One of these is allocated per bio. |
640 | */ |
641 | @@ -54,12 +55,15 @@ union map_info *dm_get_mapinfo(struct bi |
642 | return NULL; |
643 | } |
644 | |
645 | +#define MINOR_ALLOCED ((void *)-1) |
646 | + |
647 | /* |
648 | * Bits for the md->flags field. |
649 | */ |
650 | #define DMF_BLOCK_IO 0 |
651 | #define DMF_SUSPENDED 1 |
652 | #define DMF_FROZEN 2 |
653 | +#define DMF_FREEING 3 |
654 | |
655 | struct mapped_device { |
656 | struct rw_semaphore io_lock; |
657 | @@ -218,9 +222,23 @@ static int dm_blk_open(struct inode *ino |
658 | { |
659 | struct mapped_device *md; |
660 | |
661 | + spin_lock(&_minor_lock); |
662 | + |
663 | md = inode->i_bdev->bd_disk->private_data; |
664 | + if (!md) |
665 | + goto out; |
666 | + |
667 | + if (test_bit(DMF_FREEING, &md->flags)) { |
668 | + md = NULL; |
669 | + goto out; |
670 | + } |
671 | + |
672 | dm_get(md); |
673 | - return 0; |
674 | + |
675 | +out: |
676 | + spin_unlock(&_minor_lock); |
677 | + |
678 | + return md ? 0 : -ENXIO; |
679 | } |
680 | |
681 | static int dm_blk_close(struct inode *inode, struct file *file) |
682 | @@ -744,14 +762,13 @@ static int dm_any_congested(void *conges |
683 | /*----------------------------------------------------------------- |
684 | * An IDR is used to keep track of allocated minor numbers. |
685 | *---------------------------------------------------------------*/ |
686 | -static DEFINE_MUTEX(_minor_lock); |
687 | static DEFINE_IDR(_minor_idr); |
688 | |
689 | static void free_minor(unsigned int minor) |
690 | { |
691 | - mutex_lock(&_minor_lock); |
692 | + spin_lock(&_minor_lock); |
693 | idr_remove(&_minor_idr, minor); |
694 | - mutex_unlock(&_minor_lock); |
695 | + spin_unlock(&_minor_lock); |
696 | } |
697 | |
698 | /* |
699 | @@ -764,23 +781,20 @@ static int specific_minor(struct mapped_ |
700 | if (minor >= (1 << MINORBITS)) |
701 | return -EINVAL; |
702 | |
703 | - mutex_lock(&_minor_lock); |
704 | + r = idr_pre_get(&_minor_idr, GFP_KERNEL); |
705 | + if (!r) |
706 | + return -ENOMEM; |
707 | + |
708 | + spin_lock(&_minor_lock); |
709 | |
710 | if (idr_find(&_minor_idr, minor)) { |
711 | r = -EBUSY; |
712 | goto out; |
713 | } |
714 | |
715 | - r = idr_pre_get(&_minor_idr, GFP_KERNEL); |
716 | - if (!r) { |
717 | - r = -ENOMEM; |
718 | - goto out; |
719 | - } |
720 | - |
721 | - r = idr_get_new_above(&_minor_idr, md, minor, &m); |
722 | - if (r) { |
723 | + r = idr_get_new_above(&_minor_idr, MINOR_ALLOCED, minor, &m); |
724 | + if (r) |
725 | goto out; |
726 | - } |
727 | |
728 | if (m != minor) { |
729 | idr_remove(&_minor_idr, m); |
730 | @@ -789,7 +803,7 @@ static int specific_minor(struct mapped_ |
731 | } |
732 | |
733 | out: |
734 | - mutex_unlock(&_minor_lock); |
735 | + spin_unlock(&_minor_lock); |
736 | return r; |
737 | } |
738 | |
739 | @@ -798,15 +812,13 @@ static int next_free_minor(struct mapped |
740 | int r; |
741 | unsigned int m; |
742 | |
743 | - mutex_lock(&_minor_lock); |
744 | - |
745 | r = idr_pre_get(&_minor_idr, GFP_KERNEL); |
746 | - if (!r) { |
747 | - r = -ENOMEM; |
748 | - goto out; |
749 | - } |
750 | + if (!r) |
751 | + return -ENOMEM; |
752 | |
753 | - r = idr_get_new(&_minor_idr, md, &m); |
754 | + spin_lock(&_minor_lock); |
755 | + |
756 | + r = idr_get_new(&_minor_idr, MINOR_ALLOCED, &m); |
757 | if (r) { |
758 | goto out; |
759 | } |
760 | @@ -820,7 +832,7 @@ static int next_free_minor(struct mapped |
761 | *minor = m; |
762 | |
763 | out: |
764 | - mutex_unlock(&_minor_lock); |
765 | + spin_unlock(&_minor_lock); |
766 | return r; |
767 | } |
768 | |
769 | @@ -833,12 +845,16 @@ static struct mapped_device *alloc_dev(u |
770 | { |
771 | int r; |
772 | struct mapped_device *md = kmalloc(sizeof(*md), GFP_KERNEL); |
773 | + void *old_md; |
774 | |
775 | if (!md) { |
776 | DMWARN("unable to allocate device, out of memory."); |
777 | return NULL; |
778 | } |
779 | |
780 | + if (!try_module_get(THIS_MODULE)) |
781 | + goto bad0; |
782 | + |
783 | /* get a minor number for the dev */ |
784 | r = persistent ? specific_minor(md, minor) : next_free_minor(md, &minor); |
785 | if (r < 0) |
786 | @@ -875,6 +891,10 @@ static struct mapped_device *alloc_dev(u |
787 | if (!md->disk) |
788 | goto bad4; |
789 | |
790 | + atomic_set(&md->pending, 0); |
791 | + init_waitqueue_head(&md->wait); |
792 | + init_waitqueue_head(&md->eventq); |
793 | + |
794 | md->disk->major = _major; |
795 | md->disk->first_minor = minor; |
796 | md->disk->fops = &dm_blk_dops; |
797 | @@ -884,9 +904,12 @@ static struct mapped_device *alloc_dev(u |
798 | add_disk(md->disk); |
799 | format_dev_t(md->name, MKDEV(_major, minor)); |
800 | |
801 | - atomic_set(&md->pending, 0); |
802 | - init_waitqueue_head(&md->wait); |
803 | - init_waitqueue_head(&md->eventq); |
804 | + /* Populate the mapping, nobody knows we exist yet */ |
805 | + spin_lock(&_minor_lock); |
806 | + old_md = idr_replace(&_minor_idr, md, minor); |
807 | + spin_unlock(&_minor_lock); |
808 | + |
809 | + BUG_ON(old_md != MINOR_ALLOCED); |
810 | |
811 | return md; |
812 | |
813 | @@ -898,6 +921,8 @@ static struct mapped_device *alloc_dev(u |
814 | blk_cleanup_queue(md->queue); |
815 | free_minor(minor); |
816 | bad1: |
817 | + module_put(THIS_MODULE); |
818 | + bad0: |
819 | kfree(md); |
820 | return NULL; |
821 | } |
822 | @@ -914,8 +939,14 @@ static void free_dev(struct mapped_devic |
823 | mempool_destroy(md->io_pool); |
824 | del_gendisk(md->disk); |
825 | free_minor(minor); |
826 | + |
827 | + spin_lock(&_minor_lock); |
828 | + md->disk->private_data = NULL; |
829 | + spin_unlock(&_minor_lock); |
830 | + |
831 | put_disk(md->disk); |
832 | blk_cleanup_queue(md->queue); |
833 | + module_put(THIS_MODULE); |
834 | kfree(md); |
835 | } |
836 | |
837 | @@ -1015,13 +1046,18 @@ static struct mapped_device *dm_find_md( |
838 | if (MAJOR(dev) != _major || minor >= (1 << MINORBITS)) |
839 | return NULL; |
840 | |
841 | - mutex_lock(&_minor_lock); |
842 | + spin_lock(&_minor_lock); |
843 | |
844 | md = idr_find(&_minor_idr, minor); |
845 | - if (!md || (dm_disk(md)->first_minor != minor)) |
846 | + if (md && (md == MINOR_ALLOCED || |
847 | + (dm_disk(md)->first_minor != minor) || |
848 | + test_bit(DMF_FREEING, &md->flags))) { |
849 | md = NULL; |
850 | + goto out; |
851 | + } |
852 | |
853 | - mutex_unlock(&_minor_lock); |
854 | +out: |
855 | + spin_unlock(&_minor_lock); |
856 | |
857 | return md; |
858 | } |
859 | @@ -1055,8 +1091,13 @@ void dm_put(struct mapped_device *md) |
860 | { |
861 | struct dm_table *map; |
862 | |
863 | - if (atomic_dec_and_test(&md->holders)) { |
864 | + BUG_ON(test_bit(DMF_FREEING, &md->flags)); |
865 | + |
866 | + if (atomic_dec_and_lock(&md->holders, &_minor_lock)) { |
867 | map = dm_get_table(md); |
868 | + idr_replace(&_minor_idr, MINOR_ALLOCED, dm_disk(md)->first_minor); |
869 | + set_bit(DMF_FREEING, &md->flags); |
870 | + spin_unlock(&_minor_lock); |
871 | if (!dm_suspended(md)) { |
872 | dm_table_presuspend_targets(map); |
873 | dm_table_postsuspend_targets(map); |
874 | diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c |
875 | index 72ca553..cc66193 100644 |
876 | --- a/drivers/net/sky2.c |
877 | +++ b/drivers/net/sky2.c |
878 | @@ -51,7 +51,7 @@ #endif |
879 | #include "sky2.h" |
880 | |
881 | #define DRV_NAME "sky2" |
882 | -#define DRV_VERSION "1.4" |
883 | +#define DRV_VERSION "1.6.1" |
884 | #define PFX DRV_NAME " " |
885 | |
886 | /* |
887 | @@ -321,7 +321,7 @@ static void sky2_phy_init(struct sky2_hw |
888 | } |
889 | |
890 | ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); |
891 | - if (hw->copper) { |
892 | + if (sky2_is_copper(hw)) { |
893 | if (hw->chip_id == CHIP_ID_YUKON_FE) { |
894 | /* enable automatic crossover */ |
895 | ctrl |= PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO) >> 1; |
896 | @@ -338,25 +338,37 @@ static void sky2_phy_init(struct sky2_hw |
897 | ctrl |= PHY_M_PC_DSC(2) | PHY_M_PC_DOWN_S_ENA; |
898 | } |
899 | } |
900 | - gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); |
901 | } else { |
902 | /* workaround for deviation #4.88 (CRC errors) */ |
903 | /* disable Automatic Crossover */ |
904 | |
905 | ctrl &= ~PHY_M_PC_MDIX_MSK; |
906 | - gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); |
907 | + } |
908 | |
909 | - if (hw->chip_id == CHIP_ID_YUKON_XL) { |
910 | - /* Fiber: select 1000BASE-X only mode MAC Specific Ctrl Reg. */ |
911 | - gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 2); |
912 | - ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); |
913 | - ctrl &= ~PHY_M_MAC_MD_MSK; |
914 | - ctrl |= PHY_M_MAC_MODE_SEL(PHY_M_MAC_MD_1000BX); |
915 | - gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); |
916 | + gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); |
917 | + |
918 | + /* special setup for PHY 88E1112 Fiber */ |
919 | + if (hw->chip_id == CHIP_ID_YUKON_XL && !sky2_is_copper(hw)) { |
920 | + pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR); |
921 | + |
922 | + /* Fiber: select 1000BASE-X only mode MAC Specific Ctrl Reg. */ |
923 | + gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 2); |
924 | + ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); |
925 | + ctrl &= ~PHY_M_MAC_MD_MSK; |
926 | + ctrl |= PHY_M_MAC_MODE_SEL(PHY_M_MAC_MD_1000BX); |
927 | + gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); |
928 | |
929 | + if (hw->pmd_type == 'P') { |
930 | /* select page 1 to access Fiber registers */ |
931 | gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 1); |
932 | + |
933 | + /* for SFP-module set SIGDET polarity to low */ |
934 | + ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); |
935 | + ctrl |= PHY_M_FIB_SIGD_POL; |
936 | + gm_phy_write(hw, port, PHY_MARV_CTRL, ctrl); |
937 | } |
938 | + |
939 | + gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg); |
940 | } |
941 | |
942 | ctrl = gm_phy_read(hw, port, PHY_MARV_CTRL); |
943 | @@ -373,7 +385,7 @@ static void sky2_phy_init(struct sky2_hw |
944 | adv = PHY_AN_CSMA; |
945 | |
946 | if (sky2->autoneg == AUTONEG_ENABLE) { |
947 | - if (hw->copper) { |
948 | + if (sky2_is_copper(hw)) { |
949 | if (sky2->advertising & ADVERTISED_1000baseT_Full) |
950 | ct1000 |= PHY_M_1000C_AFD; |
951 | if (sky2->advertising & ADVERTISED_1000baseT_Half) |
952 | @@ -386,8 +398,12 @@ static void sky2_phy_init(struct sky2_hw |
953 | adv |= PHY_M_AN_10_FD; |
954 | if (sky2->advertising & ADVERTISED_10baseT_Half) |
955 | adv |= PHY_M_AN_10_HD; |
956 | - } else /* special defines for FIBER (88E1011S only) */ |
957 | - adv |= PHY_M_AN_1000X_AHD | PHY_M_AN_1000X_AFD; |
958 | + } else { /* special defines for FIBER (88E1040S only) */ |
959 | + if (sky2->advertising & ADVERTISED_1000baseT_Full) |
960 | + adv |= PHY_M_AN_1000X_AFD; |
961 | + if (sky2->advertising & ADVERTISED_1000baseT_Half) |
962 | + adv |= PHY_M_AN_1000X_AHD; |
963 | + } |
964 | |
965 | /* Set Flow-control capabilities */ |
966 | if (sky2->tx_pause && sky2->rx_pause) |
967 | @@ -949,14 +965,14 @@ #endif |
968 | /* |
969 | * It appears the hardware has a bug in the FIFO logic that |
970 | * cause it to hang if the FIFO gets overrun and the receive buffer |
971 | - * is not aligned. ALso alloc_skb() won't align properly if slab |
972 | + * is not aligned. Also dev_alloc_skb() won't align properly if slab |
973 | * debugging is enabled. |
974 | */ |
975 | static inline struct sk_buff *sky2_alloc_skb(unsigned int size, gfp_t gfp_mask) |
976 | { |
977 | struct sk_buff *skb; |
978 | |
979 | - skb = alloc_skb(size + RX_SKB_ALIGN, gfp_mask); |
980 | + skb = __dev_alloc_skb(size + RX_SKB_ALIGN, gfp_mask); |
981 | if (likely(skb)) { |
982 | unsigned long p = (unsigned long) skb->data; |
983 | skb_reserve(skb, ALIGN(p, RX_SKB_ALIGN) - p); |
984 | @@ -1497,7 +1513,7 @@ static int sky2_down(struct net_device * |
985 | |
986 | static u16 sky2_phy_speed(const struct sky2_hw *hw, u16 aux) |
987 | { |
988 | - if (!hw->copper) |
989 | + if (!sky2_is_copper(hw)) |
990 | return SPEED_1000; |
991 | |
992 | if (hw->chip_id == CHIP_ID_YUKON_FE) |
993 | @@ -1855,7 +1871,7 @@ static struct sk_buff *sky2_receive(stru |
994 | goto oversize; |
995 | |
996 | if (length < copybreak) { |
997 | - skb = alloc_skb(length + 2, GFP_ATOMIC); |
998 | + skb = dev_alloc_skb(length + 2); |
999 | if (!skb) |
1000 | goto resubmit; |
1001 | |
1002 | @@ -2016,6 +2032,9 @@ #endif |
1003 | } |
1004 | } |
1005 | |
1006 | + /* Fully processed status ring so clear irq */ |
1007 | + sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ); |
1008 | + |
1009 | exit_loop: |
1010 | return work_done; |
1011 | } |
1012 | @@ -2218,9 +2237,6 @@ static int sky2_poll(struct net_device * |
1013 | *budget -= work_done; |
1014 | dev0->quota -= work_done; |
1015 | |
1016 | - if (status & Y2_IS_STAT_BMU) |
1017 | - sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ); |
1018 | - |
1019 | if (sky2_more_work(hw)) |
1020 | return 1; |
1021 | |
1022 | @@ -2287,7 +2303,7 @@ static inline u32 sky2_clk2us(const stru |
1023 | static int __devinit sky2_reset(struct sky2_hw *hw) |
1024 | { |
1025 | u16 status; |
1026 | - u8 t8, pmd_type; |
1027 | + u8 t8; |
1028 | int i; |
1029 | |
1030 | sky2_write8(hw, B0_CTST, CS_RST_CLR); |
1031 | @@ -2333,9 +2349,7 @@ static int __devinit sky2_reset(struct s |
1032 | sky2_pci_write32(hw, PEX_UNC_ERR_STAT, 0xffffffffUL); |
1033 | |
1034 | |
1035 | - pmd_type = sky2_read8(hw, B2_PMD_TYP); |
1036 | - hw->copper = !(pmd_type == 'L' || pmd_type == 'S'); |
1037 | - |
1038 | + hw->pmd_type = sky2_read8(hw, B2_PMD_TYP); |
1039 | hw->ports = 1; |
1040 | t8 = sky2_read8(hw, B2_Y2_HW_RES); |
1041 | if ((t8 & CFG_DUAL_MAC_MSK) == CFG_DUAL_MAC_MSK) { |
1042 | @@ -2432,21 +2446,22 @@ static int __devinit sky2_reset(struct s |
1043 | |
1044 | static u32 sky2_supported_modes(const struct sky2_hw *hw) |
1045 | { |
1046 | - u32 modes; |
1047 | - if (hw->copper) { |
1048 | - modes = SUPPORTED_10baseT_Half |
1049 | - | SUPPORTED_10baseT_Full |
1050 | - | SUPPORTED_100baseT_Half |
1051 | - | SUPPORTED_100baseT_Full |
1052 | - | SUPPORTED_Autoneg | SUPPORTED_TP; |
1053 | + if (sky2_is_copper(hw)) { |
1054 | + u32 modes = SUPPORTED_10baseT_Half |
1055 | + | SUPPORTED_10baseT_Full |
1056 | + | SUPPORTED_100baseT_Half |
1057 | + | SUPPORTED_100baseT_Full |
1058 | + | SUPPORTED_Autoneg | SUPPORTED_TP; |
1059 | |
1060 | if (hw->chip_id != CHIP_ID_YUKON_FE) |
1061 | modes |= SUPPORTED_1000baseT_Half |
1062 | - | SUPPORTED_1000baseT_Full; |
1063 | + | SUPPORTED_1000baseT_Full; |
1064 | + return modes; |
1065 | } else |
1066 | - modes = SUPPORTED_1000baseT_Full | SUPPORTED_FIBRE |
1067 | - | SUPPORTED_Autoneg; |
1068 | - return modes; |
1069 | + return SUPPORTED_1000baseT_Half |
1070 | + | SUPPORTED_1000baseT_Full |
1071 | + | SUPPORTED_Autoneg |
1072 | + | SUPPORTED_FIBRE; |
1073 | } |
1074 | |
1075 | static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) |
1076 | @@ -2457,7 +2472,7 @@ static int sky2_get_settings(struct net_ |
1077 | ecmd->transceiver = XCVR_INTERNAL; |
1078 | ecmd->supported = sky2_supported_modes(hw); |
1079 | ecmd->phy_address = PHY_ADDR_MARV; |
1080 | - if (hw->copper) { |
1081 | + if (sky2_is_copper(hw)) { |
1082 | ecmd->supported = SUPPORTED_10baseT_Half |
1083 | | SUPPORTED_10baseT_Full |
1084 | | SUPPORTED_100baseT_Half |
1085 | @@ -2466,12 +2481,14 @@ static int sky2_get_settings(struct net_ |
1086 | | SUPPORTED_1000baseT_Full |
1087 | | SUPPORTED_Autoneg | SUPPORTED_TP; |
1088 | ecmd->port = PORT_TP; |
1089 | - } else |
1090 | + ecmd->speed = sky2->speed; |
1091 | + } else { |
1092 | + ecmd->speed = SPEED_1000; |
1093 | ecmd->port = PORT_FIBRE; |
1094 | + } |
1095 | |
1096 | ecmd->advertising = sky2->advertising; |
1097 | ecmd->autoneg = sky2->autoneg; |
1098 | - ecmd->speed = sky2->speed; |
1099 | ecmd->duplex = sky2->duplex; |
1100 | return 0; |
1101 | } |
1102 | @@ -3184,6 +3201,8 @@ static int __devinit sky2_test_msi(struc |
1103 | struct pci_dev *pdev = hw->pdev; |
1104 | int err; |
1105 | |
1106 | + init_waitqueue_head (&hw->msi_wait); |
1107 | + |
1108 | sky2_write32(hw, B0_IMSK, Y2_IS_IRQ_SW); |
1109 | |
1110 | err = request_irq(pdev->irq, sky2_test_intr, SA_SHIRQ, DRV_NAME, hw); |
1111 | @@ -3193,10 +3212,8 @@ static int __devinit sky2_test_msi(struc |
1112 | return err; |
1113 | } |
1114 | |
1115 | - init_waitqueue_head (&hw->msi_wait); |
1116 | - |
1117 | sky2_write8(hw, B0_CTST, CS_ST_SW_IRQ); |
1118 | - wmb(); |
1119 | + sky2_read8(hw, B0_CTST); |
1120 | |
1121 | wait_event_timeout(hw->msi_wait, hw->msi_detected, HZ/10); |
1122 | |
1123 | diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h |
1124 | index 8a0bc55..9516c1f 100644 |
1125 | --- a/drivers/net/sky2.h |
1126 | +++ b/drivers/net/sky2.h |
1127 | @@ -1318,6 +1318,14 @@ enum { |
1128 | }; |
1129 | |
1130 | /* for Yukon-2 Gigabit Ethernet PHY (88E1112 only) */ |
1131 | +/***** PHY_MARV_PHY_CTRL (page 1) 16 bit r/w Fiber Specific Ctrl *****/ |
1132 | +enum { |
1133 | + PHY_M_FIB_FORCE_LNK = 1<<10,/* Force Link Good */ |
1134 | + PHY_M_FIB_SIGD_POL = 1<<9, /* SIGDET Polarity */ |
1135 | + PHY_M_FIB_TX_DIS = 1<<3, /* Transmitter Disable */ |
1136 | +}; |
1137 | + |
1138 | +/* for Yukon-2 Gigabit Ethernet PHY (88E1112 only) */ |
1139 | /***** PHY_MARV_PHY_CTRL (page 2) 16 bit r/w MAC Specific Ctrl *****/ |
1140 | enum { |
1141 | PHY_M_MAC_MD_MSK = 7<<7, /* Bit 9.. 7: Mode Select Mask */ |
1142 | @@ -1566,7 +1574,7 @@ enum { |
1143 | |
1144 | GMR_FS_ANY_ERR = GMR_FS_RX_FF_OV | GMR_FS_CRC_ERR | |
1145 | GMR_FS_FRAGMENT | GMR_FS_LONG_ERR | |
1146 | - GMR_FS_MII_ERR | GMR_FS_BAD_FC | GMR_FS_GOOD_FC | |
1147 | + GMR_FS_MII_ERR | GMR_FS_BAD_FC | |
1148 | GMR_FS_UN_SIZE | GMR_FS_JABBER, |
1149 | }; |
1150 | |
1151 | @@ -1879,7 +1887,7 @@ struct sky2_hw { |
1152 | int pm_cap; |
1153 | u8 chip_id; |
1154 | u8 chip_rev; |
1155 | - u8 copper; |
1156 | + u8 pmd_type; |
1157 | u8 ports; |
1158 | |
1159 | struct sky2_status_le *st_le; |
1160 | @@ -1891,6 +1899,11 @@ struct sky2_hw { |
1161 | wait_queue_head_t msi_wait; |
1162 | }; |
1163 | |
1164 | +static inline int sky2_is_copper(const struct sky2_hw *hw) |
1165 | +{ |
1166 | + return !(hw->pmd_type == 'L' || hw->pmd_type == 'S' || hw->pmd_type == 'P'); |
1167 | +} |
1168 | + |
1169 | /* Register accessor for memory mapped device */ |
1170 | static inline u32 sky2_read32(const struct sky2_hw *hw, unsigned reg) |
1171 | { |
1172 | diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c |
1173 | index 862c226..38b605d 100644 |
1174 | --- a/drivers/net/tg3.c |
1175 | +++ b/drivers/net/tg3.c |
1176 | @@ -69,8 +69,8 @@ #include "tg3.h" |
1177 | |
1178 | #define DRV_MODULE_NAME "tg3" |
1179 | #define PFX DRV_MODULE_NAME ": " |
1180 | -#define DRV_MODULE_VERSION "3.59" |
1181 | -#define DRV_MODULE_RELDATE "June 8, 2006" |
1182 | +#define DRV_MODULE_VERSION "3.59.1" |
1183 | +#define DRV_MODULE_RELDATE "August 25, 2006" |
1184 | |
1185 | #define TG3_DEF_MAC_MODE 0 |
1186 | #define TG3_DEF_RX_MODE 0 |
1187 | @@ -11381,11 +11381,15 @@ #if TG3_TSO_SUPPORT != 0 |
1188 | tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE; |
1189 | } |
1190 | |
1191 | - /* TSO is on by default on chips that support hardware TSO. |
1192 | + /* TSO is on by default on chips that support HW_TSO_2. |
1193 | + * Some HW_TSO_1 capable chips have bugs that can lead to |
1194 | + * tx timeouts in some cases when TSO is enabled. |
1195 | * Firmware TSO on older chips gives lower performance, so it |
1196 | * is off by default, but can be enabled using ethtool. |
1197 | */ |
1198 | - if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) |
1199 | + if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) || |
1200 | + (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 && |
1201 | + tp->pci_chip_rev_id >= CHIPREV_ID_5750_C2)) |
1202 | dev->features |= NETIF_F_TSO; |
1203 | |
1204 | #endif |
1205 | diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h |
1206 | index ff0faab..cd68f46 100644 |
1207 | --- a/drivers/net/tg3.h |
1208 | +++ b/drivers/net/tg3.h |
1209 | @@ -125,6 +125,7 @@ #define CHIPREV_ID_5705_A3 0x3003 |
1210 | #define CHIPREV_ID_5750_A0 0x4000 |
1211 | #define CHIPREV_ID_5750_A1 0x4001 |
1212 | #define CHIPREV_ID_5750_A3 0x4003 |
1213 | +#define CHIPREV_ID_5750_C2 0x4202 |
1214 | #define CHIPREV_ID_5752_A0_HW 0x5000 |
1215 | #define CHIPREV_ID_5752_A0 0x6000 |
1216 | #define CHIPREV_ID_5752_A1 0x6001 |
1217 | diff --git a/drivers/net/wireless/spectrum_cs.c b/drivers/net/wireless/spectrum_cs.c |
1218 | index f7b77ce..54fe4e4 100644 |
1219 | --- a/drivers/net/wireless/spectrum_cs.c |
1220 | +++ b/drivers/net/wireless/spectrum_cs.c |
1221 | @@ -245,7 +245,7 @@ spectrum_reset(struct pcmcia_device *lin |
1222 | u_int save_cor; |
1223 | |
1224 | /* Doing it if hardware is gone is guaranteed crash */ |
1225 | - if (pcmcia_dev_present(link)) |
1226 | + if (!pcmcia_dev_present(link)) |
1227 | return -ENODEV; |
1228 | |
1229 | /* Save original COR value */ |
1230 | diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c |
1231 | index 27909bc..5f44354 100644 |
1232 | --- a/drivers/usb/host/uhci-q.c |
1233 | +++ b/drivers/usb/host/uhci-q.c |
1234 | @@ -264,7 +264,7 @@ static void uhci_fixup_toggles(struct uh |
1235 | * need to change any toggles in this URB */ |
1236 | td = list_entry(urbp->td_list.next, struct uhci_td, list); |
1237 | if (toggle > 1 || uhci_toggle(td_token(td)) == toggle) { |
1238 | - td = list_entry(urbp->td_list.next, struct uhci_td, |
1239 | + td = list_entry(urbp->td_list.prev, struct uhci_td, |
1240 | list); |
1241 | toggle = uhci_toggle(td_token(td)) ^ 1; |
1242 | |
1243 | diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c |
1244 | index 537893a..997a202 100644 |
1245 | --- a/fs/binfmt_elf.c |
1246 | +++ b/fs/binfmt_elf.c |
1247 | @@ -86,7 +86,7 @@ static struct linux_binfmt elf_format = |
1248 | .min_coredump = ELF_EXEC_PAGESIZE |
1249 | }; |
1250 | |
1251 | -#define BAD_ADDR(x) ((unsigned long)(x) > TASK_SIZE) |
1252 | +#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE) |
1253 | |
1254 | static int set_brk(unsigned long start, unsigned long end) |
1255 | { |
1256 | @@ -389,7 +389,7 @@ static unsigned long load_elf_interp(str |
1257 | * <= p_memsize so it is only necessary to check p_memsz. |
1258 | */ |
1259 | k = load_addr + eppnt->p_vaddr; |
1260 | - if (k > TASK_SIZE || eppnt->p_filesz > eppnt->p_memsz || |
1261 | + if (BAD_ADDR(k) || eppnt->p_filesz > eppnt->p_memsz || |
1262 | eppnt->p_memsz > TASK_SIZE || TASK_SIZE - eppnt->p_memsz < k) { |
1263 | error = -ENOMEM; |
1264 | goto out_close; |
1265 | @@ -876,7 +876,7 @@ static int load_elf_binary(struct linux_ |
1266 | * allowed task size. Note that p_filesz must always be |
1267 | * <= p_memsz so it is only necessary to check p_memsz. |
1268 | */ |
1269 | - if (k > TASK_SIZE || elf_ppnt->p_filesz > elf_ppnt->p_memsz || |
1270 | + if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz || |
1271 | elf_ppnt->p_memsz > TASK_SIZE || |
1272 | TASK_SIZE - elf_ppnt->p_memsz < k) { |
1273 | /* set_brk can never work. Avoid overflows. */ |
1274 | @@ -930,10 +930,9 @@ static int load_elf_binary(struct linux_ |
1275 | interpreter, |
1276 | &interp_load_addr); |
1277 | if (BAD_ADDR(elf_entry)) { |
1278 | - printk(KERN_ERR "Unable to load interpreter %.128s\n", |
1279 | - elf_interpreter); |
1280 | force_sig(SIGSEGV, current); |
1281 | - retval = -ENOEXEC; /* Nobody gets to see this, but.. */ |
1282 | + retval = IS_ERR((void *)elf_entry) ? |
1283 | + (int)elf_entry : -EINVAL; |
1284 | goto out_free_dentry; |
1285 | } |
1286 | reloc_func_desc = interp_load_addr; |
1287 | @@ -944,8 +943,8 @@ static int load_elf_binary(struct linux_ |
1288 | } else { |
1289 | elf_entry = loc->elf_ex.e_entry; |
1290 | if (BAD_ADDR(elf_entry)) { |
1291 | - send_sig(SIGSEGV, current, 0); |
1292 | - retval = -ENOEXEC; /* Nobody gets to see this, but.. */ |
1293 | + force_sig(SIGSEGV, current); |
1294 | + retval = -EINVAL; |
1295 | goto out_free_dentry; |
1296 | } |
1297 | } |
1298 | diff --git a/fs/ext2/super.c b/fs/ext2/super.c |
1299 | index 7e30bae..e51d1a8 100644 |
1300 | --- a/fs/ext2/super.c |
1301 | +++ b/fs/ext2/super.c |
1302 | @@ -252,6 +252,46 @@ #ifdef CONFIG_QUOTA |
1303 | #endif |
1304 | }; |
1305 | |
1306 | +static struct dentry *ext2_get_dentry(struct super_block *sb, void *vobjp) |
1307 | +{ |
1308 | + __u32 *objp = vobjp; |
1309 | + unsigned long ino = objp[0]; |
1310 | + __u32 generation = objp[1]; |
1311 | + struct inode *inode; |
1312 | + struct dentry *result; |
1313 | + |
1314 | + if (ino != EXT2_ROOT_INO && ino < EXT2_FIRST_INO(sb)) |
1315 | + return ERR_PTR(-ESTALE); |
1316 | + if (ino > le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count)) |
1317 | + return ERR_PTR(-ESTALE); |
1318 | + |
1319 | + /* iget isn't really right if the inode is currently unallocated!! |
1320 | + * ext2_read_inode currently does appropriate checks, but |
1321 | + * it might be "neater" to call ext2_get_inode first and check |
1322 | + * if the inode is valid..... |
1323 | + */ |
1324 | + inode = iget(sb, ino); |
1325 | + if (inode == NULL) |
1326 | + return ERR_PTR(-ENOMEM); |
1327 | + if (is_bad_inode(inode) |
1328 | + || (generation && inode->i_generation != generation) |
1329 | + ) { |
1330 | + /* we didn't find the right inode.. */ |
1331 | + iput(inode); |
1332 | + return ERR_PTR(-ESTALE); |
1333 | + } |
1334 | + /* now to find a dentry. |
1335 | + * If possible, get a well-connected one |
1336 | + */ |
1337 | + result = d_alloc_anon(inode); |
1338 | + if (!result) { |
1339 | + iput(inode); |
1340 | + return ERR_PTR(-ENOMEM); |
1341 | + } |
1342 | + return result; |
1343 | +} |
1344 | + |
1345 | + |
1346 | /* Yes, most of these are left as NULL!! |
1347 | * A NULL value implies the default, which works with ext2-like file |
1348 | * systems, but can be improved upon. |
1349 | @@ -259,6 +299,7 @@ #endif |
1350 | */ |
1351 | static struct export_operations ext2_export_ops = { |
1352 | .get_parent = ext2_get_parent, |
1353 | + .get_dentry = ext2_get_dentry, |
1354 | }; |
1355 | |
1356 | static unsigned long get_sb_block(void **data) |
1357 | diff --git a/fs/locks.c b/fs/locks.c |
1358 | index ab61a8b..529a0ed 100644 |
1359 | --- a/fs/locks.c |
1360 | +++ b/fs/locks.c |
1361 | @@ -1389,8 +1389,9 @@ static int __setlease(struct file *filp, |
1362 | if (!leases_enable) |
1363 | goto out; |
1364 | |
1365 | - error = lease_alloc(filp, arg, &fl); |
1366 | - if (error) |
1367 | + error = -ENOMEM; |
1368 | + fl = locks_alloc_lock(); |
1369 | + if (fl == NULL) |
1370 | goto out; |
1371 | |
1372 | locks_copy_lock(fl, lease); |
1373 | @@ -1398,6 +1399,7 @@ static int __setlease(struct file *filp, |
1374 | locks_insert_lock(before, fl); |
1375 | |
1376 | *flp = fl; |
1377 | + error = 0; |
1378 | out: |
1379 | return error; |
1380 | } |
1381 | diff --git a/include/asm-ia64/mman.h b/include/asm-ia64/mman.h |
1382 | index df1b20e..b242f95 100644 |
1383 | --- a/include/asm-ia64/mman.h |
1384 | +++ b/include/asm-ia64/mman.h |
1385 | @@ -9,10 +9,12 @@ #define _ASM_IA64_MMAN_H |
1386 | */ |
1387 | |
1388 | #ifdef __KERNEL__ |
1389 | +#ifndef __ASSEMBLY__ |
1390 | #define arch_mmap_check ia64_map_check_rgn |
1391 | int ia64_map_check_rgn(unsigned long addr, unsigned long len, |
1392 | unsigned long flags); |
1393 | #endif |
1394 | +#endif |
1395 | |
1396 | #include <asm-generic/mman.h> |
1397 | |
1398 | diff --git a/include/asm-ia64/sn/xp.h b/include/asm-ia64/sn/xp.h |
1399 | index 9bd2f9b..6f807e0 100644 |
1400 | --- a/include/asm-ia64/sn/xp.h |
1401 | +++ b/include/asm-ia64/sn/xp.h |
1402 | @@ -60,23 +60,37 @@ #define XP_NASID_MASK_WORDS ((XP_MAX_PHY |
1403 | * the bte_copy() once in the hope that the failure was due to a temporary |
1404 | * aberration (i.e., the link going down temporarily). |
1405 | * |
1406 | - * See bte_copy for definition of the input parameters. |
1407 | + * src - physical address of the source of the transfer. |
1408 | + * vdst - virtual address of the destination of the transfer. |
1409 | + * len - number of bytes to transfer from source to destination. |
1410 | + * mode - see bte_copy() for definition. |
1411 | + * notification - see bte_copy() for definition. |
1412 | * |
1413 | * Note: xp_bte_copy() should never be called while holding a spinlock. |
1414 | */ |
1415 | static inline bte_result_t |
1416 | -xp_bte_copy(u64 src, u64 dest, u64 len, u64 mode, void *notification) |
1417 | +xp_bte_copy(u64 src, u64 vdst, u64 len, u64 mode, void *notification) |
1418 | { |
1419 | bte_result_t ret; |
1420 | + u64 pdst = ia64_tpa(vdst); |
1421 | |
1422 | |
1423 | - ret = bte_copy(src, dest, len, mode, notification); |
1424 | + /* |
1425 | + * Ensure that the physically mapped memory is contiguous. |
1426 | + * |
1427 | + * We do this by ensuring that the memory is from region 7 only. |
1428 | + * If the need should arise to use memory from one of the other |
1429 | + * regions, then modify the BUG_ON() statement to ensure that the |
1430 | + * memory from that region is always physically contiguous. |
1431 | + */ |
1432 | + BUG_ON(REGION_NUMBER(vdst) != RGN_KERNEL); |
1433 | |
1434 | + ret = bte_copy(src, pdst, len, mode, notification); |
1435 | if (ret != BTE_SUCCESS) { |
1436 | if (!in_interrupt()) { |
1437 | cond_resched(); |
1438 | } |
1439 | - ret = bte_copy(src, dest, len, mode, notification); |
1440 | + ret = bte_copy(src, pdst, len, mode, notification); |
1441 | } |
1442 | |
1443 | return ret; |
1444 | diff --git a/include/asm-ia64/sn/xpc.h b/include/asm-ia64/sn/xpc.h |
1445 | index aa3b8ac..b454ad4 100644 |
1446 | --- a/include/asm-ia64/sn/xpc.h |
1447 | +++ b/include/asm-ia64/sn/xpc.h |
1448 | @@ -684,7 +684,9 @@ extern struct xpc_vars *xpc_vars; |
1449 | extern struct xpc_rsvd_page *xpc_rsvd_page; |
1450 | extern struct xpc_vars_part *xpc_vars_part; |
1451 | extern struct xpc_partition xpc_partitions[XP_MAX_PARTITIONS + 1]; |
1452 | -extern char xpc_remote_copy_buffer[]; |
1453 | +extern char *xpc_remote_copy_buffer; |
1454 | +extern void *xpc_remote_copy_buffer_base; |
1455 | +extern void *xpc_kmalloc_cacheline_aligned(size_t, gfp_t, void **); |
1456 | extern struct xpc_rsvd_page *xpc_rsvd_page_init(void); |
1457 | extern void xpc_allow_IPI_ops(void); |
1458 | extern void xpc_restrict_IPI_ops(void); |
1459 | diff --git a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h |
1460 | index a75b84b..178a97e 100644 |
1461 | --- a/include/linux/netfilter_bridge.h |
1462 | +++ b/include/linux/netfilter_bridge.h |
1463 | @@ -47,18 +47,26 @@ #define BRNF_DONT_TAKE_PARENT 0x04 |
1464 | #define BRNF_BRIDGED 0x08 |
1465 | #define BRNF_NF_BRIDGE_PREROUTING 0x10 |
1466 | |
1467 | - |
1468 | /* Only used in br_forward.c */ |
1469 | -static inline |
1470 | -void nf_bridge_maybe_copy_header(struct sk_buff *skb) |
1471 | +static inline int nf_bridge_maybe_copy_header(struct sk_buff *skb) |
1472 | { |
1473 | + int err; |
1474 | + |
1475 | if (skb->nf_bridge) { |
1476 | if (skb->protocol == __constant_htons(ETH_P_8021Q)) { |
1477 | + err = skb_cow(skb, 18); |
1478 | + if (err) |
1479 | + return err; |
1480 | memcpy(skb->data - 18, skb->nf_bridge->data, 18); |
1481 | skb_push(skb, 4); |
1482 | - } else |
1483 | + } else { |
1484 | + err = skb_cow(skb, 16); |
1485 | + if (err) |
1486 | + return err; |
1487 | memcpy(skb->data - 16, skb->nf_bridge->data, 16); |
1488 | + } |
1489 | } |
1490 | + return 0; |
1491 | } |
1492 | |
1493 | /* This is called by the IP fragmenting code and it ensures there is |
1494 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h |
1495 | index 2c31bb0..a1ce843 100644 |
1496 | --- a/include/linux/skbuff.h |
1497 | +++ b/include/linux/skbuff.h |
1498 | @@ -1009,6 +1009,21 @@ static inline int pskb_trim(struct sk_bu |
1499 | } |
1500 | |
1501 | /** |
1502 | + * pskb_trim_unique - remove end from a paged unique (not cloned) buffer |
1503 | + * @skb: buffer to alter |
1504 | + * @len: new length |
1505 | + * |
1506 | + * This is identical to pskb_trim except that the caller knows that |
1507 | + * the skb is not cloned so we should never get an error due to out- |
1508 | + * of-memory. |
1509 | + */ |
1510 | +static inline void pskb_trim_unique(struct sk_buff *skb, unsigned int len) |
1511 | +{ |
1512 | + int err = pskb_trim(skb, len); |
1513 | + BUG_ON(err); |
1514 | +} |
1515 | + |
1516 | +/** |
1517 | * skb_orphan - orphan a buffer |
1518 | * @skb: buffer to orphan |
1519 | * |
1520 | diff --git a/kernel/futex.c b/kernel/futex.c |
1521 | index 5699c51..225af28 100644 |
1522 | --- a/kernel/futex.c |
1523 | +++ b/kernel/futex.c |
1524 | @@ -593,6 +593,7 @@ static int unqueue_me(struct futex_q *q) |
1525 | /* In the common case we don't take the spinlock, which is nice. */ |
1526 | retry: |
1527 | lock_ptr = q->lock_ptr; |
1528 | + barrier(); |
1529 | if (lock_ptr != 0) { |
1530 | spin_lock(lock_ptr); |
1531 | /* |
1532 | diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c |
1533 | index dcfb5d7..51cacd1 100644 |
1534 | --- a/kernel/stop_machine.c |
1535 | +++ b/kernel/stop_machine.c |
1536 | @@ -111,7 +111,6 @@ static int stop_machine(void) |
1537 | /* If some failed, kill them all. */ |
1538 | if (ret < 0) { |
1539 | stopmachine_set_state(STOPMACHINE_EXIT); |
1540 | - up(&stopmachine_mutex); |
1541 | return ret; |
1542 | } |
1543 | |
1544 | diff --git a/lib/ts_bm.c b/lib/ts_bm.c |
1545 | index c4c1ac5..7917265 100644 |
1546 | --- a/lib/ts_bm.c |
1547 | +++ b/lib/ts_bm.c |
1548 | @@ -112,15 +112,14 @@ static int subpattern(u8 *pattern, int i |
1549 | return ret; |
1550 | } |
1551 | |
1552 | -static void compute_prefix_tbl(struct ts_bm *bm, const u8 *pattern, |
1553 | - unsigned int len) |
1554 | +static void compute_prefix_tbl(struct ts_bm *bm) |
1555 | { |
1556 | int i, j, g; |
1557 | |
1558 | for (i = 0; i < ASIZE; i++) |
1559 | - bm->bad_shift[i] = len; |
1560 | - for (i = 0; i < len - 1; i++) |
1561 | - bm->bad_shift[pattern[i]] = len - 1 - i; |
1562 | + bm->bad_shift[i] = bm->patlen; |
1563 | + for (i = 0; i < bm->patlen - 1; i++) |
1564 | + bm->bad_shift[bm->pattern[i]] = bm->patlen - 1 - i; |
1565 | |
1566 | /* Compute the good shift array, used to match reocurrences |
1567 | * of a subpattern */ |
1568 | @@ -151,8 +150,8 @@ static struct ts_config *bm_init(const v |
1569 | bm = ts_config_priv(conf); |
1570 | bm->patlen = len; |
1571 | bm->pattern = (u8 *) bm->good_shift + prefix_tbl_len; |
1572 | - compute_prefix_tbl(bm, pattern, len); |
1573 | memcpy(bm->pattern, pattern, len); |
1574 | + compute_prefix_tbl(bm); |
1575 | |
1576 | return conf; |
1577 | } |
1578 | diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c |
1579 | index 56f3aa4..ddb7e1c 100644 |
1580 | --- a/net/bridge/br_forward.c |
1581 | +++ b/net/bridge/br_forward.c |
1582 | @@ -43,11 +43,15 @@ int br_dev_queue_push_xmit(struct sk_buf |
1583 | else { |
1584 | #ifdef CONFIG_BRIDGE_NETFILTER |
1585 | /* ip_refrag calls ip_fragment, doesn't copy the MAC header. */ |
1586 | - nf_bridge_maybe_copy_header(skb); |
1587 | + if (nf_bridge_maybe_copy_header(skb)) |
1588 | + kfree_skb(skb); |
1589 | + else |
1590 | #endif |
1591 | - skb_push(skb, ETH_HLEN); |
1592 | + { |
1593 | + skb_push(skb, ETH_HLEN); |
1594 | |
1595 | - dev_queue_xmit(skb); |
1596 | + dev_queue_xmit(skb); |
1597 | + } |
1598 | } |
1599 | |
1600 | return 0; |
1601 | diff --git a/net/core/pktgen.c b/net/core/pktgen.c |
1602 | index c23e9c0..b916b7f 100644 |
1603 | --- a/net/core/pktgen.c |
1604 | +++ b/net/core/pktgen.c |
1605 | @@ -2149,6 +2149,8 @@ static struct sk_buff *fill_packet_ipv4( |
1606 | skb->mac.raw = ((u8 *) iph) - 14 - pkt_dev->nr_labels*sizeof(u32); |
1607 | skb->dev = odev; |
1608 | skb->pkt_type = PACKET_HOST; |
1609 | + skb->nh.iph = iph; |
1610 | + skb->h.uh = udph; |
1611 | |
1612 | if (pkt_dev->nfrags <= 0) |
1613 | pgh = (struct pktgen_hdr *)skb_put(skb, datalen); |
1614 | @@ -2460,6 +2462,8 @@ static struct sk_buff *fill_packet_ipv6( |
1615 | skb->protocol = protocol; |
1616 | skb->dev = odev; |
1617 | skb->pkt_type = PACKET_HOST; |
1618 | + skb->nh.ipv6h = iph; |
1619 | + skb->h.uh = udph; |
1620 | |
1621 | if (pkt_dev->nfrags <= 0) |
1622 | pgh = (struct pktgen_hdr *)skb_put(skb, datalen); |
1623 | diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c |
1624 | index cff9c3a..d987a27 100644 |
1625 | --- a/net/ipv4/ip_output.c |
1626 | +++ b/net/ipv4/ip_output.c |
1627 | @@ -946,7 +946,7 @@ alloc_new_skb: |
1628 | skb_prev->csum = csum_sub(skb_prev->csum, |
1629 | skb->csum); |
1630 | data += fraggap; |
1631 | - skb_trim(skb_prev, maxfraglen); |
1632 | + pskb_trim_unique(skb_prev, maxfraglen); |
1633 | } |
1634 | |
1635 | copy = datalen - transhdrlen - fraggap; |
1636 | @@ -1139,7 +1139,7 @@ ssize_t ip_append_page(struct sock *sk, |
1637 | data, fraggap, 0); |
1638 | skb_prev->csum = csum_sub(skb_prev->csum, |
1639 | skb->csum); |
1640 | - skb_trim(skb_prev, maxfraglen); |
1641 | + pskb_trim_unique(skb_prev, maxfraglen); |
1642 | } |
1643 | |
1644 | /* |
1645 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c |
1646 | index f33c9dd..e0657b9 100644 |
1647 | --- a/net/ipv4/tcp_output.c |
1648 | +++ b/net/ipv4/tcp_output.c |
1649 | @@ -197,6 +197,7 @@ void tcp_select_initial_window(int __spa |
1650 | * See RFC1323 for an explanation of the limit to 14 |
1651 | */ |
1652 | space = max_t(u32, sysctl_tcp_rmem[2], sysctl_rmem_max); |
1653 | + space = min_t(u32, space, *window_clamp); |
1654 | while (space > 65535 && (*rcv_wscale) < 14) { |
1655 | space >>= 1; |
1656 | (*rcv_wscale)++; |
1657 | diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c |
1658 | index a18d425..9ca783d 100644 |
1659 | --- a/net/ipv6/exthdrs.c |
1660 | +++ b/net/ipv6/exthdrs.c |
1661 | @@ -635,14 +635,17 @@ ipv6_renew_options(struct sock *sk, stru |
1662 | struct ipv6_txoptions *opt2; |
1663 | int err; |
1664 | |
1665 | - if (newtype != IPV6_HOPOPTS && opt->hopopt) |
1666 | - tot_len += CMSG_ALIGN(ipv6_optlen(opt->hopopt)); |
1667 | - if (newtype != IPV6_RTHDRDSTOPTS && opt->dst0opt) |
1668 | - tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst0opt)); |
1669 | - if (newtype != IPV6_RTHDR && opt->srcrt) |
1670 | - tot_len += CMSG_ALIGN(ipv6_optlen(opt->srcrt)); |
1671 | - if (newtype != IPV6_DSTOPTS && opt->dst1opt) |
1672 | - tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst1opt)); |
1673 | + if (opt) { |
1674 | + if (newtype != IPV6_HOPOPTS && opt->hopopt) |
1675 | + tot_len += CMSG_ALIGN(ipv6_optlen(opt->hopopt)); |
1676 | + if (newtype != IPV6_RTHDRDSTOPTS && opt->dst0opt) |
1677 | + tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst0opt)); |
1678 | + if (newtype != IPV6_RTHDR && opt->srcrt) |
1679 | + tot_len += CMSG_ALIGN(ipv6_optlen(opt->srcrt)); |
1680 | + if (newtype != IPV6_DSTOPTS && opt->dst1opt) |
1681 | + tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst1opt)); |
1682 | + } |
1683 | + |
1684 | if (newopt && newoptlen) |
1685 | tot_len += CMSG_ALIGN(newoptlen); |
1686 | |
1687 | @@ -659,25 +662,25 @@ ipv6_renew_options(struct sock *sk, stru |
1688 | opt2->tot_len = tot_len; |
1689 | p = (char *)(opt2 + 1); |
1690 | |
1691 | - err = ipv6_renew_option(opt->hopopt, newopt, newoptlen, |
1692 | + err = ipv6_renew_option(opt ? opt->hopopt : NULL, newopt, newoptlen, |
1693 | newtype != IPV6_HOPOPTS, |
1694 | &opt2->hopopt, &p); |
1695 | if (err) |
1696 | goto out; |
1697 | |
1698 | - err = ipv6_renew_option(opt->dst0opt, newopt, newoptlen, |
1699 | + err = ipv6_renew_option(opt ? opt->dst0opt : NULL, newopt, newoptlen, |
1700 | newtype != IPV6_RTHDRDSTOPTS, |
1701 | &opt2->dst0opt, &p); |
1702 | if (err) |
1703 | goto out; |
1704 | |
1705 | - err = ipv6_renew_option(opt->srcrt, newopt, newoptlen, |
1706 | + err = ipv6_renew_option(opt ? opt->srcrt : NULL, newopt, newoptlen, |
1707 | newtype != IPV6_RTHDR, |
1708 | - (struct ipv6_opt_hdr **)opt2->srcrt, &p); |
1709 | + (struct ipv6_opt_hdr **)&opt2->srcrt, &p); |
1710 | if (err) |
1711 | goto out; |
1712 | |
1713 | - err = ipv6_renew_option(opt->dst1opt, newopt, newoptlen, |
1714 | + err = ipv6_renew_option(opt ? opt->dst1opt : NULL, newopt, newoptlen, |
1715 | newtype != IPV6_DSTOPTS, |
1716 | &opt2->dst1opt, &p); |
1717 | if (err) |
1718 | diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c |
1719 | index e460489..56eddb3 100644 |
1720 | --- a/net/ipv6/ip6_output.c |
1721 | +++ b/net/ipv6/ip6_output.c |
1722 | @@ -1047,7 +1047,7 @@ alloc_new_skb: |
1723 | skb_prev->csum = csum_sub(skb_prev->csum, |
1724 | skb->csum); |
1725 | data += fraggap; |
1726 | - skb_trim(skb_prev, maxfraglen); |
1727 | + pskb_trim_unique(skb_prev, maxfraglen); |
1728 | } |
1729 | copy = datalen - transhdrlen - fraggap; |
1730 | if (copy < 0) { |
1731 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c |
1732 | index 600eb59..5b1c837 100644 |
1733 | --- a/net/sctp/socket.c |
1734 | +++ b/net/sctp/socket.c |
1735 | @@ -1246,9 +1246,13 @@ SCTP_STATIC void sctp_close(struct sock |
1736 | } |
1737 | } |
1738 | |
1739 | - if (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime) |
1740 | - sctp_primitive_ABORT(asoc, NULL); |
1741 | - else |
1742 | + if (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime) { |
1743 | + struct sctp_chunk *chunk; |
1744 | + |
1745 | + chunk = sctp_make_abort_user(asoc, NULL, 0); |
1746 | + if (chunk) |
1747 | + sctp_primitive_ABORT(asoc, chunk); |
1748 | + } else |
1749 | sctp_primitive_SHUTDOWN(asoc, NULL); |
1750 | } |
1751 |