Contents of /trunk/kernel-lts/patches-3.4/0149-3.4.50-all-fixes.patch
Parent Directory | Revision Log
Revision 2225 -
(show annotations)
(download)
Mon Jul 1 09:56:21 2013 UTC (11 years, 2 months ago) by niro
File size: 51192 byte(s)
Mon Jul 1 09:56:21 2013 UTC (11 years, 2 months ago) by niro
File size: 51192 byte(s)
-linux-3.4.50
1 | diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h |
2 | index d58fc4e..6afb13a 100644 |
3 | --- a/arch/powerpc/include/asm/exception-64s.h |
4 | +++ b/arch/powerpc/include/asm/exception-64s.h |
5 | @@ -320,7 +320,7 @@ label##_common: \ |
6 | */ |
7 | #define STD_EXCEPTION_COMMON_ASYNC(trap, label, hdlr) \ |
8 | EXCEPTION_COMMON(trap, label, hdlr, ret_from_except_lite, \ |
9 | - FINISH_NAP;RUNLATCH_ON;DISABLE_INTS) |
10 | + FINISH_NAP;DISABLE_INTS;RUNLATCH_ON) |
11 | |
12 | /* |
13 | * When the idle code in power4_idle puts the CPU into NAP mode, |
14 | diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c |
15 | index d7ebc58..071592b 100644 |
16 | --- a/arch/powerpc/kernel/irq.c |
17 | +++ b/arch/powerpc/kernel/irq.c |
18 | @@ -162,7 +162,7 @@ notrace unsigned int __check_irq_replay(void) |
19 | * in case we also had a rollover while hard disabled |
20 | */ |
21 | local_paca->irq_happened &= ~PACA_IRQ_DEC; |
22 | - if (decrementer_check_overflow()) |
23 | + if ((happened & PACA_IRQ_DEC) || decrementer_check_overflow()) |
24 | return 0x900; |
25 | |
26 | /* Finally check if an external interrupt happened */ |
27 | diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c |
28 | index 94178e5..c1aef40 100644 |
29 | --- a/arch/powerpc/kernel/process.c |
30 | +++ b/arch/powerpc/kernel/process.c |
31 | @@ -1218,7 +1218,7 @@ EXPORT_SYMBOL(dump_stack); |
32 | |
33 | #ifdef CONFIG_PPC64 |
34 | /* Called with hard IRQs off */ |
35 | -void __ppc64_runlatch_on(void) |
36 | +void notrace __ppc64_runlatch_on(void) |
37 | { |
38 | struct thread_info *ti = current_thread_info(); |
39 | unsigned long ctrl; |
40 | @@ -1231,7 +1231,7 @@ void __ppc64_runlatch_on(void) |
41 | } |
42 | |
43 | /* Called with hard IRQs off */ |
44 | -void __ppc64_runlatch_off(void) |
45 | +void notrace __ppc64_runlatch_off(void) |
46 | { |
47 | struct thread_info *ti = current_thread_info(); |
48 | unsigned long ctrl; |
49 | diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S |
50 | index 7a6f3b3..f2bb9c9 100644 |
51 | --- a/arch/x86/kernel/relocate_kernel_64.S |
52 | +++ b/arch/x86/kernel/relocate_kernel_64.S |
53 | @@ -160,7 +160,7 @@ identity_mapped: |
54 | xorq %rbp, %rbp |
55 | xorq %r8, %r8 |
56 | xorq %r9, %r9 |
57 | - xorq %r10, %r9 |
58 | + xorq %r10, %r10 |
59 | xorq %r11, %r11 |
60 | xorq %r12, %r12 |
61 | xorq %r13, %r13 |
62 | diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c |
63 | index b0f553b..d3446f6 100644 |
64 | --- a/drivers/block/cciss.c |
65 | +++ b/drivers/block/cciss.c |
66 | @@ -161,8 +161,6 @@ static irqreturn_t do_cciss_msix_intr(int irq, void *dev_id); |
67 | static int cciss_open(struct block_device *bdev, fmode_t mode); |
68 | static int cciss_unlocked_open(struct block_device *bdev, fmode_t mode); |
69 | static int cciss_release(struct gendisk *disk, fmode_t mode); |
70 | -static int do_ioctl(struct block_device *bdev, fmode_t mode, |
71 | - unsigned int cmd, unsigned long arg); |
72 | static int cciss_ioctl(struct block_device *bdev, fmode_t mode, |
73 | unsigned int cmd, unsigned long arg); |
74 | static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo); |
75 | @@ -229,7 +227,7 @@ static const struct block_device_operations cciss_fops = { |
76 | .owner = THIS_MODULE, |
77 | .open = cciss_unlocked_open, |
78 | .release = cciss_release, |
79 | - .ioctl = do_ioctl, |
80 | + .ioctl = cciss_ioctl, |
81 | .getgeo = cciss_getgeo, |
82 | #ifdef CONFIG_COMPAT |
83 | .compat_ioctl = cciss_compat_ioctl, |
84 | @@ -1140,16 +1138,6 @@ static int cciss_release(struct gendisk *disk, fmode_t mode) |
85 | return 0; |
86 | } |
87 | |
88 | -static int do_ioctl(struct block_device *bdev, fmode_t mode, |
89 | - unsigned cmd, unsigned long arg) |
90 | -{ |
91 | - int ret; |
92 | - mutex_lock(&cciss_mutex); |
93 | - ret = cciss_ioctl(bdev, mode, cmd, arg); |
94 | - mutex_unlock(&cciss_mutex); |
95 | - return ret; |
96 | -} |
97 | - |
98 | #ifdef CONFIG_COMPAT |
99 | |
100 | static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode, |
101 | @@ -1176,7 +1164,7 @@ static int cciss_compat_ioctl(struct block_device *bdev, fmode_t mode, |
102 | case CCISS_REGNEWD: |
103 | case CCISS_RESCANDISK: |
104 | case CCISS_GETLUNINFO: |
105 | - return do_ioctl(bdev, mode, cmd, arg); |
106 | + return cciss_ioctl(bdev, mode, cmd, arg); |
107 | |
108 | case CCISS_PASSTHRU32: |
109 | return cciss_ioctl32_passthru(bdev, mode, cmd, arg); |
110 | @@ -1216,7 +1204,7 @@ static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode, |
111 | if (err) |
112 | return -EFAULT; |
113 | |
114 | - err = do_ioctl(bdev, mode, CCISS_PASSTHRU, (unsigned long)p); |
115 | + err = cciss_ioctl(bdev, mode, CCISS_PASSTHRU, (unsigned long)p); |
116 | if (err) |
117 | return err; |
118 | err |= |
119 | @@ -1258,7 +1246,7 @@ static int cciss_ioctl32_big_passthru(struct block_device *bdev, fmode_t mode, |
120 | if (err) |
121 | return -EFAULT; |
122 | |
123 | - err = do_ioctl(bdev, mode, CCISS_BIG_PASSTHRU, (unsigned long)p); |
124 | + err = cciss_ioctl(bdev, mode, CCISS_BIG_PASSTHRU, (unsigned long)p); |
125 | if (err) |
126 | return err; |
127 | err |= |
128 | @@ -1308,11 +1296,14 @@ static int cciss_getpciinfo(ctlr_info_t *h, void __user *argp) |
129 | static int cciss_getintinfo(ctlr_info_t *h, void __user *argp) |
130 | { |
131 | cciss_coalint_struct intinfo; |
132 | + unsigned long flags; |
133 | |
134 | if (!argp) |
135 | return -EINVAL; |
136 | + spin_lock_irqsave(&h->lock, flags); |
137 | intinfo.delay = readl(&h->cfgtable->HostWrite.CoalIntDelay); |
138 | intinfo.count = readl(&h->cfgtable->HostWrite.CoalIntCount); |
139 | + spin_unlock_irqrestore(&h->lock, flags); |
140 | if (copy_to_user |
141 | (argp, &intinfo, sizeof(cciss_coalint_struct))) |
142 | return -EFAULT; |
143 | @@ -1353,12 +1344,15 @@ static int cciss_setintinfo(ctlr_info_t *h, void __user *argp) |
144 | static int cciss_getnodename(ctlr_info_t *h, void __user *argp) |
145 | { |
146 | NodeName_type NodeName; |
147 | + unsigned long flags; |
148 | int i; |
149 | |
150 | if (!argp) |
151 | return -EINVAL; |
152 | + spin_lock_irqsave(&h->lock, flags); |
153 | for (i = 0; i < 16; i++) |
154 | NodeName[i] = readb(&h->cfgtable->ServerName[i]); |
155 | + spin_unlock_irqrestore(&h->lock, flags); |
156 | if (copy_to_user(argp, NodeName, sizeof(NodeName_type))) |
157 | return -EFAULT; |
158 | return 0; |
159 | @@ -1395,10 +1389,13 @@ static int cciss_setnodename(ctlr_info_t *h, void __user *argp) |
160 | static int cciss_getheartbeat(ctlr_info_t *h, void __user *argp) |
161 | { |
162 | Heartbeat_type heartbeat; |
163 | + unsigned long flags; |
164 | |
165 | if (!argp) |
166 | return -EINVAL; |
167 | + spin_lock_irqsave(&h->lock, flags); |
168 | heartbeat = readl(&h->cfgtable->HeartBeat); |
169 | + spin_unlock_irqrestore(&h->lock, flags); |
170 | if (copy_to_user(argp, &heartbeat, sizeof(Heartbeat_type))) |
171 | return -EFAULT; |
172 | return 0; |
173 | @@ -1407,10 +1404,13 @@ static int cciss_getheartbeat(ctlr_info_t *h, void __user *argp) |
174 | static int cciss_getbustypes(ctlr_info_t *h, void __user *argp) |
175 | { |
176 | BusTypes_type BusTypes; |
177 | + unsigned long flags; |
178 | |
179 | if (!argp) |
180 | return -EINVAL; |
181 | + spin_lock_irqsave(&h->lock, flags); |
182 | BusTypes = readl(&h->cfgtable->BusTypes); |
183 | + spin_unlock_irqrestore(&h->lock, flags); |
184 | if (copy_to_user(argp, &BusTypes, sizeof(BusTypes_type))) |
185 | return -EFAULT; |
186 | return 0; |
187 | diff --git a/drivers/gpu/drm/gma500/cdv_intel_display.c b/drivers/gpu/drm/gma500/cdv_intel_display.c |
188 | index be84559..1ee297b 100644 |
189 | --- a/drivers/gpu/drm/gma500/cdv_intel_display.c |
190 | +++ b/drivers/gpu/drm/gma500/cdv_intel_display.c |
191 | @@ -1439,6 +1439,19 @@ static void cdv_intel_crtc_destroy(struct drm_crtc *crtc) |
192 | kfree(psb_intel_crtc); |
193 | } |
194 | |
195 | +static void cdv_intel_crtc_disable(struct drm_crtc *crtc) |
196 | +{ |
197 | + struct gtt_range *gt; |
198 | + struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; |
199 | + |
200 | + crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); |
201 | + |
202 | + if (crtc->fb) { |
203 | + gt = to_psb_fb(crtc->fb)->gtt; |
204 | + psb_gtt_unpin(gt); |
205 | + } |
206 | +} |
207 | + |
208 | const struct drm_crtc_helper_funcs cdv_intel_helper_funcs = { |
209 | .dpms = cdv_intel_crtc_dpms, |
210 | .mode_fixup = cdv_intel_crtc_mode_fixup, |
211 | @@ -1446,6 +1459,7 @@ const struct drm_crtc_helper_funcs cdv_intel_helper_funcs = { |
212 | .mode_set_base = cdv_intel_pipe_set_base, |
213 | .prepare = cdv_intel_crtc_prepare, |
214 | .commit = cdv_intel_crtc_commit, |
215 | + .disable = cdv_intel_crtc_disable, |
216 | }; |
217 | |
218 | const struct drm_crtc_funcs cdv_intel_crtc_funcs = { |
219 | diff --git a/drivers/gpu/drm/gma500/psb_intel_display.c b/drivers/gpu/drm/gma500/psb_intel_display.c |
220 | index 2616558..454a9d8 100644 |
221 | --- a/drivers/gpu/drm/gma500/psb_intel_display.c |
222 | +++ b/drivers/gpu/drm/gma500/psb_intel_display.c |
223 | @@ -1262,6 +1262,19 @@ void psb_intel_crtc_destroy(struct drm_crtc *crtc) |
224 | kfree(psb_intel_crtc); |
225 | } |
226 | |
227 | +static void psb_intel_crtc_disable(struct drm_crtc *crtc) |
228 | +{ |
229 | + struct gtt_range *gt; |
230 | + struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; |
231 | + |
232 | + crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); |
233 | + |
234 | + if (crtc->fb) { |
235 | + gt = to_psb_fb(crtc->fb)->gtt; |
236 | + psb_gtt_unpin(gt); |
237 | + } |
238 | +} |
239 | + |
240 | const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { |
241 | .dpms = psb_intel_crtc_dpms, |
242 | .mode_fixup = psb_intel_crtc_mode_fixup, |
243 | @@ -1269,6 +1282,7 @@ const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { |
244 | .mode_set_base = psb_intel_pipe_set_base, |
245 | .prepare = psb_intel_crtc_prepare, |
246 | .commit = psb_intel_crtc_commit, |
247 | + .disable = psb_intel_crtc_disable, |
248 | }; |
249 | |
250 | const struct drm_crtc_funcs psb_intel_crtc_funcs = { |
251 | diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c |
252 | index aeb9d6e..c0ba260 100644 |
253 | --- a/drivers/gpu/drm/i915/intel_sdvo.c |
254 | +++ b/drivers/gpu/drm/i915/intel_sdvo.c |
255 | @@ -1582,10 +1582,13 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) |
256 | * arranged in priority order. |
257 | */ |
258 | intel_ddc_get_modes(connector, &intel_sdvo->ddc); |
259 | - if (list_empty(&connector->probed_modes) == false) |
260 | - goto end; |
261 | |
262 | - /* Fetch modes from VBT */ |
263 | + /* |
264 | + * Fetch modes from VBT. For SDVO prefer the VBT mode since some |
265 | + * SDVO->LVDS transcoders can't cope with the EDID mode. Since |
266 | + * drm_mode_probed_add adds the mode at the head of the list we add it |
267 | + * last. |
268 | + */ |
269 | if (dev_priv->sdvo_lvds_vbt_mode != NULL) { |
270 | newmode = drm_mode_duplicate(connector->dev, |
271 | dev_priv->sdvo_lvds_vbt_mode); |
272 | @@ -1597,7 +1600,6 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) |
273 | } |
274 | } |
275 | |
276 | -end: |
277 | list_for_each_entry(newmode, &connector->probed_modes, head) { |
278 | if (newmode->type & DRM_MODE_TYPE_PREFERRED) { |
279 | intel_sdvo->sdvo_lvds_fixed_mode = |
280 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c |
281 | index df44509..b424a20 100644 |
282 | --- a/drivers/md/raid1.c |
283 | +++ b/drivers/md/raid1.c |
284 | @@ -413,7 +413,17 @@ static void raid1_end_write_request(struct bio *bio, int error) |
285 | |
286 | r1_bio->bios[mirror] = NULL; |
287 | to_put = bio; |
288 | - set_bit(R1BIO_Uptodate, &r1_bio->state); |
289 | + /* |
290 | + * Do not set R1BIO_Uptodate if the current device is |
291 | + * rebuilding or Faulty. This is because we cannot use |
292 | + * such device for properly reading the data back (we could |
293 | + * potentially use it, if the current write would have felt |
294 | + * before rdev->recovery_offset, but for simplicity we don't |
295 | + * check this here. |
296 | + */ |
297 | + if (test_bit(In_sync, &conf->mirrors[mirror].rdev->flags) && |
298 | + !test_bit(Faulty, &conf->mirrors[mirror].rdev->flags)) |
299 | + set_bit(R1BIO_Uptodate, &r1_bio->state); |
300 | |
301 | /* Maybe we can clear some bad blocks. */ |
302 | if (is_badblock(conf->mirrors[mirror].rdev, |
303 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c |
304 | index 6137d00..0cc7985 100644 |
305 | --- a/drivers/md/raid10.c |
306 | +++ b/drivers/md/raid10.c |
307 | @@ -452,7 +452,17 @@ static void raid10_end_write_request(struct bio *bio, int error) |
308 | sector_t first_bad; |
309 | int bad_sectors; |
310 | |
311 | - set_bit(R10BIO_Uptodate, &r10_bio->state); |
312 | + /* |
313 | + * Do not set R10BIO_Uptodate if the current device is |
314 | + * rebuilding or Faulty. This is because we cannot use |
315 | + * such device for properly reading the data back (we could |
316 | + * potentially use it, if the current write would have felt |
317 | + * before rdev->recovery_offset, but for simplicity we don't |
318 | + * check this here. |
319 | + */ |
320 | + if (test_bit(In_sync, &rdev->flags) && |
321 | + !test_bit(Faulty, &rdev->flags)) |
322 | + set_bit(R10BIO_Uptodate, &r10_bio->state); |
323 | |
324 | /* Maybe we can clear some bad blocks. */ |
325 | if (is_badblock(rdev, |
326 | diff --git a/drivers/net/wireless/ath/ath9k/Kconfig b/drivers/net/wireless/ath/ath9k/Kconfig |
327 | index e507e78..3b8c930 100644 |
328 | --- a/drivers/net/wireless/ath/ath9k/Kconfig |
329 | +++ b/drivers/net/wireless/ath/ath9k/Kconfig |
330 | @@ -89,13 +89,17 @@ config ATH9K_MAC_DEBUG |
331 | This option enables collection of statistics for Rx/Tx status |
332 | data and some other MAC related statistics |
333 | |
334 | -config ATH9K_RATE_CONTROL |
335 | +config ATH9K_LEGACY_RATE_CONTROL |
336 | bool "Atheros ath9k rate control" |
337 | depends on ATH9K |
338 | - default y |
339 | + default n |
340 | ---help--- |
341 | Say Y, if you want to use the ath9k specific rate control |
342 | - module instead of minstrel_ht. |
343 | + module instead of minstrel_ht. Be warned that there are various |
344 | + issues with the ath9k RC and minstrel is a more robust algorithm. |
345 | + Note that even if this option is selected, "ath9k_rate_control" |
346 | + has to be passed to mac80211 using the module parameter, |
347 | + ieee80211_default_rc_algo. |
348 | |
349 | config ATH9K_HTC |
350 | tristate "Atheros HTC based wireless cards support" |
351 | diff --git a/drivers/net/wireless/ath/ath9k/Makefile b/drivers/net/wireless/ath/ath9k/Makefile |
352 | index 27d95fe..24ae2e6 100644 |
353 | --- a/drivers/net/wireless/ath/ath9k/Makefile |
354 | +++ b/drivers/net/wireless/ath/ath9k/Makefile |
355 | @@ -6,7 +6,7 @@ ath9k-y += beacon.o \ |
356 | xmit.o |
357 | |
358 | ath9k-$(CONFIG_ATH9K_BTCOEX_SUPPORT) += mci.o |
359 | -ath9k-$(CONFIG_ATH9K_RATE_CONTROL) += rc.o |
360 | +ath9k-$(CONFIG_ATH9K_LEGACY_RATE_CONTROL) += rc.o |
361 | ath9k-$(CONFIG_ATH9K_PCI) += pci.o |
362 | ath9k-$(CONFIG_ATH9K_AHB) += ahb.o |
363 | ath9k-$(CONFIG_ATH9K_DEBUGFS) += debug.o |
364 | diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c |
365 | index cb00645..cac5b25 100644 |
366 | --- a/drivers/net/wireless/ath/ath9k/init.c |
367 | +++ b/drivers/net/wireless/ath/ath9k/init.c |
368 | @@ -671,8 +671,7 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) |
369 | BIT(NL80211_IFTYPE_ADHOC) | |
370 | BIT(NL80211_IFTYPE_MESH_POINT); |
371 | |
372 | - if (AR_SREV_5416(sc->sc_ah)) |
373 | - hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; |
374 | + hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; |
375 | |
376 | hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; |
377 | hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; |
378 | @@ -695,10 +694,6 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) |
379 | sc->ant_rx = hw->wiphy->available_antennas_rx; |
380 | sc->ant_tx = hw->wiphy->available_antennas_tx; |
381 | |
382 | -#ifdef CONFIG_ATH9K_RATE_CONTROL |
383 | - hw->rate_control_algorithm = "ath9k_rate_control"; |
384 | -#endif |
385 | - |
386 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) |
387 | hw->wiphy->bands[IEEE80211_BAND_2GHZ] = |
388 | &sc->sbands[IEEE80211_BAND_2GHZ]; |
389 | diff --git a/drivers/net/wireless/ath/ath9k/rc.h b/drivers/net/wireless/ath/ath9k/rc.h |
390 | index 75f8e9b..12cf122 100644 |
391 | --- a/drivers/net/wireless/ath/ath9k/rc.h |
392 | +++ b/drivers/net/wireless/ath/ath9k/rc.h |
393 | @@ -219,7 +219,7 @@ struct ath_rate_priv { |
394 | struct ath_rc_stats rcstats[RATE_TABLE_SIZE]; |
395 | }; |
396 | |
397 | -#ifdef CONFIG_ATH9K_RATE_CONTROL |
398 | +#ifdef CONFIG_ATH9K_LEGACY_RATE_CONTROL |
399 | int ath_rate_control_register(void); |
400 | void ath_rate_control_unregister(void); |
401 | #else |
402 | diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c |
403 | index b54c750..f8c4499 100644 |
404 | --- a/drivers/net/wireless/b43/main.c |
405 | +++ b/drivers/net/wireless/b43/main.c |
406 | @@ -2449,7 +2449,7 @@ static void b43_request_firmware(struct work_struct *work) |
407 | for (i = 0; i < B43_NR_FWTYPES; i++) { |
408 | errmsg = ctx->errors[i]; |
409 | if (strlen(errmsg)) |
410 | - b43err(dev->wl, errmsg); |
411 | + b43err(dev->wl, "%s", errmsg); |
412 | } |
413 | b43_print_fw_helptext(dev->wl, 1); |
414 | goto out; |
415 | diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c |
416 | index 63ccc0f..c5ce195 100644 |
417 | --- a/drivers/rtc/rtc-twl.c |
418 | +++ b/drivers/rtc/rtc-twl.c |
419 | @@ -523,6 +523,7 @@ static int __devinit twl_rtc_probe(struct platform_device *pdev) |
420 | } |
421 | |
422 | platform_set_drvdata(pdev, rtc); |
423 | + device_init_wakeup(&pdev->dev, 1); |
424 | return 0; |
425 | |
426 | out2: |
427 | diff --git a/fs/ceph/locks.c b/fs/ceph/locks.c |
428 | index 80576d05..bb5fb3d 100644 |
429 | --- a/fs/ceph/locks.c |
430 | +++ b/fs/ceph/locks.c |
431 | @@ -191,27 +191,23 @@ void ceph_count_locks(struct inode *inode, int *fcntl_count, int *flock_count) |
432 | } |
433 | |
434 | /** |
435 | - * Encode the flock and fcntl locks for the given inode into the pagelist. |
436 | - * Format is: #fcntl locks, sequential fcntl locks, #flock locks, |
437 | - * sequential flock locks. |
438 | - * Must be called with lock_flocks() already held. |
439 | - * If we encounter more of a specific lock type than expected, |
440 | - * we return the value 1. |
441 | + * Encode the flock and fcntl locks for the given inode into the ceph_filelock |
442 | + * array. Must be called with lock_flocks() already held. |
443 | + * If we encounter more of a specific lock type than expected, return -ENOSPC. |
444 | */ |
445 | -int ceph_encode_locks(struct inode *inode, struct ceph_pagelist *pagelist, |
446 | - int num_fcntl_locks, int num_flock_locks) |
447 | +int ceph_encode_locks_to_buffer(struct inode *inode, |
448 | + struct ceph_filelock *flocks, |
449 | + int num_fcntl_locks, int num_flock_locks) |
450 | { |
451 | struct file_lock *lock; |
452 | - struct ceph_filelock cephlock; |
453 | int err = 0; |
454 | int seen_fcntl = 0; |
455 | int seen_flock = 0; |
456 | + int l = 0; |
457 | |
458 | dout("encoding %d flock and %d fcntl locks", num_flock_locks, |
459 | num_fcntl_locks); |
460 | - err = ceph_pagelist_append(pagelist, &num_fcntl_locks, sizeof(u32)); |
461 | - if (err) |
462 | - goto fail; |
463 | + |
464 | for (lock = inode->i_flock; lock != NULL; lock = lock->fl_next) { |
465 | if (lock->fl_flags & FL_POSIX) { |
466 | ++seen_fcntl; |
467 | @@ -219,19 +215,12 @@ int ceph_encode_locks(struct inode *inode, struct ceph_pagelist *pagelist, |
468 | err = -ENOSPC; |
469 | goto fail; |
470 | } |
471 | - err = lock_to_ceph_filelock(lock, &cephlock); |
472 | + err = lock_to_ceph_filelock(lock, &flocks[l]); |
473 | if (err) |
474 | goto fail; |
475 | - err = ceph_pagelist_append(pagelist, &cephlock, |
476 | - sizeof(struct ceph_filelock)); |
477 | + ++l; |
478 | } |
479 | - if (err) |
480 | - goto fail; |
481 | } |
482 | - |
483 | - err = ceph_pagelist_append(pagelist, &num_flock_locks, sizeof(u32)); |
484 | - if (err) |
485 | - goto fail; |
486 | for (lock = inode->i_flock; lock != NULL; lock = lock->fl_next) { |
487 | if (lock->fl_flags & FL_FLOCK) { |
488 | ++seen_flock; |
489 | @@ -239,19 +228,51 @@ int ceph_encode_locks(struct inode *inode, struct ceph_pagelist *pagelist, |
490 | err = -ENOSPC; |
491 | goto fail; |
492 | } |
493 | - err = lock_to_ceph_filelock(lock, &cephlock); |
494 | + err = lock_to_ceph_filelock(lock, &flocks[l]); |
495 | if (err) |
496 | goto fail; |
497 | - err = ceph_pagelist_append(pagelist, &cephlock, |
498 | - sizeof(struct ceph_filelock)); |
499 | + ++l; |
500 | } |
501 | - if (err) |
502 | - goto fail; |
503 | } |
504 | fail: |
505 | return err; |
506 | } |
507 | |
508 | +/** |
509 | + * Copy the encoded flock and fcntl locks into the pagelist. |
510 | + * Format is: #fcntl locks, sequential fcntl locks, #flock locks, |
511 | + * sequential flock locks. |
512 | + * Returns zero on success. |
513 | + */ |
514 | +int ceph_locks_to_pagelist(struct ceph_filelock *flocks, |
515 | + struct ceph_pagelist *pagelist, |
516 | + int num_fcntl_locks, int num_flock_locks) |
517 | +{ |
518 | + int err = 0; |
519 | + __le32 nlocks; |
520 | + |
521 | + nlocks = cpu_to_le32(num_fcntl_locks); |
522 | + err = ceph_pagelist_append(pagelist, &nlocks, sizeof(nlocks)); |
523 | + if (err) |
524 | + goto out_fail; |
525 | + |
526 | + err = ceph_pagelist_append(pagelist, flocks, |
527 | + num_fcntl_locks * sizeof(*flocks)); |
528 | + if (err) |
529 | + goto out_fail; |
530 | + |
531 | + nlocks = cpu_to_le32(num_flock_locks); |
532 | + err = ceph_pagelist_append(pagelist, &nlocks, sizeof(nlocks)); |
533 | + if (err) |
534 | + goto out_fail; |
535 | + |
536 | + err = ceph_pagelist_append(pagelist, |
537 | + &flocks[num_fcntl_locks], |
538 | + num_flock_locks * sizeof(*flocks)); |
539 | +out_fail: |
540 | + return err; |
541 | +} |
542 | + |
543 | /* |
544 | * Given a pointer to a lock, convert it to a ceph filelock |
545 | */ |
546 | diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c |
547 | index 3fd08ad..cf1b9e0 100644 |
548 | --- a/fs/ceph/mds_client.c |
549 | +++ b/fs/ceph/mds_client.c |
550 | @@ -335,9 +335,9 @@ void ceph_put_mds_session(struct ceph_mds_session *s) |
551 | atomic_read(&s->s_ref), atomic_read(&s->s_ref)-1); |
552 | if (atomic_dec_and_test(&s->s_ref)) { |
553 | if (s->s_auth.authorizer) |
554 | - s->s_mdsc->fsc->client->monc.auth->ops->destroy_authorizer( |
555 | - s->s_mdsc->fsc->client->monc.auth, |
556 | - s->s_auth.authorizer); |
557 | + ceph_auth_destroy_authorizer( |
558 | + s->s_mdsc->fsc->client->monc.auth, |
559 | + s->s_auth.authorizer); |
560 | kfree(s); |
561 | } |
562 | } |
563 | @@ -2455,39 +2455,44 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap, |
564 | |
565 | if (recon_state->flock) { |
566 | int num_fcntl_locks, num_flock_locks; |
567 | - struct ceph_pagelist_cursor trunc_point; |
568 | - |
569 | - ceph_pagelist_set_cursor(pagelist, &trunc_point); |
570 | - do { |
571 | - lock_flocks(); |
572 | - ceph_count_locks(inode, &num_fcntl_locks, |
573 | - &num_flock_locks); |
574 | - rec.v2.flock_len = (2*sizeof(u32) + |
575 | - (num_fcntl_locks+num_flock_locks) * |
576 | - sizeof(struct ceph_filelock)); |
577 | - unlock_flocks(); |
578 | - |
579 | - /* pre-alloc pagelist */ |
580 | - ceph_pagelist_truncate(pagelist, &trunc_point); |
581 | - err = ceph_pagelist_append(pagelist, &rec, reclen); |
582 | - if (!err) |
583 | - err = ceph_pagelist_reserve(pagelist, |
584 | - rec.v2.flock_len); |
585 | - |
586 | - /* encode locks */ |
587 | - if (!err) { |
588 | - lock_flocks(); |
589 | - err = ceph_encode_locks(inode, |
590 | - pagelist, |
591 | - num_fcntl_locks, |
592 | - num_flock_locks); |
593 | - unlock_flocks(); |
594 | - } |
595 | - } while (err == -ENOSPC); |
596 | + struct ceph_filelock *flocks; |
597 | + |
598 | +encode_again: |
599 | + lock_flocks(); |
600 | + ceph_count_locks(inode, &num_fcntl_locks, &num_flock_locks); |
601 | + unlock_flocks(); |
602 | + flocks = kmalloc((num_fcntl_locks+num_flock_locks) * |
603 | + sizeof(struct ceph_filelock), GFP_NOFS); |
604 | + if (!flocks) { |
605 | + err = -ENOMEM; |
606 | + goto out_free; |
607 | + } |
608 | + lock_flocks(); |
609 | + err = ceph_encode_locks_to_buffer(inode, flocks, |
610 | + num_fcntl_locks, |
611 | + num_flock_locks); |
612 | + unlock_flocks(); |
613 | + if (err) { |
614 | + kfree(flocks); |
615 | + if (err == -ENOSPC) |
616 | + goto encode_again; |
617 | + goto out_free; |
618 | + } |
619 | + /* |
620 | + * number of encoded locks is stable, so copy to pagelist |
621 | + */ |
622 | + rec.v2.flock_len = cpu_to_le32(2*sizeof(u32) + |
623 | + (num_fcntl_locks+num_flock_locks) * |
624 | + sizeof(struct ceph_filelock)); |
625 | + err = ceph_pagelist_append(pagelist, &rec, reclen); |
626 | + if (!err) |
627 | + err = ceph_locks_to_pagelist(flocks, pagelist, |
628 | + num_fcntl_locks, |
629 | + num_flock_locks); |
630 | + kfree(flocks); |
631 | } else { |
632 | err = ceph_pagelist_append(pagelist, &rec, reclen); |
633 | } |
634 | - |
635 | out_free: |
636 | kfree(path); |
637 | out_dput: |
638 | @@ -3414,13 +3419,17 @@ static struct ceph_auth_handshake *get_authorizer(struct ceph_connection *con, |
639 | struct ceph_auth_handshake *auth = &s->s_auth; |
640 | |
641 | if (force_new && auth->authorizer) { |
642 | - if (ac->ops && ac->ops->destroy_authorizer) |
643 | - ac->ops->destroy_authorizer(ac, auth->authorizer); |
644 | + ceph_auth_destroy_authorizer(ac, auth->authorizer); |
645 | auth->authorizer = NULL; |
646 | } |
647 | - if (!auth->authorizer && ac->ops && ac->ops->create_authorizer) { |
648 | - int ret = ac->ops->create_authorizer(ac, CEPH_ENTITY_TYPE_MDS, |
649 | - auth); |
650 | + if (!auth->authorizer) { |
651 | + int ret = ceph_auth_create_authorizer(ac, CEPH_ENTITY_TYPE_MDS, |
652 | + auth); |
653 | + if (ret) |
654 | + return ERR_PTR(ret); |
655 | + } else { |
656 | + int ret = ceph_auth_update_authorizer(ac, CEPH_ENTITY_TYPE_MDS, |
657 | + auth); |
658 | if (ret) |
659 | return ERR_PTR(ret); |
660 | } |
661 | @@ -3436,7 +3445,7 @@ static int verify_authorizer_reply(struct ceph_connection *con, int len) |
662 | struct ceph_mds_client *mdsc = s->s_mdsc; |
663 | struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; |
664 | |
665 | - return ac->ops->verify_authorizer_reply(ac, s->s_auth.authorizer, len); |
666 | + return ceph_auth_verify_authorizer_reply(ac, s->s_auth.authorizer, len); |
667 | } |
668 | |
669 | static int invalidate_authorizer(struct ceph_connection *con) |
670 | @@ -3445,8 +3454,7 @@ static int invalidate_authorizer(struct ceph_connection *con) |
671 | struct ceph_mds_client *mdsc = s->s_mdsc; |
672 | struct ceph_auth_client *ac = mdsc->fsc->client->monc.auth; |
673 | |
674 | - if (ac->ops->invalidate_authorizer) |
675 | - ac->ops->invalidate_authorizer(ac, CEPH_ENTITY_TYPE_MDS); |
676 | + ceph_auth_invalidate_authorizer(ac, CEPH_ENTITY_TYPE_MDS); |
677 | |
678 | return ceph_monc_validate_auth(&mdsc->fsc->client->monc); |
679 | } |
680 | diff --git a/fs/ceph/super.c b/fs/ceph/super.c |
681 | index f363918..f4fa5cf 100644 |
682 | --- a/fs/ceph/super.c |
683 | +++ b/fs/ceph/super.c |
684 | @@ -70,8 +70,14 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf) |
685 | /* |
686 | * express utilization in terms of large blocks to avoid |
687 | * overflow on 32-bit machines. |
688 | + * |
689 | + * NOTE: for the time being, we make bsize == frsize to humor |
690 | + * not-yet-ancient versions of glibc that are broken. |
691 | + * Someday, we will probably want to report a real block |
692 | + * size... whatever that may mean for a network file system! |
693 | */ |
694 | buf->f_bsize = 1 << CEPH_BLOCK_SHIFT; |
695 | + buf->f_frsize = 1 << CEPH_BLOCK_SHIFT; |
696 | buf->f_blocks = le64_to_cpu(st.kb) >> (CEPH_BLOCK_SHIFT-10); |
697 | buf->f_bfree = le64_to_cpu(st.kb_avail) >> (CEPH_BLOCK_SHIFT-10); |
698 | buf->f_bavail = le64_to_cpu(st.kb_avail) >> (CEPH_BLOCK_SHIFT-10); |
699 | @@ -79,7 +85,6 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf) |
700 | buf->f_files = le64_to_cpu(st.num_objects); |
701 | buf->f_ffree = -1; |
702 | buf->f_namelen = NAME_MAX; |
703 | - buf->f_frsize = PAGE_CACHE_SIZE; |
704 | |
705 | /* leave fsid little-endian, regardless of host endianness */ |
706 | fsid = *(u64 *)(&monmap->fsid) ^ *((u64 *)&monmap->fsid + 1); |
707 | diff --git a/fs/ceph/super.h b/fs/ceph/super.h |
708 | index fc35036..d2e01a6 100644 |
709 | --- a/fs/ceph/super.h |
710 | +++ b/fs/ceph/super.h |
711 | @@ -21,7 +21,7 @@ |
712 | |
713 | /* large granularity for statfs utilization stats to facilitate |
714 | * large volume sizes on 32-bit machines. */ |
715 | -#define CEPH_BLOCK_SHIFT 20 /* 1 MB */ |
716 | +#define CEPH_BLOCK_SHIFT 22 /* 4 MB */ |
717 | #define CEPH_BLOCK (1 << CEPH_BLOCK_SHIFT) |
718 | |
719 | #define CEPH_MOUNT_OPT_DIRSTAT (1<<4) /* `cat dirname` for stats */ |
720 | @@ -847,8 +847,13 @@ extern const struct export_operations ceph_export_ops; |
721 | extern int ceph_lock(struct file *file, int cmd, struct file_lock *fl); |
722 | extern int ceph_flock(struct file *file, int cmd, struct file_lock *fl); |
723 | extern void ceph_count_locks(struct inode *inode, int *p_num, int *f_num); |
724 | -extern int ceph_encode_locks(struct inode *i, struct ceph_pagelist *p, |
725 | - int p_locks, int f_locks); |
726 | +extern int ceph_encode_locks_to_buffer(struct inode *inode, |
727 | + struct ceph_filelock *flocks, |
728 | + int num_fcntl_locks, |
729 | + int num_flock_locks); |
730 | +extern int ceph_locks_to_pagelist(struct ceph_filelock *flocks, |
731 | + struct ceph_pagelist *pagelist, |
732 | + int num_fcntl_locks, int num_flock_locks); |
733 | extern int lock_to_ceph_filelock(struct file_lock *fl, struct ceph_filelock *c); |
734 | |
735 | /* debugfs.c */ |
736 | diff --git a/include/linux/ceph/auth.h b/include/linux/ceph/auth.h |
737 | index d4080f3..5f33868 100644 |
738 | --- a/include/linux/ceph/auth.h |
739 | +++ b/include/linux/ceph/auth.h |
740 | @@ -52,6 +52,9 @@ struct ceph_auth_client_ops { |
741 | */ |
742 | int (*create_authorizer)(struct ceph_auth_client *ac, int peer_type, |
743 | struct ceph_auth_handshake *auth); |
744 | + /* ensure that an existing authorizer is up to date */ |
745 | + int (*update_authorizer)(struct ceph_auth_client *ac, int peer_type, |
746 | + struct ceph_auth_handshake *auth); |
747 | int (*verify_authorizer_reply)(struct ceph_auth_client *ac, |
748 | struct ceph_authorizer *a, size_t len); |
749 | void (*destroy_authorizer)(struct ceph_auth_client *ac, |
750 | @@ -75,6 +78,8 @@ struct ceph_auth_client { |
751 | u64 global_id; /* our unique id in system */ |
752 | const struct ceph_crypto_key *key; /* our secret key */ |
753 | unsigned want_keys; /* which services we want */ |
754 | + |
755 | + struct mutex mutex; |
756 | }; |
757 | |
758 | extern struct ceph_auth_client *ceph_auth_init(const char *name, |
759 | @@ -94,5 +99,18 @@ extern int ceph_build_auth(struct ceph_auth_client *ac, |
760 | void *msg_buf, size_t msg_len); |
761 | |
762 | extern int ceph_auth_is_authenticated(struct ceph_auth_client *ac); |
763 | +extern int ceph_auth_create_authorizer(struct ceph_auth_client *ac, |
764 | + int peer_type, |
765 | + struct ceph_auth_handshake *auth); |
766 | +extern void ceph_auth_destroy_authorizer(struct ceph_auth_client *ac, |
767 | + struct ceph_authorizer *a); |
768 | +extern int ceph_auth_update_authorizer(struct ceph_auth_client *ac, |
769 | + int peer_type, |
770 | + struct ceph_auth_handshake *a); |
771 | +extern int ceph_auth_verify_authorizer_reply(struct ceph_auth_client *ac, |
772 | + struct ceph_authorizer *a, |
773 | + size_t len); |
774 | +extern void ceph_auth_invalidate_authorizer(struct ceph_auth_client *ac, |
775 | + int peer_type); |
776 | |
777 | #endif |
778 | diff --git a/include/linux/cpu.h b/include/linux/cpu.h |
779 | index 78ed62f..25fd741 100644 |
780 | --- a/include/linux/cpu.h |
781 | +++ b/include/linux/cpu.h |
782 | @@ -177,6 +177,8 @@ extern struct bus_type cpu_subsys; |
783 | |
784 | extern void get_online_cpus(void); |
785 | extern void put_online_cpus(void); |
786 | +extern void cpu_hotplug_disable(void); |
787 | +extern void cpu_hotplug_enable(void); |
788 | #define hotcpu_notifier(fn, pri) cpu_notifier(fn, pri) |
789 | #define register_hotcpu_notifier(nb) register_cpu_notifier(nb) |
790 | #define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb) |
791 | @@ -199,6 +201,8 @@ static inline void cpu_hotplug_driver_unlock(void) |
792 | |
793 | #define get_online_cpus() do { } while (0) |
794 | #define put_online_cpus() do { } while (0) |
795 | +#define cpu_hotplug_disable() do { } while (0) |
796 | +#define cpu_hotplug_enable() do { } while (0) |
797 | #define hotcpu_notifier(fn, pri) do { (void)(fn); } while (0) |
798 | /* These aren't inline functions due to a GCC bug. */ |
799 | #define register_hotcpu_notifier(nb) ({ (void)(nb); 0; }) |
800 | diff --git a/include/linux/swapops.h b/include/linux/swapops.h |
801 | index 47ead51..c5fd30d 100644 |
802 | --- a/include/linux/swapops.h |
803 | +++ b/include/linux/swapops.h |
804 | @@ -137,6 +137,7 @@ static inline void make_migration_entry_read(swp_entry_t *entry) |
805 | |
806 | extern void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, |
807 | unsigned long address); |
808 | +extern void migration_entry_wait_huge(struct mm_struct *mm, pte_t *pte); |
809 | #else |
810 | |
811 | #define make_migration_entry(page, write) swp_entry(0, 0) |
812 | @@ -148,6 +149,8 @@ static inline int is_migration_entry(swp_entry_t swp) |
813 | static inline void make_migration_entry_read(swp_entry_t *entryp) { } |
814 | static inline void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, |
815 | unsigned long address) { } |
816 | +static inline void migration_entry_wait_huge(struct mm_struct *mm, |
817 | + pte_t *pte) { } |
818 | static inline int is_write_migration_entry(swp_entry_t entry) |
819 | { |
820 | return 0; |
821 | diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h |
822 | index db1c5df..4886c11 100644 |
823 | --- a/include/net/bluetooth/hci_core.h |
824 | +++ b/include/net/bluetooth/hci_core.h |
825 | @@ -976,6 +976,7 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event); |
826 | int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len); |
827 | int mgmt_index_added(struct hci_dev *hdev); |
828 | int mgmt_index_removed(struct hci_dev *hdev); |
829 | +int mgmt_set_powered_failed(struct hci_dev *hdev, int err); |
830 | int mgmt_powered(struct hci_dev *hdev, u8 powered); |
831 | int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable); |
832 | int mgmt_connectable(struct hci_dev *hdev, u8 connectable); |
833 | diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h |
834 | index ebfd91f..8098e87 100644 |
835 | --- a/include/net/bluetooth/mgmt.h |
836 | +++ b/include/net/bluetooth/mgmt.h |
837 | @@ -42,6 +42,7 @@ |
838 | #define MGMT_STATUS_NOT_POWERED 0x0f |
839 | #define MGMT_STATUS_CANCELLED 0x10 |
840 | #define MGMT_STATUS_INVALID_INDEX 0x11 |
841 | +#define MGMT_STATUS_RFKILLED 0x12 |
842 | |
843 | struct mgmt_hdr { |
844 | __le16 opcode; |
845 | diff --git a/kernel/cpu.c b/kernel/cpu.c |
846 | index 2060c6e..26feaa9 100644 |
847 | --- a/kernel/cpu.c |
848 | +++ b/kernel/cpu.c |
849 | @@ -124,6 +124,27 @@ static void cpu_hotplug_done(void) |
850 | mutex_unlock(&cpu_hotplug.lock); |
851 | } |
852 | |
853 | +/* |
854 | + * Wait for currently running CPU hotplug operations to complete (if any) and |
855 | + * disable future CPU hotplug (from sysfs). The 'cpu_add_remove_lock' protects |
856 | + * the 'cpu_hotplug_disabled' flag. The same lock is also acquired by the |
857 | + * hotplug path before performing hotplug operations. So acquiring that lock |
858 | + * guarantees mutual exclusion from any currently running hotplug operations. |
859 | + */ |
860 | +void cpu_hotplug_disable(void) |
861 | +{ |
862 | + cpu_maps_update_begin(); |
863 | + cpu_hotplug_disabled = 1; |
864 | + cpu_maps_update_done(); |
865 | +} |
866 | + |
867 | +void cpu_hotplug_enable(void) |
868 | +{ |
869 | + cpu_maps_update_begin(); |
870 | + cpu_hotplug_disabled = 0; |
871 | + cpu_maps_update_done(); |
872 | +} |
873 | + |
874 | #else /* #if CONFIG_HOTPLUG_CPU */ |
875 | static void cpu_hotplug_begin(void) {} |
876 | static void cpu_hotplug_done(void) {} |
877 | @@ -479,36 +500,6 @@ static int __init alloc_frozen_cpus(void) |
878 | core_initcall(alloc_frozen_cpus); |
879 | |
880 | /* |
881 | - * Prevent regular CPU hotplug from racing with the freezer, by disabling CPU |
882 | - * hotplug when tasks are about to be frozen. Also, don't allow the freezer |
883 | - * to continue until any currently running CPU hotplug operation gets |
884 | - * completed. |
885 | - * To modify the 'cpu_hotplug_disabled' flag, we need to acquire the |
886 | - * 'cpu_add_remove_lock'. And this same lock is also taken by the regular |
887 | - * CPU hotplug path and released only after it is complete. Thus, we |
888 | - * (and hence the freezer) will block here until any currently running CPU |
889 | - * hotplug operation gets completed. |
890 | - */ |
891 | -void cpu_hotplug_disable_before_freeze(void) |
892 | -{ |
893 | - cpu_maps_update_begin(); |
894 | - cpu_hotplug_disabled = 1; |
895 | - cpu_maps_update_done(); |
896 | -} |
897 | - |
898 | - |
899 | -/* |
900 | - * When tasks have been thawed, re-enable regular CPU hotplug (which had been |
901 | - * disabled while beginning to freeze tasks). |
902 | - */ |
903 | -void cpu_hotplug_enable_after_thaw(void) |
904 | -{ |
905 | - cpu_maps_update_begin(); |
906 | - cpu_hotplug_disabled = 0; |
907 | - cpu_maps_update_done(); |
908 | -} |
909 | - |
910 | -/* |
911 | * When callbacks for CPU hotplug notifications are being executed, we must |
912 | * ensure that the state of the system with respect to the tasks being frozen |
913 | * or not, as reported by the notification, remains unchanged *throughout the |
914 | @@ -527,12 +518,12 @@ cpu_hotplug_pm_callback(struct notifier_block *nb, |
915 | |
916 | case PM_SUSPEND_PREPARE: |
917 | case PM_HIBERNATION_PREPARE: |
918 | - cpu_hotplug_disable_before_freeze(); |
919 | + cpu_hotplug_disable(); |
920 | break; |
921 | |
922 | case PM_POST_SUSPEND: |
923 | case PM_POST_HIBERNATION: |
924 | - cpu_hotplug_enable_after_thaw(); |
925 | + cpu_hotplug_enable(); |
926 | break; |
927 | |
928 | default: |
929 | diff --git a/kernel/sys.c b/kernel/sys.c |
930 | index 6a74b83..3449d26 100644 |
931 | --- a/kernel/sys.c |
932 | +++ b/kernel/sys.c |
933 | @@ -353,6 +353,29 @@ int unregister_reboot_notifier(struct notifier_block *nb) |
934 | } |
935 | EXPORT_SYMBOL(unregister_reboot_notifier); |
936 | |
937 | +/* Add backwards compatibility for stable trees. */ |
938 | +#ifndef PF_NO_SETAFFINITY |
939 | +#define PF_NO_SETAFFINITY PF_THREAD_BOUND |
940 | +#endif |
941 | + |
942 | +static void migrate_to_reboot_cpu(void) |
943 | +{ |
944 | + /* The boot cpu is always logical cpu 0 */ |
945 | + int cpu = 0; |
946 | + |
947 | + cpu_hotplug_disable(); |
948 | + |
949 | + /* Make certain the cpu I'm about to reboot on is online */ |
950 | + if (!cpu_online(cpu)) |
951 | + cpu = cpumask_first(cpu_online_mask); |
952 | + |
953 | + /* Prevent races with other tasks migrating this task */ |
954 | + current->flags |= PF_NO_SETAFFINITY; |
955 | + |
956 | + /* Make certain I only run on the appropriate processor */ |
957 | + set_cpus_allowed_ptr(current, cpumask_of(cpu)); |
958 | +} |
959 | + |
960 | /** |
961 | * kernel_restart - reboot the system |
962 | * @cmd: pointer to buffer containing command to execute for restart |
963 | @@ -364,7 +387,7 @@ EXPORT_SYMBOL(unregister_reboot_notifier); |
964 | void kernel_restart(char *cmd) |
965 | { |
966 | kernel_restart_prepare(cmd); |
967 | - disable_nonboot_cpus(); |
968 | + migrate_to_reboot_cpu(); |
969 | syscore_shutdown(); |
970 | if (!cmd) |
971 | printk(KERN_EMERG "Restarting system.\n"); |
972 | @@ -391,7 +414,7 @@ static void kernel_shutdown_prepare(enum system_states state) |
973 | void kernel_halt(void) |
974 | { |
975 | kernel_shutdown_prepare(SYSTEM_HALT); |
976 | - disable_nonboot_cpus(); |
977 | + migrate_to_reboot_cpu(); |
978 | syscore_shutdown(); |
979 | printk(KERN_EMERG "System halted.\n"); |
980 | kmsg_dump(KMSG_DUMP_HALT); |
981 | @@ -410,7 +433,7 @@ void kernel_power_off(void) |
982 | kernel_shutdown_prepare(SYSTEM_POWER_OFF); |
983 | if (pm_power_off_prepare) |
984 | pm_power_off_prepare(); |
985 | - disable_nonboot_cpus(); |
986 | + migrate_to_reboot_cpu(); |
987 | syscore_shutdown(); |
988 | printk(KERN_EMERG "Power down.\n"); |
989 | kmsg_dump(KMSG_DUMP_POWEROFF); |
990 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
991 | index 69b21bb..a692439 100644 |
992 | --- a/mm/hugetlb.c |
993 | +++ b/mm/hugetlb.c |
994 | @@ -2768,7 +2768,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, |
995 | if (ptep) { |
996 | entry = huge_ptep_get(ptep); |
997 | if (unlikely(is_hugetlb_entry_migration(entry))) { |
998 | - migration_entry_wait(mm, (pmd_t *)ptep, address); |
999 | + migration_entry_wait_huge(mm, ptep); |
1000 | return 0; |
1001 | } else if (unlikely(is_hugetlb_entry_hwpoisoned(entry))) |
1002 | return VM_FAULT_HWPOISON_LARGE | |
1003 | diff --git a/mm/migrate.c b/mm/migrate.c |
1004 | index 37cd07b..5f588b1 100644 |
1005 | --- a/mm/migrate.c |
1006 | +++ b/mm/migrate.c |
1007 | @@ -180,15 +180,14 @@ static void remove_migration_ptes(struct page *old, struct page *new) |
1008 | * get to the page and wait until migration is finished. |
1009 | * When we return from this function the fault will be retried. |
1010 | */ |
1011 | -void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, |
1012 | - unsigned long address) |
1013 | +static void __migration_entry_wait(struct mm_struct *mm, pte_t *ptep, |
1014 | + spinlock_t *ptl) |
1015 | { |
1016 | - pte_t *ptep, pte; |
1017 | - spinlock_t *ptl; |
1018 | + pte_t pte; |
1019 | swp_entry_t entry; |
1020 | struct page *page; |
1021 | |
1022 | - ptep = pte_offset_map_lock(mm, pmd, address, &ptl); |
1023 | + spin_lock(ptl); |
1024 | pte = *ptep; |
1025 | if (!is_swap_pte(pte)) |
1026 | goto out; |
1027 | @@ -216,6 +215,20 @@ out: |
1028 | pte_unmap_unlock(ptep, ptl); |
1029 | } |
1030 | |
1031 | +void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, |
1032 | + unsigned long address) |
1033 | +{ |
1034 | + spinlock_t *ptl = pte_lockptr(mm, pmd); |
1035 | + pte_t *ptep = pte_offset_map(pmd, address); |
1036 | + __migration_entry_wait(mm, ptep, ptl); |
1037 | +} |
1038 | + |
1039 | +void migration_entry_wait_huge(struct mm_struct *mm, pte_t *pte) |
1040 | +{ |
1041 | + spinlock_t *ptl = &(mm)->page_table_lock; |
1042 | + __migration_entry_wait(mm, pte, ptl); |
1043 | +} |
1044 | + |
1045 | #ifdef CONFIG_BLOCK |
1046 | /* Returns true if all buffers are successfully locked */ |
1047 | static bool buffer_migrate_lock_buffers(struct buffer_head *head, |
1048 | diff --git a/mm/swap_state.c b/mm/swap_state.c |
1049 | index 4c5ff7f..1fa9220 100644 |
1050 | --- a/mm/swap_state.c |
1051 | +++ b/mm/swap_state.c |
1052 | @@ -313,8 +313,24 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, |
1053 | * Swap entry may have been freed since our caller observed it. |
1054 | */ |
1055 | err = swapcache_prepare(entry); |
1056 | - if (err == -EEXIST) { /* seems racy */ |
1057 | + if (err == -EEXIST) { |
1058 | radix_tree_preload_end(); |
1059 | + /* |
1060 | + * We might race against get_swap_page() and stumble |
1061 | + * across a SWAP_HAS_CACHE swap_map entry whose page |
1062 | + * has not been brought into the swapcache yet, while |
1063 | + * the other end is scheduled away waiting on discard |
1064 | + * I/O completion at scan_swap_map(). |
1065 | + * |
1066 | + * In order to avoid turning this transitory state |
1067 | + * into a permanent loop around this -EEXIST case |
1068 | + * if !CONFIG_PREEMPT and the I/O completion happens |
1069 | + * to be waiting on the CPU waitqueue where we are now |
1070 | + * busy looping, we just conditionally invoke the |
1071 | + * scheduler here, if there are some more important |
1072 | + * tasks to run. |
1073 | + */ |
1074 | + cond_resched(); |
1075 | continue; |
1076 | } |
1077 | if (err) { /* swp entry is obsolete ? */ |
1078 | diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c |
1079 | index 13b6c28..9197ae7 100644 |
1080 | --- a/net/bluetooth/hci_core.c |
1081 | +++ b/net/bluetooth/hci_core.c |
1082 | @@ -1120,11 +1120,15 @@ EXPORT_SYMBOL(hci_free_dev); |
1083 | static void hci_power_on(struct work_struct *work) |
1084 | { |
1085 | struct hci_dev *hdev = container_of(work, struct hci_dev, power_on); |
1086 | + int err; |
1087 | |
1088 | BT_DBG("%s", hdev->name); |
1089 | |
1090 | - if (hci_dev_open(hdev->id) < 0) |
1091 | + err = hci_dev_open(hdev->id); |
1092 | + if (err < 0) { |
1093 | + mgmt_set_powered_failed(hdev, err); |
1094 | return; |
1095 | + } |
1096 | |
1097 | if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) |
1098 | schedule_delayed_work(&hdev->power_off, |
1099 | diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c |
1100 | index 8f3d9dc..9f2f206 100644 |
1101 | --- a/net/bluetooth/mgmt.c |
1102 | +++ b/net/bluetooth/mgmt.c |
1103 | @@ -2833,6 +2833,27 @@ int mgmt_powered(struct hci_dev *hdev, u8 powered) |
1104 | return err; |
1105 | } |
1106 | |
1107 | +int mgmt_set_powered_failed(struct hci_dev *hdev, int err) |
1108 | +{ |
1109 | + struct pending_cmd *cmd; |
1110 | + u8 status; |
1111 | + |
1112 | + cmd = mgmt_pending_find(MGMT_OP_SET_POWERED, hdev); |
1113 | + if (!cmd) |
1114 | + return -ENOENT; |
1115 | + |
1116 | + if (err == -ERFKILL) |
1117 | + status = MGMT_STATUS_RFKILLED; |
1118 | + else |
1119 | + status = MGMT_STATUS_FAILED; |
1120 | + |
1121 | + err = cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status); |
1122 | + |
1123 | + mgmt_pending_remove(cmd); |
1124 | + |
1125 | + return err; |
1126 | +} |
1127 | + |
1128 | int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable) |
1129 | { |
1130 | struct cmd_lookup match = { NULL, hdev }; |
1131 | diff --git a/net/ceph/auth.c b/net/ceph/auth.c |
1132 | index b4bf4ac..6b923bc 100644 |
1133 | --- a/net/ceph/auth.c |
1134 | +++ b/net/ceph/auth.c |
1135 | @@ -47,6 +47,7 @@ struct ceph_auth_client *ceph_auth_init(const char *name, const struct ceph_cryp |
1136 | if (!ac) |
1137 | goto out; |
1138 | |
1139 | + mutex_init(&ac->mutex); |
1140 | ac->negotiating = true; |
1141 | if (name) |
1142 | ac->name = name; |
1143 | @@ -73,10 +74,12 @@ void ceph_auth_destroy(struct ceph_auth_client *ac) |
1144 | */ |
1145 | void ceph_auth_reset(struct ceph_auth_client *ac) |
1146 | { |
1147 | + mutex_lock(&ac->mutex); |
1148 | dout("auth_reset %p\n", ac); |
1149 | if (ac->ops && !ac->negotiating) |
1150 | ac->ops->reset(ac); |
1151 | ac->negotiating = true; |
1152 | + mutex_unlock(&ac->mutex); |
1153 | } |
1154 | |
1155 | int ceph_entity_name_encode(const char *name, void **p, void *end) |
1156 | @@ -102,6 +105,7 @@ int ceph_auth_build_hello(struct ceph_auth_client *ac, void *buf, size_t len) |
1157 | int i, num; |
1158 | int ret; |
1159 | |
1160 | + mutex_lock(&ac->mutex); |
1161 | dout("auth_build_hello\n"); |
1162 | monhdr->have_version = 0; |
1163 | monhdr->session_mon = cpu_to_le16(-1); |
1164 | @@ -122,15 +126,19 @@ int ceph_auth_build_hello(struct ceph_auth_client *ac, void *buf, size_t len) |
1165 | |
1166 | ret = ceph_entity_name_encode(ac->name, &p, end); |
1167 | if (ret < 0) |
1168 | - return ret; |
1169 | + goto out; |
1170 | ceph_decode_need(&p, end, sizeof(u64), bad); |
1171 | ceph_encode_64(&p, ac->global_id); |
1172 | |
1173 | ceph_encode_32(&lenp, p - lenp - sizeof(u32)); |
1174 | - return p - buf; |
1175 | + ret = p - buf; |
1176 | +out: |
1177 | + mutex_unlock(&ac->mutex); |
1178 | + return ret; |
1179 | |
1180 | bad: |
1181 | - return -ERANGE; |
1182 | + ret = -ERANGE; |
1183 | + goto out; |
1184 | } |
1185 | |
1186 | static int ceph_build_auth_request(struct ceph_auth_client *ac, |
1187 | @@ -151,11 +159,13 @@ static int ceph_build_auth_request(struct ceph_auth_client *ac, |
1188 | if (ret < 0) { |
1189 | pr_err("error %d building auth method %s request\n", ret, |
1190 | ac->ops->name); |
1191 | - return ret; |
1192 | + goto out; |
1193 | } |
1194 | dout(" built request %d bytes\n", ret); |
1195 | ceph_encode_32(&p, ret); |
1196 | - return p + ret - msg_buf; |
1197 | + ret = p + ret - msg_buf; |
1198 | +out: |
1199 | + return ret; |
1200 | } |
1201 | |
1202 | /* |
1203 | @@ -176,6 +186,7 @@ int ceph_handle_auth_reply(struct ceph_auth_client *ac, |
1204 | int result_msg_len; |
1205 | int ret = -EINVAL; |
1206 | |
1207 | + mutex_lock(&ac->mutex); |
1208 | dout("handle_auth_reply %p %p\n", p, end); |
1209 | ceph_decode_need(&p, end, sizeof(u32) * 3 + sizeof(u64), bad); |
1210 | protocol = ceph_decode_32(&p); |
1211 | @@ -227,33 +238,103 @@ int ceph_handle_auth_reply(struct ceph_auth_client *ac, |
1212 | |
1213 | ret = ac->ops->handle_reply(ac, result, payload, payload_end); |
1214 | if (ret == -EAGAIN) { |
1215 | - return ceph_build_auth_request(ac, reply_buf, reply_len); |
1216 | + ret = ceph_build_auth_request(ac, reply_buf, reply_len); |
1217 | } else if (ret) { |
1218 | pr_err("auth method '%s' error %d\n", ac->ops->name, ret); |
1219 | - return ret; |
1220 | } |
1221 | - return 0; |
1222 | |
1223 | -bad: |
1224 | - pr_err("failed to decode auth msg\n"); |
1225 | out: |
1226 | + mutex_unlock(&ac->mutex); |
1227 | return ret; |
1228 | + |
1229 | +bad: |
1230 | + pr_err("failed to decode auth msg\n"); |
1231 | + ret = -EINVAL; |
1232 | + goto out; |
1233 | } |
1234 | |
1235 | int ceph_build_auth(struct ceph_auth_client *ac, |
1236 | void *msg_buf, size_t msg_len) |
1237 | { |
1238 | + int ret = 0; |
1239 | + |
1240 | + mutex_lock(&ac->mutex); |
1241 | if (!ac->protocol) |
1242 | - return ceph_auth_build_hello(ac, msg_buf, msg_len); |
1243 | - BUG_ON(!ac->ops); |
1244 | - if (ac->ops->should_authenticate(ac)) |
1245 | - return ceph_build_auth_request(ac, msg_buf, msg_len); |
1246 | - return 0; |
1247 | + ret = ceph_auth_build_hello(ac, msg_buf, msg_len); |
1248 | + else if (ac->ops->should_authenticate(ac)) |
1249 | + ret = ceph_build_auth_request(ac, msg_buf, msg_len); |
1250 | + mutex_unlock(&ac->mutex); |
1251 | + return ret; |
1252 | } |
1253 | |
1254 | int ceph_auth_is_authenticated(struct ceph_auth_client *ac) |
1255 | { |
1256 | - if (!ac->ops) |
1257 | - return 0; |
1258 | - return ac->ops->is_authenticated(ac); |
1259 | + int ret = 0; |
1260 | + |
1261 | + mutex_lock(&ac->mutex); |
1262 | + if (ac->ops) |
1263 | + ret = ac->ops->is_authenticated(ac); |
1264 | + mutex_unlock(&ac->mutex); |
1265 | + return ret; |
1266 | +} |
1267 | +EXPORT_SYMBOL(ceph_auth_is_authenticated); |
1268 | + |
1269 | +int ceph_auth_create_authorizer(struct ceph_auth_client *ac, |
1270 | + int peer_type, |
1271 | + struct ceph_auth_handshake *auth) |
1272 | +{ |
1273 | + int ret = 0; |
1274 | + |
1275 | + mutex_lock(&ac->mutex); |
1276 | + if (ac->ops && ac->ops->create_authorizer) |
1277 | + ret = ac->ops->create_authorizer(ac, peer_type, auth); |
1278 | + mutex_unlock(&ac->mutex); |
1279 | + return ret; |
1280 | +} |
1281 | +EXPORT_SYMBOL(ceph_auth_create_authorizer); |
1282 | + |
1283 | +void ceph_auth_destroy_authorizer(struct ceph_auth_client *ac, |
1284 | + struct ceph_authorizer *a) |
1285 | +{ |
1286 | + mutex_lock(&ac->mutex); |
1287 | + if (ac->ops && ac->ops->destroy_authorizer) |
1288 | + ac->ops->destroy_authorizer(ac, a); |
1289 | + mutex_unlock(&ac->mutex); |
1290 | +} |
1291 | +EXPORT_SYMBOL(ceph_auth_destroy_authorizer); |
1292 | + |
1293 | +int ceph_auth_update_authorizer(struct ceph_auth_client *ac, |
1294 | + int peer_type, |
1295 | + struct ceph_auth_handshake *a) |
1296 | +{ |
1297 | + int ret = 0; |
1298 | + |
1299 | + mutex_lock(&ac->mutex); |
1300 | + if (ac->ops && ac->ops->update_authorizer) |
1301 | + ret = ac->ops->update_authorizer(ac, peer_type, a); |
1302 | + mutex_unlock(&ac->mutex); |
1303 | + return ret; |
1304 | +} |
1305 | +EXPORT_SYMBOL(ceph_auth_update_authorizer); |
1306 | + |
1307 | +int ceph_auth_verify_authorizer_reply(struct ceph_auth_client *ac, |
1308 | + struct ceph_authorizer *a, size_t len) |
1309 | +{ |
1310 | + int ret = 0; |
1311 | + |
1312 | + mutex_lock(&ac->mutex); |
1313 | + if (ac->ops && ac->ops->verify_authorizer_reply) |
1314 | + ret = ac->ops->verify_authorizer_reply(ac, a, len); |
1315 | + mutex_unlock(&ac->mutex); |
1316 | + return ret; |
1317 | +} |
1318 | +EXPORT_SYMBOL(ceph_auth_verify_authorizer_reply); |
1319 | + |
1320 | +void ceph_auth_invalidate_authorizer(struct ceph_auth_client *ac, int peer_type) |
1321 | +{ |
1322 | + mutex_lock(&ac->mutex); |
1323 | + if (ac->ops && ac->ops->invalidate_authorizer) |
1324 | + ac->ops->invalidate_authorizer(ac, peer_type); |
1325 | + mutex_unlock(&ac->mutex); |
1326 | } |
1327 | +EXPORT_SYMBOL(ceph_auth_invalidate_authorizer); |
1328 | diff --git a/net/ceph/auth_x.c b/net/ceph/auth_x.c |
1329 | index a16bf14..96238ba 100644 |
1330 | --- a/net/ceph/auth_x.c |
1331 | +++ b/net/ceph/auth_x.c |
1332 | @@ -298,6 +298,7 @@ static int ceph_x_build_authorizer(struct ceph_auth_client *ac, |
1333 | return -ENOMEM; |
1334 | } |
1335 | au->service = th->service; |
1336 | + au->secret_id = th->secret_id; |
1337 | |
1338 | msg_a = au->buf->vec.iov_base; |
1339 | msg_a->struct_v = 1; |
1340 | @@ -555,6 +556,26 @@ static int ceph_x_create_authorizer( |
1341 | return 0; |
1342 | } |
1343 | |
1344 | +static int ceph_x_update_authorizer( |
1345 | + struct ceph_auth_client *ac, int peer_type, |
1346 | + struct ceph_auth_handshake *auth) |
1347 | +{ |
1348 | + struct ceph_x_authorizer *au; |
1349 | + struct ceph_x_ticket_handler *th; |
1350 | + |
1351 | + th = get_ticket_handler(ac, peer_type); |
1352 | + if (IS_ERR(th)) |
1353 | + return PTR_ERR(th); |
1354 | + |
1355 | + au = (struct ceph_x_authorizer *)auth->authorizer; |
1356 | + if (au->secret_id < th->secret_id) { |
1357 | + dout("ceph_x_update_authorizer service %u secret %llu < %llu\n", |
1358 | + au->service, au->secret_id, th->secret_id); |
1359 | + return ceph_x_build_authorizer(ac, th, au); |
1360 | + } |
1361 | + return 0; |
1362 | +} |
1363 | + |
1364 | static int ceph_x_verify_authorizer_reply(struct ceph_auth_client *ac, |
1365 | struct ceph_authorizer *a, size_t len) |
1366 | { |
1367 | @@ -630,7 +651,7 @@ static void ceph_x_invalidate_authorizer(struct ceph_auth_client *ac, |
1368 | |
1369 | th = get_ticket_handler(ac, peer_type); |
1370 | if (!IS_ERR(th)) |
1371 | - remove_ticket_handler(ac, th); |
1372 | + memset(&th->validity, 0, sizeof(th->validity)); |
1373 | } |
1374 | |
1375 | |
1376 | @@ -641,6 +662,7 @@ static const struct ceph_auth_client_ops ceph_x_ops = { |
1377 | .build_request = ceph_x_build_request, |
1378 | .handle_reply = ceph_x_handle_reply, |
1379 | .create_authorizer = ceph_x_create_authorizer, |
1380 | + .update_authorizer = ceph_x_update_authorizer, |
1381 | .verify_authorizer_reply = ceph_x_verify_authorizer_reply, |
1382 | .destroy_authorizer = ceph_x_destroy_authorizer, |
1383 | .invalidate_authorizer = ceph_x_invalidate_authorizer, |
1384 | diff --git a/net/ceph/auth_x.h b/net/ceph/auth_x.h |
1385 | index e02da7a..5c2ad4e 100644 |
1386 | --- a/net/ceph/auth_x.h |
1387 | +++ b/net/ceph/auth_x.h |
1388 | @@ -29,6 +29,7 @@ struct ceph_x_authorizer { |
1389 | struct ceph_buffer *buf; |
1390 | unsigned service; |
1391 | u64 nonce; |
1392 | + u64 secret_id; |
1393 | char reply_buf[128]; /* big enough for encrypted blob */ |
1394 | }; |
1395 | |
1396 | diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c |
1397 | index ba1037c..7f703ae 100644 |
1398 | --- a/net/ceph/messenger.c |
1399 | +++ b/net/ceph/messenger.c |
1400 | @@ -1542,7 +1542,6 @@ static int process_connect(struct ceph_connection *con) |
1401 | con->error_msg = "connect authorization failure"; |
1402 | return -1; |
1403 | } |
1404 | - con->auth_retry = 1; |
1405 | con_out_kvec_reset(con); |
1406 | ret = prepare_write_connect(con); |
1407 | if (ret < 0) |
1408 | @@ -1627,7 +1626,7 @@ static int process_connect(struct ceph_connection *con) |
1409 | |
1410 | WARN_ON(con->state != CON_STATE_NEGOTIATING); |
1411 | con->state = CON_STATE_OPEN; |
1412 | - |
1413 | + con->auth_retry = 0; /* we authenticated; clear flag */ |
1414 | con->peer_global_seq = le32_to_cpu(con->in_reply.global_seq); |
1415 | con->connect_seq++; |
1416 | con->peer_features = server_feat; |
1417 | diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c |
1418 | index 89a6409..6765da3 100644 |
1419 | --- a/net/ceph/mon_client.c |
1420 | +++ b/net/ceph/mon_client.c |
1421 | @@ -737,7 +737,7 @@ static void delayed_work(struct work_struct *work) |
1422 | |
1423 | __validate_auth(monc); |
1424 | |
1425 | - if (monc->auth->ops->is_authenticated(monc->auth)) |
1426 | + if (ceph_auth_is_authenticated(monc->auth)) |
1427 | __send_subscribe(monc); |
1428 | } |
1429 | __schedule_delayed(monc); |
1430 | @@ -893,8 +893,7 @@ static void handle_auth_reply(struct ceph_mon_client *monc, |
1431 | |
1432 | mutex_lock(&monc->mutex); |
1433 | had_debugfs_info = have_debugfs_info(monc); |
1434 | - if (monc->auth->ops) |
1435 | - was_auth = monc->auth->ops->is_authenticated(monc->auth); |
1436 | + was_auth = ceph_auth_is_authenticated(monc->auth); |
1437 | monc->pending_auth = 0; |
1438 | ret = ceph_handle_auth_reply(monc->auth, msg->front.iov_base, |
1439 | msg->front.iov_len, |
1440 | @@ -905,7 +904,7 @@ static void handle_auth_reply(struct ceph_mon_client *monc, |
1441 | wake_up_all(&monc->client->auth_wq); |
1442 | } else if (ret > 0) { |
1443 | __send_prepared_auth_request(monc, ret); |
1444 | - } else if (!was_auth && monc->auth->ops->is_authenticated(monc->auth)) { |
1445 | + } else if (!was_auth && ceph_auth_is_authenticated(monc->auth)) { |
1446 | dout("authenticated, starting session\n"); |
1447 | |
1448 | monc->client->msgr.inst.name.type = CEPH_ENTITY_TYPE_CLIENT; |
1449 | diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c |
1450 | index b16dfa2..8e3aa4d 100644 |
1451 | --- a/net/ceph/osd_client.c |
1452 | +++ b/net/ceph/osd_client.c |
1453 | @@ -671,8 +671,7 @@ static void put_osd(struct ceph_osd *osd) |
1454 | if (atomic_dec_and_test(&osd->o_ref) && osd->o_auth.authorizer) { |
1455 | struct ceph_auth_client *ac = osd->o_osdc->client->monc.auth; |
1456 | |
1457 | - if (ac->ops && ac->ops->destroy_authorizer) |
1458 | - ac->ops->destroy_authorizer(ac, osd->o_auth.authorizer); |
1459 | + ceph_auth_destroy_authorizer(ac, osd->o_auth.authorizer); |
1460 | kfree(osd); |
1461 | } |
1462 | } |
1463 | @@ -1337,13 +1336,13 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) |
1464 | __register_request(osdc, req); |
1465 | __unregister_linger_request(osdc, req); |
1466 | } |
1467 | + reset_changed_osds(osdc); |
1468 | mutex_unlock(&osdc->request_mutex); |
1469 | |
1470 | if (needmap) { |
1471 | dout("%d requests for down osds, need new map\n", needmap); |
1472 | ceph_monc_request_next_osdmap(&osdc->client->monc); |
1473 | } |
1474 | - reset_changed_osds(osdc); |
1475 | } |
1476 | |
1477 | |
1478 | @@ -2127,13 +2126,17 @@ static struct ceph_auth_handshake *get_authorizer(struct ceph_connection *con, |
1479 | struct ceph_auth_handshake *auth = &o->o_auth; |
1480 | |
1481 | if (force_new && auth->authorizer) { |
1482 | - if (ac->ops && ac->ops->destroy_authorizer) |
1483 | - ac->ops->destroy_authorizer(ac, auth->authorizer); |
1484 | + ceph_auth_destroy_authorizer(ac, auth->authorizer); |
1485 | auth->authorizer = NULL; |
1486 | } |
1487 | - if (!auth->authorizer && ac->ops && ac->ops->create_authorizer) { |
1488 | - int ret = ac->ops->create_authorizer(ac, CEPH_ENTITY_TYPE_OSD, |
1489 | - auth); |
1490 | + if (!auth->authorizer) { |
1491 | + int ret = ceph_auth_create_authorizer(ac, CEPH_ENTITY_TYPE_OSD, |
1492 | + auth); |
1493 | + if (ret) |
1494 | + return ERR_PTR(ret); |
1495 | + } else { |
1496 | + int ret = ceph_auth_update_authorizer(ac, CEPH_ENTITY_TYPE_OSD, |
1497 | + auth); |
1498 | if (ret) |
1499 | return ERR_PTR(ret); |
1500 | } |
1501 | @@ -2149,11 +2152,7 @@ static int verify_authorizer_reply(struct ceph_connection *con, int len) |
1502 | struct ceph_osd_client *osdc = o->o_osdc; |
1503 | struct ceph_auth_client *ac = osdc->client->monc.auth; |
1504 | |
1505 | - /* |
1506 | - * XXX If ac->ops or ac->ops->verify_authorizer_reply is null, |
1507 | - * XXX which do we do: succeed or fail? |
1508 | - */ |
1509 | - return ac->ops->verify_authorizer_reply(ac, o->o_auth.authorizer, len); |
1510 | + return ceph_auth_verify_authorizer_reply(ac, o->o_auth.authorizer, len); |
1511 | } |
1512 | |
1513 | static int invalidate_authorizer(struct ceph_connection *con) |
1514 | @@ -2162,9 +2161,7 @@ static int invalidate_authorizer(struct ceph_connection *con) |
1515 | struct ceph_osd_client *osdc = o->o_osdc; |
1516 | struct ceph_auth_client *ac = osdc->client->monc.auth; |
1517 | |
1518 | - if (ac->ops && ac->ops->invalidate_authorizer) |
1519 | - ac->ops->invalidate_authorizer(ac, CEPH_ENTITY_TYPE_OSD); |
1520 | - |
1521 | + ceph_auth_invalidate_authorizer(ac, CEPH_ENTITY_TYPE_OSD); |
1522 | return ceph_monc_validate_auth(&osdc->client->monc); |
1523 | } |
1524 |