fs.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <linux/kernel.h>
  3. #include <linux/errno.h>
  4. #include <linux/fs.h>
  5. #include <linux/file.h>
  6. #include <linux/mm.h>
  7. #include <linux/slab.h>
  8. #include <linux/namei.h>
  9. #include <linux/io_uring.h>
  10. #include <uapi/linux/io_uring.h>
  11. #include "../fs/internal.h"
  12. #include "io_uring.h"
  13. #include "fs.h"
  14. struct io_rename {
  15. struct file *file;
  16. int old_dfd;
  17. int new_dfd;
  18. struct delayed_filename oldpath;
  19. struct delayed_filename newpath;
  20. int flags;
  21. };
  22. struct io_unlink {
  23. struct file *file;
  24. int dfd;
  25. int flags;
  26. struct delayed_filename filename;
  27. };
  28. struct io_mkdir {
  29. struct file *file;
  30. int dfd;
  31. umode_t mode;
  32. struct delayed_filename filename;
  33. };
  34. struct io_link {
  35. struct file *file;
  36. int old_dfd;
  37. int new_dfd;
  38. struct delayed_filename oldpath;
  39. struct delayed_filename newpath;
  40. int flags;
  41. };
  42. int io_renameat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
  43. {
  44. struct io_rename *ren = io_kiocb_to_cmd(req, struct io_rename);
  45. const char __user *oldf, *newf;
  46. int err;
  47. if (sqe->buf_index || sqe->splice_fd_in)
  48. return -EINVAL;
  49. if (unlikely(req->flags & REQ_F_FIXED_FILE))
  50. return -EBADF;
  51. ren->old_dfd = READ_ONCE(sqe->fd);
  52. oldf = u64_to_user_ptr(READ_ONCE(sqe->addr));
  53. newf = u64_to_user_ptr(READ_ONCE(sqe->addr2));
  54. ren->new_dfd = READ_ONCE(sqe->len);
  55. ren->flags = READ_ONCE(sqe->rename_flags);
  56. err = delayed_getname(&ren->oldpath, oldf);
  57. if (unlikely(err))
  58. return err;
  59. err = delayed_getname(&ren->newpath, newf);
  60. if (unlikely(err)) {
  61. dismiss_delayed_filename(&ren->oldpath);
  62. return err;
  63. }
  64. req->flags |= REQ_F_NEED_CLEANUP;
  65. req->flags |= REQ_F_FORCE_ASYNC;
  66. return 0;
  67. }
  68. int io_renameat(struct io_kiocb *req, unsigned int issue_flags)
  69. {
  70. struct io_rename *ren = io_kiocb_to_cmd(req, struct io_rename);
  71. CLASS(filename_complete_delayed, old)(&ren->oldpath);
  72. CLASS(filename_complete_delayed, new)(&ren->newpath);
  73. int ret;
  74. WARN_ON_ONCE(issue_flags & IO_URING_F_NONBLOCK);
  75. ret = filename_renameat2(ren->old_dfd, old,
  76. ren->new_dfd, new, ren->flags);
  77. req->flags &= ~REQ_F_NEED_CLEANUP;
  78. io_req_set_res(req, ret, 0);
  79. return IOU_COMPLETE;
  80. }
  81. void io_renameat_cleanup(struct io_kiocb *req)
  82. {
  83. struct io_rename *ren = io_kiocb_to_cmd(req, struct io_rename);
  84. dismiss_delayed_filename(&ren->oldpath);
  85. dismiss_delayed_filename(&ren->newpath);
  86. }
  87. int io_unlinkat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
  88. {
  89. struct io_unlink *un = io_kiocb_to_cmd(req, struct io_unlink);
  90. const char __user *fname;
  91. int err;
  92. if (sqe->off || sqe->len || sqe->buf_index || sqe->splice_fd_in)
  93. return -EINVAL;
  94. if (unlikely(req->flags & REQ_F_FIXED_FILE))
  95. return -EBADF;
  96. un->dfd = READ_ONCE(sqe->fd);
  97. un->flags = READ_ONCE(sqe->unlink_flags);
  98. if (un->flags & ~AT_REMOVEDIR)
  99. return -EINVAL;
  100. fname = u64_to_user_ptr(READ_ONCE(sqe->addr));
  101. err = delayed_getname(&un->filename, fname);
  102. if (unlikely(err))
  103. return err;
  104. req->flags |= REQ_F_NEED_CLEANUP;
  105. req->flags |= REQ_F_FORCE_ASYNC;
  106. return 0;
  107. }
  108. int io_unlinkat(struct io_kiocb *req, unsigned int issue_flags)
  109. {
  110. struct io_unlink *un = io_kiocb_to_cmd(req, struct io_unlink);
  111. CLASS(filename_complete_delayed, name)(&un->filename);
  112. int ret;
  113. WARN_ON_ONCE(issue_flags & IO_URING_F_NONBLOCK);
  114. if (un->flags & AT_REMOVEDIR)
  115. ret = filename_rmdir(un->dfd, name);
  116. else
  117. ret = filename_unlinkat(un->dfd, name);
  118. req->flags &= ~REQ_F_NEED_CLEANUP;
  119. io_req_set_res(req, ret, 0);
  120. return IOU_COMPLETE;
  121. }
  122. void io_unlinkat_cleanup(struct io_kiocb *req)
  123. {
  124. struct io_unlink *ul = io_kiocb_to_cmd(req, struct io_unlink);
  125. dismiss_delayed_filename(&ul->filename);
  126. }
  127. int io_mkdirat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
  128. {
  129. struct io_mkdir *mkd = io_kiocb_to_cmd(req, struct io_mkdir);
  130. const char __user *fname;
  131. int err;
  132. if (sqe->off || sqe->rw_flags || sqe->buf_index || sqe->splice_fd_in)
  133. return -EINVAL;
  134. if (unlikely(req->flags & REQ_F_FIXED_FILE))
  135. return -EBADF;
  136. mkd->dfd = READ_ONCE(sqe->fd);
  137. mkd->mode = READ_ONCE(sqe->len);
  138. fname = u64_to_user_ptr(READ_ONCE(sqe->addr));
  139. err = delayed_getname(&mkd->filename, fname);
  140. if (unlikely(err))
  141. return err;
  142. req->flags |= REQ_F_NEED_CLEANUP;
  143. req->flags |= REQ_F_FORCE_ASYNC;
  144. return 0;
  145. }
  146. int io_mkdirat(struct io_kiocb *req, unsigned int issue_flags)
  147. {
  148. struct io_mkdir *mkd = io_kiocb_to_cmd(req, struct io_mkdir);
  149. CLASS(filename_complete_delayed, name)(&mkd->filename);
  150. int ret;
  151. WARN_ON_ONCE(issue_flags & IO_URING_F_NONBLOCK);
  152. ret = filename_mkdirat(mkd->dfd, name, mkd->mode);
  153. req->flags &= ~REQ_F_NEED_CLEANUP;
  154. io_req_set_res(req, ret, 0);
  155. return IOU_COMPLETE;
  156. }
  157. void io_mkdirat_cleanup(struct io_kiocb *req)
  158. {
  159. struct io_mkdir *md = io_kiocb_to_cmd(req, struct io_mkdir);
  160. dismiss_delayed_filename(&md->filename);
  161. }
  162. int io_symlinkat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
  163. {
  164. struct io_link *sl = io_kiocb_to_cmd(req, struct io_link);
  165. const char __user *oldpath, *newpath;
  166. int err;
  167. if (sqe->len || sqe->rw_flags || sqe->buf_index || sqe->splice_fd_in)
  168. return -EINVAL;
  169. if (unlikely(req->flags & REQ_F_FIXED_FILE))
  170. return -EBADF;
  171. sl->new_dfd = READ_ONCE(sqe->fd);
  172. oldpath = u64_to_user_ptr(READ_ONCE(sqe->addr));
  173. newpath = u64_to_user_ptr(READ_ONCE(sqe->addr2));
  174. err = delayed_getname(&sl->oldpath, oldpath);
  175. if (unlikely(err))
  176. return err;
  177. err = delayed_getname(&sl->newpath, newpath);
  178. if (unlikely(err)) {
  179. dismiss_delayed_filename(&sl->oldpath);
  180. return err;
  181. }
  182. req->flags |= REQ_F_NEED_CLEANUP;
  183. req->flags |= REQ_F_FORCE_ASYNC;
  184. return 0;
  185. }
  186. int io_symlinkat(struct io_kiocb *req, unsigned int issue_flags)
  187. {
  188. struct io_link *sl = io_kiocb_to_cmd(req, struct io_link);
  189. CLASS(filename_complete_delayed, old)(&sl->oldpath);
  190. CLASS(filename_complete_delayed, new)(&sl->newpath);
  191. int ret;
  192. WARN_ON_ONCE(issue_flags & IO_URING_F_NONBLOCK);
  193. ret = filename_symlinkat(old, sl->new_dfd, new);
  194. req->flags &= ~REQ_F_NEED_CLEANUP;
  195. io_req_set_res(req, ret, 0);
  196. return IOU_COMPLETE;
  197. }
  198. int io_linkat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
  199. {
  200. struct io_link *lnk = io_kiocb_to_cmd(req, struct io_link);
  201. const char __user *oldf, *newf;
  202. int err;
  203. if (sqe->buf_index || sqe->splice_fd_in)
  204. return -EINVAL;
  205. if (unlikely(req->flags & REQ_F_FIXED_FILE))
  206. return -EBADF;
  207. lnk->old_dfd = READ_ONCE(sqe->fd);
  208. lnk->new_dfd = READ_ONCE(sqe->len);
  209. oldf = u64_to_user_ptr(READ_ONCE(sqe->addr));
  210. newf = u64_to_user_ptr(READ_ONCE(sqe->addr2));
  211. lnk->flags = READ_ONCE(sqe->hardlink_flags);
  212. err = delayed_getname_uflags(&lnk->oldpath, oldf, lnk->flags);
  213. if (unlikely(err))
  214. return err;
  215. err = delayed_getname(&lnk->newpath, newf);
  216. if (unlikely(err)) {
  217. dismiss_delayed_filename(&lnk->oldpath);
  218. return err;
  219. }
  220. req->flags |= REQ_F_NEED_CLEANUP;
  221. req->flags |= REQ_F_FORCE_ASYNC;
  222. return 0;
  223. }
  224. int io_linkat(struct io_kiocb *req, unsigned int issue_flags)
  225. {
  226. struct io_link *lnk = io_kiocb_to_cmd(req, struct io_link);
  227. CLASS(filename_complete_delayed, old)(&lnk->oldpath);
  228. CLASS(filename_complete_delayed, new)(&lnk->newpath);
  229. int ret;
  230. WARN_ON_ONCE(issue_flags & IO_URING_F_NONBLOCK);
  231. ret = filename_linkat(lnk->old_dfd, old, lnk->new_dfd, new, lnk->flags);
  232. req->flags &= ~REQ_F_NEED_CLEANUP;
  233. io_req_set_res(req, ret, 0);
  234. return IOU_COMPLETE;
  235. }
  236. void io_link_cleanup(struct io_kiocb *req)
  237. {
  238. struct io_link *sl = io_kiocb_to_cmd(req, struct io_link);
  239. dismiss_delayed_filename(&sl->oldpath);
  240. dismiss_delayed_filename(&sl->newpath);
  241. }