aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/scsi
diff options
context:
space:
mode:
authorSwen Schillig <swen@vnet.ibm.com>2010-12-02 09:16:12 -0500
committerJames Bottomley <James.Bottomley@suse.de>2010-12-21 13:24:44 -0500
commitae0904f60fab7cb20c48d32eefdd735e478b91fb (patch)
treee856784159e1f79696a1fbaad7b680540511a992 /drivers/s390/scsi
parent6b57b159709dcb4d53e64738f2d1f73b36e41601 (diff)
[SCSI] zfcp: Redesign of the debug tracing for recovery actions.
The tracing environment of the zfcp LLD has become very bulky and hard to maintain. Small changes involve a large modification process which is error-prone and not effective. This patch is the first of a set to redesign the zfcp tracing to a more straight-forward and easy to extend scheme. It removes all interpretation and visualization parts and focuses on bare logging of the information. This patch deals with all trace records of the zfcp error recovery. Signed-off-by: Swen schillig <swen@vnet.ibm.com> Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/s390/scsi')
-rw-r--r--drivers/s390/scsi/zfcp_dbf.c281
-rw-r--r--drivers/s390/scsi/zfcp_dbf.h100
-rw-r--r--drivers/s390/scsi/zfcp_erp.c31
-rw-r--r--drivers/s390/scsi/zfcp_ext.h12
4 files changed, 139 insertions, 285 deletions
diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c
index 2cdd6b28ff7f..675503628cc9 100644
--- a/drivers/s390/scsi/zfcp_dbf.c
+++ b/drivers/s390/scsi/zfcp_dbf.c
@@ -50,11 +50,6 @@ static void zfcp_dbf_tag(char **p, const char *label, const char *tag)
50 *p += sprintf(*p, "\n"); 50 *p += sprintf(*p, "\n");
51} 51}
52 52
53static void zfcp_dbf_outs(char **buf, const char *s1, const char *s2)
54{
55 *buf += sprintf(*buf, "%-24s%s\n", s1, s2);
56}
57
58static void zfcp_dbf_out(char **buf, const char *s, const char *format, ...) 53static void zfcp_dbf_out(char **buf, const char *s, const char *format, ...)
59{ 54{
60 va_list arg; 55 va_list arg;
@@ -439,241 +434,96 @@ static struct debug_view zfcp_dbf_hba_view = {
439 .format_proc = zfcp_dbf_hba_view_format, 434 .format_proc = zfcp_dbf_hba_view_format,
440}; 435};
441 436
442static const char *zfcp_dbf_rec_tags[] = { 437static void zfcp_dbf_set_common(struct zfcp_dbf_rec *rec,
443 [ZFCP_REC_DBF_ID_THREAD] = "thread", 438 struct zfcp_adapter *adapter,
444 [ZFCP_REC_DBF_ID_TARGET] = "target", 439 struct zfcp_port *port,
445 [ZFCP_REC_DBF_ID_TRIGGER] = "trigger", 440 struct scsi_device *sdev)
446 [ZFCP_REC_DBF_ID_ACTION] = "action",
447};
448
449static int zfcp_dbf_rec_view_format(debug_info_t *id, struct debug_view *view,
450 char *buf, const char *_rec)
451{ 441{
452 struct zfcp_dbf_rec_record *r = (struct zfcp_dbf_rec_record *)_rec; 442 rec->adapter_status = atomic_read(&adapter->status);
453 char *p = buf; 443 if (port) {
454 char hint[ZFCP_DBF_ID_SIZE + 1]; 444 rec->port_status = atomic_read(&port->status);
455 445 rec->wwpn = port->wwpn;
456 memcpy(hint, r->id2, ZFCP_DBF_ID_SIZE); 446 rec->d_id = port->d_id;
457 hint[ZFCP_DBF_ID_SIZE] = 0; 447 }
458 zfcp_dbf_outs(&p, "tag", zfcp_dbf_rec_tags[r->id]); 448 if (sdev) {
459 zfcp_dbf_outs(&p, "hint", hint); 449 rec->lun_status = atomic_read(&sdev_to_zfcp(sdev)->status);
460 switch (r->id) { 450 rec->lun = zfcp_scsi_dev_lun(sdev);
461 case ZFCP_REC_DBF_ID_THREAD:
462 zfcp_dbf_out(&p, "total", "%d", r->u.thread.total);
463 zfcp_dbf_out(&p, "ready", "%d", r->u.thread.ready);
464 zfcp_dbf_out(&p, "running", "%d", r->u.thread.running);
465 break;
466 case ZFCP_REC_DBF_ID_TARGET:
467 zfcp_dbf_out(&p, "reference", "0x%016Lx", r->u.target.ref);
468 zfcp_dbf_out(&p, "status", "0x%08x", r->u.target.status);
469 zfcp_dbf_out(&p, "erp_count", "%d", r->u.target.erp_count);
470 zfcp_dbf_out(&p, "d_id", "0x%06x", r->u.target.d_id);
471 zfcp_dbf_out(&p, "wwpn", "0x%016Lx", r->u.target.wwpn);
472 zfcp_dbf_out(&p, "fcp_lun", "0x%016Lx", r->u.target.fcp_lun);
473 break;
474 case ZFCP_REC_DBF_ID_TRIGGER:
475 zfcp_dbf_out(&p, "reference", "0x%016Lx", r->u.trigger.ref);
476 zfcp_dbf_out(&p, "erp_action", "0x%016Lx", r->u.trigger.action);
477 zfcp_dbf_out(&p, "requested", "%d", r->u.trigger.want);
478 zfcp_dbf_out(&p, "executed", "%d", r->u.trigger.need);
479 zfcp_dbf_out(&p, "wwpn", "0x%016Lx", r->u.trigger.wwpn);
480 zfcp_dbf_out(&p, "fcp_lun", "0x%016Lx", r->u.trigger.fcp_lun);
481 zfcp_dbf_out(&p, "adapter_status", "0x%08x", r->u.trigger.as);
482 zfcp_dbf_out(&p, "port_status", "0x%08x", r->u.trigger.ps);
483 zfcp_dbf_out(&p, "lun_status", "0x%08x", r->u.trigger.ls);
484 break;
485 case ZFCP_REC_DBF_ID_ACTION:
486 zfcp_dbf_out(&p, "erp_action", "0x%016Lx", r->u.action.action);
487 zfcp_dbf_out(&p, "fsf_req", "0x%016Lx", r->u.action.fsf_req);
488 zfcp_dbf_out(&p, "status", "0x%08Lx", r->u.action.status);
489 zfcp_dbf_out(&p, "step", "0x%08Lx", r->u.action.step);
490 break;
491 } 451 }
492 p += sprintf(p, "\n");
493 return p - buf;
494} 452}
495 453
496static struct debug_view zfcp_dbf_rec_view = {
497 .name = "structured",
498 .header_proc = zfcp_dbf_view_header,
499 .format_proc = zfcp_dbf_rec_view_format,
500};
501
502/** 454/**
503 * zfcp_dbf_rec_thread - trace event related to recovery thread operation 455 * zfcp_dbf_rec_trig - trace event related to triggered recovery
504 * @id2: identifier for event 456 * @tag: identifier for event
505 * @dbf: reference to dbf structure 457 * @adapter: adapter on which the erp_action should run
506 * This function assumes that the caller is holding erp_lock. 458 * @port: remote port involved in the erp_action
459 * @sdev: scsi device involved in the erp_action
460 * @want: wanted erp_action
461 * @need: required erp_action
462 *
463 * The adapter->erp_lock has to be held.
507 */ 464 */
508void zfcp_dbf_rec_thread(char *id2, struct zfcp_dbf *dbf) 465void zfcp_dbf_rec_trig(char *tag, struct zfcp_adapter *adapter,
466 struct zfcp_port *port, struct scsi_device *sdev,
467 u8 want, u8 need)
509{ 468{
510 struct zfcp_adapter *adapter = dbf->adapter; 469 struct zfcp_dbf *dbf = adapter->dbf;
511 struct zfcp_dbf_rec_record *r = &dbf->rec_buf; 470 struct zfcp_dbf_rec *rec = &dbf->rec_buf;
512 unsigned long flags = 0;
513 struct list_head *entry; 471 struct list_head *entry;
514 unsigned ready = 0, running = 0, total;
515
516 list_for_each(entry, &adapter->erp_ready_head)
517 ready++;
518 list_for_each(entry, &adapter->erp_running_head)
519 running++;
520 total = adapter->erp_total_count;
521
522 spin_lock_irqsave(&dbf->rec_lock, flags);
523 memset(r, 0, sizeof(*r));
524 r->id = ZFCP_REC_DBF_ID_THREAD;
525 memcpy(r->id2, id2, ZFCP_DBF_ID_SIZE);
526 r->u.thread.total = total;
527 r->u.thread.ready = ready;
528 r->u.thread.running = running;
529 debug_event(dbf->rec, 6, r, sizeof(*r));
530 spin_unlock_irqrestore(&dbf->rec_lock, flags);
531}
532
533/**
534 * zfcp_dbf_rec_thread - trace event related to recovery thread operation
535 * @id2: identifier for event
536 * @adapter: adapter
537 * This function assumes that the caller does not hold erp_lock.
538 */
539void zfcp_dbf_rec_thread_lock(char *id2, struct zfcp_dbf *dbf)
540{
541 struct zfcp_adapter *adapter = dbf->adapter;
542 unsigned long flags;
543
544 read_lock_irqsave(&adapter->erp_lock, flags);
545 zfcp_dbf_rec_thread(id2, dbf);
546 read_unlock_irqrestore(&adapter->erp_lock, flags);
547}
548
549static void zfcp_dbf_rec_target(char *id2, void *ref, struct zfcp_dbf *dbf,
550 atomic_t *status, atomic_t *erp_count, u64 wwpn,
551 u32 d_id, u64 fcp_lun)
552{
553 struct zfcp_dbf_rec_record *r = &dbf->rec_buf;
554 unsigned long flags; 472 unsigned long flags;
555 473
556 spin_lock_irqsave(&dbf->rec_lock, flags); 474 spin_lock_irqsave(&dbf->rec_lock, flags);
557 memset(r, 0, sizeof(*r)); 475 memset(rec, 0, sizeof(*rec));
558 r->id = ZFCP_REC_DBF_ID_TARGET;
559 memcpy(r->id2, id2, ZFCP_DBF_ID_SIZE);
560 r->u.target.ref = (unsigned long)ref;
561 r->u.target.status = atomic_read(status);
562 r->u.target.wwpn = wwpn;
563 r->u.target.d_id = d_id;
564 r->u.target.fcp_lun = fcp_lun;
565 r->u.target.erp_count = atomic_read(erp_count);
566 debug_event(dbf->rec, 3, r, sizeof(*r));
567 spin_unlock_irqrestore(&dbf->rec_lock, flags);
568}
569
570/**
571 * zfcp_dbf_rec_adapter - trace event for adapter state change
572 * @id: identifier for trigger of state change
573 * @ref: additional reference (e.g. request)
574 * @dbf: reference to dbf structure
575 */
576void zfcp_dbf_rec_adapter(char *id, void *ref, struct zfcp_dbf *dbf)
577{
578 struct zfcp_adapter *adapter = dbf->adapter;
579 476
580 zfcp_dbf_rec_target(id, ref, dbf, &adapter->status, 477 rec->id = ZFCP_DBF_REC_TRIG;
581 &adapter->erp_counter, 0, 0, 478 memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
582 ZFCP_DBF_INVALID_LUN); 479 zfcp_dbf_set_common(rec, adapter, port, sdev);
583}
584 480
585/** 481 list_for_each(entry, &adapter->erp_ready_head)
586 * zfcp_dbf_rec_port - trace event for port state change 482 rec->u.trig.ready++;
587 * @id: identifier for trigger of state change
588 * @ref: additional reference (e.g. request)
589 * @port: port
590 */
591void zfcp_dbf_rec_port(char *id, void *ref, struct zfcp_port *port)
592{
593 struct zfcp_dbf *dbf = port->adapter->dbf;
594 483
595 zfcp_dbf_rec_target(id, ref, dbf, &port->status, 484 list_for_each(entry, &adapter->erp_running_head)
596 &port->erp_counter, port->wwpn, port->d_id, 485 rec->u.trig.running++;
597 ZFCP_DBF_INVALID_LUN);
598}
599 486
600/** 487 rec->u.trig.want = want;
601 * zfcp_dbf_rec_lun - trace event for LUN state change 488 rec->u.trig.need = need;
602 * @id: identifier for trigger of state change
603 * @ref: additional reference (e.g. request)
604 * @sdev: SCSI device
605 */
606void zfcp_dbf_rec_lun(char *id, void *ref, struct scsi_device *sdev)
607{
608 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
609 struct zfcp_port *port = zfcp_sdev->port;
610 struct zfcp_dbf *dbf = port->adapter->dbf;
611 489
612 zfcp_dbf_rec_target(id, ref, dbf, &zfcp_sdev->status, 490 debug_event(dbf->rec, 1, rec, sizeof(*rec));
613 &zfcp_sdev->erp_counter, port->wwpn, port->d_id, 491 spin_unlock_irqrestore(&dbf->rec_lock, flags);
614 zfcp_scsi_dev_lun(sdev));
615} 492}
616 493
494
617/** 495/**
618 * zfcp_dbf_rec_trigger - trace event for triggered error recovery 496 * zfcp_dbf_rec_run - trace event related to running recovery
619 * @id2: identifier for error recovery trigger 497 * @tag: identifier for event
620 * @ref: additional reference (e.g. request) 498 * @erp: erp_action running
621 * @want: originally requested error recovery action
622 * @need: error recovery action actually initiated
623 * @action: address of error recovery action struct
624 * @adapter: adapter
625 * @port: port
626 * @sdev: SCSI device
627 */ 499 */
628void zfcp_dbf_rec_trigger(char *id2, void *ref, u8 want, u8 need, void *action, 500void zfcp_dbf_rec_run(char *tag, struct zfcp_erp_action *erp)
629 struct zfcp_adapter *adapter, struct zfcp_port *port,
630 struct scsi_device *sdev)
631{ 501{
632 struct zfcp_dbf *dbf = adapter->dbf; 502 struct zfcp_dbf *dbf = erp->adapter->dbf;
633 struct zfcp_dbf_rec_record *r = &dbf->rec_buf; 503 struct zfcp_dbf_rec *rec = &dbf->rec_buf;
634 unsigned long flags; 504 unsigned long flags;
635 505
636 spin_lock_irqsave(&dbf->rec_lock, flags); 506 spin_lock_irqsave(&dbf->rec_lock, flags);
637 memset(r, 0, sizeof(*r)); 507 memset(rec, 0, sizeof(*rec));
638 r->id = ZFCP_REC_DBF_ID_TRIGGER;
639 memcpy(r->id2, id2, ZFCP_DBF_ID_SIZE);
640 r->u.trigger.ref = (unsigned long)ref;
641 r->u.trigger.want = want;
642 r->u.trigger.need = need;
643 r->u.trigger.action = (unsigned long)action;
644 r->u.trigger.as = atomic_read(&adapter->status);
645 if (port) {
646 r->u.trigger.ps = atomic_read(&port->status);
647 r->u.trigger.wwpn = port->wwpn;
648 }
649 if (sdev)
650 r->u.trigger.ls = atomic_read(&sdev_to_zfcp(sdev)->status);
651 r->u.trigger.fcp_lun = sdev ? zfcp_scsi_dev_lun(sdev) :
652 ZFCP_DBF_INVALID_LUN;
653 debug_event(dbf->rec, action ? 1 : 4, r, sizeof(*r));
654 spin_unlock_irqrestore(&dbf->rec_lock, flags);
655}
656 508
657/** 509 rec->id = ZFCP_DBF_REC_RUN;
658 * zfcp_dbf_rec_action - trace event showing progress of recovery action 510 memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
659 * @id2: identifier 511 zfcp_dbf_set_common(rec, erp->adapter, erp->port, erp->sdev);
660 * @erp_action: error recovery action struct pointer
661 */
662void zfcp_dbf_rec_action(char *id2, struct zfcp_erp_action *erp_action)
663{
664 struct zfcp_dbf *dbf = erp_action->adapter->dbf;
665 struct zfcp_dbf_rec_record *r = &dbf->rec_buf;
666 unsigned long flags;
667 512
668 spin_lock_irqsave(&dbf->rec_lock, flags); 513 rec->u.run.fsf_req_id = erp->fsf_req_id;
669 memset(r, 0, sizeof(*r)); 514 rec->u.run.rec_status = erp->status;
670 r->id = ZFCP_REC_DBF_ID_ACTION; 515 rec->u.run.rec_step = erp->step;
671 memcpy(r->id2, id2, ZFCP_DBF_ID_SIZE); 516 rec->u.run.rec_action = erp->action;
672 r->u.action.action = (unsigned long)erp_action; 517
673 r->u.action.status = erp_action->status; 518 if (erp->sdev)
674 r->u.action.step = erp_action->step; 519 rec->u.run.rec_count =
675 r->u.action.fsf_req = erp_action->fsf_req_id; 520 atomic_read(&sdev_to_zfcp(erp->sdev)->erp_counter);
676 debug_event(dbf->rec, 5, r, sizeof(*r)); 521 else if (erp->port)
522 rec->u.run.rec_count = atomic_read(&erp->port->erp_counter);
523 else
524 rec->u.run.rec_count = atomic_read(&erp->adapter->erp_counter);
525
526 debug_event(dbf->rec, 1, rec, sizeof(*rec));
677 spin_unlock_irqrestore(&dbf->rec_lock, flags); 527 spin_unlock_irqrestore(&dbf->rec_lock, flags);
678} 528}
679 529
@@ -1019,8 +869,7 @@ int zfcp_dbf_adapter_register(struct zfcp_adapter *adapter)
1019 869
1020 /* debug feature area which records recovery activity */ 870 /* debug feature area which records recovery activity */
1021 sprintf(dbf_name, "zfcp_%s_rec", dev_name(&adapter->ccw_device->dev)); 871 sprintf(dbf_name, "zfcp_%s_rec", dev_name(&adapter->ccw_device->dev));
1022 dbf->rec = zfcp_dbf_reg(dbf_name, 3, &zfcp_dbf_rec_view, 872 dbf->rec = zfcp_dbf_reg(dbf_name, 3, NULL, sizeof(struct zfcp_dbf_rec));
1023 sizeof(struct zfcp_dbf_rec_record));
1024 if (!dbf->rec) 873 if (!dbf->rec)
1025 goto err_out; 874 goto err_out;
1026 875
diff --git a/drivers/s390/scsi/zfcp_dbf.h b/drivers/s390/scsi/zfcp_dbf.h
index 04081b1b62b4..2e823d4ede6e 100644
--- a/drivers/s390/scsi/zfcp_dbf.h
+++ b/drivers/s390/scsi/zfcp_dbf.h
@@ -27,6 +27,7 @@
27#include "zfcp_fsf.h" 27#include "zfcp_fsf.h"
28#include "zfcp_def.h" 28#include "zfcp_def.h"
29 29
30#define ZFCP_DBF_TAG_LEN 7
30#define ZFCP_DBF_TAG_SIZE 4 31#define ZFCP_DBF_TAG_SIZE 4
31#define ZFCP_DBF_ID_SIZE 7 32#define ZFCP_DBF_ID_SIZE 7
32 33
@@ -40,57 +41,72 @@ struct zfcp_dbf_dump {
40 u8 data[]; /* dump data */ 41 u8 data[]; /* dump data */
41} __attribute__ ((packed)); 42} __attribute__ ((packed));
42 43
43struct zfcp_dbf_rec_record_thread { 44/**
44 u32 total; 45 * struct zfcp_dbf_rec_trigger - trace record for triggered recovery action
46 * @ready: number of ready recovery actions
47 * @running: number of running recovery actions
48 * @want: wanted recovery action
49 * @need: needed recovery action
50 */
51struct zfcp_dbf_rec_trigger {
45 u32 ready; 52 u32 ready;
46 u32 running; 53 u32 running;
47};
48
49struct zfcp_dbf_rec_record_target {
50 u64 ref;
51 u32 status;
52 u32 d_id;
53 u64 wwpn;
54 u64 fcp_lun;
55 u32 erp_count;
56};
57
58struct zfcp_dbf_rec_record_trigger {
59 u8 want; 54 u8 want;
60 u8 need; 55 u8 need;
61 u32 as; 56} __packed;
62 u32 ps; 57
63 u32 ls; 58/**
64 u64 ref; 59 * struct zfcp_dbf_rec_running - trace record for running recovery
65 u64 action; 60 * @fsf_req_id: request id for fsf requests
66 u64 wwpn; 61 * @rec_status: status of the fsf request
67 u64 fcp_lun; 62 * @rec_step: current step of the recovery action
68}; 63 * rec_count: recovery counter
64 */
65struct zfcp_dbf_rec_running {
66 u64 fsf_req_id;
67 u32 rec_status;
68 u16 rec_step;
69 u8 rec_action;
70 u8 rec_count;
71} __packed;
69 72
70struct zfcp_dbf_rec_record_action { 73/**
71 u32 status; 74 * enum zfcp_dbf_rec_id - recovery trace record id
72 u32 step; 75 * @ZFCP_DBF_REC_TRIG: triggered recovery identifier
73 u64 action; 76 * @ZFCP_DBF_REC_RUN: running recovery identifier
74 u64 fsf_req; 77 */
78enum zfcp_dbf_rec_id {
79 ZFCP_DBF_REC_TRIG = 1,
80 ZFCP_DBF_REC_RUN = 2,
75}; 81};
76 82
77struct zfcp_dbf_rec_record { 83/**
84 * struct zfcp_dbf_rec - trace record for error recovery actions
85 * @id: unique number of recovery record type
86 * @tag: identifier string specifying the location of initiation
87 * @lun: logical unit number
88 * @wwpn: word wide port number
89 * @d_id: destination ID
90 * @adapter_status: current status of the adapter
91 * @port_status: current status of the port
92 * @lun_status: current status of the lun
93 * @u.trig: structure zfcp_dbf_rec_trigger
94 * @u.run: structure zfcp_dbf_rec_running
95 */
96struct zfcp_dbf_rec {
78 u8 id; 97 u8 id;
79 char id2[7]; 98 char tag[ZFCP_DBF_TAG_LEN];
99 u64 lun;
100 u64 wwpn;
101 u32 d_id;
102 u32 adapter_status;
103 u32 port_status;
104 u32 lun_status;
80 union { 105 union {
81 struct zfcp_dbf_rec_record_action action; 106 struct zfcp_dbf_rec_trigger trig;
82 struct zfcp_dbf_rec_record_thread thread; 107 struct zfcp_dbf_rec_running run;
83 struct zfcp_dbf_rec_record_target target;
84 struct zfcp_dbf_rec_record_trigger trigger;
85 } u; 108 } u;
86}; 109} __packed;
87
88enum {
89 ZFCP_REC_DBF_ID_ACTION,
90 ZFCP_REC_DBF_ID_THREAD,
91 ZFCP_REC_DBF_ID_TARGET,
92 ZFCP_REC_DBF_ID_TRIGGER,
93};
94 110
95struct zfcp_dbf_hba_record_response { 111struct zfcp_dbf_hba_record_response {
96 u32 fsf_command; 112 u32 fsf_command;
@@ -232,7 +248,7 @@ struct zfcp_dbf {
232 spinlock_t hba_lock; 248 spinlock_t hba_lock;
233 spinlock_t san_lock; 249 spinlock_t san_lock;
234 spinlock_t scsi_lock; 250 spinlock_t scsi_lock;
235 struct zfcp_dbf_rec_record rec_buf; 251 struct zfcp_dbf_rec rec_buf;
236 struct zfcp_dbf_hba_record hba_buf; 252 struct zfcp_dbf_hba_record hba_buf;
237 struct zfcp_dbf_san_record san_buf; 253 struct zfcp_dbf_san_record san_buf;
238 struct zfcp_dbf_scsi_record scsi_buf; 254 struct zfcp_dbf_scsi_record scsi_buf;
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c
index 0bcd5806bd9a..62b1b4a03ee3 100644
--- a/drivers/s390/scsi/zfcp_erp.c
+++ b/drivers/s390/scsi/zfcp_erp.c
@@ -76,9 +76,9 @@ static void zfcp_erp_action_ready(struct zfcp_erp_action *act)
76 struct zfcp_adapter *adapter = act->adapter; 76 struct zfcp_adapter *adapter = act->adapter;
77 77
78 list_move(&act->list, &act->adapter->erp_ready_head); 78 list_move(&act->list, &act->adapter->erp_ready_head);
79 zfcp_dbf_rec_action("erardy1", act); 79 zfcp_dbf_rec_run("erardy1", act);
80 wake_up(&adapter->erp_ready_wq); 80 wake_up(&adapter->erp_ready_wq);
81 zfcp_dbf_rec_thread("erardy2", adapter->dbf); 81 zfcp_dbf_rec_run("erardy2", act);
82} 82}
83 83
84static void zfcp_erp_action_dismiss(struct zfcp_erp_action *act) 84static void zfcp_erp_action_dismiss(struct zfcp_erp_action *act)
@@ -239,7 +239,7 @@ static int zfcp_erp_action_enqueue(int want, struct zfcp_adapter *adapter,
239 char *id, void *ref, u32 act_status) 239 char *id, void *ref, u32 act_status)
240{ 240{
241 int retval = 1, need; 241 int retval = 1, need;
242 struct zfcp_erp_action *act = NULL; 242 struct zfcp_erp_action *act;
243 243
244 if (!adapter->erp_thread) 244 if (!adapter->erp_thread)
245 return -EIO; 245 return -EIO;
@@ -255,10 +255,9 @@ static int zfcp_erp_action_enqueue(int want, struct zfcp_adapter *adapter,
255 ++adapter->erp_total_count; 255 ++adapter->erp_total_count;
256 list_add_tail(&act->list, &adapter->erp_ready_head); 256 list_add_tail(&act->list, &adapter->erp_ready_head);
257 wake_up(&adapter->erp_ready_wq); 257 wake_up(&adapter->erp_ready_wq);
258 zfcp_dbf_rec_thread("eracte1", adapter->dbf);
259 retval = 0; 258 retval = 0;
260 out: 259 out:
261 zfcp_dbf_rec_trigger(id, ref, want, need, act, adapter, port, sdev); 260 zfcp_dbf_rec_trig(id, adapter, port, sdev, want, need);
262 return retval; 261 return retval;
263} 262}
264 263
@@ -490,14 +489,14 @@ static int status_change_set(unsigned long mask, atomic_t *status)
490static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter) 489static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter)
491{ 490{
492 if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status)) 491 if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status))
493 zfcp_dbf_rec_adapter("eraubl1", NULL, adapter->dbf); 492 zfcp_dbf_rec_run("eraubl1", &adapter->erp_action);
494 atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status); 493 atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status);
495} 494}
496 495
497static void zfcp_erp_port_unblock(struct zfcp_port *port) 496static void zfcp_erp_port_unblock(struct zfcp_port *port)
498{ 497{
499 if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status)) 498 if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status))
500 zfcp_dbf_rec_port("erpubl1", NULL, port); 499 zfcp_dbf_rec_run("erpubl1", &port->erp_action);
501 atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status); 500 atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status);
502} 501}
503 502
@@ -506,14 +505,14 @@ static void zfcp_erp_lun_unblock(struct scsi_device *sdev)
506 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); 505 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
507 506
508 if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &zfcp_sdev->status)) 507 if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &zfcp_sdev->status))
509 zfcp_dbf_rec_lun("erlubl1", NULL, sdev); 508 zfcp_dbf_rec_run("erlubl1", &sdev_to_zfcp(sdev)->erp_action);
510 atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &zfcp_sdev->status); 509 atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &zfcp_sdev->status);
511} 510}
512 511
513static void zfcp_erp_action_to_running(struct zfcp_erp_action *erp_action) 512static void zfcp_erp_action_to_running(struct zfcp_erp_action *erp_action)
514{ 513{
515 list_move(&erp_action->list, &erp_action->adapter->erp_running_head); 514 list_move(&erp_action->list, &erp_action->adapter->erp_running_head);
516 zfcp_dbf_rec_action("erator1", erp_action); 515 zfcp_dbf_rec_run("erator1", erp_action);
517} 516}
518 517
519static void zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *act) 518static void zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *act)
@@ -530,11 +529,11 @@ static void zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *act)
530 if (act->status & (ZFCP_STATUS_ERP_DISMISSED | 529 if (act->status & (ZFCP_STATUS_ERP_DISMISSED |
531 ZFCP_STATUS_ERP_TIMEDOUT)) { 530 ZFCP_STATUS_ERP_TIMEDOUT)) {
532 req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; 531 req->status |= ZFCP_STATUS_FSFREQ_DISMISSED;
533 zfcp_dbf_rec_action("erscf_1", act); 532 zfcp_dbf_rec_run("erscf_1", act);
534 req->erp_action = NULL; 533 req->erp_action = NULL;
535 } 534 }
536 if (act->status & ZFCP_STATUS_ERP_TIMEDOUT) 535 if (act->status & ZFCP_STATUS_ERP_TIMEDOUT)
537 zfcp_dbf_rec_action("erscf_2", act); 536 zfcp_dbf_rec_run("erscf_2", act);
538 if (req->status & ZFCP_STATUS_FSFREQ_DISMISSED) 537 if (req->status & ZFCP_STATUS_FSFREQ_DISMISSED)
539 act->fsf_req_id = 0; 538 act->fsf_req_id = 0;
540 } else 539 } else
@@ -693,10 +692,8 @@ static int zfcp_erp_adapter_strat_fsf_xconf(struct zfcp_erp_action *erp_action)
693 return ZFCP_ERP_FAILED; 692 return ZFCP_ERP_FAILED;
694 } 693 }
695 694
696 zfcp_dbf_rec_thread_lock("erasfx1", adapter->dbf);
697 wait_event(adapter->erp_ready_wq, 695 wait_event(adapter->erp_ready_wq,
698 !list_empty(&adapter->erp_ready_head)); 696 !list_empty(&adapter->erp_ready_head));
699 zfcp_dbf_rec_thread_lock("erasfx2", adapter->dbf);
700 if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) 697 if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT)
701 break; 698 break;
702 699
@@ -735,10 +732,10 @@ static int zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *act)
735 if (ret) 732 if (ret)
736 return ZFCP_ERP_FAILED; 733 return ZFCP_ERP_FAILED;
737 734
738 zfcp_dbf_rec_thread_lock("erasox1", adapter->dbf); 735 zfcp_dbf_rec_run("erasox1", act);
739 wait_event(adapter->erp_ready_wq, 736 wait_event(adapter->erp_ready_wq,
740 !list_empty(&adapter->erp_ready_head)); 737 !list_empty(&adapter->erp_ready_head));
741 zfcp_dbf_rec_thread_lock("erasox2", adapter->dbf); 738 zfcp_dbf_rec_run("erasox2", act);
742 if (act->status & ZFCP_STATUS_ERP_TIMEDOUT) 739 if (act->status & ZFCP_STATUS_ERP_TIMEDOUT)
743 return ZFCP_ERP_FAILED; 740 return ZFCP_ERP_FAILED;
744 741
@@ -1206,7 +1203,7 @@ static void zfcp_erp_action_dequeue(struct zfcp_erp_action *erp_action)
1206 } 1203 }
1207 1204
1208 list_del(&erp_action->list); 1205 list_del(&erp_action->list);
1209 zfcp_dbf_rec_action("eractd1", erp_action); 1206 zfcp_dbf_rec_run("eractd1", erp_action);
1210 1207
1211 switch (erp_action->action) { 1208 switch (erp_action->action) {
1212 case ZFCP_ERP_ACTION_REOPEN_LUN: 1209 case ZFCP_ERP_ACTION_REOPEN_LUN:
@@ -1357,11 +1354,9 @@ static int zfcp_erp_thread(void *data)
1357 unsigned long flags; 1354 unsigned long flags;
1358 1355
1359 for (;;) { 1356 for (;;) {
1360 zfcp_dbf_rec_thread_lock("erthrd1", adapter->dbf);
1361 wait_event_interruptible(adapter->erp_ready_wq, 1357 wait_event_interruptible(adapter->erp_ready_wq,
1362 !list_empty(&adapter->erp_ready_head) || 1358 !list_empty(&adapter->erp_ready_head) ||
1363 kthread_should_stop()); 1359 kthread_should_stop());
1364 zfcp_dbf_rec_thread_lock("erthrd2", adapter->dbf);
1365 1360
1366 if (kthread_should_stop()) 1361 if (kthread_should_stop())
1367 break; 1362 break;
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h
index bf8f3e514839..2d6ee75dfe34 100644
--- a/drivers/s390/scsi/zfcp_ext.h
+++ b/drivers/s390/scsi/zfcp_ext.h
@@ -46,15 +46,9 @@ extern void zfcp_cfdc_adapter_access_changed(struct zfcp_adapter *);
46/* zfcp_dbf.c */ 46/* zfcp_dbf.c */
47extern int zfcp_dbf_adapter_register(struct zfcp_adapter *); 47extern int zfcp_dbf_adapter_register(struct zfcp_adapter *);
48extern void zfcp_dbf_adapter_unregister(struct zfcp_dbf *); 48extern void zfcp_dbf_adapter_unregister(struct zfcp_dbf *);
49extern void zfcp_dbf_rec_thread(char *, struct zfcp_dbf *); 49extern void zfcp_dbf_rec_trig(char *, struct zfcp_adapter *,
50extern void zfcp_dbf_rec_thread_lock(char *, struct zfcp_dbf *); 50 struct zfcp_port *, struct scsi_device *, u8, u8);
51extern void zfcp_dbf_rec_adapter(char *, void *, struct zfcp_dbf *); 51extern void zfcp_dbf_rec_run(char *, struct zfcp_erp_action *);
52extern void zfcp_dbf_rec_port(char *, void *, struct zfcp_port *);
53extern void zfcp_dbf_rec_lun(char *, void *, struct scsi_device *);
54extern void zfcp_dbf_rec_trigger(char *, void *, u8, u8, void *,
55 struct zfcp_adapter *, struct zfcp_port *,
56 struct scsi_device *);
57extern void zfcp_dbf_rec_action(char *, struct zfcp_erp_action *);
58extern void _zfcp_dbf_hba_fsf_response(const char *, int, struct zfcp_fsf_req *, 52extern void _zfcp_dbf_hba_fsf_response(const char *, int, struct zfcp_fsf_req *,
59 struct zfcp_dbf *); 53 struct zfcp_dbf *);
60extern void _zfcp_dbf_hba_fsf_unsol(const char *, int level, struct zfcp_dbf *, 54extern void _zfcp_dbf_hba_fsf_unsol(const char *, int level, struct zfcp_dbf *,