device create: misc: convert device_create_drvdata to device_create
[linux-2.6.git] / fs / fifo.c
index 923371b..987bf94 100644 (file)
--- a/fs/fifo.c
+++ b/fs/fifo.c
 
 #include <linux/mm.h>
 #include <linux/slab.h>
-#include <linux/smp_lock.h>
 #include <linux/fs.h>
+#include <linux/sched.h>
 #include <linux/pipe_fs_i.h>
 
-static void wait_for_partner(struct inode* inode, unsigned int* cnt)
+static void wait_for_partner(struct inode* inode, unsigned int *cnt)
 {
        int cur = *cnt; 
-       while(cur == *cnt) {
-               pipe_wait(inode);
-               if(signal_pending(current))
+
+       while (cur == *cnt) {
+               pipe_wait(inode->i_pipe);
+               if (signal_pending(current))
                        break;
        }
 }
 
 static void wake_up_partner(struct inode* inode)
 {
-       wake_up_interruptible(PIPE_WAIT(*inode));
+       wake_up_interruptible(&inode->i_pipe->wait);
 }
 
 static int fifo_open(struct inode *inode, struct file *filp)
 {
+       struct pipe_inode_info *pipe;
        int ret;
 
-       ret = -ERESTARTSYS;
-       if (mutex_lock_interruptible(PIPE_MUTEX(*inode)))
-               goto err_nolock_nocleanup;
-
-       if (!inode->i_pipe) {
+       mutex_lock(&inode->i_mutex);
+       pipe = inode->i_pipe;
+       if (!pipe) {
                ret = -ENOMEM;
-               if(!pipe_new(inode))
+               pipe = alloc_pipe_info(inode);
+               if (!pipe)
                        goto err_nocleanup;
+               inode->i_pipe = pipe;
        }
        filp->f_version = 0;
 
@@ -55,19 +57,19 @@ static int fifo_open(struct inode *inode, struct file *filp)
         *  POSIX.1 says that O_NONBLOCK means return with the FIFO
         *  opened, even when there is no process writing the FIFO.
         */
-               filp->f_op = &read_fifo_fops;
-               PIPE_RCOUNTER(*inode)++;
-               if (PIPE_READERS(*inode)++ == 0)
+               filp->f_op = &read_pipefifo_fops;
+               pipe->r_counter++;
+               if (pipe->readers++ == 0)
                        wake_up_partner(inode);
 
-               if (!PIPE_WRITERS(*inode)) {
+               if (!pipe->writers) {
                        if ((filp->f_flags & O_NONBLOCK)) {
                                /* suppress POLLHUP until we have
                                 * seen a writer */
-                               filp->f_version = PIPE_WCOUNTER(*inode);
+                               filp->f_version = pipe->w_counter;
                        } else 
                        {
-                               wait_for_partner(inode, &PIPE_WCOUNTER(*inode));
+                               wait_for_partner(inode, &pipe->w_counter);
                                if(signal_pending(current))
                                        goto err_rd;
                        }
@@ -81,16 +83,16 @@ static int fifo_open(struct inode *inode, struct file *filp)
         *  errno=ENXIO when there is no process reading the FIFO.
         */
                ret = -ENXIO;
-               if ((filp->f_flags & O_NONBLOCK) && !PIPE_READERS(*inode))
+               if ((filp->f_flags & O_NONBLOCK) && !pipe->readers)
                        goto err;
 
-               filp->f_op = &write_fifo_fops;
-               PIPE_WCOUNTER(*inode)++;
-               if (!PIPE_WRITERS(*inode)++)
+               filp->f_op = &write_pipefifo_fops;
+               pipe->w_counter++;
+               if (!pipe->writers++)
                        wake_up_partner(inode);
 
-               if (!PIPE_READERS(*inode)) {
-                       wait_for_partner(inode, &PIPE_RCOUNTER(*inode));
+               if (!pipe->readers) {
+                       wait_for_partner(inode, &pipe->r_counter);
                        if (signal_pending(current))
                                goto err_wr;
                }
@@ -103,13 +105,13 @@ static int fifo_open(struct inode *inode, struct file *filp)
         *  This implementation will NEVER block on a O_RDWR open, since
         *  the process can at least talk to itself.
         */
-               filp->f_op = &rdwr_fifo_fops;
+               filp->f_op = &rdwr_pipefifo_fops;
 
-               PIPE_READERS(*inode)++;
-               PIPE_WRITERS(*inode)++;
-               PIPE_RCOUNTER(*inode)++;
-               PIPE_WCOUNTER(*inode)++;
-               if (PIPE_READERS(*inode) == 1 || PIPE_WRITERS(*inode) == 1)
+               pipe->readers++;
+               pipe->writers++;
+               pipe->r_counter++;
+               pipe->w_counter++;
+               if (pipe->readers == 1 || pipe->writers == 1)
                        wake_up_partner(inode);
                break;
 
@@ -119,29 +121,27 @@ static int fifo_open(struct inode *inode, struct file *filp)
        }
 
        /* Ok! */
-       mutex_unlock(PIPE_MUTEX(*inode));
+       mutex_unlock(&inode->i_mutex);
        return 0;
 
 err_rd:
-       if (!--PIPE_READERS(*inode))
-               wake_up_interruptible(PIPE_WAIT(*inode));
+       if (!--pipe->readers)
+               wake_up_interruptible(&pipe->wait);
        ret = -ERESTARTSYS;
        goto err;
 
 err_wr:
-       if (!--PIPE_WRITERS(*inode))
-               wake_up_interruptible(PIPE_WAIT(*inode));
+       if (!--pipe->writers)
+               wake_up_interruptible(&pipe->wait);
        ret = -ERESTARTSYS;
        goto err;
 
 err:
-       if (!PIPE_READERS(*inode) && !PIPE_WRITERS(*inode))
+       if (!pipe->readers && !pipe->writers)
                free_pipe_info(inode);
 
 err_nocleanup:
-       mutex_unlock(PIPE_MUTEX(*inode));
-
-err_nolock_nocleanup:
+       mutex_unlock(&inode->i_mutex);
        return ret;
 }
 
@@ -150,6 +150,6 @@ err_nolock_nocleanup:
  * is contain the open that then fills in the correct operations
  * depending on the access mode of the file...
  */
-struct file_operations def_fifo_fops = {
-       .open           = fifo_open,    /* will set read or write pipe_fops */
+const struct file_operations def_fifo_fops = {
+       .open           = fifo_open,    /* will set read_ or write_pipefifo_fops */
 };