Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[linux-2.6-block.git] / drivers / scsi / qla2xxx / qla_dfs.c
index cd8b96a4b0dd6161759928c0782dee1b8f65d0de..34272fde8a5b0d8def9be94adcdce045f16e9540 100644 (file)
 static struct dentry *qla2x00_dfs_root;
 static atomic_t qla2x00_dfs_root_count;
 
+static int
+qla2x00_dfs_tgt_sess_show(struct seq_file *s, void *unused)
+{
+       scsi_qla_host_t *vha = s->private;
+       struct qla_hw_data *ha = vha->hw;
+       unsigned long flags;
+       struct qla_tgt_sess *sess = NULL;
+       struct qla_tgt *tgt= vha->vha_tgt.qla_tgt;
+
+       seq_printf(s, "%s\n",vha->host_str);
+       if (tgt) {
+               seq_printf(s, "Port ID   Port Name                Handle\n");
+
+               spin_lock_irqsave(&ha->tgt.sess_lock, flags);
+               list_for_each_entry(sess, &tgt->sess_list, sess_list_entry) {
+                       seq_printf(s, "%02x:%02x:%02x  %8phC  %d\n",
+                                          sess->s_id.b.domain,sess->s_id.b.area,
+                                          sess->s_id.b.al_pa,  sess->port_name,
+                                          sess->loop_id);
+               }
+               spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
+       }
+
+       return 0;
+}
+
+static int
+qla2x00_dfs_tgt_sess_open(struct inode *inode, struct file *file)
+{
+       scsi_qla_host_t *vha = inode->i_private;
+       return single_open(file, qla2x00_dfs_tgt_sess_show, vha);
+}
+
+
+static const struct file_operations dfs_tgt_sess_ops = {
+       .open           = qla2x00_dfs_tgt_sess_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
 static int
 qla_dfs_fw_resource_cnt_show(struct seq_file *s, void *unused)
 {
@@ -248,6 +289,15 @@ create_nodes:
                    "Unable to create debugfs fce node.\n");
                goto out;
        }
+
+       ha->tgt.dfs_tgt_sess = debugfs_create_file("tgt_sess",
+               S_IRUSR, ha->dfs_dir, vha, &dfs_tgt_sess_ops);
+       if (!ha->tgt.dfs_tgt_sess) {
+               ql_log(ql_log_warn, vha, 0xffff,
+                       "Unable to create debugFS tgt_sess node.\n");
+               goto out;
+       }
+
 out:
        return 0;
 }
@@ -257,6 +307,11 @@ qla2x00_dfs_remove(scsi_qla_host_t *vha)
 {
        struct qla_hw_data *ha = vha->hw;
 
+       if (ha->tgt.dfs_tgt_sess) {
+               debugfs_remove(ha->tgt.dfs_tgt_sess);
+               ha->tgt.dfs_tgt_sess = NULL;
+       }
+
        if (ha->dfs_fw_resource_cnt) {
                debugfs_remove(ha->dfs_fw_resource_cnt);
                ha->dfs_fw_resource_cnt = NULL;