diff options
| author | Sebastian Vater | 2025-10-24 11:14:46 +0200 |
|---|---|---|
| committer | Sebastian Vater | 2025-10-24 11:14:46 +0200 |
| commit | 2a58eee9f7d5b64963efce143a1f07f8aefa54e3 (patch) | |
| tree | 9fb17a9d996227a772637b997ab630c0504fdad8 | |
| parent | Made iSCSI SCSI task reference counter atomic. (diff) | |
| download | dnbd3-2a58eee9f7d5b64963efce143a1f07f8aefa54e3.tar.gz dnbd3-2a58eee9f7d5b64963efce143a1f07f8aefa54e3.tar.xz dnbd3-2a58eee9f7d5b64963efce143a1f07f8aefa54e3.zip | |
Made iSCSI PDU reference counter atomic, too.
| -rw-r--r-- | src/server/iscsi.c | 8 | ||||
| -rw-r--r-- | src/server/iscsi.h | 2 |
2 files changed, 5 insertions, 5 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; diff --git a/src/server/iscsi.h b/src/server/iscsi.h index 447cd4e..ff07933 100644 --- a/src/server/iscsi.h +++ b/src/server/iscsi.h @@ -11782,7 +11782,7 @@ typedef struct iscsi_pdu { int flags; /// Reference counter. - uint32_t ref; + _Atomic uint32_t ref; /// Bytes of Basic Header Segment (BHS) already read. uint bhs_pos; |
