Contents of /trunk/kernel26-magellan-server/patches-2.6.27-r2/0101-2.6.27.2-all-fixes.patch
Parent Directory | Revision Log
Revision 728 -
(show annotations)
(download)
Tue Dec 23 09:41:15 2008 UTC (15 years, 9 months ago) by niro
File size: 19734 byte(s)
Tue Dec 23 09:41:15 2008 UTC (15 years, 9 months ago) by niro
File size: 19734 byte(s)
-ver bump to 2.6.27-r2: - updated to linux-2.6.27.10 - using tuxonice current-20081025 - adjusted kernel-configs to use tuxonice and enabled ufs filesystem support
1 | diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c |
2 | index 65a0c1b..f509cfc 100644 |
3 | --- a/arch/x86/kernel/alternative.c |
4 | +++ b/arch/x86/kernel/alternative.c |
5 | @@ -444,7 +444,7 @@ void __init alternative_instructions(void) |
6 | _text, _etext); |
7 | |
8 | /* Only switch to UP mode if we don't immediately boot others */ |
9 | - if (num_possible_cpus() == 1 || setup_max_cpus <= 1) |
10 | + if (num_present_cpus() == 1 || setup_max_cpus <= 1) |
11 | alternatives_smp_switch(0); |
12 | } |
13 | #endif |
14 | diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c |
15 | index 4353cf5..6b839b1 100644 |
16 | --- a/arch/x86/kernel/early-quirks.c |
17 | +++ b/arch/x86/kernel/early-quirks.c |
18 | @@ -95,6 +95,52 @@ static void __init nvidia_bugs(int num, int slot, int func) |
19 | |
20 | } |
21 | |
22 | +static u32 ati_ixp4x0_rev(int num, int slot, int func) |
23 | +{ |
24 | + u32 d; |
25 | + u8 b; |
26 | + |
27 | + b = read_pci_config_byte(num, slot, func, 0xac); |
28 | + b &= ~(1<<5); |
29 | + write_pci_config_byte(num, slot, func, 0xac, b); |
30 | + |
31 | + d = read_pci_config(num, slot, func, 0x70); |
32 | + d |= 1<<8; |
33 | + write_pci_config(num, slot, func, 0x70, d); |
34 | + |
35 | + d = read_pci_config(num, slot, func, 0x8); |
36 | + d &= 0xff; |
37 | + return d; |
38 | +} |
39 | + |
40 | +static void __init ati_bugs(int num, int slot, int func) |
41 | +{ |
42 | +#if defined(CONFIG_ACPI) && defined (CONFIG_X86_IO_APIC) |
43 | + u32 d; |
44 | + u8 b; |
45 | + |
46 | + if (acpi_use_timer_override) |
47 | + return; |
48 | + |
49 | + d = ati_ixp4x0_rev(num, slot, func); |
50 | + if (d < 0x82) |
51 | + acpi_skip_timer_override = 1; |
52 | + else { |
53 | + /* check for IRQ0 interrupt swap */ |
54 | + outb(0x72, 0xcd6); b = inb(0xcd7); |
55 | + if (!(b & 0x2)) |
56 | + acpi_skip_timer_override = 1; |
57 | + } |
58 | + |
59 | + if (acpi_skip_timer_override) { |
60 | + printk(KERN_INFO "SB4X0 revision 0x%x\n", d); |
61 | + printk(KERN_INFO "Ignoring ACPI timer override.\n"); |
62 | + printk(KERN_INFO "If you got timer trouble " |
63 | + "try acpi_use_timer_override\n"); |
64 | + } |
65 | +#endif |
66 | +} |
67 | + |
68 | #define QFLAG_APPLY_ONCE 0x1 |
69 | #define QFLAG_APPLIED 0x2 |
70 | #define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED) |
71 | @@ -114,6 +160,8 @@ static struct chipset early_qrk[] __initdata = { |
72 | PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, via_bugs }, |
73 | { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB, |
74 | PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, fix_hypertransport_config }, |
75 | + { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS, |
76 | + PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs }, |
77 | {} |
78 | }; |
79 | |
80 | diff --git a/arch/x86/kernel/io_apic_32.c b/arch/x86/kernel/io_apic_32.c |
81 | index 09cddb5..bfd9fc5 100644 |
82 | --- a/arch/x86/kernel/io_apic_32.c |
83 | +++ b/arch/x86/kernel/io_apic_32.c |
84 | @@ -2314,6 +2314,9 @@ void __init setup_IO_APIC(void) |
85 | for (i = first_system_vector; i < NR_VECTORS; i++) |
86 | set_bit(i, used_vectors); |
87 | |
88 | + /* Mark FIRST_DEVICE_VECTOR which is assigned to IRQ0 as used. */ |
89 | + set_bit(FIRST_DEVICE_VECTOR, used_vectors); |
90 | + |
91 | enable_IO_APIC(); |
92 | |
93 | io_apic_irqs = ~PIC_IRQS; |
94 | diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c |
95 | index d4b6e6a..d0975fc 100644 |
96 | --- a/arch/x86/mm/ioremap.c |
97 | +++ b/arch/x86/mm/ioremap.c |
98 | @@ -595,7 +595,7 @@ void __init *early_ioremap(unsigned long phys_addr, unsigned long size) |
99 | */ |
100 | offset = phys_addr & ~PAGE_MASK; |
101 | phys_addr &= PAGE_MASK; |
102 | - size = PAGE_ALIGN(last_addr) - phys_addr; |
103 | + size = PAGE_ALIGN(last_addr + 1) - phys_addr; |
104 | |
105 | /* |
106 | * Mappings have to fit in the FIX_BTMAP area. |
107 | diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c |
108 | index e4dce87..0232485 100644 |
109 | --- a/drivers/char/tty_io.c |
110 | +++ b/drivers/char/tty_io.c |
111 | @@ -2996,7 +2996,7 @@ long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
112 | case TIOCSTI: |
113 | return tiocsti(tty, p); |
114 | case TIOCGWINSZ: |
115 | - return tiocgwinsz(tty, p); |
116 | + return tiocgwinsz(real_tty, p); |
117 | case TIOCSWINSZ: |
118 | return tiocswinsz(tty, real_tty, p); |
119 | case TIOCCONS: |
120 | diff --git a/drivers/net/atl1e/atl1e_main.c b/drivers/net/atl1e/atl1e_main.c |
121 | index 7685b99..9b60352 100644 |
122 | --- a/drivers/net/atl1e/atl1e_main.c |
123 | +++ b/drivers/net/atl1e/atl1e_main.c |
124 | @@ -2390,9 +2390,7 @@ static int __devinit atl1e_probe(struct pci_dev *pdev, |
125 | } |
126 | |
127 | /* Init GPHY as early as possible due to power saving issue */ |
128 | - spin_lock(&adapter->mdio_lock); |
129 | atl1e_phy_init(&adapter->hw); |
130 | - spin_unlock(&adapter->mdio_lock); |
131 | /* reset the controller to |
132 | * put the device in a known good starting state */ |
133 | err = atl1e_reset_hw(&adapter->hw); |
134 | diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c |
135 | index e24b25c..b4be33a 100644 |
136 | --- a/drivers/net/sky2.c |
137 | +++ b/drivers/net/sky2.c |
138 | @@ -3034,7 +3034,8 @@ static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) |
139 | struct sky2_port *sky2 = netdev_priv(dev); |
140 | struct sky2_hw *hw = sky2->hw; |
141 | |
142 | - if (wol->wolopts & ~sky2_wol_supported(sky2->hw)) |
143 | + if ((wol->wolopts & ~sky2_wol_supported(sky2->hw)) |
144 | + || !device_can_wakeup(&hw->pdev->dev)) |
145 | return -EOPNOTSUPP; |
146 | |
147 | sky2->wol = wol->wolopts; |
148 | @@ -3045,6 +3046,8 @@ static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) |
149 | sky2_write32(hw, B0_CTST, sky2->wol |
150 | ? Y2_HW_WOL_ON : Y2_HW_WOL_OFF); |
151 | |
152 | + device_set_wakeup_enable(&hw->pdev->dev, sky2->wol); |
153 | + |
154 | if (!netif_running(dev)) |
155 | sky2_wol_init(sky2); |
156 | return 0; |
157 | @@ -4166,18 +4169,6 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw) |
158 | return err; |
159 | } |
160 | |
161 | -static int __devinit pci_wake_enabled(struct pci_dev *dev) |
162 | -{ |
163 | - int pm = pci_find_capability(dev, PCI_CAP_ID_PM); |
164 | - u16 value; |
165 | - |
166 | - if (!pm) |
167 | - return 0; |
168 | - if (pci_read_config_word(dev, pm + PCI_PM_CTRL, &value)) |
169 | - return 0; |
170 | - return value & PCI_PM_CTRL_PME_ENABLE; |
171 | -} |
172 | - |
173 | /* This driver supports yukon2 chipset only */ |
174 | static const char *sky2_name(u8 chipid, char *buf, int sz) |
175 | { |
176 | @@ -4238,7 +4229,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev, |
177 | } |
178 | } |
179 | |
180 | - wol_default = pci_wake_enabled(pdev) ? WAKE_MAGIC : 0; |
181 | + wol_default = device_may_wakeup(&pdev->dev) ? WAKE_MAGIC : 0; |
182 | |
183 | err = -ENOMEM; |
184 | hw = kzalloc(sizeof(*hw), GFP_KERNEL); |
185 | diff --git a/drivers/net/wireless/b43legacy/xmit.c b/drivers/net/wireless/b43legacy/xmit.c |
186 | index 68e1f8c..8d5ff62 100644 |
187 | --- a/drivers/net/wireless/b43legacy/xmit.c |
188 | +++ b/drivers/net/wireless/b43legacy/xmit.c |
189 | @@ -626,7 +626,7 @@ void b43legacy_handle_hwtxstatus(struct b43legacy_wldev *dev, |
190 | tmp = hw->count; |
191 | status.frame_count = (tmp >> 4); |
192 | status.rts_count = (tmp & 0x0F); |
193 | - tmp = hw->flags; |
194 | + tmp = hw->flags << 1; |
195 | status.supp_reason = ((tmp & 0x1C) >> 2); |
196 | status.pm_indicated = !!(tmp & 0x80); |
197 | status.intermediate = !!(tmp & 0x40); |
198 | diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c |
199 | index bd32ac0..5bcf561 100644 |
200 | --- a/drivers/net/wireless/libertas/main.c |
201 | +++ b/drivers/net/wireless/libertas/main.c |
202 | @@ -1196,7 +1196,13 @@ void lbs_remove_card(struct lbs_private *priv) |
203 | cancel_delayed_work_sync(&priv->scan_work); |
204 | cancel_delayed_work_sync(&priv->assoc_work); |
205 | cancel_work_sync(&priv->mcast_work); |
206 | + |
207 | + /* worker thread destruction blocks on the in-flight command which |
208 | + * should have been cleared already in lbs_stop_card(). |
209 | + */ |
210 | + lbs_deb_main("destroying worker thread\n"); |
211 | destroy_workqueue(priv->work_thread); |
212 | + lbs_deb_main("done destroying worker thread\n"); |
213 | |
214 | if (priv->psmode == LBS802_11POWERMODEMAX_PSP) { |
215 | priv->psmode = LBS802_11POWERMODECAM; |
216 | @@ -1314,14 +1320,26 @@ void lbs_stop_card(struct lbs_private *priv) |
217 | device_remove_file(&dev->dev, &dev_attr_lbs_rtap); |
218 | } |
219 | |
220 | - /* Flush pending command nodes */ |
221 | + /* Delete the timeout of the currently processing command */ |
222 | del_timer_sync(&priv->command_timer); |
223 | + |
224 | + /* Flush pending command nodes */ |
225 | spin_lock_irqsave(&priv->driver_lock, flags); |
226 | + lbs_deb_main("clearing pending commands\n"); |
227 | list_for_each_entry(cmdnode, &priv->cmdpendingq, list) { |
228 | cmdnode->result = -ENOENT; |
229 | cmdnode->cmdwaitqwoken = 1; |
230 | wake_up_interruptible(&cmdnode->cmdwait_q); |
231 | } |
232 | + |
233 | + /* Flush the command the card is currently processing */ |
234 | + if (priv->cur_cmd) { |
235 | + lbs_deb_main("clearing current command\n"); |
236 | + priv->cur_cmd->result = -ENOENT; |
237 | + priv->cur_cmd->cmdwaitqwoken = 1; |
238 | + wake_up_interruptible(&priv->cur_cmd->cmdwait_q); |
239 | + } |
240 | + lbs_deb_main("done clearing commands\n"); |
241 | spin_unlock_irqrestore(&priv->driver_lock, flags); |
242 | |
243 | unregister_netdev(dev); |
244 | diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h |
245 | index 8dfd6f2..0d22479 100644 |
246 | --- a/fs/cifs/cifsglob.h |
247 | +++ b/fs/cifs/cifsglob.h |
248 | @@ -309,6 +309,7 @@ struct cifs_search_info { |
249 | __u32 resume_key; |
250 | char *ntwrk_buf_start; |
251 | char *srch_entries_start; |
252 | + char *last_entry; |
253 | char *presume_name; |
254 | unsigned int resume_name_len; |
255 | bool endOfSearch:1; |
256 | diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c |
257 | index 994de7c..77a0d1f 100644 |
258 | --- a/fs/cifs/cifssmb.c |
259 | +++ b/fs/cifs/cifssmb.c |
260 | @@ -3636,6 +3636,8 @@ findFirstRetry: |
261 | le16_to_cpu(parms->SearchCount); |
262 | psrch_inf->index_of_last_entry = 2 /* skip . and .. */ + |
263 | psrch_inf->entries_in_buffer; |
264 | + psrch_inf->last_entry = psrch_inf->srch_entries_start + |
265 | + le16_to_cpu(parms->LastNameOffset); |
266 | *pnetfid = parms->SearchHandle; |
267 | } else { |
268 | cifs_buf_release(pSMB); |
269 | @@ -3751,6 +3753,8 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon, |
270 | le16_to_cpu(parms->SearchCount); |
271 | psrch_inf->index_of_last_entry += |
272 | psrch_inf->entries_in_buffer; |
273 | + psrch_inf->last_entry = psrch_inf->srch_entries_start + |
274 | + le16_to_cpu(parms->LastNameOffset); |
275 | /* cFYI(1,("fnxt2 entries in buf %d index_of_last %d", |
276 | psrch_inf->entries_in_buffer, psrch_inf->index_of_last_entry)); */ |
277 | |
278 | diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c |
279 | index 5f40ed3..765adf1 100644 |
280 | --- a/fs/cifs/readdir.c |
281 | +++ b/fs/cifs/readdir.c |
282 | @@ -640,6 +640,70 @@ static int is_dir_changed(struct file *file) |
283 | |
284 | } |
285 | |
286 | +static int cifs_save_resume_key(const char *current_entry, |
287 | + struct cifsFileInfo *cifsFile) |
288 | +{ |
289 | + int rc = 0; |
290 | + unsigned int len = 0; |
291 | + __u16 level; |
292 | + char *filename; |
293 | + |
294 | + if ((cifsFile == NULL) || (current_entry == NULL)) |
295 | + return -EINVAL; |
296 | + |
297 | + level = cifsFile->srch_inf.info_level; |
298 | + |
299 | + if (level == SMB_FIND_FILE_UNIX) { |
300 | + FILE_UNIX_INFO *pFindData = (FILE_UNIX_INFO *)current_entry; |
301 | + |
302 | + filename = &pFindData->FileName[0]; |
303 | + if (cifsFile->srch_inf.unicode) { |
304 | + len = cifs_unicode_bytelen(filename); |
305 | + } else { |
306 | + /* BB should we make this strnlen of PATH_MAX? */ |
307 | + len = strnlen(filename, PATH_MAX); |
308 | + } |
309 | + cifsFile->srch_inf.resume_key = pFindData->ResumeKey; |
310 | + } else if (level == SMB_FIND_FILE_DIRECTORY_INFO) { |
311 | + FILE_DIRECTORY_INFO *pFindData = |
312 | + (FILE_DIRECTORY_INFO *)current_entry; |
313 | + filename = &pFindData->FileName[0]; |
314 | + len = le32_to_cpu(pFindData->FileNameLength); |
315 | + cifsFile->srch_inf.resume_key = pFindData->FileIndex; |
316 | + } else if (level == SMB_FIND_FILE_FULL_DIRECTORY_INFO) { |
317 | + FILE_FULL_DIRECTORY_INFO *pFindData = |
318 | + (FILE_FULL_DIRECTORY_INFO *)current_entry; |
319 | + filename = &pFindData->FileName[0]; |
320 | + len = le32_to_cpu(pFindData->FileNameLength); |
321 | + cifsFile->srch_inf.resume_key = pFindData->FileIndex; |
322 | + } else if (level == SMB_FIND_FILE_ID_FULL_DIR_INFO) { |
323 | + SEARCH_ID_FULL_DIR_INFO *pFindData = |
324 | + (SEARCH_ID_FULL_DIR_INFO *)current_entry; |
325 | + filename = &pFindData->FileName[0]; |
326 | + len = le32_to_cpu(pFindData->FileNameLength); |
327 | + cifsFile->srch_inf.resume_key = pFindData->FileIndex; |
328 | + } else if (level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) { |
329 | + FILE_BOTH_DIRECTORY_INFO *pFindData = |
330 | + (FILE_BOTH_DIRECTORY_INFO *)current_entry; |
331 | + filename = &pFindData->FileName[0]; |
332 | + len = le32_to_cpu(pFindData->FileNameLength); |
333 | + cifsFile->srch_inf.resume_key = pFindData->FileIndex; |
334 | + } else if (level == SMB_FIND_FILE_INFO_STANDARD) { |
335 | + FIND_FILE_STANDARD_INFO *pFindData = |
336 | + (FIND_FILE_STANDARD_INFO *)current_entry; |
337 | + filename = &pFindData->FileName[0]; |
338 | + /* one byte length, no name conversion */ |
339 | + len = (unsigned int)pFindData->FileNameLength; |
340 | + cifsFile->srch_inf.resume_key = pFindData->ResumeKey; |
341 | + } else { |
342 | + cFYI(1, ("Unknown findfirst level %d", level)); |
343 | + return -EINVAL; |
344 | + } |
345 | + cifsFile->srch_inf.resume_name_len = len; |
346 | + cifsFile->srch_inf.presume_name = filename; |
347 | + return rc; |
348 | +} |
349 | + |
350 | /* find the corresponding entry in the search */ |
351 | /* Note that the SMB server returns search entries for . and .. which |
352 | complicates logic here if we choose to parse for them and we do not |
353 | @@ -703,6 +767,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, |
354 | while ((index_to_find >= cifsFile->srch_inf.index_of_last_entry) && |
355 | (rc == 0) && !cifsFile->srch_inf.endOfSearch) { |
356 | cFYI(1, ("calling findnext2")); |
357 | + cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile); |
358 | rc = CIFSFindNext(xid, pTcon, cifsFile->netfid, |
359 | &cifsFile->srch_inf); |
360 | if (rc) |
361 | @@ -919,69 +984,6 @@ static int cifs_filldir(char *pfindEntry, struct file *file, |
362 | return rc; |
363 | } |
364 | |
365 | -static int cifs_save_resume_key(const char *current_entry, |
366 | - struct cifsFileInfo *cifsFile) |
367 | -{ |
368 | - int rc = 0; |
369 | - unsigned int len = 0; |
370 | - __u16 level; |
371 | - char *filename; |
372 | - |
373 | - if ((cifsFile == NULL) || (current_entry == NULL)) |
374 | - return -EINVAL; |
375 | - |
376 | - level = cifsFile->srch_inf.info_level; |
377 | - |
378 | - if (level == SMB_FIND_FILE_UNIX) { |
379 | - FILE_UNIX_INFO *pFindData = (FILE_UNIX_INFO *)current_entry; |
380 | - |
381 | - filename = &pFindData->FileName[0]; |
382 | - if (cifsFile->srch_inf.unicode) { |
383 | - len = cifs_unicode_bytelen(filename); |
384 | - } else { |
385 | - /* BB should we make this strnlen of PATH_MAX? */ |
386 | - len = strnlen(filename, PATH_MAX); |
387 | - } |
388 | - cifsFile->srch_inf.resume_key = pFindData->ResumeKey; |
389 | - } else if (level == SMB_FIND_FILE_DIRECTORY_INFO) { |
390 | - FILE_DIRECTORY_INFO *pFindData = |
391 | - (FILE_DIRECTORY_INFO *)current_entry; |
392 | - filename = &pFindData->FileName[0]; |
393 | - len = le32_to_cpu(pFindData->FileNameLength); |
394 | - cifsFile->srch_inf.resume_key = pFindData->FileIndex; |
395 | - } else if (level == SMB_FIND_FILE_FULL_DIRECTORY_INFO) { |
396 | - FILE_FULL_DIRECTORY_INFO *pFindData = |
397 | - (FILE_FULL_DIRECTORY_INFO *)current_entry; |
398 | - filename = &pFindData->FileName[0]; |
399 | - len = le32_to_cpu(pFindData->FileNameLength); |
400 | - cifsFile->srch_inf.resume_key = pFindData->FileIndex; |
401 | - } else if (level == SMB_FIND_FILE_ID_FULL_DIR_INFO) { |
402 | - SEARCH_ID_FULL_DIR_INFO *pFindData = |
403 | - (SEARCH_ID_FULL_DIR_INFO *)current_entry; |
404 | - filename = &pFindData->FileName[0]; |
405 | - len = le32_to_cpu(pFindData->FileNameLength); |
406 | - cifsFile->srch_inf.resume_key = pFindData->FileIndex; |
407 | - } else if (level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) { |
408 | - FILE_BOTH_DIRECTORY_INFO *pFindData = |
409 | - (FILE_BOTH_DIRECTORY_INFO *)current_entry; |
410 | - filename = &pFindData->FileName[0]; |
411 | - len = le32_to_cpu(pFindData->FileNameLength); |
412 | - cifsFile->srch_inf.resume_key = pFindData->FileIndex; |
413 | - } else if (level == SMB_FIND_FILE_INFO_STANDARD) { |
414 | - FIND_FILE_STANDARD_INFO *pFindData = |
415 | - (FIND_FILE_STANDARD_INFO *)current_entry; |
416 | - filename = &pFindData->FileName[0]; |
417 | - /* one byte length, no name conversion */ |
418 | - len = (unsigned int)pFindData->FileNameLength; |
419 | - cifsFile->srch_inf.resume_key = pFindData->ResumeKey; |
420 | - } else { |
421 | - cFYI(1, ("Unknown findfirst level %d", level)); |
422 | - return -EINVAL; |
423 | - } |
424 | - cifsFile->srch_inf.resume_name_len = len; |
425 | - cifsFile->srch_inf.presume_name = filename; |
426 | - return rc; |
427 | -} |
428 | |
429 | int cifs_readdir(struct file *file, void *direntry, filldir_t filldir) |
430 | { |
431 | diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c |
432 | index 986061a..36d5fcd 100644 |
433 | --- a/fs/xfs/linux-2.6/xfs_buf.c |
434 | +++ b/fs/xfs/linux-2.6/xfs_buf.c |
435 | @@ -1001,12 +1001,13 @@ xfs_buf_iodone_work( |
436 | * We can get an EOPNOTSUPP to ordered writes. Here we clear the |
437 | * ordered flag and reissue them. Because we can't tell the higher |
438 | * layers directly that they should not issue ordered I/O anymore, they |
439 | - * need to check if the ordered flag was cleared during I/O completion. |
440 | + * need to check if the _XFS_BARRIER_FAILED flag was set during I/O completion. |
441 | */ |
442 | if ((bp->b_error == EOPNOTSUPP) && |
443 | (bp->b_flags & (XBF_ORDERED|XBF_ASYNC)) == (XBF_ORDERED|XBF_ASYNC)) { |
444 | XB_TRACE(bp, "ordered_retry", bp->b_iodone); |
445 | bp->b_flags &= ~XBF_ORDERED; |
446 | + bp->b_flags |= _XFS_BARRIER_FAILED; |
447 | xfs_buf_iorequest(bp); |
448 | } else if (bp->b_iodone) |
449 | (*(bp->b_iodone))(bp); |
450 | diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h |
451 | index fe01099..456519a 100644 |
452 | --- a/fs/xfs/linux-2.6/xfs_buf.h |
453 | +++ b/fs/xfs/linux-2.6/xfs_buf.h |
454 | @@ -85,6 +85,14 @@ typedef enum { |
455 | * modifications being lost. |
456 | */ |
457 | _XBF_PAGE_LOCKED = (1 << 22), |
458 | + |
459 | + /* |
460 | + * If we try a barrier write, but it fails we have to communicate |
461 | + * this to the upper layers. Unfortunately b_error gets overwritten |
462 | + * when the buffer is re-issued so we have to add another flag to |
463 | + * keep this information. |
464 | + */ |
465 | + _XFS_BARRIER_FAILED = (1 << 23), |
466 | } xfs_buf_flags_t; |
467 | |
468 | typedef enum { |
469 | diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c |
470 | index 503ea89..0b02c64 100644 |
471 | --- a/fs/xfs/xfs_log.c |
472 | +++ b/fs/xfs/xfs_log.c |
473 | @@ -1033,11 +1033,12 @@ xlog_iodone(xfs_buf_t *bp) |
474 | l = iclog->ic_log; |
475 | |
476 | /* |
477 | - * If the ordered flag has been removed by a lower |
478 | - * layer, it means the underlyin device no longer supports |
479 | + * If the _XFS_BARRIER_FAILED flag was set by a lower |
480 | + * layer, it means the underlying device no longer supports |
481 | * barrier I/O. Warn loudly and turn off barriers. |
482 | */ |
483 | - if ((l->l_mp->m_flags & XFS_MOUNT_BARRIER) && !XFS_BUF_ISORDERED(bp)) { |
484 | + if (bp->b_flags & _XFS_BARRIER_FAILED) { |
485 | + bp->b_flags &= ~_XFS_BARRIER_FAILED; |
486 | l->l_mp->m_flags &= ~XFS_MOUNT_BARRIER; |
487 | xfs_fs_cmn_err(CE_WARN, l->l_mp, |
488 | "xlog_iodone: Barriers are no longer supported" |
489 | diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c |
490 | index 1113157..37f0721 100644 |
491 | --- a/kernel/sched_rt.c |
492 | +++ b/kernel/sched_rt.c |
493 | @@ -102,12 +102,12 @@ static void dequeue_rt_entity(struct sched_rt_entity *rt_se); |
494 | |
495 | static void sched_rt_rq_enqueue(struct rt_rq *rt_rq) |
496 | { |
497 | + struct task_struct *curr = rq_of_rt_rq(rt_rq)->curr; |
498 | struct sched_rt_entity *rt_se = rt_rq->rt_se; |
499 | |
500 | - if (rt_se && !on_rt_rq(rt_se) && rt_rq->rt_nr_running) { |
501 | - struct task_struct *curr = rq_of_rt_rq(rt_rq)->curr; |
502 | - |
503 | - enqueue_rt_entity(rt_se); |
504 | + if (rt_rq->rt_nr_running) { |
505 | + if (rt_se && !on_rt_rq(rt_se)) |
506 | + enqueue_rt_entity(rt_se); |
507 | if (rt_rq->highest_prio < curr->prio) |
508 | resched_task(curr); |
509 | } |
510 | diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c |
511 | index 8165df5..5c7bbe0 100644 |
512 | --- a/net/mac80211/debugfs_netdev.c |
513 | +++ b/net/mac80211/debugfs_netdev.c |
514 | @@ -537,6 +537,7 @@ static int netdev_notify(struct notifier_block *nb, |
515 | { |
516 | struct net_device *dev = ndev; |
517 | struct dentry *dir; |
518 | + struct ieee80211_local *local; |
519 | struct ieee80211_sub_if_data *sdata; |
520 | char buf[10+IFNAMSIZ]; |
521 | |
522 | @@ -549,10 +550,19 @@ static int netdev_notify(struct notifier_block *nb, |
523 | if (dev->ieee80211_ptr->wiphy->privid != mac80211_wiphy_privid) |
524 | return 0; |
525 | |
526 | - sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
527 | + /* |
528 | + * Do not use IEEE80211_DEV_TO_SUB_IF because that |
529 | + * BUG_ONs for the master netdev which we need to |
530 | + * handle here. |
531 | + */ |
532 | + sdata = netdev_priv(dev); |
533 | |
534 | - sprintf(buf, "netdev:%s", dev->name); |
535 | dir = sdata->debugfsdir; |
536 | + |
537 | + if (!dir) |
538 | + return 0; |
539 | + |
540 | + sprintf(buf, "netdev:%s", dev->name); |
541 | if (!debugfs_rename(dir->d_parent, dir, dir->d_parent, buf)) |
542 | printk(KERN_ERR "mac80211: debugfs: failed to rename debugfs " |
543 | "dir to %s\n", buf); |
544 | diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c |
545 | index 74aecc0..10b05ce 100644 |
546 | --- a/net/rfkill/rfkill.c |
547 | +++ b/net/rfkill/rfkill.c |
548 | @@ -117,6 +117,7 @@ static void rfkill_led_trigger_activate(struct led_classdev *led) |
549 | |
550 | static void notify_rfkill_state_change(struct rfkill *rfkill) |
551 | { |
552 | + rfkill_led_trigger(rfkill, rfkill->state); |
553 | blocking_notifier_call_chain(&rfkill_notifier_list, |
554 | RFKILL_STATE_CHANGED, |
555 | rfkill); |
556 | @@ -204,10 +205,8 @@ static int rfkill_toggle_radio(struct rfkill *rfkill, |
557 | rfkill->state = state; |
558 | } |
559 | |
560 | - if (force || rfkill->state != oldstate) { |
561 | - rfkill_led_trigger(rfkill, rfkill->state); |
562 | + if (force || rfkill->state != oldstate) |
563 | notify_rfkill_state_change(rfkill); |
564 | - } |
565 | |
566 | return retval; |
567 | } |