if (!try_module_get(iscsit->owner))
                goto cls_session_fail;
 
-       cls_session = iscsi_create_session(shost, iscsit);
+       cls_session = iscsi_create_session(shost, iscsit, 0);
        if (!cls_session)
                goto module_put;
        *(unsigned long*)shost->hostdata = (unsigned long)cls_session;
 
        INIT_LIST_HEAD(&session->host_list);
        INIT_LIST_HEAD(&session->sess_list);
 
+       /* this is released in the dev's release function */
+       scsi_host_get(shost);
        session->dev.parent = &shost->shost_gendev;
        session->dev.release = iscsi_session_release;
        device_initialize(&session->dev);
 }
 EXPORT_SYMBOL_GPL(iscsi_alloc_session);
 
-int iscsi_add_session(struct iscsi_cls_session *session)
+int iscsi_add_session(struct iscsi_cls_session *session, unsigned int target_id)
 {
        struct Scsi_Host *shost = iscsi_session_to_shost(session);
        struct iscsi_host *ihost;
        int err;
 
-       /* this is released in the dev's release function */
-       scsi_host_get(shost);
        ihost = shost->shost_data;
-
        session->sid = iscsi_session_nr++;
-       session->target_id = ihost->next_target_id++;
+       session->target_id = target_id;
 
        snprintf(session->dev.bus_id, BUS_ID_SIZE, "session%u",
                 session->sid);
  **/
 struct iscsi_cls_session *
 iscsi_create_session(struct Scsi_Host *shost,
-                    struct iscsi_transport *transport)
+                    struct iscsi_transport *transport,
+                    unsigned int target_id)
 {
        struct iscsi_cls_session *session;
 
        if (!session)
                return NULL;
 
-       if (iscsi_add_session(session)) {
+       if (iscsi_add_session(session, target_id)) {
                iscsi_free_session(session);
                return NULL;
        }
 
        iscsi_dev_to_session(_stgt->dev.parent)
 
 struct iscsi_host {
-       int next_target_id;
        struct list_head sessions;
        struct mutex mutex;
 };
  */
 extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost,
                                        struct iscsi_transport *transport);
-extern int iscsi_add_session(struct iscsi_cls_session *session);
+extern int iscsi_add_session(struct iscsi_cls_session *session,
+                            unsigned int target_id);
 extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost,
-                                               struct iscsi_transport *t);
+                                               struct iscsi_transport *t,
+                                               unsigned int target_id);
 extern void iscsi_remove_session(struct iscsi_cls_session *session);
 extern void iscsi_free_session(struct iscsi_cls_session *session);
 extern int iscsi_destroy_session(struct iscsi_cls_session *session);