]> git.itanic.dy.fi Git - linux-stable/commitdiff
aoe: Avoid flush_scheduled_work() usage
authorTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Mon, 18 Apr 2022 23:31:55 +0000 (08:31 +0900)
committerJens Axboe <axboe@kernel.dk>
Sun, 1 May 2022 12:41:41 +0000 (06:41 -0600)
Flushing system-wide workqueues is dangerous and will be forbidden.
Replace system_wq with local aoe_wq.

Link: https://lkml.kernel.org/r/49925af7-78a8-a3dd-bce6-cfc02e1a9236@I-love.SAKURA.ne.jp
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Link: https://lore.kernel.org/r/abb37616-eec9-2794-e21e-7c623085d987@I-love.SAKURA.ne.jp
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/aoe/aoe.h
drivers/block/aoe/aoeblk.c
drivers/block/aoe/aoecmd.c
drivers/block/aoe/aoedev.c
drivers/block/aoe/aoemain.c

index 84d0fcebd6af5acf15230779755d752ece8510be..749ae1246f4cf894f8544248c1461d0d06720db0 100644 (file)
@@ -244,3 +244,5 @@ void aoenet_exit(void);
 void aoenet_xmit(struct sk_buff_head *);
 int is_aoe_netif(struct net_device *ifp);
 int set_aoe_iflist(const char __user *str, size_t size);
+
+extern struct workqueue_struct *aoe_wq;
index 8a91fcac6f829bdbf8ad1709006f7dbdfb2c43b3..348adf3352177d7644489bfe973ea94d22a2f96f 100644 (file)
@@ -435,7 +435,7 @@ aoeblk_gdalloc(void *vp)
 err:
        spin_lock_irqsave(&d->lock, flags);
        d->flags &= ~DEVFL_GD_NOW;
-       schedule_work(&d->work);
+       queue_work(aoe_wq, &d->work);
        spin_unlock_irqrestore(&d->lock, flags);
 }
 
index 384073ef2323c9ee1c53bc1fd20b5346da159c25..d7317425be510d1c3d4bbac5a18fba2ea8e76c1d 100644 (file)
@@ -968,7 +968,7 @@ ataid_complete(struct aoedev *d, struct aoetgt *t, unsigned char *id)
                d->flags |= DEVFL_NEWSIZE;
        else
                d->flags |= DEVFL_GDALLOC;
-       schedule_work(&d->work);
+       queue_work(aoe_wq, &d->work);
 }
 
 static void
index c5753c6bfe8041213f772654b27da2d9938d2ad3..b381d1c3ef327502b9eece7bd37127d12152fd30 100644 (file)
@@ -321,7 +321,7 @@ flush(const char __user *str, size_t cnt, int exiting)
                        specified = 1;
        }
 
-       flush_scheduled_work();
+       flush_workqueue(aoe_wq);
        /* pass one: do aoedev_downdev, which might sleep */
 restart1:
        spin_lock_irqsave(&devlist_lock, flags);
@@ -520,7 +520,7 @@ freetgt(struct aoedev *d, struct aoetgt *t)
 void
 aoedev_exit(void)
 {
-       flush_scheduled_work();
+       flush_workqueue(aoe_wq);
        flush(NULL, 0, EXITING);
 }
 
index 1e4e2971171caf5c0cafd798fe93bc83c439e0e1..6238c4c87cfc73a58e81d3648457f2b95e1541db 100644 (file)
@@ -16,6 +16,7 @@ MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels");
 MODULE_VERSION(VERSION);
 
 static struct timer_list timer;
+struct workqueue_struct *aoe_wq;
 
 static void discover_timer(struct timer_list *t)
 {
@@ -35,6 +36,7 @@ aoe_exit(void)
        aoechr_exit();
        aoedev_exit();
        aoeblk_exit();          /* free cache after de-allocating bufs */
+       destroy_workqueue(aoe_wq);
 }
 
 static int __init
@@ -42,9 +44,13 @@ aoe_init(void)
 {
        int ret;
 
+       aoe_wq = alloc_workqueue("aoe_wq", 0, 0);
+       if (!aoe_wq)
+               return -ENOMEM;
+
        ret = aoedev_init();
        if (ret)
-               return ret;
+               goto dev_fail;
        ret = aoechr_init();
        if (ret)
                goto chr_fail;
@@ -77,6 +83,8 @@ aoe_init(void)
        aoechr_exit();
  chr_fail:
        aoedev_exit();
+ dev_fail:
+       destroy_workqueue(aoe_wq);
 
        printk(KERN_INFO "aoe: initialisation failure.\n");
        return ret;