blktrace.c (7bed14551659875e1cd23a7c0266394a29a773b3) | blktrace.c (f3bdc62fd82ed93dbe4d049eacba310de7eb2a6a) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2006 Jens Axboe <axboe@kernel.dk> 4 * 5 */ 6 7#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 8 --- 334 unchanged lines hidden (view full) --- 343 put_probe_ref(); 344} 345 346static int __blk_trace_remove(struct request_queue *q) 347{ 348 struct blk_trace *bt; 349 350 bt = rcu_replace_pointer(q->blk_trace, NULL, | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2006 Jens Axboe <axboe@kernel.dk> 4 * 5 */ 6 7#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 8 --- 334 unchanged lines hidden (view full) --- 343 put_probe_ref(); 344} 345 346static int __blk_trace_remove(struct request_queue *q) 347{ 348 struct blk_trace *bt; 349 350 bt = rcu_replace_pointer(q->blk_trace, NULL, |
351 lockdep_is_held(&q->blk_trace_mutex)); | 351 lockdep_is_held(&q->debugfs_mutex)); |
352 if (!bt) 353 return -EINVAL; 354 355 if (bt->trace_state != Blktrace_running) 356 blk_trace_cleanup(bt); 357 358 return 0; 359} 360 361int blk_trace_remove(struct request_queue *q) 362{ 363 int ret; 364 | 352 if (!bt) 353 return -EINVAL; 354 355 if (bt->trace_state != Blktrace_running) 356 blk_trace_cleanup(bt); 357 358 return 0; 359} 360 361int blk_trace_remove(struct request_queue *q) 362{ 363 int ret; 364 |
365 mutex_lock(&q->blk_trace_mutex); | 365 mutex_lock(&q->debugfs_mutex); |
366 ret = __blk_trace_remove(q); | 366 ret = __blk_trace_remove(q); |
367 mutex_unlock(&q->blk_trace_mutex); | 367 mutex_unlock(&q->debugfs_mutex); |
368 369 return ret; 370} 371EXPORT_SYMBOL_GPL(blk_trace_remove); 372 373static ssize_t blk_dropped_read(struct file *filp, char __user *buffer, 374 size_t count, loff_t *ppos) 375{ --- 102 unchanged lines hidden (view full) --- 478static int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev, 479 struct block_device *bdev, 480 struct blk_user_trace_setup *buts) 481{ 482 struct blk_trace *bt = NULL; 483 struct dentry *dir = NULL; 484 int ret; 485 | 368 369 return ret; 370} 371EXPORT_SYMBOL_GPL(blk_trace_remove); 372 373static ssize_t blk_dropped_read(struct file *filp, char __user *buffer, 374 size_t count, loff_t *ppos) 375{ --- 102 unchanged lines hidden (view full) --- 478static int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev, 479 struct block_device *bdev, 480 struct blk_user_trace_setup *buts) 481{ 482 struct blk_trace *bt = NULL; 483 struct dentry *dir = NULL; 484 int ret; 485 |
486 lockdep_assert_held(&q->debugfs_mutex); 487 |
|
486 if (!buts->buf_size || !buts->buf_nr) 487 return -EINVAL; 488 | 488 if (!buts->buf_size || !buts->buf_nr) 489 return -EINVAL; 490 |
489 if (!blk_debugfs_root) 490 return -ENOENT; 491 | |
492 strncpy(buts->name, name, BLKTRACE_BDEV_SIZE); 493 buts->name[BLKTRACE_BDEV_SIZE - 1] = '\0'; 494 495 /* 496 * some device names have larger paths - convert the slashes 497 * to underscores for this to work as expected 498 */ 499 strreplace(buts->name, '/', '_'); 500 501 /* 502 * bdev can be NULL, as with scsi-generic, this is a helpful as 503 * we can be. 504 */ 505 if (rcu_dereference_protected(q->blk_trace, | 491 strncpy(buts->name, name, BLKTRACE_BDEV_SIZE); 492 buts->name[BLKTRACE_BDEV_SIZE - 1] = '\0'; 493 494 /* 495 * some device names have larger paths - convert the slashes 496 * to underscores for this to work as expected 497 */ 498 strreplace(buts->name, '/', '_'); 499 500 /* 501 * bdev can be NULL, as with scsi-generic, this is a helpful as 502 * we can be. 503 */ 504 if (rcu_dereference_protected(q->blk_trace, |
506 lockdep_is_held(&q->blk_trace_mutex))) { | 505 lockdep_is_held(&q->debugfs_mutex))) { |
507 pr_warn("Concurrent blktraces are not allowed on %s\n", 508 buts->name); 509 return -EBUSY; 510 } 511 512 bt = kzalloc(sizeof(*bt), GFP_KERNEL); 513 if (!bt) 514 return -ENOMEM; 515 516 ret = -ENOMEM; 517 bt->sequence = alloc_percpu(unsigned long); 518 if (!bt->sequence) 519 goto err; 520 521 bt->msg_data = __alloc_percpu(BLK_TN_MAX_MSG, __alignof__(char)); 522 if (!bt->msg_data) 523 goto err; 524 | 506 pr_warn("Concurrent blktraces are not allowed on %s\n", 507 buts->name); 508 return -EBUSY; 509 } 510 511 bt = kzalloc(sizeof(*bt), GFP_KERNEL); 512 if (!bt) 513 return -ENOMEM; 514 515 ret = -ENOMEM; 516 bt->sequence = alloc_percpu(unsigned long); 517 if (!bt->sequence) 518 goto err; 519 520 bt->msg_data = __alloc_percpu(BLK_TN_MAX_MSG, __alignof__(char)); 521 if (!bt->msg_data) 522 goto err; 523 |
525 ret = -ENOENT; 526 527 dir = debugfs_lookup(buts->name, blk_debugfs_root); 528 if (!dir) | 524 /* 525 * When tracing the whole disk reuse the existing debugfs directory 526 * created by the block layer on init. For partitions block devices, 527 * and scsi-generic block devices we create a temporary new debugfs 528 * directory that will be removed once the trace ends. 529 */ 530 if (bdev && bdev == bdev->bd_contains) 531 dir = q->debugfs_dir; 532 else |
529 bt->dir = dir = debugfs_create_dir(buts->name, blk_debugfs_root); 530 | 533 bt->dir = dir = debugfs_create_dir(buts->name, blk_debugfs_root); 534 |
535 /* 536 * As blktrace relies on debugfs for its interface the debugfs directory 537 * is required, contrary to the usual mantra of not checking for debugfs 538 * files or directories. 539 */ 540 if (IS_ERR_OR_NULL(dir)) { 541 pr_warn("debugfs_dir not present for %s so skipping\n", 542 buts->name); 543 ret = -ENOENT; 544 goto err; 545 } 546 |
|
531 bt->dev = dev; 532 atomic_set(&bt->dropped, 0); 533 INIT_LIST_HEAD(&bt->running_list); 534 535 ret = -EIO; 536 bt->dropped_file = debugfs_create_file("dropped", 0444, dir, bt, 537 &blk_dropped_fops); 538 --- 19 unchanged lines hidden (view full) --- 558 bt->pid = buts->pid; 559 bt->trace_state = Blktrace_setup; 560 561 rcu_assign_pointer(q->blk_trace, bt); 562 get_probe_ref(); 563 564 ret = 0; 565err: | 547 bt->dev = dev; 548 atomic_set(&bt->dropped, 0); 549 INIT_LIST_HEAD(&bt->running_list); 550 551 ret = -EIO; 552 bt->dropped_file = debugfs_create_file("dropped", 0444, dir, bt, 553 &blk_dropped_fops); 554 --- 19 unchanged lines hidden (view full) --- 574 bt->pid = buts->pid; 575 bt->trace_state = Blktrace_setup; 576 577 rcu_assign_pointer(q->blk_trace, bt); 578 get_probe_ref(); 579 580 ret = 0; 581err: |
566 if (dir && !bt->dir) 567 dput(dir); | |
568 if (ret) 569 blk_trace_free(bt); 570 return ret; 571} 572 573static int __blk_trace_setup(struct request_queue *q, char *name, dev_t dev, 574 struct block_device *bdev, char __user *arg) 575{ --- 16 unchanged lines hidden (view full) --- 592} 593 594int blk_trace_setup(struct request_queue *q, char *name, dev_t dev, 595 struct block_device *bdev, 596 char __user *arg) 597{ 598 int ret; 599 | 582 if (ret) 583 blk_trace_free(bt); 584 return ret; 585} 586 587static int __blk_trace_setup(struct request_queue *q, char *name, dev_t dev, 588 struct block_device *bdev, char __user *arg) 589{ --- 16 unchanged lines hidden (view full) --- 606} 607 608int blk_trace_setup(struct request_queue *q, char *name, dev_t dev, 609 struct block_device *bdev, 610 char __user *arg) 611{ 612 int ret; 613 |
600 mutex_lock(&q->blk_trace_mutex); | 614 mutex_lock(&q->debugfs_mutex); |
601 ret = __blk_trace_setup(q, name, dev, bdev, arg); | 615 ret = __blk_trace_setup(q, name, dev, bdev, arg); |
602 mutex_unlock(&q->blk_trace_mutex); | 616 mutex_unlock(&q->debugfs_mutex); |
603 604 return ret; 605} 606EXPORT_SYMBOL_GPL(blk_trace_setup); 607 608#if defined(CONFIG_COMPAT) && defined(CONFIG_X86_64) 609static int compat_blk_trace_setup(struct request_queue *q, char *name, 610 dev_t dev, struct block_device *bdev, --- 29 unchanged lines hidden (view full) --- 640#endif 641 642static int __blk_trace_startstop(struct request_queue *q, int start) 643{ 644 int ret; 645 struct blk_trace *bt; 646 647 bt = rcu_dereference_protected(q->blk_trace, | 617 618 return ret; 619} 620EXPORT_SYMBOL_GPL(blk_trace_setup); 621 622#if defined(CONFIG_COMPAT) && defined(CONFIG_X86_64) 623static int compat_blk_trace_setup(struct request_queue *q, char *name, 624 dev_t dev, struct block_device *bdev, --- 29 unchanged lines hidden (view full) --- 654#endif 655 656static int __blk_trace_startstop(struct request_queue *q, int start) 657{ 658 int ret; 659 struct blk_trace *bt; 660 661 bt = rcu_dereference_protected(q->blk_trace, |
648 lockdep_is_held(&q->blk_trace_mutex)); | 662 lockdep_is_held(&q->debugfs_mutex)); |
649 if (bt == NULL) 650 return -EINVAL; 651 652 /* 653 * For starting a trace, we can transition from a setup or stopped 654 * trace. For stopping a trace, the state must be running 655 */ 656 ret = -EINVAL; --- 23 unchanged lines hidden (view full) --- 680 681 return ret; 682} 683 684int blk_trace_startstop(struct request_queue *q, int start) 685{ 686 int ret; 687 | 663 if (bt == NULL) 664 return -EINVAL; 665 666 /* 667 * For starting a trace, we can transition from a setup or stopped 668 * trace. For stopping a trace, the state must be running 669 */ 670 ret = -EINVAL; --- 23 unchanged lines hidden (view full) --- 694 695 return ret; 696} 697 698int blk_trace_startstop(struct request_queue *q, int start) 699{ 700 int ret; 701 |
688 mutex_lock(&q->blk_trace_mutex); | 702 mutex_lock(&q->debugfs_mutex); |
689 ret = __blk_trace_startstop(q, start); | 703 ret = __blk_trace_startstop(q, start); |
690 mutex_unlock(&q->blk_trace_mutex); | 704 mutex_unlock(&q->debugfs_mutex); |
691 692 return ret; 693} 694EXPORT_SYMBOL_GPL(blk_trace_startstop); 695 696/* 697 * When reading or writing the blktrace sysfs files, the references to the 698 * opened sysfs or device files should prevent the underlying block device --- 12 unchanged lines hidden (view full) --- 711 struct request_queue *q; 712 int ret, start = 0; 713 char b[BDEVNAME_SIZE]; 714 715 q = bdev_get_queue(bdev); 716 if (!q) 717 return -ENXIO; 718 | 705 706 return ret; 707} 708EXPORT_SYMBOL_GPL(blk_trace_startstop); 709 710/* 711 * When reading or writing the blktrace sysfs files, the references to the 712 * opened sysfs or device files should prevent the underlying block device --- 12 unchanged lines hidden (view full) --- 725 struct request_queue *q; 726 int ret, start = 0; 727 char b[BDEVNAME_SIZE]; 728 729 q = bdev_get_queue(bdev); 730 if (!q) 731 return -ENXIO; 732 |
719 mutex_lock(&q->blk_trace_mutex); | 733 mutex_lock(&q->debugfs_mutex); |
720 721 switch (cmd) { 722 case BLKTRACESETUP: 723 bdevname(bdev, b); 724 ret = __blk_trace_setup(q, b, bdev->bd_dev, bdev, arg); 725 break; 726#if defined(CONFIG_COMPAT) && defined(CONFIG_X86_64) 727 case BLKTRACESETUP32: --- 10 unchanged lines hidden (view full) --- 738 case BLKTRACETEARDOWN: 739 ret = __blk_trace_remove(q); 740 break; 741 default: 742 ret = -ENOTTY; 743 break; 744 } 745 | 734 735 switch (cmd) { 736 case BLKTRACESETUP: 737 bdevname(bdev, b); 738 ret = __blk_trace_setup(q, b, bdev->bd_dev, bdev, arg); 739 break; 740#if defined(CONFIG_COMPAT) && defined(CONFIG_X86_64) 741 case BLKTRACESETUP32: --- 10 unchanged lines hidden (view full) --- 752 case BLKTRACETEARDOWN: 753 ret = __blk_trace_remove(q); 754 break; 755 default: 756 ret = -ENOTTY; 757 break; 758 } 759 |
746 mutex_unlock(&q->blk_trace_mutex); | 760 mutex_unlock(&q->debugfs_mutex); |
747 return ret; 748} 749 750/** 751 * blk_trace_shutdown: - stop and cleanup trace structures 752 * @q: the request queue associated with the device 753 * 754 **/ 755void blk_trace_shutdown(struct request_queue *q) 756{ | 761 return ret; 762} 763 764/** 765 * blk_trace_shutdown: - stop and cleanup trace structures 766 * @q: the request queue associated with the device 767 * 768 **/ 769void blk_trace_shutdown(struct request_queue *q) 770{ |
757 mutex_lock(&q->blk_trace_mutex); | 771 mutex_lock(&q->debugfs_mutex); |
758 if (rcu_dereference_protected(q->blk_trace, | 772 if (rcu_dereference_protected(q->blk_trace, |
759 lockdep_is_held(&q->blk_trace_mutex))) { | 773 lockdep_is_held(&q->debugfs_mutex))) { |
760 __blk_trace_startstop(q, 0); 761 __blk_trace_remove(q); 762 } 763 | 774 __blk_trace_startstop(q, 0); 775 __blk_trace_remove(q); 776 } 777 |
764 mutex_unlock(&q->blk_trace_mutex); | 778 mutex_unlock(&q->debugfs_mutex); |
765} 766 767#ifdef CONFIG_BLK_CGROUP 768static u64 blk_trace_bio_get_cgid(struct request_queue *q, struct bio *bio) 769{ 770 struct blk_trace *bt; 771 772 /* We don't use the 'bt' value here except as an optimization... */ --- 68 unchanged lines hidden (view full) --- 841 842static void blk_add_trace_rq_issue(void *ignore, 843 struct request_queue *q, struct request *rq) 844{ 845 blk_add_trace_rq(rq, 0, blk_rq_bytes(rq), BLK_TA_ISSUE, 846 blk_trace_request_get_cgid(q, rq)); 847} 848 | 779} 780 781#ifdef CONFIG_BLK_CGROUP 782static u64 blk_trace_bio_get_cgid(struct request_queue *q, struct bio *bio) 783{ 784 struct blk_trace *bt; 785 786 /* We don't use the 'bt' value here except as an optimization... */ --- 68 unchanged lines hidden (view full) --- 855 856static void blk_add_trace_rq_issue(void *ignore, 857 struct request_queue *q, struct request *rq) 858{ 859 blk_add_trace_rq(rq, 0, blk_rq_bytes(rq), BLK_TA_ISSUE, 860 blk_trace_request_get_cgid(q, rq)); 861} 862 |
863static void blk_add_trace_rq_merge(void *ignore, 864 struct request_queue *q, struct request *rq) 865{ 866 blk_add_trace_rq(rq, 0, blk_rq_bytes(rq), BLK_TA_BACKMERGE, 867 blk_trace_request_get_cgid(q, rq)); 868} 869 |
|
849static void blk_add_trace_rq_requeue(void *ignore, 850 struct request_queue *q, 851 struct request *rq) 852{ 853 blk_add_trace_rq(rq, 0, blk_rq_bytes(rq), BLK_TA_REQUEUE, 854 blk_trace_request_get_cgid(q, rq)); 855} 856 --- 268 unchanged lines hidden (view full) --- 1125static void blk_register_tracepoints(void) 1126{ 1127 int ret; 1128 1129 ret = register_trace_block_rq_insert(blk_add_trace_rq_insert, NULL); 1130 WARN_ON(ret); 1131 ret = register_trace_block_rq_issue(blk_add_trace_rq_issue, NULL); 1132 WARN_ON(ret); | 870static void blk_add_trace_rq_requeue(void *ignore, 871 struct request_queue *q, 872 struct request *rq) 873{ 874 blk_add_trace_rq(rq, 0, blk_rq_bytes(rq), BLK_TA_REQUEUE, 875 blk_trace_request_get_cgid(q, rq)); 876} 877 --- 268 unchanged lines hidden (view full) --- 1146static void blk_register_tracepoints(void) 1147{ 1148 int ret; 1149 1150 ret = register_trace_block_rq_insert(blk_add_trace_rq_insert, NULL); 1151 WARN_ON(ret); 1152 ret = register_trace_block_rq_issue(blk_add_trace_rq_issue, NULL); 1153 WARN_ON(ret); |
1154 ret = register_trace_block_rq_merge(blk_add_trace_rq_merge, NULL); 1155 WARN_ON(ret); |
|
1133 ret = register_trace_block_rq_requeue(blk_add_trace_rq_requeue, NULL); 1134 WARN_ON(ret); 1135 ret = register_trace_block_rq_complete(blk_add_trace_rq_complete, NULL); 1136 WARN_ON(ret); 1137 ret = register_trace_block_bio_bounce(blk_add_trace_bio_bounce, NULL); 1138 WARN_ON(ret); 1139 ret = register_trace_block_bio_complete(blk_add_trace_bio_complete, NULL); 1140 WARN_ON(ret); --- 30 unchanged lines hidden (view full) --- 1171 unregister_trace_block_getrq(blk_add_trace_getrq, NULL); 1172 unregister_trace_block_bio_queue(blk_add_trace_bio_queue, NULL); 1173 unregister_trace_block_bio_frontmerge(blk_add_trace_bio_frontmerge, NULL); 1174 unregister_trace_block_bio_backmerge(blk_add_trace_bio_backmerge, NULL); 1175 unregister_trace_block_bio_complete(blk_add_trace_bio_complete, NULL); 1176 unregister_trace_block_bio_bounce(blk_add_trace_bio_bounce, NULL); 1177 unregister_trace_block_rq_complete(blk_add_trace_rq_complete, NULL); 1178 unregister_trace_block_rq_requeue(blk_add_trace_rq_requeue, NULL); | 1156 ret = register_trace_block_rq_requeue(blk_add_trace_rq_requeue, NULL); 1157 WARN_ON(ret); 1158 ret = register_trace_block_rq_complete(blk_add_trace_rq_complete, NULL); 1159 WARN_ON(ret); 1160 ret = register_trace_block_bio_bounce(blk_add_trace_bio_bounce, NULL); 1161 WARN_ON(ret); 1162 ret = register_trace_block_bio_complete(blk_add_trace_bio_complete, NULL); 1163 WARN_ON(ret); --- 30 unchanged lines hidden (view full) --- 1194 unregister_trace_block_getrq(blk_add_trace_getrq, NULL); 1195 unregister_trace_block_bio_queue(blk_add_trace_bio_queue, NULL); 1196 unregister_trace_block_bio_frontmerge(blk_add_trace_bio_frontmerge, NULL); 1197 unregister_trace_block_bio_backmerge(blk_add_trace_bio_backmerge, NULL); 1198 unregister_trace_block_bio_complete(blk_add_trace_bio_complete, NULL); 1199 unregister_trace_block_bio_bounce(blk_add_trace_bio_bounce, NULL); 1200 unregister_trace_block_rq_complete(blk_add_trace_rq_complete, NULL); 1201 unregister_trace_block_rq_requeue(blk_add_trace_rq_requeue, NULL); |
1202 unregister_trace_block_rq_merge(blk_add_trace_rq_merge, NULL); |
|
1179 unregister_trace_block_rq_issue(blk_add_trace_rq_issue, NULL); 1180 unregister_trace_block_rq_insert(blk_add_trace_rq_insert, NULL); 1181 1182 tracepoint_synchronize_unregister(); 1183} 1184 1185/* 1186 * struct blk_io_tracer formatting routines --- 450 unchanged lines hidden (view full) --- 1637 1638device_initcall(init_blk_tracer); 1639 1640static int blk_trace_remove_queue(struct request_queue *q) 1641{ 1642 struct blk_trace *bt; 1643 1644 bt = rcu_replace_pointer(q->blk_trace, NULL, | 1203 unregister_trace_block_rq_issue(blk_add_trace_rq_issue, NULL); 1204 unregister_trace_block_rq_insert(blk_add_trace_rq_insert, NULL); 1205 1206 tracepoint_synchronize_unregister(); 1207} 1208 1209/* 1210 * struct blk_io_tracer formatting routines --- 450 unchanged lines hidden (view full) --- 1661 1662device_initcall(init_blk_tracer); 1663 1664static int blk_trace_remove_queue(struct request_queue *q) 1665{ 1666 struct blk_trace *bt; 1667 1668 bt = rcu_replace_pointer(q->blk_trace, NULL, |
1645 lockdep_is_held(&q->blk_trace_mutex)); | 1669 lockdep_is_held(&q->debugfs_mutex)); |
1646 if (bt == NULL) 1647 return -EINVAL; 1648 1649 put_probe_ref(); 1650 synchronize_rcu(); 1651 blk_trace_free(bt); 1652 return 0; 1653} --- 158 unchanged lines hidden (view full) --- 1812 bdev = bdget(part_devt(p)); 1813 if (bdev == NULL) 1814 goto out; 1815 1816 q = blk_trace_get_queue(bdev); 1817 if (q == NULL) 1818 goto out_bdput; 1819 | 1670 if (bt == NULL) 1671 return -EINVAL; 1672 1673 put_probe_ref(); 1674 synchronize_rcu(); 1675 blk_trace_free(bt); 1676 return 0; 1677} --- 158 unchanged lines hidden (view full) --- 1836 bdev = bdget(part_devt(p)); 1837 if (bdev == NULL) 1838 goto out; 1839 1840 q = blk_trace_get_queue(bdev); 1841 if (q == NULL) 1842 goto out_bdput; 1843 |
1820 mutex_lock(&q->blk_trace_mutex); | 1844 mutex_lock(&q->debugfs_mutex); |
1821 1822 bt = rcu_dereference_protected(q->blk_trace, | 1845 1846 bt = rcu_dereference_protected(q->blk_trace, |
1823 lockdep_is_held(&q->blk_trace_mutex)); | 1847 lockdep_is_held(&q->debugfs_mutex)); |
1824 if (attr == &dev_attr_enable) { 1825 ret = sprintf(buf, "%u\n", !!bt); 1826 goto out_unlock_bdev; 1827 } 1828 1829 if (bt == NULL) 1830 ret = sprintf(buf, "disabled\n"); 1831 else if (attr == &dev_attr_act_mask) 1832 ret = blk_trace_mask2str(buf, bt->act_mask); 1833 else if (attr == &dev_attr_pid) 1834 ret = sprintf(buf, "%u\n", bt->pid); 1835 else if (attr == &dev_attr_start_lba) 1836 ret = sprintf(buf, "%llu\n", bt->start_lba); 1837 else if (attr == &dev_attr_end_lba) 1838 ret = sprintf(buf, "%llu\n", bt->end_lba); 1839 1840out_unlock_bdev: | 1848 if (attr == &dev_attr_enable) { 1849 ret = sprintf(buf, "%u\n", !!bt); 1850 goto out_unlock_bdev; 1851 } 1852 1853 if (bt == NULL) 1854 ret = sprintf(buf, "disabled\n"); 1855 else if (attr == &dev_attr_act_mask) 1856 ret = blk_trace_mask2str(buf, bt->act_mask); 1857 else if (attr == &dev_attr_pid) 1858 ret = sprintf(buf, "%u\n", bt->pid); 1859 else if (attr == &dev_attr_start_lba) 1860 ret = sprintf(buf, "%llu\n", bt->start_lba); 1861 else if (attr == &dev_attr_end_lba) 1862 ret = sprintf(buf, "%llu\n", bt->end_lba); 1863 1864out_unlock_bdev: |
1841 mutex_unlock(&q->blk_trace_mutex); | 1865 mutex_unlock(&q->debugfs_mutex); |
1842out_bdput: 1843 bdput(bdev); 1844out: 1845 return ret; 1846} 1847 1848static ssize_t sysfs_blk_trace_attr_store(struct device *dev, 1849 struct device_attribute *attr, --- 26 unchanged lines hidden (view full) --- 1876 bdev = bdget(part_devt(p)); 1877 if (bdev == NULL) 1878 goto out; 1879 1880 q = blk_trace_get_queue(bdev); 1881 if (q == NULL) 1882 goto out_bdput; 1883 | 1866out_bdput: 1867 bdput(bdev); 1868out: 1869 return ret; 1870} 1871 1872static ssize_t sysfs_blk_trace_attr_store(struct device *dev, 1873 struct device_attribute *attr, --- 26 unchanged lines hidden (view full) --- 1900 bdev = bdget(part_devt(p)); 1901 if (bdev == NULL) 1902 goto out; 1903 1904 q = blk_trace_get_queue(bdev); 1905 if (q == NULL) 1906 goto out_bdput; 1907 |
1884 mutex_lock(&q->blk_trace_mutex); | 1908 mutex_lock(&q->debugfs_mutex); |
1885 1886 bt = rcu_dereference_protected(q->blk_trace, | 1909 1910 bt = rcu_dereference_protected(q->blk_trace, |
1887 lockdep_is_held(&q->blk_trace_mutex)); | 1911 lockdep_is_held(&q->debugfs_mutex)); |
1888 if (attr == &dev_attr_enable) { 1889 if (!!value == !!bt) { 1890 ret = 0; 1891 goto out_unlock_bdev; 1892 } 1893 if (value) 1894 ret = blk_trace_setup_queue(q, bdev); 1895 else 1896 ret = blk_trace_remove_queue(q); 1897 goto out_unlock_bdev; 1898 } 1899 1900 ret = 0; 1901 if (bt == NULL) { 1902 ret = blk_trace_setup_queue(q, bdev); 1903 bt = rcu_dereference_protected(q->blk_trace, | 1912 if (attr == &dev_attr_enable) { 1913 if (!!value == !!bt) { 1914 ret = 0; 1915 goto out_unlock_bdev; 1916 } 1917 if (value) 1918 ret = blk_trace_setup_queue(q, bdev); 1919 else 1920 ret = blk_trace_remove_queue(q); 1921 goto out_unlock_bdev; 1922 } 1923 1924 ret = 0; 1925 if (bt == NULL) { 1926 ret = blk_trace_setup_queue(q, bdev); 1927 bt = rcu_dereference_protected(q->blk_trace, |
1904 lockdep_is_held(&q->blk_trace_mutex)); | 1928 lockdep_is_held(&q->debugfs_mutex)); |
1905 } 1906 1907 if (ret == 0) { 1908 if (attr == &dev_attr_act_mask) 1909 bt->act_mask = value; 1910 else if (attr == &dev_attr_pid) 1911 bt->pid = value; 1912 else if (attr == &dev_attr_start_lba) 1913 bt->start_lba = value; 1914 else if (attr == &dev_attr_end_lba) 1915 bt->end_lba = value; 1916 } 1917 1918out_unlock_bdev: | 1929 } 1930 1931 if (ret == 0) { 1932 if (attr == &dev_attr_act_mask) 1933 bt->act_mask = value; 1934 else if (attr == &dev_attr_pid) 1935 bt->pid = value; 1936 else if (attr == &dev_attr_start_lba) 1937 bt->start_lba = value; 1938 else if (attr == &dev_attr_end_lba) 1939 bt->end_lba = value; 1940 } 1941 1942out_unlock_bdev: |
1919 mutex_unlock(&q->blk_trace_mutex); | 1943 mutex_unlock(&q->debugfs_mutex); |
1920out_bdput: 1921 bdput(bdev); 1922out: 1923 return ret ? ret : count; 1924} 1925 1926int blk_trace_init_sysfs(struct device *dev) 1927{ --- 56 unchanged lines hidden --- | 1944out_bdput: 1945 bdput(bdev); 1946out: 1947 return ret ? ret : count; 1948} 1949 1950int blk_trace_init_sysfs(struct device *dev) 1951{ --- 56 unchanged lines hidden --- |