There seems exchs should get released in cases that FC_RJT_NONE is returned, or they will no longer get freed. It also looks a typo like the following, - fc_seq_lookup_recip(lport, ema->mp, fp) != FC_RJT_NONE) + fc_seq_lookup_recip(lport, ema->mp, fp) == FC_RJT_NONE) but I am not sure. Signed-off-by: Hillf Danton <dhillf@xxxxxxxxx> --- --- a/drivers/scsi/libfc/fc_exch.c 2010-09-13 07:07:38.000000000 +0800 +++ b/drivers/scsi/libfc/fc_exch.c 2010-10-19 21:48:22.000000000 +0800 @@ -3,6 +3,9 @@ * Copyright(c) 2008 Red Hat, Inc. All rights reserved. * Copyright(c) 2008 Mike Christie * + * Copyright(c) Oct 19, 2010 Hillf Danton + * minor fix of memory leakage + * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. @@ -1246,9 +1249,16 @@ static struct fc_seq *fc_seq_assign(stru fr_seq(fp) = NULL; list_for_each_entry(ema, &lport->ema_list, ema_list) - if ((!ema->match || ema->match(fp)) && - fc_seq_lookup_recip(lport, ema->mp, fp) != FC_RJT_NONE) - break; + if (! ema->match || ema->match(fp)) + if (fc_seq_lookup_recip(lport, ema->mp, fp) != + FC_RJT_NONE) + break; + else { + struct fc_seq *seq = fr_seq(fp); + struct fc_exch *exch = fc_seq_exch(seq); + fc_exch_release(exch); + } + return fr_seq(fp); } -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html