summaryrefslogtreecommitdiffstats
path: root/src/server/iscsi.c
diff options
context:
space:
mode:
authorSebastian Vater2025-10-24 11:14:46 +0200
committerSebastian Vater2025-10-24 11:14:46 +0200
commit2a58eee9f7d5b64963efce143a1f07f8aefa54e3 (patch)
tree9fb17a9d996227a772637b997ab630c0504fdad8 /src/server/iscsi.c
parentMade iSCSI SCSI task reference counter atomic. (diff)
downloaddnbd3-2a58eee9f7d5b64963efce143a1f07f8aefa54e3.tar.gz
dnbd3-2a58eee9f7d5b64963efce143a1f07f8aefa54e3.tar.xz
dnbd3-2a58eee9f7d5b64963efce143a1f07f8aefa54e3.zip
Made iSCSI PDU reference counter atomic, too.
Diffstat (limited to 'src/server/iscsi.c')
-rw-r--r--src/server/iscsi.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/server/iscsi.c b/src/server/iscsi.c
index 79e398b..23d7b3b 100644
--- a/src/server/iscsi.c
+++ b/src/server/iscsi.c
@@ -11590,7 +11590,7 @@ iscsi_pdu *iscsi_connection_pdu_create(iscsi_connection *conn, const uint ahs_le
pdu->xfer_complete_callback = NULL;
pdu->xfer_complete_user_data = NULL;
pdu->flags = 0;
- pdu->ref = 1UL;
+ atomic_init( &pdu->ref, 1UL );
pdu->bhs_pos = 0U;
pdu->ahs_pos = 0U;
pdu->ahs_len = ahs_len;
@@ -11622,7 +11622,7 @@ iscsi_pdu *iscsi_connection_pdu_create(iscsi_connection *conn, const uint ahs_le
*/
void iscsi_connection_pdu_destroy(iscsi_pdu *pdu)
{
- if ( (pdu != NULL) && (--pdu->ref == 0UL) ) {
+ if ( (pdu != NULL) && (atomic_fetch_sub_explicit( &pdu->ref, 1UL, memory_order_acq_rel) == 1UL) ) {
if ( pdu->bhs_pkt != NULL ) {
free( pdu->bhs_pkt );
@@ -12397,7 +12397,7 @@ static int iscsi_connection_pdu_header_handle_scsi_cmd(iscsi_connection *conn, i
task->scsi_task.init_port = conn->init_port;
task->init_task_tag = iscsi_get_be32(scsi_cmd_pkt->init_task_tag);
task->pdu = pdu;
- pdu->ref++;
+ atomic_fetch_add_explicit( &pdu->ref, 1UL, memory_order_release );
const uint64_t lun = iscsi_get_be64(scsi_cmd_pkt->lun);
const int lun_id = iscsi_scsi_lun_get_from_iscsi( lun );
@@ -13193,7 +13193,7 @@ static int iscsi_task_sub_task_submit_write(iscsi_connection *conn, iscsi_task *
sub_task->scsi_task.len = pdu->ds_len;
pdu->task = sub_task;
- pdu->ref++;
+ atomic_fetch_add_explicit( &pdu->ref, 1UL, memory_order_release );
task->pos += pdu->ds_len;