pipe.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:14k
源码类别:

嵌入式Linux

开发平台:

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