]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/isdn/hysdn/hysdn_proclog.c
procfs: new helper - PDE_DATA(inode)
[mirror_ubuntu-bionic-kernel.git] / drivers / isdn / hysdn / hysdn_proclog.c
index 9a3ce93665c5e09b56ad9f633b036f264e8681f5..b61e8d5e84ad022e566f5bfa191ddcb392f3df7b 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_DATA(file_inode(file));
 
        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_DATA(ino);
 
        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_DATA(file_inode(filep));
+                       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_DATA(file_inode(file));
+       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));