Contents of /trunk/kernel26-alx/patches-2.6.27-r3/0113-2.6.27.14-all-fixes.patch
Parent Directory | Revision Log
Revision 1176 -
(show annotations)
(download)
Thu Oct 14 15:11:06 2010 UTC (13 years, 11 months ago) by niro
File size: 40306 byte(s)
Thu Oct 14 15:11:06 2010 UTC (13 years, 11 months ago) by niro
File size: 40306 byte(s)
-2.6.27-alx-r3: new magellan 0.5.2 kernel
1 | diff --git a/arch/alpha/kernel/irq_srm.c b/arch/alpha/kernel/irq_srm.c |
2 | index 3221201..a03fbca 100644 |
3 | --- a/arch/alpha/kernel/irq_srm.c |
4 | +++ b/arch/alpha/kernel/irq_srm.c |
5 | @@ -63,6 +63,8 @@ init_srm_irqs(long max, unsigned long ignore_mask) |
6 | { |
7 | long i; |
8 | |
9 | + if (NR_IRQS <= 16) |
10 | + return; |
11 | for (i = 16; i < max; ++i) { |
12 | if (i < 64 && ((ignore_mask >> i) & 1)) |
13 | continue; |
14 | diff --git a/crypto/authenc.c b/crypto/authenc.c |
15 | index fd9f06c..0861dc2 100644 |
16 | --- a/crypto/authenc.c |
17 | +++ b/crypto/authenc.c |
18 | @@ -157,16 +157,19 @@ static int crypto_authenc_genicv(struct aead_request *req, u8 *iv, |
19 | dstp = sg_page(dst); |
20 | vdst = PageHighMem(dstp) ? NULL : page_address(dstp) + dst->offset; |
21 | |
22 | - sg_init_table(cipher, 2); |
23 | - sg_set_buf(cipher, iv, ivsize); |
24 | - authenc_chain(cipher, dst, vdst == iv + ivsize); |
25 | + if (ivsize) { |
26 | + sg_init_table(cipher, 2); |
27 | + sg_set_buf(cipher, iv, ivsize); |
28 | + authenc_chain(cipher, dst, vdst == iv + ivsize); |
29 | + dst = cipher; |
30 | + } |
31 | |
32 | cryptlen = req->cryptlen + ivsize; |
33 | - hash = crypto_authenc_hash(req, flags, cipher, cryptlen); |
34 | + hash = crypto_authenc_hash(req, flags, dst, cryptlen); |
35 | if (IS_ERR(hash)) |
36 | return PTR_ERR(hash); |
37 | |
38 | - scatterwalk_map_and_copy(hash, cipher, cryptlen, |
39 | + scatterwalk_map_and_copy(hash, dst, cryptlen, |
40 | crypto_aead_authsize(authenc), 1); |
41 | return 0; |
42 | } |
43 | @@ -284,11 +287,14 @@ static int crypto_authenc_iverify(struct aead_request *req, u8 *iv, |
44 | srcp = sg_page(src); |
45 | vsrc = PageHighMem(srcp) ? NULL : page_address(srcp) + src->offset; |
46 | |
47 | - sg_init_table(cipher, 2); |
48 | - sg_set_buf(cipher, iv, ivsize); |
49 | - authenc_chain(cipher, src, vsrc == iv + ivsize); |
50 | + if (ivsize) { |
51 | + sg_init_table(cipher, 2); |
52 | + sg_set_buf(cipher, iv, ivsize); |
53 | + authenc_chain(cipher, src, vsrc == iv + ivsize); |
54 | + src = cipher; |
55 | + } |
56 | |
57 | - return crypto_authenc_verify(req, cipher, cryptlen + ivsize); |
58 | + return crypto_authenc_verify(req, src, cryptlen + ivsize); |
59 | } |
60 | |
61 | static int crypto_authenc_decrypt(struct aead_request *req) |
62 | diff --git a/crypto/ccm.c b/crypto/ccm.c |
63 | index 7cf7e5a..c36d654 100644 |
64 | --- a/crypto/ccm.c |
65 | +++ b/crypto/ccm.c |
66 | @@ -266,6 +266,8 @@ static int crypto_ccm_auth(struct aead_request *req, struct scatterlist *plain, |
67 | if (assoclen) { |
68 | pctx->ilen = format_adata(idata, assoclen); |
69 | get_data_to_compute(cipher, pctx, req->assoc, req->assoclen); |
70 | + } else { |
71 | + pctx->ilen = 0; |
72 | } |
73 | |
74 | /* compute plaintext into mac */ |
75 | diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c |
76 | index 8fdb2ce..c5be6a1 100644 |
77 | --- a/drivers/ata/pata_via.c |
78 | +++ b/drivers/ata/pata_via.c |
79 | @@ -87,6 +87,10 @@ enum { |
80 | VIA_SATA_PATA = 0x800, /* SATA/PATA combined configuration */ |
81 | }; |
82 | |
83 | +enum { |
84 | + VIA_IDFLAG_SINGLE = (1 << 0), /* single channel controller) */ |
85 | +}; |
86 | + |
87 | /* |
88 | * VIA SouthBridge chips. |
89 | */ |
90 | @@ -98,8 +102,12 @@ static const struct via_isa_bridge { |
91 | u8 rev_max; |
92 | u16 flags; |
93 | } via_isa_bridges[] = { |
94 | + { "vx855", PCI_DEVICE_ID_VIA_VX855, 0x00, 0x2f, |
95 | + VIA_UDMA_133 | VIA_BAD_AST | VIA_SATA_PATA }, |
96 | { "vx800", PCI_DEVICE_ID_VIA_VX800, 0x00, 0x2f, VIA_UDMA_133 | |
97 | VIA_BAD_AST | VIA_SATA_PATA }, |
98 | + { "vt8261", PCI_DEVICE_ID_VIA_8261, 0x00, 0x2f, |
99 | + VIA_UDMA_133 | VIA_BAD_AST }, |
100 | { "vt8237s", PCI_DEVICE_ID_VIA_8237S, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
101 | { "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
102 | { "cx700", PCI_DEVICE_ID_VIA_CX700, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_SATA_PATA }, |
103 | @@ -123,6 +131,8 @@ static const struct via_isa_bridge { |
104 | { "vt82c586", PCI_DEVICE_ID_VIA_82C586_0, 0x00, 0x0f, VIA_UDMA_NONE | VIA_SET_FIFO }, |
105 | { "vt82c576", PCI_DEVICE_ID_VIA_82C576, 0x00, 0x2f, VIA_UDMA_NONE | VIA_SET_FIFO | VIA_NO_UNMASK }, |
106 | { "vt82c576", PCI_DEVICE_ID_VIA_82C576, 0x00, 0x2f, VIA_UDMA_NONE | VIA_SET_FIFO | VIA_NO_UNMASK | VIA_BAD_ID }, |
107 | + { "vtxxxx", PCI_DEVICE_ID_VIA_ANON, 0x00, 0x2f, |
108 | + VIA_UDMA_133 | VIA_BAD_AST }, |
109 | { NULL } |
110 | }; |
111 | |
112 | @@ -461,6 +471,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
113 | static int printed_version; |
114 | u8 enable; |
115 | u32 timing; |
116 | + unsigned long flags = id->driver_data; |
117 | int rc; |
118 | |
119 | if (!printed_version++) |
120 | @@ -470,9 +481,13 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
121 | if (rc) |
122 | return rc; |
123 | |
124 | + if (flags & VIA_IDFLAG_SINGLE) |
125 | + ppi[1] = &ata_dummy_port_info; |
126 | + |
127 | /* To find out how the IDE will behave and what features we |
128 | actually have to look at the bridge not the IDE controller */ |
129 | - for (config = via_isa_bridges; config->id; config++) |
130 | + for (config = via_isa_bridges; config->id != PCI_DEVICE_ID_VIA_ANON; |
131 | + config++) |
132 | if ((isa = pci_get_device(PCI_VENDOR_ID_VIA + |
133 | !!(config->flags & VIA_BAD_ID), |
134 | config->id, NULL))) { |
135 | @@ -483,10 +498,6 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
136 | pci_dev_put(isa); |
137 | } |
138 | |
139 | - if (!config->id) { |
140 | - printk(KERN_WARNING "via: Unknown VIA SouthBridge, disabling.\n"); |
141 | - return -ENODEV; |
142 | - } |
143 | pci_dev_put(isa); |
144 | |
145 | if (!(config->flags & VIA_NO_ENABLES)) { |
146 | @@ -588,6 +599,7 @@ static const struct pci_device_id via[] = { |
147 | { PCI_VDEVICE(VIA, 0x1571), }, |
148 | { PCI_VDEVICE(VIA, 0x3164), }, |
149 | { PCI_VDEVICE(VIA, 0x5324), }, |
150 | + { PCI_VDEVICE(VIA, 0xC409), VIA_IDFLAG_SINGLE }, |
151 | |
152 | { }, |
153 | }; |
154 | diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c |
155 | index 4a1508a..7e975eb 100644 |
156 | --- a/drivers/ide/pci/it821x.c |
157 | +++ b/drivers/ide/pci/it821x.c |
158 | @@ -69,6 +69,8 @@ |
159 | |
160 | #define DRV_NAME "it821x" |
161 | |
162 | +#define QUIRK_VORTEX86 1 |
163 | + |
164 | struct it821x_dev |
165 | { |
166 | unsigned int smart:1, /* Are we in smart raid mode */ |
167 | @@ -80,6 +82,7 @@ struct it821x_dev |
168 | u16 pio[2]; /* Cached PIO values */ |
169 | u16 mwdma[2]; /* Cached MWDMA values */ |
170 | u16 udma[2]; /* Cached UDMA values (per drive) */ |
171 | + u16 quirks; |
172 | }; |
173 | |
174 | #define ATA_66 0 |
175 | @@ -586,6 +589,12 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif) |
176 | |
177 | hwif->ultra_mask = ATA_UDMA6; |
178 | hwif->mwdma_mask = ATA_MWDMA2; |
179 | + |
180 | + /* Vortex86SX quirk: prevent Ultra-DMA mode to fix BadCRC issue */ |
181 | + if (idev->quirks & QUIRK_VORTEX86) { |
182 | + if (dev->revision == 0x11) |
183 | + hwif->ultra_mask = 0; |
184 | + } |
185 | } |
186 | |
187 | static void __devinit it8212_disable_raid(struct pci_dev *dev) |
188 | @@ -658,6 +667,8 @@ static int __devinit it821x_init_one(struct pci_dev *dev, const struct pci_devic |
189 | return -ENOMEM; |
190 | } |
191 | |
192 | + itdevs->quirks = id->driver_data; |
193 | + |
194 | rc = ide_pci_init_one(dev, &it821x_chipset, itdevs); |
195 | if (rc) |
196 | kfree(itdevs); |
197 | @@ -677,6 +688,7 @@ static void __devexit it821x_remove(struct pci_dev *dev) |
198 | static const struct pci_device_id it821x_pci_tbl[] = { |
199 | { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8211), 0 }, |
200 | { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8212), 0 }, |
201 | + { PCI_VDEVICE(RDC, PCI_DEVICE_ID_RDC_D1010), QUIRK_VORTEX86 }, |
202 | { 0, }, |
203 | }; |
204 | |
205 | diff --git a/drivers/misc/sgi-xp/xpc_sn2.c b/drivers/misc/sgi-xp/xpc_sn2.c |
206 | index d32c1ee..59ff816 100644 |
207 | --- a/drivers/misc/sgi-xp/xpc_sn2.c |
208 | +++ b/drivers/misc/sgi-xp/xpc_sn2.c |
209 | @@ -1841,6 +1841,7 @@ xpc_process_msg_chctl_flags_sn2(struct xpc_partition *part, int ch_number) |
210 | */ |
211 | xpc_clear_remote_msgqueue_flags_sn2(ch); |
212 | |
213 | + smp_wmb(); /* ensure flags have been cleared before bte_copy */ |
214 | ch_sn2->w_remote_GP.put = ch_sn2->remote_GP.put; |
215 | |
216 | dev_dbg(xpc_chan, "w_remote_GP.put changed to %ld, partid=%d, " |
217 | @@ -1939,7 +1940,7 @@ xpc_get_deliverable_payload_sn2(struct xpc_channel *ch) |
218 | break; |
219 | |
220 | get = ch_sn2->w_local_GP.get; |
221 | - rmb(); /* guarantee that .get loads before .put */ |
222 | + smp_rmb(); /* guarantee that .get loads before .put */ |
223 | if (get == ch_sn2->w_remote_GP.put) |
224 | break; |
225 | |
226 | @@ -1961,11 +1962,13 @@ xpc_get_deliverable_payload_sn2(struct xpc_channel *ch) |
227 | |
228 | msg = xpc_pull_remote_msg_sn2(ch, get); |
229 | |
230 | - DBUG_ON(msg != NULL && msg->number != get); |
231 | - DBUG_ON(msg != NULL && (msg->flags & XPC_M_SN2_DONE)); |
232 | - DBUG_ON(msg != NULL && !(msg->flags & XPC_M_SN2_READY)); |
233 | + if (msg != NULL) { |
234 | + DBUG_ON(msg->number != get); |
235 | + DBUG_ON(msg->flags & XPC_M_SN2_DONE); |
236 | + DBUG_ON(!(msg->flags & XPC_M_SN2_READY)); |
237 | |
238 | - payload = &msg->payload; |
239 | + payload = &msg->payload; |
240 | + } |
241 | break; |
242 | } |
243 | |
244 | @@ -2058,7 +2061,7 @@ xpc_allocate_msg_sn2(struct xpc_channel *ch, u32 flags, |
245 | while (1) { |
246 | |
247 | put = ch_sn2->w_local_GP.put; |
248 | - rmb(); /* guarantee that .put loads before .get */ |
249 | + smp_rmb(); /* guarantee that .put loads before .get */ |
250 | if (put - ch_sn2->w_remote_GP.get < ch->local_nentries) { |
251 | |
252 | /* There are available message entries. We need to try |
253 | @@ -2191,7 +2194,7 @@ xpc_send_payload_sn2(struct xpc_channel *ch, u32 flags, void *payload, |
254 | * The preceding store of msg->flags must occur before the following |
255 | * load of local_GP->put. |
256 | */ |
257 | - mb(); |
258 | + smp_mb(); |
259 | |
260 | /* see if the message is next in line to be sent, if so send it */ |
261 | |
262 | @@ -2292,7 +2295,7 @@ xpc_received_payload_sn2(struct xpc_channel *ch, void *payload) |
263 | * The preceding store of msg->flags must occur before the following |
264 | * load of local_GP->get. |
265 | */ |
266 | - mb(); |
267 | + smp_mb(); |
268 | |
269 | /* |
270 | * See if this message is next in line to be acknowledged as having |
271 | diff --git a/drivers/misc/sgi-xp/xpc_uv.c b/drivers/misc/sgi-xp/xpc_uv.c |
272 | index 1ac694c..b8f8d50 100644 |
273 | --- a/drivers/misc/sgi-xp/xpc_uv.c |
274 | +++ b/drivers/misc/sgi-xp/xpc_uv.c |
275 | @@ -1238,7 +1238,7 @@ xpc_send_payload_uv(struct xpc_channel *ch, u32 flags, void *payload, |
276 | atomic_inc(&ch->n_to_notify); |
277 | |
278 | msg_slot->key = key; |
279 | - wmb(); /* a non-NULL func must hit memory after the key */ |
280 | + smp_wmb(); /* a non-NULL func must hit memory after the key */ |
281 | msg_slot->func = func; |
282 | |
283 | if (ch->flags & XPC_C_DISCONNECTING) { |
284 | diff --git a/drivers/net/bnx2x_main.c b/drivers/net/bnx2x_main.c |
285 | index 53459db..8d44404 100644 |
286 | --- a/drivers/net/bnx2x_main.c |
287 | +++ b/drivers/net/bnx2x_main.c |
288 | @@ -8078,6 +8078,9 @@ static int bnx2x_get_eeprom(struct net_device *dev, |
289 | struct bnx2x *bp = netdev_priv(dev); |
290 | int rc; |
291 | |
292 | + if (!netif_running(dev)) |
293 | + return -EAGAIN; |
294 | + |
295 | DP(BNX2X_MSG_NVM, "ethtool_eeprom: cmd %d\n" |
296 | DP_LEVEL " magic 0x%x offset 0x%x (%d) len 0x%x (%d)\n", |
297 | eeprom->cmd, eeprom->magic, eeprom->offset, eeprom->offset, |
298 | diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c |
299 | index 1640096..ef84732 100644 |
300 | --- a/drivers/net/wireless/rtl8187_dev.c |
301 | +++ b/drivers/net/wireless/rtl8187_dev.c |
302 | @@ -263,6 +263,7 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb) |
303 | |
304 | usb_fill_bulk_urb(urb, priv->udev, usb_sndbulkpipe(priv->udev, ep), |
305 | buf, skb->len, rtl8187_tx_cb, skb); |
306 | + urb->transfer_flags |= URB_ZERO_PACKET; |
307 | rc = usb_submit_urb(urb, GFP_ATOMIC); |
308 | if (rc < 0) { |
309 | usb_free_urb(urb); |
310 | diff --git a/drivers/net/wireless/rtl8187_rtl8225.c b/drivers/net/wireless/rtl8187_rtl8225.c |
311 | index 1bae899..487593f 100644 |
312 | --- a/drivers/net/wireless/rtl8187_rtl8225.c |
313 | +++ b/drivers/net/wireless/rtl8187_rtl8225.c |
314 | @@ -287,7 +287,10 @@ static void rtl8225_rf_set_tx_power(struct ieee80211_hw *dev, int channel) |
315 | ofdm_power = priv->channels[channel - 1].hw_value >> 4; |
316 | |
317 | cck_power = min(cck_power, (u8)11); |
318 | - ofdm_power = min(ofdm_power, (u8)35); |
319 | + if (ofdm_power > (u8)15) |
320 | + ofdm_power = 25; |
321 | + else |
322 | + ofdm_power += 10; |
323 | |
324 | rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK, |
325 | rtl8225_tx_gain_cck_ofdm[cck_power / 6] >> 1); |
326 | @@ -540,7 +543,10 @@ static void rtl8225z2_rf_set_tx_power(struct ieee80211_hw *dev, int channel) |
327 | cck_power += priv->txpwr_base & 0xF; |
328 | cck_power = min(cck_power, (u8)35); |
329 | |
330 | - ofdm_power = min(ofdm_power, (u8)15); |
331 | + if (ofdm_power > (u8)15) |
332 | + ofdm_power = 25; |
333 | + else |
334 | + ofdm_power += 10; |
335 | ofdm_power += priv->txpwr_base >> 4; |
336 | ofdm_power = min(ofdm_power, (u8)35); |
337 | |
338 | diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c |
339 | index 6e18736..6d9b074 100644 |
340 | --- a/drivers/pci/hotplug/pciehp_core.c |
341 | +++ b/drivers/pci/hotplug/pciehp_core.c |
342 | @@ -126,8 +126,10 @@ static int set_lock_status(struct hotplug_slot *hotplug_slot, u8 status) |
343 | mutex_lock(&slot->ctrl->crit_sect); |
344 | |
345 | /* has it been >1 sec since our last toggle? */ |
346 | - if ((get_seconds() - slot->last_emi_toggle) < 1) |
347 | + if ((get_seconds() - slot->last_emi_toggle) < 1) { |
348 | + mutex_unlock(&slot->ctrl->crit_sect); |
349 | return -EINVAL; |
350 | + } |
351 | |
352 | /* see what our current state is */ |
353 | retval = get_lock_status(hotplug_slot, &value); |
354 | diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c |
355 | index c2f2393..fd0695b 100644 |
356 | --- a/drivers/serial/8250_pci.c |
357 | +++ b/drivers/serial/8250_pci.c |
358 | @@ -2190,6 +2190,9 @@ static struct pci_device_id serial_pci_tbl[] = { |
359 | { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_COMM8, |
360 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
361 | pbn_b2_8_115200 }, |
362 | + { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_7803, |
363 | + PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
364 | + pbn_b2_8_460800 }, |
365 | { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM8, |
366 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
367 | pbn_b2_8_115200 }, |
368 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c |
369 | index 20290c5..e52e54e 100644 |
370 | --- a/drivers/usb/core/devio.c |
371 | +++ b/drivers/usb/core/devio.c |
372 | @@ -1700,7 +1700,7 @@ const struct file_operations usbdev_file_operations = { |
373 | .release = usbdev_release, |
374 | }; |
375 | |
376 | -void usb_fs_classdev_common_remove(struct usb_device *udev) |
377 | +static void usbdev_remove(struct usb_device *udev) |
378 | { |
379 | struct dev_state *ps; |
380 | struct siginfo sinfo; |
381 | @@ -1742,10 +1742,15 @@ static void usb_classdev_remove(struct usb_device *dev) |
382 | { |
383 | if (dev->usb_classdev) |
384 | device_unregister(dev->usb_classdev); |
385 | - usb_fs_classdev_common_remove(dev); |
386 | } |
387 | |
388 | -static int usb_classdev_notify(struct notifier_block *self, |
389 | +#else |
390 | +#define usb_classdev_add(dev) 0 |
391 | +#define usb_classdev_remove(dev) do {} while (0) |
392 | + |
393 | +#endif |
394 | + |
395 | +static int usbdev_notify(struct notifier_block *self, |
396 | unsigned long action, void *dev) |
397 | { |
398 | switch (action) { |
399 | @@ -1755,15 +1760,15 @@ static int usb_classdev_notify(struct notifier_block *self, |
400 | break; |
401 | case USB_DEVICE_REMOVE: |
402 | usb_classdev_remove(dev); |
403 | + usbdev_remove(dev); |
404 | break; |
405 | } |
406 | return NOTIFY_OK; |
407 | } |
408 | |
409 | static struct notifier_block usbdev_nb = { |
410 | - .notifier_call = usb_classdev_notify, |
411 | + .notifier_call = usbdev_notify, |
412 | }; |
413 | -#endif |
414 | |
415 | static struct cdev usb_device_cdev; |
416 | |
417 | @@ -1797,9 +1802,8 @@ int __init usb_devio_init(void) |
418 | * to /sys/dev |
419 | */ |
420 | usb_classdev_class->dev_kobj = NULL; |
421 | - |
422 | - usb_register_notify(&usbdev_nb); |
423 | #endif |
424 | + usb_register_notify(&usbdev_nb); |
425 | out: |
426 | return retval; |
427 | |
428 | @@ -1810,8 +1814,8 @@ error_cdev: |
429 | |
430 | void usb_devio_cleanup(void) |
431 | { |
432 | -#ifdef CONFIG_USB_DEVICE_CLASS |
433 | usb_unregister_notify(&usbdev_nb); |
434 | +#ifdef CONFIG_USB_DEVICE_CLASS |
435 | class_destroy(usb_classdev_class); |
436 | #endif |
437 | cdev_del(&usb_device_cdev); |
438 | diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c |
439 | index db410e9..83887ff 100644 |
440 | --- a/drivers/usb/core/inode.c |
441 | +++ b/drivers/usb/core/inode.c |
442 | @@ -716,7 +716,6 @@ static void usbfs_remove_device(struct usb_device *dev) |
443 | fs_remove_file (dev->usbfs_dentry); |
444 | dev->usbfs_dentry = NULL; |
445 | } |
446 | - usb_fs_classdev_common_remove(dev); |
447 | } |
448 | |
449 | static int usbfs_notify(struct notifier_block *self, unsigned long action, void *dev) |
450 | diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h |
451 | index 9a1a45a..a9a6397 100644 |
452 | --- a/drivers/usb/core/usb.h |
453 | +++ b/drivers/usb/core/usb.h |
454 | @@ -145,7 +145,6 @@ extern struct usb_driver usbfs_driver; |
455 | extern const struct file_operations usbfs_devices_fops; |
456 | extern const struct file_operations usbdev_file_operations; |
457 | extern void usbfs_conn_disc_event(void); |
458 | -extern void usb_fs_classdev_common_remove(struct usb_device *udev); |
459 | |
460 | extern int usb_devio_init(void); |
461 | extern void usb_devio_cleanup(void); |
462 | diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c |
463 | index 0ada0fc..c542a98 100644 |
464 | --- a/drivers/usb/mon/mon_bin.c |
465 | +++ b/drivers/usb/mon/mon_bin.c |
466 | @@ -37,6 +37,7 @@ |
467 | #define MON_IOCX_GET _IOW(MON_IOC_MAGIC, 6, struct mon_bin_get) |
468 | #define MON_IOCX_MFETCH _IOWR(MON_IOC_MAGIC, 7, struct mon_bin_mfetch) |
469 | #define MON_IOCH_MFLUSH _IO(MON_IOC_MAGIC, 8) |
470 | + |
471 | #ifdef CONFIG_COMPAT |
472 | #define MON_IOCX_GET32 _IOW(MON_IOC_MAGIC, 6, struct mon_bin_get32) |
473 | #define MON_IOCX_MFETCH32 _IOWR(MON_IOC_MAGIC, 7, struct mon_bin_mfetch32) |
474 | @@ -921,21 +922,6 @@ static int mon_bin_ioctl(struct inode *inode, struct file *file, |
475 | } |
476 | break; |
477 | |
478 | -#ifdef CONFIG_COMPAT |
479 | - case MON_IOCX_GET32: { |
480 | - struct mon_bin_get32 getb; |
481 | - |
482 | - if (copy_from_user(&getb, (void __user *)arg, |
483 | - sizeof(struct mon_bin_get32))) |
484 | - return -EFAULT; |
485 | - |
486 | - ret = mon_bin_get_event(file, rp, |
487 | - compat_ptr(getb.hdr32), compat_ptr(getb.data32), |
488 | - getb.alloc32); |
489 | - } |
490 | - break; |
491 | -#endif |
492 | - |
493 | case MON_IOCX_MFETCH: |
494 | { |
495 | struct mon_bin_mfetch mfetch; |
496 | @@ -962,7 +948,57 @@ static int mon_bin_ioctl(struct inode *inode, struct file *file, |
497 | } |
498 | break; |
499 | |
500 | + case MON_IOCG_STATS: { |
501 | + struct mon_bin_stats __user *sp; |
502 | + unsigned int nevents; |
503 | + unsigned int ndropped; |
504 | + |
505 | + spin_lock_irqsave(&rp->b_lock, flags); |
506 | + ndropped = rp->cnt_lost; |
507 | + rp->cnt_lost = 0; |
508 | + spin_unlock_irqrestore(&rp->b_lock, flags); |
509 | + nevents = mon_bin_queued(rp); |
510 | + |
511 | + sp = (struct mon_bin_stats __user *)arg; |
512 | + if (put_user(rp->cnt_lost, &sp->dropped)) |
513 | + return -EFAULT; |
514 | + if (put_user(nevents, &sp->queued)) |
515 | + return -EFAULT; |
516 | + |
517 | + } |
518 | + break; |
519 | + |
520 | + default: |
521 | + return -ENOTTY; |
522 | + } |
523 | + |
524 | + return ret; |
525 | +} |
526 | + |
527 | #ifdef CONFIG_COMPAT |
528 | +static long mon_bin_compat_ioctl(struct file *file, |
529 | + unsigned int cmd, unsigned long arg) |
530 | +{ |
531 | + struct mon_reader_bin *rp = file->private_data; |
532 | + int ret; |
533 | + |
534 | + switch (cmd) { |
535 | + |
536 | + case MON_IOCX_GET32: { |
537 | + struct mon_bin_get32 getb; |
538 | + |
539 | + if (copy_from_user(&getb, (void __user *)arg, |
540 | + sizeof(struct mon_bin_get32))) |
541 | + return -EFAULT; |
542 | + |
543 | + ret = mon_bin_get_event(file, rp, |
544 | + compat_ptr(getb.hdr32), compat_ptr(getb.data32), |
545 | + getb.alloc32); |
546 | + if (ret < 0) |
547 | + return ret; |
548 | + } |
549 | + return 0; |
550 | + |
551 | case MON_IOCX_MFETCH32: |
552 | { |
553 | struct mon_bin_mfetch32 mfetch; |
554 | @@ -986,37 +1022,25 @@ static int mon_bin_ioctl(struct inode *inode, struct file *file, |
555 | return ret; |
556 | if (put_user(ret, &uptr->nfetch32)) |
557 | return -EFAULT; |
558 | - ret = 0; |
559 | } |
560 | - break; |
561 | -#endif |
562 | - |
563 | - case MON_IOCG_STATS: { |
564 | - struct mon_bin_stats __user *sp; |
565 | - unsigned int nevents; |
566 | - unsigned int ndropped; |
567 | - |
568 | - spin_lock_irqsave(&rp->b_lock, flags); |
569 | - ndropped = rp->cnt_lost; |
570 | - rp->cnt_lost = 0; |
571 | - spin_unlock_irqrestore(&rp->b_lock, flags); |
572 | - nevents = mon_bin_queued(rp); |
573 | + return 0; |
574 | |
575 | - sp = (struct mon_bin_stats __user *)arg; |
576 | - if (put_user(rp->cnt_lost, &sp->dropped)) |
577 | - return -EFAULT; |
578 | - if (put_user(nevents, &sp->queued)) |
579 | - return -EFAULT; |
580 | + case MON_IOCG_STATS: |
581 | + return mon_bin_ioctl(NULL, file, cmd, |
582 | + (unsigned long) compat_ptr(arg)); |
583 | |
584 | - } |
585 | - break; |
586 | + case MON_IOCQ_URB_LEN: |
587 | + case MON_IOCQ_RING_SIZE: |
588 | + case MON_IOCT_RING_SIZE: |
589 | + case MON_IOCH_MFLUSH: |
590 | + return mon_bin_ioctl(NULL, file, cmd, arg); |
591 | |
592 | default: |
593 | - return -ENOTTY; |
594 | + ; |
595 | } |
596 | - |
597 | - return ret; |
598 | + return -ENOTTY; |
599 | } |
600 | +#endif /* CONFIG_COMPAT */ |
601 | |
602 | static unsigned int |
603 | mon_bin_poll(struct file *file, struct poll_table_struct *wait) |
604 | @@ -1094,6 +1118,9 @@ static const struct file_operations mon_fops_binary = { |
605 | /* .write = mon_text_write, */ |
606 | .poll = mon_bin_poll, |
607 | .ioctl = mon_bin_ioctl, |
608 | +#ifdef CONFIG_COMPAT |
609 | + .compat_ioctl = mon_bin_compat_ioctl, |
610 | +#endif |
611 | .release = mon_bin_release, |
612 | .mmap = mon_bin_mmap, |
613 | }; |
614 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h |
615 | index 6fcb6d1..aae786c 100644 |
616 | --- a/drivers/usb/storage/unusual_devs.h |
617 | +++ b/drivers/usb/storage/unusual_devs.h |
618 | @@ -2047,6 +2047,12 @@ UNUSUAL_DEV( 0x19d2, 0x2000, 0x0000, 0x0000, |
619 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
620 | US_FL_IGNORE_DEVICE), |
621 | |
622 | +UNUSUAL_DEV( 0x2116, 0x0320, 0x0001, 0x0001, |
623 | + "ST", |
624 | + "2A", |
625 | + US_SC_DEVICE, US_PR_DEVICE, NULL, |
626 | + US_FL_FIX_CAPACITY), |
627 | + |
628 | /* patch submitted by Davide Perini <perini.davide@dpsoftware.org> |
629 | * and Renato Perini <rperini@email.it> |
630 | */ |
631 | diff --git a/fs/eventpoll.c b/fs/eventpoll.c |
632 | index cb60f92..801de2c 100644 |
633 | --- a/fs/eventpoll.c |
634 | +++ b/fs/eventpoll.c |
635 | @@ -234,8 +234,6 @@ struct ep_pqueue { |
636 | /* |
637 | * Configuration options available inside /proc/sys/fs/epoll/ |
638 | */ |
639 | -/* Maximum number of epoll devices, per user */ |
640 | -static int max_user_instances __read_mostly; |
641 | /* Maximum number of epoll watched descriptors, per user */ |
642 | static int max_user_watches __read_mostly; |
643 | |
644 | @@ -261,14 +259,6 @@ static int zero; |
645 | |
646 | ctl_table epoll_table[] = { |
647 | { |
648 | - .procname = "max_user_instances", |
649 | - .data = &max_user_instances, |
650 | - .maxlen = sizeof(int), |
651 | - .mode = 0644, |
652 | - .proc_handler = &proc_dointvec_minmax, |
653 | - .extra1 = &zero, |
654 | - }, |
655 | - { |
656 | .procname = "max_user_watches", |
657 | .data = &max_user_watches, |
658 | .maxlen = sizeof(int), |
659 | @@ -491,7 +481,6 @@ static void ep_free(struct eventpoll *ep) |
660 | |
661 | mutex_unlock(&epmutex); |
662 | mutex_destroy(&ep->mtx); |
663 | - atomic_dec(&ep->user->epoll_devs); |
664 | free_uid(ep->user); |
665 | kfree(ep); |
666 | } |
667 | @@ -581,10 +570,6 @@ static int ep_alloc(struct eventpoll **pep) |
668 | struct eventpoll *ep; |
669 | |
670 | user = get_current_user(); |
671 | - error = -EMFILE; |
672 | - if (unlikely(atomic_read(&user->epoll_devs) >= |
673 | - max_user_instances)) |
674 | - goto free_uid; |
675 | error = -ENOMEM; |
676 | ep = kzalloc(sizeof(*ep), GFP_KERNEL); |
677 | if (unlikely(!ep)) |
678 | @@ -1137,7 +1122,6 @@ SYSCALL_DEFINE1(epoll_create1, int, flags) |
679 | flags & O_CLOEXEC); |
680 | if (fd < 0) |
681 | ep_free(ep); |
682 | - atomic_inc(&ep->user->epoll_devs); |
683 | |
684 | error_return: |
685 | DNPRINTK(3, (KERN_INFO "[%p] eventpoll: sys_epoll_create(%d) = %d\n", |
686 | @@ -1362,8 +1346,10 @@ static int __init eventpoll_init(void) |
687 | struct sysinfo si; |
688 | |
689 | si_meminfo(&si); |
690 | - max_user_instances = 128; |
691 | - max_user_watches = (((si.totalram - si.totalhigh) / 32) << PAGE_SHIFT) / |
692 | + /* |
693 | + * Allows top 4% of lomem to be allocated for epoll watches (per user). |
694 | + */ |
695 | + max_user_watches = (((si.totalram - si.totalhigh) / 25) << PAGE_SHIFT) / |
696 | EP_ITEM_COST; |
697 | |
698 | /* Initialize the structure used to perform safe poll wait head wake ups */ |
699 | diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c |
700 | index 1f55382..89b1c93 100644 |
701 | --- a/fs/ext3/namei.c |
702 | +++ b/fs/ext3/namei.c |
703 | @@ -1374,7 +1374,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, |
704 | struct fake_dirent *fde; |
705 | |
706 | blocksize = dir->i_sb->s_blocksize; |
707 | - dxtrace(printk("Creating index\n")); |
708 | + dxtrace(printk(KERN_DEBUG "Creating index: inode %lu\n", dir->i_ino)); |
709 | retval = ext3_journal_get_write_access(handle, bh); |
710 | if (retval) { |
711 | ext3_std_error(dir->i_sb, retval); |
712 | @@ -1383,6 +1383,19 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, |
713 | } |
714 | root = (struct dx_root *) bh->b_data; |
715 | |
716 | + /* The 0th block becomes the root, move the dirents out */ |
717 | + fde = &root->dotdot; |
718 | + de = (struct ext3_dir_entry_2 *)((char *)fde + |
719 | + ext3_rec_len_from_disk(fde->rec_len)); |
720 | + if ((char *) de >= (((char *) root) + blocksize)) { |
721 | + ext3_error(dir->i_sb, __func__, |
722 | + "invalid rec_len for '..' in inode %lu", |
723 | + dir->i_ino); |
724 | + brelse(bh); |
725 | + return -EIO; |
726 | + } |
727 | + len = ((char *) root) + blocksize - (char *) de; |
728 | + |
729 | bh2 = ext3_append (handle, dir, &block, &retval); |
730 | if (!(bh2)) { |
731 | brelse(bh); |
732 | @@ -1391,11 +1404,6 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, |
733 | EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; |
734 | data1 = bh2->b_data; |
735 | |
736 | - /* The 0th block becomes the root, move the dirents out */ |
737 | - fde = &root->dotdot; |
738 | - de = (struct ext3_dir_entry_2 *)((char *)fde + |
739 | - ext3_rec_len_from_disk(fde->rec_len)); |
740 | - len = ((char *) root) + blocksize - (char *) de; |
741 | memcpy (data1, de, len); |
742 | de = (struct ext3_dir_entry_2 *) data1; |
743 | top = data1 + len; |
744 | diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c |
745 | index 87250b6..279734f 100644 |
746 | --- a/fs/fuse/dev.c |
747 | +++ b/fs/fuse/dev.c |
748 | @@ -281,7 +281,8 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req) |
749 | fc->blocked = 0; |
750 | wake_up_all(&fc->blocked_waitq); |
751 | } |
752 | - if (fc->num_background == FUSE_CONGESTION_THRESHOLD) { |
753 | + if (fc->num_background == FUSE_CONGESTION_THRESHOLD && |
754 | + fc->connected) { |
755 | clear_bdi_congested(&fc->bdi, READ); |
756 | clear_bdi_congested(&fc->bdi, WRITE); |
757 | } |
758 | diff --git a/fs/fuse/file.c b/fs/fuse/file.c |
759 | index c8206db..3ada9d7 100644 |
760 | --- a/fs/fuse/file.c |
761 | +++ b/fs/fuse/file.c |
762 | @@ -54,7 +54,7 @@ struct fuse_file *fuse_file_alloc(void) |
763 | ff->reserved_req = fuse_request_alloc(); |
764 | if (!ff->reserved_req) { |
765 | kfree(ff); |
766 | - ff = NULL; |
767 | + return NULL; |
768 | } else { |
769 | INIT_LIST_HEAD(&ff->write_entry); |
770 | atomic_set(&ff->count, 0); |
771 | diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c |
772 | index d2249f1..57342a6 100644 |
773 | --- a/fs/fuse/inode.c |
774 | +++ b/fs/fuse/inode.c |
775 | @@ -292,6 +292,7 @@ static void fuse_put_super(struct super_block *sb) |
776 | list_del(&fc->entry); |
777 | fuse_ctl_remove_conn(fc); |
778 | mutex_unlock(&fuse_mutex); |
779 | + bdi_destroy(&fc->bdi); |
780 | fuse_conn_put(fc); |
781 | } |
782 | |
783 | @@ -531,7 +532,6 @@ void fuse_conn_put(struct fuse_conn *fc) |
784 | if (fc->destroy_req) |
785 | fuse_request_free(fc->destroy_req); |
786 | mutex_destroy(&fc->inst_mutex); |
787 | - bdi_destroy(&fc->bdi); |
788 | kfree(fc); |
789 | } |
790 | } |
791 | @@ -832,12 +832,16 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent) |
792 | if (!file) |
793 | return -EINVAL; |
794 | |
795 | - if (file->f_op != &fuse_dev_operations) |
796 | + if (file->f_op != &fuse_dev_operations) { |
797 | + fput(file); |
798 | return -EINVAL; |
799 | + } |
800 | |
801 | fc = new_conn(sb); |
802 | - if (!fc) |
803 | + if (!fc) { |
804 | + fput(file); |
805 | return -ENOMEM; |
806 | + } |
807 | |
808 | fc->flags = d.flags; |
809 | fc->user_id = d.user_id; |
810 | diff --git a/fs/inotify_user.c b/fs/inotify_user.c |
811 | index a13f487..5c92d90 100644 |
812 | --- a/fs/inotify_user.c |
813 | +++ b/fs/inotify_user.c |
814 | @@ -427,10 +427,61 @@ static unsigned int inotify_poll(struct file *file, poll_table *wait) |
815 | return ret; |
816 | } |
817 | |
818 | +/* |
819 | + * Get an inotify_kernel_event if one exists and is small |
820 | + * enough to fit in "count". Return an error pointer if |
821 | + * not large enough. |
822 | + * |
823 | + * Called with the device ev_mutex held. |
824 | + */ |
825 | +static struct inotify_kernel_event *get_one_event(struct inotify_device *dev, |
826 | + size_t count) |
827 | +{ |
828 | + size_t event_size = sizeof(struct inotify_event); |
829 | + struct inotify_kernel_event *kevent; |
830 | + |
831 | + if (list_empty(&dev->events)) |
832 | + return NULL; |
833 | + |
834 | + kevent = inotify_dev_get_event(dev); |
835 | + if (kevent->name) |
836 | + event_size += kevent->event.len; |
837 | + |
838 | + if (event_size > count) |
839 | + return ERR_PTR(-EINVAL); |
840 | + |
841 | + remove_kevent(dev, kevent); |
842 | + return kevent; |
843 | +} |
844 | + |
845 | +/* |
846 | + * Copy an event to user space, returning how much we copied. |
847 | + * |
848 | + * We already checked that the event size is smaller than the |
849 | + * buffer we had in "get_one_event()" above. |
850 | + */ |
851 | +static ssize_t copy_event_to_user(struct inotify_kernel_event *kevent, |
852 | + char __user *buf) |
853 | +{ |
854 | + size_t event_size = sizeof(struct inotify_event); |
855 | + |
856 | + if (copy_to_user(buf, &kevent->event, event_size)) |
857 | + return -EFAULT; |
858 | + |
859 | + if (kevent->name) { |
860 | + buf += event_size; |
861 | + |
862 | + if (copy_to_user(buf, kevent->name, kevent->event.len)) |
863 | + return -EFAULT; |
864 | + |
865 | + event_size += kevent->event.len; |
866 | + } |
867 | + return event_size; |
868 | +} |
869 | + |
870 | static ssize_t inotify_read(struct file *file, char __user *buf, |
871 | size_t count, loff_t *pos) |
872 | { |
873 | - size_t event_size = sizeof (struct inotify_event); |
874 | struct inotify_device *dev; |
875 | char __user *start; |
876 | int ret; |
877 | @@ -440,81 +491,43 @@ static ssize_t inotify_read(struct file *file, char __user *buf, |
878 | dev = file->private_data; |
879 | |
880 | while (1) { |
881 | + struct inotify_kernel_event *kevent; |
882 | |
883 | prepare_to_wait(&dev->wq, &wait, TASK_INTERRUPTIBLE); |
884 | |
885 | mutex_lock(&dev->ev_mutex); |
886 | - if (!list_empty(&dev->events)) { |
887 | - ret = 0; |
888 | - break; |
889 | - } |
890 | + kevent = get_one_event(dev, count); |
891 | mutex_unlock(&dev->ev_mutex); |
892 | |
893 | - if (file->f_flags & O_NONBLOCK) { |
894 | - ret = -EAGAIN; |
895 | - break; |
896 | - } |
897 | - |
898 | - if (signal_pending(current)) { |
899 | - ret = -EINTR; |
900 | - break; |
901 | + if (kevent) { |
902 | + ret = PTR_ERR(kevent); |
903 | + if (IS_ERR(kevent)) |
904 | + break; |
905 | + ret = copy_event_to_user(kevent, buf); |
906 | + free_kevent(kevent); |
907 | + if (ret < 0) |
908 | + break; |
909 | + buf += ret; |
910 | + count -= ret; |
911 | + continue; |
912 | } |
913 | |
914 | - schedule(); |
915 | - } |
916 | - |
917 | - finish_wait(&dev->wq, &wait); |
918 | - if (ret) |
919 | - return ret; |
920 | - |
921 | - while (1) { |
922 | - struct inotify_kernel_event *kevent; |
923 | - |
924 | - ret = buf - start; |
925 | - if (list_empty(&dev->events)) |
926 | + ret = -EAGAIN; |
927 | + if (file->f_flags & O_NONBLOCK) |
928 | break; |
929 | - |
930 | - kevent = inotify_dev_get_event(dev); |
931 | - if (event_size + kevent->event.len > count) { |
932 | - if (ret == 0 && count > 0) { |
933 | - /* |
934 | - * could not get a single event because we |
935 | - * didn't have enough buffer space. |
936 | - */ |
937 | - ret = -EINVAL; |
938 | - } |
939 | + ret = -EINTR; |
940 | + if (signal_pending(current)) |
941 | break; |
942 | - } |
943 | - remove_kevent(dev, kevent); |
944 | |
945 | - /* |
946 | - * Must perform the copy_to_user outside the mutex in order |
947 | - * to avoid a lock order reversal with mmap_sem. |
948 | - */ |
949 | - mutex_unlock(&dev->ev_mutex); |
950 | - |
951 | - if (copy_to_user(buf, &kevent->event, event_size)) { |
952 | - ret = -EFAULT; |
953 | + if (start != buf) |
954 | break; |
955 | - } |
956 | - buf += event_size; |
957 | - count -= event_size; |
958 | - |
959 | - if (kevent->name) { |
960 | - if (copy_to_user(buf, kevent->name, kevent->event.len)){ |
961 | - ret = -EFAULT; |
962 | - break; |
963 | - } |
964 | - buf += kevent->event.len; |
965 | - count -= kevent->event.len; |
966 | - } |
967 | - |
968 | - free_kevent(kevent); |
969 | |
970 | - mutex_lock(&dev->ev_mutex); |
971 | + schedule(); |
972 | } |
973 | - mutex_unlock(&dev->ev_mutex); |
974 | |
975 | + finish_wait(&dev->wq, &wait); |
976 | + if (start != buf && ret != -EFAULT) |
977 | + ret = buf - start; |
978 | return ret; |
979 | } |
980 | |
981 | diff --git a/fs/sysfs/bin.c b/fs/sysfs/bin.c |
982 | index 006fc64..aa24484 100644 |
983 | --- a/fs/sysfs/bin.c |
984 | +++ b/fs/sysfs/bin.c |
985 | @@ -62,6 +62,9 @@ read(struct file *file, char __user *userbuf, size_t bytes, loff_t *off) |
986 | loff_t offs = *off; |
987 | int count = min_t(size_t, bytes, PAGE_SIZE); |
988 | |
989 | + if (!bytes) |
990 | + return 0; |
991 | + |
992 | if (size) { |
993 | if (offs > size) |
994 | return 0; |
995 | @@ -119,6 +122,9 @@ static ssize_t write(struct file *file, const char __user *userbuf, |
996 | loff_t offs = *off; |
997 | int count = min_t(size_t, bytes, PAGE_SIZE); |
998 | |
999 | + if (!bytes) |
1000 | + return 0; |
1001 | + |
1002 | if (size) { |
1003 | if (offs > size) |
1004 | return 0; |
1005 | diff --git a/include/asm-x86/pgalloc.h b/include/asm-x86/pgalloc.h |
1006 | index d63ea43..36ef40d 100644 |
1007 | --- a/include/asm-x86/pgalloc.h |
1008 | +++ b/include/asm-x86/pgalloc.h |
1009 | @@ -42,6 +42,7 @@ static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) |
1010 | |
1011 | static inline void pte_free(struct mm_struct *mm, struct page *pte) |
1012 | { |
1013 | + pgtable_page_dtor(pte); |
1014 | __free_page(pte); |
1015 | } |
1016 | |
1017 | diff --git a/include/linux/Kbuild b/include/linux/Kbuild |
1018 | index b68ec09..d5eb2e7 100644 |
1019 | --- a/include/linux/Kbuild |
1020 | +++ b/include/linux/Kbuild |
1021 | @@ -41,6 +41,7 @@ header-y += baycom.h |
1022 | header-y += bfs_fs.h |
1023 | header-y += blkpg.h |
1024 | header-y += bpqether.h |
1025 | +header-y += bsg.h |
1026 | header-y += can.h |
1027 | header-y += cdk.h |
1028 | header-y += chio.h |
1029 | diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h |
1030 | index f1624b3..391cbf3 100644 |
1031 | --- a/include/linux/pci_ids.h |
1032 | +++ b/include/linux/pci_ids.h |
1033 | @@ -1346,6 +1346,7 @@ |
1034 | #define PCI_DEVICE_ID_VIA_8783_0 0x3208 |
1035 | #define PCI_DEVICE_ID_VIA_8237 0x3227 |
1036 | #define PCI_DEVICE_ID_VIA_8251 0x3287 |
1037 | +#define PCI_DEVICE_ID_VIA_8261 0x3402 |
1038 | #define PCI_DEVICE_ID_VIA_8237A 0x3337 |
1039 | #define PCI_DEVICE_ID_VIA_8237S 0x3372 |
1040 | #define PCI_DEVICE_ID_VIA_SATA_EIDE 0x5324 |
1041 | @@ -1355,10 +1356,13 @@ |
1042 | #define PCI_DEVICE_ID_VIA_CX700 0x8324 |
1043 | #define PCI_DEVICE_ID_VIA_CX700_IDE 0x0581 |
1044 | #define PCI_DEVICE_ID_VIA_VX800 0x8353 |
1045 | +#define PCI_DEVICE_ID_VIA_VX855 0x8409 |
1046 | #define PCI_DEVICE_ID_VIA_8371_1 0x8391 |
1047 | #define PCI_DEVICE_ID_VIA_82C598_1 0x8598 |
1048 | #define PCI_DEVICE_ID_VIA_838X_1 0xB188 |
1049 | #define PCI_DEVICE_ID_VIA_83_87XX_1 0xB198 |
1050 | +#define PCI_DEVICE_ID_VIA_C409_IDE 0XC409 |
1051 | +#define PCI_DEVICE_ID_VIA_ANON 0xFFFF |
1052 | |
1053 | #define PCI_VENDOR_ID_SIEMENS 0x110A |
1054 | #define PCI_DEVICE_ID_SIEMENS_DSCC4 0x2102 |
1055 | @@ -1780,6 +1784,7 @@ |
1056 | #define PCI_DEVICE_ID_SEALEVEL_UCOMM232 0x7202 |
1057 | #define PCI_DEVICE_ID_SEALEVEL_COMM4 0x7401 |
1058 | #define PCI_DEVICE_ID_SEALEVEL_COMM8 0x7801 |
1059 | +#define PCI_DEVICE_ID_SEALEVEL_7803 0x7803 |
1060 | #define PCI_DEVICE_ID_SEALEVEL_UCOMM8 0x7804 |
1061 | |
1062 | #define PCI_VENDOR_ID_HYPERCOPE 0x1365 |
1063 | @@ -2148,6 +2153,7 @@ |
1064 | #define PCI_DEVICE_ID_RDC_R6040 0x6040 |
1065 | #define PCI_DEVICE_ID_RDC_R6060 0x6060 |
1066 | #define PCI_DEVICE_ID_RDC_R6061 0x6061 |
1067 | +#define PCI_DEVICE_ID_RDC_D1010 0x1010 |
1068 | |
1069 | #define PCI_VENDOR_ID_LENOVO 0x17aa |
1070 | |
1071 | diff --git a/include/linux/sched.h b/include/linux/sched.h |
1072 | index 086f5e1..03e0902 100644 |
1073 | --- a/include/linux/sched.h |
1074 | +++ b/include/linux/sched.h |
1075 | @@ -588,7 +588,6 @@ struct user_struct { |
1076 | atomic_t inotify_devs; /* How many inotify devs does this user have opened? */ |
1077 | #endif |
1078 | #ifdef CONFIG_EPOLL |
1079 | - atomic_t epoll_devs; /* The number of epoll descriptors currently open */ |
1080 | atomic_t epoll_watches; /* The number of file descriptors currently watched */ |
1081 | #endif |
1082 | #ifdef CONFIG_POSIX_MQUEUE |
1083 | diff --git a/kernel/relay.c b/kernel/relay.c |
1084 | index 8d13a78..b0bbf6f 100644 |
1085 | --- a/kernel/relay.c |
1086 | +++ b/kernel/relay.c |
1087 | @@ -664,8 +664,10 @@ int relay_late_setup_files(struct rchan *chan, |
1088 | |
1089 | mutex_lock(&relay_channels_mutex); |
1090 | /* Is chan already set up? */ |
1091 | - if (unlikely(chan->has_base_filename)) |
1092 | + if (unlikely(chan->has_base_filename)) { |
1093 | + mutex_unlock(&relay_channels_mutex); |
1094 | return -EEXIST; |
1095 | + } |
1096 | chan->has_base_filename = 1; |
1097 | chan->parent = parent; |
1098 | curr_cpu = get_cpu(); |
1099 | diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c |
1100 | index 4788f7b..56ad58d 100644 |
1101 | --- a/net/mac80211/tx.c |
1102 | +++ b/net/mac80211/tx.c |
1103 | @@ -1335,8 +1335,10 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, |
1104 | if (is_multicast_ether_addr(hdr->addr3)) |
1105 | memcpy(hdr->addr1, hdr->addr3, ETH_ALEN); |
1106 | else |
1107 | - if (mesh_nexthop_lookup(skb, odev)) |
1108 | + if (mesh_nexthop_lookup(skb, odev)) { |
1109 | + dev_put(odev); |
1110 | return 0; |
1111 | + } |
1112 | if (memcmp(odev->dev_addr, hdr->addr4, ETH_ALEN) != 0) |
1113 | IEEE80211_IFSTA_MESH_CTR_INC(&osdata->u.sta, |
1114 | fwded_frames); |
1115 | diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c |
1116 | index 24db2b4..0a22f00 100644 |
1117 | --- a/net/sunrpc/rpcb_clnt.c |
1118 | +++ b/net/sunrpc/rpcb_clnt.c |
1119 | @@ -469,6 +469,28 @@ static struct rpc_task *rpcb_call_async(struct rpc_clnt *rpcb_clnt, struct rpcbi |
1120 | return rpc_run_task(&task_setup_data); |
1121 | } |
1122 | |
1123 | +/* |
1124 | + * In the case where rpc clients have been cloned, we want to make |
1125 | + * sure that we use the program number/version etc of the actual |
1126 | + * owner of the xprt. To do so, we walk back up the tree of parents |
1127 | + * to find whoever created the transport and/or whoever has the |
1128 | + * autobind flag set. |
1129 | + */ |
1130 | +static struct rpc_clnt *rpcb_find_transport_owner(struct rpc_clnt *clnt) |
1131 | +{ |
1132 | + struct rpc_clnt *parent = clnt->cl_parent; |
1133 | + |
1134 | + while (parent != clnt) { |
1135 | + if (parent->cl_xprt != clnt->cl_xprt) |
1136 | + break; |
1137 | + if (clnt->cl_autobind) |
1138 | + break; |
1139 | + clnt = parent; |
1140 | + parent = parent->cl_parent; |
1141 | + } |
1142 | + return clnt; |
1143 | +} |
1144 | + |
1145 | /** |
1146 | * rpcb_getport_async - obtain the port for a given RPC service on a given host |
1147 | * @task: task that is waiting for portmapper request |
1148 | @@ -478,10 +500,10 @@ static struct rpc_task *rpcb_call_async(struct rpc_clnt *rpcb_clnt, struct rpcbi |
1149 | */ |
1150 | void rpcb_getport_async(struct rpc_task *task) |
1151 | { |
1152 | - struct rpc_clnt *clnt = task->tk_client; |
1153 | + struct rpc_clnt *clnt; |
1154 | struct rpc_procinfo *proc; |
1155 | u32 bind_version; |
1156 | - struct rpc_xprt *xprt = task->tk_xprt; |
1157 | + struct rpc_xprt *xprt; |
1158 | struct rpc_clnt *rpcb_clnt; |
1159 | static struct rpcbind_args *map; |
1160 | struct rpc_task *child; |
1161 | @@ -490,13 +512,13 @@ void rpcb_getport_async(struct rpc_task *task) |
1162 | size_t salen; |
1163 | int status; |
1164 | |
1165 | + clnt = rpcb_find_transport_owner(task->tk_client); |
1166 | + xprt = clnt->cl_xprt; |
1167 | + |
1168 | dprintk("RPC: %5u %s(%s, %u, %u, %d)\n", |
1169 | task->tk_pid, __func__, |
1170 | clnt->cl_server, clnt->cl_prog, clnt->cl_vers, xprt->prot); |
1171 | |
1172 | - /* Autobind on cloned rpc clients is discouraged */ |
1173 | - BUG_ON(clnt->cl_parent != clnt); |
1174 | - |
1175 | /* Put self on the wait queue to ensure we get notified if |
1176 | * some other task is already attempting to bind the port */ |
1177 | rpc_sleep_on(&xprt->binding, task, NULL); |
1178 | @@ -558,7 +580,7 @@ void rpcb_getport_async(struct rpc_task *task) |
1179 | status = -ENOMEM; |
1180 | dprintk("RPC: %5u %s: no memory available\n", |
1181 | task->tk_pid, __func__); |
1182 | - goto bailout_nofree; |
1183 | + goto bailout_release_client; |
1184 | } |
1185 | map->r_prog = clnt->cl_prog; |
1186 | map->r_vers = clnt->cl_vers; |
1187 | @@ -578,11 +600,13 @@ void rpcb_getport_async(struct rpc_task *task) |
1188 | task->tk_pid, __func__); |
1189 | return; |
1190 | } |
1191 | - rpc_put_task(child); |
1192 | |
1193 | - task->tk_xprt->stat.bind_count++; |
1194 | + xprt->stat.bind_count++; |
1195 | + rpc_put_task(child); |
1196 | return; |
1197 | |
1198 | +bailout_release_client: |
1199 | + rpc_release_client(rpcb_clnt); |
1200 | bailout_nofree: |
1201 | rpcb_wake_rpcbind_waiters(xprt, status); |
1202 | task->tk_status = status; |
1203 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c |
1204 | index 7c1eb23..a50089f 100644 |
1205 | --- a/sound/pci/hda/patch_conexant.c |
1206 | +++ b/sound/pci/hda/patch_conexant.c |
1207 | @@ -1470,6 +1470,7 @@ static struct snd_pci_quirk cxt5047_cfg_tbl[] = { |
1208 | SND_PCI_QUIRK(0x103c, 0x30a5, "HP DV5200T/DV8000T", CXT5047_LAPTOP_HP), |
1209 | SND_PCI_QUIRK(0x103c, 0x30b2, "HP DV2000T/DV3000T", CXT5047_LAPTOP), |
1210 | SND_PCI_QUIRK(0x103c, 0x30b5, "HP DV2000Z", CXT5047_LAPTOP), |
1211 | + SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6700", CXT5047_LAPTOP), |
1212 | SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba P100", CXT5047_LAPTOP_EAPD), |
1213 | {} |
1214 | }; |
1215 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
1216 | index 7225f0f..aa7dc03 100644 |
1217 | --- a/sound/pci/hda/patch_realtek.c |
1218 | +++ b/sound/pci/hda/patch_realtek.c |
1219 | @@ -6631,6 +6631,7 @@ static int patch_alc882(struct hda_codec *codec) |
1220 | case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */ |
1221 | case 0x106b2c00: /* Macbook Pro rev3 */ |
1222 | case 0x106b3600: /* Macbook 3.1 */ |
1223 | + case 0x106b3800: /* MacbookPro4,1 - latter revision */ |
1224 | board_config = ALC885_MBP3; |
1225 | break; |
1226 | default: |
1227 | diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c |
1228 | index fdef553..2f52cf1 100644 |
1229 | --- a/sound/pci/hda/patch_sigmatel.c |
1230 | +++ b/sound/pci/hda/patch_sigmatel.c |
1231 | @@ -2048,6 +2048,8 @@ static int stac92xx_build_pcms(struct hda_codec *codec) |
1232 | |
1233 | info->name = "STAC92xx Analog"; |
1234 | info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback; |
1235 | + info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = |
1236 | + spec->multiout.dac_nids[0]; |
1237 | info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture; |
1238 | info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0]; |
1239 | info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs; |
1240 | diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c |
1241 | index 01d7b75..82a7814 100644 |
1242 | --- a/sound/pci/oxygen/virtuoso.c |
1243 | +++ b/sound/pci/oxygen/virtuoso.c |
1244 | @@ -26,7 +26,7 @@ |
1245 | * SPI 0 -> 1st PCM1796 (front) |
1246 | * SPI 1 -> 2nd PCM1796 (surround) |
1247 | * SPI 2 -> 3rd PCM1796 (center/LFE) |
1248 | - * SPI 4 -> 4th PCM1796 (back) |
1249 | + * SPI 4 -> 4th PCM1796 (back) and EEPROM self-destruct (do not use!) |
1250 | * |
1251 | * GPIO 2 -> M0 of CS5381 |
1252 | * GPIO 3 -> M1 of CS5381 |
1253 | @@ -142,6 +142,12 @@ struct xonar_data { |
1254 | static void pcm1796_write(struct oxygen *chip, unsigned int codec, |
1255 | u8 reg, u8 value) |
1256 | { |
1257 | + /* |
1258 | + * We don't want to do writes on SPI 4 because the EEPROM, which shares |
1259 | + * the same pin, might get confused and broken. We'd better take care |
1260 | + * that the driver works with the default register values ... |
1261 | + */ |
1262 | +#if 0 |
1263 | /* maps ALSA channel pair number to SPI output */ |
1264 | static const u8 codec_map[4] = { |
1265 | 0, 1, 2, 4 |
1266 | @@ -152,6 +158,7 @@ static void pcm1796_write(struct oxygen *chip, unsigned int codec, |
1267 | (codec_map[codec] << OXYGEN_SPI_CODEC_SHIFT) | |
1268 | OXYGEN_SPI_CEN_LATCH_CLOCK_HI, |
1269 | (reg << 8) | value); |
1270 | +#endif |
1271 | } |
1272 | |
1273 | static void cs4398_write(struct oxygen *chip, u8 reg, u8 value) |
1274 | @@ -539,6 +546,9 @@ static const DECLARE_TLV_DB_SCALE(cs4362a_db_scale, -12700, 100, 0); |
1275 | |
1276 | static int xonar_d2_control_filter(struct snd_kcontrol_new *template) |
1277 | { |
1278 | + if (!strncmp(template->name, "Master Playback ", 16)) |
1279 | + /* disable volume/mute because they would require SPI writes */ |
1280 | + return 1; |
1281 | if (!strncmp(template->name, "CD Capture ", 11)) |
1282 | /* CD in is actually connected to the video in pin */ |
1283 | template->private_value ^= AC97_CD ^ AC97_VIDEO; |
1284 | @@ -588,9 +598,8 @@ static const struct oxygen_model xonar_models[] = { |
1285 | .dac_volume_min = 0x0f, |
1286 | .dac_volume_max = 0xff, |
1287 | .misc_flags = OXYGEN_MISC_MIDI, |
1288 | - .function_flags = OXYGEN_FUNCTION_SPI | |
1289 | - OXYGEN_FUNCTION_ENABLE_SPI_4_5, |
1290 | - .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
1291 | + .function_flags = OXYGEN_FUNCTION_SPI, |
1292 | + .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S, |
1293 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
1294 | }, |
1295 | [MODEL_D2X] = { |
1296 | @@ -619,9 +628,8 @@ static const struct oxygen_model xonar_models[] = { |
1297 | .dac_volume_min = 0x0f, |
1298 | .dac_volume_max = 0xff, |
1299 | .misc_flags = OXYGEN_MISC_MIDI, |
1300 | - .function_flags = OXYGEN_FUNCTION_SPI | |
1301 | - OXYGEN_FUNCTION_ENABLE_SPI_4_5, |
1302 | - .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
1303 | + .function_flags = OXYGEN_FUNCTION_SPI, |
1304 | + .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S, |
1305 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
1306 | }, |
1307 | [MODEL_D1] = { |