blktrace: move user copies out of q->debugfs_mutex btrace-fault
authorJens Axboe <axboe@kernel.dk>
Fri, 11 Oct 2024 19:19:25 +0000 (13:19 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 11 Oct 2024 19:19:25 +0000 (13:19 -0600)
Signed-off-by: Jens Axboe <axboe@kernel.dk>
kernel/trace/blktrace.c

index 8fd292d34d8984c3cbea54a3297bd2280c603957..cefcad1204951fede7018cd23a59bbb783c955ca 100644 (file)
@@ -617,8 +617,8 @@ err:
        return ret;
 }
 
-static int __blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
-                            struct block_device *bdev, char __user *arg)
+int blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
+                   struct block_device *bdev, char __user *arg)
 {
        struct blk_user_trace_setup buts;
        int ret;
@@ -627,28 +627,18 @@ static int __blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
        if (ret)
                return -EFAULT;
 
+       mutex_lock(&q->debugfs_mutex);
        ret = do_blk_trace_setup(q, name, dev, bdev, &buts);
+       mutex_unlock(&q->debugfs_mutex);
        if (ret)
                return ret;
 
        if (copy_to_user(arg, &buts, sizeof(buts))) {
-               __blk_trace_remove(q);
+               blk_trace_remove(q);
                return -EFAULT;
        }
-       return 0;
-}
 
-int blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
-                   struct block_device *bdev,
-                   char __user *arg)
-{
-       int ret;
-
-       mutex_lock(&q->debugfs_mutex);
-       ret = __blk_trace_setup(q, name, dev, bdev, arg);
-       mutex_unlock(&q->debugfs_mutex);
-
-       return ret;
+       return 0;
 }
 EXPORT_SYMBOL_GPL(blk_trace_setup);
 
@@ -673,12 +663,14 @@ static int compat_blk_trace_setup(struct request_queue *q, char *name,
                .pid = cbuts.pid,
        };
 
+       mutex_lock(&q->debugfs_mutex);
        ret = do_blk_trace_setup(q, name, dev, bdev, &buts);
+       mutex_unlock(&q->debugfs_mutex);
        if (ret)
                return ret;
 
        if (copy_to_user(arg, &buts.name, ARRAY_SIZE(buts.name))) {
-               __blk_trace_remove(q);
+               blk_trace_remove(q);
                return -EFAULT;
        }
 
@@ -732,12 +724,10 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)
        int ret, start = 0;
        char b[BDEVNAME_SIZE];
 
-       mutex_lock(&q->debugfs_mutex);
-
        switch (cmd) {
        case BLKTRACESETUP:
                snprintf(b, sizeof(b), "%pg", bdev);
-               ret = __blk_trace_setup(q, b, bdev->bd_dev, bdev, arg);
+               ret = blk_trace_setup(q, b, bdev->bd_dev, bdev, arg);
                break;
 #if defined(CONFIG_COMPAT) && defined(CONFIG_X86_64)
        case BLKTRACESETUP32:
@@ -749,17 +739,16 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)
                start = 1;
                fallthrough;
        case BLKTRACESTOP:
-               ret = __blk_trace_startstop(q, start);
+               ret = blk_trace_startstop(q, start);
                break;
        case BLKTRACETEARDOWN:
-               ret = __blk_trace_remove(q);
+               ret = blk_trace_remove(q);
                break;
        default:
                ret = -ENOTTY;
                break;
        }
 
-       mutex_unlock(&q->debugfs_mutex);
        return ret;
 }