From: Dan Carpenter <dan.carpenter@oracle.com>
To: thomas@glanzmann.de
Cc: target-devel@vger.kernel.org
Subject: [bug report] iscsi-target: Implement demo_mode_discovery logic
Date: Mon, 23 Aug 2021 18:37:36 +0300 [thread overview]
Message-ID: <20210823153736.GA23510@kili> (raw)
Hello SCSI heros!
The patch 2dd1d53fe004: "iscsi-target: Implement demo_mode_discovery
logic" from Oct 7, 2013, leads to the following
Smatch static checker warning:
drivers/target/iscsi/iscsi_target.c:3397 iscsit_build_sendtargets_response()
warn: sleeping in atomic context
drivers/target/iscsi/iscsi_target.c
3378 spin_lock(&tiqn_lock);
^^^^^^^^^^^^^^^^^^^^
3379 list_for_each_entry(tiqn, &g_tiqn_list, tiqn_list) {
3380 if ((cmd->cmd_flags & ICF_SENDTARGETS_SINGLE) &&
3381 strcmp(tiqn->tiqn, text_ptr)) {
3382 continue;
3383 }
3384
3385 target_name_printed = 0;
3386
3387 spin_lock(&tiqn->tiqn_tpg_lock);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
We're holding a couple spinlocks.
3388 list_for_each_entry(tpg, &tiqn->tiqn_tpg_list, tpg_list) {
3389
3390 /* If demo_mode_discovery=0 and generate_node_acls=0
3391 * (demo mode dislabed) do not return
3392 * TargetName+TargetAddress unless a NodeACL exists.
3393 */
3394
3395 if ((tpg->tpg_attrib.generate_node_acls == 0) &&
3396 (tpg->tpg_attrib.demo_mode_discovery == 0) &&
--> 3397 (!target_tpg_has_node_acl(&tpg->tpg_se_tpg,
^^^^^^^^^^^^^^^^^^^^^^^
The target_tpg_has_node_acl() calls mutex_lock() which can sleep so this
is a sleeping in atomic bug.
3398 cmd->conn->sess->sess_ops->InitiatorName))) {
3399 continue;
3400 }
3401
3402 spin_lock(&tpg->tpg_state_lock);
3403 active = (tpg->tpg_state == TPG_STATE_ACTIVE);
3404 spin_unlock(&tpg->tpg_state_lock);
3405
3406 if (!active && tpg->tpg_attrib.tpg_enabled_sendtargets)
3407 continue;
3408
3409 spin_lock(&tpg->tpg_np_lock);
3410 list_for_each_entry(tpg_np, &tpg->tpg_gnp_list,
3411 tpg_np_list) {
3412 struct iscsi_np *np = tpg_np->tpg_np;
3413 struct sockaddr_storage *sockaddr;
3414
3415 if (np->np_network_transport != network_transport)
3416 continue;
3417
3418 if (!target_name_printed) {
3419 len = sprintf(buf, "TargetName=%s",
3420 tiqn->tiqn);
3421 len += 1;
3422
3423 if ((len + payload_len) > buffer_len) {
3424 spin_unlock(&tpg->tpg_np_lock);
3425 spin_unlock(&tiqn->tiqn_tpg_lock);
3426 end_of_buf = 1;
3427 goto eob;
3428 }
3429
3430 if (skip_bytes && len <= skip_bytes) {
3431 skip_bytes -= len;
3432 } else {
3433 memcpy(payload + payload_len, buf, len);
3434 payload_len += len;
3435 target_name_printed = 1;
3436 if (len > skip_bytes)
3437 skip_bytes = 0;
3438 }
3439 }
3440
3441 if (inet_addr_is_any((struct sockaddr *)&np->np_sockaddr))
3442 sockaddr = &conn->local_sockaddr;
3443 else
3444 sockaddr = &np->np_sockaddr;
3445
3446 len = sprintf(buf, "TargetAddress="
3447 "%pISpc,%hu",
3448 sockaddr,
3449 tpg->tpgt);
3450 len += 1;
3451
3452 if ((len + payload_len) > buffer_len) {
3453 spin_unlock(&tpg->tpg_np_lock);
3454 spin_unlock(&tiqn->tiqn_tpg_lock);
3455 end_of_buf = 1;
3456 goto eob;
3457 }
3458
3459 if (skip_bytes && len <= skip_bytes) {
3460 skip_bytes -= len;
3461 } else {
3462 memcpy(payload + payload_len, buf, len);
3463 payload_len += len;
3464 if (len > skip_bytes)
3465 skip_bytes = 0;
3466 }
3467 }
3468 spin_unlock(&tpg->tpg_np_lock);
3469 }
3470 spin_unlock(&tiqn->tiqn_tpg_lock);
3471 eob:
3472 if (end_of_buf) {
3473 *completed = false;
3474 break;
3475 }
3476
3477 if (cmd->cmd_flags & ICF_SENDTARGETS_SINGLE)
3478 break;
3479 }
3480 spin_unlock(&tiqn_lock);
3481
3482 cmd->buf_ptr = payload;
3483
3484 return payload_len;
3485 }
regards,
dan carpenter
reply other threads:[~2021-08-23 15:38 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210823153736.GA23510@kili \
--to=dan.carpenter@oracle.com \
--cc=target-devel@vger.kernel.org \
--cc=thomas@glanzmann.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox