pipe.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836
  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. /*
  378. * Most Unices do not set POLLERR for FIFOs but on Linux they
  379. * behave exactly like pipes for poll().
  380. */
  381. if (!PIPE_READERS(*inode))
  382. mask |= POLLERR;
  383. }
  384. return mask;
  385. }
  386. static int
  387. pipe_release(struct inode *inode, int decr, int decw)
  388. {
  389. down(PIPE_SEM(*inode));
  390. PIPE_READERS(*inode) -= decr;
  391. PIPE_WRITERS(*inode) -= decw;
  392. if (!PIPE_READERS(*inode) && !PIPE_WRITERS(*inode)) {
  393. free_pipe_info(inode);
  394. } else {
  395. wake_up_interruptible(PIPE_WAIT(*inode));
  396. kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN);
  397. kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT);
  398. }
  399. up(PIPE_SEM(*inode));
  400. return 0;
  401. }
  402. static int
  403. pipe_read_fasync(int fd, struct file *filp, int on)
  404. {
  405. struct inode *inode = filp->f_dentry->d_inode;
  406. int retval;
  407. down(PIPE_SEM(*inode));
  408. retval = fasync_helper(fd, filp, on, PIPE_FASYNC_READERS(*inode));
  409. up(PIPE_SEM(*inode));
  410. if (retval < 0)
  411. return retval;
  412. return 0;
  413. }
  414. static int
  415. pipe_write_fasync(int fd, struct file *filp, int on)
  416. {
  417. struct inode *inode = filp->f_dentry->d_inode;
  418. int retval;
  419. down(PIPE_SEM(*inode));
  420. retval = fasync_helper(fd, filp, on, PIPE_FASYNC_WRITERS(*inode));
  421. up(PIPE_SEM(*inode));
  422. if (retval < 0)
  423. return retval;
  424. return 0;
  425. }
  426. static int
  427. pipe_rdwr_fasync(int fd, struct file *filp, int on)
  428. {
  429. struct inode *inode = filp->f_dentry->d_inode;
  430. int retval;
  431. down(PIPE_SEM(*inode));
  432. retval = fasync_helper(fd, filp, on, PIPE_FASYNC_READERS(*inode));
  433. if (retval >= 0)
  434. retval = fasync_helper(fd, filp, on, PIPE_FASYNC_WRITERS(*inode));
  435. up(PIPE_SEM(*inode));
  436. if (retval < 0)
  437. return retval;
  438. return 0;
  439. }
  440. static int
  441. pipe_read_release(struct inode *inode, struct file *filp)
  442. {
  443. pipe_read_fasync(-1, filp, 0);
  444. return pipe_release(inode, 1, 0);
  445. }
  446. static int
  447. pipe_write_release(struct inode *inode, struct file *filp)
  448. {
  449. pipe_write_fasync(-1, filp, 0);
  450. return pipe_release(inode, 0, 1);
  451. }
  452. static int
  453. pipe_rdwr_release(struct inode *inode, struct file *filp)
  454. {
  455. int decr, decw;
  456. pipe_rdwr_fasync(-1, filp, 0);
  457. decr = (filp->f_mode & FMODE_READ) != 0;
  458. decw = (filp->f_mode & FMODE_WRITE) != 0;
  459. return pipe_release(inode, decr, decw);
  460. }
  461. static int
  462. pipe_read_open(struct inode *inode, struct file *filp)
  463. {
  464. /* We could have perhaps used atomic_t, but this and friends
  465. below are the only places. So it doesn't seem worthwhile. */
  466. down(PIPE_SEM(*inode));
  467. PIPE_READERS(*inode)++;
  468. up(PIPE_SEM(*inode));
  469. return 0;
  470. }
  471. static int
  472. pipe_write_open(struct inode *inode, struct file *filp)
  473. {
  474. down(PIPE_SEM(*inode));
  475. PIPE_WRITERS(*inode)++;
  476. up(PIPE_SEM(*inode));
  477. return 0;
  478. }
  479. static int
  480. pipe_rdwr_open(struct inode *inode, struct file *filp)
  481. {
  482. down(PIPE_SEM(*inode));
  483. if (filp->f_mode & FMODE_READ)
  484. PIPE_READERS(*inode)++;
  485. if (filp->f_mode & FMODE_WRITE)
  486. PIPE_WRITERS(*inode)++;
  487. up(PIPE_SEM(*inode));
  488. return 0;
  489. }
  490. /*
  491. * The file_operations structs are not static because they
  492. * are also used in linux/fs/fifo.c to do operations on FIFOs.
  493. */
  494. struct file_operations read_fifo_fops = {
  495. .llseek = no_llseek,
  496. .read = pipe_read,
  497. .readv = pipe_readv,
  498. .write = bad_pipe_w,
  499. .poll = pipe_poll,
  500. .ioctl = pipe_ioctl,
  501. .open = pipe_read_open,
  502. .release = pipe_read_release,
  503. .fasync = pipe_read_fasync,
  504. };
  505. struct file_operations write_fifo_fops = {
  506. .llseek = no_llseek,
  507. .read = bad_pipe_r,
  508. .write = pipe_write,
  509. .writev = pipe_writev,
  510. .poll = pipe_poll,
  511. .ioctl = pipe_ioctl,
  512. .open = pipe_write_open,
  513. .release = pipe_write_release,
  514. .fasync = pipe_write_fasync,
  515. };
  516. struct file_operations rdwr_fifo_fops = {
  517. .llseek = no_llseek,
  518. .read = pipe_read,
  519. .readv = pipe_readv,
  520. .write = pipe_write,
  521. .writev = pipe_writev,
  522. .poll = pipe_poll,
  523. .ioctl = pipe_ioctl,
  524. .open = pipe_rdwr_open,
  525. .release = pipe_rdwr_release,
  526. .fasync = pipe_rdwr_fasync,
  527. };
  528. struct file_operations read_pipe_fops = {
  529. .llseek = no_llseek,
  530. .read = pipe_read,
  531. .readv = pipe_readv,
  532. .write = bad_pipe_w,
  533. .poll = pipe_poll,
  534. .ioctl = pipe_ioctl,
  535. .open = pipe_read_open,
  536. .release = pipe_read_release,
  537. .fasync = pipe_read_fasync,
  538. };
  539. struct file_operations write_pipe_fops = {
  540. .llseek = no_llseek,
  541. .read = bad_pipe_r,
  542. .write = pipe_write,
  543. .writev = pipe_writev,
  544. .poll = pipe_poll,
  545. .ioctl = pipe_ioctl,
  546. .open = pipe_write_open,
  547. .release = pipe_write_release,
  548. .fasync = pipe_write_fasync,
  549. };
  550. struct file_operations rdwr_pipe_fops = {
  551. .llseek = no_llseek,
  552. .read = pipe_read,
  553. .readv = pipe_readv,
  554. .write = pipe_write,
  555. .writev = pipe_writev,
  556. .poll = pipe_poll,
  557. .ioctl = pipe_ioctl,
  558. .open = pipe_rdwr_open,
  559. .release = pipe_rdwr_release,
  560. .fasync = pipe_rdwr_fasync,
  561. };
  562. void free_pipe_info(struct inode *inode)
  563. {
  564. int i;
  565. struct pipe_inode_info *info = inode->i_pipe;
  566. inode->i_pipe = NULL;
  567. for (i = 0; i < PIPE_BUFFERS; i++) {
  568. struct pipe_buffer *buf = info->bufs + i;
  569. if (buf->ops)
  570. buf->ops->release(info, buf);
  571. }
  572. if (info->tmp_page)
  573. __free_page(info->tmp_page);
  574. kfree(info);
  575. }
  576. struct inode* pipe_new(struct inode* inode)
  577. {
  578. struct pipe_inode_info *info;
  579. info = kmalloc(sizeof(struct pipe_inode_info), GFP_KERNEL);
  580. if (!info)
  581. goto fail_page;
  582. memset(info, 0, sizeof(*info));
  583. inode->i_pipe = info;
  584. init_waitqueue_head(PIPE_WAIT(*inode));
  585. PIPE_RCOUNTER(*inode) = PIPE_WCOUNTER(*inode) = 1;
  586. return inode;
  587. fail_page:
  588. return NULL;
  589. }
  590. static struct vfsmount *pipe_mnt;
  591. static int pipefs_delete_dentry(struct dentry *dentry)
  592. {
  593. return 1;
  594. }
  595. static struct dentry_operations pipefs_dentry_operations = {
  596. .d_delete = pipefs_delete_dentry,
  597. };
  598. static struct inode * get_pipe_inode(void)
  599. {
  600. struct inode *inode = new_inode(pipe_mnt->mnt_sb);
  601. if (!inode)
  602. goto fail_inode;
  603. if(!pipe_new(inode))
  604. goto fail_iput;
  605. PIPE_READERS(*inode) = PIPE_WRITERS(*inode) = 1;
  606. inode->i_fop = &rdwr_pipe_fops;
  607. /*
  608. * Mark the inode dirty from the very beginning,
  609. * that way it will never be moved to the dirty
  610. * list because "mark_inode_dirty()" will think
  611. * that it already _is_ on the dirty list.
  612. */
  613. inode->i_state = I_DIRTY;
  614. inode->i_mode = S_IFIFO | S_IRUSR | S_IWUSR;
  615. inode->i_uid = current->fsuid;
  616. inode->i_gid = current->fsgid;
  617. inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
  618. inode->i_blksize = PAGE_SIZE;
  619. return inode;
  620. fail_iput:
  621. iput(inode);
  622. fail_inode:
  623. return NULL;
  624. }
  625. int do_pipe(int *fd)
  626. {
  627. struct qstr this;
  628. char name[32];
  629. struct dentry *dentry;
  630. struct inode * inode;
  631. struct file *f1, *f2;
  632. int error;
  633. int i,j;
  634. error = -ENFILE;
  635. f1 = get_empty_filp();
  636. if (!f1)
  637. goto no_files;
  638. f2 = get_empty_filp();
  639. if (!f2)
  640. goto close_f1;
  641. inode = get_pipe_inode();
  642. if (!inode)
  643. goto close_f12;
  644. error = get_unused_fd();
  645. if (error < 0)
  646. goto close_f12_inode;
  647. i = error;
  648. error = get_unused_fd();
  649. if (error < 0)
  650. goto close_f12_inode_i;
  651. j = error;
  652. error = -ENOMEM;
  653. sprintf(name, "[%lu]", inode->i_ino);
  654. this.name = name;
  655. this.len = strlen(name);
  656. this.hash = inode->i_ino; /* will go */
  657. dentry = d_alloc(pipe_mnt->mnt_sb->s_root, &this);
  658. if (!dentry)
  659. goto close_f12_inode_i_j;
  660. dentry->d_op = &pipefs_dentry_operations;
  661. d_add(dentry, inode);
  662. f1->f_vfsmnt = f2->f_vfsmnt = mntget(mntget(pipe_mnt));
  663. f1->f_dentry = f2->f_dentry = dget(dentry);
  664. f1->f_mapping = f2->f_mapping = inode->i_mapping;
  665. /* read file */
  666. f1->f_pos = f2->f_pos = 0;
  667. f1->f_flags = O_RDONLY;
  668. f1->f_op = &read_pipe_fops;
  669. f1->f_mode = FMODE_READ;
  670. f1->f_version = 0;
  671. /* write file */
  672. f2->f_flags = O_WRONLY;
  673. f2->f_op = &write_pipe_fops;
  674. f2->f_mode = FMODE_WRITE;
  675. f2->f_version = 0;
  676. fd_install(i, f1);
  677. fd_install(j, f2);
  678. fd[0] = i;
  679. fd[1] = j;
  680. return 0;
  681. close_f12_inode_i_j:
  682. put_unused_fd(j);
  683. close_f12_inode_i:
  684. put_unused_fd(i);
  685. close_f12_inode:
  686. free_pipe_info(inode);
  687. iput(inode);
  688. close_f12:
  689. put_filp(f2);
  690. close_f1:
  691. put_filp(f1);
  692. no_files:
  693. return error;
  694. }
  695. /*
  696. * pipefs should _never_ be mounted by userland - too much of security hassle,
  697. * no real gain from having the whole whorehouse mounted. So we don't need
  698. * any operations on the root directory. However, we need a non-trivial
  699. * d_name - pipe: will go nicely and kill the special-casing in procfs.
  700. */
  701. static struct super_block *pipefs_get_sb(struct file_system_type *fs_type,
  702. int flags, const char *dev_name, void *data)
  703. {
  704. return get_sb_pseudo(fs_type, "pipe:", NULL, PIPEFS_MAGIC);
  705. }
  706. static struct file_system_type pipe_fs_type = {
  707. .name = "pipefs",
  708. .get_sb = pipefs_get_sb,
  709. .kill_sb = kill_anon_super,
  710. };
  711. static int __init init_pipe_fs(void)
  712. {
  713. int err = register_filesystem(&pipe_fs_type);
  714. if (!err) {
  715. pipe_mnt = kern_mount(&pipe_fs_type);
  716. if (IS_ERR(pipe_mnt)) {
  717. err = PTR_ERR(pipe_mnt);
  718. unregister_filesystem(&pipe_fs_type);
  719. }
  720. }
  721. return err;
  722. }
  723. static void __exit exit_pipe_fs(void)
  724. {
  725. unregister_filesystem(&pipe_fs_type);
  726. mntput(pipe_mnt);
  727. }
  728. fs_initcall(init_pipe_fs);
  729. module_exit(exit_pipe_fs);