diff options
author | Christoph Hellwig <hch@lst.de> | 2018-04-13 14:57:56 -0400 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2018-05-16 01:24:30 -0400 |
commit | f7680bec0456403b4d3d7720e00b95586a7bc26b (patch) | |
tree | b43eb7c33b024ad713ed8ec1fc230a8209f22207 | |
parent | 978547c5fbc10775be3b561a3ce7e1e90612b9c8 (diff) |
megaraid: simplify procfs code
Use remove_proc_subtree to remove the whole subtree on cleanup, and
unwind the registration loop into individual calls. Switch to use
proc_create_single.
Also don't bother handling proc_create* failures - the driver works
perfectly fine without the proc files, and the cleanup will handle
missing files gracefully.
Signed-off-by: Christoph Hellwig <hch@lst.de>
-rw-r--r-- | drivers/scsi/megaraid.c | 140 | ||||
-rw-r--r-- | drivers/scsi/megaraid.h | 12 |
2 files changed, 36 insertions, 116 deletions
diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c index 7195cff51d4c..91f5e2c68dbc 100644 --- a/drivers/scsi/megaraid.c +++ b/drivers/scsi/megaraid.c | |||
@@ -2731,53 +2731,6 @@ proc_show_rdrv_40(struct seq_file *m, void *v) | |||
2731 | return proc_show_rdrv(m, m->private, 30, 39); | 2731 | return proc_show_rdrv(m, m->private, 30, 39); |
2732 | } | 2732 | } |
2733 | 2733 | ||
2734 | |||
2735 | /* | ||
2736 | * seq_file wrappers for procfile show routines. | ||
2737 | */ | ||
2738 | static int mega_proc_open(struct inode *inode, struct file *file) | ||
2739 | { | ||
2740 | adapter_t *adapter = proc_get_parent_data(inode); | ||
2741 | int (*show)(struct seq_file *, void *) = PDE_DATA(inode); | ||
2742 | |||
2743 | return single_open(file, show, adapter); | ||
2744 | } | ||
2745 | |||
2746 | static const struct file_operations mega_proc_fops = { | ||
2747 | .open = mega_proc_open, | ||
2748 | .read = seq_read, | ||
2749 | .llseek = seq_lseek, | ||
2750 | .release = single_release, | ||
2751 | }; | ||
2752 | |||
2753 | /* | ||
2754 | * Table of proc files we need to create. | ||
2755 | */ | ||
2756 | struct mega_proc_file { | ||
2757 | const char *name; | ||
2758 | unsigned short ptr_offset; | ||
2759 | int (*show) (struct seq_file *m, void *v); | ||
2760 | }; | ||
2761 | |||
2762 | static const struct mega_proc_file mega_proc_files[] = { | ||
2763 | { "config", offsetof(adapter_t, proc_read), proc_show_config }, | ||
2764 | { "stat", offsetof(adapter_t, proc_stat), proc_show_stat }, | ||
2765 | { "mailbox", offsetof(adapter_t, proc_mbox), proc_show_mbox }, | ||
2766 | #if MEGA_HAVE_ENH_PROC | ||
2767 | { "rebuild-rate", offsetof(adapter_t, proc_rr), proc_show_rebuild_rate }, | ||
2768 | { "battery-status", offsetof(adapter_t, proc_battery), proc_show_battery }, | ||
2769 | { "diskdrives-ch0", offsetof(adapter_t, proc_pdrvstat[0]), proc_show_pdrv_ch0 }, | ||
2770 | { "diskdrives-ch1", offsetof(adapter_t, proc_pdrvstat[1]), proc_show_pdrv_ch1 }, | ||
2771 | { "diskdrives-ch2", offsetof(adapter_t, proc_pdrvstat[2]), proc_show_pdrv_ch2 }, | ||
2772 | { "diskdrives-ch3", offsetof(adapter_t, proc_pdrvstat[3]), proc_show_pdrv_ch3 }, | ||
2773 | { "raiddrives-0-9", offsetof(adapter_t, proc_rdrvstat[0]), proc_show_rdrv_10 }, | ||
2774 | { "raiddrives-10-19", offsetof(adapter_t, proc_rdrvstat[1]), proc_show_rdrv_20 }, | ||
2775 | { "raiddrives-20-29", offsetof(adapter_t, proc_rdrvstat[2]), proc_show_rdrv_30 }, | ||
2776 | { "raiddrives-30-39", offsetof(adapter_t, proc_rdrvstat[3]), proc_show_rdrv_40 }, | ||
2777 | #endif | ||
2778 | { NULL } | ||
2779 | }; | ||
2780 | |||
2781 | /** | 2734 | /** |
2782 | * mega_create_proc_entry() | 2735 | * mega_create_proc_entry() |
2783 | * @index - index in soft state array | 2736 | * @index - index in soft state array |
@@ -2788,31 +2741,45 @@ static const struct mega_proc_file mega_proc_files[] = { | |||
2788 | static void | 2741 | static void |
2789 | mega_create_proc_entry(int index, struct proc_dir_entry *parent) | 2742 | mega_create_proc_entry(int index, struct proc_dir_entry *parent) |
2790 | { | 2743 | { |
2791 | const struct mega_proc_file *f; | 2744 | adapter_t *adapter = hba_soft_state[index]; |
2792 | adapter_t *adapter = hba_soft_state[index]; | 2745 | struct proc_dir_entry *dir; |
2793 | struct proc_dir_entry *dir, *de, **ppde; | 2746 | u8 string[16]; |
2794 | u8 string[16]; | ||
2795 | 2747 | ||
2796 | sprintf(string, "hba%d", adapter->host->host_no); | 2748 | sprintf(string, "hba%d", adapter->host->host_no); |
2797 | 2749 | dir = proc_mkdir_data(string, 0, parent, adapter); | |
2798 | dir = adapter->controller_proc_dir_entry = | 2750 | if (!dir) { |
2799 | proc_mkdir_data(string, 0, parent, adapter); | ||
2800 | if(!dir) { | ||
2801 | dev_warn(&adapter->dev->dev, "proc_mkdir failed\n"); | 2751 | dev_warn(&adapter->dev->dev, "proc_mkdir failed\n"); |
2802 | return; | 2752 | return; |
2803 | } | 2753 | } |
2804 | 2754 | ||
2805 | for (f = mega_proc_files; f->name; f++) { | 2755 | proc_create_single_data("config", S_IRUSR, dir, |
2806 | de = proc_create_data(f->name, S_IRUSR, dir, &mega_proc_fops, | 2756 | proc_show_config, adapter); |
2807 | f->show); | 2757 | proc_create_single_data("stat", S_IRUSR, dir, |
2808 | if (!de) { | 2758 | proc_show_stat, adapter); |
2809 | dev_warn(&adapter->dev->dev, "proc_create failed\n"); | 2759 | proc_create_single_data("mailbox", S_IRUSR, dir, |
2810 | return; | 2760 | proc_show_mbox, adapter); |
2811 | } | 2761 | #if MEGA_HAVE_ENH_PROC |
2812 | 2762 | proc_create_single_data("rebuild-rate", S_IRUSR, dir, | |
2813 | ppde = (void *)adapter + f->ptr_offset; | 2763 | proc_show_rebuild_rate, adapter); |
2814 | *ppde = de; | 2764 | proc_create_single_data("battery-status", S_IRUSR, dir, |
2815 | } | 2765 | proc_show_battery, adapter); |
2766 | proc_create_single_data("diskdrives-ch0", S_IRUSR, dir, | ||
2767 | proc_show_pdrv_ch0, adapter); | ||
2768 | proc_create_single_data("diskdrives-ch1", S_IRUSR, dir, | ||
2769 | proc_show_pdrv_ch1, adapter); | ||
2770 | proc_create_single_data("diskdrives-ch2", S_IRUSR, dir, | ||
2771 | proc_show_pdrv_ch2, adapter); | ||
2772 | proc_create_single_data("diskdrives-ch3", S_IRUSR, dir, | ||
2773 | proc_show_pdrv_ch3, adapter); | ||
2774 | proc_create_single_data("raiddrives-0-9", S_IRUSR, dir, | ||
2775 | proc_show_rdrv_10, adapter); | ||
2776 | proc_create_single_data("raiddrives-10-19", S_IRUSR, dir, | ||
2777 | proc_show_rdrv_20, adapter); | ||
2778 | proc_create_single_data("raiddrives-20-29", S_IRUSR, dir, | ||
2779 | proc_show_rdrv_30, adapter); | ||
2780 | proc_create_single_data("raiddrives-30-39", S_IRUSR, dir, | ||
2781 | proc_show_rdrv_40, adapter); | ||
2782 | #endif | ||
2816 | } | 2783 | } |
2817 | 2784 | ||
2818 | #else | 2785 | #else |
@@ -4580,6 +4547,7 @@ megaraid_remove_one(struct pci_dev *pdev) | |||
4580 | { | 4547 | { |
4581 | struct Scsi_Host *host = pci_get_drvdata(pdev); | 4548 | struct Scsi_Host *host = pci_get_drvdata(pdev); |
4582 | adapter_t *adapter = (adapter_t *)host->hostdata; | 4549 | adapter_t *adapter = (adapter_t *)host->hostdata; |
4550 | char buf[12] = { 0 }; | ||
4583 | 4551 | ||
4584 | scsi_remove_host(host); | 4552 | scsi_remove_host(host); |
4585 | 4553 | ||
@@ -4594,44 +4562,8 @@ megaraid_remove_one(struct pci_dev *pdev) | |||
4594 | 4562 | ||
4595 | mega_free_sgl(adapter); | 4563 | mega_free_sgl(adapter); |
4596 | 4564 | ||
4597 | #ifdef CONFIG_PROC_FS | 4565 | sprintf(buf, "hba%d", adapter->host->host_no); |
4598 | if (adapter->controller_proc_dir_entry) { | 4566 | remove_proc_subtree(buf, mega_proc_dir_entry); |
4599 | remove_proc_entry("stat", adapter->controller_proc_dir_entry); | ||
4600 | remove_proc_entry("config", | ||
4601 | adapter->controller_proc_dir_entry); | ||
4602 | remove_proc_entry("mailbox", | ||
4603 | adapter->controller_proc_dir_entry); | ||
4604 | #if MEGA_HAVE_ENH_PROC | ||
4605 | remove_proc_entry("rebuild-rate", | ||
4606 | adapter->controller_proc_dir_entry); | ||
4607 | remove_proc_entry("battery-status", | ||
4608 | adapter->controller_proc_dir_entry); | ||
4609 | |||
4610 | remove_proc_entry("diskdrives-ch0", | ||
4611 | adapter->controller_proc_dir_entry); | ||
4612 | remove_proc_entry("diskdrives-ch1", | ||
4613 | adapter->controller_proc_dir_entry); | ||
4614 | remove_proc_entry("diskdrives-ch2", | ||
4615 | adapter->controller_proc_dir_entry); | ||
4616 | remove_proc_entry("diskdrives-ch3", | ||
4617 | adapter->controller_proc_dir_entry); | ||
4618 | |||
4619 | remove_proc_entry("raiddrives-0-9", | ||
4620 | adapter->controller_proc_dir_entry); | ||
4621 | remove_proc_entry("raiddrives-10-19", | ||
4622 | adapter->controller_proc_dir_entry); | ||
4623 | remove_proc_entry("raiddrives-20-29", | ||
4624 | adapter->controller_proc_dir_entry); | ||
4625 | remove_proc_entry("raiddrives-30-39", | ||
4626 | adapter->controller_proc_dir_entry); | ||
4627 | #endif | ||
4628 | { | ||
4629 | char buf[12] = { 0 }; | ||
4630 | sprintf(buf, "hba%d", adapter->host->host_no); | ||
4631 | remove_proc_entry(buf, mega_proc_dir_entry); | ||
4632 | } | ||
4633 | } | ||
4634 | #endif | ||
4635 | 4567 | ||
4636 | pci_free_consistent(adapter->dev, MEGA_BUFFER_SIZE, | 4568 | pci_free_consistent(adapter->dev, MEGA_BUFFER_SIZE, |
4637 | adapter->mega_buffer, adapter->buf_dma_handle); | 4569 | adapter->mega_buffer, adapter->buf_dma_handle); |
diff --git a/drivers/scsi/megaraid.h b/drivers/scsi/megaraid.h index 21eba2fd465a..18e85d9267ff 100644 --- a/drivers/scsi/megaraid.h +++ b/drivers/scsi/megaraid.h | |||
@@ -814,18 +814,6 @@ typedef struct { | |||
814 | 814 | ||
815 | #ifdef CONFIG_PROC_FS | 815 | #ifdef CONFIG_PROC_FS |
816 | struct proc_dir_entry *controller_proc_dir_entry; | 816 | struct proc_dir_entry *controller_proc_dir_entry; |
817 | struct proc_dir_entry *proc_read; | ||
818 | struct proc_dir_entry *proc_stat; | ||
819 | struct proc_dir_entry *proc_mbox; | ||
820 | |||
821 | #if MEGA_HAVE_ENH_PROC | ||
822 | struct proc_dir_entry *proc_rr; | ||
823 | struct proc_dir_entry *proc_battery; | ||
824 | #define MAX_PROC_CHANNELS 4 | ||
825 | struct proc_dir_entry *proc_pdrvstat[MAX_PROC_CHANNELS]; | ||
826 | struct proc_dir_entry *proc_rdrvstat[MAX_PROC_CHANNELS]; | ||
827 | #endif | ||
828 | |||
829 | #endif | 817 | #endif |
830 | 818 | ||
831 | int has_64bit_addr; /* are we using 64-bit addressing */ | 819 | int has_64bit_addr; /* are we using 64-bit addressing */ |