1 /* 2 * iSCSI transport class definitions 3 * 4 * Copyright (C) IBM Corporation, 2004 5 * Copyright (C) Mike Christie, 2004 - 2005 6 * Copyright (C) Dmitry Yusupov, 2004 - 2005 7 * Copyright (C) Alex Aizman, 2004 - 2005 8 * 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 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 22 */ 23 #include <linux/module.h> 24 #include <linux/mutex.h> 25 #include <linux/slab.h> 26 #include <net/tcp.h> 27 #include <scsi/scsi.h> 28 #include <scsi/scsi_host.h> 29 #include <scsi/scsi_device.h> 30 #include <scsi/scsi_transport.h> 31 #include <scsi/scsi_transport_iscsi.h> 32 #include <scsi/iscsi_if.h> 33 #include <scsi/scsi_cmnd.h> 34 35 #define ISCSI_SESSION_ATTRS 23 36 #define ISCSI_CONN_ATTRS 13 37 #define ISCSI_HOST_ATTRS 4 38 39 #define ISCSI_TRANSPORT_VERSION "2.0-870" 40 41 static int dbg_session; 42 module_param_named(debug_session, dbg_session, int, 43 S_IRUGO | S_IWUSR); 44 MODULE_PARM_DESC(debug_session, 45 "Turn on debugging for sessions in scsi_transport_iscsi " 46 "module. Set to 1 to turn on, and zero to turn off. Default " 47 "is off."); 48 49 static int dbg_conn; 50 module_param_named(debug_conn, dbg_conn, int, 51 S_IRUGO | S_IWUSR); 52 MODULE_PARM_DESC(debug_conn, 53 "Turn on debugging for connections in scsi_transport_iscsi " 54 "module. Set to 1 to turn on, and zero to turn off. Default " 55 "is off."); 56 57 #define ISCSI_DBG_TRANS_SESSION(_session, dbg_fmt, arg...) \ 58 do { \ 59 if (dbg_session) \ 60 iscsi_cls_session_printk(KERN_INFO, _session, \ 61 "%s: " dbg_fmt, \ 62 __func__, ##arg); \ 63 } while (0); 64 65 #define ISCSI_DBG_TRANS_CONN(_conn, dbg_fmt, arg...) \ 66 do { \ 67 if (dbg_conn) \ 68 iscsi_cls_conn_printk(KERN_INFO, _conn, \ 69 "%s: " dbg_fmt, \ 70 __func__, ##arg); \ 71 } while (0); 72 73 struct iscsi_internal { 74 struct scsi_transport_template t; 75 struct iscsi_transport *iscsi_transport; 76 struct list_head list; 77 struct device dev; 78 79 struct device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1]; 80 struct transport_container conn_cont; 81 struct device_attribute *conn_attrs[ISCSI_CONN_ATTRS + 1]; 82 struct transport_container session_cont; 83 struct device_attribute *session_attrs[ISCSI_SESSION_ATTRS + 1]; 84 }; 85 86 static atomic_t iscsi_session_nr; /* sysfs session id for next new session */ 87 static struct workqueue_struct *iscsi_eh_timer_workq; 88 89 /* 90 * list of registered transports and lock that must 91 * be held while accessing list. The iscsi_transport_lock must 92 * be acquired after the rx_queue_mutex. 93 */ 94 static LIST_HEAD(iscsi_transports); 95 static DEFINE_SPINLOCK(iscsi_transport_lock); 96 97 #define to_iscsi_internal(tmpl) \ 98 container_of(tmpl, struct iscsi_internal, t) 99 100 #define dev_to_iscsi_internal(_dev) \ 101 container_of(_dev, struct iscsi_internal, dev) 102 103 static void iscsi_transport_release(struct device *dev) 104 { 105 struct iscsi_internal *priv = dev_to_iscsi_internal(dev); 106 kfree(priv); 107 } 108 109 /* 110 * iscsi_transport_class represents the iscsi_transports that are 111 * registered. 112 */ 113 static struct class iscsi_transport_class = { 114 .name = "iscsi_transport", 115 .dev_release = iscsi_transport_release, 116 }; 117 118 static ssize_t 119 show_transport_handle(struct device *dev, struct device_attribute *attr, 120 char *buf) 121 { 122 struct iscsi_internal *priv = dev_to_iscsi_internal(dev); 123 return sprintf(buf, "%llu\n", (unsigned long long)iscsi_handle(priv->iscsi_transport)); 124 } 125 static DEVICE_ATTR(handle, S_IRUGO, show_transport_handle, NULL); 126 127 #define show_transport_attr(name, format) \ 128 static ssize_t \ 129 show_transport_##name(struct device *dev, \ 130 struct device_attribute *attr,char *buf) \ 131 { \ 132 struct iscsi_internal *priv = dev_to_iscsi_internal(dev); \ 133 return sprintf(buf, format"\n", priv->iscsi_transport->name); \ 134 } \ 135 static DEVICE_ATTR(name, S_IRUGO, show_transport_##name, NULL); 136 137 show_transport_attr(caps, "0x%x"); 138 139 static struct attribute *iscsi_transport_attrs[] = { 140 &dev_attr_handle.attr, 141 &dev_attr_caps.attr, 142 NULL, 143 }; 144 145 static struct attribute_group iscsi_transport_group = { 146 .attrs = iscsi_transport_attrs, 147 }; 148 149 /* 150 * iSCSI endpoint attrs 151 */ 152 #define iscsi_dev_to_endpoint(_dev) \ 153 container_of(_dev, struct iscsi_endpoint, dev) 154 155 #define ISCSI_ATTR(_prefix,_name,_mode,_show,_store) \ 156 struct device_attribute dev_attr_##_prefix##_##_name = \ 157 __ATTR(_name,_mode,_show,_store) 158 159 static void iscsi_endpoint_release(struct device *dev) 160 { 161 struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev); 162 kfree(ep); 163 } 164 165 static struct class iscsi_endpoint_class = { 166 .name = "iscsi_endpoint", 167 .dev_release = iscsi_endpoint_release, 168 }; 169 170 static ssize_t 171 show_ep_handle(struct device *dev, struct device_attribute *attr, char *buf) 172 { 173 struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev); 174 return sprintf(buf, "%llu\n", (unsigned long long) ep->id); 175 } 176 static ISCSI_ATTR(ep, handle, S_IRUGO, show_ep_handle, NULL); 177 178 static struct attribute *iscsi_endpoint_attrs[] = { 179 &dev_attr_ep_handle.attr, 180 NULL, 181 }; 182 183 static struct attribute_group iscsi_endpoint_group = { 184 .attrs = iscsi_endpoint_attrs, 185 }; 186 187 #define ISCSI_MAX_EPID -1 188 189 static int iscsi_match_epid(struct device *dev, void *data) 190 { 191 struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev); 192 uint64_t *epid = (uint64_t *) data; 193 194 return *epid == ep->id; 195 } 196 197 struct iscsi_endpoint * 198 iscsi_create_endpoint(int dd_size) 199 { 200 struct device *dev; 201 struct iscsi_endpoint *ep; 202 uint64_t id; 203 int err; 204 205 for (id = 1; id < ISCSI_MAX_EPID; id++) { 206 dev = class_find_device(&iscsi_endpoint_class, NULL, &id, 207 iscsi_match_epid); 208 if (!dev) 209 break; 210 } 211 if (id == ISCSI_MAX_EPID) { 212 printk(KERN_ERR "Too many connections. Max supported %u\n", 213 ISCSI_MAX_EPID - 1); 214 return NULL; 215 } 216 217 ep = kzalloc(sizeof(*ep) + dd_size, GFP_KERNEL); 218 if (!ep) 219 return NULL; 220 221 ep->id = id; 222 ep->dev.class = &iscsi_endpoint_class; 223 dev_set_name(&ep->dev, "ep-%llu", (unsigned long long) id); 224 err = device_register(&ep->dev); 225 if (err) 226 goto free_ep; 227 228 err = sysfs_create_group(&ep->dev.kobj, &iscsi_endpoint_group); 229 if (err) 230 goto unregister_dev; 231 232 if (dd_size) 233 ep->dd_data = &ep[1]; 234 return ep; 235 236 unregister_dev: 237 device_unregister(&ep->dev); 238 return NULL; 239 240 free_ep: 241 kfree(ep); 242 return NULL; 243 } 244 EXPORT_SYMBOL_GPL(iscsi_create_endpoint); 245 246 void iscsi_destroy_endpoint(struct iscsi_endpoint *ep) 247 { 248 sysfs_remove_group(&ep->dev.kobj, &iscsi_endpoint_group); 249 device_unregister(&ep->dev); 250 } 251 EXPORT_SYMBOL_GPL(iscsi_destroy_endpoint); 252 253 struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle) 254 { 255 struct iscsi_endpoint *ep; 256 struct device *dev; 257 258 dev = class_find_device(&iscsi_endpoint_class, NULL, &handle, 259 iscsi_match_epid); 260 if (!dev) 261 return NULL; 262 263 ep = iscsi_dev_to_endpoint(dev); 264 /* 265 * we can drop this now because the interface will prevent 266 * removals and lookups from racing. 267 */ 268 put_device(dev); 269 return ep; 270 } 271 EXPORT_SYMBOL_GPL(iscsi_lookup_endpoint); 272 273 static int iscsi_setup_host(struct transport_container *tc, struct device *dev, 274 struct device *cdev) 275 { 276 struct Scsi_Host *shost = dev_to_shost(dev); 277 struct iscsi_cls_host *ihost = shost->shost_data; 278 279 memset(ihost, 0, sizeof(*ihost)); 280 atomic_set(&ihost->nr_scans, 0); 281 mutex_init(&ihost->mutex); 282 return 0; 283 } 284 285 static DECLARE_TRANSPORT_CLASS(iscsi_host_class, 286 "iscsi_host", 287 iscsi_setup_host, 288 NULL, 289 NULL); 290 291 static DECLARE_TRANSPORT_CLASS(iscsi_session_class, 292 "iscsi_session", 293 NULL, 294 NULL, 295 NULL); 296 297 static DECLARE_TRANSPORT_CLASS(iscsi_connection_class, 298 "iscsi_connection", 299 NULL, 300 NULL, 301 NULL); 302 303 static struct sock *nls; 304 static DEFINE_MUTEX(rx_queue_mutex); 305 306 static LIST_HEAD(sesslist); 307 static DEFINE_SPINLOCK(sesslock); 308 static LIST_HEAD(connlist); 309 static DEFINE_SPINLOCK(connlock); 310 311 static uint32_t iscsi_conn_get_sid(struct iscsi_cls_conn *conn) 312 { 313 struct iscsi_cls_session *sess = iscsi_dev_to_session(conn->dev.parent); 314 return sess->sid; 315 } 316 317 /* 318 * Returns the matching session to a given sid 319 */ 320 static struct iscsi_cls_session *iscsi_session_lookup(uint32_t sid) 321 { 322 unsigned long flags; 323 struct iscsi_cls_session *sess; 324 325 spin_lock_irqsave(&sesslock, flags); 326 list_for_each_entry(sess, &sesslist, sess_list) { 327 if (sess->sid == sid) { 328 spin_unlock_irqrestore(&sesslock, flags); 329 return sess; 330 } 331 } 332 spin_unlock_irqrestore(&sesslock, flags); 333 return NULL; 334 } 335 336 /* 337 * Returns the matching connection to a given sid / cid tuple 338 */ 339 static struct iscsi_cls_conn *iscsi_conn_lookup(uint32_t sid, uint32_t cid) 340 { 341 unsigned long flags; 342 struct iscsi_cls_conn *conn; 343 344 spin_lock_irqsave(&connlock, flags); 345 list_for_each_entry(conn, &connlist, conn_list) { 346 if ((conn->cid == cid) && (iscsi_conn_get_sid(conn) == sid)) { 347 spin_unlock_irqrestore(&connlock, flags); 348 return conn; 349 } 350 } 351 spin_unlock_irqrestore(&connlock, flags); 352 return NULL; 353 } 354 355 /* 356 * The following functions can be used by LLDs that allocate 357 * their own scsi_hosts or by software iscsi LLDs 358 */ 359 static struct { 360 int value; 361 char *name; 362 } iscsi_session_state_names[] = { 363 { ISCSI_SESSION_LOGGED_IN, "LOGGED_IN" }, 364 { ISCSI_SESSION_FAILED, "FAILED" }, 365 { ISCSI_SESSION_FREE, "FREE" }, 366 }; 367 368 static const char *iscsi_session_state_name(int state) 369 { 370 int i; 371 char *name = NULL; 372 373 for (i = 0; i < ARRAY_SIZE(iscsi_session_state_names); i++) { 374 if (iscsi_session_state_names[i].value == state) { 375 name = iscsi_session_state_names[i].name; 376 break; 377 } 378 } 379 return name; 380 } 381 382 int iscsi_session_chkready(struct iscsi_cls_session *session) 383 { 384 unsigned long flags; 385 int err; 386 387 spin_lock_irqsave(&session->lock, flags); 388 switch (session->state) { 389 case ISCSI_SESSION_LOGGED_IN: 390 err = 0; 391 break; 392 case ISCSI_SESSION_FAILED: 393 err = DID_IMM_RETRY << 16; 394 break; 395 case ISCSI_SESSION_FREE: 396 err = DID_TRANSPORT_FAILFAST << 16; 397 break; 398 default: 399 err = DID_NO_CONNECT << 16; 400 break; 401 } 402 spin_unlock_irqrestore(&session->lock, flags); 403 return err; 404 } 405 EXPORT_SYMBOL_GPL(iscsi_session_chkready); 406 407 static void iscsi_session_release(struct device *dev) 408 { 409 struct iscsi_cls_session *session = iscsi_dev_to_session(dev); 410 struct Scsi_Host *shost; 411 412 shost = iscsi_session_to_shost(session); 413 scsi_host_put(shost); 414 ISCSI_DBG_TRANS_SESSION(session, "Completing session release\n"); 415 kfree(session); 416 } 417 418 static int iscsi_is_session_dev(const struct device *dev) 419 { 420 return dev->release == iscsi_session_release; 421 } 422 423 static int iscsi_iter_session_fn(struct device *dev, void *data) 424 { 425 void (* fn) (struct iscsi_cls_session *) = data; 426 427 if (!iscsi_is_session_dev(dev)) 428 return 0; 429 fn(iscsi_dev_to_session(dev)); 430 return 0; 431 } 432 433 void iscsi_host_for_each_session(struct Scsi_Host *shost, 434 void (*fn)(struct iscsi_cls_session *)) 435 { 436 device_for_each_child(&shost->shost_gendev, fn, 437 iscsi_iter_session_fn); 438 } 439 EXPORT_SYMBOL_GPL(iscsi_host_for_each_session); 440 441 /** 442 * iscsi_scan_finished - helper to report when running scans are done 443 * @shost: scsi host 444 * @time: scan run time 445 * 446 * This function can be used by drives like qla4xxx to report to the scsi 447 * layer when the scans it kicked off at module load time are done. 448 */ 449 int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time) 450 { 451 struct iscsi_cls_host *ihost = shost->shost_data; 452 /* 453 * qla4xxx will have kicked off some session unblocks before calling 454 * scsi_scan_host, so just wait for them to complete. 455 */ 456 return !atomic_read(&ihost->nr_scans); 457 } 458 EXPORT_SYMBOL_GPL(iscsi_scan_finished); 459 460 struct iscsi_scan_data { 461 unsigned int channel; 462 unsigned int id; 463 unsigned int lun; 464 }; 465 466 static int iscsi_user_scan_session(struct device *dev, void *data) 467 { 468 struct iscsi_scan_data *scan_data = data; 469 struct iscsi_cls_session *session; 470 struct Scsi_Host *shost; 471 struct iscsi_cls_host *ihost; 472 unsigned long flags; 473 unsigned int id; 474 475 if (!iscsi_is_session_dev(dev)) 476 return 0; 477 478 session = iscsi_dev_to_session(dev); 479 480 ISCSI_DBG_TRANS_SESSION(session, "Scanning session\n"); 481 482 shost = iscsi_session_to_shost(session); 483 ihost = shost->shost_data; 484 485 mutex_lock(&ihost->mutex); 486 spin_lock_irqsave(&session->lock, flags); 487 if (session->state != ISCSI_SESSION_LOGGED_IN) { 488 spin_unlock_irqrestore(&session->lock, flags); 489 goto user_scan_exit; 490 } 491 id = session->target_id; 492 spin_unlock_irqrestore(&session->lock, flags); 493 494 if (id != ISCSI_MAX_TARGET) { 495 if ((scan_data->channel == SCAN_WILD_CARD || 496 scan_data->channel == 0) && 497 (scan_data->id == SCAN_WILD_CARD || 498 scan_data->id == id)) 499 scsi_scan_target(&session->dev, 0, id, 500 scan_data->lun, 1); 501 } 502 503 user_scan_exit: 504 mutex_unlock(&ihost->mutex); 505 ISCSI_DBG_TRANS_SESSION(session, "Completed session scan\n"); 506 return 0; 507 } 508 509 static int iscsi_user_scan(struct Scsi_Host *shost, uint channel, 510 uint id, uint lun) 511 { 512 struct iscsi_scan_data scan_data; 513 514 scan_data.channel = channel; 515 scan_data.id = id; 516 scan_data.lun = lun; 517 518 return device_for_each_child(&shost->shost_gendev, &scan_data, 519 iscsi_user_scan_session); 520 } 521 522 static void iscsi_scan_session(struct work_struct *work) 523 { 524 struct iscsi_cls_session *session = 525 container_of(work, struct iscsi_cls_session, scan_work); 526 struct Scsi_Host *shost = iscsi_session_to_shost(session); 527 struct iscsi_cls_host *ihost = shost->shost_data; 528 struct iscsi_scan_data scan_data; 529 530 scan_data.channel = 0; 531 scan_data.id = SCAN_WILD_CARD; 532 scan_data.lun = SCAN_WILD_CARD; 533 534 iscsi_user_scan_session(&session->dev, &scan_data); 535 atomic_dec(&ihost->nr_scans); 536 } 537 538 /** 539 * iscsi_block_scsi_eh - block scsi eh until session state has transistioned 540 * @cmd: scsi cmd passed to scsi eh handler 541 * 542 * If the session is down this function will wait for the recovery 543 * timer to fire or for the session to be logged back in. If the 544 * recovery timer fires then FAST_IO_FAIL is returned. The caller 545 * should pass this error value to the scsi eh. 546 */ 547 int iscsi_block_scsi_eh(struct scsi_cmnd *cmd) 548 { 549 struct iscsi_cls_session *session = 550 starget_to_session(scsi_target(cmd->device)); 551 unsigned long flags; 552 int ret = 0; 553 554 spin_lock_irqsave(&session->lock, flags); 555 while (session->state != ISCSI_SESSION_LOGGED_IN) { 556 if (session->state == ISCSI_SESSION_FREE) { 557 ret = FAST_IO_FAIL; 558 break; 559 } 560 spin_unlock_irqrestore(&session->lock, flags); 561 msleep(1000); 562 spin_lock_irqsave(&session->lock, flags); 563 } 564 spin_unlock_irqrestore(&session->lock, flags); 565 return ret; 566 } 567 EXPORT_SYMBOL_GPL(iscsi_block_scsi_eh); 568 569 static void session_recovery_timedout(struct work_struct *work) 570 { 571 struct iscsi_cls_session *session = 572 container_of(work, struct iscsi_cls_session, 573 recovery_work.work); 574 unsigned long flags; 575 576 iscsi_cls_session_printk(KERN_INFO, session, 577 "session recovery timed out after %d secs\n", 578 session->recovery_tmo); 579 580 spin_lock_irqsave(&session->lock, flags); 581 switch (session->state) { 582 case ISCSI_SESSION_FAILED: 583 session->state = ISCSI_SESSION_FREE; 584 break; 585 case ISCSI_SESSION_LOGGED_IN: 586 case ISCSI_SESSION_FREE: 587 /* we raced with the unblock's flush */ 588 spin_unlock_irqrestore(&session->lock, flags); 589 return; 590 } 591 spin_unlock_irqrestore(&session->lock, flags); 592 593 if (session->transport->session_recovery_timedout) 594 session->transport->session_recovery_timedout(session); 595 596 ISCSI_DBG_TRANS_SESSION(session, "Unblocking SCSI target\n"); 597 scsi_target_unblock(&session->dev); 598 ISCSI_DBG_TRANS_SESSION(session, "Completed unblocking SCSI target\n"); 599 } 600 601 static void __iscsi_unblock_session(struct work_struct *work) 602 { 603 struct iscsi_cls_session *session = 604 container_of(work, struct iscsi_cls_session, 605 unblock_work); 606 struct Scsi_Host *shost = iscsi_session_to_shost(session); 607 struct iscsi_cls_host *ihost = shost->shost_data; 608 unsigned long flags; 609 610 ISCSI_DBG_TRANS_SESSION(session, "Unblocking session\n"); 611 /* 612 * The recovery and unblock work get run from the same workqueue, 613 * so try to cancel it if it was going to run after this unblock. 614 */ 615 cancel_delayed_work(&session->recovery_work); 616 spin_lock_irqsave(&session->lock, flags); 617 session->state = ISCSI_SESSION_LOGGED_IN; 618 spin_unlock_irqrestore(&session->lock, flags); 619 /* start IO */ 620 scsi_target_unblock(&session->dev); 621 /* 622 * Only do kernel scanning if the driver is properly hooked into 623 * the async scanning code (drivers like iscsi_tcp do login and 624 * scanning from userspace). 625 */ 626 if (shost->hostt->scan_finished) { 627 if (scsi_queue_work(shost, &session->scan_work)) 628 atomic_inc(&ihost->nr_scans); 629 } 630 ISCSI_DBG_TRANS_SESSION(session, "Completed unblocking session\n"); 631 } 632 633 /** 634 * iscsi_unblock_session - set a session as logged in and start IO. 635 * @session: iscsi session 636 * 637 * Mark a session as ready to accept IO. 638 */ 639 void iscsi_unblock_session(struct iscsi_cls_session *session) 640 { 641 queue_work(iscsi_eh_timer_workq, &session->unblock_work); 642 /* 643 * make sure all the events have completed before tell the driver 644 * it is safe 645 */ 646 flush_workqueue(iscsi_eh_timer_workq); 647 } 648 EXPORT_SYMBOL_GPL(iscsi_unblock_session); 649 650 static void __iscsi_block_session(struct work_struct *work) 651 { 652 struct iscsi_cls_session *session = 653 container_of(work, struct iscsi_cls_session, 654 block_work); 655 unsigned long flags; 656 657 ISCSI_DBG_TRANS_SESSION(session, "Blocking session\n"); 658 spin_lock_irqsave(&session->lock, flags); 659 session->state = ISCSI_SESSION_FAILED; 660 spin_unlock_irqrestore(&session->lock, flags); 661 scsi_target_block(&session->dev); 662 ISCSI_DBG_TRANS_SESSION(session, "Completed SCSI target blocking\n"); 663 if (session->recovery_tmo >= 0) 664 queue_delayed_work(iscsi_eh_timer_workq, 665 &session->recovery_work, 666 session->recovery_tmo * HZ); 667 } 668 669 void iscsi_block_session(struct iscsi_cls_session *session) 670 { 671 queue_work(iscsi_eh_timer_workq, &session->block_work); 672 } 673 EXPORT_SYMBOL_GPL(iscsi_block_session); 674 675 static void __iscsi_unbind_session(struct work_struct *work) 676 { 677 struct iscsi_cls_session *session = 678 container_of(work, struct iscsi_cls_session, 679 unbind_work); 680 struct Scsi_Host *shost = iscsi_session_to_shost(session); 681 struct iscsi_cls_host *ihost = shost->shost_data; 682 unsigned long flags; 683 684 ISCSI_DBG_TRANS_SESSION(session, "Unbinding session\n"); 685 686 /* Prevent new scans and make sure scanning is not in progress */ 687 mutex_lock(&ihost->mutex); 688 spin_lock_irqsave(&session->lock, flags); 689 if (session->target_id == ISCSI_MAX_TARGET) { 690 spin_unlock_irqrestore(&session->lock, flags); 691 mutex_unlock(&ihost->mutex); 692 return; 693 } 694 session->target_id = ISCSI_MAX_TARGET; 695 spin_unlock_irqrestore(&session->lock, flags); 696 mutex_unlock(&ihost->mutex); 697 698 scsi_remove_target(&session->dev); 699 iscsi_session_event(session, ISCSI_KEVENT_UNBIND_SESSION); 700 ISCSI_DBG_TRANS_SESSION(session, "Completed target removal\n"); 701 } 702 703 struct iscsi_cls_session * 704 iscsi_alloc_session(struct Scsi_Host *shost, struct iscsi_transport *transport, 705 int dd_size) 706 { 707 struct iscsi_cls_session *session; 708 709 session = kzalloc(sizeof(*session) + dd_size, 710 GFP_KERNEL); 711 if (!session) 712 return NULL; 713 714 session->transport = transport; 715 session->recovery_tmo = 120; 716 session->state = ISCSI_SESSION_FREE; 717 INIT_DELAYED_WORK(&session->recovery_work, session_recovery_timedout); 718 INIT_LIST_HEAD(&session->sess_list); 719 INIT_WORK(&session->unblock_work, __iscsi_unblock_session); 720 INIT_WORK(&session->block_work, __iscsi_block_session); 721 INIT_WORK(&session->unbind_work, __iscsi_unbind_session); 722 INIT_WORK(&session->scan_work, iscsi_scan_session); 723 spin_lock_init(&session->lock); 724 725 /* this is released in the dev's release function */ 726 scsi_host_get(shost); 727 session->dev.parent = &shost->shost_gendev; 728 session->dev.release = iscsi_session_release; 729 device_initialize(&session->dev); 730 if (dd_size) 731 session->dd_data = &session[1]; 732 733 ISCSI_DBG_TRANS_SESSION(session, "Completed session allocation\n"); 734 return session; 735 } 736 EXPORT_SYMBOL_GPL(iscsi_alloc_session); 737 738 static int iscsi_get_next_target_id(struct device *dev, void *data) 739 { 740 struct iscsi_cls_session *session; 741 unsigned long flags; 742 int err = 0; 743 744 if (!iscsi_is_session_dev(dev)) 745 return 0; 746 747 session = iscsi_dev_to_session(dev); 748 spin_lock_irqsave(&session->lock, flags); 749 if (*((unsigned int *) data) == session->target_id) 750 err = -EEXIST; 751 spin_unlock_irqrestore(&session->lock, flags); 752 return err; 753 } 754 755 int iscsi_add_session(struct iscsi_cls_session *session, unsigned int target_id) 756 { 757 struct Scsi_Host *shost = iscsi_session_to_shost(session); 758 struct iscsi_cls_host *ihost; 759 unsigned long flags; 760 unsigned int id = target_id; 761 int err; 762 763 ihost = shost->shost_data; 764 session->sid = atomic_add_return(1, &iscsi_session_nr); 765 766 if (id == ISCSI_MAX_TARGET) { 767 for (id = 0; id < ISCSI_MAX_TARGET; id++) { 768 err = device_for_each_child(&shost->shost_gendev, &id, 769 iscsi_get_next_target_id); 770 if (!err) 771 break; 772 } 773 774 if (id == ISCSI_MAX_TARGET) { 775 iscsi_cls_session_printk(KERN_ERR, session, 776 "Too many iscsi targets. Max " 777 "number of targets is %d.\n", 778 ISCSI_MAX_TARGET - 1); 779 err = -EOVERFLOW; 780 goto release_host; 781 } 782 } 783 session->target_id = id; 784 785 dev_set_name(&session->dev, "session%u", session->sid); 786 err = device_add(&session->dev); 787 if (err) { 788 iscsi_cls_session_printk(KERN_ERR, session, 789 "could not register session's dev\n"); 790 goto release_host; 791 } 792 transport_register_device(&session->dev); 793 794 spin_lock_irqsave(&sesslock, flags); 795 list_add(&session->sess_list, &sesslist); 796 spin_unlock_irqrestore(&sesslock, flags); 797 798 iscsi_session_event(session, ISCSI_KEVENT_CREATE_SESSION); 799 ISCSI_DBG_TRANS_SESSION(session, "Completed session adding\n"); 800 return 0; 801 802 release_host: 803 scsi_host_put(shost); 804 return err; 805 } 806 EXPORT_SYMBOL_GPL(iscsi_add_session); 807 808 /** 809 * iscsi_create_session - create iscsi class session 810 * @shost: scsi host 811 * @transport: iscsi transport 812 * @dd_size: private driver data size 813 * @target_id: which target 814 * 815 * This can be called from a LLD or iscsi_transport. 816 */ 817 struct iscsi_cls_session * 818 iscsi_create_session(struct Scsi_Host *shost, struct iscsi_transport *transport, 819 int dd_size, unsigned int target_id) 820 { 821 struct iscsi_cls_session *session; 822 823 session = iscsi_alloc_session(shost, transport, dd_size); 824 if (!session) 825 return NULL; 826 827 if (iscsi_add_session(session, target_id)) { 828 iscsi_free_session(session); 829 return NULL; 830 } 831 return session; 832 } 833 EXPORT_SYMBOL_GPL(iscsi_create_session); 834 835 static void iscsi_conn_release(struct device *dev) 836 { 837 struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev); 838 struct device *parent = conn->dev.parent; 839 840 ISCSI_DBG_TRANS_CONN(conn, "Releasing conn\n"); 841 kfree(conn); 842 put_device(parent); 843 } 844 845 static int iscsi_is_conn_dev(const struct device *dev) 846 { 847 return dev->release == iscsi_conn_release; 848 } 849 850 static int iscsi_iter_destroy_conn_fn(struct device *dev, void *data) 851 { 852 if (!iscsi_is_conn_dev(dev)) 853 return 0; 854 return iscsi_destroy_conn(iscsi_dev_to_conn(dev)); 855 } 856 857 void iscsi_remove_session(struct iscsi_cls_session *session) 858 { 859 struct Scsi_Host *shost = iscsi_session_to_shost(session); 860 unsigned long flags; 861 int err; 862 863 ISCSI_DBG_TRANS_SESSION(session, "Removing session\n"); 864 865 spin_lock_irqsave(&sesslock, flags); 866 list_del(&session->sess_list); 867 spin_unlock_irqrestore(&sesslock, flags); 868 869 /* make sure there are no blocks/unblocks queued */ 870 flush_workqueue(iscsi_eh_timer_workq); 871 /* make sure the timedout callout is not running */ 872 if (!cancel_delayed_work(&session->recovery_work)) 873 flush_workqueue(iscsi_eh_timer_workq); 874 /* 875 * If we are blocked let commands flow again. The lld or iscsi 876 * layer should set up the queuecommand to fail commands. 877 * We assume that LLD will not be calling block/unblock while 878 * removing the session. 879 */ 880 spin_lock_irqsave(&session->lock, flags); 881 session->state = ISCSI_SESSION_FREE; 882 spin_unlock_irqrestore(&session->lock, flags); 883 884 scsi_target_unblock(&session->dev); 885 /* flush running scans then delete devices */ 886 scsi_flush_work(shost); 887 __iscsi_unbind_session(&session->unbind_work); 888 889 /* hw iscsi may not have removed all connections from session */ 890 err = device_for_each_child(&session->dev, NULL, 891 iscsi_iter_destroy_conn_fn); 892 if (err) 893 iscsi_cls_session_printk(KERN_ERR, session, 894 "Could not delete all connections " 895 "for session. Error %d.\n", err); 896 897 transport_unregister_device(&session->dev); 898 899 ISCSI_DBG_TRANS_SESSION(session, "Completing session removal\n"); 900 device_del(&session->dev); 901 } 902 EXPORT_SYMBOL_GPL(iscsi_remove_session); 903 904 void iscsi_free_session(struct iscsi_cls_session *session) 905 { 906 ISCSI_DBG_TRANS_SESSION(session, "Freeing session\n"); 907 iscsi_session_event(session, ISCSI_KEVENT_DESTROY_SESSION); 908 put_device(&session->dev); 909 } 910 EXPORT_SYMBOL_GPL(iscsi_free_session); 911 912 /** 913 * iscsi_destroy_session - destroy iscsi session 914 * @session: iscsi_session 915 * 916 * Can be called by a LLD or iscsi_transport. There must not be 917 * any running connections. 918 */ 919 int iscsi_destroy_session(struct iscsi_cls_session *session) 920 { 921 iscsi_remove_session(session); 922 ISCSI_DBG_TRANS_SESSION(session, "Completing session destruction\n"); 923 iscsi_free_session(session); 924 return 0; 925 } 926 EXPORT_SYMBOL_GPL(iscsi_destroy_session); 927 928 /** 929 * iscsi_create_conn - create iscsi class connection 930 * @session: iscsi cls session 931 * @dd_size: private driver data size 932 * @cid: connection id 933 * 934 * This can be called from a LLD or iscsi_transport. The connection 935 * is child of the session so cid must be unique for all connections 936 * on the session. 937 * 938 * Since we do not support MCS, cid will normally be zero. In some cases 939 * for software iscsi we could be trying to preallocate a connection struct 940 * in which case there could be two connection structs and cid would be 941 * non-zero. 942 */ 943 struct iscsi_cls_conn * 944 iscsi_create_conn(struct iscsi_cls_session *session, int dd_size, uint32_t cid) 945 { 946 struct iscsi_transport *transport = session->transport; 947 struct iscsi_cls_conn *conn; 948 unsigned long flags; 949 int err; 950 951 conn = kzalloc(sizeof(*conn) + dd_size, GFP_KERNEL); 952 if (!conn) 953 return NULL; 954 if (dd_size) 955 conn->dd_data = &conn[1]; 956 957 INIT_LIST_HEAD(&conn->conn_list); 958 conn->transport = transport; 959 conn->cid = cid; 960 961 /* this is released in the dev's release function */ 962 if (!get_device(&session->dev)) 963 goto free_conn; 964 965 dev_set_name(&conn->dev, "connection%d:%u", session->sid, cid); 966 conn->dev.parent = &session->dev; 967 conn->dev.release = iscsi_conn_release; 968 err = device_register(&conn->dev); 969 if (err) { 970 iscsi_cls_session_printk(KERN_ERR, session, "could not " 971 "register connection's dev\n"); 972 goto release_parent_ref; 973 } 974 transport_register_device(&conn->dev); 975 976 spin_lock_irqsave(&connlock, flags); 977 list_add(&conn->conn_list, &connlist); 978 conn->active = 1; 979 spin_unlock_irqrestore(&connlock, flags); 980 981 ISCSI_DBG_TRANS_CONN(conn, "Completed conn creation\n"); 982 return conn; 983 984 release_parent_ref: 985 put_device(&session->dev); 986 free_conn: 987 kfree(conn); 988 return NULL; 989 } 990 991 EXPORT_SYMBOL_GPL(iscsi_create_conn); 992 993 /** 994 * iscsi_destroy_conn - destroy iscsi class connection 995 * @conn: iscsi cls session 996 * 997 * This can be called from a LLD or iscsi_transport. 998 */ 999 int iscsi_destroy_conn(struct iscsi_cls_conn *conn) 1000 { 1001 unsigned long flags; 1002 1003 spin_lock_irqsave(&connlock, flags); 1004 conn->active = 0; 1005 list_del(&conn->conn_list); 1006 spin_unlock_irqrestore(&connlock, flags); 1007 1008 transport_unregister_device(&conn->dev); 1009 ISCSI_DBG_TRANS_CONN(conn, "Completing conn destruction\n"); 1010 device_unregister(&conn->dev); 1011 return 0; 1012 } 1013 EXPORT_SYMBOL_GPL(iscsi_destroy_conn); 1014 1015 /* 1016 * iscsi interface functions 1017 */ 1018 static struct iscsi_internal * 1019 iscsi_if_transport_lookup(struct iscsi_transport *tt) 1020 { 1021 struct iscsi_internal *priv; 1022 unsigned long flags; 1023 1024 spin_lock_irqsave(&iscsi_transport_lock, flags); 1025 list_for_each_entry(priv, &iscsi_transports, list) { 1026 if (tt == priv->iscsi_transport) { 1027 spin_unlock_irqrestore(&iscsi_transport_lock, flags); 1028 return priv; 1029 } 1030 } 1031 spin_unlock_irqrestore(&iscsi_transport_lock, flags); 1032 return NULL; 1033 } 1034 1035 static int 1036 iscsi_multicast_skb(struct sk_buff *skb, uint32_t group, gfp_t gfp) 1037 { 1038 return nlmsg_multicast(nls, skb, 0, group, gfp); 1039 } 1040 1041 int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, 1042 char *data, uint32_t data_size) 1043 { 1044 struct nlmsghdr *nlh; 1045 struct sk_buff *skb; 1046 struct iscsi_uevent *ev; 1047 char *pdu; 1048 struct iscsi_internal *priv; 1049 int len = NLMSG_SPACE(sizeof(*ev) + sizeof(struct iscsi_hdr) + 1050 data_size); 1051 1052 priv = iscsi_if_transport_lookup(conn->transport); 1053 if (!priv) 1054 return -EINVAL; 1055 1056 skb = alloc_skb(len, GFP_ATOMIC); 1057 if (!skb) { 1058 iscsi_conn_error_event(conn, ISCSI_ERR_CONN_FAILED); 1059 iscsi_cls_conn_printk(KERN_ERR, conn, "can not deliver " 1060 "control PDU: OOM\n"); 1061 return -ENOMEM; 1062 } 1063 1064 nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0); 1065 ev = NLMSG_DATA(nlh); 1066 memset(ev, 0, sizeof(*ev)); 1067 ev->transport_handle = iscsi_handle(conn->transport); 1068 ev->type = ISCSI_KEVENT_RECV_PDU; 1069 ev->r.recv_req.cid = conn->cid; 1070 ev->r.recv_req.sid = iscsi_conn_get_sid(conn); 1071 pdu = (char*)ev + sizeof(*ev); 1072 memcpy(pdu, hdr, sizeof(struct iscsi_hdr)); 1073 memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size); 1074 1075 return iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_ATOMIC); 1076 } 1077 EXPORT_SYMBOL_GPL(iscsi_recv_pdu); 1078 1079 int iscsi_offload_mesg(struct Scsi_Host *shost, 1080 struct iscsi_transport *transport, uint32_t type, 1081 char *data, uint16_t data_size) 1082 { 1083 struct nlmsghdr *nlh; 1084 struct sk_buff *skb; 1085 struct iscsi_uevent *ev; 1086 int len = NLMSG_SPACE(sizeof(*ev) + data_size); 1087 1088 skb = alloc_skb(len, GFP_ATOMIC); 1089 if (!skb) { 1090 printk(KERN_ERR "can not deliver iscsi offload message:OOM\n"); 1091 return -ENOMEM; 1092 } 1093 1094 nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0); 1095 ev = NLMSG_DATA(nlh); 1096 memset(ev, 0, sizeof(*ev)); 1097 ev->type = type; 1098 ev->transport_handle = iscsi_handle(transport); 1099 switch (type) { 1100 case ISCSI_KEVENT_PATH_REQ: 1101 ev->r.req_path.host_no = shost->host_no; 1102 break; 1103 case ISCSI_KEVENT_IF_DOWN: 1104 ev->r.notify_if_down.host_no = shost->host_no; 1105 break; 1106 } 1107 1108 memcpy((char *)ev + sizeof(*ev), data, data_size); 1109 1110 return iscsi_multicast_skb(skb, ISCSI_NL_GRP_UIP, GFP_ATOMIC); 1111 } 1112 EXPORT_SYMBOL_GPL(iscsi_offload_mesg); 1113 1114 void iscsi_conn_error_event(struct iscsi_cls_conn *conn, enum iscsi_err error) 1115 { 1116 struct nlmsghdr *nlh; 1117 struct sk_buff *skb; 1118 struct iscsi_uevent *ev; 1119 struct iscsi_internal *priv; 1120 int len = NLMSG_SPACE(sizeof(*ev)); 1121 1122 priv = iscsi_if_transport_lookup(conn->transport); 1123 if (!priv) 1124 return; 1125 1126 skb = alloc_skb(len, GFP_ATOMIC); 1127 if (!skb) { 1128 iscsi_cls_conn_printk(KERN_ERR, conn, "gracefully ignored " 1129 "conn error (%d)\n", error); 1130 return; 1131 } 1132 1133 nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0); 1134 ev = NLMSG_DATA(nlh); 1135 ev->transport_handle = iscsi_handle(conn->transport); 1136 ev->type = ISCSI_KEVENT_CONN_ERROR; 1137 ev->r.connerror.error = error; 1138 ev->r.connerror.cid = conn->cid; 1139 ev->r.connerror.sid = iscsi_conn_get_sid(conn); 1140 1141 iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_ATOMIC); 1142 1143 iscsi_cls_conn_printk(KERN_INFO, conn, "detected conn error (%d)\n", 1144 error); 1145 } 1146 EXPORT_SYMBOL_GPL(iscsi_conn_error_event); 1147 1148 static int 1149 iscsi_if_send_reply(uint32_t group, int seq, int type, int done, int multi, 1150 void *payload, int size) 1151 { 1152 struct sk_buff *skb; 1153 struct nlmsghdr *nlh; 1154 int len = NLMSG_SPACE(size); 1155 int flags = multi ? NLM_F_MULTI : 0; 1156 int t = done ? NLMSG_DONE : type; 1157 1158 skb = alloc_skb(len, GFP_ATOMIC); 1159 if (!skb) { 1160 printk(KERN_ERR "Could not allocate skb to send reply.\n"); 1161 return -ENOMEM; 1162 } 1163 1164 nlh = __nlmsg_put(skb, 0, 0, t, (len - sizeof(*nlh)), 0); 1165 nlh->nlmsg_flags = flags; 1166 memcpy(NLMSG_DATA(nlh), payload, size); 1167 return iscsi_multicast_skb(skb, group, GFP_ATOMIC); 1168 } 1169 1170 static int 1171 iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) 1172 { 1173 struct iscsi_uevent *ev = NLMSG_DATA(nlh); 1174 struct iscsi_stats *stats; 1175 struct sk_buff *skbstat; 1176 struct iscsi_cls_conn *conn; 1177 struct nlmsghdr *nlhstat; 1178 struct iscsi_uevent *evstat; 1179 struct iscsi_internal *priv; 1180 int len = NLMSG_SPACE(sizeof(*ev) + 1181 sizeof(struct iscsi_stats) + 1182 sizeof(struct iscsi_stats_custom) * 1183 ISCSI_STATS_CUSTOM_MAX); 1184 int err = 0; 1185 1186 priv = iscsi_if_transport_lookup(transport); 1187 if (!priv) 1188 return -EINVAL; 1189 1190 conn = iscsi_conn_lookup(ev->u.get_stats.sid, ev->u.get_stats.cid); 1191 if (!conn) 1192 return -EEXIST; 1193 1194 do { 1195 int actual_size; 1196 1197 skbstat = alloc_skb(len, GFP_ATOMIC); 1198 if (!skbstat) { 1199 iscsi_cls_conn_printk(KERN_ERR, conn, "can not " 1200 "deliver stats: OOM\n"); 1201 return -ENOMEM; 1202 } 1203 1204 nlhstat = __nlmsg_put(skbstat, 0, 0, 0, 1205 (len - sizeof(*nlhstat)), 0); 1206 evstat = NLMSG_DATA(nlhstat); 1207 memset(evstat, 0, sizeof(*evstat)); 1208 evstat->transport_handle = iscsi_handle(conn->transport); 1209 evstat->type = nlh->nlmsg_type; 1210 evstat->u.get_stats.cid = 1211 ev->u.get_stats.cid; 1212 evstat->u.get_stats.sid = 1213 ev->u.get_stats.sid; 1214 stats = (struct iscsi_stats *) 1215 ((char*)evstat + sizeof(*evstat)); 1216 memset(stats, 0, sizeof(*stats)); 1217 1218 transport->get_stats(conn, stats); 1219 actual_size = NLMSG_SPACE(sizeof(struct iscsi_uevent) + 1220 sizeof(struct iscsi_stats) + 1221 sizeof(struct iscsi_stats_custom) * 1222 stats->custom_length); 1223 actual_size -= sizeof(*nlhstat); 1224 actual_size = NLMSG_LENGTH(actual_size); 1225 skb_trim(skbstat, NLMSG_ALIGN(actual_size)); 1226 nlhstat->nlmsg_len = actual_size; 1227 1228 err = iscsi_multicast_skb(skbstat, ISCSI_NL_GRP_ISCSID, 1229 GFP_ATOMIC); 1230 } while (err < 0 && err != -ECONNREFUSED); 1231 1232 return err; 1233 } 1234 1235 /** 1236 * iscsi_session_event - send session destr. completion event 1237 * @session: iscsi class session 1238 * @event: type of event 1239 */ 1240 int iscsi_session_event(struct iscsi_cls_session *session, 1241 enum iscsi_uevent_e event) 1242 { 1243 struct iscsi_internal *priv; 1244 struct Scsi_Host *shost; 1245 struct iscsi_uevent *ev; 1246 struct sk_buff *skb; 1247 struct nlmsghdr *nlh; 1248 int rc, len = NLMSG_SPACE(sizeof(*ev)); 1249 1250 priv = iscsi_if_transport_lookup(session->transport); 1251 if (!priv) 1252 return -EINVAL; 1253 shost = iscsi_session_to_shost(session); 1254 1255 skb = alloc_skb(len, GFP_KERNEL); 1256 if (!skb) { 1257 iscsi_cls_session_printk(KERN_ERR, session, 1258 "Cannot notify userspace of session " 1259 "event %u\n", event); 1260 return -ENOMEM; 1261 } 1262 1263 nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0); 1264 ev = NLMSG_DATA(nlh); 1265 ev->transport_handle = iscsi_handle(session->transport); 1266 1267 ev->type = event; 1268 switch (event) { 1269 case ISCSI_KEVENT_DESTROY_SESSION: 1270 ev->r.d_session.host_no = shost->host_no; 1271 ev->r.d_session.sid = session->sid; 1272 break; 1273 case ISCSI_KEVENT_CREATE_SESSION: 1274 ev->r.c_session_ret.host_no = shost->host_no; 1275 ev->r.c_session_ret.sid = session->sid; 1276 break; 1277 case ISCSI_KEVENT_UNBIND_SESSION: 1278 ev->r.unbind_session.host_no = shost->host_no; 1279 ev->r.unbind_session.sid = session->sid; 1280 break; 1281 default: 1282 iscsi_cls_session_printk(KERN_ERR, session, "Invalid event " 1283 "%u.\n", event); 1284 kfree_skb(skb); 1285 return -EINVAL; 1286 } 1287 1288 /* 1289 * this will occur if the daemon is not up, so we just warn 1290 * the user and when the daemon is restarted it will handle it 1291 */ 1292 rc = iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_KERNEL); 1293 if (rc == -ESRCH) 1294 iscsi_cls_session_printk(KERN_ERR, session, 1295 "Cannot notify userspace of session " 1296 "event %u. Check iscsi daemon\n", 1297 event); 1298 1299 ISCSI_DBG_TRANS_SESSION(session, "Completed handling event %d rc %d\n", 1300 event, rc); 1301 return rc; 1302 } 1303 EXPORT_SYMBOL_GPL(iscsi_session_event); 1304 1305 static int 1306 iscsi_if_create_session(struct iscsi_internal *priv, struct iscsi_endpoint *ep, 1307 struct iscsi_uevent *ev, uint32_t initial_cmdsn, 1308 uint16_t cmds_max, uint16_t queue_depth) 1309 { 1310 struct iscsi_transport *transport = priv->iscsi_transport; 1311 struct iscsi_cls_session *session; 1312 struct Scsi_Host *shost; 1313 1314 session = transport->create_session(ep, cmds_max, queue_depth, 1315 initial_cmdsn); 1316 if (!session) 1317 return -ENOMEM; 1318 1319 shost = iscsi_session_to_shost(session); 1320 ev->r.c_session_ret.host_no = shost->host_no; 1321 ev->r.c_session_ret.sid = session->sid; 1322 ISCSI_DBG_TRANS_SESSION(session, 1323 "Completed creating transport session\n"); 1324 return 0; 1325 } 1326 1327 static int 1328 iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev) 1329 { 1330 struct iscsi_cls_conn *conn; 1331 struct iscsi_cls_session *session; 1332 1333 session = iscsi_session_lookup(ev->u.c_conn.sid); 1334 if (!session) { 1335 printk(KERN_ERR "iscsi: invalid session %d.\n", 1336 ev->u.c_conn.sid); 1337 return -EINVAL; 1338 } 1339 1340 conn = transport->create_conn(session, ev->u.c_conn.cid); 1341 if (!conn) { 1342 iscsi_cls_session_printk(KERN_ERR, session, 1343 "couldn't create a new connection."); 1344 return -ENOMEM; 1345 } 1346 1347 ev->r.c_conn_ret.sid = session->sid; 1348 ev->r.c_conn_ret.cid = conn->cid; 1349 1350 ISCSI_DBG_TRANS_CONN(conn, "Completed creating transport conn\n"); 1351 return 0; 1352 } 1353 1354 static int 1355 iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev) 1356 { 1357 struct iscsi_cls_conn *conn; 1358 1359 conn = iscsi_conn_lookup(ev->u.d_conn.sid, ev->u.d_conn.cid); 1360 if (!conn) 1361 return -EINVAL; 1362 1363 ISCSI_DBG_TRANS_CONN(conn, "Destroying transport conn\n"); 1364 if (transport->destroy_conn) 1365 transport->destroy_conn(conn); 1366 1367 return 0; 1368 } 1369 1370 static int 1371 iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev) 1372 { 1373 char *data = (char*)ev + sizeof(*ev); 1374 struct iscsi_cls_conn *conn; 1375 struct iscsi_cls_session *session; 1376 int err = 0, value = 0; 1377 1378 session = iscsi_session_lookup(ev->u.set_param.sid); 1379 conn = iscsi_conn_lookup(ev->u.set_param.sid, ev->u.set_param.cid); 1380 if (!conn || !session) 1381 return -EINVAL; 1382 1383 switch (ev->u.set_param.param) { 1384 case ISCSI_PARAM_SESS_RECOVERY_TMO: 1385 sscanf(data, "%d", &value); 1386 session->recovery_tmo = value; 1387 break; 1388 default: 1389 err = transport->set_param(conn, ev->u.set_param.param, 1390 data, ev->u.set_param.len); 1391 } 1392 1393 return err; 1394 } 1395 1396 static int iscsi_if_ep_connect(struct iscsi_transport *transport, 1397 struct iscsi_uevent *ev, int msg_type) 1398 { 1399 struct iscsi_endpoint *ep; 1400 struct sockaddr *dst_addr; 1401 struct Scsi_Host *shost = NULL; 1402 int non_blocking, err = 0; 1403 1404 if (!transport->ep_connect) 1405 return -EINVAL; 1406 1407 if (msg_type == ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST) { 1408 shost = scsi_host_lookup(ev->u.ep_connect_through_host.host_no); 1409 if (!shost) { 1410 printk(KERN_ERR "ep connect failed. Could not find " 1411 "host no %u\n", 1412 ev->u.ep_connect_through_host.host_no); 1413 return -ENODEV; 1414 } 1415 non_blocking = ev->u.ep_connect_through_host.non_blocking; 1416 } else 1417 non_blocking = ev->u.ep_connect.non_blocking; 1418 1419 dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev)); 1420 ep = transport->ep_connect(shost, dst_addr, non_blocking); 1421 if (IS_ERR(ep)) { 1422 err = PTR_ERR(ep); 1423 goto release_host; 1424 } 1425 1426 ev->r.ep_connect_ret.handle = ep->id; 1427 release_host: 1428 if (shost) 1429 scsi_host_put(shost); 1430 return err; 1431 } 1432 1433 static int 1434 iscsi_if_transport_ep(struct iscsi_transport *transport, 1435 struct iscsi_uevent *ev, int msg_type) 1436 { 1437 struct iscsi_endpoint *ep; 1438 int rc = 0; 1439 1440 switch (msg_type) { 1441 case ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST: 1442 case ISCSI_UEVENT_TRANSPORT_EP_CONNECT: 1443 rc = iscsi_if_ep_connect(transport, ev, msg_type); 1444 break; 1445 case ISCSI_UEVENT_TRANSPORT_EP_POLL: 1446 if (!transport->ep_poll) 1447 return -EINVAL; 1448 1449 ep = iscsi_lookup_endpoint(ev->u.ep_poll.ep_handle); 1450 if (!ep) 1451 return -EINVAL; 1452 1453 ev->r.retcode = transport->ep_poll(ep, 1454 ev->u.ep_poll.timeout_ms); 1455 break; 1456 case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT: 1457 if (!transport->ep_disconnect) 1458 return -EINVAL; 1459 1460 ep = iscsi_lookup_endpoint(ev->u.ep_disconnect.ep_handle); 1461 if (!ep) 1462 return -EINVAL; 1463 1464 transport->ep_disconnect(ep); 1465 break; 1466 } 1467 return rc; 1468 } 1469 1470 static int 1471 iscsi_tgt_dscvr(struct iscsi_transport *transport, 1472 struct iscsi_uevent *ev) 1473 { 1474 struct Scsi_Host *shost; 1475 struct sockaddr *dst_addr; 1476 int err; 1477 1478 if (!transport->tgt_dscvr) 1479 return -EINVAL; 1480 1481 shost = scsi_host_lookup(ev->u.tgt_dscvr.host_no); 1482 if (!shost) { 1483 printk(KERN_ERR "target discovery could not find host no %u\n", 1484 ev->u.tgt_dscvr.host_no); 1485 return -ENODEV; 1486 } 1487 1488 1489 dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev)); 1490 err = transport->tgt_dscvr(shost, ev->u.tgt_dscvr.type, 1491 ev->u.tgt_dscvr.enable, dst_addr); 1492 scsi_host_put(shost); 1493 return err; 1494 } 1495 1496 static int 1497 iscsi_set_host_param(struct iscsi_transport *transport, 1498 struct iscsi_uevent *ev) 1499 { 1500 char *data = (char*)ev + sizeof(*ev); 1501 struct Scsi_Host *shost; 1502 int err; 1503 1504 if (!transport->set_host_param) 1505 return -ENOSYS; 1506 1507 shost = scsi_host_lookup(ev->u.set_host_param.host_no); 1508 if (!shost) { 1509 printk(KERN_ERR "set_host_param could not find host no %u\n", 1510 ev->u.set_host_param.host_no); 1511 return -ENODEV; 1512 } 1513 1514 err = transport->set_host_param(shost, ev->u.set_host_param.param, 1515 data, ev->u.set_host_param.len); 1516 scsi_host_put(shost); 1517 return err; 1518 } 1519 1520 static int 1521 iscsi_set_path(struct iscsi_transport *transport, struct iscsi_uevent *ev) 1522 { 1523 struct Scsi_Host *shost; 1524 struct iscsi_path *params; 1525 int err; 1526 1527 if (!transport->set_path) 1528 return -ENOSYS; 1529 1530 shost = scsi_host_lookup(ev->u.set_path.host_no); 1531 if (!shost) { 1532 printk(KERN_ERR "set path could not find host no %u\n", 1533 ev->u.set_path.host_no); 1534 return -ENODEV; 1535 } 1536 1537 params = (struct iscsi_path *)((char *)ev + sizeof(*ev)); 1538 err = transport->set_path(shost, params); 1539 1540 scsi_host_put(shost); 1541 return err; 1542 } 1543 1544 static int 1545 iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) 1546 { 1547 int err = 0; 1548 struct iscsi_uevent *ev = NLMSG_DATA(nlh); 1549 struct iscsi_transport *transport = NULL; 1550 struct iscsi_internal *priv; 1551 struct iscsi_cls_session *session; 1552 struct iscsi_cls_conn *conn; 1553 struct iscsi_endpoint *ep = NULL; 1554 1555 if (nlh->nlmsg_type == ISCSI_UEVENT_PATH_UPDATE) 1556 *group = ISCSI_NL_GRP_UIP; 1557 else 1558 *group = ISCSI_NL_GRP_ISCSID; 1559 1560 priv = iscsi_if_transport_lookup(iscsi_ptr(ev->transport_handle)); 1561 if (!priv) 1562 return -EINVAL; 1563 transport = priv->iscsi_transport; 1564 1565 if (!try_module_get(transport->owner)) 1566 return -EINVAL; 1567 1568 switch (nlh->nlmsg_type) { 1569 case ISCSI_UEVENT_CREATE_SESSION: 1570 err = iscsi_if_create_session(priv, ep, ev, 1571 ev->u.c_session.initial_cmdsn, 1572 ev->u.c_session.cmds_max, 1573 ev->u.c_session.queue_depth); 1574 break; 1575 case ISCSI_UEVENT_CREATE_BOUND_SESSION: 1576 ep = iscsi_lookup_endpoint(ev->u.c_bound_session.ep_handle); 1577 if (!ep) { 1578 err = -EINVAL; 1579 break; 1580 } 1581 1582 err = iscsi_if_create_session(priv, ep, ev, 1583 ev->u.c_bound_session.initial_cmdsn, 1584 ev->u.c_bound_session.cmds_max, 1585 ev->u.c_bound_session.queue_depth); 1586 break; 1587 case ISCSI_UEVENT_DESTROY_SESSION: 1588 session = iscsi_session_lookup(ev->u.d_session.sid); 1589 if (session) 1590 transport->destroy_session(session); 1591 else 1592 err = -EINVAL; 1593 break; 1594 case ISCSI_UEVENT_UNBIND_SESSION: 1595 session = iscsi_session_lookup(ev->u.d_session.sid); 1596 if (session) 1597 scsi_queue_work(iscsi_session_to_shost(session), 1598 &session->unbind_work); 1599 else 1600 err = -EINVAL; 1601 break; 1602 case ISCSI_UEVENT_CREATE_CONN: 1603 err = iscsi_if_create_conn(transport, ev); 1604 break; 1605 case ISCSI_UEVENT_DESTROY_CONN: 1606 err = iscsi_if_destroy_conn(transport, ev); 1607 break; 1608 case ISCSI_UEVENT_BIND_CONN: 1609 session = iscsi_session_lookup(ev->u.b_conn.sid); 1610 conn = iscsi_conn_lookup(ev->u.b_conn.sid, ev->u.b_conn.cid); 1611 1612 if (session && conn) 1613 ev->r.retcode = transport->bind_conn(session, conn, 1614 ev->u.b_conn.transport_eph, 1615 ev->u.b_conn.is_leading); 1616 else 1617 err = -EINVAL; 1618 break; 1619 case ISCSI_UEVENT_SET_PARAM: 1620 err = iscsi_set_param(transport, ev); 1621 break; 1622 case ISCSI_UEVENT_START_CONN: 1623 conn = iscsi_conn_lookup(ev->u.start_conn.sid, ev->u.start_conn.cid); 1624 if (conn) 1625 ev->r.retcode = transport->start_conn(conn); 1626 else 1627 err = -EINVAL; 1628 break; 1629 case ISCSI_UEVENT_STOP_CONN: 1630 conn = iscsi_conn_lookup(ev->u.stop_conn.sid, ev->u.stop_conn.cid); 1631 if (conn) 1632 transport->stop_conn(conn, ev->u.stop_conn.flag); 1633 else 1634 err = -EINVAL; 1635 break; 1636 case ISCSI_UEVENT_SEND_PDU: 1637 conn = iscsi_conn_lookup(ev->u.send_pdu.sid, ev->u.send_pdu.cid); 1638 if (conn) 1639 ev->r.retcode = transport->send_pdu(conn, 1640 (struct iscsi_hdr*)((char*)ev + sizeof(*ev)), 1641 (char*)ev + sizeof(*ev) + ev->u.send_pdu.hdr_size, 1642 ev->u.send_pdu.data_size); 1643 else 1644 err = -EINVAL; 1645 break; 1646 case ISCSI_UEVENT_GET_STATS: 1647 err = iscsi_if_get_stats(transport, nlh); 1648 break; 1649 case ISCSI_UEVENT_TRANSPORT_EP_CONNECT: 1650 case ISCSI_UEVENT_TRANSPORT_EP_POLL: 1651 case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT: 1652 case ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST: 1653 err = iscsi_if_transport_ep(transport, ev, nlh->nlmsg_type); 1654 break; 1655 case ISCSI_UEVENT_TGT_DSCVR: 1656 err = iscsi_tgt_dscvr(transport, ev); 1657 break; 1658 case ISCSI_UEVENT_SET_HOST_PARAM: 1659 err = iscsi_set_host_param(transport, ev); 1660 break; 1661 case ISCSI_UEVENT_PATH_UPDATE: 1662 err = iscsi_set_path(transport, ev); 1663 break; 1664 default: 1665 err = -ENOSYS; 1666 break; 1667 } 1668 1669 module_put(transport->owner); 1670 return err; 1671 } 1672 1673 /* 1674 * Get message from skb. Each message is processed by iscsi_if_recv_msg. 1675 * Malformed skbs with wrong lengths or invalid creds are not processed. 1676 */ 1677 static void 1678 iscsi_if_rx(struct sk_buff *skb) 1679 { 1680 mutex_lock(&rx_queue_mutex); 1681 while (skb->len >= NLMSG_SPACE(0)) { 1682 int err; 1683 uint32_t rlen; 1684 struct nlmsghdr *nlh; 1685 struct iscsi_uevent *ev; 1686 uint32_t group; 1687 1688 nlh = nlmsg_hdr(skb); 1689 if (nlh->nlmsg_len < sizeof(*nlh) || 1690 skb->len < nlh->nlmsg_len) { 1691 break; 1692 } 1693 1694 ev = NLMSG_DATA(nlh); 1695 rlen = NLMSG_ALIGN(nlh->nlmsg_len); 1696 if (rlen > skb->len) 1697 rlen = skb->len; 1698 1699 err = iscsi_if_recv_msg(skb, nlh, &group); 1700 if (err) { 1701 ev->type = ISCSI_KEVENT_IF_ERROR; 1702 ev->iferror = err; 1703 } 1704 do { 1705 /* 1706 * special case for GET_STATS: 1707 * on success - sending reply and stats from 1708 * inside of if_recv_msg(), 1709 * on error - fall through. 1710 */ 1711 if (ev->type == ISCSI_UEVENT_GET_STATS && !err) 1712 break; 1713 err = iscsi_if_send_reply(group, nlh->nlmsg_seq, 1714 nlh->nlmsg_type, 0, 0, ev, sizeof(*ev)); 1715 } while (err < 0 && err != -ECONNREFUSED); 1716 skb_pull(skb, rlen); 1717 } 1718 mutex_unlock(&rx_queue_mutex); 1719 } 1720 1721 #define ISCSI_CLASS_ATTR(_prefix,_name,_mode,_show,_store) \ 1722 struct device_attribute dev_attr_##_prefix##_##_name = \ 1723 __ATTR(_name,_mode,_show,_store) 1724 1725 /* 1726 * iSCSI connection attrs 1727 */ 1728 #define iscsi_conn_attr_show(param) \ 1729 static ssize_t \ 1730 show_conn_param_##param(struct device *dev, \ 1731 struct device_attribute *attr, char *buf) \ 1732 { \ 1733 struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev->parent); \ 1734 struct iscsi_transport *t = conn->transport; \ 1735 return t->get_conn_param(conn, param, buf); \ 1736 } 1737 1738 #define iscsi_conn_attr(field, param) \ 1739 iscsi_conn_attr_show(param) \ 1740 static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_param_##param, \ 1741 NULL); 1742 1743 iscsi_conn_attr(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH); 1744 iscsi_conn_attr(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH); 1745 iscsi_conn_attr(header_digest, ISCSI_PARAM_HDRDGST_EN); 1746 iscsi_conn_attr(data_digest, ISCSI_PARAM_DATADGST_EN); 1747 iscsi_conn_attr(ifmarker, ISCSI_PARAM_IFMARKER_EN); 1748 iscsi_conn_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN); 1749 iscsi_conn_attr(persistent_port, ISCSI_PARAM_PERSISTENT_PORT); 1750 iscsi_conn_attr(port, ISCSI_PARAM_CONN_PORT); 1751 iscsi_conn_attr(exp_statsn, ISCSI_PARAM_EXP_STATSN); 1752 iscsi_conn_attr(persistent_address, ISCSI_PARAM_PERSISTENT_ADDRESS); 1753 iscsi_conn_attr(address, ISCSI_PARAM_CONN_ADDRESS); 1754 iscsi_conn_attr(ping_tmo, ISCSI_PARAM_PING_TMO); 1755 iscsi_conn_attr(recv_tmo, ISCSI_PARAM_RECV_TMO); 1756 1757 /* 1758 * iSCSI session attrs 1759 */ 1760 #define iscsi_session_attr_show(param, perm) \ 1761 static ssize_t \ 1762 show_session_param_##param(struct device *dev, \ 1763 struct device_attribute *attr, char *buf) \ 1764 { \ 1765 struct iscsi_cls_session *session = \ 1766 iscsi_dev_to_session(dev->parent); \ 1767 struct iscsi_transport *t = session->transport; \ 1768 \ 1769 if (perm && !capable(CAP_SYS_ADMIN)) \ 1770 return -EACCES; \ 1771 return t->get_session_param(session, param, buf); \ 1772 } 1773 1774 #define iscsi_session_attr(field, param, perm) \ 1775 iscsi_session_attr_show(param, perm) \ 1776 static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_param_##param, \ 1777 NULL); 1778 1779 iscsi_session_attr(targetname, ISCSI_PARAM_TARGET_NAME, 0); 1780 iscsi_session_attr(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN, 0); 1781 iscsi_session_attr(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T, 0); 1782 iscsi_session_attr(immediate_data, ISCSI_PARAM_IMM_DATA_EN, 0); 1783 iscsi_session_attr(first_burst_len, ISCSI_PARAM_FIRST_BURST, 0); 1784 iscsi_session_attr(max_burst_len, ISCSI_PARAM_MAX_BURST, 0); 1785 iscsi_session_attr(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN, 0); 1786 iscsi_session_attr(data_seq_in_order, ISCSI_PARAM_DATASEQ_INORDER_EN, 0); 1787 iscsi_session_attr(erl, ISCSI_PARAM_ERL, 0); 1788 iscsi_session_attr(tpgt, ISCSI_PARAM_TPGT, 0); 1789 iscsi_session_attr(username, ISCSI_PARAM_USERNAME, 1); 1790 iscsi_session_attr(username_in, ISCSI_PARAM_USERNAME_IN, 1); 1791 iscsi_session_attr(password, ISCSI_PARAM_PASSWORD, 1); 1792 iscsi_session_attr(password_in, ISCSI_PARAM_PASSWORD_IN, 1); 1793 iscsi_session_attr(fast_abort, ISCSI_PARAM_FAST_ABORT, 0); 1794 iscsi_session_attr(abort_tmo, ISCSI_PARAM_ABORT_TMO, 0); 1795 iscsi_session_attr(lu_reset_tmo, ISCSI_PARAM_LU_RESET_TMO, 0); 1796 iscsi_session_attr(tgt_reset_tmo, ISCSI_PARAM_TGT_RESET_TMO, 0); 1797 iscsi_session_attr(ifacename, ISCSI_PARAM_IFACE_NAME, 0); 1798 iscsi_session_attr(initiatorname, ISCSI_PARAM_INITIATOR_NAME, 0); 1799 iscsi_session_attr(targetalias, ISCSI_PARAM_TARGET_ALIAS, 0); 1800 1801 static ssize_t 1802 show_priv_session_state(struct device *dev, struct device_attribute *attr, 1803 char *buf) 1804 { 1805 struct iscsi_cls_session *session = iscsi_dev_to_session(dev->parent); 1806 return sprintf(buf, "%s\n", iscsi_session_state_name(session->state)); 1807 } 1808 static ISCSI_CLASS_ATTR(priv_sess, state, S_IRUGO, show_priv_session_state, 1809 NULL); 1810 1811 #define iscsi_priv_session_attr_show(field, format) \ 1812 static ssize_t \ 1813 show_priv_session_##field(struct device *dev, \ 1814 struct device_attribute *attr, char *buf) \ 1815 { \ 1816 struct iscsi_cls_session *session = \ 1817 iscsi_dev_to_session(dev->parent); \ 1818 if (session->field == -1) \ 1819 return sprintf(buf, "off\n"); \ 1820 return sprintf(buf, format"\n", session->field); \ 1821 } 1822 1823 #define iscsi_priv_session_attr_store(field) \ 1824 static ssize_t \ 1825 store_priv_session_##field(struct device *dev, \ 1826 struct device_attribute *attr, \ 1827 const char *buf, size_t count) \ 1828 { \ 1829 int val; \ 1830 char *cp; \ 1831 struct iscsi_cls_session *session = \ 1832 iscsi_dev_to_session(dev->parent); \ 1833 if ((session->state == ISCSI_SESSION_FREE) || \ 1834 (session->state == ISCSI_SESSION_FAILED)) \ 1835 return -EBUSY; \ 1836 if (strncmp(buf, "off", 3) == 0) \ 1837 session->field = -1; \ 1838 else { \ 1839 val = simple_strtoul(buf, &cp, 0); \ 1840 if (*cp != '\0' && *cp != '\n') \ 1841 return -EINVAL; \ 1842 session->field = val; \ 1843 } \ 1844 return count; \ 1845 } 1846 1847 #define iscsi_priv_session_rw_attr(field, format) \ 1848 iscsi_priv_session_attr_show(field, format) \ 1849 iscsi_priv_session_attr_store(field) \ 1850 static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO | S_IWUGO, \ 1851 show_priv_session_##field, \ 1852 store_priv_session_##field) 1853 iscsi_priv_session_rw_attr(recovery_tmo, "%d"); 1854 1855 /* 1856 * iSCSI host attrs 1857 */ 1858 #define iscsi_host_attr_show(param) \ 1859 static ssize_t \ 1860 show_host_param_##param(struct device *dev, \ 1861 struct device_attribute *attr, char *buf) \ 1862 { \ 1863 struct Scsi_Host *shost = transport_class_to_shost(dev); \ 1864 struct iscsi_internal *priv = to_iscsi_internal(shost->transportt); \ 1865 return priv->iscsi_transport->get_host_param(shost, param, buf); \ 1866 } 1867 1868 #define iscsi_host_attr(field, param) \ 1869 iscsi_host_attr_show(param) \ 1870 static ISCSI_CLASS_ATTR(host, field, S_IRUGO, show_host_param_##param, \ 1871 NULL); 1872 1873 iscsi_host_attr(netdev, ISCSI_HOST_PARAM_NETDEV_NAME); 1874 iscsi_host_attr(hwaddress, ISCSI_HOST_PARAM_HWADDRESS); 1875 iscsi_host_attr(ipaddress, ISCSI_HOST_PARAM_IPADDRESS); 1876 iscsi_host_attr(initiatorname, ISCSI_HOST_PARAM_INITIATOR_NAME); 1877 1878 #define SETUP_PRIV_SESSION_RD_ATTR(field) \ 1879 do { \ 1880 priv->session_attrs[count] = &dev_attr_priv_sess_##field; \ 1881 count++; \ 1882 } while (0) 1883 1884 #define SETUP_PRIV_SESSION_RW_ATTR(field) \ 1885 do { \ 1886 priv->session_attrs[count] = &dev_attr_priv_sess_##field; \ 1887 count++; \ 1888 } while (0) 1889 1890 #define SETUP_SESSION_RD_ATTR(field, param_flag) \ 1891 do { \ 1892 if (tt->param_mask & param_flag) { \ 1893 priv->session_attrs[count] = &dev_attr_sess_##field; \ 1894 count++; \ 1895 } \ 1896 } while (0) 1897 1898 #define SETUP_CONN_RD_ATTR(field, param_flag) \ 1899 do { \ 1900 if (tt->param_mask & param_flag) { \ 1901 priv->conn_attrs[count] = &dev_attr_conn_##field; \ 1902 count++; \ 1903 } \ 1904 } while (0) 1905 1906 #define SETUP_HOST_RD_ATTR(field, param_flag) \ 1907 do { \ 1908 if (tt->host_param_mask & param_flag) { \ 1909 priv->host_attrs[count] = &dev_attr_host_##field; \ 1910 count++; \ 1911 } \ 1912 } while (0) 1913 1914 static int iscsi_session_match(struct attribute_container *cont, 1915 struct device *dev) 1916 { 1917 struct iscsi_cls_session *session; 1918 struct Scsi_Host *shost; 1919 struct iscsi_internal *priv; 1920 1921 if (!iscsi_is_session_dev(dev)) 1922 return 0; 1923 1924 session = iscsi_dev_to_session(dev); 1925 shost = iscsi_session_to_shost(session); 1926 if (!shost->transportt) 1927 return 0; 1928 1929 priv = to_iscsi_internal(shost->transportt); 1930 if (priv->session_cont.ac.class != &iscsi_session_class.class) 1931 return 0; 1932 1933 return &priv->session_cont.ac == cont; 1934 } 1935 1936 static int iscsi_conn_match(struct attribute_container *cont, 1937 struct device *dev) 1938 { 1939 struct iscsi_cls_session *session; 1940 struct iscsi_cls_conn *conn; 1941 struct Scsi_Host *shost; 1942 struct iscsi_internal *priv; 1943 1944 if (!iscsi_is_conn_dev(dev)) 1945 return 0; 1946 1947 conn = iscsi_dev_to_conn(dev); 1948 session = iscsi_dev_to_session(conn->dev.parent); 1949 shost = iscsi_session_to_shost(session); 1950 1951 if (!shost->transportt) 1952 return 0; 1953 1954 priv = to_iscsi_internal(shost->transportt); 1955 if (priv->conn_cont.ac.class != &iscsi_connection_class.class) 1956 return 0; 1957 1958 return &priv->conn_cont.ac == cont; 1959 } 1960 1961 static int iscsi_host_match(struct attribute_container *cont, 1962 struct device *dev) 1963 { 1964 struct Scsi_Host *shost; 1965 struct iscsi_internal *priv; 1966 1967 if (!scsi_is_host_device(dev)) 1968 return 0; 1969 1970 shost = dev_to_shost(dev); 1971 if (!shost->transportt || 1972 shost->transportt->host_attrs.ac.class != &iscsi_host_class.class) 1973 return 0; 1974 1975 priv = to_iscsi_internal(shost->transportt); 1976 return &priv->t.host_attrs.ac == cont; 1977 } 1978 1979 struct scsi_transport_template * 1980 iscsi_register_transport(struct iscsi_transport *tt) 1981 { 1982 struct iscsi_internal *priv; 1983 unsigned long flags; 1984 int count = 0, err; 1985 1986 BUG_ON(!tt); 1987 1988 priv = iscsi_if_transport_lookup(tt); 1989 if (priv) 1990 return NULL; 1991 1992 priv = kzalloc(sizeof(*priv), GFP_KERNEL); 1993 if (!priv) 1994 return NULL; 1995 INIT_LIST_HEAD(&priv->list); 1996 priv->iscsi_transport = tt; 1997 priv->t.user_scan = iscsi_user_scan; 1998 priv->t.create_work_queue = 1; 1999 2000 priv->dev.class = &iscsi_transport_class; 2001 dev_set_name(&priv->dev, "%s", tt->name); 2002 err = device_register(&priv->dev); 2003 if (err) 2004 goto free_priv; 2005 2006 err = sysfs_create_group(&priv->dev.kobj, &iscsi_transport_group); 2007 if (err) 2008 goto unregister_dev; 2009 2010 /* host parameters */ 2011 priv->t.host_attrs.ac.attrs = &priv->host_attrs[0]; 2012 priv->t.host_attrs.ac.class = &iscsi_host_class.class; 2013 priv->t.host_attrs.ac.match = iscsi_host_match; 2014 priv->t.host_size = sizeof(struct iscsi_cls_host); 2015 transport_container_register(&priv->t.host_attrs); 2016 2017 SETUP_HOST_RD_ATTR(netdev, ISCSI_HOST_NETDEV_NAME); 2018 SETUP_HOST_RD_ATTR(ipaddress, ISCSI_HOST_IPADDRESS); 2019 SETUP_HOST_RD_ATTR(hwaddress, ISCSI_HOST_HWADDRESS); 2020 SETUP_HOST_RD_ATTR(initiatorname, ISCSI_HOST_INITIATOR_NAME); 2021 BUG_ON(count > ISCSI_HOST_ATTRS); 2022 priv->host_attrs[count] = NULL; 2023 count = 0; 2024 2025 /* connection parameters */ 2026 priv->conn_cont.ac.attrs = &priv->conn_attrs[0]; 2027 priv->conn_cont.ac.class = &iscsi_connection_class.class; 2028 priv->conn_cont.ac.match = iscsi_conn_match; 2029 transport_container_register(&priv->conn_cont); 2030 2031 SETUP_CONN_RD_ATTR(max_recv_dlength, ISCSI_MAX_RECV_DLENGTH); 2032 SETUP_CONN_RD_ATTR(max_xmit_dlength, ISCSI_MAX_XMIT_DLENGTH); 2033 SETUP_CONN_RD_ATTR(header_digest, ISCSI_HDRDGST_EN); 2034 SETUP_CONN_RD_ATTR(data_digest, ISCSI_DATADGST_EN); 2035 SETUP_CONN_RD_ATTR(ifmarker, ISCSI_IFMARKER_EN); 2036 SETUP_CONN_RD_ATTR(ofmarker, ISCSI_OFMARKER_EN); 2037 SETUP_CONN_RD_ATTR(address, ISCSI_CONN_ADDRESS); 2038 SETUP_CONN_RD_ATTR(port, ISCSI_CONN_PORT); 2039 SETUP_CONN_RD_ATTR(exp_statsn, ISCSI_EXP_STATSN); 2040 SETUP_CONN_RD_ATTR(persistent_address, ISCSI_PERSISTENT_ADDRESS); 2041 SETUP_CONN_RD_ATTR(persistent_port, ISCSI_PERSISTENT_PORT); 2042 SETUP_CONN_RD_ATTR(ping_tmo, ISCSI_PING_TMO); 2043 SETUP_CONN_RD_ATTR(recv_tmo, ISCSI_RECV_TMO); 2044 2045 BUG_ON(count > ISCSI_CONN_ATTRS); 2046 priv->conn_attrs[count] = NULL; 2047 count = 0; 2048 2049 /* session parameters */ 2050 priv->session_cont.ac.attrs = &priv->session_attrs[0]; 2051 priv->session_cont.ac.class = &iscsi_session_class.class; 2052 priv->session_cont.ac.match = iscsi_session_match; 2053 transport_container_register(&priv->session_cont); 2054 2055 SETUP_SESSION_RD_ATTR(initial_r2t, ISCSI_INITIAL_R2T_EN); 2056 SETUP_SESSION_RD_ATTR(max_outstanding_r2t, ISCSI_MAX_R2T); 2057 SETUP_SESSION_RD_ATTR(immediate_data, ISCSI_IMM_DATA_EN); 2058 SETUP_SESSION_RD_ATTR(first_burst_len, ISCSI_FIRST_BURST); 2059 SETUP_SESSION_RD_ATTR(max_burst_len, ISCSI_MAX_BURST); 2060 SETUP_SESSION_RD_ATTR(data_pdu_in_order, ISCSI_PDU_INORDER_EN); 2061 SETUP_SESSION_RD_ATTR(data_seq_in_order, ISCSI_DATASEQ_INORDER_EN); 2062 SETUP_SESSION_RD_ATTR(erl, ISCSI_ERL); 2063 SETUP_SESSION_RD_ATTR(targetname, ISCSI_TARGET_NAME); 2064 SETUP_SESSION_RD_ATTR(tpgt, ISCSI_TPGT); 2065 SETUP_SESSION_RD_ATTR(password, ISCSI_USERNAME); 2066 SETUP_SESSION_RD_ATTR(password_in, ISCSI_USERNAME_IN); 2067 SETUP_SESSION_RD_ATTR(username, ISCSI_PASSWORD); 2068 SETUP_SESSION_RD_ATTR(username_in, ISCSI_PASSWORD_IN); 2069 SETUP_SESSION_RD_ATTR(fast_abort, ISCSI_FAST_ABORT); 2070 SETUP_SESSION_RD_ATTR(abort_tmo, ISCSI_ABORT_TMO); 2071 SETUP_SESSION_RD_ATTR(lu_reset_tmo,ISCSI_LU_RESET_TMO); 2072 SETUP_SESSION_RD_ATTR(tgt_reset_tmo,ISCSI_TGT_RESET_TMO); 2073 SETUP_SESSION_RD_ATTR(ifacename, ISCSI_IFACE_NAME); 2074 SETUP_SESSION_RD_ATTR(initiatorname, ISCSI_INITIATOR_NAME); 2075 SETUP_SESSION_RD_ATTR(targetalias, ISCSI_TARGET_ALIAS); 2076 SETUP_PRIV_SESSION_RW_ATTR(recovery_tmo); 2077 SETUP_PRIV_SESSION_RD_ATTR(state); 2078 2079 BUG_ON(count > ISCSI_SESSION_ATTRS); 2080 priv->session_attrs[count] = NULL; 2081 2082 spin_lock_irqsave(&iscsi_transport_lock, flags); 2083 list_add(&priv->list, &iscsi_transports); 2084 spin_unlock_irqrestore(&iscsi_transport_lock, flags); 2085 2086 printk(KERN_NOTICE "iscsi: registered transport (%s)\n", tt->name); 2087 return &priv->t; 2088 2089 unregister_dev: 2090 device_unregister(&priv->dev); 2091 return NULL; 2092 free_priv: 2093 kfree(priv); 2094 return NULL; 2095 } 2096 EXPORT_SYMBOL_GPL(iscsi_register_transport); 2097 2098 int iscsi_unregister_transport(struct iscsi_transport *tt) 2099 { 2100 struct iscsi_internal *priv; 2101 unsigned long flags; 2102 2103 BUG_ON(!tt); 2104 2105 mutex_lock(&rx_queue_mutex); 2106 2107 priv = iscsi_if_transport_lookup(tt); 2108 BUG_ON (!priv); 2109 2110 spin_lock_irqsave(&iscsi_transport_lock, flags); 2111 list_del(&priv->list); 2112 spin_unlock_irqrestore(&iscsi_transport_lock, flags); 2113 2114 transport_container_unregister(&priv->conn_cont); 2115 transport_container_unregister(&priv->session_cont); 2116 transport_container_unregister(&priv->t.host_attrs); 2117 2118 sysfs_remove_group(&priv->dev.kobj, &iscsi_transport_group); 2119 device_unregister(&priv->dev); 2120 mutex_unlock(&rx_queue_mutex); 2121 2122 return 0; 2123 } 2124 EXPORT_SYMBOL_GPL(iscsi_unregister_transport); 2125 2126 static __init int iscsi_transport_init(void) 2127 { 2128 int err; 2129 2130 printk(KERN_INFO "Loading iSCSI transport class v%s.\n", 2131 ISCSI_TRANSPORT_VERSION); 2132 2133 atomic_set(&iscsi_session_nr, 0); 2134 2135 err = class_register(&iscsi_transport_class); 2136 if (err) 2137 return err; 2138 2139 err = class_register(&iscsi_endpoint_class); 2140 if (err) 2141 goto unregister_transport_class; 2142 2143 err = transport_class_register(&iscsi_host_class); 2144 if (err) 2145 goto unregister_endpoint_class; 2146 2147 err = transport_class_register(&iscsi_connection_class); 2148 if (err) 2149 goto unregister_host_class; 2150 2151 err = transport_class_register(&iscsi_session_class); 2152 if (err) 2153 goto unregister_conn_class; 2154 2155 nls = netlink_kernel_create(&init_net, NETLINK_ISCSI, 1, iscsi_if_rx, 2156 NULL, THIS_MODULE); 2157 if (!nls) { 2158 err = -ENOBUFS; 2159 goto unregister_session_class; 2160 } 2161 2162 iscsi_eh_timer_workq = create_singlethread_workqueue("iscsi_eh"); 2163 if (!iscsi_eh_timer_workq) 2164 goto release_nls; 2165 2166 return 0; 2167 2168 release_nls: 2169 netlink_kernel_release(nls); 2170 unregister_session_class: 2171 transport_class_unregister(&iscsi_session_class); 2172 unregister_conn_class: 2173 transport_class_unregister(&iscsi_connection_class); 2174 unregister_host_class: 2175 transport_class_unregister(&iscsi_host_class); 2176 unregister_endpoint_class: 2177 class_unregister(&iscsi_endpoint_class); 2178 unregister_transport_class: 2179 class_unregister(&iscsi_transport_class); 2180 return err; 2181 } 2182 2183 static void __exit iscsi_transport_exit(void) 2184 { 2185 destroy_workqueue(iscsi_eh_timer_workq); 2186 netlink_kernel_release(nls); 2187 transport_class_unregister(&iscsi_connection_class); 2188 transport_class_unregister(&iscsi_session_class); 2189 transport_class_unregister(&iscsi_host_class); 2190 class_unregister(&iscsi_endpoint_class); 2191 class_unregister(&iscsi_transport_class); 2192 } 2193 2194 module_init(iscsi_transport_init); 2195 module_exit(iscsi_transport_exit); 2196 2197 MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, " 2198 "Dmitry Yusupov <dmitry_yus@yahoo.com>, " 2199 "Alex Aizman <itn780@yahoo.com>"); 2200 MODULE_DESCRIPTION("iSCSI Transport Interface"); 2201 MODULE_LICENSE("GPL"); 2202 MODULE_VERSION(ISCSI_TRANSPORT_VERSION); 2203 MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_ISCSI); 2204