OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [fs/] [pipe.c] - Blame information for rev 78

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 *  linux/fs/pipe.c
3
 *
4
 *  Copyright (C) 1991, 1992, 1999  Linus Torvalds
5
 */
6
 
7
#include <linux/mm.h>
8
#include <linux/file.h>
9
#include <linux/poll.h>
10
#include <linux/slab.h>
11
#include <linux/module.h>
12
#include <linux/init.h>
13
#include <linux/fs.h>
14
#include <linux/mount.h>
15
#include <linux/pipe_fs_i.h>
16
#include <linux/uio.h>
17
#include <linux/highmem.h>
18
#include <linux/pagemap.h>
19
#include <linux/audit.h>
20
 
21
#include <asm/uaccess.h>
22
#include <asm/ioctls.h>
23
 
24
/*
25
 * We use a start+len construction, which provides full use of the
26
 * allocated memory.
27
 * -- Florian Coosmann (FGC)
28
 *
29
 * Reads with count = 0 should always return 0.
30
 * -- Julian Bradfield 1999-06-07.
31
 *
32
 * FIFOs and Pipes now generate SIGIO for both readers and writers.
33
 * -- Jeremy Elson <jelson@circlemud.org> 2001-08-16
34
 *
35
 * pipe_read & write cleanup
36
 * -- Manfred Spraul <manfred@colorfullife.com> 2002-05-09
37
 */
38
 
39
/* Drop the inode semaphore and wait for a pipe event, atomically */
40
void pipe_wait(struct pipe_inode_info *pipe)
41
{
42
        DEFINE_WAIT(wait);
43
 
44
        /*
45
         * Pipes are system-local resources, so sleeping on them
46
         * is considered a noninteractive wait:
47
         */
48
        prepare_to_wait(&pipe->wait, &wait, TASK_INTERRUPTIBLE);
49
        if (pipe->inode)
50
                mutex_unlock(&pipe->inode->i_mutex);
51
        schedule();
52
        finish_wait(&pipe->wait, &wait);
53
        if (pipe->inode)
54
                mutex_lock(&pipe->inode->i_mutex);
55
}
56
 
57
static int
58
pipe_iov_copy_from_user(void *to, struct iovec *iov, unsigned long len,
59
                        int atomic)
60
{
61
        unsigned long copy;
62
 
63
        while (len > 0) {
64
                while (!iov->iov_len)
65
                        iov++;
66
                copy = min_t(unsigned long, len, iov->iov_len);
67
 
68
                if (atomic) {
69
                        if (__copy_from_user_inatomic(to, iov->iov_base, copy))
70
                                return -EFAULT;
71
                } else {
72
                        if (copy_from_user(to, iov->iov_base, copy))
73
                                return -EFAULT;
74
                }
75
                to += copy;
76
                len -= copy;
77
                iov->iov_base += copy;
78
                iov->iov_len -= copy;
79
        }
80
        return 0;
81
}
82
 
83
static int
84
pipe_iov_copy_to_user(struct iovec *iov, const void *from, unsigned long len,
85
                      int atomic)
86
{
87
        unsigned long copy;
88
 
89
        while (len > 0) {
90
                while (!iov->iov_len)
91
                        iov++;
92
                copy = min_t(unsigned long, len, iov->iov_len);
93
 
94
                if (atomic) {
95
                        if (__copy_to_user_inatomic(iov->iov_base, from, copy))
96
                                return -EFAULT;
97
                } else {
98
                        if (copy_to_user(iov->iov_base, from, copy))
99
                                return -EFAULT;
100
                }
101
                from += copy;
102
                len -= copy;
103
                iov->iov_base += copy;
104
                iov->iov_len -= copy;
105
        }
106
        return 0;
107
}
108
 
109
/*
110
 * Attempt to pre-fault in the user memory, so we can use atomic copies.
111
 * Returns the number of bytes not faulted in.
112
 */
113
static int iov_fault_in_pages_write(struct iovec *iov, unsigned long len)
114
{
115
        while (!iov->iov_len)
116
                iov++;
117
 
118
        while (len > 0) {
119
                unsigned long this_len;
120
 
121
                this_len = min_t(unsigned long, len, iov->iov_len);
122
                if (fault_in_pages_writeable(iov->iov_base, this_len))
123
                        break;
124
 
125
                len -= this_len;
126
                iov++;
127
        }
128
 
129
        return len;
130
}
131
 
132
/*
133
 * Pre-fault in the user memory, so we can use atomic copies.
134
 */
135
static void iov_fault_in_pages_read(struct iovec *iov, unsigned long len)
136
{
137
        while (!iov->iov_len)
138
                iov++;
139
 
140
        while (len > 0) {
141
                unsigned long this_len;
142
 
143
                this_len = min_t(unsigned long, len, iov->iov_len);
144
                fault_in_pages_readable(iov->iov_base, this_len);
145
                len -= this_len;
146
                iov++;
147
        }
148
}
149
 
