Patch 5/5

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Patch 5/5

Lino Sanfilippo

This is a patch from Philipp Rosenberger.

It is not a bugfix but implements polling for dazukofs.
(Although I know that new features are not welcome until dazukofs
is mainline, this one might be useful).


Geschäftsführender Gesellschafter: Tjark Auerbach
Sitz der Gesellschaft: Tettnang
Handelsregister: Amtsgericht Ulm, HRB 630992
ALLGEMEINE GESCHÄFTSBEDINGUNGEN
Es gelten unsere Allgemeinen Geschäftsbedingungen
(AGB). Sie finden sie in der jeweils gültigen Fassung
im Internet unter http://www.avira.de/agb
***************************************************

diff -Nurp dazukofs-3.1.3-patch4/event.c dazukofs-3.1.3-patch5/event.c
--- dazukofs-3.1.3-patch4/event.c 2010-07-08 18:10:41.000000000 +0200
+++ dazukofs-3.1.3-patch5/event.c 2010-07-08 18:18:40.000000000 +0200
@@ -27,6 +27,7 @@
 #include <linux/cred.h>
 #include <linux/pid.h>
 #include <linux/slab.h>
+#include <linux/poll.h>
 
 #include "event.h"
 #include "dev.h"
@@ -357,6 +358,7 @@ static struct dazukofs_group *__create_g
  }
  grp->name_length = strlen(name);
  init_waitqueue_head(&grp->queue);
+ init_waitqueue_head(&grp->poll_queue);
  INIT_LIST_HEAD(&grp->todo_list.list);
  INIT_LIST_HEAD(&grp->working_list.list);
  if (track)
@@ -641,11 +643,11 @@ assign_event_to_groups(struct dazukofs_e
 
  /* notify someone to handle the event */
  wake_up(&grp->queue);
-
+ wake_up(&grp->poll_queue);
+
  i++;
  }
  }
-
  mutex_unlock(&evt->assigned_mutex);
  mutex_unlock(&work_mutex);
 }
@@ -872,6 +874,7 @@ void set_event_pending(struct dazukofs_g
 {
  mutex_lock(&work_mutex);
  list_add(&ec->list, &grp->working_list.list);
+ wake_up(&grp->poll_queue);
  mutex_unlock(&work_mutex);
 }
 
@@ -989,7 +992,7 @@ error_out1:
 }
 
 /**
- * is_event_available - check if an event is available for processing
+ * event_on_todo_list - check if an event is available for processing
  * @grp: the group
  *
  * Description: This function simply checks if there are any events posted
@@ -997,7 +1000,7 @@ error_out1:
  *
  * Returns 0 if there are no events in the todo list.
  */
-static int is_event_available(struct dazukofs_group *grp)
+static int event_on_todo_list(struct dazukofs_group *grp)
 {
  int ret = 0;
 
@@ -1009,6 +1012,27 @@ static int is_event_available(struct daz
  return ret;
 }
 
+/**
+ * event_on_working_list - check if an event is available for processing
+ * @grp: the group
+ *
+ * Description: This function simply checks if there are any events posted
+ * in the group's todo list.
+ *
+ * Returns 0 if there are no events in the todo list.
+ */
+static int event_on_working_list(struct dazukofs_group *grp)
+{
+ int ret = 0;
+
+ mutex_lock(&work_mutex);
+ if (!list_empty(&grp->working_list.list))
+ ret = 1;
+ mutex_unlock(&work_mutex);
+
+ return ret;
+}
+
  * dazukofs_get_event - get an event to process
  * @group_id: id of the group we belong to
  * @event_id: to be filled in with the new event id
@@ -1046,7 +1070,7 @@ int dazukofs_get_event(unsigned long gro
 
  while (1) {
  ret = wait_event_freezable(grp->queue,
-   is_event_available(grp) ||
+   event_on_todo_list(grp) ||
    grp->deprecated);
  if (ret != 0)
  break;
@@ -1078,8 +1102,41 @@ int dazukofs_get_event(unsigned long gro
  atomic_dec(&grp->use_count);
  return ret;
  }
-
  *pgrp = grp;
  *pec = ec;
  return 0;
 }
+
+void dazukofs_do_poll(unsigned long group_id, struct file *dev_file,
+                      poll_table *wait, unsigned int *mask)
+{
+ struct dazukofs_group *grp = NULL;
+ struct list_head *pos;
+ int found = 0;
+
+ mutex_lock(&work_mutex);
+ list_for_each(pos, &group_list.list) {
+ grp = list_entry(pos, struct dazukofs_group, list);
+ if (!grp->deprecated && grp->group_id == group_id) {
+ atomic_inc(&grp->use_count);
+ found = 1;
+ break;
+ }
+ }
+ mutex_unlock(&work_mutex);
+
+ if (!found) {
+ *mask = POLLERR; /* is this correct ? */
+ return;
+ }
+
+ poll_wait(dev_file, &grp->poll_queue, wait);
+ if (event_on_todo_list(grp))
+ *mask = POLLIN | POLLRDNORM;
+ if (event_on_working_list(grp))
+ *mask = POLLOUT | POLLWRNORM;
+
+ atomic_dec(&grp->use_count);
+ return;
+}
+
diff -Nurp dazukofs-3.1.3-patch4/event.h dazukofs-3.1.3-patch5/event.h
--- dazukofs-3.1.3-patch4/event.h 2010-07-08 16:39:46.000000000 +0200
+++ dazukofs-3.1.3-patch5/event.h 2010-07-08 16:40:18.000000000 +0200
@@ -23,6 +23,7 @@
 
 #include <linux/list.h>
 #include <linux/wait.h>
+#include <linux/poll.h>
 
 
 struct dazukofs_event {
@@ -54,6 +55,7 @@ struct dazukofs_group {
  unsigned long group_id;
  struct dazukofs_event_container todo_list;
  wait_queue_head_t queue;
+ wait_queue_head_t poll_queue;
  struct dazukofs_event_container working_list;
  atomic_t use_count;
  int tracking;
@@ -64,6 +66,8 @@ struct dazukofs_group {
 extern int dazukofs_init_events(void);
 extern void dazukofs_destroy_events(void);
 
+extern void dazukofs_do_poll(unsigned long group_id, struct file *dev_file,
+                      poll_table *wait, unsigned int *mask);
 extern void set_event_pending(struct dazukofs_group *grp,
                        struct dazukofs_event_container *ec);
 extern void unclaim_event(struct dazukofs_group *grp,
diff -Nurp dazukofs-3.1.3-patch4/group_dev.c dazukofs-3.1.3-patch5/group_dev.c
--- dazukofs-3.1.3-patch4/group_dev.c 2010-07-08 15:30:19.000000000 +0200
+++ dazukofs-3.1.3-patch5/group_dev.c 2010-07-08 16:42:59.000000000 +0200
@@ -22,6 +22,7 @@
 #include <linux/fs.h>
 #include <linux/cdev.h>
 #include <linux/uaccess.h>
+#include <linux/poll.h>
 
 #include "dazukofs_fs.h"
 #include "event.h"
@@ -137,6 +138,15 @@ static ssize_t dazukofs_group_write(int
  return ret;
 }
 
+static unsigned int dazukofs_group_poll(int group_id, struct file *file,
+ poll_table *wait)
+{
+ unsigned int mask = 0;
+ dazukofs_do_poll(group_id, file, wait, &mask);
+ return mask;
+}
+
+
 #define DECLARE_GROUP_FOPS(group_id) \
 static int \
 dazukofs_group_open_##group_id(struct inode *inode, struct file *file) \
@@ -161,6 +171,11 @@ dazukofs_group_write_##group_id(struct f
 { \
  return dazukofs_group_write(group_id, file, buffer, length, pos); \
 } \
+static unsigned int \
+dazukofs_group_poll_##group_id(struct file *file, poll_table *wait) \
+{ \
+ return dazukofs_group_poll(group_id, file, wait); \
+} \
 static const struct file_operations group_fops_##group_id = { \
  .owner = THIS_MODULE, \
  .open = dazukofs_group_open_##group_id, \
@@ -168,6 +183,7 @@ static const struct file_operations grou
  .read = dazukofs_group_read_##group_id, \
  .write = dazukofs_group_write_##group_id, \
  .llseek = no_llseek, \
+ .poll = dazukofs_group_poll_##group_id, \
 };
 
 DECLARE_GROUP_FOPS(0)

_______________________________________________
Dazuko-devel mailing list
[hidden email]
http://lists.nongnu.org/mailman/listinfo/dazuko-devel
Reply | Threaded
Open this post in threaded view
|

Re: Patch 5/5

John Ogness-10
On 2010-07-08, Lino Sanfilippo <[hidden email]> wrote:
> This is a patch from Philipp Rosenberger.
>
> It is not a bugfix but implements polling for dazukofs.  (Although I
> know that new features are not welcome until dazukofs is mainline,
> this one might be useful).

Thanks. This patch is partially included in 3.1.4-rc1. I chose not to
support polling for writing. The only usefulness of that would be to
test if DazukoFS is waiting for a response. But why would that be
useful?

On the other hand, I see a lot of use in polling for when an event is
available. This part of the patch was included.

John Ogness

--
Dazuko Maintainer

_______________________________________________
Dazuko-devel mailing list
[hidden email]
http://lists.nongnu.org/mailman/listinfo/dazuko-devel