mm/huge_memory.c: use head to emphasize the purpose of page
[linux-2.6-microblaze.git] / fs / fuse / dev.c
index ed1abc9..8e02d76 100644 (file)
@@ -705,7 +705,7 @@ static int fuse_copy_fill(struct fuse_copy_state *cs)
                        cs->pipebufs++;
                        cs->nr_segs--;
                } else {
-                       if (cs->nr_segs == cs->pipe->buffers)
+                       if (cs->nr_segs >= cs->pipe->max_usage)
                                return -EIO;
 
                        page = alloc_page(GFP_HIGHUSER);
@@ -881,7 +881,7 @@ static int fuse_ref_page(struct fuse_copy_state *cs, struct page *page,
        struct pipe_buffer *buf;
        int err;
 
-       if (cs->nr_segs == cs->pipe->buffers)
+       if (cs->nr_segs >= cs->pipe->max_usage)
                return -EIO;
 
        err = unlock_request(cs->req);
@@ -1343,7 +1343,7 @@ static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos,
        if (!fud)
                return -EPERM;
 
-       bufs = kvmalloc_array(pipe->buffers, sizeof(struct pipe_buffer),
+       bufs = kvmalloc_array(pipe->max_usage, sizeof(struct pipe_buffer),
                              GFP_KERNEL);
        if (!bufs)
                return -ENOMEM;
@@ -1355,7 +1355,7 @@ static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos,
        if (ret < 0)
                goto out;
 
-       if (pipe->nrbufs + cs.nr_segs > pipe->buffers) {
+       if (pipe_occupancy(pipe->head, pipe->tail) + cs.nr_segs > pipe->max_usage) {
                ret = -EIO;
                goto out;
        }
@@ -1937,6 +1937,7 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
                                     struct file *out, loff_t *ppos,
                                     size_t len, unsigned int flags)
 {
+       unsigned int head, tail, mask, count;
        unsigned nbuf;
        unsigned idx;
        struct pipe_buffer *bufs;
@@ -1951,8 +1952,12 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
 
        pipe_lock(pipe);
 
-       bufs = kvmalloc_array(pipe->nrbufs, sizeof(struct pipe_buffer),
-                             GFP_KERNEL);
+       head = pipe->head;
+       tail = pipe->tail;
+       mask = pipe->ring_size - 1;
+       count = head - tail;
+
+       bufs = kvmalloc_array(count, sizeof(struct pipe_buffer), GFP_KERNEL);
        if (!bufs) {
                pipe_unlock(pipe);
                return -ENOMEM;
@@ -1960,8 +1965,8 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
 
        nbuf = 0;
        rem = 0;
-       for (idx = 0; idx < pipe->nrbufs && rem < len; idx++)
-               rem += pipe->bufs[(pipe->curbuf + idx) & (pipe->buffers - 1)].len;
+       for (idx = tail; idx != head && rem < len; idx++)
+               rem += pipe->bufs[idx & mask].len;
 
        ret = -EINVAL;
        if (rem < len)
@@ -1972,16 +1977,16 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
                struct pipe_buffer *ibuf;
                struct pipe_buffer *obuf;
 
-               BUG_ON(nbuf >= pipe->buffers);
-               BUG_ON(!pipe->nrbufs);
-               ibuf = &pipe->bufs[pipe->curbuf];
+               BUG_ON(nbuf >= pipe->ring_size);
+               BUG_ON(tail == head);
+               ibuf = &pipe->bufs[tail & mask];
                obuf = &bufs[nbuf];
 
                if (rem >= ibuf->len) {
                        *obuf = *ibuf;
                        ibuf->ops = NULL;
-                       pipe->curbuf = (pipe->curbuf + 1) & (pipe->buffers - 1);
-                       pipe->nrbufs--;
+                       tail++;
+                       pipe->tail = tail;
                } else {
                        if (!pipe_buf_get(pipe, ibuf))
                                goto out_free;
@@ -2262,7 +2267,7 @@ const struct file_operations fuse_dev_operations = {
        .release        = fuse_dev_release,
        .fasync         = fuse_dev_fasync,
        .unlocked_ioctl = fuse_dev_ioctl,
-       .compat_ioctl   = fuse_dev_ioctl,
+       .compat_ioctl   = compat_ptr_ioctl,
 };
 EXPORT_SYMBOL_GPL(fuse_dev_operations);