]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
libiscsi_tcp: fix LLD data allocation
authorMike Christie <michaelc@cs.wisc.edu>
Fri, 24 Jun 2011 20:11:55 +0000 (15:11 -0500)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 3 Oct 2011 18:41:02 +0000 (11:41 -0700)
commit 74dcd0ec735ba9c5bef254b2f6e53068cf3f9ff0 upstream.

Have libiscsi_tcp have upper layers allocate the LLD data
along with the iscsi_cls_conn struct, so it is refcounted.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/scsi/libiscsi_tcp.c

index e98ae33f1295d5ba68ea70ab8f740f709f830950..09b232fd9a1bb6c59764ac35f64e7838b5469c4c 100644 (file)
@@ -1084,7 +1084,8 @@ iscsi_tcp_conn_setup(struct iscsi_cls_session *cls_session, int dd_data_size,
        struct iscsi_cls_conn *cls_conn;
        struct iscsi_tcp_conn *tcp_conn;
 
-       cls_conn = iscsi_conn_setup(cls_session, sizeof(*tcp_conn), conn_idx);
+       cls_conn = iscsi_conn_setup(cls_session,
+                                   sizeof(*tcp_conn) + dd_data_size, conn_idx);
        if (!cls_conn)
                return NULL;
        conn = cls_conn->dd_data;
@@ -1096,22 +1097,13 @@ iscsi_tcp_conn_setup(struct iscsi_cls_session *cls_session, int dd_data_size,
 
        tcp_conn = conn->dd_data;
        tcp_conn->iscsi_conn = conn;
-
-       tcp_conn->dd_data = kzalloc(dd_data_size, GFP_KERNEL);
-       if (!tcp_conn->dd_data) {
-               iscsi_conn_teardown(cls_conn);
-               return NULL;
-       }
+       tcp_conn->dd_data = conn->dd_data + sizeof(*tcp_conn);
        return cls_conn;
 }
 EXPORT_SYMBOL_GPL(iscsi_tcp_conn_setup);
 
 void iscsi_tcp_conn_teardown(struct iscsi_cls_conn *cls_conn)
 {
-       struct iscsi_conn *conn = cls_conn->dd_data;
-       struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
-
-       kfree(tcp_conn->dd_data);
        iscsi_conn_teardown(cls_conn);
 }
 EXPORT_SYMBOL_GPL(iscsi_tcp_conn_teardown);