Mike Christie wrote:
> Hey, I fixed this in the patches and put them in here:
> http://git.kernel.org/?p=linux/kernel/git/mnc/linux-2.6-iscsi.git;a=shortlog;h=refs/heads/iscsi
> Do you prefer that I send the entire patchset to the list? If so let me

I cloned the tree, built/booted with the iscsi branch, redirect works okay
with iser and the persistent/current portals are reported fine, cool, thanks,
this can go upstream, sure, I assume you'll send it to James and he either get
it to .38 or .39, makes sense? I'd like to be queued asap so we can push it 
further
to distros, etc.

> The relevant iser changes are:
> http://git.kernel.org/?p=linux/kernel/git/mnc/linux-2.6-iscsi.git;a=commit;h=00320bcd5467a6cbb2d55f7c1dbf85128bc072ea
> http://git.kernel.org/?p=linux/kernel/git/mnc/linux-2.6-iscsi.git;a=commit;h=9259584189c8b9731b210b05dfdafc0483ab9554

thanks, please just run spelling and add your signature to the change log of
the iser patch (replace "pactch" with "patch"),

> I just added a mutex around the reading of conn params and around some
> state bits that indicated if the ep is getting disconnected. This way
> the LLD does not have to worry. It knows that the get param callout will
> not get called if ep disconnect has been called. And ep disconnect waits
> for a get param to finish before calling into the driver to tear down the ep.

I wasn't sure about the new patch/approach to the ep leak on iscsid restart 
(below), 
is this correct that this patch (and maybe more patches from your tree) 
replaces 
the "[PATCH 2/3] iscsi: fix iscsi_endpoint leak" you sent earlier? The one you
sent are removing the "is_leading" and touching the iser bind code wheres this 
doesn't
is it all okay or something was forgotten?

Or.


commit 298e967e700bcafa9c96ecfbbc015c815b5fcd9f
Author: Mike Christie <[email protected]>
Date:   Wed Jan 19 17:58:54 2011 -0500

    iscsi: fix iscsi_endpoint leak
    
    When iscsid restarts it does not know the connection's
    endpoint, so it is getting leaked. This fixes the problem
    by having the iscsi class force a disconnect before a
    new connection is bound.

diff --git a/drivers/scsi/scsi_transport_iscsi.c 
b/drivers/scsi/scsi_transport_iscsi.c
index f905ecb..4e09b68 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -954,6 +954,7 @@ iscsi_create_conn(struct iscsi_cls_session *session, int 
dd_size, uint32_t cid)
        if (dd_size)
                conn->dd_data = &conn[1];
 
+       mutex_init(&conn->ep_mutex);
        INIT_LIST_HEAD(&conn->conn_list);
        conn->transport = transport;
        conn->cid = cid;
@@ -1430,6 +1431,29 @@ release_host:
        return err;
 }
 
+static int iscsi_if_ep_disconnect(struct iscsi_transport *transport,
+                                 u64 ep_handle)
+{
+       struct iscsi_cls_conn *conn;
+       struct iscsi_endpoint *ep;
+
+       if (!transport->ep_disconnect)
+               return -EINVAL;
+
+       ep = iscsi_lookup_endpoint(ep_handle);
+       if (!ep)
+               return -EINVAL;
+       conn = ep->conn;
+       if (conn) {
+               mutex_lock(&conn->ep_mutex);
+               conn->ep = NULL;
+               mutex_unlock(&conn->ep_mutex);
+       }
+
+       transport->ep_disconnect(ep);
+       return 0;
+}
+
 static int
 iscsi_if_transport_ep(struct iscsi_transport *transport,
                      struct iscsi_uevent *ev, int msg_type)
@@ -1454,14 +1478,8 @@ iscsi_if_transport_ep(struct iscsi_transport *transport,
                                                   ev->u.ep_poll.timeout_ms);
                break;
        case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
-               if (!transport->ep_disconnect)
-                       return -EINVAL;
-
-               ep = iscsi_lookup_endpoint(ev->u.ep_disconnect.ep_handle);
-               if (!ep)
-                       return -EINVAL;
-
-               transport->ep_disconnect(ep);
+               rc = iscsi_if_ep_disconnect(transport,
+                                           ev->u.ep_disconnect.ep_handle);
                break;
        }
        return rc;
@@ -1609,12 +1627,31 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr 
*nlh, uint32_t *group)
                session = iscsi_session_lookup(ev->u.b_conn.sid);
                conn = iscsi_conn_lookup(ev->u.b_conn.sid, ev->u.b_conn.cid);
 
-               if (session && conn)
-                       ev->r.retcode = transport->bind_conn(session, conn,
-                                       ev->u.b_conn.transport_eph,
-                                       ev->u.b_conn.is_leading);
-               else
+               if (conn && conn->ep)
+                       iscsi_if_ep_disconnect(transport, conn->ep->id);
+
+               if (!session || !conn) {
                        err = -EINVAL;
+                       break;
+               }
+
+               ev->r.retcode = transport->bind_conn(session, conn,
+                                               ev->u.b_conn.transport_eph,
+                                               ev->u.b_conn.is_leading);
+               if (ev->r.retcode || !transport->ep_connect)
+                       break;
+
+               ep = iscsi_lookup_endpoint(ev->u.b_conn.transport_eph);
+               if (ep) {
+                       ep->conn = conn;
+
+                       mutex_lock(&conn->ep_mutex);
+                       conn->ep = ep;
+                       mutex_unlock(&conn->ep_mutex);
+               } else
+                       iscsi_cls_conn_printk(KERN_ERR, conn,
+                                             "Could not set ep conn "
+                                             "binding\n");
                break;
        case ISCSI_UEVENT_SET_PARAM:
                err = iscsi_set_param(transport, ev);
diff --git a/include/scsi/scsi_transport_iscsi.h 
b/include/scsi/scsi_transport_iscsi.h
index 7fff94b..b9ba349 100644
--- a/include/scsi/scsi_transport_iscsi.h
+++ b/include/scsi/scsi_transport_iscsi.h
@@ -160,6 +160,8 @@ struct iscsi_cls_conn {
        void *dd_data;                  /* LLD private data */
        struct iscsi_transport *transport;
        uint32_t cid;                   /* connection id */
+       struct mutex ep_mutex;
+       struct iscsi_endpoint *ep;
 
        int active;                     /* must be accessed with the connlock */
        struct device dev;              /* sysfs transport/container device */
@@ -222,6 +224,7 @@ struct iscsi_endpoint {
        void *dd_data;                  /* LLD private data */
        struct device dev;
        uint64_t id;
+       struct iscsi_cls_conn *conn;
 };
 
 /*

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/open-iscsi?hl=en.

Reply via email to