History

block: create the request_queue debugfs_dir on registration

We were only creating the request_queue debugfs_dir only for make_request block drivers (multiqueue), but never for request-based block drivers. We did this as we were only creating non-blktrace additional debugfs files on that directory for make_request drivers. However, since blktrace *always* creates that directory anyway, we special-case the use of that directory on blktrace. Other than this being an eye-sore, this exposes request-based block drivers to the same debugfs fragile race that used to exist with make_request block drivers where if we start adding files onto that directory we can later run a race with a double removal of dentries on the directory if we don't deal with this carefully on blktrace. Instead, just simplify things by always creating the request_queue debugfs_dir on request_queue registration. Rename the mutex also to reflect the fact that this is used outside of the blktrace context.

Luis Chamberlain committed 6 years ago

Commit 85e0cbb1 parent b431ef86 files · +39 −48Browse files

Showing the changes to kernel (1 of 6 files). Show all

Unified · Split

kernel/trace/blktrace.c+26−32
@@ -348,7 +348,7 @@ static int __blk_trace_remove(struct request_queue *q) · 347 unmodified lines
348348 struct blk_trace *bt;
349349
350350 bt = rcu_replace_pointer(q->blk_trace, NULL,
351− lockdep_is_held(&q->blk_trace_mutex));
351+ lockdep_is_held(&q->debugfs_mutex));
352352 if (!bt)
353353 return -EINVAL;
354354
@@ -362,9 +362,9 @@ int blk_trace_remove(struct request_queue *q) · 7 unmodified lines
362362 {
363363 int ret;
364364
365− mutex_lock(&q->blk_trace_mutex);
365+ mutex_lock(&q->debugfs_mutex);
366366 ret = __blk_trace_remove(q);
367− mutex_unlock(&q->blk_trace_mutex);
367+ mutex_unlock(&q->debugfs_mutex);
368368
369369 return ret;
370370 }
@@ -483,14 +483,11 @@ static int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev, · 112 unmodified lines
483483 struct dentry *dir = NULL;
484484 int ret;
485485
486− lockdep_assert_held(&q->blk_trace_mutex);
486+ lockdep_assert_held(&q->debugfs_mutex);
487487
488488 if (!buts->buf_size || !buts->buf_nr)
489489 return -EINVAL;
490490
491− if (!blk_debugfs_root)
492− return -ENOENT;
493−
494491 strncpy(buts->name, name, BLKTRACE_BDEV_SIZE);
495492 buts->name[BLKTRACE_BDEV_SIZE - 1] = '\0';
496493
@@ -505,7 +502,7 @@ static int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev, · 8 unmodified lines
505502 * we can be.
506503 */
507504 if (rcu_dereference_protected(q->blk_trace,
508− lockdep_is_held(&q->blk_trace_mutex))) {
505+ lockdep_is_held(&q->debugfs_mutex))) {
509506 pr_warn("Concurrent blktraces are not allowed on %s\n",
510507 buts->name);
511508 return -EBUSY;
@@ -524,18 +521,15 @@ static int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev, · 12 unmodified lines
524521 if (!bt->msg_data)
525522 goto err;
526523
527−#ifdef CONFIG_BLK_DEBUG_FS
528524 /*
529− * When tracing whole make_request drivers (multiqueue) block devices,
530− * reuse the existing debugfs directory created by the block layer on
531− * init. For request-based block devices, all partitions block devices,
525+ * When tracing the whole disk reuse the existing debugfs directory
526+ * created by the block layer on init. For partitions block devices,
532527 * and scsi-generic block devices we create a temporary new debugfs
533528 * directory that will be removed once the trace ends.
534529 */
535− if (queue_is_mq(q) && bdev && bdev == bdev->bd_contains)
530+ if (bdev && bdev == bdev->bd_contains)
536531 dir = q->debugfs_dir;
537532 else
538−#endif
539533 bt->dir = dir = debugfs_create_dir(buts->name, blk_debugfs_root);
540534
541535 /*
@@ -617,9 +611,9 @@ int blk_trace_setup(struct request_queue *q, char *name, dev_t dev, · 75 unmodified lines
617611 {
618612 int ret;
619613
620− mutex_lock(&q->blk_trace_mutex);
614+ mutex_lock(&q->debugfs_mutex);
621615 ret = __blk_trace_setup(q, name, dev, bdev, arg);
622− mutex_unlock(&q->blk_trace_mutex);
616+ mutex_unlock(&q->debugfs_mutex);
623617
624618 return ret;
625619 }
@@ -665,7 +659,7 @@ static int __blk_trace_startstop(struct request_queue *q, int start) · 39 unmodified lines
665659 struct blk_trace *bt;
666660
667661 bt = rcu_dereference_protected(q->blk_trace,
668− lockdep_is_held(&q->blk_trace_mutex));
662+ lockdep_is_held(&q->debugfs_mutex));
669663 if (bt == NULL)
670664 return -EINVAL;
671665
@@ -705,9 +699,9 @@ int blk_trace_startstop(struct request_queue *q, int start) · 33 unmodified lines
705699 {
706700 int ret;
707701
708− mutex_lock(&q->blk_trace_mutex);
702+ mutex_lock(&q->debugfs_mutex);
709703 ret = __blk_trace_startstop(q, start);
710− mutex_unlock(&q->blk_trace_mutex);
704+ mutex_unlock(&q->debugfs_mutex);
711705
712706 return ret;
713707 }
@@ -736,7 +730,7 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg) · 22 unmodified lines
736730 if (!q)
737731 return -ENXIO;
738732
739− mutex_lock(&q->blk_trace_mutex);
733+ mutex_lock(&q->debugfs_mutex);
740734
741735 switch (cmd) {
742736 case BLKTRACESETUP:
@@ -763,7 +757,7 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg) · 20 unmodified lines
763757 break;
764758 }
765759
766− mutex_unlock(&q->blk_trace_mutex);
760+ mutex_unlock(&q->debugfs_mutex);
767761 return ret;
768762 }
769763
@@ -774,14 +768,14 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg) · 4 unmodified lines
774768 **/
775769 void blk_trace_shutdown(struct request_queue *q)
776770 {
777− mutex_lock(&q->blk_trace_mutex);
771+ mutex_lock(&q->debugfs_mutex);
778772 if (rcu_dereference_protected(q->blk_trace,
779− lockdep_is_held(&q->blk_trace_mutex))) {
773+ lockdep_is_held(&q->debugfs_mutex))) {
780774 __blk_trace_startstop(q, 0);
781775 __blk_trace_remove(q);
782776 }
783777
784− mutex_unlock(&q->blk_trace_mutex);
778+ mutex_unlock(&q->debugfs_mutex);
785779 }
786780
787781 #ifdef CONFIG_BLK_CGROUP
@@ -1662,7 +1656,7 @@ static int blk_trace_remove_queue(struct request_queue *q) · 874 unmodified lines
16621656 struct blk_trace *bt;
16631657
16641658 bt = rcu_replace_pointer(q->blk_trace, NULL,
1665− lockdep_is_held(&q->blk_trace_mutex));
1659+ lockdep_is_held(&q->debugfs_mutex));
16661660 if (bt == NULL)
16671661 return -EINVAL;
16681662
@@ -1837,10 +1831,10 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev, · 168 unmodified lines
18371831 if (q == NULL)
18381832 goto out_bdput;
18391833
1840− mutex_lock(&q->blk_trace_mutex);
1834+ mutex_lock(&q->debugfs_mutex);
18411835
18421836 bt = rcu_dereference_protected(q->blk_trace,
1843− lockdep_is_held(&q->blk_trace_mutex));
1837+ lockdep_is_held(&q->debugfs_mutex));
18441838 if (attr == &dev_attr_enable) {
18451839 ret = sprintf(buf, "%u\n", !!bt);
18461840 goto out_unlock_bdev;
@@ -1858,7 +1852,7 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev, · 11 unmodified lines
18581852 ret = sprintf(buf, "%llu\n", bt->end_lba);
18591853
18601854 out_unlock_bdev:
1861− mutex_unlock(&q->blk_trace_mutex);
1855+ mutex_unlock(&q->debugfs_mutex);
18621856 out_bdput:
18631857 bdput(bdev);
18641858 out:
@@ -1901,10 +1895,10 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev, · 36 unmodified lines
19011895 if (q == NULL)
19021896 goto out_bdput;
19031897
1904− mutex_lock(&q->blk_trace_mutex);
1898+ mutex_lock(&q->debugfs_mutex);
19051899
19061900 bt = rcu_dereference_protected(q->blk_trace,
1907− lockdep_is_held(&q->blk_trace_mutex));
1901+ lockdep_is_held(&q->debugfs_mutex));
19081902 if (attr == &dev_attr_enable) {
19091903 if (!!value == !!bt) {
19101904 ret = 0;
@@ -1921,7 +1915,7 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev, · 10 unmodified lines
19211915 if (bt == NULL) {
19221916 ret = blk_trace_setup_queue(q, bdev);
19231917 bt = rcu_dereference_protected(q->blk_trace,
1924− lockdep_is_held(&q->blk_trace_mutex));
1918+ lockdep_is_held(&q->debugfs_mutex));
19251919 }
19261920
19271921 if (ret == 0) {
@@ -1936,7 +1930,7 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev, · 8 unmodified lines
19361930 }
19371931
19381932 out_unlock_bdev:
1939− mutex_unlock(&q->blk_trace_mutex);
1933+ mutex_unlock(&q->debugfs_mutex);
19401934 out_bdput:
19411935 bdput(bdev);
19421936 out:

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t