Dua submission queue entry io_uring yang bersebelahan pada kondisi normal merupakan request independen. Menetapkan IOSQE_IO_LINK pada entry pertama mengubah hubungan itu: request berikutnya tidak mulai sebelum request yang ditautkan selesai. Pengulangan flag tersebut membentuk rantai berurutan di dalam satu batch submission.

Sifat pengurutan ini lebih sempit daripada serialisasi queue secara global. Request di luar rantai tetap dapat berjalan secara independen, dan rantai terpisah dapat berjalan tumpang tindih. Sebuah link dengan demikian menyatakan dependensi antar-SQE tertentu, bukan memasang barrier pada seluruh ring.

Flag menunjuk dari satu SQE ke SQE berikutnya

IOSQE_IO_LINK berada pada SQE yang mendahului sisi dependensi:

struct io_uring_sqe *a = io_uring_get_sqe(&ring);
io_uring_prep_read(a, src_fd, buf, len, 0);
a->flags |= IOSQE_IO_LINK;

struct io_uring_sqe *b = io_uring_get_sqe(&ring);
io_uring_prep_write(b, dst_fd, buf, len, 0);

Operasi write tidak dapat mulai sebelum read selesai. Untuk memperpanjang rantai, flag yang sama juga dipasang pada b dan SQE lain ditempatkan setelahnya. SQE pertama tanpa flag link mengakhiri rantai.

Rantai tidak melintasi batas submission. SQE terakhir yang diberi IOSQE_IO_LINK tidak dapat menyimpan sisi dependensi untuk SQE yang baru dikirim kemudian. Seluruh anggota yang ditautkan harus berada dalam submission yang sama.

IOSQE_IO_LINK biasa kerap disebut soft link. Jika sebuah request memutus rantai, request yang belum dimulai pada sisa rantai selesai dengan -ECANCELED.

Kondisi pemutusan lebih luas daripada kode error negatif. Linux io_uring juga memperlakukan hasil tak terduga sebagai hasil yang memutus soft link. Short read merupakan contoh penting: operasi dapat berhasil memindahkan data, tetapi hasil yang lebih pendek dari panjang yang diminta tetap dapat menghentikan rantai dependensi.

Perbedaan ini penting bagi pipeline yang request berikutnya mengasumsikan buffer penuh. Rantai menyandikan urutan sekaligus kondisi completion yang ditentukan oleh semantik opcode. Sifatnya tidak sama dengan mengirim beberapa operasi asinkron lalu sekadar meminta kernel mempertahankan urutannya.

IOSQE_IO_HARDLINK juga menautkan SQE ke penerusnya, tetapi hasil completion tidak memutus rantai dengan cara yang sama:

struct io_uring_sqe *a = io_uring_get_sqe(&ring);
io_uring_prep_read(a, src_fd, buf, len, 0);
a->flags |= IOSQE_IO_HARDLINK;

struct io_uring_sqe *b = io_uring_get_sqe(&ring);
io_uring_prep_fsync(b, dst_fd, 0);

Request kedua tetap terurut setelah request pertama, sedangkan error atau hasil completion tak terduga dari request pertama tidak dengan sendirinya membatalkan penerusnya. Sifat ini sesuai ketika dependensi urutan tetap berlaku meskipun operasi sebelumnya melaporkan kegagalan.

Hard link bukan primitive transaksi tanpa syarat. Kegagalan submission pada parent request tetap dapat memutus link, dan setiap operasi mempertahankan hasil completion masing-masing. API ini menyediakan semantik pengurutan dan kelanjutan rantai; tidak ada rollback atau atomicity lintas operasi kernel yang terpisah.

Rantai tertaut tidak menserialkan seluruh ring

Misalkan sebuah submission memuat dua rantai dan satu request independen:

A -> B -> C
D -> E
F

Di dalam tiap rantai, penerus menunggu pendahulunya. Hubungan link tidak mengharuskan D menunggu C, atau F menunggu salah satu rantai. Kernel dapat menjalankan unit independen tersebut secara bersamaan ketika operasi dan konteks eksekusinya memungkinkan.

Batas ini membedakan IOSQE_IO_LINK dari IOSQE_IO_DRAIN. Drain request membatasi pekerjaan relatif terhadap SQE yang telah dikirim sebelumnya dan SQE yang mulai sesudahnya, sedangkan link hanya membatasi rantai yang dibentuk entry bersebelahan. Menyamakan keduanya sebagai flag pengurutan generik menghilangkan perbedaan cakupan yang penting.

Completion queue tetap memisahkan setiap operasi

Link tidak menggabungkan beberapa request menjadi satu completion record. Setiap SQE pada kondisi normal menghasilkan CQE sendiri, sehingga aplikasi tetap mengidentifikasi dan memproses hasil tiap operasi. Saat soft chain terputus, request pemicu membawa hasilnya sendiri dan penerus yang belum dimulai melaporkan -ECANCELED.

Fitur seperti IOSQE_CQE_SKIP_SUCCESS dapat mengubah apakah operasi yang berhasil menghasilkan CQE, tetapi itu merupakan kebijakan pelaporan completion yang terpisah. Rantai dependensi tetap merupakan hubungan antar-operasi yang telah dikirim.

Model akhirnya memiliki batas yang tegas: link hanya menserialkan dependensi yang dinyatakan, soft link dapat meneruskan completion yang gagal atau tak terduga menjadi pembatalan sisa rantai, dan hard link mempertahankan pengurutan lintas hasil completion. Tidak satu pun sifat tersebut mengubah rantai menjadi barrier global untuk ring atau transaksi multioperasi.