On Thu, 2017-03-30 at 10:12 -0700, Bart Van Assche wrote: > While releasing a command __iscsit_free_cmd() can be called multiple > times but .iscsit_release_cmd() must be called only once. Hence move > the .iscsit_release_cmd() call into iscsit_release_cmd(). The latter > function is only called once per command. The only driver that defines > the .iscsit_release_cmd() callback is the cxgbit driver so this change > only affects the cxgbit driver. > > Fixes: 7ec811a8e9c3 ("iscsi-target: add void (*iscsit_release_cmd)()") > Signed-off-by: Bart Van Assche <bart.vanassche@xxxxxxxxxxx> > Cc: Varun Prakash <varun@xxxxxxxxxxx> > Cc: Nicholas Bellinger <nab@xxxxxxxxxxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> > --- > drivers/target/iscsi/iscsi_target_util.c | 15 +++++++++------ > 1 file changed, 9 insertions(+), 6 deletions(-) > Applied to target-pending/for-next, but dropping the stable CC' because the single caller in cxgbit_release_cmd() is already checking to ensure resources are only released on the first invocation. So it's not a bug-fix. > diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c > index 5041a9c8bdcb..8a022b5b2317 100644 > --- a/drivers/target/iscsi/iscsi_target_util.c > +++ b/drivers/target/iscsi/iscsi_target_util.c > @@ -691,11 +691,17 @@ void iscsit_release_cmd(struct iscsi_cmd *cmd) > { > struct iscsi_session *sess; > struct se_cmd *se_cmd = &cmd->se_cmd; > + struct iscsi_conn *conn = cmd->conn; > + void (*release)(struct iscsi_conn *, struct iscsi_cmd *); > > - if (cmd->conn) > - sess = cmd->conn->sess; > - else > + if (conn) { > + sess = conn->sess; > + release = conn->conn_transport->iscsit_release_cmd; > + if (release) > + release(conn, cmd); > + } else { > sess = cmd->sess; > + } > > BUG_ON(!sess || !sess->se_sess); Also, no need for a local (*release) function pointer and extra assignment. Dropping that part now, and squashing into the original patch.