pipe.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  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 <linux/fs.h>
  13. #include <linux/mount.h>
  14. #include <linux/pipe_fs_i.h>
  15. #include <linux/uio.h>
  16. #include <linux/highmem.h>
  17. #include <asm/uaccess.h>
  18. #include <asm/ioctls.h>
  19. /*
  20. * We use a start+len construction, which provides full use of the
  21. * allocated memory.
  22. * -- Florian Coosmann (FGC)
  23. *
  24. * Reads with count = 0 should always return 0.
  25. * -- Julian Bradfield 1999-06-07.
  26. *
  27. * FIFOs and Pipes now generate SIGIO for both readers and writers.
  28. * -- Jeremy Elson <jelson@circlemud.org> 2001-08-16
  29. *
  30. * pipe_read & write cleanup
  31. * -- Manfred Spraul <manfred@colorfullife.com> 2002-05-09
  32. */
  33. /* Drop the inode semaphore and wait for a pipe event, atomically */
  34. void pipe_wait(struct inode * inode)
  35. {
  36. DEFINE_WAIT(wait);
  37. prepare_to_wait(PIPE_WAIT(*inode), &wait, TASK_INTERRUPTIBLE);
  38. up(PIPE_SEM(*inode));
  39. schedule();
  40. finish_wait(PIPE_WAIT(*inode), &wait);
  41. down(PIPE_SEM(*inode));
  42. }
  43. static inline int
  44. pipe_iov_copy_from_user(void *to, struct iovec *iov, unsigned long len)
  45. {
  46. unsigned long copy;
  47. while (len > 0) {
  48. while (!iov->iov_len)
  49. iov++;
  50. copy = min_t(unsigned long, len, iov->iov_len);
  51. if (copy_from_user(to, iov->iov_base, copy))
  52. return -EFAULT;
  53. to += copy;
  54. len -= copy;
  55. iov->iov_base += copy;
  56. iov->iov_len -= copy;
  57. }
  58. return 0;
  59. }
  60. static inline int
  61. pipe_iov_copy_to_user(struct iovec *iov, const void *from, unsigned long len)
  62. {
  63. unsigned long copy;
  64. while (len > 0) {
  65. while (!iov->iov_len)
  66. iov++;
  67. copy = min_t(unsigned long, len, iov->iov_len);
  68. if (copy_to_user(iov->iov_base, from, copy))
  69. return -EFAULT;
  70. from += copy;
  71. len -= copy;
  72. iov->iov_base += copy;
  73. iov->iov_len -= copy;
  74. }
  75. return 0;
  76. }
  77. static void anon_pipe_buf_release(struct pipe_inode_info *info, struct pipe_buffer *buf)
  78. {
  79. struct page *page = buf->page;
  80. if (info->tmp_page) {
  81. __free_page(page);
  82. return;
  83. }
  84. info->tmp_page = page;
  85. }
  86. static void *anon_pipe_buf_map(struct file *file, struct pipe_inode_info *info, struct pipe_buffer *buf)
  87. {
  88. return kmap(buf->page);
  89. }
  90. static void anon_pipe_buf_unmap(struct pipe_inode_info *info, struct pipe_buffer *buf)
  91. {
  92. kunmap(buf->page);
  93. }
  94. static struct pipe_buf_operations anon_pipe_buf_ops = {
  95. .can_merge = 1,
  96. .map = anon_pipe_buf_map,
  97. .unmap = anon_pipe_buf_unmap,
  98. .release = anon_pipe_buf_release,
  99. };
  100. static ssize_t
  101. pipe_readv(struct file *filp, const struct iovec *_iov,
  102. unsigned long nr_segs, loff_t *ppos)
  103. {
  104. struct inode *inode = filp->f_dentry->d_inode;
  105. struct pipe_inode_info *info;
  106. int do_wakeup;
  107. ssize_t ret;
  108. struct iovec *iov = (struct iovec *)_iov;
  109. size_t total_len;
  110. total_len = iov_length(iov, nr_segs);
  111. /* Null read succeeds. */
  112. if (unlikely(total_len == 0))
  113. return 0;
  114. do_wakeup = 0;
  115. ret = 0;
  116. down(PIPE_SEM(*inode));
  117. info = inode->i_pipe;
  118. for (;;) {
  119. int bufs = info->nrbufs;
  120. if (bufs) {
  121. int curbuf = info->curbuf;
  122. struct pipe_buffer *buf = info->bufs + curbuf;
  123. struct pipe_buf_operations *ops = buf->ops;
  124. void *addr;
  125. size_t chars = buf->len;
  126. int error;
  127. if (chars > total_len)
  128. chars = total_len;
  129. addr = ops->map(filp, info, buf);
  130. error = pipe_iov_copy_to_user(iov, addr + buf->offset, chars);
  131. ops->unmap(info, buf);
  132. if (unlikely(error)) {
  133. if (!ret) ret = -EFAULT;
  134. break;
  135. }
  136. ret += chars;
  137. buf->offset += chars;
  138. buf->len -= chars;
  139. if (!buf->len) {
  140. buf->ops = NULL;
  141. ops->release(info, buf);
  142. curbuf = (curbuf + 1) & (PIPE_BUFFERS-1);
  143. info->curbuf = curbuf;
  144. info->nrbufs = --bufs;
  145. do_wakeup = 1;
  146. }
  147. total_len -= chars;
  148. if (!total_len)
  149. break; /* common path: read succeeded */
  150. }
  151. if (bufs) /* More to do? */
  152. continue;
  153. if (!PIPE_WRITERS(*inode))
  154. break;
  155. if (!PIPE_WAITING_WRITERS(*inode)) {
  156. /* syscall merging: Usually we must not sleep
  157. * if O_NONBLOCK is set, or if we got some data.
  158. * But if a writer sleeps in kernel space, then
  159. * we can wait for that data without violating POSIX.
  160. */
  161. if (ret)
  162. break;
  163. if (filp->f_flags & O_NONBLOCK) {
  164. ret = -EAGAIN;
  165. break;
  166. }
  167. }
  168. if (signal_pending(current)) {
  169. if (!ret) ret = -ERESTARTSYS;
  170. break;
  171. }
  172. if (do_wakeup) {
  173. wake_up_interruptible_sync(PIPE_WAIT(*inode));
  174. kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT);
  175. }
  176. pipe_wait(inode);
  177. }
  178. up(PIPE_SEM(*inode));
  179. /* Signal writers asynchronously that there is more room. */
  180. if (do_wakeup) {
  181. wake_up_interruptible(PIPE_WAIT(*inode));
  182. kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT);
  183. }
  184. if (ret > 0)
  185. file_accessed(filp);
  186. return ret;
  187. }
  188. static ssize_t
  189. pipe_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
  190. {
  191. struct iovec iov = { .iov_base = buf, .iov_len = count };
  192. return pipe_readv(filp, &iov, 1, ppos);
  193. }
  194. static ssize_t
  195. pipe_writev(struct file *filp, const struct iovec *_iov,
  196. unsigned long nr_segs, loff_t *ppos)
  197. {
  198. struct inode *inode = filp->f_dentry->d_inode;
  199. struct pipe_inode_info *info;
  200. ssize_t ret;
  201. int do_wakeup;
  202. struct iovec *iov = (struct iovec *)_iov;
  203. size_t total_len;
  204. ssize_t chars;
  205. total_len = iov_length(iov, nr_segs);
  206. /* Null write succeeds. */
  207. if (unlikely(total_len == 0))
  208. return 0;
  209. do_wakeup = 0;
  210. ret = 0;
  211. down(PIPE_SEM(*inode));
  212. info = inode->i_pipe;
  213. if (!PIPE_READERS(*inode)) {
  214. send_sig(SIGPIPE, current, 0);
  215. ret = -EPIPE;
  216. goto out;
  217. }
  218. /* We try to merge small writes */
  219. chars = total_len & (PAGE_SIZE-1); /* size of the last buffer */
  220. if (info->nrbufs && chars != 0) {
  221. int lastbuf = (info->curbuf + info->nrbufs - 1) & (PIPE_BUFFERS-1);
  222. struct pipe_buffer *buf = info->bufs + lastbuf;
  223. struct pipe_buf_operations *ops = buf->ops;
  224. int offset = buf->offset + buf->len;
  225. if (ops->can_merge && offset + chars <= PAGE_SIZE) {
  226. void *addr = ops->map(filp, info, buf);
  227. int error = pipe_iov_copy_from_user(offset + addr, iov, chars);
  228. ops->unmap(info, buf);
  229. ret = error;
  230. do_wakeup = 1;
  231. if (error)
  232. goto out;
  233. buf->len += chars;
  234. total_len -= chars;
  235. ret = chars;
  236. if (!total_len)
  237. goto out;
  238. }
  239. }
  240. for (;;) {
  241. int bufs;
  242. if (!PIPE_READERS(*inode)) {
  243. send_sig(SIGPIPE, current, 0);
  244. if (!ret) ret = -EPIPE;
  245. break;
  246. }
  247. bufs = info->nrbufs;
  248. if (bufs < PIPE_BUFFERS) {
  249. int newbuf = (info->curbuf + bufs) & (PIPE_BUFFERS-1);
  250. struct pipe_buffer *buf = info->bufs + newbuf;
  251. struct page *page = info->tmp_page;
  252. int error;
  253. if (!page) {
  254. page = alloc_page(GFP_HIGHUSER);
  255. if (unlikely(!page)) {
  256. ret = ret ? : -ENOMEM;
  257. break;
  258. }
  259. info->tmp_page = page;
  260. }
  261. /* Always wakeup, even if the copy fails. Otherwise
  262. * we lock up (O_NONBLOCK-)readers that sleep due to
  263. * syscall merging.
  264. * FIXME! Is this really true?
  265. */
  266. do_wakeup = 1;
  267. chars = PAGE_SIZE;
  268. if (chars > total_len)
  269. chars = total_len;
  270. error = pipe_iov_copy_from_user(kmap(page), iov, chars);
  271. kunmap(page);
  272. if (unlikely(error)) {
  273. if (!ret) ret = -EFAULT;
  274. break;
  275. }
  276. ret += chars;
  277. /* Insert it into the buffer array */
  278. buf->page = page;
  279. buf->ops = &anon_pipe_buf_ops;
  280. buf->offset = 0;
  281. buf->len = chars;
  282. info->nrbufs = ++bufs;
  283. info->tmp_page = NULL;
  284. total_len -= chars;
  285. if (!total_len)
  286. break;
  287. }
  288. if (bufs < PIPE_BUFFERS)
  289. continue;
  290. if (filp->f_flags & O_NONBLOCK) {
  291. if (!ret) ret = -EAGAIN;
  292. break;
  293. }
  294. if (signal_pending(current)) {
  295. if (!ret) ret = -ERESTARTSYS;
  296. break;
  297. }
  298. if (do_wakeup) {
  299. wake_up_interruptible_sync(PIPE_WAIT(*inode));
  300. kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN);
  301. do_wakeup = 0;
  302. }
  303. PIPE_WAITING_WRITERS(*inode)++;
  304. pipe_wait(inode);
  305. PIPE_WAITING_WRITERS(*inode)--;
  306. }
  307. out:
  308. up(PIPE_SEM(*inode));
  309. if (do_wakeup) {
  310. wake_up_interruptible(PIPE_WAIT(*inode));
  311. kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN);
  312. }
  313. if (ret > 0)
  314. inode_update_time(inode, 1); /* mtime and ctime */
  315. return ret;
  316. }
  317. static ssize_t
  318. pipe_write(struct file *filp, const char __user *buf,
  319. size_t count, loff_t *ppos)
  320. {
  321. struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = count };
  322. return pipe_writev(filp, &iov, 1, ppos);
  323. }
  324. static ssize_t
  325. bad_pipe_r(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
  326. {
  327. return -EBADF;
  328. }
  329. static ssize_t
  330. bad_pipe_w(struct file *filp, const char __user *buf, size_t count, loff_t *ppos)
  331. {
  332. return -EBADF;
  333. }
  334. static int
  335. pipe_ioctl(struct inode *pino, struct file *filp,
  336. unsigned int cmd, unsigned long arg)
  337. {
  338. struct inode *inode = filp->f_dentry->d_inode;
  339. struct pipe_inode_info *info;
  340. int count, buf, nrbufs;
  341. switch (cmd) {
  342. case FIONREAD:
  343. down(PIPE_SEM(*inode));
  344. info = inode->i_pipe;
  345. count = 0;
  346. buf = info->curbuf;
  347. nrbufs = info->nrbufs;
  348. while (--nrbufs >= 0) {
  349. count += info->bufs[buf].len;
  350. buf = (buf+1) & (PIPE_BUFFERS-1);
  351. }
  352. up(PIPE_SEM(*inode));
  353. return put_user(count, (int __user *)arg);
  354. default:
  355. return -EINVAL;
  356. }
  357. }
  358. /* No kernel lock held - fine */
  359. static unsigned int
  360. pipe_poll(struct file *filp, poll_table *wait)
  361. {
  362. unsigned int mask;
  363. struct inode *inode = filp->f_dentry->d_inode;
  364. struct pipe_inode_info *info = inode->i_pipe;
  365. int nrbufs;
  366. poll_wait(filp, PIPE_WAIT(*inode), wait);
  367. /* Reading only -- no need for acquiring the semaphore. */
  368. nrbufs = info->nrbufs;
  369. mask = 0;
  370. if (filp->f_mode & FMODE_READ) {
  371. mask = (nrbufs > 0) ? POLLIN | POLLRDNORM : 0;
  372. if (!PIPE_WRITERS(*inode) && filp->f_version != PIPE_WCOUNTER(*inode))
  373. mask |= POLLHUP;
  374. }
  375. if (filp->f_mode & FMODE_WRITE) {
  376. mask |= (nrbufs < PIPE_BUFFERS) ? POLLOUT | POLLWRNORM : 0;
  377. if (!PIPE_READERS(*inode))
  378. mask |= POLLERR;
  379. }
  380. return mask;
  381. }
  382. /* FIXME: most Unices do not set POLLERR for fifos */
  383. #define fifo_poll pipe_poll
  384. static int
  385. pipe_release(struct inode *inode, int decr, int decw)
  386. {
  387. down(PIPE_SEM(*inode));
  388. PIPE_READERS(*inode) -= decr;
  389. PIPE_WRITERS(*inode) -= decw;
  390. if (!PIPE_READERS(*inode) && !PIPE_WRITERS(*inode)) {
  391. free_pipe_info(inode);
  392. } else {
  393. wake_up_interruptible(PIPE_WAIT(*inode));
  394. kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN);
  395. kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT);
  396. }
  397. up(PIPE_SEM(*inode));
  398. return 0;
  399. }
  400. static int
  401. pipe_read_fasync(int fd, struct file *filp, int on)
  402. {
  403. struct inode *inode = filp->f_dentry->d_inode;
  404. int retval;
  405. down(PIPE_SEM(*inode));
  406. retval = fasync_helper(fd, filp, on, PIPE_FASYNC_READERS(*inode));
  407. up(PIPE_SEM(*inode));
  408. if (retval < 0)
  409. return retval;
  410. return 0;
  411. }
  412. static int
  413. pipe_write_fasync(int fd, struct file *filp, int on)
  414. {
  415. struct inode *inode = filp->f_dentry->d_inode;
  416. int retval;
  417. down(PIPE_SEM(*inode));
  418. retval = fasync_helper(fd, filp, on, PIPE_FASYNC_WRITERS(*inode));
  419. up(PIPE_SEM(*inode));
  420. if (retval < 0)
  421. return retval;
  422. return 0;
  423. }
  424. static int
  425. pipe_rdwr_fasync(int fd, struct file *filp, int on)
  426. {
  427. struct inode *inode = filp->f_dentry->d_inode;
  428. int retval;
  429. down(PIPE_SEM(*inode));
  430. retval = fasync_helper(fd, filp, on, PIPE_FASYNC_READERS(*inode));
  431. if (retval >= 0)
  432. retval = fasync_helper(fd, filp, on, PIPE_FASYNC_WRITERS(*inode));
  433. up(PIPE_SEM(*inode));
  434. if (retval < 0)
  435. return retval;
  436. return 0;
  437. }
  438. static int
  439. pipe_read_release(struct inode *inode, struct file *filp)
  440. {
  441. pipe_read_fasync(-1, filp, 0);
  442. return pipe_release(inode, 1, 0);
  443. }
  444. static int
  445. pipe_write_release(struct inode *inode, struct file *filp)
  446. {
  447. pipe_write_fasync(-1, filp, 0);
  448. return pipe_release(inode, 0, 1);
  449. }
  450. static int
  451. pipe_rdwr_release(struct inode *inode, struct file *filp)
  452. {
  453. int decr, decw;
  454. pipe_rdwr_fasync(-1, filp, 0);
  455. decr = (filp->f_mode & FMODE_READ) != 0;
  456. decw = (filp->f_mode & FMODE_WRITE) != 0;
  457. return pipe_release(inode, decr, decw);
  458. }
  459. static int
  460. pipe_read_open(struct inode *inode, struct file *filp)
  461. {
  462. /* We could have perhaps used atomic_t, but this and friends
  463. below are the only places. So it doesn't seem worthwhile. */
  464. down(PIPE_SEM(*inode));
  465. PIPE_READERS(*inode)++;
  466. up(PIPE_SEM(*inode));
  467. return 0;
  468. }
  469. static int
  470. pipe_write_open(struct inode *inode, struct file *filp)
  471. {
  472. down(PIPE_SEM(*inode));
  473. PIPE_WRITERS(*inode)++;
  474. up(PIPE_SEM(*inode));
  475. return 0;
  476. }
  477. static int
  478. pipe_rdwr_open(struct inode *inode, struct file *filp)
  479. {
  480. down(PIPE_SEM(*inode));
  481. if (filp->f_mode & FMODE_READ)
  482. PIPE_READERS(*inode)++;
  483. if (filp->f_mode & FMODE_WRITE)
  484. PIPE_WRITERS(*inode)++;
  485. up(PIPE_SEM(*inode));
  486. return 0;
  487. }
  488. /*
  489. * The file_operations structs are not static because they
  490. * are also used in linux/fs/fifo.c to do operations on FIFOs.
  491. */
  492. struct file_operations read_fifo_fops = {
  493. .llseek = no_llseek,
  494. .read = pipe_read,
  495. .readv = pipe_readv,
  496. .write = bad_pipe_w,
  497. .poll = fifo_poll,
  498. .ioctl = pipe_ioctl,
  499. .open = pipe_read_open,
  500. .release = pipe_read_release,
  501. .fasync = pipe_read_fasync,
  502. };
  503. struct file_operations write_fifo_fops = {
  504. .llseek = no_llseek,
  505. .read = bad_pipe_r,
  506. .write = pipe_write,
  507. .writev = pipe_writev,
  508. .poll = fifo_poll,
  509. .ioctl = pipe_ioctl,
  510. .open = pipe_write_open,
  511. .release = pipe_write_release,
  512. .fasync = pipe_write_fasync,
  513. };
  514. struct file_operations rdwr_fifo_fops = {
  515. .llseek = no_llseek,
  516. .read = pipe_read,
  517. .readv = pipe_readv,
  518. .write = pipe_write,
  519. .writev = pipe_writev,
  520. .poll = fifo_poll,
  521. .ioctl = pipe_ioctl,
  522. .open = pipe_rdwr_open,
  523. .release = pipe_rdwr_release,
  524. .fasync = pipe_rdwr_fasync,
  525. };
  526. struct file_operations read_pipe_fops = {
  527. .llseek = no_llseek,
  528. .read = pipe_read,
  529. .readv = pipe_readv,
  530. .write = bad_pipe_w,
  531. .poll = pipe_poll,
  532. .ioctl = pipe_ioctl,
  533. .open = pipe_read_open,
  534. .release = pipe_read_release,
  535. .fasync = pipe_read_fasync,
  536. };
  537. struct file_operations write_pipe_fops = {
  538. .llseek = no_llseek,
  539. .read = bad_pipe_r,
  540. .write = pipe_write,
  541. .writev = pipe_writev,
  542. .poll = pipe_poll,
  543. .ioctl = pipe_ioctl,
  544. .open = pipe_write_open,
  545. .release = pipe_write_release,
  546. .fasync = pipe_write_fasync,
  547. };
  548. struct file_operations rdwr_pipe_fops = {
  549. .llseek = no_llseek,
  550. .read = pipe_read,
  551. .readv = pipe_readv,
  552. .write = pipe_write,
  553. .writev = pipe_writev,
  554. .poll = pipe_poll,
  555. .ioctl = pipe_ioctl,
  556. .open = pipe_rdwr_open,
  557. .release = pipe_rdwr_release,
  558. .fasync = pipe_rdwr_fasync,
  559. };
  560. void free_pipe_info(struct inode *inode)
  561. {
  562. int i;
  563. struct pipe_inode_info *info = inode->i_pipe;
  564. inode->i_pipe = NULL;
  565. for (i = 0; i < PIPE_BUFFERS; i++) {
  566. struct pipe_buffer *buf = info->bufs + i;
  567. if (buf->ops)
  568. buf->ops->release(info, buf);
  569. }
  570. if (info->tmp_page)
  571. __free_page(info->tmp_page);
  572. kfree(info);
  573. }
  574. struct inode* pipe_new(struct inode* inode)
  575. {
  576. struct pipe_inode_info *info;
  577. info = kmalloc(sizeof(struct pipe_inode_info), GFP_KERNEL);
  578. if (!info)
  579. goto fail_page;
  580. memset(info, 0, sizeof(*info));
  581. inode->i_pipe = info;
  582. init_waitqueue_head(PIPE_WAIT(*inode));
  583. PIPE_RCOUNTER(*inode) = PIPE_WCOUNTER(*inode) = 1;
  584. return inode;
  585. fail_page:
  586. return NULL;
  587. }
  588. static struct vfsmount *pipe_mnt;
  589. static int pipefs_delete_dentry(struct dentry *dentry)
  590. {
  591. return 1;
  592. }
  593. static struct dentry_operations pipefs_dentry_operations = {
  594. .d_delete = pipefs_delete_dentry,
  595. };
  596. static struct inode * get_pipe_inode(void)
  597. {
  598. struct inode *inode = new_inode(pipe_mnt->mnt_sb);
  599. if (!inode)
  600. goto fail_inode;
  601. if(!pipe_new(inode))
  602. goto fail_iput;
  603. PIPE_READERS(*inode) = PIPE_WRITERS(*inode) = 1;
  604. inode->i_fop = &rdwr_pipe_fops;
  605. /*
  606. * Mark the inode dirty from the very beginning,
  607. * that way it will never be moved to the dirty
  608. * list because "mark_inode_dirty()" will think
  609. * that it already _is_ on the dirty list.
  610. */
  611. inode->i_state = I_DIRTY;
  612. inode->i_mode = S_IFIFO | S_IRUSR | S_IWUSR;
  613. inode->i_uid = current->fsuid;
  614. inode->i_gid = current->fsgid;
  615. inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
  616. inode->i_blksize = PAGE_SIZE;
  617. return inode;
  618. fail_iput:
  619. iput(inode);
  620. fail_inode:
  621. return NULL;
  622. }
  623. int do_pipe(int *fd)
  624. {
  625. struct qstr this;
  626. char name[32];
  627. struct dentry *dentry;
  628. struct inode * inode;
  629. struct file *f1, *f2;
  630. int error;
  631. int i,j;
  632. error = -ENFILE;
  633. f1 = get_empty_filp();
  634. if (!f1)
  635. goto no_files;
  636. f2 = get_empty_filp();
  637. if (!f2)
  638. goto close_f1;
  639. inode = get_pipe_inode();
  640. if (!inode)
  641. goto close_f12;
  642. error = get_unused_fd();
  643. if (error < 0)
  644. goto close_f12_inode;
  645. i = error;
  646. error = get_unused_fd();
  647. if (error < 0)
  648. goto close_f12_inode_i;
  649. j = error;
  650. error = -ENOMEM;
  651. sprintf(name, "[%lu]", inode->i_ino);
  652. this.name = name;
  653. this.len = strlen(name);
  654. this.hash = inode->i_ino; /* will go */
  655. dentry = d_alloc(pipe_mnt->mnt_sb->s_root, &this);
  656. if (!dentry)
  657. goto close_f12_inode_i_j;
  658. dentry->d_op = &pipefs_dentry_operations;
  659. d_add(dentry, inode);
  660. f1->f_vfsmnt = f2->f_vfsmnt = mntget(mntget(pipe_mnt));
  661. f1->f_dentry = f2->f_dentry = dget(dentry);
  662. f1->f_mapping = f2->f_mapping = inode->i_mapping;
  663. /* read file */
  664. f1->f_pos = f2->f_pos = 0;
  665. f1->f_flags = O_RDONLY;
  666. f1->f_op = &read_pipe_fops;
  667. f1->f_mode = FMODE_READ;
  668. f1->f_version = 0;
  669. /* write file */
  670. f2->f_flags = O_WRONLY;
  671. f2->f_op = &write_pipe_fops;
  672. f2->f_mode = FMODE_WRITE;
  673. f2->f_version = 0;
  674. fd_install(i, f1);
  675. fd_install(j, f2);
  676. fd[0] = i;
  677. fd[1] = j;
  678. return 0;
  679. close_f12_inode_i_j:
  680. put_unused_fd(j);
  681. close_f12_inode_i:
  682. put_unused_fd(i);
  683. close_f12_inode:
  684. free_pipe_info(inode);
  685. iput(inode);
  686. close_f12:
  687. put_filp(f2);
  688. close_f1:
  689. put_filp(f1);
  690. no_files:
  691. return error;
  692. }
  693. /*
  694. * pipefs should _never_ be mounted by userland - too much of security hassle,
  695. * no real gain from having the whole whorehouse mounted. So we don't need
  696. * any operations on the root directory. However, we need a non-trivial
  697. * d_name - pipe: will go nicely and kill the special-casing in procfs.
  698. */
  699. static struct super_block *pipefs_get_sb(struct file_system_type *fs_type,
  700. int flags, const char *dev_name, void *data)
  701. {
  702. return get_sb_pseudo(fs_type, "pipe:", NULL, PIPEFS_MAGIC);
  703. }
  704. static struct file_system_type pipe_fs_type = {
  705. .name = "pipefs",
  706. .get_sb = pipefs_get_sb,
  707. .kill_sb = kill_anon_super,
  708. };
  709. static int __init init_pipe_fs(void)
  710. {
  711. int err = register_filesystem(&pipe_fs_type);
  712. if (!err) {
  713. pipe_mnt = kern_mount(&pipe_fs_type);
  714. if (IS_ERR(pipe_mnt)) {
  715. err = PTR_ERR(pipe_mnt);
  716. unregister_filesystem(&pipe_fs_type);
  717. }
  718. }
  719. return err;
  720. }
  721. static void __exit exit_pipe_fs(void)
  722. {
  723. unregister_filesystem(&pipe_fs_type);
  724. mntput(pipe_mnt);
  725. }
  726. fs_initcall(init_pipe_fs);
  727. module_exit(exit_pipe_fs);