aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2018-04-13 14:57:56 -0400
committerChristoph Hellwig <hch@lst.de>2018-05-16 01:24:30 -0400
commitf7680bec0456403b4d3d7720e00b95586a7bc26b (patch)
treeb43eb7c33b024ad713ed8ec1fc230a8209f22207
parent978547c5fbc10775be3b561a3ce7e1e90612b9c8 (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.c140
-rw-r--r--drivers/scsi/megaraid.h12
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 */
2738static 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
2746static 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 */
2756struct mega_proc_file {
2757 const char *name;
2758 unsigned short ptr_offset;
2759 int (*show) (struct seq_file *m, void *v);
2760};
2761
2762static 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[] = {
2788static void 2741static void
2789mega_create_proc_entry(int index, struct proc_dir_entry *parent) 2742mega_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 */