Skip to content

Commit

Permalink
libiscsi: add conn and scsi eh log debug flags
Browse files Browse the repository at this point in the history
Allow the user to control the debug logs in libiscsi. We will now
have a module param for connection, session & error handling.

[Mike Christie - Fixed up to compile on current code and added
missing ISCSI_DBG_EH conversions]

Signed-off-by: Erez Zilber <erezzi.list@gmail.com>
Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
  • Loading branch information
Erez Zilber authored and James Bottomley committed Jun 21, 2009
1 parent 3238249 commit bd2199d
Showing 1 changed file with 65 additions and 44 deletions.
109 changes: 65 additions & 44 deletions drivers/scsi/libiscsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,23 +38,46 @@
#include <scsi/scsi_transport_iscsi.h>
#include <scsi/libiscsi.h>

static int iscsi_dbg_lib;
module_param_named(debug_libiscsi, iscsi_dbg_lib, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug_libiscsi, "Turn on debugging for libiscsi module. "
"Set to 1 to turn on, and zero to turn off. Default "
"is off.");
static int iscsi_dbg_lib_conn;
module_param_named(debug_libiscsi_conn, iscsi_dbg_lib_conn, int,
S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug_libiscsi_conn,
"Turn on debugging for connections in libiscsi module. "
"Set to 1 to turn on, and zero to turn off. Default is off.");

static int iscsi_dbg_lib_session;
module_param_named(debug_libiscsi_session, iscsi_dbg_lib_session, int,
S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug_libiscsi_session,
"Turn on debugging for sessions in libiscsi module. "
"Set to 1 to turn on, and zero to turn off. Default is off.");

static int iscsi_dbg_lib_eh;
module_param_named(debug_libiscsi_eh, iscsi_dbg_lib_eh, int,
S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug_libiscsi_eh,
"Turn on debugging for error handling in libiscsi module. "
"Set to 1 to turn on, and zero to turn off. Default is off.");

