@@ -336,7 +336,7 @@ static void blk_trace_cleanup(struct blk_trace *bt)
336
336
blk_unregister_tracepoints ();
337
337
}
338
338
339
- int blk_trace_remove (struct request_queue * q )
339
+ static int __blk_trace_remove (struct request_queue * q )
340
340
{
341
341
struct blk_trace * bt ;
342
342
@@ -349,6 +349,17 @@ int blk_trace_remove(struct request_queue *q)
349
349
350
350
return 0 ;
351
351
}
352
+
353
+ int blk_trace_remove (struct request_queue * q )
354
+ {
355
+ int ret ;
356
+
357
+ mutex_lock (& q -> blk_trace_mutex );
358
+ ret = __blk_trace_remove (q );
359
+ mutex_unlock (& q -> blk_trace_mutex );
360
+
361
+ return ret ;
362
+ }
352
363
EXPORT_SYMBOL_GPL (blk_trace_remove );
353
364
354
365
static ssize_t blk_dropped_read (struct file * filp , char __user * buffer ,
@@ -550,9 +561,8 @@ static int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
550
561
return ret ;
551
562
}
552
563
553
- int blk_trace_setup (struct request_queue * q , char * name , dev_t dev ,
554
- struct block_device * bdev ,
555
- char __user * arg )
564
+ static int __blk_trace_setup (struct request_queue * q , char * name , dev_t dev ,
565
+ struct block_device * bdev , char __user * arg )
556
566
{
557
567
struct blk_user_trace_setup buts ;
558
568
int ret ;
@@ -571,6 +581,19 @@ int blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
571
581
}
572
582
return 0 ;
573
583
}
584
+
585
+ int blk_trace_setup (struct request_queue * q , char * name , dev_t dev ,
586
+ struct block_device * bdev ,
587
+ char __user * arg )
588
+ {
589
+ int ret ;
590
+
591
+ mutex_lock (& q -> blk_trace_mutex );
592
+ ret = __blk_trace_setup (q , name , dev , bdev , arg );
593
+ mutex_unlock (& q -> blk_trace_mutex );
594
+
595
+ return ret ;
596
+ }
574
597
EXPORT_SYMBOL_GPL (blk_trace_setup );
575
598
576
599
#if defined(CONFIG_COMPAT ) && defined(CONFIG_X86_64 )
@@ -607,7 +630,7 @@ static int compat_blk_trace_setup(struct request_queue *q, char *name,
607
630
}
608
631
#endif
609
632
610
- int blk_trace_startstop (struct request_queue * q , int start )
633
+ static int __blk_trace_startstop (struct request_queue * q , int start )
611
634
{
612
635
int ret ;
613
636
struct blk_trace * bt = q -> blk_trace ;
@@ -646,6 +669,17 @@ int blk_trace_startstop(struct request_queue *q, int start)
646
669
647
670
return ret ;
648
671
}
672
+
673
+ int blk_trace_startstop (struct request_queue * q , int start )
674
+ {
675
+ int ret ;
676
+
677
+ mutex_lock (& q -> blk_trace_mutex );
678
+ ret = __blk_trace_startstop (q , start );
679
+ mutex_unlock (& q -> blk_trace_mutex );
680
+
681
+ return ret ;
682
+ }
649
683
EXPORT_SYMBOL_GPL (blk_trace_startstop );
650
684
651
685
/*
@@ -676,7 +710,7 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)
676
710
switch (cmd ) {
677
711
case BLKTRACESETUP :
678
712
bdevname (bdev , b );
679
- ret = blk_trace_setup (q , b , bdev -> bd_dev , bdev , arg );
713
+ ret = __blk_trace_setup (q , b , bdev -> bd_dev , bdev , arg );
680
714
break ;
681
715
#if defined(CONFIG_COMPAT ) && defined(CONFIG_X86_64 )
682
716
case BLKTRACESETUP32 :
@@ -687,10 +721,10 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)
687
721
case BLKTRACESTART :
688
722
start = 1 ;
689
723
case BLKTRACESTOP :
690
- ret = blk_trace_startstop (q , start );
724
+ ret = __blk_trace_startstop (q , start );
691
725
break ;
692
726
case BLKTRACETEARDOWN :
693
- ret = blk_trace_remove (q );
727
+ ret = __blk_trace_remove (q );
694
728
break ;
695
729
default :
696
730
ret = - ENOTTY ;
@@ -708,10 +742,14 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)
708
742
**/
709
743
void blk_trace_shutdown (struct request_queue * q )
710
744
{
745
+ mutex_lock (& q -> blk_trace_mutex );
746
+
711
747
if (q -> blk_trace ) {
712
- blk_trace_startstop (q , 0 );
713
- blk_trace_remove (q );
748
+ __blk_trace_startstop (q , 0 );
749
+ __blk_trace_remove (q );
714
750
}
751
+
752
+ mutex_unlock (& q -> blk_trace_mutex );
715
753
}
716
754
717
755
#ifdef CONFIG_BLK_CGROUP
0 commit comments