> - kref_get(&pg->kref); > + if (!kref_get_unless_zero(&pg->kref)) > + continue; As pointed out earlier this should be done from the start. > + /* Check for existing port_group references */ > + spin_lock(&h->pg_lock); > + if (h->pg) { > + old_pg = pg; > + /* port_group has changed. Update to new port group */ > + if (h->pg != pg) { > + old_pg = h->pg; > + rcu_assign_pointer(h->pg, pg); > + pg_updated = true; > + } > + } else { > + rcu_assign_pointer(h->pg, pg); > + pg_updated = true; > + } > + alua_rtpg_queue(h->pg, sdev, NULL); > + spin_unlock(&h->pg_lock); > + > + if (pg_updated) > + synchronize_rcu(); > + if (old_pg) { > + if (old_pg->rtpg_sdev) > + flush_delayed_work(&old_pg->rtpg_work); > + kref_put(&old_pg->kref, release_port_group); > + } The synchronize_rcu() needs to be done in release_port_group, or even better be replaced by doing a kfree_rcu there instead of a kfree. And unless I'm mistaken the flush_delayed_work should probably be done in release_port_group as well. -- 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