150
static void anon_pipe_buf_release(struct pipe_inode_info *pipe,
151
                                  struct pipe_buffer *buf)
152
{
153
        struct page *page = buf->page;
154
 
155
        /*
156
         * If nobody else uses this page, and we don't already have a
157
         * temporary page, let's keep track of it as a one-deep
158
         * allocation cache. (Otherwise just release our reference to it)
159
         */
160
        if (page_count(page) == 1 && !pipe->tmp_page)
161
                pipe->tmp_page = page;
162
        else
163
                page_cache_release(page);
164
}
165
 
166
/**
167
 * generic_pipe_buf_map - virtually map a pipe buffer
168
 * @pipe:       the pipe that the buffer belongs to
169
 * @buf:        the buffer that should be mapped
170
 * @atomic:     whether to use an atomic map
171
 *
172
 * Description:
173
 *      This function returns a kernel virtual address mapping for the
174
 *      passed in @pipe_buffer. If @atomic is set, an atomic map is provided
175
 *      and the caller has to be careful not to fault before calling
176
 *      the unmap function.
177
 *
178
 *      Note that this function occupies KM_USER0 if @atomic != 0.
179
 */
180
void *generic_pipe_buf_map(struct pipe_inode_info *pipe,
181
                           struct pipe_buffer *buf, int atomic)
182
{
183
        if (atomic) {
184
                buf->flags |= PIPE_BUF_FLAG_ATOMIC;
185
                return kmap_atomic(buf->page, KM_USER0);
186
        }
187
 
188
        return kmap(buf->page);
189
}
190
 
191
/**
192
 * generic_pipe_buf_unmap - unmap a previously mapped pipe buffer
193
 * @pipe:       the pipe that the buffer belongs to
194
 * @buf:        the buffer that should be unmapped
195
 * @map_data:   the data that the mapping function returned
196
 *
197
 * Description:
198
 *      This function undoes the mapping that ->map() provided.
199
 */
200
void generic_pipe_buf_unmap(struct pipe_inode_info *pipe,
201
                            struct pipe_buffer *buf, void *map_data)
202
{
203
        if (buf->flags & PIPE_BUF_FLAG_ATOMIC) {
204
                buf->flags &= ~PIPE_BUF_FLAG_ATOMIC;
205
                kunmap_atomic(map_data, KM_USER0);
206
        } else
207
                kunmap(buf->page);
208
}
209
 
210
/**
211
 * generic_pipe_buf_steal - attempt to take ownership of a @pipe_buffer
212
 * @pipe:       the pipe that the buffer belongs to
213
 * @buf:        the buffer to attempt to steal
214
 *
215
 * Description:
216
 *      This function attempts to steal the @struct page attached to
217
 *      @buf. If successful, this function returns 0 and returns with
218
 *      the page locked. The caller may then reuse the page for whatever
219
 *      he wishes, the typical use is insertion into a different file
220
 *      page cache.
221
 */
222
int generic_pipe_buf_steal(struct pipe_inode_info *pipe,
223
                           struct pipe_buffer *buf)
224
{
225
        struct page *page = buf->page;
226
 
227
        /*
228
         * A reference of one is golden, that means that the owner of this
229
         * page is the only one holding a reference to it. lock the page
230
         * and return OK.
231
         */
232
        if (page_count(page) == 1) {
233
                lock_page(page);
234
                return 0;
235
        }
236
 
237
        return 1;
238
}
239
 
240
/**
241
 * generic_pipe_buf_get - get a reference to a @struct pipe_buffer
242
 * @pipe:       the pipe that the buffer belongs to
243
 * @buf:        the buffer to get a reference to
244
 *
245
 * Description:
246
 *      This function grabs an extra reference to @buf. It's used in
247
 *      in the tee() system call, when we duplicate the buffers in one
248
 *      pipe into another.
249
 */
250
void generic_pipe_buf_get(struct pipe_inode_info *pipe, struct pipe_buffer *buf)
251
{
252
        page_cache_get(buf->page);
253
}
254
 
255
/**
256
 * generic_pipe_buf_confirm - verify contents of the pipe buffer
257
 * @info:       the pipe that the buffer belongs to
258
 * @buf:        the buffer to confirm
259
 *
260
 * Description:
261
 *      This function does nothing, because the generic pipe code uses
262
 *      pages that are always good when inserted into the pipe.
263
 */
264
int generic_pipe_buf_confirm(struct pipe_inode_info *info,
265
                             struct pipe_buffer *buf)
266
{
267
        return 0;
268
}
269
 
270
static const struct pipe_buf_operations anon_pipe_buf_ops = {
271
        .can_merge = 1,
272
        .map = generic_pipe_buf_map,
273
        .unmap = generic_pipe_buf_unmap,
274
        .confirm = generic_pipe_buf_confirm,
275
        .release = anon_pipe_buf_release,
276
        .steal = generic_pipe_buf_steal,
277
        .get = generic_pipe_buf_get,
278
};
279
 
