aboutsummaryrefslogtreecommitdiff
path: root/drivers/staging/dgrp
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/dgrp')
-rw-r--r--drivers/staging/dgrp/dgrp_common.h2
-rw-r--r--drivers/staging/dgrp/dgrp_dpa_ops.c3
-rw-r--r--drivers/staging/dgrp/dgrp_driver.c6
-rw-r--r--drivers/staging/dgrp/dgrp_mon_ops.c2
-rw-r--r--drivers/staging/dgrp/dgrp_net_ops.c4
-rw-r--r--drivers/staging/dgrp/dgrp_ports_ops.c2
-rw-r--r--drivers/staging/dgrp/dgrp_specproc.c6
-rw-r--r--drivers/staging/dgrp/dgrp_sysfs.c30
8 files changed, 41 insertions, 14 deletions
diff --git a/drivers/staging/dgrp/dgrp_common.h b/drivers/staging/dgrp/dgrp_common.h
index 0583fe9c7b0..2832b8e26c4 100644
--- a/drivers/staging/dgrp/dgrp_common.h
+++ b/drivers/staging/dgrp/dgrp_common.h
@@ -66,7 +66,7 @@ extern void dgrp_register_dpa_hook(struct proc_dir_entry *de);
extern void dgrp_dpa_data(struct nd_struct *, int, u8 *, int);
/* from dgrp_sysfs.c */
-extern void dgrp_create_class_sysfs_files(void);
+extern int dgrp_create_class_sysfs_files(void);
extern void dgrp_remove_class_sysfs_files(void);
extern void dgrp_create_node_class_sysfs_files(struct nd_struct *nd);
diff --git a/drivers/staging/dgrp/dgrp_dpa_ops.c b/drivers/staging/dgrp/dgrp_dpa_ops.c
index 021cca498f2..ca10a3362e2 100644
--- a/drivers/staging/dgrp/dgrp_dpa_ops.c
+++ b/drivers/staging/dgrp/dgrp_dpa_ops.c
@@ -116,7 +116,7 @@ void dgrp_register_dpa_hook(struct proc_dir_entry *de)
struct nd_struct *node = de->data;
de->proc_iops = &dpa_inode_ops;
- de->proc_fops = &dpa_ops;
+ rcu_assign_pointer(de->proc_fops, &dpa_ops);
node->nd_dpa_de = de;
spin_lock_init(&node->nd_dpa_lock);
@@ -432,6 +432,7 @@ static long dgrp_dpa_ioctl(struct file *file, unsigned int cmd,
case DIGI_GETVPD:
+ memset(&vpd, 0, sizeof(vpd));
if (nd->nd_vpd_len > 0) {
vpd.vpd_len = nd->nd_vpd_len;
memcpy(&vpd.vpd_data, &nd->nd_vpd, nd->nd_vpd_len);
diff --git a/drivers/staging/dgrp/dgrp_driver.c b/drivers/staging/dgrp/dgrp_driver.c
index aa262588e9b..e456dc6cb36 100644
--- a/drivers/staging/dgrp/dgrp_driver.c
+++ b/drivers/staging/dgrp/dgrp_driver.c
@@ -66,6 +66,8 @@ module_exit(dgrp_cleanup_module);
*/
static int dgrp_init_module(void)
{
+ int ret;
+
INIT_LIST_HEAD(&nd_struct_list);
spin_lock_init(&dgrp_poll_data.poll_lock);
@@ -74,7 +76,9 @@ static int dgrp_init_module(void)
dgrp_poll_data.timer.function = dgrp_poll_handler;
dgrp_poll_data.timer.data = (unsigned long) &dgrp_poll_data;
- dgrp_create_class_sysfs_files();
+ ret = dgrp_create_class_sysfs_files();
+ if (ret)
+ return ret;
dgrp_register_proc();
diff --git a/drivers/staging/dgrp/dgrp_mon_ops.c b/drivers/staging/dgrp/dgrp_mon_ops.c
index 4792d056a36..b484fccb494 100644
--- a/drivers/staging/dgrp/dgrp_mon_ops.c
+++ b/drivers/staging/dgrp/dgrp_mon_ops.c
@@ -66,7 +66,7 @@ void dgrp_register_mon_hook(struct proc_dir_entry *de)
struct nd_struct *node = de->data;
de->proc_iops = &mon_inode_ops;
- de->proc_fops = &mon_ops;
+ rcu_assign_pointer(de->proc_fops, &mon_ops);
node->nd_mon_de = de;
sema_init(&node->nd_mon_semaphore, 1);
}
diff --git a/drivers/staging/dgrp/dgrp_net_ops.c b/drivers/staging/dgrp/dgrp_net_ops.c
index e6018823b9d..64f48ffb9d4 100644
--- a/drivers/staging/dgrp/dgrp_net_ops.c
+++ b/drivers/staging/dgrp/dgrp_net_ops.c
@@ -91,7 +91,7 @@ void dgrp_register_net_hook(struct proc_dir_entry *de)
struct nd_struct *node = de->data;
de->proc_iops = &net_inode_ops;
- de->proc_fops = &net_ops;
+ rcu_assign_pointer(de->proc_fops, &net_ops);
node->nd_net_de = de;
sema_init(&node->nd_net_semaphore, 1);
node->nd_state = NS_CLOSED;
@@ -3405,7 +3405,7 @@ static long dgrp_net_ioctl(struct file *file, unsigned int cmd,
if (size != sizeof(struct link_struct))
return -EINVAL;
- if (copy_from_user((void *)(&link), (void __user *) arg, size))
+ if (copy_from_user(&link, (void __user *)arg, size))
return -EFAULT;
if (link.lk_fast_rate < 9600)
diff --git a/drivers/staging/dgrp/dgrp_ports_ops.c b/drivers/staging/dgrp/dgrp_ports_ops.c
index cd1fc208862..f93dc1f262f 100644
--- a/drivers/staging/dgrp/dgrp_ports_ops.c
+++ b/drivers/staging/dgrp/dgrp_ports_ops.c
@@ -65,7 +65,7 @@ void dgrp_register_ports_hook(struct proc_dir_entry *de)
struct nd_struct *node = de->data;
de->proc_iops = &ports_inode_ops;
- de->proc_fops = &ports_ops;
+ rcu_assign_pointer(de->proc_fops, &ports_ops);
node->nd_ports_de = de;
}
diff --git a/drivers/staging/dgrp/dgrp_specproc.c b/drivers/staging/dgrp/dgrp_specproc.c
index 73f287f9660..d66712c8aa9 100644
--- a/drivers/staging/dgrp/dgrp_specproc.c
+++ b/drivers/staging/dgrp/dgrp_specproc.c
@@ -271,9 +271,11 @@ static void register_proc_table(struct dgrp_proc_entry *table,
if (!table->child) {
de->proc_iops = &proc_inode_ops;
if (table->proc_file_ops)
- de->proc_fops = table->proc_file_ops;
+ rcu_assign_pointer(de->proc_fops,
+ table->proc_file_ops);
else
- de->proc_fops = &dgrp_proc_file_ops;
+ rcu_assign_pointer(de->proc_fops,
+ &dgrp_proc_file_ops);
}
}
table->de = de;
diff --git a/drivers/staging/dgrp/dgrp_sysfs.c b/drivers/staging/dgrp/dgrp_sysfs.c
index be179adfb7c..7d1b36d1e75 100644
--- a/drivers/staging/dgrp/dgrp_sysfs.c
+++ b/drivers/staging/dgrp/dgrp_sysfs.c
@@ -85,30 +85,50 @@ static struct attribute_group dgrp_global_settings_attribute_group = {
-void dgrp_create_class_sysfs_files(void)
+int dgrp_create_class_sysfs_files(void)
{
int ret = 0;
int max_majors = 1U << (32 - MINORBITS);
dgrp_class = class_create(THIS_MODULE, "digi_realport");
+ if (IS_ERR(dgrp_class))
+ return PTR_ERR(dgrp_class);
ret = class_create_file(dgrp_class, &class_attr_driver_version);
+ if (ret)
+ goto err_class;
dgrp_class_global_settings_dev = device_create(dgrp_class, NULL,
MKDEV(0, max_majors + 1), NULL, "driver_settings");
-
+ if (IS_ERR(dgrp_class_global_settings_dev)) {
+ ret = PTR_ERR(dgrp_class_global_settings_dev);
+ goto err_file;
+ }
ret = sysfs_create_group(&dgrp_class_global_settings_dev->kobj,
&dgrp_global_settings_attribute_group);
if (ret) {
pr_alert("%s: failed to create sysfs global settings device attributes.\n",
__func__);
- sysfs_remove_group(&dgrp_class_global_settings_dev->kobj,
- &dgrp_global_settings_attribute_group);
- return;
+ goto err_dev1;
}
dgrp_class_nodes_dev = device_create(dgrp_class, NULL,
MKDEV(0, max_majors + 2), NULL, "nodes");
+ if (IS_ERR(dgrp_class_nodes_dev)) {
+ ret = PTR_ERR(dgrp_class_nodes_dev);
+ goto err_group;
+ }
+ return 0;
+err_group:
+ sysfs_remove_group(&dgrp_class_global_settings_dev->kobj,
+ &dgrp_global_settings_attribute_group);
+err_dev1:
+ device_destroy(dgrp_class, MKDEV(0, max_majors + 1));
+err_file:
+ class_remove_file(dgrp_class, &class_attr_driver_version);
+err_class:
+ class_destroy(dgrp_class);
+ return ret;
}