hysdn: stash pointer to card into proc_dir_entry->data
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 28 Mar 2013 22:56:21 +0000 (18:56 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 9 Apr 2013 18:13:04 +0000 (14:13 -0400)
no need to search later - we know the card when we are
creating procfs entries

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
drivers/isdn/hysdn/hysdn_procconf.c
drivers/isdn/hysdn/hysdn_proclog.c

index 8023d2510fbaba2f6bc80bd291bc6cf56ef566f2..dc88bcb250294b3034c02533390f981fd9ddb461 100644 (file)
@@ -229,23 +229,12 @@ static int
 hysdn_conf_open(struct inode *ino, struct file *filep)
 {
        hysdn_card *card;
-       struct proc_dir_entry *pd;
        struct conf_writedata *cnf;
        char *cp, *tmp;
 
        /* now search the addressed card */
        mutex_lock(&hysdn_conf_mutex);
-       card = card_root;
-       while (card) {
-               pd = card->procconf;
-               if (pd == PDE(ino))
-                       break;
-               card = card->next;      /* search next entry */
-       }
-       if (!card) {
-               mutex_unlock(&hysdn_conf_mutex);
-               return (-ENODEV);       /* device is unknown/invalid */
-       }
+       card = PDE(ino)->data;
        if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
                hysdn_addlog(card, "config open for uid=%d gid=%d mode=0x%x",
                             filep->f_cred->fsuid, filep->f_cred->fsgid,
@@ -317,21 +306,9 @@ hysdn_conf_close(struct inode *ino, struct file *filep)
        hysdn_card *card;
        struct conf_writedata *cnf;
        int retval = 0;
-       struct proc_dir_entry *pd;
 
        mutex_lock(&hysdn_conf_mutex);
-       /* search the addressed card */
-       card = card_root;
-       while (card) {
-               pd = card->procconf;
-               if (pd == PDE(ino))
-                       break;
-               card = card->next;      /* search next entry */
-       }
-       if (!card) {
-               mutex_unlock(&hysdn_conf_mutex);
-               return (-ENODEV);       /* device is unknown/invalid */
-       }
+       card = PDE(ino)->data;
        if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
                hysdn_addlog(card, "config close for uid=%d gid=%d mode=0x%x",
                             filep->f_cred->fsuid, filep->f_cred->fsgid,
@@ -394,10 +371,11 @@ hysdn_procconf_init(void)
        while (card) {
 
                sprintf(conf_name, "%s%d", PROC_CONF_BASENAME, card->myid);
-               if ((card->procconf = (void *) proc_create(conf_name,
+               if ((card->procconf = (void *) proc_create_data(conf_name,
                                                           S_IFREG | S_IRUGO | S_IWUSR,
                                                           hysdn_proc_entry,
-                                                          &conf_fops)) != NULL) {
+                                                          &conf_fops,
+                                                          card)) != NULL) {
                        hysdn_proclog_init(card);       /* init the log file entry */
                }
                card = card->next;      /* next entry */
index 9a3ce93665c5e09b56ad9f633b036f264e8681f5..22f0e4ef1fb1f10402a9a00873a538947f1de0d0 100644 (file)
@@ -173,27 +173,14 @@ hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t *off)
 {
        struct log_data *inf;
        int len;
-       struct proc_dir_entry *pde = PDE(file_inode(file));
-       struct procdata *pd = NULL;
-       hysdn_card *card;
+       hysdn_card *card = PDE(file_inode(file))->data;
 
        if (!*((struct log_data **) file->private_data)) {
+               struct procdata *pd = card->proclog;
                if (file->f_flags & O_NONBLOCK)
                        return (-EAGAIN);
 
-               /* sorry, but we need to search the card */
-               card = card_root;
-               while (card) {
-                       pd = card->proclog;
-                       if (pd->log == pde)
-                               break;
-                       card = card->next;      /* search next entry */
-               }
-               if (card)
-                       interruptible_sleep_on(&(pd->rd_queue));
-               else
-                       return (-EAGAIN);
-
+               interruptible_sleep_on(&(pd->rd_queue));
        }
        if (!(inf = *((struct log_data **) file->private_data)))
                return (0);
@@ -215,27 +202,15 @@ hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t *off)
 static int
 hysdn_log_open(struct inode *ino, struct file *filep)
 {
-       hysdn_card *card;
-       struct procdata *pd = NULL;
-       unsigned long flags;
+       hysdn_card *card = PDE(ino)->data;
 
        mutex_lock(&hysdn_log_mutex);
-       card = card_root;
-       while (card) {
-               pd = card->proclog;
-               if (pd->log == PDE(ino))
-                       break;
-               card = card->next;      /* search next entry */
-       }
-       if (!card) {
-               mutex_unlock(&hysdn_log_mutex);
-               return (-ENODEV);       /* device is unknown/invalid */
-       }
-       filep->private_data = card;     /* remember our own card */
-
        if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) {
                /* write only access -> write log level only */
+               filep->private_data = card;     /* remember our own card */
        } else if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) {
+               struct procdata *pd = card->proclog;
+               unsigned long flags;
 
                /* read access -> log/debug read */
                spin_lock_irqsave(&card->hysdn_lock, flags);
@@ -275,21 +250,13 @@ hysdn_log_close(struct inode *ino, struct file *filep)
        } else {
                /* read access -> log/debug read, mark one further file as closed */
 
-               pd = NULL;
                inf = *((struct log_data **) filep->private_data);      /* get first log entry */
                if (inf)
                        pd = (struct procdata *) inf->proc_ctrl;        /* still entries there */
                else {
                        /* no info available -> search card */
-                       card = card_root;
-                       while (card) {
-                               pd = card->proclog;
-                               if (pd->log == PDE(ino))
-                                       break;
-                               card = card->next;      /* search next entry */
-                       }
-                       if (card)
-                               pd = card->proclog;     /* pointer to procfs log */
+                       card = PDE(file_inode(filep))->data;
+                       pd = card->proclog;     /* pointer to procfs log */
                }
                if (pd)
                        pd->if_used--;  /* decrement interface usage count by one */
@@ -319,24 +286,12 @@ static unsigned int
 hysdn_log_poll(struct file *file, poll_table *wait)
 {
        unsigned int mask = 0;
-       struct proc_dir_entry *pde = PDE(file_inode(file));
-       hysdn_card *card;
-       struct procdata *pd = NULL;
+       hysdn_card *card = PDE(file_inode(file))->data;
+       struct procdata *pd = card->proclog;
 
        if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE)
                return (mask);  /* no polling for write supported */
 
-       /* we need to search the card */
-       card = card_root;
-       while (card) {
-               pd = card->proclog;
-               if (pd->log == pde)
-                       break;
-               card = card->next;      /* search next entry */
-       }
-       if (!card)
-               return (mask);  /* card not found */
-
        poll_wait(file, &(pd->rd_queue), wait);
 
        if (*((struct log_data **) file->private_data))
@@ -373,9 +328,9 @@ hysdn_proclog_init(hysdn_card *card)
 
        if ((pd = kzalloc(sizeof(struct procdata), GFP_KERNEL)) != NULL) {
                sprintf(pd->log_name, "%s%d", PROC_LOG_BASENAME, card->myid);
-               pd->log = proc_create(pd->log_name,
+               pd->log = proc_create_data(pd->log_name,
                                      S_IFREG | S_IRUGO | S_IWUSR, hysdn_proc_entry,
-                                     &log_fops);
+                                     &log_fops, card);
 
                init_waitqueue_head(&(pd->rd_queue));