280
static ssize_t
281
pipe_read(struct kiocb *iocb, const struct iovec *_iov,
282
           unsigned long nr_segs, loff_t pos)
283
{
284
        struct file *filp = iocb->ki_filp;
285
        struct inode *inode = filp->f_path.dentry->d_inode;
286
        struct pipe_inode_info *pipe;
287
        int do_wakeup;
288
        ssize_t ret;
289
        struct iovec *iov = (struct iovec *)_iov;
290
        size_t total_len;
291
 
292
        total_len = iov_length(iov, nr_segs);
293
        /* Null read succeeds. */
294
        if (unlikely(total_len == 0))
295
                return 0;
296
 
297
        do_wakeup = 0;
298
        ret = 0;
299
        mutex_lock(&inode->i_mutex);
300
        pipe = inode->i_pipe;
301
        for (;;) {
302
                int bufs = pipe->nrbufs;
303
                if (bufs) {
304
                        int curbuf = pipe->curbuf;
305
                        struct pipe_buffer *buf = pipe->bufs + curbuf;
306
                        const struct pipe_buf_operations *ops = buf->ops;
307
                        void *addr;
308
                        size_t chars = buf->len;
309
                        int error, atomic;
310
 
311
                        if (chars > total_len)
312
                                chars = total_len;
313
 
314
                        error = ops->confirm(pipe, buf);
315
                        if (error) {
316
                                if (!ret)
317
                                        error = ret;
318
                                break;
319
                        }
320
 
321
                        atomic = !iov_fault_in_pages_write(iov, chars);
322
redo:
323
                        addr = ops->map(pipe, buf, atomic);
324
                        error = pipe_iov_copy_to_user(iov, addr + buf->offset, chars, atomic);
325
                        ops->unmap(pipe, buf, addr);
326
                        if (unlikely(error)) {
327
                                /*
328
                                 * Just retry with the slow path if we failed.
329
                                 */
330
                                if (atomic) {
331
                                        atomic = 0;
332
                                        goto redo;
333
                                }
334
                                if (!ret)
335
                                        ret = error;
336
                                break;
337
                        }
338
                        ret += chars;
339
                        buf->offset += chars;
340
                        buf->len -= chars;
341
                        if (!buf->len) {
342
                                buf->ops = NULL;
343
                                ops->release(pipe, buf);
344
                                curbuf = (curbuf + 1) & (PIPE_BUFFERS-1);
345
                                pipe->curbuf = curbuf;
346
                                pipe->nrbufs = --bufs;
347
                                do_wakeup = 1;
348
                        }
349
                        total_len -= chars;
350
                        if (!total_len)
351
                                break;  /* common path: read succeeded */
352
                }
353
                if (bufs)       /* More to do? */
354
                        continue;
355
                if (!pipe->writers)
356
                        break;
357
                if (!pipe->waiting_writers) {
358
                        /* syscall merging: Usually we must not sleep
359
                         * if O_NONBLOCK is set, or if we got some data.
360
                         * But if a writer sleeps in kernel space, then
361
                         * we can wait for that data without violating POSIX.
362
                         */
363
                        if (ret)
364
                                break;
365
                        if (filp->f_flags & O_NONBLOCK) {
366
                                ret = -EAGAIN;
367
                                break;
368
                        }
369
                }
370
                if (signal_pending(current)) {
371
                        if (!ret)
372
                                ret = -ERESTARTSYS;
373
                        break;
374
                }
375
                if (do_wakeup) {
376
                        wake_up_interruptible_sync(&pipe->wait);
377
                        kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
378
                }
379
                pipe_wait(pipe);
380
        }
381
        mutex_unlock(&inode->i_mutex);
382
 
383
        /* Signal writers asynchronously that there is more room. */
384
        if (do_wakeup) {
385
                wake_up_interruptible_sync(&pipe->wait);
386
                kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
387
        }
388
        if (ret > 0)
389
                file_accessed(filp);
390
        return ret;
391
}
392
 
393
static ssize_t
394
pipe_write(struct kiocb *iocb, const struct iovec *_iov,
395
            unsigned long nr_segs, loff_t ppos)
