pipe.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:14k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/fs/pipe.c
  3.  *
  4.  *  Copyright (C) 1991, 1992, 1999  Linus Torvalds
  5.  */
  6. #include <linux/mm.h>
  7. #include <linux/file.h>
  8. #include <linux/poll.h>
  9. #include <linux/slab.h>
  10. #include <linux/module.h>
  11. #include <linux/init.h>
  12. #include <asm/uaccess.h>
  13. #include <asm/ioctls.h>
  14. /*
  15.  * We use a start+len construction, which provides full use of the 
  16.  * allocated memory.
  17.  * -- Florian Coosmann (FGC)
  18.  * 
  19.  * Reads with count = 0 should always return 0.
  20.  * -- Julian Bradfield 1999-06-07.
  21.  */
  22. /* Drop the inode semaphore and wait for a pipe event, atomically */
  23. void pipe_wait(struct inode * inode)
  24. {
  25. DECLARE_WAITQUEUE(wait, current);
  26. current->state = TASK_INTERRUPTIBLE;
  27. add_wait_queue(PIPE_WAIT(*inode), &wait);
  28. up(PIPE_SEM(*inode));
  29. schedule();
  30. remove_wait_queue(PIPE_WAIT(*inode), &wait);
  31. current->state = TASK_RUNNING;
  32. down(PIPE_SEM(*inode));
  33. }
  34. static ssize_t
  35. pipe_read(struct file *filp, char *buf, size_t count, loff_t *ppos)
  36. {
  37. struct inode *inode = filp->f_dentry->d_inode;
  38. ssize_t size, read, ret;
  39. /* Seeks are not allowed on pipes.  */
  40. ret = -ESPIPE;
  41. read = 0;
  42. if (ppos != &filp->f_pos)
  43. goto out_nolock;
  44. /* Always return 0 on null read.  */
  45. ret = 0;
  46. if (count == 0)
  47. goto out_nolock;
  48. /* Get the pipe semaphore */
  49. ret = -ERESTARTSYS;
  50. if (down_interruptible(PIPE_SEM(*inode)))
  51. goto out_nolock;
  52. if (PIPE_EMPTY(*inode)) {
  53. do_more_read:
  54. ret = 0;
  55. if (!PIPE_WRITERS(*inode))
  56. goto out;
  57. ret = -EAGAIN;
  58. if (filp->f_flags & O_NONBLOCK)
  59. goto out;
  60. for (;;) {
  61. PIPE_WAITING_READERS(*inode)++;
  62. pipe_wait(inode);
  63. PIPE_WAITING_READERS(*inode)--;
  64. ret = -ERESTARTSYS;
  65. if (signal_pending(current))
  66. goto out;
  67. ret = 0;
  68. if (!PIPE_EMPTY(*inode))
  69. break;
  70. if (!PIPE_WRITERS(*inode))
  71. goto out;
  72. }
  73. }
  74. /* Read what data is available.  */
  75. ret = -EFAULT;
  76. while (count > 0 && (size = PIPE_LEN(*inode))) {
  77. char *pipebuf = PIPE_BASE(*inode) + PIPE_START(*inode);
  78. ssize_t chars = PIPE_MAX_RCHUNK(*inode);
  79. if (chars > count)
  80. chars = count;
  81. if (chars > size)
  82. chars = size;
  83. if (copy_to_user(buf, pipebuf, chars))
  84. goto out;
  85. read += chars;
  86. PIPE_START(*inode) += chars;
  87. PIPE_START(*inode) &= (PIPE_SIZE - 1);
  88. PIPE_LEN(*inode) -= chars;
  89. count -= chars;
  90. buf += chars;
  91. }
  92. /* Cache behaviour optimization */
  93. if (!PIPE_LEN(*inode))
  94. PIPE_START(*inode) = 0;
  95. if (count && PIPE_WAITING_WRITERS(*inode) && !(filp->f_flags & O_NONBLOCK)) {
  96. /*
  97.  * We know that we are going to sleep: signal
  98.  * writers synchronously that there is more
  99.  * room.
  100.  */
  101. wake_up_interruptible_sync(PIPE_WAIT(*inode));
  102. if (!PIPE_EMPTY(*inode))
  103. BUG();
  104. goto do_more_read;
  105. }
  106. /* Signal writers asynchronously that there is more room.  */
  107. wake_up_interruptible(PIPE_WAIT(*inode));
  108. ret = read;
  109. out:
  110. up(PIPE_SEM(*inode));
  111. out_nolock:
  112. if (read)
  113. ret = read;
  114. UPDATE_ATIME(inode);
  115. return ret;
  116. }
  117. static ssize_t
  118. pipe_write(struct file *filp, const char *buf, size_t count, loff_t *ppos)
  119. {
  120. struct inode *inode = filp->f_dentry->d_inode;
  121. ssize_t free, written, ret;
  122. /* Seeks are not allowed on pipes.  */
  123. ret = -ESPIPE;
  124. written = 0;
  125. if (ppos != &filp->f_pos)
  126. goto out_nolock;
  127. /* Null write succeeds.  */
  128. ret = 0;
  129. if (count == 0)
  130. goto out_nolock;
  131. ret = -ERESTARTSYS;
  132. if (down_interruptible(PIPE_SEM(*inode)))
  133. goto out_nolock;
  134. /* No readers yields SIGPIPE.  */
  135. if (!PIPE_READERS(*inode))
  136. goto sigpipe;
  137. /* If count <= PIPE_BUF, we have to make it atomic.  */
  138. free = (count <= PIPE_BUF ? count : 1);
  139. /* Wait, or check for, available space.  */
  140. if (filp->f_flags & O_NONBLOCK) {
  141. ret = -EAGAIN;
  142. if (PIPE_FREE(*inode) < free)
  143. goto out;
  144. } else {
  145. while (PIPE_FREE(*inode) < free) {
  146. PIPE_WAITING_WRITERS(*inode)++;
  147. pipe_wait(inode);
  148. PIPE_WAITING_WRITERS(*inode)--;
  149. ret = -ERESTARTSYS;
  150. if (signal_pending(current))
  151. goto out;
  152. if (!PIPE_READERS(*inode))
  153. goto sigpipe;
  154. }
  155. }
  156. /* Copy into available space.  */
  157. ret = -EFAULT;
  158. while (count > 0) {
  159. int space;
  160. char *pipebuf = PIPE_BASE(*inode) + PIPE_END(*inode);
  161. ssize_t chars = PIPE_MAX_WCHUNK(*inode);
  162. if ((space = PIPE_FREE(*inode)) != 0) {
  163. if (chars > count)
  164. chars = count;
  165. if (chars > space)
  166. chars = space;
  167. if (copy_from_user(pipebuf, buf, chars))
  168. goto out;
  169. written += chars;
  170. PIPE_LEN(*inode) += chars;
  171. count -= chars;
  172. buf += chars;
  173. space = PIPE_FREE(*inode);
  174. continue;
  175. }
  176. ret = written;
  177. if (filp->f_flags & O_NONBLOCK)
  178. break;
  179. do {
  180. /*
  181.  * Synchronous wake-up: it knows that this process
  182.  * is going to give up this CPU, so it doesn't have
  183.  * to do idle reschedules.
  184.  */
  185. wake_up_interruptible_sync(PIPE_WAIT(*inode));
  186. PIPE_WAITING_WRITERS(*inode)++;
  187. pipe_wait(inode);
  188. PIPE_WAITING_WRITERS(*inode)--;
  189. if (signal_pending(current))
  190. goto out;
  191. if (!PIPE_READERS(*inode))
  192. goto sigpipe;
  193. } while (!PIPE_FREE(*inode));
  194. ret = -EFAULT;
  195. }
  196. /* Signal readers asynchronously that there is more data.  */
  197. wake_up_interruptible(PIPE_WAIT(*inode));
  198. inode->i_ctime = inode->i_mtime = CURRENT_TIME;
  199. mark_inode_dirty(inode);
  200. out:
  201. up(PIPE_SEM(*inode));
  202. out_nolock:
  203. if (written)
  204. ret = written;
  205. return ret;
  206. sigpipe:
  207. if (written)
  208. goto out;
  209. up(PIPE_SEM(*inode));
  210. send_sig(SIGPIPE, current, 0);
  211. return -EPIPE;
  212. }
  213. static ssize_t
  214. bad_pipe_r(struct file *filp, char *buf, size_t count, loff_t *ppos)
  215. {
  216. return -EBADF;
  217. }
  218. static ssize_t
  219. bad_pipe_w(struct file *filp, const char *buf, size_t count, loff_t *ppos)
  220. {
  221. return -EBADF;
  222. }
  223. static int
  224. pipe_ioctl(struct inode *pino, struct file *filp,
  225.    unsigned int cmd, unsigned long arg)
  226. {
  227. switch (cmd) {
  228. case FIONREAD:
  229. return put_user(PIPE_LEN(*pino), (int *)arg);
  230. default:
  231. return -EINVAL;
  232. }
  233. }
  234. /* No kernel lock held - fine */
  235. static unsigned int
  236. pipe_poll(struct file *filp, poll_table *wait)
  237. {
  238. unsigned int mask;
  239. struct inode *inode = filp->f_dentry->d_inode;
  240. poll_wait(filp, PIPE_WAIT(*inode), wait);
  241. /* Reading only -- no need for acquiring the semaphore.  */
  242. mask = POLLIN | POLLRDNORM;
  243. if (PIPE_EMPTY(*inode))
  244. mask = POLLOUT | POLLWRNORM;
  245. if (!PIPE_WRITERS(*inode) && filp->f_version != PIPE_WCOUNTER(*inode))
  246. mask |= POLLHUP;
  247. if (!PIPE_READERS(*inode))
  248. mask |= POLLERR;
  249. return mask;
  250. }
  251. /* FIXME: most Unices do not set POLLERR for fifos */
  252. #define fifo_poll pipe_poll
  253. static int
  254. pipe_release(struct inode *inode, int decr, int decw)
  255. {
  256. down(PIPE_SEM(*inode));
  257. PIPE_READERS(*inode) -= decr;
  258. PIPE_WRITERS(*inode) -= decw;
  259. if (!PIPE_READERS(*inode) && !PIPE_WRITERS(*inode)) {
  260. struct pipe_inode_info *info = inode->i_pipe;
  261. inode->i_pipe = NULL;
  262. free_page((unsigned long) info->base);
  263. kfree(info);
  264. } else {
  265. wake_up_interruptible(PIPE_WAIT(*inode));
  266. }
  267. up(PIPE_SEM(*inode));
  268. return 0;
  269. }
  270. static int
  271. pipe_read_release(struct inode *inode, struct file *filp)
  272. {
  273. return pipe_release(inode, 1, 0);
  274. }
  275. static int
  276. pipe_write_release(struct inode *inode, struct file *filp)
  277. {
  278. return pipe_release(inode, 0, 1);
  279. }
  280. static int
  281. pipe_rdwr_release(struct inode *inode, struct file *filp)
  282. {
  283. int decr, decw;
  284. decr = (filp->f_mode & FMODE_READ) != 0;
  285. decw = (filp->f_mode & FMODE_WRITE) != 0;
  286. return pipe_release(inode, decr, decw);
  287. }
  288. static int
  289. pipe_read_open(struct inode *inode, struct file *filp)
  290. {
  291. /* We could have perhaps used atomic_t, but this and friends
  292.    below are the only places.  So it doesn't seem worthwhile.  */
  293. down(PIPE_SEM(*inode));
  294. PIPE_READERS(*inode)++;
  295. up(PIPE_SEM(*inode));
  296. return 0;
  297. }
  298. static int
  299. pipe_write_open(struct inode *inode, struct file *filp)
  300. {
  301. down(PIPE_SEM(*inode));
  302. PIPE_WRITERS(*inode)++;
  303. up(PIPE_SEM(*inode));
  304. return 0;
  305. }
  306. static int
  307. pipe_rdwr_open(struct inode *inode, struct file *filp)
  308. {
  309. down(PIPE_SEM(*inode));
  310. if (filp->f_mode & FMODE_READ)
  311. PIPE_READERS(*inode)++;
  312. if (filp->f_mode & FMODE_WRITE)
  313. PIPE_WRITERS(*inode)++;
  314. up(PIPE_SEM(*inode));
  315. return 0;
  316. }
  317. /*
  318.  * The file_operations structs are not static because they
  319.  * are also used in linux/fs/fifo.c to do operations on FIFOs.
  320.  */
  321. struct file_operations read_fifo_fops = {
  322. llseek: no_llseek,
  323. read: pipe_read,
  324. write: bad_pipe_w,
  325. poll: fifo_poll,
  326. ioctl: pipe_ioctl,
  327. open: pipe_read_open,
  328. release: pipe_read_release,
  329. };
  330. struct file_operations write_fifo_fops = {
  331. llseek: no_llseek,
  332. read: bad_pipe_r,
  333. write: pipe_write,
  334. poll: fifo_poll,
  335. ioctl: pipe_ioctl,
  336. open: pipe_write_open,
  337. release: pipe_write_release,
  338. };
  339. struct file_operations rdwr_fifo_fops = {
  340. llseek: no_llseek,
  341. read: pipe_read,
  342. write: pipe_write,
  343. poll: fifo_poll,
  344. ioctl: pipe_ioctl,
  345. open: pipe_rdwr_open,
  346. release: pipe_rdwr_release,
  347. };
  348. struct file_operations read_pipe_fops = {
  349. llseek: no_llseek,
  350. read: pipe_read,
  351. write: bad_pipe_w,
  352. poll: pipe_poll,
  353. ioctl: pipe_ioctl,
  354. open: pipe_read_open,
  355. release: pipe_read_release,
  356. };
  357. struct file_operations write_pipe_fops = {
  358. llseek: no_llseek,
  359. read: bad_pipe_r,
  360. write: pipe_write,
  361. poll: pipe_poll,
  362. ioctl: pipe_ioctl,
  363. open: pipe_write_open,
  364. release: pipe_write_release,
  365. };
  366. struct file_operations rdwr_pipe_fops = {
  367. llseek: no_llseek,
  368. read: pipe_read,
  369. write: pipe_write,
  370. poll: pipe_poll,
  371. ioctl: pipe_ioctl,
  372. open: pipe_rdwr_open,
  373. release: pipe_rdwr_release,
  374. };
  375. struct inode* pipe_new(struct inode* inode)
  376. {
  377. unsigned long page;
  378. page = __get_free_page(GFP_USER);
  379. if (!page)
  380. return NULL;
  381. inode->i_pipe = kmalloc(sizeof(struct pipe_inode_info), GFP_KERNEL);
  382. if (!inode->i_pipe)
  383. goto fail_page;
  384. init_waitqueue_head(PIPE_WAIT(*inode));
  385. PIPE_BASE(*inode) = (char*) page;
  386. PIPE_START(*inode) = PIPE_LEN(*inode) = 0;
  387. PIPE_READERS(*inode) = PIPE_WRITERS(*inode) = 0;
  388. PIPE_WAITING_READERS(*inode) = PIPE_WAITING_WRITERS(*inode) = 0;
  389. PIPE_RCOUNTER(*inode) = PIPE_WCOUNTER(*inode) = 1;
  390. return inode;
  391. fail_page:
  392. free_page(page);
  393. return NULL;
  394. }
  395. static struct vfsmount *pipe_mnt;
  396. static int pipefs_delete_dentry(struct dentry *dentry)
  397. {
  398. return 1;
  399. }
  400. static struct dentry_operations pipefs_dentry_operations = {
  401. d_delete: pipefs_delete_dentry,
  402. };
  403. static struct inode * get_pipe_inode(void)
  404. {
  405. struct inode *inode = new_inode(pipe_mnt->mnt_sb);
  406. if (!inode)
  407. goto fail_inode;
  408. if(!pipe_new(inode))
  409. goto fail_iput;
  410. PIPE_READERS(*inode) = PIPE_WRITERS(*inode) = 1;
  411. inode->i_fop = &rdwr_pipe_fops;
  412. /*
  413.  * Mark the inode dirty from the very beginning,
  414.  * that way it will never be moved to the dirty
  415.  * list because "mark_inode_dirty()" will think
  416.  * that it already _is_ on the dirty list.
  417.  */
  418. inode->i_state = I_DIRTY;
  419. inode->i_mode = S_IFIFO | S_IRUSR | S_IWUSR;
  420. inode->i_uid = current->fsuid;
  421. inode->i_gid = current->fsgid;
  422. inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
  423. inode->i_blksize = PAGE_SIZE;
  424. return inode;
  425. fail_iput:
  426. iput(inode);
  427. fail_inode:
  428. return NULL;
  429. }
  430. int do_pipe(int *fd)
  431. {
  432. struct qstr this;
  433. char name[32];
  434. struct dentry *dentry;
  435. struct inode * inode;
  436. struct file *f1, *f2;
  437. int error;
  438. int i,j;
  439. error = -ENFILE;
  440. f1 = get_empty_filp();
  441. if (!f1)
  442. goto no_files;
  443. f2 = get_empty_filp();
  444. if (!f2)
  445. goto close_f1;
  446. inode = get_pipe_inode();
  447. if (!inode)
  448. goto close_f12;
  449. error = get_unused_fd();
  450. if (error < 0)
  451. goto close_f12_inode;
  452. i = error;
  453. error = get_unused_fd();
  454. if (error < 0)
  455. goto close_f12_inode_i;
  456. j = error;
  457. error = -ENOMEM;
  458. sprintf(name, "[%lu]", inode->i_ino);
  459. this.name = name;
  460. this.len = strlen(name);
  461. this.hash = inode->i_ino; /* will go */
  462. dentry = d_alloc(pipe_mnt->mnt_sb->s_root, &this);
  463. if (!dentry)
  464. goto close_f12_inode_i_j;
  465. dentry->d_op = &pipefs_dentry_operations;
  466. d_add(dentry, inode);
  467. f1->f_vfsmnt = f2->f_vfsmnt = mntget(mntget(pipe_mnt));
  468. f1->f_dentry = f2->f_dentry = dget(dentry);
  469. /* read file */
  470. f1->f_pos = f2->f_pos = 0;
  471. f1->f_flags = O_RDONLY;
  472. f1->f_op = &read_pipe_fops;
  473. f1->f_mode = 1;
  474. f1->f_version = 0;
  475. /* write file */
  476. f2->f_flags = O_WRONLY;
  477. f2->f_op = &write_pipe_fops;
  478. f2->f_mode = 2;
  479. f2->f_version = 0;
  480. fd_install(i, f1);
  481. fd_install(j, f2);
  482. fd[0] = i;
  483. fd[1] = j;
  484. return 0;
  485. close_f12_inode_i_j:
  486. put_unused_fd(j);
  487. close_f12_inode_i:
  488. put_unused_fd(i);
  489. close_f12_inode:
  490. free_page((unsigned long) PIPE_BASE(*inode));
  491. kfree(inode->i_pipe);
  492. inode->i_pipe = NULL;
  493. iput(inode);
  494. close_f12:
  495. put_filp(f2);
  496. close_f1:
  497. put_filp(f1);
  498. no_files:
  499. return error;
  500. }
  501. /*
  502.  * pipefs should _never_ be mounted by userland - too much of security hassle,
  503.  * no real gain from having the whole whorehouse mounted. So we don't need
  504.  * any operations on the root directory. However, we need a non-trivial
  505.  * d_name - pipe: will go nicely and kill the special-casing in procfs.
  506.  */
  507. static int pipefs_statfs(struct super_block *sb, struct statfs *buf)
  508. {
  509. buf->f_type = PIPEFS_MAGIC;
  510. buf->f_bsize = 1024;
  511. buf->f_namelen = 255;
  512. return 0;
  513. }
  514. static struct super_operations pipefs_ops = {
  515. statfs: pipefs_statfs,
  516. };
  517. static struct super_block * pipefs_read_super(struct super_block *sb, void *data, int silent)
  518. {
  519. struct inode *root = new_inode(sb);
  520. if (!root)
  521. return NULL;
  522. root->i_mode = S_IFDIR | S_IRUSR | S_IWUSR;
  523. root->i_uid = root->i_gid = 0;
  524. root->i_atime = root->i_mtime = root->i_ctime = CURRENT_TIME;
  525. sb->s_blocksize = 1024;
  526. sb->s_blocksize_bits = 10;
  527. sb->s_magic = PIPEFS_MAGIC;
  528. sb->s_op = &pipefs_ops;
  529. sb->s_root = d_alloc(NULL, &(const struct qstr) { "pipe:", 5, 0 });
  530. if (!sb->s_root) {
  531. iput(root);
  532. return NULL;
  533. }
  534. sb->s_root->d_sb = sb;
  535. sb->s_root->d_parent = sb->s_root;
  536. d_instantiate(sb->s_root, root);
  537. return sb;
  538. }
  539. static DECLARE_FSTYPE(pipe_fs_type, "pipefs", pipefs_read_super, FS_NOMOUNT);
  540. static int __init init_pipe_fs(void)
  541. {
  542. int err = register_filesystem(&pipe_fs_type);
  543. if (!err) {
  544. pipe_mnt = kern_mount(&pipe_fs_type);
  545. err = PTR_ERR(pipe_mnt);
  546. if (IS_ERR(pipe_mnt))
  547. unregister_filesystem(&pipe_fs_type);
  548. else
  549. err = 0;
  550. }
  551. return err;
  552. }
  553. static void __exit exit_pipe_fs(void)
  554. {
  555. unregister_filesystem(&pipe_fs_type);
  556. mntput(pipe_mnt);
  557. }
  558. module_init(init_pipe_fs)
  559. module_exit(exit_pipe_fs)