#define ISCSI_DBG_CONN(_conn, dbg_fmt, arg...) \
do { \
if (iscsi_dbg_lib) \
if (iscsi_dbg_lib_conn) \
iscsi_conn_printk(KERN_INFO, _conn, \
"%s " dbg_fmt, \
__func__, ##arg); \
} while (0);

#define ISCSI_DBG_SESSION(_session, dbg_fmt, arg...) \
do { \
if (iscsi_dbg_lib) \
if (iscsi_dbg_lib_session) \
iscsi_session_printk(KERN_INFO, _session, \
"%s " dbg_fmt, \
__func__, ##arg); \
} while (0);

#define ISCSI_DBG_EH(_session, dbg_fmt, arg...) \
do { \
if (iscsi_dbg_lib_eh) \
iscsi_session_printk(KERN_INFO, _session, \
"%s " dbg_fmt, \
__func__, ##arg); \
Expand Down Expand Up @@ -1561,10 +1584,10 @@ int iscsi_eh_target_reset(struct scsi_cmnd *sc)
spin_lock_bh(&session->lock);
if (session->state == ISCSI_STATE_TERMINATE) {
failed:
iscsi_session_printk(KERN_INFO, session,
"failing target reset: Could not log "
"back into target [age %d]\n",
session->age);
ISCSI_DBG_EH(session,
"failing target reset: Could not log back into "
"target [age %d]\n",
session->age);
spin_unlock_bh(&session->lock);
mutex_unlock(&session->eh_mutex);
return FAILED;
Expand All @@ -1578,7 +1601,7 @@ int iscsi_eh_target_reset(struct scsi_cmnd *sc)
*/
iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);

ISCSI_DBG_SESSION(session, "wait for relogin\n");
ISCSI_DBG_EH(session, "wait for relogin\n");
wait_event_interruptible(conn->ehwait,
session->state == ISCSI_STATE_TERMINATE ||
session->state == ISCSI_STATE_LOGGED_IN ||
Expand All @@ -1588,10 +1611,10 @@ int iscsi_eh_target_reset(struct scsi_cmnd *sc)

mutex_lock(&session->eh_mutex);
spin_lock_bh(&session->lock);
if (session->state == ISCSI_STATE_LOGGED_IN)
iscsi_session_printk(KERN_INFO, session,
"target reset succeeded\n");
else
if (session->state == ISCSI_STATE_LOGGED_IN) {
ISCSI_DBG_EH(session,
"target reset succeeded\n");
} else
goto failed;
spin_unlock_bh(&session->lock);
mutex_unlock(&session->eh_mutex);
Expand All @@ -1607,7 +1630,7 @@ static void iscsi_tmf_timedout(unsigned long data)
spin_lock(&session->lock);
if (conn->tmf_state == TMF_QUEUED) {
conn->tmf_state = TMF_TIMEDOUT;
ISCSI_DBG_SESSION(session, "tmf timedout\n");
ISCSI_DBG_EH(session, "tmf timedout\n");
/* unblock eh_abort() */
wake_up(&conn->ehwait);
}
Expand All @@ -1627,15 +1650,15 @@ static int iscsi_exec_task_mgmt_fn(struct iscsi_conn *conn,
spin_unlock_bh(&session->lock);
iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
spin_lock_bh(&session->lock);
ISCSI_DBG_SESSION(session, "tmf exec failure\n");
ISCSI_DBG_EH(session, "tmf exec failure\n");
return -EPERM;
}
conn->tmfcmd_pdus_cnt++;
conn->tmf_timer.expires = timeout * HZ + jiffies;
conn->tmf_timer.function = iscsi_tmf_timedout;
conn->tmf_timer.data = (unsigned long)conn;
add_timer(&conn->tmf_timer);
ISCSI_DBG_SESSION(session, "tmf set timeout\n");
ISCSI_DBG_EH(session, "tmf set timeout\n");

spin_unlock_bh(&session->lock);
mutex_unlock(&session->eh_mutex);
Expand Down Expand Up @@ -1733,7 +1756,7 @@ static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
cls_session = starget_to_session(scsi_target(sc->device));
session = cls_session->dd_data;

ISCSI_DBG_SESSION(session, "scsi cmd %p timedout\n", sc);
ISCSI_DBG_EH(session, "scsi cmd %p timedout\n", sc);

spin_lock(&session->lock);
if (session->state != ISCSI_STATE_LOGGED_IN) {
Expand Down Expand Up @@ -1763,10 +1786,10 @@ static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
* nop as a ping.
*/
if (time_after_eq(task->last_xfer, task->last_timeout)) {
ISCSI_DBG_CONN(conn, "Command making progress. Asking "
"scsi-ml for more time to complete. "
"Last data recv at %lu. Last timeout was at "
"%lu\n.", task->last_xfer, task->last_timeout);
ISCSI_DBG_EH(session, "Command making progress. Asking "
"scsi-ml for more time to complete. "
"Last data recv at %lu. Last timeout was at "
"%lu\n.", task->last_xfer, task->last_timeout);
task->have_checked_conn = false;
rc = BLK_EH_RESET_TIMER;
goto done;
Expand Down Expand Up @@ -1806,8 +1829,8 @@ static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
if (task)
task->last_timeout = jiffies;
spin_unlock(&session->lock);
ISCSI_DBG_SESSION(session, "return %s\n", rc == BLK_EH_RESET_TIMER ?
"timer reset" : "nh");
ISCSI_DBG_EH(session, "return %s\n", rc == BLK_EH_RESET_TIMER ?
"timer reset" : "nh");
return rc;
}

Expand Down Expand Up @@ -1877,7 +1900,7 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
cls_session = starget_to_session(scsi_target(sc->device));
session = cls_session->dd_data;

ISCSI_DBG_SESSION(session, "aborting sc %p\n", sc);
ISCSI_DBG_EH(session, "aborting sc %p\n", sc);

mutex_lock(&session->eh_mutex);
spin_lock_bh(&session->lock);
Expand All @@ -1886,8 +1909,8 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
* got the command.
*/
if (!sc->SCp.ptr) {
ISCSI_DBG_SESSION(session, "sc never reached iscsi layer or "
"it completed.\n");
ISCSI_DBG_EH(session, "sc never reached iscsi layer or "
"it completed.\n");
spin_unlock_bh(&session->lock);
mutex_unlock(&session->eh_mutex);
return SUCCESS;
Expand All @@ -1901,7 +1924,7 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
sc->SCp.phase != session->age) {
spin_unlock_bh(&session->lock);
mutex_unlock(&session->eh_mutex);
ISCSI_DBG_SESSION(session, "failing abort due to dropped "
ISCSI_DBG_EH(session, "failing abort due to dropped "
"session.\n");
return FAILED;
}
Expand All @@ -1911,13 +1934,12 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
age = session->age;

task = (struct iscsi_task *)sc->SCp.ptr;
ISCSI_DBG_SESSION(session, "aborting [sc %p itt 0x%x]\n",
sc, task->itt);
ISCSI_DBG_EH(session, "aborting [sc %p itt 0x%x]\n",
sc, task->itt);

/* task completed before time out */
if (!task->sc) {
ISCSI_DBG_SESSION(session, "sc completed while abort in "
"progress\n");
ISCSI_DBG_EH(session, "sc completed while abort in progress\n");
goto success;
}

Expand Down Expand Up @@ -1966,8 +1988,8 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
if (!sc->SCp.ptr) {
conn->tmf_state = TMF_INITIAL;
/* task completed before tmf abort response */
ISCSI_DBG_SESSION(session, "sc completed while abort "
"in progress\n");
ISCSI_DBG_EH(session, "sc completed while abort in "
"progress\n");
goto success;
}
/* fall through */
Expand All @@ -1979,16 +2001,16 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
success:
spin_unlock_bh(&session->lock);
success_unlocked:
ISCSI_DBG_SESSION(session, "abort success [sc %p itt 0x%x]\n",
sc, task->itt);
ISCSI_DBG_EH(session, "abort success [sc %p itt 0x%x]\n",
sc, task->itt);
mutex_unlock(&session->eh_mutex);
return SUCCESS;

failed:
spin_unlock_bh(&session->lock);
failed_unlocked:
ISCSI_DBG_SESSION(session, "abort failed [sc %p itt 0x%x]\n", sc,
task ? task->itt : 0);
ISCSI_DBG_EH(session, "abort failed [sc %p itt 0x%x]\n", sc,
task ? task->itt : 0);
mutex_unlock(&session->eh_mutex);
return FAILED;
}
Expand All @@ -2015,8 +2037,7 @@ int iscsi_eh_device_reset(struct scsi_cmnd *sc)
cls_session = starget_to_session(scsi_target(sc->device));
session = cls_session->dd_data;

ISCSI_DBG_SESSION(session, "LU Reset [sc %p lun %u]\n",
sc, sc->device->lun);
ISCSI_DBG_EH(session, "LU Reset [sc %p lun %u]\n", sc, sc->device->lun);

mutex_lock(&session->eh_mutex);
spin_lock_bh(&session->lock);
Expand Down Expand Up @@ -2070,8 +2091,8 @@ int iscsi_eh_device_reset(struct scsi_cmnd *sc)
unlock:
spin_unlock_bh(&session->lock);
done:
ISCSI_DBG_SESSION(session, "dev reset result = %s\n",
rc == SUCCESS ? "SUCCESS" : "FAILED");
ISCSI_DBG_EH(session, "dev reset result = %s\n",
rc == SUCCESS ? "SUCCESS" : "FAILED");
mutex_unlock(&session->eh_mutex);
return rc;
}
Expand Down

0 comments on commit bd2199d

Please sign in to comment.