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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.