linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / fs / eventpoll.c
index 1b4491c..4284cd3 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/eventpoll.h>
 #include <linux/mount.h>
 #include <linux/bitops.h>
-#include <linux/mutex.h>
 #include <asm/uaccess.h>
 #include <asm/system.h>
 #include <asm/io.h>
@@ -47,7 +46,7 @@
  * LOCKING:
  * There are three level of locking required by epoll :
  *
- * 1) epmutex (mutex)
+ * 1) epsem (semaphore)
  * 2) ep->sem (rw_semaphore)
  * 3) ep->lock (rw_lock)
  *
@@ -68,9 +67,9 @@
  * if a file has been pushed inside an epoll set and it is then
  * close()d without a previous call toepoll_ctl(EPOLL_CTL_DEL).
  * It is possible to drop the "ep->sem" and to use the global
- * semaphore "epmutex" (together with "ep->lock") to have it working,
+ * semaphore "epsem" (together with "ep->lock") to have it working,
  * but having "ep->sem" will make the interface more scalable.
- * Events that require holding "epmutex" are very rare, while for
+ * Events that require holding "epsem" are very rare, while for
  * normal operations the epoll private "ep->sem" will guarantee
  * a greater scalability.
  */
@@ -275,22 +274,22 @@ static struct super_block *eventpollfs_get_sb(struct file_system_type *fs_type,
 /*
  * This semaphore is used to serialize ep_free() and eventpoll_release_file().
  */
-static struct mutex epmutex;
+static struct semaphore epsem;
 
 /* Safe wake up implementation */
 static struct poll_safewake psw;
 
 /* Slab cache used to allocate "struct epitem" */
-static kmem_cache_t *epi_cache __read_mostly;
+static kmem_cache_t *epi_cache;
 
 /* Slab cache used to allocate "struct eppoll_entry" */
-static kmem_cache_t *pwq_cache __read_mostly;
+static kmem_cache_t *pwq_cache;
 
 /* Virtual fs used to allocate inodes for eventpoll files */
-static struct vfsmount *eventpoll_mnt __read_mostly;
+static struct vfsmount *eventpoll_mnt;
 
 /* File callbacks that implement the eventpoll file behaviour */
-static const struct file_operations eventpoll_fops = {
+static struct file_operations eventpoll_fops = {
        .release        = ep_eventpoll_close,
        .poll           = ep_eventpoll_poll
 };
@@ -452,6 +451,15 @@ static void ep_poll_safewake(struct poll_safewake *psw, wait_queue_head_t *wq)
 }
 
 
+/* Used to initialize the epoll bits inside the "struct file" */
+void eventpoll_init_file(struct file *file)
+{
+
+       INIT_LIST_HEAD(&file->f_ep_links);
+       spin_lock_init(&file->f_ep_lock);
+}
+
+
 /*
  * This is called from eventpoll_release() to unlink files from the eventpoll
  * interface. We need to have this facility to cleanup correctly files that are
@@ -469,10 +477,10 @@ void eventpoll_release_file(struct file *file)
         * cleanup path, and this means that noone is using this file anymore.
         * The only hit might come from ep_free() but by holding the semaphore
         * will correctly serialize the operation. We do need to acquire
-        * "ep->sem" after "epmutex" because ep_remove() requires it when called
+        * "ep->sem" after "epsem" because ep_remove() requires it when called
         * from anywhere but ep_free().
         */
-       mutex_lock(&epmutex);
+       down(&epsem);
 
        while (!list_empty(lsthead)) {
                epi = list_entry(lsthead->next, struct epitem, fllink);
@@ -484,7 +492,7 @@ void eventpoll_release_file(struct file *file)
                up_write(&ep->sem);
        }
 
-       mutex_unlock(&epmutex);
+       up(&epsem);
 }
 
 
@@ -811,9 +819,9 @@ static void ep_free(struct eventpoll *ep)
         * We do not need to hold "ep->sem" here because the epoll file
         * is on the way to be removed and no one has references to it
         * anymore. The only hit might come from eventpoll_release_file() but
-        * holding "epmutex" is sufficent here.
+        * holding "epsem" is sufficent here.
         */
-       mutex_lock(&epmutex);
+       down(&epsem);
 
        /*
         * Walks through the whole tree by unregistering poll callbacks.
@@ -835,7 +843,7 @@ static void ep_free(struct eventpoll *ep)
                ep_remove(ep, epi);
        }
 
-       mutex_unlock(&epmutex);
+       up(&epsem);
 }
 
 
@@ -1607,7 +1615,7 @@ static int __init eventpoll_init(void)
 {
        int error;
 
-       mutex_init(&epmutex);
+       init_MUTEX(&epsem);
 
        /* Initialize the structure used to perform safe poll wait head wake ups */
        ep_poll_safewake_init(&psw);