8a9973408177.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "../config-host.h"
  2. /* SPDX-License-Identifier: MIT */
  3. #include <errno.h>
  4. #include <stdio.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <fcntl.h>
  9. #include "liburing.h"
  10. #include "helpers.h"
  11. static int register_file(struct io_uring *ring)
  12. {
  13. char buf[32];
  14. int ret, fd;
  15. sprintf(buf, "./XXXXXX");
  16. fd = mkstemp(buf);
  17. if (fd < 0) {
  18. perror("open");
  19. return 1;
  20. }
  21. ret = io_uring_register_files(ring, &fd, 1);
  22. if (ret) {
  23. fprintf(stderr, "file register %d\n", ret);
  24. return 1;
  25. }
  26. ret = io_uring_unregister_files(ring);
  27. if (ret) {
  28. fprintf(stderr, "file register %d\n", ret);
  29. return 1;
  30. }
  31. unlink(buf);
  32. close(fd);
  33. return 0;
  34. }
  35. static int test_single_fsync(struct io_uring *ring)
  36. {
  37. struct io_uring_cqe *cqe;
  38. struct io_uring_sqe *sqe;
  39. char buf[32];
  40. int fd, ret;
  41. sprintf(buf, "./XXXXXX");
  42. fd = mkstemp(buf);
  43. if (fd < 0) {
  44. perror("open");
  45. return 1;
  46. }
  47. sqe = io_uring_get_sqe(ring);
  48. if (!sqe) {
  49. printf("get sqe failed\n");
  50. goto err;
  51. }
  52. io_uring_prep_fsync(sqe, fd, 0);
  53. ret = io_uring_submit(ring);
  54. if (ret <= 0) {
  55. printf("sqe submit failed: %d\n", ret);
  56. goto err;
  57. }
  58. ret = io_uring_wait_cqe(ring, &cqe);
  59. if (ret < 0) {
  60. printf("wait completion %d\n", ret);
  61. goto err;
  62. }
  63. io_uring_cqe_seen(ring, cqe);
  64. unlink(buf);
  65. return 0;
  66. err:
  67. unlink(buf);
  68. return 1;
  69. }
  70. int main(int argc, char *argv[])
  71. {
  72. struct io_uring ring;
  73. int ret;
  74. if (argc > 1)
  75. return T_EXIT_SKIP;
  76. ret = io_uring_queue_init(8, &ring, 0);
  77. if (ret) {
  78. printf("ring setup failed\n");
  79. return T_EXIT_FAIL;
  80. }
  81. ret = register_file(&ring);
  82. if (ret)
  83. return ret;
  84. ret = test_single_fsync(&ring);
  85. if (ret) {
  86. printf("test_single_fsync failed\n");
  87. return ret;
  88. }
  89. return T_EXIT_PASS;
  90. }