Annotation of /trunk/kernel26-alx/patches-3.10/0134-3.10.35-all-fixes.patch
Parent Directory | Revision Log
Revision 2672 -
(hide annotations)
(download)
Tue Jul 21 16:46:35 2015 UTC (8 years, 11 months ago) by niro
File size: 33566 byte(s)
Tue Jul 21 16:46:35 2015 UTC (8 years, 11 months ago) by niro
File size: 33566 byte(s)
-3.10.84-alx-r1
1 | niro | 2672 | diff --git a/Makefile b/Makefile |
2 | index 571a1bf14868..06b31fce1ff5 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 3 | ||
7 | PATCHLEVEL = 10 | ||
8 | -SUBLEVEL = 34 | ||
9 | +SUBLEVEL = 35 | ||
10 | EXTRAVERSION = | ||
11 | NAME = TOSSUG Baby Fish | ||
12 | |||
13 | diff --git a/arch/arm/include/asm/outercache.h b/arch/arm/include/asm/outercache.h | ||
14 | index 12f71a190422..f94784f0e3a6 100644 | ||
15 | --- a/arch/arm/include/asm/outercache.h | ||
16 | +++ b/arch/arm/include/asm/outercache.h | ||
17 | @@ -37,10 +37,10 @@ struct outer_cache_fns { | ||
18 | void (*resume)(void); | ||
19 | }; | ||
20 | |||
21 | -#ifdef CONFIG_OUTER_CACHE | ||
22 | - | ||
23 | extern struct outer_cache_fns outer_cache; | ||
24 | |||
25 | +#ifdef CONFIG_OUTER_CACHE | ||
26 | + | ||
27 | static inline void outer_inv_range(phys_addr_t start, phys_addr_t end) | ||
28 | { | ||
29 | if (outer_cache.inv_range) | ||
30 | diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c | ||
31 | index 5ed19e88874b..35d1029d7c9d 100644 | ||
32 | --- a/arch/arm/mach-highbank/highbank.c | ||
33 | +++ b/arch/arm/mach-highbank/highbank.c | ||
34 | @@ -65,14 +65,12 @@ void highbank_set_cpu_jump(int cpu, void *jump_addr) | ||
35 | HB_JUMP_TABLE_PHYS(cpu) + 15); | ||
36 | } | ||
37 | |||
38 | -#ifdef CONFIG_CACHE_L2X0 | ||
39 | static void highbank_l2x0_disable(void) | ||
40 | { | ||
41 | outer_flush_all(); | ||
42 | /* Disable PL310 L2 Cache controller */ | ||
43 | highbank_smc1(0x102, 0x0); | ||
44 | } | ||
45 | -#endif | ||
46 | |||
47 | static void __init highbank_init_irq(void) | ||
48 | { | ||
49 | @@ -81,12 +79,13 @@ static void __init highbank_init_irq(void) | ||
50 | if (of_find_compatible_node(NULL, NULL, "arm,cortex-a9")) | ||
51 | highbank_scu_map_io(); | ||
52 | |||
53 | -#ifdef CONFIG_CACHE_L2X0 | ||
54 | /* Enable PL310 L2 Cache controller */ | ||
55 | - highbank_smc1(0x102, 0x1); | ||
56 | - l2x0_of_init(0, ~0UL); | ||
57 | - outer_cache.disable = highbank_l2x0_disable; | ||
58 | -#endif | ||
59 | + if (IS_ENABLED(CONFIG_CACHE_L2X0) && | ||
60 | + of_find_compatible_node(NULL, NULL, "arm,pl310-cache")) { | ||
61 | + highbank_smc1(0x102, 0x1); | ||
62 | + l2x0_of_init(0, ~0UL); | ||
63 | + outer_cache.disable = highbank_l2x0_disable; | ||
64 | + } | ||
65 | } | ||
66 | |||
67 | static void __init highbank_timer_init(void) | ||
68 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c | ||
69 | index 004cc87b781c..711c649f80b7 100644 | ||
70 | --- a/arch/x86/kvm/mmu.c | ||
71 | +++ b/arch/x86/kvm/mmu.c | ||
72 | @@ -2585,6 +2585,9 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write, | ||
73 | int emulate = 0; | ||
74 | gfn_t pseudo_gfn; | ||
75 | |||
76 | + if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) | ||
77 | + return 0; | ||
78 | + | ||
79 | for_each_shadow_entry(vcpu, (u64)gfn << PAGE_SHIFT, iterator) { | ||
80 | if (iterator.level == level) { | ||
81 | mmu_set_spte(vcpu, iterator.sptep, ACC_ALL, | ||
82 | @@ -2748,6 +2751,9 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level, | ||
83 | bool ret = false; | ||
84 | u64 spte = 0ull; | ||
85 | |||
86 | + if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) | ||
87 | + return false; | ||
88 | + | ||
89 | if (!page_fault_can_be_fast(vcpu, error_code)) | ||
90 | return false; | ||
91 | |||
92 | @@ -3139,6 +3145,9 @@ static u64 walk_shadow_page_get_mmio_spte(struct kvm_vcpu *vcpu, u64 addr) | ||
93 | struct kvm_shadow_walk_iterator iterator; | ||
94 | u64 spte = 0ull; | ||
95 | |||
96 | + if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) | ||
97 | + return spte; | ||
98 | + | ||
99 | walk_shadow_page_lockless_begin(vcpu); | ||
100 | for_each_shadow_entry_lockless(vcpu, addr, iterator, spte) | ||
101 | if (!is_shadow_present_pte(spte)) | ||
102 | @@ -4329,6 +4338,9 @@ int kvm_mmu_get_spte_hierarchy(struct kvm_vcpu *vcpu, u64 addr, u64 sptes[4]) | ||
103 | u64 spte; | ||
104 | int nr_sptes = 0; | ||
105 | |||
106 | + if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) | ||
107 | + return nr_sptes; | ||
108 | + | ||
109 | walk_shadow_page_lockless_begin(vcpu); | ||
110 | for_each_shadow_entry_lockless(vcpu, addr, iterator, spte) { | ||
111 | sptes[iterator.level-1] = spte; | ||
112 | diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h | ||
113 | index da20860b457a..7e6090e13237 100644 | ||
114 | --- a/arch/x86/kvm/paging_tmpl.h | ||
115 | +++ b/arch/x86/kvm/paging_tmpl.h | ||
116 | @@ -423,6 +423,9 @@ static int FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, | ||
117 | if (FNAME(gpte_changed)(vcpu, gw, top_level)) | ||
118 | goto out_gpte_changed; | ||
119 | |||
120 | + if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) | ||
121 | + goto out_gpte_changed; | ||
122 | + | ||
123 | for (shadow_walk_init(&it, vcpu, addr); | ||
124 | shadow_walk_okay(&it) && it.level > gw->level; | ||
125 | shadow_walk_next(&it)) { | ||
126 | @@ -671,6 +674,11 @@ static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva) | ||
127 | */ | ||
128 | mmu_topup_memory_caches(vcpu); | ||
129 | |||
130 | + if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) { | ||
131 | + WARN_ON(1); | ||
132 | + return; | ||
133 | + } | ||
134 | + | ||
135 | spin_lock(&vcpu->kvm->mmu_lock); | ||
136 | for_each_shadow_entry(vcpu, gva, iterator) { | ||
137 | level = iterator.level; | ||
138 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | ||
139 | index 5402c94ab768..7cdafb6dc705 100644 | ||
140 | --- a/arch/x86/kvm/vmx.c | ||
141 | +++ b/arch/x86/kvm/vmx.c | ||
142 | @@ -7133,8 +7133,8 @@ static void vmx_free_vcpu(struct kvm_vcpu *vcpu) | ||
143 | struct vcpu_vmx *vmx = to_vmx(vcpu); | ||
144 | |||
145 | free_vpid(vmx); | ||
146 | - free_nested(vmx); | ||
147 | free_loaded_vmcs(vmx->loaded_vmcs); | ||
148 | + free_nested(vmx); | ||
149 | kfree(vmx->guest_msrs); | ||
150 | kvm_vcpu_uninit(vcpu); | ||
151 | kmem_cache_free(kvm_vcpu_cache, vmx); | ||
152 | diff --git a/arch/x86/net/bpf_jit.S b/arch/x86/net/bpf_jit.S | ||
153 | index 877b9a1b2152..01495755701b 100644 | ||
154 | --- a/arch/x86/net/bpf_jit.S | ||
155 | +++ b/arch/x86/net/bpf_jit.S | ||
156 | @@ -140,7 +140,7 @@ bpf_slow_path_byte_msh: | ||
157 | push %r9; \ | ||
158 | push SKBDATA; \ | ||
159 | /* rsi already has offset */ \ | ||
160 | - mov $SIZE,%ecx; /* size */ \ | ||
161 | + mov $SIZE,%edx; /* size */ \ | ||
162 | call bpf_internal_load_pointer_neg_helper; \ | ||
163 | test %rax,%rax; \ | ||
164 | pop SKBDATA; \ | ||
165 | diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c | ||
166 | index 1e8e42fb03a4..1fb1a7b5a754 100644 | ||
167 | --- a/drivers/input/mouse/elantech.c | ||
168 | +++ b/drivers/input/mouse/elantech.c | ||
169 | @@ -486,6 +486,7 @@ static void elantech_input_sync_v4(struct psmouse *psmouse) | ||
170 | unsigned char *packet = psmouse->packet; | ||
171 | |||
172 | input_report_key(dev, BTN_LEFT, packet[0] & 0x01); | ||
173 | + input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); | ||
174 | input_mt_report_pointer_emulation(dev, true); | ||
175 | input_sync(dev); | ||
176 | } | ||
177 | @@ -954,6 +955,44 @@ static int elantech_get_resolution_v4(struct psmouse *psmouse, | ||
178 | } | ||
179 | |||
180 | /* | ||
181 | + * Advertise INPUT_PROP_BUTTONPAD for clickpads. The testing of bit 12 in | ||
182 | + * fw_version for this is based on the following fw_version & caps table: | ||
183 | + * | ||
184 | + * Laptop-model: fw_version: caps: buttons: | ||
185 | + * Acer S3 0x461f00 10, 13, 0e clickpad | ||
186 | + * Acer S7-392 0x581f01 50, 17, 0d clickpad | ||
187 | + * Acer V5-131 0x461f02 01, 16, 0c clickpad | ||
188 | + * Acer V5-551 0x461f00 ? clickpad | ||
189 | + * Asus K53SV 0x450f01 78, 15, 0c 2 hw buttons | ||
190 | + * Asus G46VW 0x460f02 00, 18, 0c 2 hw buttons | ||
191 | + * Asus G750JX 0x360f00 00, 16, 0c 2 hw buttons | ||
192 | + * Asus UX31 0x361f00 20, 15, 0e clickpad | ||
193 | + * Asus UX32VD 0x361f02 00, 15, 0e clickpad | ||
194 | + * Avatar AVIU-145A2 0x361f00 ? clickpad | ||
195 | + * Gigabyte U2442 0x450f01 58, 17, 0c 2 hw buttons | ||
196 | + * Lenovo L430 0x350f02 b9, 15, 0c 2 hw buttons (*) | ||
197 | + * Samsung NF210 0x150b00 78, 14, 0a 2 hw buttons | ||
198 | + * Samsung NP770Z5E 0x575f01 10, 15, 0f clickpad | ||
199 | + * Samsung NP700Z5B 0x361f06 21, 15, 0f clickpad | ||
200 | + * Samsung NP900X3E-A02 0x575f03 ? clickpad | ||
201 | + * Samsung NP-QX410 0x851b00 19, 14, 0c clickpad | ||
202 | + * Samsung RC512 0x450f00 08, 15, 0c 2 hw buttons | ||
203 | + * Samsung RF710 0x450f00 ? 2 hw buttons | ||
204 | + * System76 Pangolin 0x250f01 ? 2 hw buttons | ||
205 | + * (*) + 3 trackpoint buttons | ||
206 | + */ | ||
207 | +static void elantech_set_buttonpad_prop(struct psmouse *psmouse) | ||
208 | +{ | ||
209 | + struct input_dev *dev = psmouse->dev; | ||
210 | + struct elantech_data *etd = psmouse->private; | ||
211 | + | ||
212 | + if (etd->fw_version & 0x001000) { | ||
213 | + __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); | ||
214 | + __clear_bit(BTN_RIGHT, dev->keybit); | ||
215 | + } | ||
216 | +} | ||
217 | + | ||
218 | +/* | ||
219 | * Set the appropriate event bits for the input subsystem | ||
220 | */ | ||
221 | static int elantech_set_input_params(struct psmouse *psmouse) | ||
222 | @@ -996,6 +1035,8 @@ static int elantech_set_input_params(struct psmouse *psmouse) | ||
223 | __set_bit(INPUT_PROP_SEMI_MT, dev->propbit); | ||
224 | /* fall through */ | ||
225 | case 3: | ||
226 | + if (etd->hw_version == 3) | ||
227 | + elantech_set_buttonpad_prop(psmouse); | ||
228 | input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0); | ||
229 | input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0); | ||
230 | if (etd->reports_pressure) { | ||
231 | @@ -1017,9 +1058,7 @@ static int elantech_set_input_params(struct psmouse *psmouse) | ||
232 | */ | ||
233 | psmouse_warn(psmouse, "couldn't query resolution data.\n"); | ||
234 | } | ||
235 | - /* v4 is clickpad, with only one button. */ | ||
236 | - __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); | ||
237 | - __clear_bit(BTN_RIGHT, dev->keybit); | ||
238 | + elantech_set_buttonpad_prop(psmouse); | ||
239 | __set_bit(BTN_TOOL_QUADTAP, dev->keybit); | ||
240 | /* For X to recognize me as touchpad. */ | ||
241 | input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0); | ||
242 | diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c | ||
243 | index aaf23aeae2ea..3d838c0b495d 100644 | ||
244 | --- a/drivers/input/tablet/wacom_sys.c | ||
245 | +++ b/drivers/input/tablet/wacom_sys.c | ||
246 | @@ -339,7 +339,7 @@ static int wacom_parse_hid(struct usb_interface *intf, | ||
247 | struct usb_device *dev = interface_to_usbdev(intf); | ||
248 | char limit = 0; | ||
249 | /* result has to be defined as int for some devices */ | ||
250 | - int result = 0; | ||
251 | + int result = 0, touch_max = 0; | ||
252 | int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0; | ||
253 | unsigned char *report; | ||
254 | |||
255 | @@ -386,7 +386,8 @@ static int wacom_parse_hid(struct usb_interface *intf, | ||
256 | if (usage == WCM_DESKTOP) { | ||
257 | if (finger) { | ||
258 | features->device_type = BTN_TOOL_FINGER; | ||
259 | - | ||
260 | + /* touch device at least supports one touch point */ | ||
261 | + touch_max = 1; | ||
262 | switch (features->type) { | ||
263 | case TABLETPC2FG: | ||
264 | features->pktlen = WACOM_PKGLEN_TPC2FG; | ||
265 | @@ -539,6 +540,8 @@ static int wacom_parse_hid(struct usb_interface *intf, | ||
266 | } | ||
267 | |||
268 | out: | ||
269 | + if (!features->touch_max && touch_max) | ||
270 | + features->touch_max = touch_max; | ||
271 | result = 0; | ||
272 | kfree(report); | ||
273 | return result; | ||
274 | diff --git a/drivers/media/pci/cx18/cx18-driver.c b/drivers/media/pci/cx18/cx18-driver.c | ||
275 | index 13c9718a5ace..16e89f026bca 100644 | ||
276 | --- a/drivers/media/pci/cx18/cx18-driver.c | ||
277 | +++ b/drivers/media/pci/cx18/cx18-driver.c | ||
278 | @@ -327,13 +327,16 @@ void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv) | ||
279 | struct i2c_client *c; | ||
280 | u8 eedata[256]; | ||
281 | |||
282 | + memset(tv, 0, sizeof(*tv)); | ||
283 | + | ||
284 | c = kzalloc(sizeof(*c), GFP_KERNEL); | ||
285 | + if (!c) | ||
286 | + return; | ||
287 | |||
288 | strlcpy(c->name, "cx18 tveeprom tmp", sizeof(c->name)); | ||
289 | c->adapter = &cx->i2c_adap[0]; | ||
290 | c->addr = 0xa0 >> 1; | ||
291 | |||
292 | - memset(tv, 0, sizeof(*tv)); | ||
293 | if (tveeprom_read(c, eedata, sizeof(eedata))) | ||
294 | goto ret; | ||
295 | |||
296 | diff --git a/drivers/media/usb/dvb-usb/cxusb.c b/drivers/media/usb/dvb-usb/cxusb.c | ||
297 | index 20e345d9fe8f..a1c641e18362 100644 | ||
298 | --- a/drivers/media/usb/dvb-usb/cxusb.c | ||
299 | +++ b/drivers/media/usb/dvb-usb/cxusb.c | ||
300 | @@ -149,6 +149,7 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
301 | int num) | ||
302 | { | ||
303 | struct dvb_usb_device *d = i2c_get_adapdata(adap); | ||
304 | + int ret; | ||
305 | int i; | ||
306 | |||
307 | if (mutex_lock_interruptible(&d->i2c_mutex) < 0) | ||
308 | @@ -173,7 +174,8 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
309 | if (1 + msg[i].len > sizeof(ibuf)) { | ||
310 | warn("i2c rd: len=%d is too big!\n", | ||
311 | msg[i].len); | ||
312 | - return -EOPNOTSUPP; | ||
313 | + ret = -EOPNOTSUPP; | ||
314 | + goto unlock; | ||
315 | } | ||
316 | obuf[0] = 0; | ||
317 | obuf[1] = msg[i].len; | ||
318 | @@ -193,12 +195,14 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
319 | if (3 + msg[i].len > sizeof(obuf)) { | ||
320 | warn("i2c wr: len=%d is too big!\n", | ||
321 | msg[i].len); | ||
322 | - return -EOPNOTSUPP; | ||
323 | + ret = -EOPNOTSUPP; | ||
324 | + goto unlock; | ||
325 | } | ||
326 | if (1 + msg[i + 1].len > sizeof(ibuf)) { | ||
327 | warn("i2c rd: len=%d is too big!\n", | ||
328 | msg[i + 1].len); | ||
329 | - return -EOPNOTSUPP; | ||
330 | + ret = -EOPNOTSUPP; | ||
331 | + goto unlock; | ||
332 | } | ||
333 | obuf[0] = msg[i].len; | ||
334 | obuf[1] = msg[i+1].len; | ||
335 | @@ -223,7 +227,8 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
336 | if (2 + msg[i].len > sizeof(obuf)) { | ||
337 | warn("i2c wr: len=%d is too big!\n", | ||
338 | msg[i].len); | ||
339 | - return -EOPNOTSUPP; | ||
340 | + ret = -EOPNOTSUPP; | ||
341 | + goto unlock; | ||
342 | } | ||
343 | obuf[0] = msg[i].addr; | ||
344 | obuf[1] = msg[i].len; | ||
345 | @@ -237,8 +242,14 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
346 | } | ||
347 | } | ||
348 | |||
349 | + if (i == num) | ||
350 | + ret = num; | ||
351 | + else | ||
352 | + ret = -EREMOTEIO; | ||
353 | + | ||
354 | +unlock: | ||
355 | mutex_unlock(&d->i2c_mutex); | ||
356 | - return i == num ? num : -EREMOTEIO; | ||
357 | + return ret; | ||
358 | } | ||
359 | |||
360 | static u32 cxusb_i2c_func(struct i2c_adapter *adapter) | ||
361 | diff --git a/drivers/media/usb/dvb-usb/dw2102.c b/drivers/media/usb/dvb-usb/dw2102.c | ||
362 | index 71b22f5a05ce..4170a45d17e0 100644 | ||
363 | --- a/drivers/media/usb/dvb-usb/dw2102.c | ||
364 | +++ b/drivers/media/usb/dvb-usb/dw2102.c | ||
365 | @@ -301,6 +301,7 @@ static int dw2102_serit_i2c_transfer(struct i2c_adapter *adap, | ||
366 | static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num) | ||
367 | { | ||
368 | struct dvb_usb_device *d = i2c_get_adapdata(adap); | ||
369 | + int ret; | ||
370 | |||
371 | if (!d) | ||
372 | return -ENODEV; | ||
373 | @@ -316,7 +317,8 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms | ||
374 | if (2 + msg[1].len > sizeof(ibuf)) { | ||
375 | warn("i2c rd: len=%d is too big!\n", | ||
376 | msg[1].len); | ||
377 | - return -EOPNOTSUPP; | ||
378 | + ret = -EOPNOTSUPP; | ||
379 | + goto unlock; | ||
380 | } | ||
381 | |||
382 | obuf[0] = msg[0].addr << 1; | ||
383 | @@ -340,7 +342,8 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms | ||
384 | if (2 + msg[0].len > sizeof(obuf)) { | ||
385 | warn("i2c wr: len=%d is too big!\n", | ||
386 | msg[1].len); | ||
387 | - return -EOPNOTSUPP; | ||
388 | + ret = -EOPNOTSUPP; | ||
389 | + goto unlock; | ||
390 | } | ||
391 | |||
392 | obuf[0] = msg[0].addr << 1; | ||
393 | @@ -357,7 +360,8 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms | ||
394 | if (2 + msg[0].len > sizeof(obuf)) { | ||
395 | warn("i2c wr: len=%d is too big!\n", | ||
396 | msg[1].len); | ||
397 | - return -EOPNOTSUPP; | ||
398 | + ret = -EOPNOTSUPP; | ||
399 | + goto unlock; | ||
400 | } | ||
401 | |||
402 | obuf[0] = msg[0].addr << 1; | ||
403 | @@ -386,15 +390,17 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms | ||
404 | |||
405 | break; | ||
406 | } | ||
407 | + ret = num; | ||
408 | |||
409 | +unlock: | ||
410 | mutex_unlock(&d->i2c_mutex); | ||
411 | - return num; | ||
412 | + return ret; | ||
413 | } | ||
414 | |||
415 | static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num) | ||
416 | { | ||
417 | struct dvb_usb_device *d = i2c_get_adapdata(adap); | ||
418 | - int len, i, j; | ||
419 | + int len, i, j, ret; | ||
420 | |||
421 | if (!d) | ||
422 | return -ENODEV; | ||
423 | @@ -430,7 +436,8 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i | ||
424 | if (2 + msg[j].len > sizeof(ibuf)) { | ||
425 | warn("i2c rd: len=%d is too big!\n", | ||
426 | msg[j].len); | ||
427 | - return -EOPNOTSUPP; | ||
428 | + ret = -EOPNOTSUPP; | ||
429 | + goto unlock; | ||
430 | } | ||
431 | |||
432 | dw210x_op_rw(d->udev, 0xc3, | ||
433 | @@ -466,7 +473,8 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i | ||
434 | if (2 + msg[j].len > sizeof(obuf)) { | ||
435 | warn("i2c wr: len=%d is too big!\n", | ||
436 | msg[j].len); | ||
437 | - return -EOPNOTSUPP; | ||
438 | + ret = -EOPNOTSUPP; | ||
439 | + goto unlock; | ||
440 | } | ||
441 | |||
442 | obuf[0] = msg[j].addr << 1; | ||
443 | @@ -481,15 +489,18 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i | ||
444 | } | ||
445 | |||
446 | } | ||
447 | + ret = num; | ||
448 | |||
449 | +unlock: | ||
450 | mutex_unlock(&d->i2c_mutex); | ||
451 | - return num; | ||
452 | + return ret; | ||
453 | } | ||
454 | |||
455 | static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
456 | int num) | ||
457 | { | ||
458 | struct dvb_usb_device *d = i2c_get_adapdata(adap); | ||
459 | + int ret; | ||
460 | int i; | ||
461 | |||
462 | if (!d) | ||
463 | @@ -506,7 +517,8 @@ static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
464 | if (2 + msg[1].len > sizeof(ibuf)) { | ||
465 | warn("i2c rd: len=%d is too big!\n", | ||
466 | msg[1].len); | ||
467 | - return -EOPNOTSUPP; | ||
468 | + ret = -EOPNOTSUPP; | ||
469 | + goto unlock; | ||
470 | } | ||
471 | obuf[0] = msg[0].addr << 1; | ||
472 | obuf[1] = msg[0].len; | ||
473 | @@ -530,7 +542,8 @@ static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
474 | if (2 + msg[0].len > sizeof(obuf)) { | ||
475 | warn("i2c wr: len=%d is too big!\n", | ||
476 | msg[0].len); | ||
477 | - return -EOPNOTSUPP; | ||
478 | + ret = -EOPNOTSUPP; | ||
479 | + goto unlock; | ||
480 | } | ||
481 | obuf[0] = msg[0].addr << 1; | ||
482 | obuf[1] = msg[0].len; | ||
483 | @@ -556,9 +569,11 @@ static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
484 | msg[i].flags == 0 ? ">>>" : "<<<"); | ||
485 | debug_dump(msg[i].buf, msg[i].len, deb_xfer); | ||
486 | } | ||
487 | + ret = num; | ||
488 | |||
489 | +unlock: | ||
490 | mutex_unlock(&d->i2c_mutex); | ||
491 | - return num; | ||
492 | + return ret; | ||
493 | } | ||
494 | |||
495 | static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
496 | @@ -566,7 +581,7 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
497 | { | ||
498 | struct dvb_usb_device *d = i2c_get_adapdata(adap); | ||
499 | struct usb_device *udev; | ||
500 | - int len, i, j; | ||
501 | + int len, i, j, ret; | ||
502 | |||
503 | if (!d) | ||
504 | return -ENODEV; | ||
505 | @@ -618,7 +633,8 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
506 | if (msg[j].len > sizeof(ibuf)) { | ||
507 | warn("i2c rd: len=%d is too big!\n", | ||
508 | msg[j].len); | ||
509 | - return -EOPNOTSUPP; | ||
510 | + ret = -EOPNOTSUPP; | ||
511 | + goto unlock; | ||
512 | } | ||
513 | |||
514 | dw210x_op_rw(d->udev, 0x91, 0, 0, | ||
515 | @@ -652,7 +668,8 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
516 | if (2 + msg[j].len > sizeof(obuf)) { | ||
517 | warn("i2c wr: len=%d is too big!\n", | ||
518 | msg[j].len); | ||
519 | - return -EOPNOTSUPP; | ||
520 | + ret = -EOPNOTSUPP; | ||
521 | + goto unlock; | ||
522 | } | ||
523 | |||
524 | obuf[0] = msg[j + 1].len; | ||
525 | @@ -671,7 +688,8 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
526 | if (2 + msg[j].len > sizeof(obuf)) { | ||
527 | warn("i2c wr: len=%d is too big!\n", | ||
528 | msg[j].len); | ||
529 | - return -EOPNOTSUPP; | ||
530 | + ret = -EOPNOTSUPP; | ||
531 | + goto unlock; | ||
532 | } | ||
533 | obuf[0] = msg[j].len + 1; | ||
534 | obuf[1] = (msg[j].addr << 1); | ||
535 | @@ -685,9 +703,11 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
536 | } | ||
537 | } | ||
538 | } | ||
539 | + ret = num; | ||
540 | |||
541 | +unlock: | ||
542 | mutex_unlock(&d->i2c_mutex); | ||
543 | - return num; | ||
544 | + return ret; | ||
545 | } | ||
546 | |||
547 | static int su3000_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
548 | diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c | ||
549 | index d2bea3f07c73..69d3f59f8728 100644 | ||
550 | --- a/drivers/net/ethernet/intel/e100.c | ||
551 | +++ b/drivers/net/ethernet/intel/e100.c | ||
552 | @@ -3039,7 +3039,7 @@ static void __e100_shutdown(struct pci_dev *pdev, bool *enable_wake) | ||
553 | *enable_wake = false; | ||
554 | } | ||
555 | |||
556 | - pci_disable_device(pdev); | ||
557 | + pci_clear_master(pdev); | ||
558 | } | ||
559 | |||
560 | static int __e100_power_off(struct pci_dev *pdev, bool wake) | ||
561 | diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c | ||
562 | index f95de0d16216..1de59b0f8fa8 100644 | ||
563 | --- a/drivers/net/wireless/p54/txrx.c | ||
564 | +++ b/drivers/net/wireless/p54/txrx.c | ||
565 | @@ -587,7 +587,7 @@ static void p54_rx_stats(struct p54_common *priv, struct sk_buff *skb) | ||
566 | chan = priv->curchan; | ||
567 | if (chan) { | ||
568 | struct survey_info *survey = &priv->survey[chan->hw_value]; | ||
569 | - survey->noise = clamp_t(s8, priv->noise, -128, 127); | ||
570 | + survey->noise = clamp(priv->noise, -128, 127); | ||
571 | survey->channel_time = priv->survey_raw.active; | ||
572 | survey->channel_time_tx = priv->survey_raw.tx; | ||
573 | survey->channel_time_busy = priv->survey_raw.tx + | ||
574 | diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c | ||
575 | index c59cc6ed7adb..a86d12326137 100644 | ||
576 | --- a/drivers/regulator/core.c | ||
577 | +++ b/drivers/regulator/core.c | ||
578 | @@ -1712,8 +1712,6 @@ static int _regulator_do_disable(struct regulator_dev *rdev) | ||
579 | |||
580 | trace_regulator_disable_complete(rdev_get_name(rdev)); | ||
581 | |||
582 | - _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, | ||
583 | - NULL); | ||
584 | return 0; | ||
585 | } | ||
586 | |||
587 | @@ -1737,6 +1735,8 @@ static int _regulator_disable(struct regulator_dev *rdev) | ||
588 | rdev_err(rdev, "failed to disable\n"); | ||
589 | return ret; | ||
590 | } | ||
591 | + _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, | ||
592 | + NULL); | ||
593 | } | ||
594 | |||
595 | rdev->use_count = 0; | ||
596 | @@ -1789,20 +1789,16 @@ static int _regulator_force_disable(struct regulator_dev *rdev) | ||
597 | { | ||
598 | int ret = 0; | ||
599 | |||
600 | - /* force disable */ | ||
601 | - if (rdev->desc->ops->disable) { | ||
602 | - /* ah well, who wants to live forever... */ | ||
603 | - ret = rdev->desc->ops->disable(rdev); | ||
604 | - if (ret < 0) { | ||
605 | - rdev_err(rdev, "failed to force disable\n"); | ||
606 | - return ret; | ||
607 | - } | ||
608 | - /* notify other consumers that power has been forced off */ | ||
609 | - _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE | | ||
610 | - REGULATOR_EVENT_DISABLE, NULL); | ||
611 | + ret = _regulator_do_disable(rdev); | ||
612 | + if (ret < 0) { | ||
613 | + rdev_err(rdev, "failed to force disable\n"); | ||
614 | + return ret; | ||
615 | } | ||
616 | |||
617 | - return ret; | ||
618 | + _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE | | ||
619 | + REGULATOR_EVENT_DISABLE, NULL); | ||
620 | + | ||
621 | + return 0; | ||
622 | } | ||
623 | |||
624 | /** | ||
625 | @@ -3788,8 +3784,6 @@ int regulator_suspend_finish(void) | ||
626 | |||
627 | mutex_lock(®ulator_list_mutex); | ||
628 | list_for_each_entry(rdev, ®ulator_list, list) { | ||
629 | - struct regulator_ops *ops = rdev->desc->ops; | ||
630 | - | ||
631 | mutex_lock(&rdev->mutex); | ||
632 | if (rdev->use_count > 0 || rdev->constraints->always_on) { | ||
633 | error = _regulator_do_enable(rdev); | ||
634 | @@ -3798,12 +3792,10 @@ int regulator_suspend_finish(void) | ||
635 | } else { | ||
636 | if (!has_full_constraints) | ||
637 | goto unlock; | ||
638 | - if (!ops->disable) | ||
639 | - goto unlock; | ||
640 | if (!_regulator_is_enabled(rdev)) | ||
641 | goto unlock; | ||
642 | |||
643 | - error = ops->disable(rdev); | ||
644 | + error = _regulator_do_disable(rdev); | ||
645 | if (error) | ||
646 | ret = error; | ||
647 | } | ||
648 | @@ -3993,7 +3985,7 @@ static int __init regulator_init_complete(void) | ||
649 | ops = rdev->desc->ops; | ||
650 | c = rdev->constraints; | ||
651 | |||
652 | - if (!ops->disable || (c && c->always_on)) | ||
653 | + if (c && c->always_on) | ||
654 | continue; | ||
655 | |||
656 | mutex_lock(&rdev->mutex); | ||
657 | @@ -4014,7 +4006,7 @@ static int __init regulator_init_complete(void) | ||
658 | /* We log since this may kill the system if it | ||
659 | * goes wrong. */ | ||
660 | rdev_info(rdev, "disabling\n"); | ||
661 | - ret = ops->disable(rdev); | ||
662 | + ret = _regulator_do_disable(rdev); | ||
663 | if (ret != 0) { | ||
664 | rdev_err(rdev, "couldn't disable: %d\n", ret); | ||
665 | } | ||
666 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c | ||
667 | index 159e3c6d92b9..3581416a24d8 100644 | ||
668 | --- a/drivers/usb/host/xhci-pci.c | ||
669 | +++ b/drivers/usb/host/xhci-pci.c | ||
670 | @@ -113,6 +113,11 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | ||
671 | xhci_dbg(xhci, "QUIRK: Resetting on resume\n"); | ||
672 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; | ||
673 | } | ||
674 | + if (pdev->vendor == PCI_VENDOR_ID_RENESAS && | ||
675 | + pdev->device == 0x0015 && | ||
676 | + pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG && | ||
677 | + pdev->subsystem_device == 0xc0cd) | ||
678 | + xhci->quirks |= XHCI_RESET_ON_RESUME; | ||
679 | if (pdev->vendor == PCI_VENDOR_ID_VIA) | ||
680 | xhci->quirks |= XHCI_RESET_ON_RESUME; | ||
681 | } | ||
682 | diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h | ||
683 | index 8f47625a0661..4fb6a8938957 100644 | ||
684 | --- a/include/linux/ceph/osd_client.h | ||
685 | +++ b/include/linux/ceph/osd_client.h | ||
686 | @@ -138,6 +138,7 @@ struct ceph_osd_request { | ||
687 | __le64 *r_request_pool; | ||
688 | void *r_request_pgid; | ||
689 | __le32 *r_request_attempts; | ||
690 | + bool r_paused; | ||
691 | struct ceph_eversion *r_request_reassert_version; | ||
692 | |||
693 | int r_result; | ||
694 | diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h | ||
695 | index 120d57a1c3a5..b5e36017acd7 100644 | ||
696 | --- a/include/linux/ftrace_event.h | ||
697 | +++ b/include/linux/ftrace_event.h | ||
698 | @@ -325,10 +325,6 @@ enum { | ||
699 | FILTER_TRACE_FN, | ||
700 | }; | ||
701 | |||
702 | -#define EVENT_STORAGE_SIZE 128 | ||
703 | -extern struct mutex event_storage_mutex; | ||
704 | -extern char event_storage[EVENT_STORAGE_SIZE]; | ||
705 | - | ||
706 | extern int trace_event_raw_init(struct ftrace_event_call *call); | ||
707 | extern int trace_define_field(struct ftrace_event_call *call, const char *type, | ||
708 | const char *name, int offset, int size, | ||
709 | diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h | ||
710 | index 66dba42128d7..dbb47418df81 100644 | ||
711 | --- a/include/trace/ftrace.h | ||
712 | +++ b/include/trace/ftrace.h | ||
713 | @@ -299,15 +299,12 @@ static struct trace_event_functions ftrace_event_type_funcs_##call = { \ | ||
714 | #undef __array | ||
715 | #define __array(type, item, len) \ | ||
716 | do { \ | ||
717 | - mutex_lock(&event_storage_mutex); \ | ||
718 | + char *type_str = #type"["__stringify(len)"]"; \ | ||
719 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ | ||
720 | - snprintf(event_storage, sizeof(event_storage), \ | ||
721 | - "%s[%d]", #type, len); \ | ||
722 | - ret = trace_define_field(event_call, event_storage, #item, \ | ||
723 | + ret = trace_define_field(event_call, type_str, #item, \ | ||
724 | offsetof(typeof(field), item), \ | ||
725 | sizeof(field.item), \ | ||
726 | is_signed_type(type), FILTER_OTHER); \ | ||
727 | - mutex_unlock(&event_storage_mutex); \ | ||
728 | if (ret) \ | ||
729 | return ret; \ | ||
730 | } while (0); | ||
731 | diff --git a/kernel/sched/auto_group.c b/kernel/sched/auto_group.c | ||
732 | index 64de5f8b0c9e..4a073539c58e 100644 | ||
733 | --- a/kernel/sched/auto_group.c | ||
734 | +++ b/kernel/sched/auto_group.c | ||
735 | @@ -77,8 +77,6 @@ static inline struct autogroup *autogroup_create(void) | ||
736 | if (IS_ERR(tg)) | ||
737 | goto out_free; | ||
738 | |||
739 | - sched_online_group(tg, &root_task_group); | ||
740 | - | ||
741 | kref_init(&ag->kref); | ||
742 | init_rwsem(&ag->lock); | ||
743 | ag->id = atomic_inc_return(&autogroup_seq_nr); | ||
744 | @@ -98,6 +96,7 @@ static inline struct autogroup *autogroup_create(void) | ||
745 | #endif | ||
746 | tg->autogroup = ag; | ||
747 | |||
748 | + sched_online_group(tg, &root_task_group); | ||
749 | return ag; | ||
750 | |||
751 | out_free: | ||
752 | diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c | ||
753 | index 2f4b185bfc23..001b349af939 100644 | ||
754 | --- a/kernel/trace/trace_events.c | ||
755 | +++ b/kernel/trace/trace_events.c | ||
756 | @@ -27,12 +27,6 @@ | ||
757 | |||
758 | DEFINE_MUTEX(event_mutex); | ||
759 | |||
760 | -DEFINE_MUTEX(event_storage_mutex); | ||
761 | -EXPORT_SYMBOL_GPL(event_storage_mutex); | ||
762 | - | ||
763 | -char event_storage[EVENT_STORAGE_SIZE]; | ||
764 | -EXPORT_SYMBOL_GPL(event_storage); | ||
765 | - | ||
766 | LIST_HEAD(ftrace_events); | ||
767 | static LIST_HEAD(ftrace_common_fields); | ||
768 | |||
769 | diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c | ||
770 | index d21a74670088..d7d0b50b1b70 100644 | ||
771 | --- a/kernel/trace/trace_export.c | ||
772 | +++ b/kernel/trace/trace_export.c | ||
773 | @@ -95,15 +95,12 @@ static void __always_unused ____ftrace_check_##name(void) \ | ||
774 | #undef __array | ||
775 | #define __array(type, item, len) \ | ||
776 | do { \ | ||
777 | + char *type_str = #type"["__stringify(len)"]"; \ | ||
778 | BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ | ||
779 | - mutex_lock(&event_storage_mutex); \ | ||
780 | - snprintf(event_storage, sizeof(event_storage), \ | ||
781 | - "%s[%d]", #type, len); \ | ||
782 | - ret = trace_define_field(event_call, event_storage, #item, \ | ||
783 | + ret = trace_define_field(event_call, type_str, #item, \ | ||
784 | offsetof(typeof(field), item), \ | ||
785 | sizeof(field.item), \ | ||
786 | is_signed_type(type), filter_type); \ | ||
787 | - mutex_unlock(&event_storage_mutex); \ | ||
788 | if (ret) \ | ||
789 | return ret; \ | ||
790 | } while (0); | ||
791 | diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c | ||
792 | index bc0016e3e5ac..3663a305daf7 100644 | ||
793 | --- a/net/ceph/osd_client.c | ||
794 | +++ b/net/ceph/osd_client.c | ||
795 | @@ -1225,6 +1225,22 @@ void ceph_osdc_set_request_linger(struct ceph_osd_client *osdc, | ||
796 | EXPORT_SYMBOL(ceph_osdc_set_request_linger); | ||
797 | |||
798 | /* | ||
799 | + * Returns whether a request should be blocked from being sent | ||
800 | + * based on the current osdmap and osd_client settings. | ||
801 | + * | ||
802 | + * Caller should hold map_sem for read. | ||
803 | + */ | ||
804 | +static bool __req_should_be_paused(struct ceph_osd_client *osdc, | ||
805 | + struct ceph_osd_request *req) | ||
806 | +{ | ||
807 | + bool pauserd = ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_PAUSERD); | ||
808 | + bool pausewr = ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_PAUSEWR) || | ||
809 | + ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL); | ||
810 | + return (req->r_flags & CEPH_OSD_FLAG_READ && pauserd) || | ||
811 | + (req->r_flags & CEPH_OSD_FLAG_WRITE && pausewr); | ||
812 | +} | ||
813 | + | ||
814 | +/* | ||
815 | * Pick an osd (the first 'up' osd in the pg), allocate the osd struct | ||
816 | * (as needed), and set the request r_osd appropriately. If there is | ||
817 | * no up osd, set r_osd to NULL. Move the request to the appropriate list | ||
818 | @@ -1241,6 +1257,7 @@ static int __map_request(struct ceph_osd_client *osdc, | ||
819 | int acting[CEPH_PG_MAX_SIZE]; | ||
820 | int o = -1, num = 0; | ||
821 | int err; | ||
822 | + bool was_paused; | ||
823 | |||
824 | dout("map_request %p tid %lld\n", req, req->r_tid); | ||
825 | err = ceph_calc_ceph_pg(&pgid, req->r_oid, osdc->osdmap, | ||
826 | @@ -1257,12 +1274,18 @@ static int __map_request(struct ceph_osd_client *osdc, | ||
827 | num = err; | ||
828 | } | ||
829 | |||
830 | + was_paused = req->r_paused; | ||
831 | + req->r_paused = __req_should_be_paused(osdc, req); | ||
832 | + if (was_paused && !req->r_paused) | ||
833 | + force_resend = 1; | ||
834 | + | ||
835 | if ((!force_resend && | ||
836 | req->r_osd && req->r_osd->o_osd == o && | ||
837 | req->r_sent >= req->r_osd->o_incarnation && | ||
838 | req->r_num_pg_osds == num && | ||
839 | memcmp(req->r_pg_osds, acting, sizeof(acting[0])*num) == 0) || | ||
840 | - (req->r_osd == NULL && o == -1)) | ||
841 | + (req->r_osd == NULL && o == -1) || | ||
842 | + req->r_paused) | ||
843 | return 0; /* no change */ | ||
844 | |||
845 | dout("map_request tid %llu pgid %lld.%x osd%d (was osd%d)\n", | ||
846 | @@ -1606,14 +1629,17 @@ static void reset_changed_osds(struct ceph_osd_client *osdc) | ||
847 | * | ||
848 | * Caller should hold map_sem for read. | ||
849 | */ | ||
850 | -static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
851 | +static void kick_requests(struct ceph_osd_client *osdc, bool force_resend, | ||
852 | + bool force_resend_writes) | ||
853 | { | ||
854 | struct ceph_osd_request *req, *nreq; | ||
855 | struct rb_node *p; | ||
856 | int needmap = 0; | ||
857 | int err; | ||
858 | + bool force_resend_req; | ||
859 | |||
860 | - dout("kick_requests %s\n", force_resend ? " (force resend)" : ""); | ||
861 | + dout("kick_requests %s %s\n", force_resend ? " (force resend)" : "", | ||
862 | + force_resend_writes ? " (force resend writes)" : ""); | ||
863 | mutex_lock(&osdc->request_mutex); | ||
864 | for (p = rb_first(&osdc->requests); p; ) { | ||
865 | req = rb_entry(p, struct ceph_osd_request, r_node); | ||
866 | @@ -1638,7 +1664,10 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
867 | continue; | ||
868 | } | ||
869 | |||
870 | - err = __map_request(osdc, req, force_resend); | ||
871 | + force_resend_req = force_resend || | ||
872 | + (force_resend_writes && | ||
873 | + req->r_flags & CEPH_OSD_FLAG_WRITE); | ||
874 | + err = __map_request(osdc, req, force_resend_req); | ||
875 | if (err < 0) | ||
876 | continue; /* error */ | ||
877 | if (req->r_osd == NULL) { | ||
878 | @@ -1658,7 +1687,8 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
879 | r_linger_item) { | ||
880 | dout("linger req=%p req->r_osd=%p\n", req, req->r_osd); | ||
881 | |||
882 | - err = __map_request(osdc, req, force_resend); | ||
883 | + err = __map_request(osdc, req, | ||
884 | + force_resend || force_resend_writes); | ||
885 | dout("__map_request returned %d\n", err); | ||
886 | if (err == 0) | ||
887 | continue; /* no change and no osd was specified */ | ||
888 | @@ -1700,6 +1730,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) | ||
889 | struct ceph_osdmap *newmap = NULL, *oldmap; | ||
890 | int err; | ||
891 | struct ceph_fsid fsid; | ||
892 | + bool was_full; | ||
893 | |||
894 | dout("handle_map have %u\n", osdc->osdmap ? osdc->osdmap->epoch : 0); | ||
895 | p = msg->front.iov_base; | ||
896 | @@ -1713,6 +1744,8 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) | ||
897 | |||
898 | down_write(&osdc->map_sem); | ||
899 | |||
900 | + was_full = ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL); | ||
901 | + | ||
902 | /* incremental maps */ | ||
903 | ceph_decode_32_safe(&p, end, nr_maps, bad); | ||
904 | dout(" %d inc maps\n", nr_maps); | ||
905 | @@ -1737,7 +1770,10 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) | ||
906 | ceph_osdmap_destroy(osdc->osdmap); | ||
907 | osdc->osdmap = newmap; | ||
908 | } | ||
909 | - kick_requests(osdc, 0); | ||
910 | + was_full = was_full || | ||
911 | + ceph_osdmap_flag(osdc->osdmap, | ||
912 | + CEPH_OSDMAP_FULL); | ||
913 | + kick_requests(osdc, 0, was_full); | ||
914 | } else { | ||
915 | dout("ignoring incremental map %u len %d\n", | ||
916 | epoch, maplen); | ||
917 | @@ -1780,7 +1816,10 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) | ||
918 | skipped_map = 1; | ||
919 | ceph_osdmap_destroy(oldmap); | ||
920 | } | ||
921 | - kick_requests(osdc, skipped_map); | ||
922 | + was_full = was_full || | ||
923 | + ceph_osdmap_flag(osdc->osdmap, | ||
924 | + CEPH_OSDMAP_FULL); | ||
925 | + kick_requests(osdc, skipped_map, was_full); | ||
926 | } | ||
927 | p += maplen; | ||
928 | nr_maps--; | ||
929 | @@ -1797,7 +1836,9 @@ done: | ||
930 | * we find out when we are no longer full and stop returning | ||
931 | * ENOSPC. | ||
932 | */ | ||
933 | - if (ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL)) | ||
934 | + if (ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL) || | ||
935 | + ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_PAUSERD) || | ||
936 | + ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_PAUSEWR)) | ||
937 | ceph_monc_request_next_osdmap(&osdc->client->monc); | ||
938 | |||
939 | mutex_lock(&osdc->request_mutex); | ||
940 | diff --git a/scripts/package/builddeb b/scripts/package/builddeb | ||
941 | index acb86507828a..3001ec5ae07d 100644 | ||
942 | --- a/scripts/package/builddeb | ||
943 | +++ b/scripts/package/builddeb | ||
944 | @@ -62,7 +62,7 @@ create_package() { | ||
945 | fi | ||
946 | |||
947 | # Create the package | ||
948 | - dpkg-gencontrol -isp $forcearch -p$pname -P"$pdir" | ||
949 | + dpkg-gencontrol -isp $forcearch -Vkernel:debarch="${debarch:-$(dpkg --print-architecture)}" -p$pname -P"$pdir" | ||
950 | dpkg --build "$pdir" .. | ||
951 | } | ||
952 | |||
953 | @@ -252,15 +252,14 @@ mkdir -p "$destdir" | ||
954 | (cd $objtree; tar -c -f - -T "$objtree/debian/hdrobjfiles") | (cd $destdir; tar -xf -) | ||
955 | ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" | ||
956 | rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" | ||
957 | -arch=$(dpkg --print-architecture) | ||
958 | |||
959 | cat <<EOF >> debian/control | ||
960 | |||
961 | Package: $kernel_headers_packagename | ||
962 | Provides: linux-headers, linux-headers-2.6 | ||
963 | -Architecture: $arch | ||
964 | -Description: Linux kernel headers for $KERNELRELEASE on $arch | ||
965 | - This package provides kernel header files for $KERNELRELEASE on $arch | ||
966 | +Architecture: any | ||
967 | +Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} | ||
968 | + This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} | ||
969 | . | ||
970 | This is useful for people who need to build external modules | ||
971 | EOF | ||
972 | diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c | ||
973 | index 19799931c51d..3fdf998ad057 100644 | ||
974 | --- a/sound/core/compress_offload.c | ||
975 | +++ b/sound/core/compress_offload.c | ||
976 | @@ -133,7 +133,7 @@ static int snd_compr_open(struct inode *inode, struct file *f) | ||
977 | kfree(data); | ||
978 | } | ||
979 | snd_card_unref(compr->card); | ||
980 | - return 0; | ||
981 | + return ret; | ||
982 | } | ||
983 | |||
984 | static int snd_compr_free(struct inode *inode, struct file *f) | ||
985 | diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c | ||
986 | index 819c90fe021f..4fdcc1cefc25 100644 | ||
987 | --- a/sound/soc/codecs/max98090.c | ||
988 | +++ b/sound/soc/codecs/max98090.c | ||
989 | @@ -336,6 +336,7 @@ static bool max98090_readable_register(struct device *dev, unsigned int reg) | ||
990 | case M98090_REG_RECORD_TDM_SLOT: | ||
991 | case M98090_REG_SAMPLE_RATE: | ||
992 | case M98090_REG_DMIC34_BIQUAD_BASE ... M98090_REG_DMIC34_BIQUAD_BASE + 0x0E: | ||
993 | + case M98090_REG_REVISION_ID: | ||
994 | return true; | ||
995 | default: | ||
996 | return false; |