diff options
| -rw-r--r-- | kernel/workqueue.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 0225fea89340..77dabbf64b8f 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
| @@ -229,6 +229,16 @@ static inline void set_wq_data(struct work_struct *work, | |||
| 229 | atomic_long_set(&work->data, new); | 229 | atomic_long_set(&work->data, new); |
| 230 | } | 230 | } |
| 231 | 231 | ||
| 232 | /* | ||
| 233 | * Clear WORK_STRUCT_PENDING and the workqueue on which it was queued. | ||
| 234 | */ | ||
| 235 | static inline void clear_wq_data(struct work_struct *work) | ||
| 236 | { | ||
| 237 | unsigned long flags = *work_data_bits(work) & | ||
| 238 | (1UL << WORK_STRUCT_STATIC); | ||
| 239 | atomic_long_set(&work->data, flags); | ||
| 240 | } | ||
| 241 | |||
| 232 | static inline | 242 | static inline |
| 233 | struct cpu_workqueue_struct *get_wq_data(struct work_struct *work) | 243 | struct cpu_workqueue_struct *get_wq_data(struct work_struct *work) |
| 234 | { | 244 | { |
| @@ -671,7 +681,7 @@ static int __cancel_work_timer(struct work_struct *work, | |||
| 671 | wait_on_work(work); | 681 | wait_on_work(work); |
| 672 | } while (unlikely(ret < 0)); | 682 | } while (unlikely(ret < 0)); |
| 673 | 683 | ||
| 674 | work_clear_pending(work); | 684 | clear_wq_data(work); |
| 675 | return ret; | 685 | return ret; |
| 676 | } | 686 | } |
| 677 | 687 | ||