396
{
397
        struct file *filp = iocb->ki_filp;
398
        struct inode *inode = filp->f_path.dentry->d_inode;
399
        struct pipe_inode_info *pipe;
400
        ssize_t ret;
401
        int do_wakeup;
402
        struct iovec *iov = (struct iovec *)_iov;
403
        size_t total_len;
404
        ssize_t chars;
405
 
406
        total_len = iov_length(iov, nr_segs);
407
        /* Null write succeeds. */
408
        if (unlikely(total_len == 0))
409
                return 0;
410
 
411
        do_wakeup = 0;
412
        ret = 0;
413
        mutex_lock(&inode->i_mutex);
414
        pipe = inode->i_pipe;
415
 
416
        if (!pipe->readers) {
417
                send_sig(SIGPIPE, current, 0);
418
                ret = -EPIPE;
419
                goto out;
420
        }
421
 
422
        /* We try to merge small writes */
423
        chars = total_len & (PAGE_SIZE-1); /* size of the last buffer */
424
        if (pipe->nrbufs && chars != 0) {
425
                int lastbuf = (pipe->curbuf + pipe->nrbufs - 1) &
426
                                                        (PIPE_BUFFERS-1);
427
                struct pipe_buffer *buf = pipe->bufs + lastbuf;
428
                const struct pipe_buf_operations *ops = buf->ops;
429
                int offset = buf->offset + buf->len;
430
 
431
                if (ops->can_merge && offset + chars <= PAGE_SIZE) {
432
                        int error, atomic = 1;
433
                        void *addr;
434
 
435
                        error = ops->confirm(pipe, buf);
436
                        if (error)
437
                                goto out;
438
 
439
                        iov_fault_in_pages_read(iov, chars);
440
redo1:
441
                        addr = ops->map(pipe, buf, atomic);
442
                        error = pipe_iov_copy_from_user(offset + addr, iov,
443
                                                        chars, atomic);
444
                        ops->unmap(pipe, buf, addr);
445
                        ret = error;
446
                        do_wakeup = 1;
447
                        if (error) {
448
                                if (atomic) {
449
                                        atomic = 0;
450
                                        goto redo1;
451
                                }
452
                                goto out;
453
                        }
454
                        buf->len += chars;
455
                        total_len -= chars;
456
                        ret = chars;
457
                        if (!total_len)
458
                                goto out;
459
                }
460
        }
461
 
462
        for (;;) {
463
                int bufs;
464
 
465
                if (!pipe->readers) {
466
                        send_sig(SIGPIPE, current, 0);
467
                        if (!ret)
468
                                ret = -EPIPE;
469
                        break;
470
                }
471
                bufs = pipe->nrbufs;
472
                if (bufs < PIPE_BUFFERS) {
473
                        int newbuf = (pipe->curbuf + bufs) & (PIPE_BUFFERS-1);
474
                        struct pipe_buffer *buf = pipe->bufs + newbuf;
475
                        struct page *page = pipe->tmp_page;
476
                        char *src;
477
                        int error, atomic = 1;
478
 
479
                        if (!page) {
480
                                page = alloc_page(GFP_HIGHUSER);
481
                                if (unlikely(!page)) {
482
                                        ret = ret ? : -ENOMEM;
483
                                        break;
484
                                }
485
                                pipe->tmp_page = page;
486
                        }
487
                        /* Always wake up, even if the copy fails. Otherwise
488
                         * we lock up (O_NONBLOCK-)readers that sleep due to
489
                         * syscall merging.
490
                         * FIXME! Is this really true?
491
                         */
492
                        do_wakeup = 1;
493
                        chars = PAGE_SIZE;
494
                        if (chars > total_len)
495
                                chars = total_len;
496
 
497
                        iov_fault_in_pages_read(iov, chars);
498
redo2:
499
                        if (atomic)
500
                                src = kmap_atomic(page, KM_USER0);
501
                        else
502
                                src = kmap(page);
503
 
504
                        error = pipe_iov_copy_from_user(src, iov, chars,
505
                                                        atomic);
506
                        if (atomic)
507
                                kunmap_atomic(src, KM_USER0);
508
                        else
509
                                kunmap(page);
510
 
511
                        if (unlikely(error)) {
512
                                if (atomic) {
513
                                        atomic = 0;
514
                                        goto redo2;
515
                                }
516
                                if (!ret)
517
                                        ret = error;
518
                                break;
519
                        }
520
                        ret += chars;
521
 
522
                        /* Insert it into the buffer array */
523
                        buf->page = page;
524
                        buf->ops = &anon_pipe_buf_ops;
525
                        buf->offset = 0;
526
                        buf->len = chars;
527
                        pipe->nrbufs = ++bufs;
528
                        pipe->tmp_page = NULL;
529
 
530
                        total_len -= chars;
531
                        if (!total_len)
532
                                break;
533
                }
534
                if (bufs < PIPE_BUFFERS)
535
                        continue;
536
                if (filp->f_flags & O_NONBLOCK) {
537
                        if (!ret)
538
                                ret = -EAGAIN;
539
                        break;
540
                }
541
                if (signal_pending(current)) {
542
                        if (!ret)
543
                                ret = -ERESTARTSYS;
544
                        break;
545
                }
546
                if (do_wakeup) {
547
                        wake_up_interruptible_sync(&pipe->wait);
548
                        kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
549
                        do_wakeup = 0;
550
                }
551
                pipe->waiting_writers++;
552
                pipe_wait(pipe);
553
                pipe->waiting_writers--;
554
        }
555
out:
556
        mutex_unlock(&inode->i_mutex);
557
        if (do_wakeup) {
558
                wake_up_interruptible_sync(&pipe->wait);
559
                kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
560
        }
561
        if (ret > 0)
562
                file_update_time(filp);
563
        return ret;
564
}
565
 
