Re: general protection fault in __queue_work (2)

From: Jens Axboe
Date: Sun Mar 08 2020 - 12:17:49 EST


On 3/8/20 3:44 AM, Hillf Danton wrote:
> @@ -1208,8 +1211,16 @@ static int __loop_clr_fd(struct loop_dev
> *
> * 3) unlock, del_timer_sync so if timer raced it will be a no-op
> */
> - loop_unprepare_queue(lo);
> spin_lock_irq(&lo->lo_lock);
> + do {
> + struct workqueue_struct *wq = lo->workqueue;
> +
> + lo->workqueue = ERR_PTR(-EINVAL);
> + spin_unlock_irq(&lo->lo_lock);
> + destroy_workqueue(wq);
> + spin_lock_irq(&lo->lo_lock);
> + } while (0);

This looks highly suspicious, what's the point of this loop?

Also think this series a) might not be fully cooked, and b) really
should have gone through the block tree.

--
Jens Axboe