* [PATCH] staging:dgnc:Creating and destroying sysfs files properly
@ 2015-12-18 9:13 Salah Triki
2015-12-18 9:50 ` kbuild test robot
0 siblings, 1 reply; 2+ messages in thread
From: Salah Triki @ 2015-12-18 9:13 UTC (permalink / raw)
To: gregkh, dan.carpenter; +Cc: lidza.louina, salah.triki, driverdev-devel, devel
Delegate creation and destruction of sysfs files to device
and driver layers in order to eliminate races.
Signed-off-by: Salah Triki <salah.triki@acm.org>
---
drivers/staging/dgnc/dgnc_driver.c | 11 ++--
drivers/staging/dgnc/dgnc_sysfs.c | 118 ++++++++++++++-----------------------
drivers/staging/dgnc/dgnc_sysfs.h | 10 +---
drivers/staging/dgnc/dgnc_tty.c | 10 ++--
4 files changed, 54 insertions(+), 95 deletions(-)
diff --git a/drivers/staging/dgnc/dgnc_driver.c b/drivers/staging/dgnc/dgnc_driver.c
index fc6d298..cbfa412 100644
--- a/drivers/staging/dgnc/dgnc_driver.c
+++ b/drivers/staging/dgnc/dgnc_driver.c
@@ -142,14 +142,11 @@ static void dgnc_cleanup_module(void)
/* Turn off poller right away. */
del_timer_sync(&dgnc_poll_timer);
- dgnc_remove_driver_sysfiles(&dgnc_driver);
-
device_destroy(dgnc_class, MKDEV(dgnc_Major, 0));
class_destroy(dgnc_class);
unregister_chrdev(dgnc_Major, "dgnc");
for (i = 0; i < dgnc_NumBoards; ++i) {
- dgnc_remove_ports_sysfiles(dgnc_Board[i]);
dgnc_tty_uninit(dgnc_Board[i]);
dgnc_cleanup_board(dgnc_Board[i]);
}
@@ -180,6 +177,8 @@ static int __init dgnc_init_module(void)
/*
* Find and configure all the cards
*/
+ dgnc_driver.driver.groups = dgnc_drv_attr_groups;
+
rc = pci_register_driver(&dgnc_driver);
/*
@@ -193,8 +192,6 @@ static int __init dgnc_init_module(void)
pr_warn("WARNING: dgnc driver load failed. No Digi Neo or Classic boards found.\n");
dgnc_cleanup_module();
- } else {
- dgnc_create_driver_sysfiles(&dgnc_driver);
}
return rc;
@@ -281,6 +278,8 @@ static int dgnc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
int rc;
/* wake up and enable device */
+ pdev->dev.groups = dgnc_dev_attr_groups;
+
rc = pci_enable_device(pdev);
if (rc < 0) {
@@ -554,8 +553,6 @@ static int dgnc_found_board(struct pci_dev *pdev, int id)
brd->state = BOARD_READY;
brd->dpastatus = BD_RUNNING;
- dgnc_create_ports_sysfiles(brd);
-
/* init our poll helper tasklet */
tasklet_init(&brd->helper_tasklet,
brd->bd_ops->tasklet,
diff --git a/drivers/staging/dgnc/dgnc_sysfs.c b/drivers/staging/dgnc/dgnc_sysfs.c
index 74a0725..f4ed459 100644
--- a/drivers/staging/dgnc/dgnc_sysfs.c
+++ b/drivers/staging/dgnc/dgnc_sysfs.c
@@ -24,6 +24,7 @@
#include "dgnc_driver.h"
#include "dgnc_mgmt.h"
+#include "dgnc_sysfs.h"
static ssize_t dgnc_driver_version_show(struct device_driver *ddp, char *buf)
{
@@ -68,28 +69,22 @@ static ssize_t dgnc_driver_pollrate_store(struct device_driver *ddp,
static DRIVER_ATTR(pollrate, (S_IRUSR | S_IWUSR), dgnc_driver_pollrate_show,
dgnc_driver_pollrate_store);
-void dgnc_create_driver_sysfiles(struct pci_driver *dgnc_driver)
-{
- int rc = 0;
- struct device_driver *driverfs = &dgnc_driver->driver;
-
- rc |= driver_create_file(driverfs, &driver_attr_version);
- rc |= driver_create_file(driverfs, &driver_attr_boards);
- rc |= driver_create_file(driverfs, &driver_attr_maxboards);
- rc |= driver_create_file(driverfs, &driver_attr_pollrate);
- if (rc)
- pr_err("DGNC: sysfs driver_create_file failed!\n");
-}
+static struct attribute *dgnc_drv_attrs[] = {
+ &driver_attr_version.attr,
+ &driver_attr_boards.attr,
+ &driver_attr_maxboards.attr,
+ &driver_attr_pollrate.attr,
+ NULL,
+};
-void dgnc_remove_driver_sysfiles(struct pci_driver *dgnc_driver)
-{
- struct device_driver *driverfs = &dgnc_driver->driver;
+static struct attribute_group dgnc_drv_attr_group = {
+ .attrs = dgnc_drv_attrs,
+};
- driver_remove_file(driverfs, &driver_attr_version);
- driver_remove_file(driverfs, &driver_attr_boards);
- driver_remove_file(driverfs, &driver_attr_maxboards);
- driver_remove_file(driverfs, &driver_attr_pollrate);
-}
+struct attribute_group *dgnc_drv_attr_groups[] = {
+ &dgnc_drv_attr_group,
+ NULL,
+};
#define DGNC_VERIFY_BOARD(p, bd) \
do { \
@@ -338,43 +333,31 @@ static DEVICE_ATTR(ports_txcount, S_IRUSR, dgnc_ports_txcount_show, NULL);
/* this function creates the sys files that will export each signal status
* to sysfs each value will be put in a separate filename
*/
-void dgnc_create_ports_sysfiles(struct dgnc_board *bd)
-{
- int rc = 0;
-
- dev_set_drvdata(&bd->pdev->dev, bd);
- rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_state);
- rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_baud);
- rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_msignals);
- rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_iflag);
- rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_cflag);
- rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_oflag);
- rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_lflag);
- rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_digi_flag);
- rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_rxcount);
- rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_txcount);
- rc |= device_create_file(&bd->pdev->dev, &dev_attr_vpd);
- rc |= device_create_file(&bd->pdev->dev, &dev_attr_serial_number);
- if (rc)
- dev_err(&bd->pdev->dev, "dgnc: sysfs device_create_file failed!\n");
-}
-/* removes all the sys files created for that port */
-void dgnc_remove_ports_sysfiles(struct dgnc_board *bd)
-{
- device_remove_file(&bd->pdev->dev, &dev_attr_ports_state);
- device_remove_file(&bd->pdev->dev, &dev_attr_ports_baud);
- device_remove_file(&bd->pdev->dev, &dev_attr_ports_msignals);
- device_remove_file(&bd->pdev->dev, &dev_attr_ports_iflag);
- device_remove_file(&bd->pdev->dev, &dev_attr_ports_cflag);
- device_remove_file(&bd->pdev->dev, &dev_attr_ports_oflag);
- device_remove_file(&bd->pdev->dev, &dev_attr_ports_lflag);
- device_remove_file(&bd->pdev->dev, &dev_attr_ports_digi_flag);
- device_remove_file(&bd->pdev->dev, &dev_attr_ports_rxcount);
- device_remove_file(&bd->pdev->dev, &dev_attr_ports_txcount);
- device_remove_file(&bd->pdev->dev, &dev_attr_vpd);
- device_remove_file(&bd->pdev->dev, &dev_attr_serial_number);
-}
+static struct attribute *dgnc_dev_attrs[] = {
+ &dev_attr_ports_state.attr,
+ &dev_attr_ports_baud.attr,
+ &dev_attr_ports_msignals.attr,
+ &dev_attr_ports_iflag.attr,
+ &dev_attr_ports_cflag.attr,
+ &dev_attr_ports_oflag.attr,
+ &dev_attr_ports_lflag.attr,
+ &dev_attr_ports_digi_flag.attr,
+ &dev_attr_ports_rxcount.attr,
+ &dev_attr_ports_txcount.attr,
+ &dev_attr_vpd.attr,
+ &dev_attr_serial_number.attr,
+ NULL,
+};
+
+static struct attribute_group dgnc_dev_attr_group = {
+ .attrs = dgnc_dev_attrs,
+};
+
+struct attribute_group *dgnc_dev_attr_groups[] = {
+ &dgnc_dev_attr_group,
+ NULL,
+};
static ssize_t dgnc_tty_state_show(struct device *d,
struct device_attribute *attr, char *buf)
@@ -683,22 +666,7 @@ static struct attribute_group dgnc_tty_attribute_group = {
.attrs = dgnc_sysfs_tty_entries,
};
-void dgnc_create_tty_sysfs(struct un_t *un, struct device *c)
-{
- int ret;
-
- ret = sysfs_create_group(&c->kobj, &dgnc_tty_attribute_group);
- if (ret) {
- dev_err(c, "dgnc: failed to create sysfs tty device attributes.\n");
- sysfs_remove_group(&c->kobj, &dgnc_tty_attribute_group);
- return;
- }
-
- dev_set_drvdata(c, un);
-}
-
-void dgnc_remove_tty_sysfs(struct device *c)
-{
- sysfs_remove_group(&c->kobj, &dgnc_tty_attribute_group);
-}
-
+struct attribute_group *dgnc_tty_attr_groups[] = {
+ &dgnc_tty_attribute_group,
+ NULL,
+};
diff --git a/drivers/staging/dgnc/dgnc_sysfs.h b/drivers/staging/dgnc/dgnc_sysfs.h
index 7be7d55..8ec7b7c 100644
--- a/drivers/staging/dgnc/dgnc_sysfs.h
+++ b/drivers/staging/dgnc/dgnc_sysfs.h
@@ -25,16 +25,12 @@ struct un_t;
struct pci_driver;
struct class_device;
-void dgnc_create_ports_sysfiles(struct dgnc_board *bd);
-void dgnc_remove_ports_sysfiles(struct dgnc_board *bd);
+extern struct attribute_group *dgnc_drv_attr_groups[];
+extern struct attribute_group *dgnc_dev_attr_groups[];
+extern struct attribute_group *dgnc_tty_attr_groups[];
-void dgnc_create_driver_sysfiles(struct pci_driver *);
-void dgnc_remove_driver_sysfiles(struct pci_driver *);
int dgnc_tty_class_init(void);
int dgnc_tty_class_destroy(void);
-void dgnc_create_tty_sysfs(struct un_t *un, struct device *c);
-void dgnc_remove_tty_sysfs(struct device *c);
-
#endif
diff --git a/drivers/staging/dgnc/dgnc_tty.c b/drivers/staging/dgnc/dgnc_tty.c
index 48e4b90..9ebee55 100644
--- a/drivers/staging/dgnc/dgnc_tty.c
+++ b/drivers/staging/dgnc/dgnc_tty.c
@@ -367,12 +367,14 @@ int dgnc_tty_init(struct dgnc_board *brd)
classp = tty_register_device(&brd->SerialDriver, i,
&ch->ch_bd->pdev->dev);
ch->ch_tun.un_sysfs = classp;
- dgnc_create_tty_sysfs(&ch->ch_tun, classp);
+ classp->groups = dgnc_tty_attr_groups;
+ dev_set_drvdata(classp, &ch->ch_tun);
classp = tty_register_device(&brd->PrintDriver, i,
&ch->ch_bd->pdev->dev);
ch->ch_pun.un_sysfs = classp;
- dgnc_create_tty_sysfs(&ch->ch_pun, classp);
+ classp->groups = dgnc_tty_attr_groups;
+ dev_set_drvdata(classp, &ch->ch_pun);
}
}
@@ -412,8 +414,6 @@ void dgnc_tty_uninit(struct dgnc_board *brd)
brd->dgnc_Serial_Major = 0;
for (i = 0; i < brd->nasync; i++) {
if (brd->channels[i])
- dgnc_remove_tty_sysfs(brd->channels[i]->
- ch_tun.un_sysfs);
tty_unregister_device(&brd->SerialDriver, i);
}
tty_unregister_driver(&brd->SerialDriver);
@@ -425,8 +425,6 @@ void dgnc_tty_uninit(struct dgnc_board *brd)
brd->dgnc_TransparentPrint_Major = 0;
for (i = 0; i < brd->nasync; i++) {
if (brd->channels[i])
- dgnc_remove_tty_sysfs(brd->channels[i]->
- ch_pun.un_sysfs);
tty_unregister_device(&brd->PrintDriver, i);
}
tty_unregister_driver(&brd->PrintDriver);
--
1.9.1
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] staging:dgnc:Creating and destroying sysfs files properly
2015-12-18 9:13 [PATCH] staging:dgnc:Creating and destroying sysfs files properly Salah Triki
@ 2015-12-18 9:50 ` kbuild test robot
0 siblings, 0 replies; 2+ messages in thread
From: kbuild test robot @ 2015-12-18 9:50 UTC (permalink / raw)
To: Salah Triki
Cc: devel, gregkh, driverdev-devel, kbuild-all, lidza.louina, dan.carpenter
[-- Attachment #1: Type: text/plain, Size: 2256 bytes --]
Hi Salah,
[auto build test WARNING on staging/staging-testing]
[also build test WARNING on v4.4-rc5 next-20151217]
url: https://github.com/0day-ci/linux/commits/Salah-Triki/staging-dgnc-Creating-and-destroying-sysfs-files-properly/20151218-171643
config: i386-randconfig-i0-201550 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
All warnings (new ones prefixed by >>):
drivers/staging/dgnc/dgnc_driver.c: In function 'dgnc_init_module':
>> drivers/staging/dgnc/dgnc_driver.c:180:28: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
dgnc_driver.driver.groups = dgnc_drv_attr_groups;
^
drivers/staging/dgnc/dgnc_driver.c: In function 'dgnc_init_one':
drivers/staging/dgnc/dgnc_driver.c:281:19: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
pdev->dev.groups = dgnc_dev_attr_groups;
^
--
drivers/staging/dgnc/dgnc_tty.c: In function 'dgnc_tty_init':
>> drivers/staging/dgnc/dgnc_tty.c:370:19: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
classp->groups = dgnc_tty_attr_groups;
^
drivers/staging/dgnc/dgnc_tty.c:376:19: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
classp->groups = dgnc_tty_attr_groups;
^
vim +180 drivers/staging/dgnc/dgnc_driver.c
164 */
165 static int __init dgnc_init_module(void)
166 {
167 int rc;
168
169 /*
170 * Initialize global stuff
171 */
172 rc = dgnc_start();
173
174 if (rc < 0)
175 return rc;
176
177 /*
178 * Find and configure all the cards
179 */
> 180 dgnc_driver.driver.groups = dgnc_drv_attr_groups;
181
182 rc = pci_register_driver(&dgnc_driver);
183
184 /*
185 * If something went wrong in the scan, bail out of driver.
186 */
187 if (rc < 0) {
188 /* Only unregister if it was actually registered. */
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 24434 bytes --]
[-- Attachment #3: Type: text/plain, Size: 169 bytes --]
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-12-18 9:51 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-18 9:13 [PATCH] staging:dgnc:Creating and destroying sysfs files properly Salah Triki
2015-12-18 9:50 ` kbuild test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.