.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /******************************************************************************* |
---|
2 | 3 | * This file contains the configfs implementation for iSCSI Target mode |
---|
3 | 4 | * from the LIO-Target Project. |
---|
.. | .. |
---|
6 | 7 | * |
---|
7 | 8 | * Author: Nicholas A. Bellinger <nab@linux-iscsi.org> |
---|
8 | 9 | * |
---|
9 | | - * This program is free software; you can redistribute it and/or modify |
---|
10 | | - * it under the terms of the GNU General Public License as published by |
---|
11 | | - * the Free Software Foundation; either version 2 of the License, or |
---|
12 | | - * (at your option) any later version. |
---|
13 | | - * |
---|
14 | | - * This program is distributed in the hope that it will be useful, |
---|
15 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
16 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
17 | | - * GNU General Public License for more details. |
---|
18 | 10 | ****************************************************************************/ |
---|
19 | 11 | |
---|
20 | 12 | #include <linux/configfs.h> |
---|
.. | .. |
---|
516 | 508 | spin_lock_bh(&se_nacl->nacl_sess_lock); |
---|
517 | 509 | se_sess = se_nacl->nacl_sess; |
---|
518 | 510 | if (!se_sess) { |
---|
519 | | - rb += sprintf(page+rb, "No active iSCSI Session for Initiator" |
---|
| 511 | + rb += sysfs_emit_at(page, rb, "No active iSCSI Session for Initiator" |
---|
520 | 512 | " Endpoint: %s\n", se_nacl->initiatorname); |
---|
521 | 513 | } else { |
---|
522 | 514 | sess = se_sess->fabric_sess_ptr; |
---|
523 | 515 | |
---|
524 | | - rb += sprintf(page+rb, "InitiatorName: %s\n", |
---|
| 516 | + rb += sysfs_emit_at(page, rb, "InitiatorName: %s\n", |
---|
525 | 517 | sess->sess_ops->InitiatorName); |
---|
526 | | - rb += sprintf(page+rb, "InitiatorAlias: %s\n", |
---|
| 518 | + rb += sysfs_emit_at(page, rb, "InitiatorAlias: %s\n", |
---|
527 | 519 | sess->sess_ops->InitiatorAlias); |
---|
528 | 520 | |
---|
529 | | - rb += sprintf(page+rb, |
---|
| 521 | + rb += sysfs_emit_at(page, rb, |
---|
530 | 522 | "LIO Session ID: %u ISID: 0x%6ph TSIH: %hu ", |
---|
531 | 523 | sess->sid, sess->isid, sess->tsih); |
---|
532 | | - rb += sprintf(page+rb, "SessionType: %s\n", |
---|
| 524 | + rb += sysfs_emit_at(page, rb, "SessionType: %s\n", |
---|
533 | 525 | (sess->sess_ops->SessionType) ? |
---|
534 | 526 | "Discovery" : "Normal"); |
---|
535 | | - rb += sprintf(page+rb, "Session State: "); |
---|
| 527 | + rb += sysfs_emit_at(page, rb, "Session State: "); |
---|
536 | 528 | switch (sess->session_state) { |
---|
537 | 529 | case TARG_SESS_STATE_FREE: |
---|
538 | | - rb += sprintf(page+rb, "TARG_SESS_FREE\n"); |
---|
| 530 | + rb += sysfs_emit_at(page, rb, "TARG_SESS_FREE\n"); |
---|
539 | 531 | break; |
---|
540 | 532 | case TARG_SESS_STATE_ACTIVE: |
---|
541 | | - rb += sprintf(page+rb, "TARG_SESS_STATE_ACTIVE\n"); |
---|
| 533 | + rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_ACTIVE\n"); |
---|
542 | 534 | break; |
---|
543 | 535 | case TARG_SESS_STATE_LOGGED_IN: |
---|
544 | | - rb += sprintf(page+rb, "TARG_SESS_STATE_LOGGED_IN\n"); |
---|
| 536 | + rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_LOGGED_IN\n"); |
---|
545 | 537 | break; |
---|
546 | 538 | case TARG_SESS_STATE_FAILED: |
---|
547 | | - rb += sprintf(page+rb, "TARG_SESS_STATE_FAILED\n"); |
---|
| 539 | + rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_FAILED\n"); |
---|
548 | 540 | break; |
---|
549 | 541 | case TARG_SESS_STATE_IN_CONTINUE: |
---|
550 | | - rb += sprintf(page+rb, "TARG_SESS_STATE_IN_CONTINUE\n"); |
---|
| 542 | + rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_IN_CONTINUE\n"); |
---|
551 | 543 | break; |
---|
552 | 544 | default: |
---|
553 | | - rb += sprintf(page+rb, "ERROR: Unknown Session" |
---|
| 545 | + rb += sysfs_emit_at(page, rb, "ERROR: Unknown Session" |
---|
554 | 546 | " State!\n"); |
---|
555 | 547 | break; |
---|
556 | 548 | } |
---|
557 | 549 | |
---|
558 | | - rb += sprintf(page+rb, "---------------------[iSCSI Session" |
---|
| 550 | + rb += sysfs_emit_at(page, rb, "---------------------[iSCSI Session" |
---|
559 | 551 | " Values]-----------------------\n"); |
---|
560 | | - rb += sprintf(page+rb, " CmdSN/WR : CmdSN/WC : ExpCmdSN" |
---|
| 552 | + rb += sysfs_emit_at(page, rb, " CmdSN/WR : CmdSN/WC : ExpCmdSN" |
---|
561 | 553 | " : MaxCmdSN : ITT : TTT\n"); |
---|
562 | 554 | max_cmd_sn = (u32) atomic_read(&sess->max_cmd_sn); |
---|
563 | | - rb += sprintf(page+rb, " 0x%08x 0x%08x 0x%08x 0x%08x" |
---|
| 555 | + rb += sysfs_emit_at(page, rb, " 0x%08x 0x%08x 0x%08x 0x%08x" |
---|
564 | 556 | " 0x%08x 0x%08x\n", |
---|
565 | 557 | sess->cmdsn_window, |
---|
566 | 558 | (max_cmd_sn - sess->exp_cmd_sn) + 1, |
---|
567 | 559 | sess->exp_cmd_sn, max_cmd_sn, |
---|
568 | 560 | sess->init_task_tag, sess->targ_xfer_tag); |
---|
569 | | - rb += sprintf(page+rb, "----------------------[iSCSI" |
---|
| 561 | + rb += sysfs_emit_at(page, rb, "----------------------[iSCSI" |
---|
570 | 562 | " Connections]-------------------------\n"); |
---|
571 | 563 | |
---|
572 | 564 | spin_lock(&sess->conn_lock); |
---|
573 | 565 | list_for_each_entry(conn, &sess->sess_conn_list, conn_list) { |
---|
574 | | - rb += sprintf(page+rb, "CID: %hu Connection" |
---|
| 566 | + rb += sysfs_emit_at(page, rb, "CID: %hu Connection" |
---|
575 | 567 | " State: ", conn->cid); |
---|
576 | 568 | switch (conn->conn_state) { |
---|
577 | 569 | case TARG_CONN_STATE_FREE: |
---|
578 | | - rb += sprintf(page+rb, |
---|
| 570 | + rb += sysfs_emit_at(page, rb, |
---|
579 | 571 | "TARG_CONN_STATE_FREE\n"); |
---|
580 | 572 | break; |
---|
581 | 573 | case TARG_CONN_STATE_XPT_UP: |
---|
582 | | - rb += sprintf(page+rb, |
---|
| 574 | + rb += sysfs_emit_at(page, rb, |
---|
583 | 575 | "TARG_CONN_STATE_XPT_UP\n"); |
---|
584 | 576 | break; |
---|
585 | 577 | case TARG_CONN_STATE_IN_LOGIN: |
---|
586 | | - rb += sprintf(page+rb, |
---|
| 578 | + rb += sysfs_emit_at(page, rb, |
---|
587 | 579 | "TARG_CONN_STATE_IN_LOGIN\n"); |
---|
588 | 580 | break; |
---|
589 | 581 | case TARG_CONN_STATE_LOGGED_IN: |
---|
590 | | - rb += sprintf(page+rb, |
---|
| 582 | + rb += sysfs_emit_at(page, rb, |
---|
591 | 583 | "TARG_CONN_STATE_LOGGED_IN\n"); |
---|
592 | 584 | break; |
---|
593 | 585 | case TARG_CONN_STATE_IN_LOGOUT: |
---|
594 | | - rb += sprintf(page+rb, |
---|
| 586 | + rb += sysfs_emit_at(page, rb, |
---|
595 | 587 | "TARG_CONN_STATE_IN_LOGOUT\n"); |
---|
596 | 588 | break; |
---|
597 | 589 | case TARG_CONN_STATE_LOGOUT_REQUESTED: |
---|
598 | | - rb += sprintf(page+rb, |
---|
| 590 | + rb += sysfs_emit_at(page, rb, |
---|
599 | 591 | "TARG_CONN_STATE_LOGOUT_REQUESTED\n"); |
---|
600 | 592 | break; |
---|
601 | 593 | case TARG_CONN_STATE_CLEANUP_WAIT: |
---|
602 | | - rb += sprintf(page+rb, |
---|
| 594 | + rb += sysfs_emit_at(page, rb, |
---|
603 | 595 | "TARG_CONN_STATE_CLEANUP_WAIT\n"); |
---|
604 | 596 | break; |
---|
605 | 597 | default: |
---|
606 | | - rb += sprintf(page+rb, |
---|
| 598 | + rb += sysfs_emit_at(page, rb, |
---|
607 | 599 | "ERROR: Unknown Connection State!\n"); |
---|
608 | 600 | break; |
---|
609 | 601 | } |
---|
610 | 602 | |
---|
611 | | - rb += sprintf(page+rb, " Address %pISc %s", &conn->login_sockaddr, |
---|
| 603 | + rb += sysfs_emit_at(page, rb, " Address %pISc %s", &conn->login_sockaddr, |
---|
612 | 604 | (conn->network_transport == ISCSI_TCP) ? |
---|
613 | 605 | "TCP" : "SCTP"); |
---|
614 | | - rb += sprintf(page+rb, " StatSN: 0x%08x\n", |
---|
| 606 | + rb += sysfs_emit_at(page, rb, " StatSN: 0x%08x\n", |
---|
615 | 607 | conn->stat_sn); |
---|
616 | 608 | } |
---|
617 | 609 | spin_unlock(&sess->conn_lock); |
---|
.. | .. |
---|
1343 | 1335 | |
---|
1344 | 1336 | /* Start functions for target_core_fabric_ops */ |
---|
1345 | 1337 | |
---|
1346 | | -static char *iscsi_get_fabric_name(void) |
---|
1347 | | -{ |
---|
1348 | | - return "iSCSI"; |
---|
1349 | | -} |
---|
1350 | | - |
---|
1351 | 1338 | static int iscsi_get_cmd_state(struct se_cmd *se_cmd) |
---|
1352 | 1339 | { |
---|
1353 | 1340 | struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); |
---|
.. | .. |
---|
1392 | 1379 | return conn->conn_transport->iscsit_get_dataout(conn, cmd, false); |
---|
1393 | 1380 | |
---|
1394 | 1381 | return 0; |
---|
1395 | | -} |
---|
1396 | | - |
---|
1397 | | -static int lio_write_pending_status(struct se_cmd *se_cmd) |
---|
1398 | | -{ |
---|
1399 | | - struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); |
---|
1400 | | - int ret; |
---|
1401 | | - |
---|
1402 | | - spin_lock_bh(&cmd->istate_lock); |
---|
1403 | | - ret = !(cmd->cmd_flags & ICF_GOT_LAST_DATAOUT); |
---|
1404 | | - spin_unlock_bh(&cmd->istate_lock); |
---|
1405 | | - |
---|
1406 | | - return ret; |
---|
1407 | 1382 | } |
---|
1408 | 1383 | |
---|
1409 | 1384 | static int lio_queue_status(struct se_cmd *se_cmd) |
---|
.. | .. |
---|
1552 | 1527 | |
---|
1553 | 1528 | const struct target_core_fabric_ops iscsi_ops = { |
---|
1554 | 1529 | .module = THIS_MODULE, |
---|
1555 | | - .name = "iscsi", |
---|
| 1530 | + .fabric_alias = "iscsi", |
---|
| 1531 | + .fabric_name = "iSCSI", |
---|
1556 | 1532 | .node_acl_size = sizeof(struct iscsi_node_acl), |
---|
1557 | | - .get_fabric_name = iscsi_get_fabric_name, |
---|
1558 | 1533 | .tpg_get_wwn = lio_tpg_get_endpoint_wwn, |
---|
1559 | 1534 | .tpg_get_tag = lio_tpg_get_tag, |
---|
1560 | 1535 | .tpg_get_default_depth = lio_tpg_get_default_depth, |
---|
.. | .. |
---|
1572 | 1547 | .sess_get_index = lio_sess_get_index, |
---|
1573 | 1548 | .sess_get_initiator_sid = lio_sess_get_initiator_sid, |
---|
1574 | 1549 | .write_pending = lio_write_pending, |
---|
1575 | | - .write_pending_status = lio_write_pending_status, |
---|
1576 | 1550 | .set_default_node_attributes = lio_set_default_node_attributes, |
---|
1577 | 1551 | .get_cmd_state = iscsi_get_cmd_state, |
---|
1578 | 1552 | .queue_data_in = lio_queue_data_in, |
---|
.. | .. |
---|
1599 | 1573 | .tfc_tpg_nacl_attrib_attrs = lio_target_nacl_attrib_attrs, |
---|
1600 | 1574 | .tfc_tpg_nacl_auth_attrs = lio_target_nacl_auth_attrs, |
---|
1601 | 1575 | .tfc_tpg_nacl_param_attrs = lio_target_nacl_param_attrs, |
---|
| 1576 | + |
---|
| 1577 | + .write_pending_must_be_called = true, |
---|
1602 | 1578 | }; |
---|