* Test timeout timeout timeout */
| 804 | * Test timeout <link> timeout <link> timeout |
| 805 | */ |
| 806 | static int test_timeout_flags2(struct io_uring *ring) |
| 807 | { |
| 808 | struct io_uring_sqe *sqe; |
| 809 | struct io_uring_cqe *cqe; |
| 810 | struct __kernel_timespec ts; |
| 811 | int ret, i; |
| 812 | |
| 813 | msec_to_ts(&ts, TIMEOUT_MSEC); |
| 814 | |
| 815 | sqe = io_uring_get_sqe(ring); |
| 816 | if (!sqe) { |
| 817 | fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__); |
| 818 | goto err; |
| 819 | } |
| 820 | io_uring_prep_timeout(sqe, &ts, 0, 0); |
| 821 | sqe->user_data = 1; |
| 822 | sqe->flags |= IOSQE_IO_LINK; |
| 823 | |
| 824 | sqe = io_uring_get_sqe(ring); |
| 825 | if (!sqe) { |
| 826 | fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__); |
| 827 | goto err; |
| 828 | } |
| 829 | io_uring_prep_timeout(sqe, &ts, 0, 0); |
| 830 | sqe->user_data = 2; |
| 831 | sqe->flags |= IOSQE_IO_LINK; |
| 832 | |
| 833 | sqe = io_uring_get_sqe(ring); |
| 834 | if (!sqe) { |
| 835 | fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__); |
| 836 | goto err; |
| 837 | } |
| 838 | io_uring_prep_timeout(sqe, &ts, 0, 0); |
| 839 | sqe->user_data = 3; |
| 840 | |
| 841 | ret = io_uring_submit(ring); |
| 842 | if (ret <= 0) { |
| 843 | fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret); |
| 844 | goto err; |
| 845 | } |
| 846 | |
| 847 | for (i = 0; i < 3; i++) { |
| 848 | ret = io_uring_wait_cqe(ring, &cqe); |
| 849 | if (ret < 0) { |
| 850 | fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret); |
| 851 | goto err; |
| 852 | } |
| 853 | |
| 854 | if (cqe->res == -EINVAL) { |
| 855 | if (!i) |
| 856 | fprintf(stdout, "%s: timeout flags not supported\n", |
| 857 | __FUNCTION__); |
| 858 | io_uring_cqe_seen(ring, cqe); |
| 859 | continue; |
| 860 | } |
| 861 | |
| 862 | switch (cqe->user_data) { |
| 863 | case 1: |
no test coverage detected