1 |
Author: mpagano |
2 |
Date: 2012-07-30 17:05:50 +0000 (Mon, 30 Jul 2012) |
3 |
New Revision: 2180 |
4 |
|
5 |
Added: |
6 |
genpatches-2.6/trunk/3.4/1006_linux-3.4.7.patch |
7 |
Modified: |
8 |
genpatches-2.6/trunk/3.4/0000_README |
9 |
Log: |
10 |
Linux patch 3.4.7 |
11 |
|
12 |
Modified: genpatches-2.6/trunk/3.4/0000_README |
13 |
=================================================================== |
14 |
--- genpatches-2.6/trunk/3.4/0000_README 2012-07-26 18:54:57 UTC (rev 2179) |
15 |
+++ genpatches-2.6/trunk/3.4/0000_README 2012-07-30 17:05:50 UTC (rev 2180) |
16 |
@@ -63,6 +63,10 @@ |
17 |
From: http://www.kernel.org |
18 |
Desc: Linux 3.4.6 |
19 |
|
20 |
+Patch: 1006_linux-3.4.7.patch |
21 |
+From: http://www.kernel.org |
22 |
+Desc: Linux 3.4.7 |
23 |
+ |
24 |
Patch: 1700_correct-bnx2-firware-ver-mips.patch |
25 |
From: https://bugs.gentoo.org/show_bug.cgi?id=424609 |
26 |
Desc: Correct firmware version for bnx2 on mips |
27 |
|
28 |
Added: genpatches-2.6/trunk/3.4/1006_linux-3.4.7.patch |
29 |
=================================================================== |
30 |
--- genpatches-2.6/trunk/3.4/1006_linux-3.4.7.patch (rev 0) |
31 |
+++ genpatches-2.6/trunk/3.4/1006_linux-3.4.7.patch 2012-07-30 17:05:50 UTC (rev 2180) |
32 |
@@ -0,0 +1,802 @@ |
33 |
+diff --git a/Makefile b/Makefile |
34 |
+index 5d0edcb..e17a98c 100644 |
35 |
+--- a/Makefile |
36 |
++++ b/Makefile |
37 |
+@@ -1,6 +1,6 @@ |
38 |
+ VERSION = 3 |
39 |
+ PATCHLEVEL = 4 |
40 |
+-SUBLEVEL = 6 |
41 |
++SUBLEVEL = 7 |
42 |
+ EXTRAVERSION = |
43 |
+ NAME = Saber-toothed Squirrel |
44 |
+ |
45 |
+diff --git a/arch/arm/plat-s5p/clock.c b/arch/arm/plat-s5p/clock.c |
46 |
+index f68a9bb..b042795 100644 |
47 |
+--- a/arch/arm/plat-s5p/clock.c |
48 |
++++ b/arch/arm/plat-s5p/clock.c |
49 |
+@@ -38,6 +38,7 @@ struct clk clk_ext_xtal_mux = { |
50 |
+ struct clk clk_xusbxti = { |
51 |
+ .name = "xusbxti", |
52 |
+ .id = -1, |
53 |
++ .rate = 24000000, |
54 |
+ }; |
55 |
+ |
56 |
+ struct clk s5p_clk_27m = { |
57 |
+diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h |
58 |
+index 0d85d8e..abb13e8 100644 |
59 |
+--- a/arch/mips/include/asm/thread_info.h |
60 |
++++ b/arch/mips/include/asm/thread_info.h |
61 |
+@@ -60,6 +60,8 @@ struct thread_info { |
62 |
+ register struct thread_info *__current_thread_info __asm__("$28"); |
63 |
+ #define current_thread_info() __current_thread_info |
64 |
+ |
65 |
++#endif /* !__ASSEMBLY__ */ |
66 |
++ |
67 |
+ /* thread information allocation */ |
68 |
+ #if defined(CONFIG_PAGE_SIZE_4KB) && defined(CONFIG_32BIT) |
69 |
+ #define THREAD_SIZE_ORDER (1) |
70 |
+@@ -97,8 +99,6 @@ register struct thread_info *__current_thread_info __asm__("$28"); |
71 |
+ |
72 |
+ #define free_thread_info(info) kfree(info) |
73 |
+ |
74 |
+-#endif /* !__ASSEMBLY__ */ |
75 |
+- |
76 |
+ #define PREEMPT_ACTIVE 0x10000000 |
77 |
+ |
78 |
+ /* |
79 |
+diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S |
80 |
+index 924da5e..df243a6 100644 |
81 |
+--- a/arch/mips/kernel/vmlinux.lds.S |
82 |
++++ b/arch/mips/kernel/vmlinux.lds.S |
83 |
+@@ -1,5 +1,6 @@ |
84 |
+ #include <asm/asm-offsets.h> |
85 |
+ #include <asm/page.h> |
86 |
++#include <asm/thread_info.h> |
87 |
+ #include <asm-generic/vmlinux.lds.h> |
88 |
+ |
89 |
+ #undef mips |
90 |
+@@ -72,7 +73,7 @@ SECTIONS |
91 |
+ .data : { /* Data */ |
92 |
+ . = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */ |
93 |
+ |
94 |
+- INIT_TASK_DATA(PAGE_SIZE) |
95 |
++ INIT_TASK_DATA(THREAD_SIZE) |
96 |
+ NOSAVE_DATA |
97 |
+ CACHELINE_ALIGNED_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT) |
98 |
+ READ_MOSTLY_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT) |
99 |
+diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c |
100 |
+index 054677b..973c238 100644 |
101 |
+--- a/drivers/hid/hid-core.c |
102 |
++++ b/drivers/hid/hid-core.c |
103 |
+@@ -1391,6 +1391,7 @@ static const struct hid_device_id hid_have_special_driver[] = { |
104 |
+ { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_T91MT) }, |
105 |
+ { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO) }, |
106 |
+ { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, |
107 |
++ { HID_USB_DEVICE(USB_VENDOR_ID_BAANTO, USB_DEVICE_ID_BAANTO_MT_190W2), }, |
108 |
+ { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) }, |
109 |
+ { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE_2) }, |
110 |
+ { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_PIXCIR_MULTI_TOUCH) }, |
111 |
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h |
112 |
+index dfd4098..bb1abf8 100644 |
113 |
+--- a/drivers/hid/hid-ids.h |
114 |
++++ b/drivers/hid/hid-ids.h |
115 |
+@@ -160,6 +160,9 @@ |
116 |
+ #define USB_VENDOR_ID_AVERMEDIA 0x07ca |
117 |
+ #define USB_DEVICE_ID_AVER_FM_MR800 0xb800 |
118 |
+ |
119 |
++#define USB_VENDOR_ID_BAANTO 0x2453 |
120 |
++#define USB_DEVICE_ID_BAANTO_MT_190W2 0x0100 |
121 |
++ |
122 |
+ #define USB_VENDOR_ID_BELKIN 0x050d |
123 |
+ #define USB_DEVICE_ID_FLIP_KVM 0x3201 |
124 |
+ |
125 |
+@@ -650,6 +653,9 @@ |
126 |
+ #define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001 |
127 |
+ #define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE 0x0600 |
128 |
+ |
129 |
++#define USB_VENDOR_ID_SENNHEISER 0x1395 |
130 |
++#define USB_DEVICE_ID_SENNHEISER_BTD500USB 0x002c |
131 |
++ |
132 |
+ #define USB_VENDOR_ID_SIGMA_MICRO 0x1c4f |
133 |
+ #define USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD 0x0002 |
134 |
+ |
135 |
+diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c |
136 |
+index 002781c..21e473e 100644 |
137 |
+--- a/drivers/hid/hid-input.c |
138 |
++++ b/drivers/hid/hid-input.c |
139 |
+@@ -290,6 +290,9 @@ static const struct hid_device_id hid_battery_quirks[] = { |
140 |
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, |
141 |
+ USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI), |
142 |
+ HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE }, |
143 |
++ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, |
144 |
++ USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), |
145 |
++ HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE }, |
146 |
+ {} |
147 |
+ }; |
148 |
+ |
149 |
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c |
150 |
+index 543896d..a6197f5 100644 |
151 |
+--- a/drivers/hid/hid-multitouch.c |
152 |
++++ b/drivers/hid/hid-multitouch.c |
153 |
+@@ -783,6 +783,10 @@ static const struct hid_device_id mt_devices[] = { |
154 |
+ HID_USB_DEVICE(USB_VENDOR_ID_ATMEL, |
155 |
+ USB_DEVICE_ID_ATMEL_MXT_DIGITIZER) }, |
156 |
+ |
157 |
++ /* Baanto multitouch devices */ |
158 |
++ { .driver_data = MT_CLS_DEFAULT, |
159 |
++ HID_USB_DEVICE(USB_VENDOR_ID_BAANTO, |
160 |
++ USB_DEVICE_ID_BAANTO_MT_190W2) }, |
161 |
+ /* Cando panels */ |
162 |
+ { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTNUMBER, |
163 |
+ HID_USB_DEVICE(USB_VENDOR_ID_CANDO, |
164 |
+diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c |
165 |
+index 782c639..82f61ee 100644 |
166 |
+--- a/drivers/hid/usbhid/hid-quirks.c |
167 |
++++ b/drivers/hid/usbhid/hid-quirks.c |
168 |
+@@ -76,6 +76,7 @@ static const struct hid_blacklist { |
169 |
+ { USB_VENDOR_ID_PRODIGE, USB_DEVICE_ID_PRODIGE_CORDLESS, HID_QUIRK_NOGET }, |
170 |
+ { USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN, HID_QUIRK_NOGET }, |
171 |
+ { USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008, HID_QUIRK_NOGET }, |
172 |
++ { USB_VENDOR_ID_SENNHEISER, USB_DEVICE_ID_SENNHEISER_BTD500USB, HID_QUIRK_NOGET }, |
173 |
+ { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET }, |
174 |
+ { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_1, HID_QUIRK_NOGET }, |
175 |
+ { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_2, HID_QUIRK_NOGET }, |
176 |
+diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c |
177 |
+index d039de8..b58b7a3 100644 |
178 |
+--- a/drivers/md/dm-raid1.c |
179 |
++++ b/drivers/md/dm-raid1.c |
180 |
+@@ -1084,6 +1084,7 @@ static int mirror_ctr(struct dm_target *ti, unsigned int argc, char **argv) |
181 |
+ ti->split_io = dm_rh_get_region_size(ms->rh); |
182 |
+ ti->num_flush_requests = 1; |
183 |
+ ti->num_discard_requests = 1; |
184 |
++ ti->discard_zeroes_data_unsupported = 1; |
185 |
+ |
186 |
+ ms->kmirrord_wq = alloc_workqueue("kmirrord", |
187 |
+ WQ_NON_REENTRANT | WQ_MEM_RECLAIM, 0); |
188 |
+@@ -1214,7 +1215,7 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, |
189 |
+ * We need to dec pending if this was a write. |
190 |
+ */ |
191 |
+ if (rw == WRITE) { |
192 |
+- if (!(bio->bi_rw & REQ_FLUSH)) |
193 |
++ if (!(bio->bi_rw & (REQ_FLUSH | REQ_DISCARD))) |
194 |
+ dm_rh_dec(ms->rh, map_context->ll); |
195 |
+ return error; |
196 |
+ } |
197 |
+diff --git a/drivers/md/dm-region-hash.c b/drivers/md/dm-region-hash.c |
198 |
+index 7771ed2..69732e0 100644 |
199 |
+--- a/drivers/md/dm-region-hash.c |
200 |
++++ b/drivers/md/dm-region-hash.c |
201 |
+@@ -404,6 +404,9 @@ void dm_rh_mark_nosync(struct dm_region_hash *rh, struct bio *bio) |
202 |
+ return; |
203 |
+ } |
204 |
+ |
205 |
++ if (bio->bi_rw & REQ_DISCARD) |
206 |
++ return; |
207 |
++ |
208 |
+ /* We must inform the log that the sync count has changed. */ |
209 |
+ log->type->set_region_sync(log, region, 0); |
210 |
+ |
211 |
+@@ -524,7 +527,7 @@ void dm_rh_inc_pending(struct dm_region_hash *rh, struct bio_list *bios) |
212 |
+ struct bio *bio; |
213 |
+ |
214 |
+ for (bio = bios->head; bio; bio = bio->bi_next) { |
215 |
+- if (bio->bi_rw & REQ_FLUSH) |
216 |
++ if (bio->bi_rw & (REQ_FLUSH | REQ_DISCARD)) |
217 |
+ continue; |
218 |
+ rh_inc(rh, dm_rh_bio_to_region(rh, bio)); |
219 |
+ } |
220 |
+diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c |
221 |
+index eb3d138..e0a0ebe 100644 |
222 |
+--- a/drivers/md/dm-thin.c |
223 |
++++ b/drivers/md/dm-thin.c |
224 |
+@@ -1240,7 +1240,10 @@ static void process_discard(struct thin_c *tc, struct bio *bio) |
225 |
+ |
226 |
+ cell_release_singleton(cell, bio); |
227 |
+ cell_release_singleton(cell2, bio); |
228 |
+- remap_and_issue(tc, bio, lookup_result.block); |
229 |
++ if ((!lookup_result.shared) && pool->pf.discard_passdown) |
230 |
++ remap_and_issue(tc, bio, lookup_result.block); |
231 |
++ else |
232 |
++ bio_endio(bio, 0); |
233 |
+ } |
234 |
+ break; |
235 |
+ |
236 |
+@@ -2575,6 +2578,7 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) |
237 |
+ if (tc->pool->pf.discard_enabled) { |
238 |
+ ti->discards_supported = 1; |
239 |
+ ti->num_discard_requests = 1; |
240 |
++ ti->discard_zeroes_data_unsupported = 1; |
241 |
+ } |
242 |
+ |
243 |
+ dm_put(pool_md); |
244 |
+diff --git a/drivers/md/md.c b/drivers/md/md.c |
245 |
+index 2b30ffd..9ee8ce3 100644 |
246 |
+--- a/drivers/md/md.c |
247 |
++++ b/drivers/md/md.c |
248 |
+@@ -3744,8 +3744,8 @@ array_state_show(struct mddev *mddev, char *page) |
249 |
+ return sprintf(page, "%s\n", array_states[st]); |
250 |
+ } |
251 |
+ |
252 |
+-static int do_md_stop(struct mddev * mddev, int ro, int is_open); |
253 |
+-static int md_set_readonly(struct mddev * mddev, int is_open); |
254 |
++static int do_md_stop(struct mddev * mddev, int ro, struct block_device *bdev); |
255 |
++static int md_set_readonly(struct mddev * mddev, struct block_device *bdev); |
256 |
+ static int do_md_run(struct mddev * mddev); |
257 |
+ static int restart_array(struct mddev *mddev); |
258 |
+ |
259 |
+@@ -3761,14 +3761,14 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len) |
260 |
+ /* stopping an active array */ |
261 |
+ if (atomic_read(&mddev->openers) > 0) |
262 |
+ return -EBUSY; |
263 |
+- err = do_md_stop(mddev, 0, 0); |
264 |
++ err = do_md_stop(mddev, 0, NULL); |
265 |
+ break; |
266 |
+ case inactive: |
267 |
+ /* stopping an active array */ |
268 |
+ if (mddev->pers) { |
269 |
+ if (atomic_read(&mddev->openers) > 0) |
270 |
+ return -EBUSY; |
271 |
+- err = do_md_stop(mddev, 2, 0); |
272 |
++ err = do_md_stop(mddev, 2, NULL); |
273 |
+ } else |
274 |
+ err = 0; /* already inactive */ |
275 |
+ break; |
276 |
+@@ -3776,7 +3776,7 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len) |
277 |
+ break; /* not supported yet */ |
278 |
+ case readonly: |
279 |
+ if (mddev->pers) |
280 |
+- err = md_set_readonly(mddev, 0); |
281 |
++ err = md_set_readonly(mddev, NULL); |
282 |
+ else { |
283 |
+ mddev->ro = 1; |
284 |
+ set_disk_ro(mddev->gendisk, 1); |
285 |
+@@ -3786,7 +3786,7 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len) |
286 |
+ case read_auto: |
287 |
+ if (mddev->pers) { |
288 |
+ if (mddev->ro == 0) |
289 |
+- err = md_set_readonly(mddev, 0); |
290 |
++ err = md_set_readonly(mddev, NULL); |
291 |
+ else if (mddev->ro == 1) |
292 |
+ err = restart_array(mddev); |
293 |
+ if (err == 0) { |
294 |
+@@ -5124,15 +5124,17 @@ void md_stop(struct mddev *mddev) |
295 |
+ } |
296 |
+ EXPORT_SYMBOL_GPL(md_stop); |
297 |
+ |
298 |
+-static int md_set_readonly(struct mddev *mddev, int is_open) |
299 |
++static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) |
300 |
+ { |
301 |
+ int err = 0; |
302 |
+ mutex_lock(&mddev->open_mutex); |
303 |
+- if (atomic_read(&mddev->openers) > is_open) { |
304 |
++ if (atomic_read(&mddev->openers) > !!bdev) { |
305 |
+ printk("md: %s still in use.\n",mdname(mddev)); |
306 |
+ err = -EBUSY; |
307 |
+ goto out; |
308 |
+ } |
309 |
++ if (bdev) |
310 |
++ sync_blockdev(bdev); |
311 |
+ if (mddev->pers) { |
312 |
+ __md_stop_writes(mddev); |
313 |
+ |
314 |
+@@ -5154,18 +5156,26 @@ out: |
315 |
+ * 0 - completely stop and dis-assemble array |
316 |
+ * 2 - stop but do not disassemble array |
317 |
+ */ |
318 |
+-static int do_md_stop(struct mddev * mddev, int mode, int is_open) |
319 |
++static int do_md_stop(struct mddev * mddev, int mode, |
320 |
++ struct block_device *bdev) |
321 |
+ { |
322 |
+ struct gendisk *disk = mddev->gendisk; |
323 |
+ struct md_rdev *rdev; |
324 |
+ |
325 |
+ mutex_lock(&mddev->open_mutex); |
326 |
+- if (atomic_read(&mddev->openers) > is_open || |
327 |
++ if (atomic_read(&mddev->openers) > !!bdev || |
328 |
+ mddev->sysfs_active) { |
329 |
+ printk("md: %s still in use.\n",mdname(mddev)); |
330 |
+ mutex_unlock(&mddev->open_mutex); |
331 |
+ return -EBUSY; |
332 |
+ } |
333 |
++ if (bdev) |
334 |
++ /* It is possible IO was issued on some other |
335 |
++ * open file which was closed before we took ->open_mutex. |
336 |
++ * As that was not the last close __blkdev_put will not |
337 |
++ * have called sync_blockdev, so we must. |
338 |
++ */ |
339 |
++ sync_blockdev(bdev); |
340 |
+ |
341 |
+ if (mddev->pers) { |
342 |
+ if (mddev->ro) |
343 |
+@@ -5239,7 +5249,7 @@ static void autorun_array(struct mddev *mddev) |
344 |
+ err = do_md_run(mddev); |
345 |
+ if (err) { |
346 |
+ printk(KERN_WARNING "md: do_md_run() returned %d\n", err); |
347 |
+- do_md_stop(mddev, 0, 0); |
348 |
++ do_md_stop(mddev, 0, NULL); |
349 |
+ } |
350 |
+ } |
351 |
+ |
352 |
+@@ -6237,11 +6247,11 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, |
353 |
+ goto done_unlock; |
354 |
+ |
355 |
+ case STOP_ARRAY: |
356 |
+- err = do_md_stop(mddev, 0, 1); |
357 |
++ err = do_md_stop(mddev, 0, bdev); |
358 |
+ goto done_unlock; |
359 |
+ |
360 |
+ case STOP_ARRAY_RO: |
361 |
+- err = md_set_readonly(mddev, 1); |
362 |
++ err = md_set_readonly(mddev, bdev); |
363 |
+ goto done_unlock; |
364 |
+ |
365 |
+ case BLKROSET: |
366 |
+diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c |
367 |
+index d1f74ab..d7add9d 100644 |
368 |
+--- a/drivers/md/raid1.c |
369 |
++++ b/drivers/md/raid1.c |
370 |
+@@ -1821,8 +1821,14 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio) |
371 |
+ |
372 |
+ if (atomic_dec_and_test(&r1_bio->remaining)) { |
373 |
+ /* if we're here, all write(s) have completed, so clean up */ |
374 |
+- md_done_sync(mddev, r1_bio->sectors, 1); |
375 |
+- put_buf(r1_bio); |
376 |
++ int s = r1_bio->sectors; |
377 |
++ if (test_bit(R1BIO_MadeGood, &r1_bio->state) || |
378 |
++ test_bit(R1BIO_WriteError, &r1_bio->state)) |
379 |
++ reschedule_retry(r1_bio); |
380 |
++ else { |
381 |
++ put_buf(r1_bio); |
382 |
++ md_done_sync(mddev, s, 1); |
383 |
++ } |
384 |
+ } |
385 |
+ } |
386 |
+ |
387 |
+diff --git a/drivers/target/target_core_cdb.c b/drivers/target/target_core_cdb.c |
388 |
+index 30a6770..fa323f8 100644 |
389 |
+--- a/drivers/target/target_core_cdb.c |
390 |
++++ b/drivers/target/target_core_cdb.c |
391 |
+@@ -1107,7 +1107,7 @@ int target_emulate_write_same(struct se_task *task) |
392 |
+ if (num_blocks != 0) |
393 |
+ range = num_blocks; |
394 |
+ else |
395 |
+- range = (dev->transport->get_blocks(dev) - lba); |
396 |
++ range = (dev->transport->get_blocks(dev) - lba) + 1; |
397 |
+ |
398 |
+ pr_debug("WRITE_SAME UNMAP: LBA: %llu Range: %llu\n", |
399 |
+ (unsigned long long)lba, (unsigned long long)range); |
400 |
+diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c |
401 |
+index c3148b1..89d10e6 100644 |
402 |
+--- a/drivers/target/target_core_pr.c |
403 |
++++ b/drivers/target/target_core_pr.c |
404 |
+@@ -2038,7 +2038,7 @@ static int __core_scsi3_write_aptpl_to_file( |
405 |
+ if (IS_ERR(file) || !file || !file->f_dentry) { |
406 |
+ pr_err("filp_open(%s) for APTPL metadata" |
407 |
+ " failed\n", path); |
408 |
+- return (PTR_ERR(file) < 0 ? PTR_ERR(file) : -ENOENT); |
409 |
++ return IS_ERR(file) ? PTR_ERR(file) : -ENOENT; |
410 |
+ } |
411 |
+ |
412 |
+ iov[0].iov_base = &buf[0]; |
413 |
+@@ -3826,7 +3826,7 @@ int target_scsi3_emulate_pr_out(struct se_task *task) |
414 |
+ " SPC-2 reservation is held, returning" |
415 |
+ " RESERVATION_CONFLICT\n"); |
416 |
+ cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; |
417 |
+- ret = EINVAL; |
418 |
++ ret = -EINVAL; |
419 |
+ goto out; |
420 |
+ } |
421 |
+ |
422 |
+@@ -3836,7 +3836,8 @@ int target_scsi3_emulate_pr_out(struct se_task *task) |
423 |
+ */ |
424 |
+ if (!cmd->se_sess) { |
425 |
+ cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; |
426 |
+- return -EINVAL; |
427 |
++ ret = -EINVAL; |
428 |
++ goto out; |
429 |
+ } |
430 |
+ |
431 |
+ if (cmd->data_length < 24) { |
432 |
+diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c |
433 |
+index a375f25..da90f64 100644 |
434 |
+--- a/drivers/target/tcm_fc/tfc_cmd.c |
435 |
++++ b/drivers/target/tcm_fc/tfc_cmd.c |
436 |
+@@ -240,6 +240,8 @@ u32 ft_get_task_tag(struct se_cmd *se_cmd) |
437 |
+ { |
438 |
+ struct ft_cmd *cmd = container_of(se_cmd, struct ft_cmd, se_cmd); |
439 |
+ |
440 |
++ if (cmd->aborted) |
441 |
++ return ~0; |
442 |
+ return fc_seq_exch(cmd->seq)->rxid; |
443 |
+ } |
444 |
+ |
445 |
+diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c |
446 |
+index 6b79efd..3a75ee5 100644 |
447 |
+--- a/fs/cifs/cifssmb.c |
448 |
++++ b/fs/cifs/cifssmb.c |
449 |
+@@ -89,6 +89,32 @@ static struct { |
450 |
+ /* Forward declarations */ |
451 |
+ static void cifs_readv_complete(struct work_struct *work); |
452 |
+ |
453 |
++#ifdef CONFIG_HIGHMEM |
454 |
++/* |
455 |
++ * On arches that have high memory, kmap address space is limited. By |
456 |
++ * serializing the kmap operations on those arches, we ensure that we don't |
457 |
++ * end up with a bunch of threads in writeback with partially mapped page |
458 |
++ * arrays, stuck waiting for kmap to come back. That situation prevents |
459 |
++ * progress and can deadlock. |
460 |
++ */ |
461 |
++static DEFINE_MUTEX(cifs_kmap_mutex); |
462 |
++ |
463 |
++static inline void |
464 |
++cifs_kmap_lock(void) |
465 |
++{ |
466 |
++ mutex_lock(&cifs_kmap_mutex); |
467 |
++} |
468 |
++ |
469 |
++static inline void |
470 |
++cifs_kmap_unlock(void) |
471 |
++{ |
472 |
++ mutex_unlock(&cifs_kmap_mutex); |
473 |
++} |
474 |
++#else /* !CONFIG_HIGHMEM */ |
475 |
++#define cifs_kmap_lock() do { ; } while(0) |
476 |
++#define cifs_kmap_unlock() do { ; } while(0) |
477 |
++#endif /* CONFIG_HIGHMEM */ |
478 |
++ |
479 |
+ /* Mark as invalid, all open files on tree connections since they |
480 |
+ were closed when session to server was lost */ |
481 |
+ static void mark_open_files_invalid(struct cifs_tcon *pTcon) |
482 |
+@@ -1557,6 +1583,7 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid) |
483 |
+ eof_index = eof ? (eof - 1) >> PAGE_CACHE_SHIFT : 0; |
484 |
+ cFYI(1, "eof=%llu eof_index=%lu", eof, eof_index); |
485 |
+ |
486 |
++ cifs_kmap_lock(); |
487 |
+ list_for_each_entry_safe(page, tpage, &rdata->pages, lru) { |
488 |
+ if (remaining >= PAGE_CACHE_SIZE) { |
489 |
+ /* enough data to fill the page */ |
490 |
+@@ -1606,6 +1633,7 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid) |
491 |
+ page_cache_release(page); |
492 |
+ } |
493 |
+ } |
494 |
++ cifs_kmap_unlock(); |
495 |
+ |
496 |
+ /* issue the read if we have any iovecs left to fill */ |
497 |
+ if (rdata->nr_iov > 1) { |
498 |
+@@ -2194,7 +2222,9 @@ cifs_async_writev(struct cifs_writedata *wdata) |
499 |
+ * and set the iov_len properly for each one. It may also set |
500 |
+ * wdata->bytes too. |
501 |
+ */ |
502 |
++ cifs_kmap_lock(); |
503 |
+ wdata->marshal_iov(iov, wdata); |
504 |
++ cifs_kmap_unlock(); |
505 |
+ |
506 |
+ cFYI(1, "async write at %llu %u bytes", wdata->offset, wdata->bytes); |
507 |
+ |
508 |
+diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c |
509 |
+index 402fa0f..87ce8af 100644 |
510 |
+--- a/fs/cifs/connect.c |
511 |
++++ b/fs/cifs/connect.c |
512 |
+@@ -3348,6 +3348,18 @@ void cifs_setup_cifs_sb(struct smb_vol *pvolume_info, |
513 |
+ #define CIFS_DEFAULT_NON_POSIX_RSIZE (60 * 1024) |
514 |
+ #define CIFS_DEFAULT_NON_POSIX_WSIZE (65536) |
515 |
+ |
516 |
++/* |
517 |
++ * On hosts with high memory, we can't currently support wsize/rsize that are |
518 |
++ * larger than we can kmap at once. Cap the rsize/wsize at |
519 |
++ * LAST_PKMAP * PAGE_SIZE. We'll never be able to fill a read or write request |
520 |
++ * larger than that anyway. |
521 |
++ */ |
522 |
++#ifdef CONFIG_HIGHMEM |
523 |
++#define CIFS_KMAP_SIZE_LIMIT (LAST_PKMAP * PAGE_CACHE_SIZE) |
524 |
++#else /* CONFIG_HIGHMEM */ |
525 |
++#define CIFS_KMAP_SIZE_LIMIT (1<<24) |
526 |
++#endif /* CONFIG_HIGHMEM */ |
527 |
++ |
528 |
+ static unsigned int |
529 |
+ cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info) |
530 |
+ { |
531 |
+@@ -3378,6 +3390,9 @@ cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info) |
532 |
+ wsize = min_t(unsigned int, wsize, |
533 |
+ server->maxBuf - sizeof(WRITE_REQ) + 4); |
534 |
+ |
535 |
++ /* limit to the amount that we can kmap at once */ |
536 |
++ wsize = min_t(unsigned int, wsize, CIFS_KMAP_SIZE_LIMIT); |
537 |
++ |
538 |
+ /* hard limit of CIFS_MAX_WSIZE */ |
539 |
+ wsize = min_t(unsigned int, wsize, CIFS_MAX_WSIZE); |
540 |
+ |
541 |
+@@ -3419,6 +3434,9 @@ cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *pvolume_info) |
542 |
+ if (!(server->capabilities & CAP_LARGE_READ_X)) |
543 |
+ rsize = min_t(unsigned int, CIFSMaxBufSize, rsize); |
544 |
+ |
545 |
++ /* limit to the amount that we can kmap at once */ |
546 |
++ rsize = min_t(unsigned int, rsize, CIFS_KMAP_SIZE_LIMIT); |
547 |
++ |
548 |
+ /* hard limit of CIFS_MAX_RSIZE */ |
549 |
+ rsize = min_t(unsigned int, rsize, CIFS_MAX_RSIZE); |
550 |
+ |
551 |
+diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c |
552 |
+index 0a8224d..a4217f0 100644 |
553 |
+--- a/fs/cifs/readdir.c |
554 |
++++ b/fs/cifs/readdir.c |
555 |
+@@ -86,9 +86,12 @@ cifs_readdir_lookup(struct dentry *parent, struct qstr *name, |
556 |
+ |
557 |
+ dentry = d_lookup(parent, name); |
558 |
+ if (dentry) { |
559 |
+- /* FIXME: check for inode number changes? */ |
560 |
+- if (dentry->d_inode != NULL) |
561 |
++ inode = dentry->d_inode; |
562 |
++ /* update inode in place if i_ino didn't change */ |
563 |
++ if (inode && CIFS_I(inode)->uniqueid == fattr->cf_uniqueid) { |
564 |
++ cifs_fattr_to_inode(inode, fattr); |
565 |
+ return dentry; |
566 |
++ } |
567 |
+ d_drop(dentry); |
568 |
+ dput(dentry); |
569 |
+ } |
570 |
+diff --git a/fs/exofs/ore.c b/fs/exofs/ore.c |
571 |
+index 49cf230..24a49d4 100644 |
572 |
+--- a/fs/exofs/ore.c |
573 |
++++ b/fs/exofs/ore.c |
574 |
+@@ -735,13 +735,7 @@ static int _prepare_for_striping(struct ore_io_state *ios) |
575 |
+ out: |
576 |
+ ios->numdevs = devs_in_group; |
577 |
+ ios->pages_consumed = cur_pg; |
578 |
+- if (unlikely(ret)) { |
579 |
+- if (length == ios->length) |
580 |
+- return ret; |
581 |
+- else |
582 |
+- ios->length -= length; |
583 |
+- } |
584 |
+- return 0; |
585 |
++ return ret; |
586 |
+ } |
587 |
+ |
588 |
+ int ore_create(struct ore_io_state *ios) |
589 |
+diff --git a/fs/exofs/ore_raid.c b/fs/exofs/ore_raid.c |
590 |
+index d222c77..fff2070 100644 |
591 |
+--- a/fs/exofs/ore_raid.c |
592 |
++++ b/fs/exofs/ore_raid.c |
593 |
+@@ -461,16 +461,12 @@ static void _mark_read4write_pages_uptodate(struct ore_io_state *ios, int ret) |
594 |
+ * ios->sp2d[p][*], xor is calculated the same way. These pages are |
595 |
+ * allocated/freed and don't go through cache |
596 |
+ */ |
597 |
+-static int _read_4_write(struct ore_io_state *ios) |
598 |
++static int _read_4_write_first_stripe(struct ore_io_state *ios) |
599 |
+ { |
600 |
+- struct ore_io_state *ios_read; |
601 |
+ struct ore_striping_info read_si; |
602 |
+ struct __stripe_pages_2d *sp2d = ios->sp2d; |
603 |
+ u64 offset = ios->si.first_stripe_start; |
604 |
+- u64 last_stripe_end; |
605 |
+- unsigned bytes_in_stripe = ios->si.bytes_in_stripe; |
606 |
+- unsigned i, c, p, min_p = sp2d->pages_in_unit, max_p = -1; |
607 |
+- int ret; |
608 |
++ unsigned c, p, min_p = sp2d->pages_in_unit, max_p = -1; |
609 |
+ |
610 |
+ if (offset == ios->offset) /* Go to start collect $200 */ |
611 |
+ goto read_last_stripe; |
612 |
+@@ -478,6 +474,9 @@ static int _read_4_write(struct ore_io_state *ios) |
613 |
+ min_p = _sp2d_min_pg(sp2d); |
614 |
+ max_p = _sp2d_max_pg(sp2d); |
615 |
+ |
616 |
++ ORE_DBGMSG("stripe_start=0x%llx ios->offset=0x%llx min_p=%d max_p=%d\n", |
617 |
++ offset, ios->offset, min_p, max_p); |
618 |
++ |
619 |
+ for (c = 0; ; c++) { |
620 |
+ ore_calc_stripe_info(ios->layout, offset, 0, &read_si); |
621 |
+ read_si.obj_offset += min_p * PAGE_SIZE; |
622 |
+@@ -512,6 +511,18 @@ static int _read_4_write(struct ore_io_state *ios) |
623 |
+ } |
624 |
+ |
625 |
+ read_last_stripe: |
626 |
++ return 0; |
627 |
++} |
628 |
++ |
629 |
++static int _read_4_write_last_stripe(struct ore_io_state *ios) |
630 |
++{ |
631 |
++ struct ore_striping_info read_si; |
632 |
++ struct __stripe_pages_2d *sp2d = ios->sp2d; |
633 |
++ u64 offset; |
634 |
++ u64 last_stripe_end; |
635 |
++ unsigned bytes_in_stripe = ios->si.bytes_in_stripe; |
636 |
++ unsigned c, p, min_p = sp2d->pages_in_unit, max_p = -1; |
637 |
++ |
638 |
+ offset = ios->offset + ios->length; |
639 |
+ if (offset % PAGE_SIZE) |
640 |
+ _add_to_r4w_last_page(ios, &offset); |
641 |
+@@ -527,15 +538,15 @@ read_last_stripe: |
642 |
+ c = _dev_order(ios->layout->group_width * ios->layout->mirrors_p1, |
643 |
+ ios->layout->mirrors_p1, read_si.par_dev, read_si.dev); |
644 |
+ |
645 |
+- BUG_ON(ios->si.first_stripe_start + bytes_in_stripe != last_stripe_end); |
646 |
+- /* unaligned IO must be within a single stripe */ |
647 |
+- |
648 |
+ if (min_p == sp2d->pages_in_unit) { |
649 |
+ /* Didn't do it yet */ |
650 |
+ min_p = _sp2d_min_pg(sp2d); |
651 |
+ max_p = _sp2d_max_pg(sp2d); |
652 |
+ } |
653 |
+ |
654 |
++ ORE_DBGMSG("offset=0x%llx stripe_end=0x%llx min_p=%d max_p=%d\n", |
655 |
++ offset, last_stripe_end, min_p, max_p); |
656 |
++ |
657 |
+ while (offset < last_stripe_end) { |
658 |
+ struct __1_page_stripe *_1ps = &sp2d->_1p_stripes[p]; |
659 |
+ |
660 |
+@@ -568,6 +579,15 @@ read_last_stripe: |
661 |
+ } |
662 |
+ |
663 |
+ read_it: |
664 |
++ return 0; |
665 |
++} |
666 |
++ |
667 |
++static int _read_4_write_execute(struct ore_io_state *ios) |
668 |
++{ |
669 |
++ struct ore_io_state *ios_read; |
670 |
++ unsigned i; |
671 |
++ int ret; |
672 |
++ |
673 |
+ ios_read = ios->ios_read_4_write; |
674 |
+ if (!ios_read) |
675 |
+ return 0; |
676 |
+@@ -591,6 +611,8 @@ read_it: |
677 |
+ } |
678 |
+ |
679 |
+ _mark_read4write_pages_uptodate(ios_read, ret); |
680 |
++ ore_put_io_state(ios_read); |
681 |
++ ios->ios_read_4_write = NULL; /* Might need a reuse at last stripe */ |
682 |
+ return 0; |
683 |
+ } |
684 |
+ |
685 |
+@@ -626,8 +648,11 @@ int _ore_add_parity_unit(struct ore_io_state *ios, |
686 |
+ /* If first stripe, Read in all read4write pages |
687 |
+ * (if needed) before we calculate the first parity. |
688 |
+ */ |
689 |
+- _read_4_write(ios); |
690 |
++ _read_4_write_first_stripe(ios); |
691 |
+ } |
692 |
++ if (!cur_len) /* If last stripe r4w pages of last stripe */ |
693 |
++ _read_4_write_last_stripe(ios); |
694 |
++ _read_4_write_execute(ios); |
695 |
+ |
696 |
+ for (i = 0; i < num_pages; i++) { |
697 |
+ pages[i] = _raid_page_alloc(); |
698 |
+@@ -654,34 +679,14 @@ int _ore_add_parity_unit(struct ore_io_state *ios, |
699 |
+ |
700 |
+ int _ore_post_alloc_raid_stuff(struct ore_io_state *ios) |
701 |
+ { |
702 |
+- struct ore_layout *layout = ios->layout; |
703 |
+- |
704 |
+ if (ios->parity_pages) { |
705 |
++ struct ore_layout *layout = ios->layout; |
706 |
+ unsigned pages_in_unit = layout->stripe_unit / PAGE_SIZE; |
707 |
+- unsigned stripe_size = ios->si.bytes_in_stripe; |
708 |
+- u64 last_stripe, first_stripe; |
709 |
+ |
710 |
+ if (_sp2d_alloc(pages_in_unit, layout->group_width, |
711 |
+ layout->parity, &ios->sp2d)) { |
712 |
+ return -ENOMEM; |
713 |
+ } |
714 |
+- |
715 |
+- /* Round io down to last full strip */ |
716 |
+- first_stripe = div_u64(ios->offset, stripe_size); |
717 |
+- last_stripe = div_u64(ios->offset + ios->length, stripe_size); |
718 |
+- |
719 |
+- /* If an IO spans more then a single stripe it must end at |
720 |
+- * a stripe boundary. The reminder at the end is pushed into the |
721 |
+- * next IO. |
722 |
+- */ |
723 |
+- if (last_stripe != first_stripe) { |
724 |
+- ios->length = last_stripe * stripe_size - ios->offset; |
725 |
+- |
726 |
+- BUG_ON(!ios->length); |
727 |
+- ios->nr_pages = (ios->length + PAGE_SIZE - 1) / |
728 |
+- PAGE_SIZE; |
729 |
+- ios->si.length = ios->length; /*make it consistent */ |
730 |
+- } |
731 |
+ } |
732 |
+ return 0; |
733 |
+ } |
734 |
+diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c |
735 |
+index 1365903..9727522 100644 |
736 |
+--- a/fs/ext4/ioctl.c |
737 |
++++ b/fs/ext4/ioctl.c |
738 |
+@@ -261,7 +261,6 @@ group_extend_out: |
739 |
+ err = ext4_move_extents(filp, donor_filp, me.orig_start, |
740 |
+ me.donor_start, me.len, &me.moved_len); |
741 |
+ mnt_drop_write_file(filp); |
742 |
+- mnt_drop_write(filp->f_path.mnt); |
743 |
+ |
744 |
+ if (copy_to_user((struct move_extent __user *)arg, |
745 |
+ &me, sizeof(me))) |
746 |
+diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c |
747 |
+index 4bff4a3..42ac1bf 100644 |
748 |
+--- a/fs/nfs/objlayout/objio_osd.c |
749 |
++++ b/fs/nfs/objlayout/objio_osd.c |
750 |
+@@ -453,7 +453,10 @@ int objio_read_pagelist(struct nfs_read_data *rdata) |
751 |
+ objios->ios->done = _read_done; |
752 |
+ dprintk("%s: offset=0x%llx length=0x%x\n", __func__, |
753 |
+ rdata->args.offset, rdata->args.count); |
754 |
+- return ore_read(objios->ios); |
755 |
++ ret = ore_read(objios->ios); |
756 |
++ if (unlikely(ret)) |
757 |
++ objio_free_result(&objios->oir); |
758 |
++ return ret; |
759 |
+ } |
760 |
+ |
761 |
+ /* |
762 |
+@@ -537,8 +540,10 @@ int objio_write_pagelist(struct nfs_write_data *wdata, int how) |
763 |
+ dprintk("%s: offset=0x%llx length=0x%x\n", __func__, |
764 |
+ wdata->args.offset, wdata->args.count); |
765 |
+ ret = ore_write(objios->ios); |
766 |
+- if (unlikely(ret)) |
767 |
++ if (unlikely(ret)) { |
768 |
++ objio_free_result(&objios->oir); |
769 |
+ return ret; |
770 |
++ } |
771 |
+ |
772 |
+ if (objios->sync) |
773 |
+ _write_done(objios->ios, objios); |
774 |
+diff --git a/fs/ubifs/sb.c b/fs/ubifs/sb.c |
775 |
+index 771f7fb..a7be8e2 100644 |
776 |
+--- a/fs/ubifs/sb.c |
777 |
++++ b/fs/ubifs/sb.c |
778 |
+@@ -724,8 +724,12 @@ static int fixup_free_space(struct ubifs_info *c) |
779 |
+ lnum = ubifs_next_log_lnum(c, lnum); |
780 |
+ } |
781 |
+ |
782 |
+- /* Fixup the current log head */ |
783 |
+- err = fixup_leb(c, c->lhead_lnum, c->lhead_offs); |
784 |
++ /* |
785 |
++ * Fixup the log head which contains the only a CS node at the |
786 |
++ * beginning. |
787 |
++ */ |
788 |
++ err = fixup_leb(c, c->lhead_lnum, |
789 |
++ ALIGN(UBIFS_CS_NODE_SZ, c->min_io_size)); |
790 |
+ if (err) |
791 |
+ goto out; |
792 |
+ |
793 |
+diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c |
794 |
+index e8c8671..8b70710 100644 |
795 |
+--- a/kernel/time/ntp.c |
796 |
++++ b/kernel/time/ntp.c |
797 |
+@@ -409,7 +409,9 @@ int second_overflow(unsigned long secs) |
798 |
+ time_state = TIME_DEL; |
799 |
+ break; |
800 |
+ case TIME_INS: |
801 |
+- if (secs % 86400 == 0) { |
802 |
++ if (!(time_status & STA_INS)) |
803 |
++ time_state = TIME_OK; |
804 |
++ else if (secs % 86400 == 0) { |
805 |
+ leap = -1; |
806 |
+ time_state = TIME_OOP; |
807 |
+ time_tai++; |
808 |
+@@ -418,7 +420,9 @@ int second_overflow(unsigned long secs) |
809 |
+ } |
810 |
+ break; |
811 |
+ case TIME_DEL: |
812 |
+- if ((secs + 1) % 86400 == 0) { |
813 |
++ if (!(time_status & STA_DEL)) |
814 |
++ time_state = TIME_OK; |
815 |
++ else if ((secs + 1) % 86400 == 0) { |
816 |
+ leap = 1; |
817 |
+ time_tai--; |
818 |
+ time_state = TIME_WAIT; |
819 |
+diff --git a/mm/vmscan.c b/mm/vmscan.c |
820 |
+index 4607cc6..be5bc0a 100644 |
821 |
+--- a/mm/vmscan.c |
822 |
++++ b/mm/vmscan.c |
823 |
+@@ -3013,7 +3013,10 @@ static void kswapd_try_to_sleep(pg_data_t *pgdat, int order, int classzone_idx) |
824 |
+ * them before going back to sleep. |
825 |
+ */ |
826 |
+ set_pgdat_percpu_threshold(pgdat, calculate_normal_threshold); |
827 |
+- schedule(); |
828 |
++ |
829 |
++ if (!kthread_should_stop()) |
830 |
++ schedule(); |
831 |
++ |
832 |
+ set_pgdat_percpu_threshold(pgdat, calculate_pressure_threshold); |
833 |
+ } else { |
834 |
+ if (remaining) |