566
static ssize_t
567
bad_pipe_r(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
568
{
569
        return -EBADF;
570
}
571
 
572
static ssize_t
573
bad_pipe_w(struct file *filp, const char __user *buf, size_t count,
574
           loff_t *ppos)
575
{
576
        return -EBADF;
577
}
578
 
579
static int
580
pipe_ioctl(struct inode *pino, struct file *filp,
581
           unsigned int cmd, unsigned long arg)
582
{
583
        struct inode *inode = filp->f_path.dentry->d_inode;
584
        struct pipe_inode_info *pipe;
585
        int count, buf, nrbufs;
586
 
587
        switch (cmd) {
588
                case FIONREAD:
589
                        mutex_lock(&inode->i_mutex);
590
                        pipe = inode->i_pipe;
591
                        count = 0;
592
                        buf = pipe->curbuf;
593
                        nrbufs = pipe->nrbufs;
594
                        while (--nrbufs >= 0) {
595
                                count += pipe->bufs[buf].len;
596
                                buf = (buf+1) & (PIPE_BUFFERS-1);
597
                        }
598
                        mutex_unlock(&inode->i_mutex);
599
 
600
                        return put_user(count, (int __user *)arg);
601
                default:
602
                        return -EINVAL;
603
        }
604
}
605
 
606
/* No kernel lock held - fine */
607
static unsigned int
608
pipe_poll(struct file *filp, poll_table *wait)
609
{
610
        unsigned int mask;
611
        struct inode *inode = filp->f_path.dentry->d_inode;
612
        struct pipe_inode_info *pipe = inode->i_pipe;
613
        int nrbufs;
614
 
615
        poll_wait(filp, &pipe->wait, wait);
616
 
617
        /* Reading only -- no need for acquiring the semaphore.  */
618
        nrbufs = pipe->nrbufs;
619
        mask = 0;
620
        if (filp->f_mode & FMODE_READ) {
621
                mask = (nrbufs > 0) ? POLLIN | POLLRDNORM : 0;
622
                if (!pipe->writers && filp->f_version != pipe->w_counter)
623
                        mask |= POLLHUP;
624
        }
625
 
626
        if (filp->f_mode & FMODE_WRITE) {
627
                mask |= (nrbufs < PIPE_BUFFERS) ? POLLOUT | POLLWRNORM : 0;
628
                /*
629
                 * Most Unices do not set POLLERR for FIFOs but on Linux they
630
                 * behave exactly like pipes for poll().
631
                 */
632
                if (!pipe->readers)
633
                        mask |= POLLERR;
634
        }
635
 
636
        return mask;
637
}
638
 
639
static int
640
pipe_release(struct inode *inode, int decr, int decw)
641
{
642
        struct pipe_inode_info *pipe;
643
 
644
        mutex_lock(&inode->i_mutex);
645
        pipe = inode->i_pipe;
646
        pipe->readers -= decr;
647
        pipe->writers -= decw;
648
 
649
        if (!pipe->readers && !pipe->writers) {
650
                free_pipe_info(inode);
651
        } else {
652
                wake_up_interruptible_sync(&pipe->wait);
653
                kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
654
                kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
655
        }
656
        mutex_unlock(&inode->i_mutex);
657
 
658
        return 0;
659
}
660
 
661
static int
662
pipe_read_fasync(int fd, struct file *filp, int on)
663
{
664
        struct inode *inode = filp->f_path.dentry->d_inode;
665
        int retval;
666
 
667
        mutex_lock(&inode->i_mutex);
668
        retval = fasync_helper(fd, filp, on, &inode->i_pipe->fasync_readers);
669
        mutex_unlock(&inode->i_mutex);
670
 
671
        if (retval < 0)
672
                return retval;
673
 
674
        return 0;
675
}
676
 
677
 
678
static int
679
pipe_write_fasync(int fd, struct file *filp, int on)
680
{
681
        struct inode *inode = filp->f_path.dentry->d_inode;
682
        int retval;
683
 
684
        mutex_lock(&inode->i_mutex);
685
        retval = fasync_helper(fd, filp, on, &inode->i_pipe->fasync_writers);
686
        mutex_unlock(&inode->i_mutex);
687
 
688
        if (retval < 0)
689
                return retval;
690
 
691
        return 0;
692
}
693
 
694
 
695
static int
696
pipe_rdwr_fasync(int fd, struct file *filp, int on)
697
{
698
        struct inode *inode = filp->f_path.dentry->d_inode;
699
        struct pipe_inode_info *pipe = inode->i_pipe;
700
        int retval;
701
 
702
        mutex_lock(&inode->i_mutex);
703
 
704
        retval = fasync_helper(fd, filp, on, &pipe->fasync_readers);
705
 
706
        if (retval >= 0)
707
                retval = fasync_helper(fd, filp, on, &pipe->fasync_writers);
708
 
709
        mutex_unlock(&inode->i_mutex);
710
 
711
        if (retval < 0)
712
                return retval;
713
 
714
        return 0;
715
}
716
 
717
 
718
static int
719
pipe_read_release(struct inode *inode, struct file *filp)
720
{
721
        pipe_read_fasync(-1, filp, 0);
722
        return pipe_release(inode, 1, 0);
723
}
724
 
725
static int
726
pipe_write_release(struct inode *inode, struct file *filp)
727
{
728
        pipe_write_fasync(-1, filp, 0);
729
        return pipe_release(inode, 0, 1);
730
}
731
 
732
static int
733
pipe_rdwr_release(struct inode *inode, struct file *filp)
734
{
735
        int decr, decw;
736
 
737
        pipe_rdwr_fasync(-1, filp, 0);
738
        decr = (filp->f_mode & FMODE_READ) != 0;
739
        decw = (filp->f_mode & FMODE_WRITE) != 0;
740
        return pipe_release(inode, decr, decw);
741
}
742
 
743
static int
744
pipe_read_open(struct inode *inode, struct file *filp)
745
{
746
        /* We could have perhaps used atomic_t, but this and friends
747
           below are the only places.  So it doesn't seem worthwhile.  */
748
        mutex_lock(&inode->i_mutex);
749
        inode->i_pipe->readers++;
750
        mutex_unlock(&inode->i_mutex);
751
 
752
        return 0;
753
}
754
 
755
static int
756
pipe_write_open(struct inode *inode, struct file *filp)
757
{
758
        mutex_lock(&inode->i_mutex);
759
        inode->i_pipe->writers++;
760
        mutex_unlock(&inode->i_mutex);
761
 
762
        return 0;
763
}
764
 
765
static int
766
pipe_rdwr_open(struct inode *inode, struct file *filp)
767
{
768
        mutex_lock(&inode->i_mutex);
769
        if (filp->f_mode & FMODE_READ)
770
                inode->i_pipe->readers++;
771
        if (filp->f_mode & FMODE_WRITE)
772
                inode->i_pipe->writers++;
773
        mutex_unlock(&inode->i_mutex);
774
 
775
        return 0;
776
}
777
 
778
/*
779
 * The file_operations structs are not static because they
780
 * are also used in linux/fs/fifo.c to do operations on FIFOs.
781
 */
782
const struct file_operations read_fifo_fops = {
783
        .llseek         = no_llseek,
784
        .read           = do_sync_read,
785
        .aio_read       = pipe_read,
786
        .write          = bad_pipe_w,
787
        .poll           = pipe_poll,
788
        .ioctl          = pipe_ioctl,
789
        .open           = pipe_read_open,
790
        .release        = pipe_read_release,
791
        .fasync         = pipe_read_fasync,
792
};
793
 
794
const struct file_operations write_fifo_fops = {
795
        .llseek         = no_llseek,
796
        .read           = bad_pipe_r,
797
        .write          = do_sync_write,
798
        .aio_write      = pipe_write,
799
        .poll           = pipe_poll,
800
        .ioctl          = pipe_ioctl,
801
        .open           = pipe_write_open,
802
        .release        = pipe_write_release,
803
        .fasync         = pipe_write_fasync,
804
};
805
 
806
const struct file_operations rdwr_fifo_fops = {
807
        .llseek         = no_llseek,
808
        .read           = do_sync_read,
809
        .aio_read       = pipe_read,
810
        .write          = do_sync_write,
811
        .aio_write      = pipe_write,
812
        .poll           = pipe_poll,
813
        .ioctl          = pipe_ioctl,
814
        .open           = pipe_rdwr_open,
815
        .release        = pipe_rdwr_release,
816
        .fasync         = pipe_rdwr_fasync,
817
};
818
 
819
static const struct file_operations read_pipe_fops = {
820
        .llseek         = no_llseek,
821
        .read           = do_sync_read,
822
        .aio_read       = pipe_read,
823
        .write          = bad_pipe_w,
824
        .poll           = pipe_poll,
825
        .ioctl          = pipe_ioctl,
826
        .open           = pipe_read_open,
827
        .release        = pipe_read_release,
828
        .fasync         = pipe_read_fasync,
829
};
830
 
831
static const struct file_operations write_pipe_fops = {
832
        .llseek         = no_llseek,
833
        .read           = bad_pipe_r,
834
        .write          = do_sync_write,
835
        .aio_write      = pipe_write,
836
        .poll           = pipe_poll,
837
        .ioctl          = pipe_ioctl,
838
        .open           = pipe_write_open,
839
        .release        = pipe_write_release,
840
        .fasync         = pipe_write_fasync,
841
};
842
 
843
static const struct file_operations rdwr_pipe_fops = {
844
        .llseek         = no_llseek,
845
        .read           = do_sync_read,
846
        .aio_read       = pipe_read,
847
        .write          = do_sync_write,
848
        .aio_write      = pipe_write,
849
        .poll           = pipe_poll,
850
        .ioctl          = pipe_ioctl,
851
        .open           = pipe_rdwr_open,
852
        .release        = pipe_rdwr_release,
853
        .fasync         = pipe_rdwr_fasync,
854
};
855
 
856
struct pipe_inode_info * alloc_pipe_info(struct inode *inode)
857
{
858
        struct pipe_inode_info *pipe;
859
 
860
        pipe = kzalloc(sizeof(struct pipe_inode_info), GFP_KERNEL);
861
        if (pipe) {
862
                init_waitqueue_head(&pipe->wait);
863
                pipe->r_counter = pipe->w_counter = 1;
864
                pipe->inode = inode;
865
        }
866
 
867
        return pipe;
868
}
869
 
870
void __free_pipe_info(struct pipe_inode_info *pipe)
871
{
872
        int i;
873
 
874
        for (i = 0; i < PIPE_BUFFERS; i++) {
875
                struct pipe_buffer *buf = pipe->bufs + i;
876
                if (buf->ops)
877
                        buf->ops->release(pipe, buf);
878
        }
879
        if (pipe->tmp_page)
880
                __free_page(pipe->tmp_page);
881
        kfree(pipe);
882
}
883
 
884
void free_pipe_info(struct inode *inode)
885
{
886
        __free_pipe_info(inode->i_pipe);
887
        inode->i_pipe = NULL;
888
}
889
 
890
static struct vfsmount *pipe_mnt __read_mostly;
891
static int pipefs_delete_dentry(struct dentry *dentry)
892
{
893
        /*
894
         * At creation time, we pretended this dentry was hashed
895
         * (by clearing DCACHE_UNHASHED bit in d_flags)
896
         * At delete time, we restore the truth : not hashed.
897
         * (so that dput() can proceed correctly)
898
         */
899
        dentry->d_flags |= DCACHE_UNHASHED;
900
        return 0;
901
}
902
 
903
/*
904
 * pipefs_dname() is called from d_path().
905
 */
906
static char *pipefs_dname(struct dentry *dentry, char *buffer, int buflen)
907
{
908
        return dynamic_dname(dentry, buffer, buflen, "pipe:[%lu]",
909
                                dentry->d_inode->i_ino);
910
}
911
 
912
static struct dentry_operations pipefs_dentry_operations = {
913
        .d_delete       = pipefs_delete_dentry,
914
        .d_dname        = pipefs_dname,
915
};
916
 
917
static struct inode * get_pipe_inode(void)
918
{
919
        struct inode *inode = new_inode(pipe_mnt->mnt_sb);
920
        struct pipe_inode_info *pipe;
921
 
922
        if (!inode)
923
                goto fail_inode;
924
 
925
        pipe = alloc_pipe_info(inode);
926
        if (!pipe)
927
                goto fail_iput;
928
        inode->i_pipe = pipe;
929
 
930
        pipe->readers = pipe->writers = 1;
931
        inode->i_fop = &rdwr_pipe_fops;
932
 
933
        /*
934
         * Mark the inode dirty from the very beginning,
935
         * that way it will never be moved to the dirty
936
         * list because "mark_inode_dirty()" will think
937
         * that it already _is_ on the dirty list.
938
         */
939
        inode->i_state = I_DIRTY;
940
        inode->i_mode = S_IFIFO | S_IRUSR | S_IWUSR;
941
        inode->i_uid = current->fsuid;
942
        inode->i_gid = current->fsgid;
943
        inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
944
 
945
        return inode;
946
 
947
fail_iput:
948
        iput(inode);
949
 
950
fail_inode:
951
        return NULL;
952
}
953
 
954
struct file *create_write_pipe(void)
955
{
956
        int err;
957
        struct inode *inode;
958
        struct file *f;
959
        struct dentry *dentry;
960
        struct qstr name = { .name = "" };
961
 
962
        f = get_empty_filp();
963
        if (!f)
964
                return ERR_PTR(-ENFILE);
965
        err = -ENFILE;
966
        inode = get_pipe_inode();
967
        if (!inode)
968
                goto err_file;
969
 
970
        err = -ENOMEM;
971
        dentry = d_alloc(pipe_mnt->mnt_sb->s_root, &name);
972
        if (!dentry)
973
                goto err_inode;
974
 
975
        dentry->d_op = &pipefs_dentry_operations;
976
        /*
977
         * We dont want to publish this dentry into global dentry hash table.
978
         * We pretend dentry is already hashed, by unsetting DCACHE_UNHASHED
979
         * This permits a working /proc/$pid/fd/XXX on pipes
980
         */
981
        dentry->d_flags &= ~DCACHE_UNHASHED;
982
        d_instantiate(dentry, inode);
983
        f->f_path.mnt = mntget(pipe_mnt);
984
        f->f_path.dentry = dentry;
985
        f->f_mapping = inode->i_mapping;
986
 
987
        f->f_flags = O_WRONLY;
988
        f->f_op = &write_pipe_fops;
989
        f->f_mode = FMODE_WRITE;
990
        f->f_version = 0;
991
 
992
        return f;
993
 
994
 err_inode:
995
        free_pipe_info(inode);
996
        iput(inode);
997
 err_file:
998
        put_filp(f);
999
        return ERR_PTR(err);
1000
}
1001
 
1002
void free_write_pipe(struct file *f)
1003
{
1004
        free_pipe_info(f->f_dentry->d_inode);
1005
        dput(f->f_path.dentry);
1006
        mntput(f->f_path.mnt);
1007
        put_filp(f);
1008
}
1009
 
1010
struct file *create_read_pipe(struct file *wrf)
1011
{
1012
        struct file *f = get_empty_filp();
1013
        if (!f)
1014
                return ERR_PTR(-ENFILE);
1015
 
1016
        /* Grab pipe from the writer */
1017
        f->f_path.mnt = mntget(wrf->f_path.mnt);
1018
        f->f_path.dentry = dget(wrf->f_path.dentry);
1019
        f->f_mapping = wrf->f_path.dentry->d_inode->i_mapping;
1020
 
1021
        f->f_pos = 0;
1022
        f->f_flags = O_RDONLY;
1023
        f->f_op = &read_pipe_fops;
1024
        f->f_mode = FMODE_READ;
1025
        f->f_version = 0;
1026
 
1027
        return f;
1028
}
1029
 
1030
int do_pipe(int *fd)
1031
{
1032
        struct file *fw, *fr;
1033
        int error;
1034
        int fdw, fdr;
1035
 
1036
        fw = create_write_pipe();
1037
        if (IS_ERR(fw))
1038
                return PTR_ERR(fw);
1039
        fr = create_read_pipe(fw);
1040
        error = PTR_ERR(fr);
1041
        if (IS_ERR(fr))
1042
                goto err_write_pipe;
1043
 
1044
        error = get_unused_fd();
1045
        if (error < 0)
1046
                goto err_read_pipe;
1047
        fdr = error;
1048
 
1049
        error = get_unused_fd();
1050
        if (error < 0)
1051
                goto err_fdr;
1052
        fdw = error;
1053
 
1054
        error = audit_fd_pair(fdr, fdw);
1055
        if (error < 0)
1056
                goto err_fdw;
1057
 
1058
        fd_install(fdr, fr);
1059
        fd_install(fdw, fw);
1060
        fd[0] = fdr;
1061
        fd[1] = fdw;
1062
 
1063
        return 0;
1064
 
1065
 err_fdw:
1066
        put_unused_fd(fdw);
1067
 err_fdr:
1068
        put_unused_fd(fdr);
1069
 err_read_pipe:
1070
        dput(fr->f_dentry);
1071
        mntput(fr->f_vfsmnt);
1072
        put_filp(fr);
1073
 err_write_pipe:
1074
        free_write_pipe(fw);
1075
        return error;
1076
}
1077
 
1078
/*
1079
 * pipefs should _never_ be mounted by userland - too much of security hassle,
1080
 * no real gain from having the whole whorehouse mounted. So we don't need
1081
 * any operations on the root directory. However, we need a non-trivial
1082
 * d_name - pipe: will go nicely and kill the special-casing in procfs.
1083
 */
1084
static int pipefs_get_sb(struct file_system_type *fs_type,
1085
                         int flags, const char *dev_name, void *data,
1086
                         struct vfsmount *mnt)
1087
{
1088
        return get_sb_pseudo(fs_type, "pipe:", NULL, PIPEFS_MAGIC, mnt);
1089
}
1090
 
1091
static struct file_system_type pipe_fs_type = {
1092
        .name           = "pipefs",
1093
        .get_sb         = pipefs_get_sb,
1094
        .kill_sb        = kill_anon_super,
1095
};
1096
 
1097
static int __init init_pipe_fs(void)
1098
{
1099
        int err = register_filesystem(&pipe_fs_type);
1100
 
1101
        if (!err) {
1102
                pipe_mnt = kern_mount(&pipe_fs_type);
1103
                if (IS_ERR(pipe_mnt)) {
1104
                        err = PTR_ERR(pipe_mnt);
1105
                        unregister_filesystem(&pipe_fs_type);
1106
                }
1107
        }
1108
        return err;
1109
}
1110
 
1111
static void __exit exit_pipe_fs(void)
1112
{
1113
        unregister_filesystem(&pipe_fs_type);
1114
        mntput(pipe_mnt);
1115
}
1116
 
1117
fs_initcall(init_pipe_fs);
1118
module_exit(exit_pipe_fs);

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.