Annotation of /trunk/kernel26-alx/patches-2.6.27-r3/0138-2.6.27.39-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: 27741 byte(s)
Thu Oct 14 15:11:06 2010 UTC (13 years, 11 months ago) by niro
File size: 27741 byte(s)
-2.6.27-alx-r3: new magellan 0.5.2 kernel
1 | niro | 1176 | diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig |
2 | index 8c5e1de..5b1ccc2 100644 | ||
3 | --- a/arch/m68k/Kconfig | ||
4 | +++ b/arch/m68k/Kconfig | ||
5 | @@ -572,7 +572,7 @@ config HPAPCI | ||
6 | |||
7 | config MVME147_SCC | ||
8 | bool "SCC support for MVME147 serial ports" | ||
9 | - depends on MVME147 | ||
10 | + depends on MVME147 && BROKEN | ||
11 | help | ||
12 | This is the driver for the serial ports on the Motorola MVME147 | ||
13 | boards. Everyone using one of these boards should say Y here. | ||
14 | @@ -587,14 +587,14 @@ config SERIAL167 | ||
15 | |||
16 | config MVME162_SCC | ||
17 | bool "SCC support for MVME162 serial ports" | ||
18 | - depends on MVME16x | ||
19 | + depends on MVME16x && BROKEN | ||
20 | help | ||
21 | This is the driver for the serial ports on the Motorola MVME162 and | ||
22 | 172 boards. Everyone using one of these boards should say Y here. | ||
23 | |||
24 | config BVME6000_SCC | ||
25 | bool "SCC support for BVME6000 serial ports" | ||
26 | - depends on BVME6000 | ||
27 | + depends on BVME6000 && BROKEN | ||
28 | help | ||
29 | This is the driver for the serial ports on the BVME4000 and BVME6000 | ||
30 | boards from BVM Ltd. Everyone using one of these boards should say | ||
31 | diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S | ||
32 | index 09b59b2..5d7f4af 100644 | ||
33 | --- a/arch/x86/ia32/ia32entry.S | ||
34 | +++ b/arch/x86/ia32/ia32entry.S | ||
35 | @@ -204,7 +204,7 @@ sysexit_from_sys_call: | ||
36 | movl RDI-ARGOFFSET(%rsp),%r8d /* reload 5th syscall arg */ | ||
37 | .endm | ||
38 | |||
39 | - .macro auditsys_exit exit,ebpsave=RBP | ||
40 | + .macro auditsys_exit exit | ||
41 | testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10) | ||
42 | jnz ia32_ret_from_sys_call | ||
43 | TRACE_IRQS_ON | ||
44 | @@ -217,7 +217,6 @@ sysexit_from_sys_call: | ||
45 | call audit_syscall_exit | ||
46 | GET_THREAD_INFO(%r10) | ||
47 | movl RAX-ARGOFFSET(%rsp),%eax /* reload syscall return value */ | ||
48 | - movl \ebpsave-ARGOFFSET(%rsp),%ebp /* reload user register value */ | ||
49 | movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi | ||
50 | cli | ||
51 | TRACE_IRQS_OFF | ||
52 | @@ -351,7 +350,7 @@ cstar_auditsys: | ||
53 | jmp cstar_dispatch | ||
54 | |||
55 | sysretl_audit: | ||
56 | - auditsys_exit sysretl_from_sys_call, RCX /* user %ebp in RCX slot */ | ||
57 | + auditsys_exit sysretl_from_sys_call | ||
58 | #endif | ||
59 | |||
60 | cstar_tracesys: | ||
61 | diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c | ||
62 | index 923e682..7d58f32 100644 | ||
63 | --- a/arch/x86/kernel/amd_iommu_init.c | ||
64 | +++ b/arch/x86/kernel/amd_iommu_init.c | ||
65 | @@ -230,7 +230,7 @@ static void __init iommu_feature_enable(struct amd_iommu *iommu, u8 bit) | ||
66 | writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET); | ||
67 | } | ||
68 | |||
69 | -static void __init iommu_feature_disable(struct amd_iommu *iommu, u8 bit) | ||
70 | +static void iommu_feature_disable(struct amd_iommu *iommu, u8 bit) | ||
71 | { | ||
72 | u32 ctrl; | ||
73 | |||
74 | @@ -430,6 +430,27 @@ static void set_dev_entry_bit(u16 devid, u8 bit) | ||
75 | amd_iommu_dev_table[devid].data[i] |= (1 << _bit); | ||
76 | } | ||
77 | |||
78 | +static int get_dev_entry_bit(u16 devid, u8 bit) | ||
79 | +{ | ||
80 | + int i = (bit >> 5) & 0x07; | ||
81 | + int _bit = bit & 0x1f; | ||
82 | + | ||
83 | + return (amd_iommu_dev_table[devid].data[i] & (1 << _bit)) >> _bit; | ||
84 | +} | ||
85 | + | ||
86 | + | ||
87 | +void amd_iommu_apply_erratum_63(u16 devid) | ||
88 | +{ | ||
89 | + int sysmgt; | ||
90 | + | ||
91 | + sysmgt = get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT1) | | ||
92 | + (get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT2) << 1); | ||
93 | + | ||
94 | + if (sysmgt == 0x01) | ||
95 | + set_dev_entry_bit(devid, DEV_ENTRY_IW); | ||
96 | +} | ||
97 | + | ||
98 | + | ||
99 | /* Writes the specific IOMMU for a device into the rlookup table */ | ||
100 | static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid) | ||
101 | { | ||
102 | @@ -458,6 +479,8 @@ static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu, | ||
103 | if (flags & ACPI_DEVFLAG_LINT1) | ||
104 | set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS); | ||
105 | |||
106 | + amd_iommu_apply_erratum_63(devid); | ||
107 | + | ||
108 | set_iommu_for_device(iommu, devid); | ||
109 | } | ||
110 | |||
111 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | ||
112 | index 60ebfd7..bf872f2 100644 | ||
113 | --- a/arch/x86/kvm/x86.c | ||
114 | +++ b/arch/x86/kvm/x86.c | ||
115 | @@ -1223,6 +1223,8 @@ static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, | ||
116 | |||
117 | if (cpuid->nent < 1) | ||
118 | goto out; | ||
119 | + if (cpuid->nent > KVM_MAX_CPUID_ENTRIES) | ||
120 | + cpuid->nent = KVM_MAX_CPUID_ENTRIES; | ||
121 | r = -ENOMEM; | ||
122 | cpuid_entries = vmalloc(sizeof(struct kvm_cpuid_entry2) * cpuid->nent); | ||
123 | if (!cpuid_entries) | ||
124 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c | ||
125 | index afa66f4..0450761 100644 | ||
126 | --- a/drivers/acpi/scan.c | ||
127 | +++ b/drivers/acpi/scan.c | ||
128 | @@ -1262,16 +1262,6 @@ acpi_add_single_object(struct acpi_device **child, | ||
129 | acpi_device_set_id(device, parent, handle, type); | ||
130 | |||
131 | /* | ||
132 | - * The ACPI device is attached to acpi handle before getting | ||
133 | - * the power/wakeup/peformance flags. Otherwise OS can't get | ||
134 | - * the corresponding ACPI device by the acpi handle in the course | ||
135 | - * of getting the power/wakeup/performance flags. | ||
136 | - */ | ||
137 | - result = acpi_device_set_context(device, type); | ||
138 | - if (result) | ||
139 | - goto end; | ||
140 | - | ||
141 | - /* | ||
142 | * Power Management | ||
143 | * ---------------- | ||
144 | */ | ||
145 | @@ -1301,6 +1291,8 @@ acpi_add_single_object(struct acpi_device **child, | ||
146 | goto end; | ||
147 | } | ||
148 | |||
149 | + if ((result = acpi_device_set_context(device, type))) | ||
150 | + goto end; | ||
151 | |||
152 | result = acpi_device_register(device, parent); | ||
153 | |||
154 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c | ||
155 | index 5cdd821..8afc274 100644 | ||
156 | --- a/drivers/ata/libata-core.c | ||
157 | +++ b/drivers/ata/libata-core.c | ||
158 | @@ -4747,12 +4747,14 @@ void ata_qc_complete(struct ata_queued_cmd *qc) | ||
159 | qc->flags |= ATA_QCFLAG_FAILED; | ||
160 | |||
161 | if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) { | ||
162 | - if (!ata_tag_internal(qc->tag)) { | ||
163 | - /* always fill result TF for failed qc */ | ||
164 | - fill_result_tf(qc); | ||
165 | + /* always fill result TF for failed qc */ | ||
166 | + fill_result_tf(qc); | ||
167 | + | ||
168 | + if (!ata_tag_internal(qc->tag)) | ||
169 | ata_qc_schedule_eh(qc); | ||
170 | - return; | ||
171 | - } | ||
172 | + else | ||
173 | + __ata_qc_complete(qc); | ||
174 | + return; | ||
175 | } | ||
176 | |||
177 | /* read result TF if requested */ | ||
178 | diff --git a/drivers/base/driver.c b/drivers/base/driver.c | ||
179 | index 1e2bda7..296d833 100644 | ||
180 | --- a/drivers/base/driver.c | ||
181 | +++ b/drivers/base/driver.c | ||
182 | @@ -227,7 +227,7 @@ int driver_register(struct device_driver *drv) | ||
183 | put_driver(other); | ||
184 | printk(KERN_ERR "Error: Driver '%s' is already registered, " | ||
185 | "aborting...\n", drv->name); | ||
186 | - return -EEXIST; | ||
187 | + return -EBUSY; | ||
188 | } | ||
189 | |||
190 | ret = bus_add_driver(drv); | ||
191 | diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig | ||
192 | index caff851..8b91700 100644 | ||
193 | --- a/drivers/char/Kconfig | ||
194 | +++ b/drivers/char/Kconfig | ||
195 | @@ -310,7 +310,7 @@ config SPECIALIX | ||
196 | |||
197 | config SX | ||
198 | tristate "Specialix SX (and SI) card support" | ||
199 | - depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) | ||
200 | + depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) && BROKEN | ||
201 | help | ||
202 | This is a driver for the SX and SI multiport serial cards. | ||
203 | Please read the file <file:Documentation/sx.txt> for details. | ||
204 | @@ -321,7 +321,7 @@ config SX | ||
205 | |||
206 | config RIO | ||
207 | tristate "Specialix RIO system support" | ||
208 | - depends on SERIAL_NONSTANDARD | ||
209 | + depends on SERIAL_NONSTANDARD && BROKEN | ||
210 | help | ||
211 | This is a driver for the Specialix RIO, a smart serial card which | ||
212 | drives an outboard box that can support up to 128 ports. Product | ||
213 | @@ -382,7 +382,7 @@ config NOZOMI | ||
214 | |||
215 | config A2232 | ||
216 | tristate "Commodore A2232 serial support (EXPERIMENTAL)" | ||
217 | - depends on EXPERIMENTAL && ZORRO && BROKEN_ON_SMP | ||
218 | + depends on EXPERIMENTAL && ZORRO && BROKEN | ||
219 | ---help--- | ||
220 | This option supports the 2232 7-port serial card shipped with the | ||
221 | Amiga 2000 and other Zorro-bus machines, dating from 1989. At | ||
222 | diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c | ||
223 | index d349c4a..6bb5157 100644 | ||
224 | --- a/drivers/input/mouse/synaptics.c | ||
225 | +++ b/drivers/input/mouse/synaptics.c | ||
226 | @@ -623,6 +623,16 @@ static const struct dmi_system_id toshiba_dmi_table[] = { | ||
227 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
228 | DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M300"), | ||
229 | }, | ||
230 | + | ||
231 | + }, | ||
232 | + { | ||
233 | + .ident = "Toshiba Portege M300", | ||
234 | + .matches = { | ||
235 | + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
236 | + DMI_MATCH(DMI_PRODUCT_NAME, "Portable PC"), | ||
237 | + DMI_MATCH(DMI_PRODUCT_VERSION, "Version 1.0"), | ||
238 | + }, | ||
239 | + | ||
240 | }, | ||
241 | { } | ||
242 | }; | ||
243 | diff --git a/drivers/net/appletalk/ipddp.c b/drivers/net/appletalk/ipddp.c | ||
244 | index 1071144..6d0107c 100644 | ||
245 | --- a/drivers/net/appletalk/ipddp.c | ||
246 | +++ b/drivers/net/appletalk/ipddp.c | ||
247 | @@ -173,8 +173,7 @@ static int ipddp_xmit(struct sk_buff *skb, struct net_device *dev) | ||
248 | ((struct net_device_stats *) dev->priv)->tx_packets++; | ||
249 | ((struct net_device_stats *) dev->priv)->tx_bytes+=skb->len; | ||
250 | |||
251 | - if(aarp_send_ddp(rt->dev, skb, &rt->at, NULL) < 0) | ||
252 | - dev_kfree_skb(skb); | ||
253 | + aarp_send_ddp(rt->dev, skb, &rt->at, NULL); | ||
254 | |||
255 | return 0; | ||
256 | } | ||
257 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c | ||
258 | index f9f29c9..5a07b50 100644 | ||
259 | --- a/drivers/net/bonding/bond_main.c | ||
260 | +++ b/drivers/net/bonding/bond_main.c | ||
261 | @@ -686,7 +686,7 @@ static int bond_update_speed_duplex(struct slave *slave) | ||
262 | */ | ||
263 | static int bond_check_dev_link(struct bonding *bond, struct net_device *slave_dev, int reporting) | ||
264 | { | ||
265 | - static int (* ioctl)(struct net_device *, struct ifreq *, int); | ||
266 | + int (* ioctl)(struct net_device *, struct ifreq *, int); | ||
267 | struct ifreq ifr; | ||
268 | struct mii_ioctl_data *mii; | ||
269 | |||
270 | diff --git a/drivers/net/wireless/b43/rfkill.c b/drivers/net/wireless/b43/rfkill.c | ||
271 | index 34ae125..f9c355e 100644 | ||
272 | --- a/drivers/net/wireless/b43/rfkill.c | ||
273 | +++ b/drivers/net/wireless/b43/rfkill.c | ||
274 | @@ -36,7 +36,8 @@ static bool b43_is_hw_radio_enabled(struct b43_wldev *dev) | ||
275 | & B43_MMIO_RADIO_HWENABLED_HI_MASK)) | ||
276 | return 1; | ||
277 | } else { | ||
278 | - if (b43_read16(dev, B43_MMIO_RADIO_HWENABLED_LO) | ||
279 | + if (b43_status(dev) >= B43_STAT_STARTED && | ||
280 | + b43_read16(dev, B43_MMIO_RADIO_HWENABLED_LO) | ||
281 | & B43_MMIO_RADIO_HWENABLED_LO_MASK) | ||
282 | return 1; | ||
283 | } | ||
284 | diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c | ||
285 | index 632c291..5e37c2f 100644 | ||
286 | --- a/drivers/net/wireless/libertas/if_usb.c | ||
287 | +++ b/drivers/net/wireless/libertas/if_usb.c | ||
288 | @@ -443,7 +443,7 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp, | ||
289 | /* Fill the receive configuration URB and initialise the Rx call back */ | ||
290 | usb_fill_bulk_urb(cardp->rx_urb, cardp->udev, | ||
291 | usb_rcvbulkpipe(cardp->udev, cardp->ep_in), | ||
292 | - (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET), | ||
293 | + skb->data + IPFIELD_ALIGN_OFFSET, | ||
294 | MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, | ||
295 | cardp); | ||
296 | |||
297 | diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c | ||
298 | index 963960d..eef4e86 100644 | ||
299 | --- a/drivers/net/wireless/ray_cs.c | ||
300 | +++ b/drivers/net/wireless/ray_cs.c | ||
301 | @@ -2758,7 +2758,7 @@ static void raycs_write(const char *name, write_proc_t *w, void *data) | ||
302 | static int write_essid(struct file *file, const char __user *buffer, unsigned long count, void *data) | ||
303 | { | ||
304 | static char proc_essid[33]; | ||
305 | - int len = count; | ||
306 | + unsigned int len = count; | ||
307 | |||
308 | if (len > 32) | ||
309 | len = 32; | ||
310 | diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c | ||
311 | index 7716145..b38fe67 100644 | ||
312 | --- a/drivers/scsi/dpt_i2o.c | ||
313 | +++ b/drivers/scsi/dpt_i2o.c | ||
314 | @@ -1918,6 +1918,10 @@ static int adpt_i2o_passthru(adpt_hba* pHba, u32 __user *arg) | ||
315 | } | ||
316 | size = size>>16; | ||
317 | size *= 4; | ||
318 | + if (size > MAX_MESSAGE_SIZE) { | ||
319 | + rcode = -EINVAL; | ||
320 | + goto cleanup; | ||
321 | + } | ||
322 | /* Copy in the user's I2O command */ | ||
323 | if (copy_from_user (msg, user_msg, size)) { | ||
324 | rcode = -EFAULT; | ||
325 | diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c | ||
326 | index 9f72ad7..3a56f92 100644 | ||
327 | --- a/drivers/serial/8250_pci.c | ||
328 | +++ b/drivers/serial/8250_pci.c | ||
329 | @@ -1218,6 +1218,7 @@ enum pci_board_num_t { | ||
330 | pbn_exar_XR17C152, | ||
331 | pbn_exar_XR17C154, | ||
332 | pbn_exar_XR17C158, | ||
333 | + pbn_exar_ibm_saturn, | ||
334 | pbn_pasemi_1682M, | ||
335 | }; | ||
336 | |||
337 | @@ -1746,6 +1747,13 @@ static struct pciserial_board pci_boards[] __devinitdata = { | ||
338 | .base_baud = 921600, | ||
339 | .uart_offset = 0x200, | ||
340 | }, | ||
341 | + [pbn_exar_ibm_saturn] = { | ||
342 | + .flags = FL_BASE0, | ||
343 | + .num_ports = 1, | ||
344 | + .base_baud = 921600, | ||
345 | + .uart_offset = 0x200, | ||
346 | + }, | ||
347 | + | ||
348 | /* | ||
349 | * PA Semi PWRficient PA6T-1682M on-chip UART | ||
350 | */ | ||
351 | @@ -2217,6 +2225,9 @@ static struct pci_device_id serial_pci_tbl[] = { | ||
352 | PCI_SUBVENDOR_ID_CONNECT_TECH, | ||
353 | PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_485, 0, 0, | ||
354 | pbn_b0_8_1843200_200 }, | ||
355 | + { PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17C152, | ||
356 | + PCI_VENDOR_ID_IBM, PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT, | ||
357 | + 0, 0, pbn_exar_ibm_saturn }, | ||
358 | |||
359 | { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_U530, | ||
360 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
361 | diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c | ||
362 | index 175d08e..bed78ac 100644 | ||
363 | --- a/fs/hfsplus/wrapper.c | ||
364 | +++ b/fs/hfsplus/wrapper.c | ||
365 | @@ -99,6 +99,10 @@ int hfsplus_read_wrapper(struct super_block *sb) | ||
366 | |||
367 | if (hfsplus_get_last_session(sb, &part_start, &part_size)) | ||
368 | return -EINVAL; | ||
369 | + if ((u64)part_start + part_size > 0x100000000ULL) { | ||
370 | + pr_err("hfs: volumes larger than 2TB are not supported yet\n"); | ||
371 | + return -EINVAL; | ||
372 | + } | ||
373 | while (1) { | ||
374 | bh = sb_bread512(sb, part_start + HFSPLUS_VOLHEAD_SECTOR, vhdr); | ||
375 | if (!bh) | ||
376 | diff --git a/fs/nfs/client.c b/fs/nfs/client.c | ||
377 | index 5ee23e7..9d6a0e4 100644 | ||
378 | --- a/fs/nfs/client.c | ||
379 | +++ b/fs/nfs/client.c | ||
380 | @@ -983,7 +983,7 @@ static int nfs4_init_client(struct nfs_client *clp, | ||
381 | RPC_CLNT_CREATE_DISCRTRY); | ||
382 | if (error < 0) | ||
383 | goto error; | ||
384 | - memcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr)); | ||
385 | + strlcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr)); | ||
386 | |||
387 | error = nfs_idmap_new(clp); | ||
388 | if (error < 0) { | ||
389 | diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c | ||
390 | index c3fe156..e195f67 100644 | ||
391 | --- a/fs/nfs/dir.c | ||
392 | +++ b/fs/nfs/dir.c | ||
393 | @@ -1014,12 +1014,12 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry | ||
394 | res = NULL; | ||
395 | goto out; | ||
396 | /* This turned out not to be a regular file */ | ||
397 | - case -EISDIR: | ||
398 | case -ENOTDIR: | ||
399 | goto no_open; | ||
400 | case -ELOOP: | ||
401 | if (!(nd->intent.open.flags & O_NOFOLLOW)) | ||
402 | goto no_open; | ||
403 | + /* case -EISDIR: */ | ||
404 | /* case -EINVAL: */ | ||
405 | default: | ||
406 | goto out; | ||
407 | @@ -1526,6 +1526,8 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) | ||
408 | old_dentry->d_parent->d_name.name, old_dentry->d_name.name, | ||
409 | dentry->d_parent->d_name.name, dentry->d_name.name); | ||
410 | |||
411 | + nfs_inode_return_delegation(inode); | ||
412 | + | ||
413 | d_drop(dentry); | ||
414 | error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name); | ||
415 | if (error == 0) { | ||
416 | diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c | ||
417 | index 630feb3..8a5c1d5 100644 | ||
418 | --- a/fs/nfs/direct.c | ||
419 | +++ b/fs/nfs/direct.c | ||
420 | @@ -454,6 +454,7 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq) | ||
421 | }; | ||
422 | struct rpc_task_setup task_setup_data = { | ||
423 | .rpc_client = NFS_CLIENT(inode), | ||
424 | + .rpc_message = &msg, | ||
425 | .callback_ops = &nfs_write_direct_ops, | ||
426 | .workqueue = nfsiod_workqueue, | ||
427 | .flags = RPC_TASK_ASYNC, | ||
428 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c | ||
429 | index c910413..ad4e800 100644 | ||
430 | --- a/fs/nfs/nfs4proc.c | ||
431 | +++ b/fs/nfs/nfs4proc.c | ||
432 | @@ -71,12 +71,17 @@ static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, | ||
433 | /* Prevent leaks of NFSv4 errors into userland */ | ||
434 | int nfs4_map_errors(int err) | ||
435 | { | ||
436 | - if (err < -1000) { | ||
437 | + if (err >= -1000) | ||
438 | + return err; | ||
439 | + switch (err) { | ||
440 | + case -NFS4ERR_RESOURCE: | ||
441 | + return -EREMOTEIO; | ||
442 | + default: | ||
443 | dprintk("%s could not handle NFSv4 error %d\n", | ||
444 | __func__, -err); | ||
445 | - return -EIO; | ||
446 | + break; | ||
447 | } | ||
448 | - return err; | ||
449 | + return -EIO; | ||
450 | } | ||
451 | |||
452 | /* | ||
453 | @@ -3550,15 +3555,23 @@ nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request) | ||
454 | if (request->fl_start < 0 || request->fl_end < 0) | ||
455 | return -EINVAL; | ||
456 | |||
457 | - if (IS_GETLK(cmd)) | ||
458 | - return nfs4_proc_getlk(state, F_GETLK, request); | ||
459 | + if (IS_GETLK(cmd)) { | ||
460 | + if (state != NULL) | ||
461 | + return nfs4_proc_getlk(state, F_GETLK, request); | ||
462 | + return 0; | ||
463 | + } | ||
464 | |||
465 | if (!(IS_SETLK(cmd) || IS_SETLKW(cmd))) | ||
466 | return -EINVAL; | ||
467 | |||
468 | - if (request->fl_type == F_UNLCK) | ||
469 | - return nfs4_proc_unlck(state, cmd, request); | ||
470 | + if (request->fl_type == F_UNLCK) { | ||
471 | + if (state != NULL) | ||
472 | + return nfs4_proc_unlck(state, cmd, request); | ||
473 | + return 0; | ||
474 | + } | ||
475 | |||
476 | + if (state == NULL) | ||
477 | + return -ENOLCK; | ||
478 | do { | ||
479 | status = nfs4_proc_setlk(state, cmd, request); | ||
480 | if ((status != -EAGAIN) || IS_SETLK(cmd)) | ||
481 | diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c | ||
482 | index 3305acb..6ede673 100644 | ||
483 | --- a/fs/nfs/nfs4renewd.c | ||
484 | +++ b/fs/nfs/nfs4renewd.c | ||
485 | @@ -125,12 +125,6 @@ nfs4_schedule_state_renewal(struct nfs_client *clp) | ||
486 | } | ||
487 | |||
488 | void | ||
489 | -nfs4_renewd_prepare_shutdown(struct nfs_server *server) | ||
490 | -{ | ||
491 | - cancel_delayed_work(&server->nfs_client->cl_renewd); | ||
492 | -} | ||
493 | - | ||
494 | -void | ||
495 | nfs4_kill_renewd(struct nfs_client *clp) | ||
496 | { | ||
497 | cancel_delayed_work_sync(&clp->cl_renewd); | ||
498 | diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c | ||
499 | index b916297..5e26759 100644 | ||
500 | --- a/fs/nfs/nfs4xdr.c | ||
501 | +++ b/fs/nfs/nfs4xdr.c | ||
502 | @@ -4671,7 +4671,6 @@ static struct { | ||
503 | { NFS4ERR_SERVERFAULT, -ESERVERFAULT }, | ||
504 | { NFS4ERR_BADTYPE, -EBADTYPE }, | ||
505 | { NFS4ERR_LOCKED, -EAGAIN }, | ||
506 | - { NFS4ERR_RESOURCE, -EREMOTEIO }, | ||
507 | { NFS4ERR_SYMLINK, -ELOOP }, | ||
508 | { NFS4ERR_OP_ILLEGAL, -EOPNOTSUPP }, | ||
509 | { NFS4ERR_DEADLOCK, -EDEADLK }, | ||
510 | diff --git a/fs/nfs/super.c b/fs/nfs/super.c | ||
511 | index e9b2017..3da0fa5 100644 | ||
512 | --- a/fs/nfs/super.c | ||
513 | +++ b/fs/nfs/super.c | ||
514 | @@ -2398,7 +2398,6 @@ static void nfs4_kill_super(struct super_block *sb) | ||
515 | nfs_return_all_delegations(sb); | ||
516 | kill_anon_super(sb); | ||
517 | |||
518 | - nfs4_renewd_prepare_shutdown(server); | ||
519 | nfs_free_server(server); | ||
520 | } | ||
521 | |||
522 | diff --git a/fs/pipe.c b/fs/pipe.c | ||
523 | index 35d2cbb..f91375f 100644 | ||
524 | --- a/fs/pipe.c | ||
525 | +++ b/fs/pipe.c | ||
526 | @@ -742,36 +742,55 @@ pipe_rdwr_release(struct inode *inode, struct file *filp) | ||
527 | static int | ||
528 | pipe_read_open(struct inode *inode, struct file *filp) | ||
529 | { | ||
530 | - /* We could have perhaps used atomic_t, but this and friends | ||
531 | - below are the only places. So it doesn't seem worthwhile. */ | ||
532 | + int ret = -ENOENT; | ||
533 | + | ||
534 | mutex_lock(&inode->i_mutex); | ||
535 | - inode->i_pipe->readers++; | ||
536 | + | ||
537 | + if (inode->i_pipe) { | ||
538 | + ret = 0; | ||
539 | + inode->i_pipe->readers++; | ||
540 | + } | ||
541 | + | ||
542 | mutex_unlock(&inode->i_mutex); | ||
543 | |||
544 | - return 0; | ||
545 | + return ret; | ||
546 | } | ||
547 | |||
548 | static int | ||
549 | pipe_write_open(struct inode *inode, struct file *filp) | ||
550 | { | ||
551 | + int ret = -ENOENT; | ||
552 | + | ||
553 | mutex_lock(&inode->i_mutex); | ||
554 | - inode->i_pipe->writers++; | ||
555 | + | ||
556 | + if (inode->i_pipe) { | ||
557 | + ret = 0; | ||
558 | + inode->i_pipe->writers++; | ||
559 | + } | ||
560 | + | ||
561 | mutex_unlock(&inode->i_mutex); | ||
562 | |||
563 | - return 0; | ||
564 | + return ret; | ||
565 | } | ||
566 | |||
567 | static int | ||
568 | pipe_rdwr_open(struct inode *inode, struct file *filp) | ||
569 | { | ||
570 | + int ret = -ENOENT; | ||
571 | + | ||
572 | mutex_lock(&inode->i_mutex); | ||
573 | - if (filp->f_mode & FMODE_READ) | ||
574 | - inode->i_pipe->readers++; | ||
575 | - if (filp->f_mode & FMODE_WRITE) | ||
576 | - inode->i_pipe->writers++; | ||
577 | + | ||
578 | + if (inode->i_pipe) { | ||
579 | + ret = 0; | ||
580 | + if (filp->f_mode & FMODE_READ) | ||
581 | + inode->i_pipe->readers++; | ||
582 | + if (filp->f_mode & FMODE_WRITE) | ||
583 | + inode->i_pipe->writers++; | ||
584 | + } | ||
585 | + | ||
586 | mutex_unlock(&inode->i_mutex); | ||
587 | |||
588 | - return 0; | ||
589 | + return ret; | ||
590 | } | ||
591 | |||
592 | /* | ||
593 | diff --git a/include/linux/kernel.h b/include/linux/kernel.h | ||
594 | index 2651f80..cd85f00 100644 | ||
595 | --- a/include/linux/kernel.h | ||
596 | +++ b/include/linux/kernel.h | ||
597 | @@ -200,6 +200,8 @@ extern struct ratelimit_state printk_ratelimit_state; | ||
598 | extern int printk_ratelimit(void); | ||
599 | extern bool printk_timed_ratelimit(unsigned long *caller_jiffies, | ||
600 | unsigned int interval_msec); | ||
601 | +extern void printk_tick(void); | ||
602 | +extern int printk_needs_cpu(int); | ||
603 | #else | ||
604 | static inline int vprintk(const char *s, va_list args) | ||
605 | __attribute__ ((format (printf, 1, 0))); | ||
606 | @@ -211,6 +213,8 @@ static inline int printk_ratelimit(void) { return 0; } | ||
607 | static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies, \ | ||
608 | unsigned int interval_msec) \ | ||
609 | { return false; } | ||
610 | +static inline void printk_tick(void) { } | ||
611 | +static inline int printk_needs_cpu(int) { return 0; } | ||
612 | #endif | ||
613 | |||
614 | extern void asmlinkage __attribute__((format(printf, 1, 2))) | ||
615 | diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h | ||
616 | index ba91fe1..c869aee 100644 | ||
617 | --- a/include/linux/pci_ids.h | ||
618 | +++ b/include/linux/pci_ids.h | ||
619 | @@ -478,6 +478,9 @@ | ||
620 | #define PCI_DEVICE_ID_IBM_ICOM_V2_ONE_PORT_RVX_ONE_PORT_MDM_PCIE 0x0361 | ||
621 | #define PCI_DEVICE_ID_IBM_ICOM_FOUR_PORT_MODEL 0x252 | ||
622 | |||
623 | +#define PCI_SUBVENDOR_ID_IBM 0x1014 | ||
624 | +#define PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT 0x03d4 | ||
625 | + | ||
626 | #define PCI_VENDOR_ID_UNISYS 0x1018 | ||
627 | #define PCI_DEVICE_ID_UNISYS_DMA_DIRECTOR 0x001C | ||
628 | |||
629 | diff --git a/include/net/irda/irda_device.h b/include/net/irda/irda_device.h | ||
630 | index 3025ae1..94c852d 100644 | ||
631 | --- a/include/net/irda/irda_device.h | ||
632 | +++ b/include/net/irda/irda_device.h | ||
633 | @@ -135,9 +135,11 @@ struct dongle_reg { | ||
634 | |||
635 | /* | ||
636 | * Per-packet information we need to hide inside sk_buff | ||
637 | - * (must not exceed 48 bytes, check with struct sk_buff) | ||
638 | + * (must not exceed 48 bytes, check with struct sk_buff) | ||
639 | + * The default_qdisc_pad field is a temporary hack. | ||
640 | */ | ||
641 | struct irda_skb_cb { | ||
642 | + unsigned int default_qdisc_pad; | ||
643 | magic_t magic; /* Be sure that we can trust the information */ | ||
644 | __u32 next_speed; /* The Speed to be set *after* this frame */ | ||
645 | __u16 mtt; /* Minimum turn around time */ | ||
646 | diff --git a/kernel/printk.c b/kernel/printk.c | ||
647 | index 0084812..204660d 100644 | ||
648 | --- a/kernel/printk.c | ||
649 | +++ b/kernel/printk.c | ||
650 | @@ -977,10 +977,25 @@ int is_console_locked(void) | ||
651 | return console_locked; | ||
652 | } | ||
653 | |||
654 | -void wake_up_klogd(void) | ||
655 | +static DEFINE_PER_CPU(int, printk_pending); | ||
656 | + | ||
657 | +void printk_tick(void) | ||
658 | { | ||
659 | - if (!oops_in_progress && waitqueue_active(&log_wait)) | ||
660 | + if (__get_cpu_var(printk_pending)) { | ||
661 | + __get_cpu_var(printk_pending) = 0; | ||
662 | wake_up_interruptible(&log_wait); | ||
663 | + } | ||
664 | +} | ||
665 | + | ||
666 | +int printk_needs_cpu(int cpu) | ||
667 | +{ | ||
668 | + return per_cpu(printk_pending, cpu); | ||
669 | +} | ||
670 | + | ||
671 | +void wake_up_klogd(void) | ||
672 | +{ | ||
673 | + if (waitqueue_active(&log_wait)) | ||
674 | + __get_cpu_var(printk_pending) = 1; | ||
675 | } | ||
676 | |||
677 | /** | ||
678 | diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c | ||
679 | index cb02324..a7cb616 100644 | ||
680 | --- a/kernel/time/tick-sched.c | ||
681 | +++ b/kernel/time/tick-sched.c | ||
682 | @@ -261,7 +261,7 @@ void tick_nohz_stop_sched_tick(int inidle) | ||
683 | next_jiffies = get_next_timer_interrupt(last_jiffies); | ||
684 | delta_jiffies = next_jiffies - last_jiffies; | ||
685 | |||
686 | - if (rcu_needs_cpu(cpu)) | ||
687 | + if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu)) | ||
688 | delta_jiffies = 1; | ||
689 | /* | ||
690 | * Do not stop the tick, if we are only one off | ||
691 | diff --git a/kernel/timer.c b/kernel/timer.c | ||
692 | index e9a0195..7acda56 100644 | ||
693 | --- a/kernel/timer.c | ||
694 | +++ b/kernel/timer.c | ||
695 | @@ -978,6 +978,7 @@ void update_process_times(int user_tick) | ||
696 | run_local_timers(); | ||
697 | if (rcu_pending(cpu)) | ||
698 | rcu_check_callbacks(cpu, user_tick); | ||
699 | + printk_tick(); | ||
700 | scheduler_tick(); | ||
701 | run_posix_cpu_timers(p); | ||
702 | } | ||
703 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c | ||
704 | index 83bea4f..7acf81c 100644 | ||
705 | --- a/mm/mempolicy.c | ||
706 | +++ b/mm/mempolicy.c | ||
707 | @@ -985,7 +985,8 @@ static long do_mbind(unsigned long start, unsigned long len, | ||
708 | |||
709 | if (!err && nr_failed && (flags & MPOL_MF_STRICT)) | ||
710 | err = -EIO; | ||
711 | - } | ||
712 | + } else | ||
713 | + putback_lru_pages(&pagelist); | ||
714 | |||
715 | up_write(&mm->mmap_sem); | ||
716 | mpol_put(new); | ||
717 | diff --git a/net/appletalk/aarp.c b/net/appletalk/aarp.c | ||
718 | index b25c1e9..dd076ea 100644 | ||
719 | --- a/net/appletalk/aarp.c | ||
720 | +++ b/net/appletalk/aarp.c | ||
721 | @@ -598,7 +598,7 @@ int aarp_send_ddp(struct net_device *dev, struct sk_buff *skb, | ||
722 | |||
723 | /* Non ELAP we cannot do. */ | ||
724 | if (dev->type != ARPHRD_ETHER) | ||
725 | - return -1; | ||
726 | + goto free_it; | ||
727 | |||
728 | skb->dev = dev; | ||
729 | skb->protocol = htons(ETH_P_ATALK); | ||
730 | @@ -633,7 +633,7 @@ int aarp_send_ddp(struct net_device *dev, struct sk_buff *skb, | ||
731 | if (!a) { | ||
732 | /* Whoops slipped... good job it's an unreliable protocol 8) */ | ||
733 | write_unlock_bh(&aarp_lock); | ||
734 | - return -1; | ||
735 | + goto free_it; | ||
736 | } | ||
737 | |||
738 | /* Set up the queue */ | ||
739 | @@ -662,15 +662,21 @@ out_unlock: | ||
740 | write_unlock_bh(&aarp_lock); | ||
741 | |||
742 | /* Tell the ddp layer we have taken over for this frame. */ | ||
743 | - return 0; | ||
744 | + goto sent; | ||
745 | |||
746 | sendit: | ||
747 | if (skb->sk) | ||
748 | skb->priority = skb->sk->sk_priority; | ||
749 | - dev_queue_xmit(skb); | ||
750 | + if (dev_queue_xmit(skb)) | ||
751 | + goto drop; | ||
752 | sent: | ||
753 | - return 1; | ||
754 | + return NET_XMIT_SUCCESS; | ||
755 | +free_it: | ||
756 | + kfree_skb(skb); | ||
757 | +drop: | ||
758 | + return NET_XMIT_DROP; | ||
759 | } | ||
760 | +EXPORT_SYMBOL(aarp_send_ddp); | ||
761 | |||
762 | /* | ||
763 | * An entry in the aarp unresolved queue has become resolved. Send | ||
764 | diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c | ||
765 | index 8067dc7..e99d337 100644 | ||
766 | --- a/net/appletalk/ddp.c | ||
767 | +++ b/net/appletalk/ddp.c | ||
768 | @@ -1277,8 +1277,10 @@ static int handle_ip_over_ddp(struct sk_buff *skb) | ||
769 | struct net_device_stats *stats; | ||
770 | |||
771 | /* This needs to be able to handle ipddp"N" devices */ | ||
772 | - if (!dev) | ||
773 | - return -ENODEV; | ||
774 | + if (!dev) { | ||
775 | + kfree_skb(skb); | ||
776 | + return NET_RX_DROP; | ||
777 | + } | ||
778 | |||
779 | skb->protocol = htons(ETH_P_IP); | ||
780 | skb_pull(skb, 13); | ||
781 | @@ -1288,8 +1290,7 @@ static int handle_ip_over_ddp(struct sk_buff *skb) | ||
782 | stats = dev->priv; | ||
783 | stats->rx_packets++; | ||
784 | stats->rx_bytes += skb->len + 13; | ||
785 | - netif_rx(skb); /* Send the SKB up to a higher place. */ | ||
786 | - return 0; | ||
787 | + return netif_rx(skb); /* Send the SKB up to a higher place. */ | ||
788 | } | ||
789 | #else | ||
790 | /* make it easy for gcc to optimize this test out, i.e. kill the code */ | ||
791 | @@ -1297,9 +1298,8 @@ static int handle_ip_over_ddp(struct sk_buff *skb) | ||
792 | #define handle_ip_over_ddp(skb) 0 | ||
793 | #endif | ||
794 | |||
795 | -static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev, | ||
796 | - struct ddpehdr *ddp, __u16 len_hops, | ||
797 | - int origlen) | ||
798 | +static int atalk_route_packet(struct sk_buff *skb, struct net_device *dev, | ||
799 | + struct ddpehdr *ddp, __u16 len_hops, int origlen) | ||
800 | { | ||
801 | struct atalk_route *rt; | ||
802 | struct atalk_addr ta; | ||
803 | @@ -1366,8 +1366,6 @@ static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev, | ||
804 | /* 22 bytes - 12 ether, 2 len, 3 802.2 5 snap */ | ||
805 | struct sk_buff *nskb = skb_realloc_headroom(skb, 32); | ||
806 | kfree_skb(skb); | ||
807 | - if (!nskb) | ||
808 | - goto out; | ||
809 | skb = nskb; | ||
810 | } else | ||
811 | skb = skb_unshare(skb, GFP_ATOMIC); | ||
812 | @@ -1376,12 +1374,16 @@ static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev, | ||
813 | * If the buffer didn't vanish into the lack of space bitbucket we can | ||
814 | * send it. | ||
815 | */ | ||
816 | - if (skb && aarp_send_ddp(rt->dev, skb, &ta, NULL) == -1) | ||
817 | - goto free_it; | ||
818 | -out: | ||
819 | - return; | ||
820 | + if (skb == NULL) | ||
821 | + goto drop; | ||
822 | + | ||
823 | + if (aarp_send_ddp(rt->dev, skb, &ta, NULL) == NET_XMIT_DROP) | ||
824 | + return NET_RX_DROP; | ||
825 | + return NET_XMIT_SUCCESS; | ||
826 | free_it: | ||
827 | kfree_skb(skb); | ||
828 | +drop: | ||
829 | + return NET_RX_DROP; | ||
830 | } | ||
831 | |||
832 | /** | ||
833 | @@ -1455,8 +1457,7 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev, | ||
834 | /* Not ours, so we route the packet via the correct | ||
835 | * AppleTalk iface | ||
836 | */ | ||
837 | - atalk_route_packet(skb, dev, ddp, len_hops, origlen); | ||
838 | - goto out; | ||
839 | + return atalk_route_packet(skb, dev, ddp, len_hops, origlen); | ||
840 | } | ||
841 | |||
842 | /* if IP over DDP is not selected this code will be optimized out */ | ||
843 | @@ -1663,10 +1664,10 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr | ||
844 | if (skb2) { | ||
845 | loopback = 1; | ||
846 | SOCK_DEBUG(sk, "SK %p: send out(copy).\n", sk); | ||
847 | - if (aarp_send_ddp(dev, skb2, | ||
848 | - &usat->sat_addr, NULL) == -1) | ||
849 | - kfree_skb(skb2); | ||
850 | - /* else queued/sent above in the aarp queue */ | ||
851 | + /* | ||
852 | + * If it fails it is queued/sent above in the aarp queue | ||
853 | + */ | ||
854 | + aarp_send_ddp(dev, skb2, &usat->sat_addr, NULL); | ||
855 | } | ||
856 | } | ||
857 | |||
858 | @@ -1696,9 +1697,10 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr | ||
859 | usat = &gsat; | ||
860 | } | ||
861 | |||
862 | - if (aarp_send_ddp(dev, skb, &usat->sat_addr, NULL) == -1) | ||
863 | - kfree_skb(skb); | ||
864 | - /* else queued/sent above in the aarp queue */ | ||
865 | + /* | ||
866 | + * If it fails it is queued/sent above in the aarp queue | ||
867 | + */ | ||
868 | + aarp_send_ddp(dev, skb, &usat->sat_addr, NULL); | ||
869 | } | ||
870 | SOCK_DEBUG(sk, "SK %p: Done write (%Zd).\n", sk, len); | ||
871 | |||
872 | @@ -1877,7 +1879,6 @@ static struct packet_type ppptalk_packet_type = { | ||
873 | static unsigned char ddp_snap_id[] = { 0x08, 0x00, 0x07, 0x80, 0x9B }; | ||
874 | |||
875 | /* Export symbols for use by drivers when AppleTalk is a module */ | ||
876 | -EXPORT_SYMBOL(aarp_send_ddp); | ||
877 | EXPORT_SYMBOL(atrtr_get_dev); | ||
878 | EXPORT_SYMBOL(atalk_find_dev_addr); | ||
879 | |||
880 | diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c | ||
881 | index 8eb79e9..5b66371 100644 | ||
882 | --- a/net/sched/cls_api.c | ||
883 | +++ b/net/sched/cls_api.c | ||
884 | @@ -337,7 +337,7 @@ static int tcf_fill_node(struct sk_buff *skb, struct tcf_proto *tp, | ||
885 | tcm = NLMSG_DATA(nlh); | ||
886 | tcm->tcm_family = AF_UNSPEC; | ||
887 | tcm->tcm__pad1 = 0; | ||
888 | - tcm->tcm__pad1 = 0; | ||
889 | + tcm->tcm__pad2 = 0; | ||
890 | tcm->tcm_ifindex = qdisc_dev(tp->q)->ifindex; | ||
891 | tcm->tcm_parent = tp->classid; | ||
892 | tcm->tcm_info = TC_H_MAKE(tp->prio, tp->protocol); | ||
893 | diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c | ||
894 | index 8e66fe0..facdaa9 100644 | ||
895 | --- a/net/unix/af_unix.c | ||
896 | +++ b/net/unix/af_unix.c | ||
897 | @@ -1061,6 +1061,8 @@ restart: | ||
898 | err = -ECONNREFUSED; | ||
899 | if (other->sk_state != TCP_LISTEN) | ||
900 | goto out_unlock; | ||
901 | + if (other->sk_shutdown & RCV_SHUTDOWN) | ||
902 | + goto out_unlock; | ||
903 | |||
904 | if (unix_recvq_full(other)) { | ||
905 | err = -EAGAIN; |