• Nicholas Bellinger's avatar
    target: Fix PR registration + APTPL RCU conversion regression · 3ccd6e83
    Nicholas Bellinger authored
    This patch fixes a v4.2+ regression introduced by commit 79dc9c9e
    where lookup of t10_pr_registration->pr_reg_deve and associated
    ->pr_kref get was missing from __core_scsi3_do_alloc_registration(),
    which is responsible for setting DEF_PR_REG_ACTIVE.
    
    This would result in REGISTER operations completing successfully,
    but subsequent core_scsi3_pr_seq_non_holder() checking would fail
    with !DEF_PR_REG_ACTIVE -> RESERVATION CONFLICT status.
    
    Update __core_scsi3_add_registration() to drop ->pr_kref reference
    after registration and any optional ALL_TG_PT=1 processing has
    completed.  Update core_scsi3_decode_spec_i_port() to release
    the new parent local_pr_reg->pr_kref as well.
    
    Also, update __core_scsi3_check_aptpl_registration() to perform
    the same target_nacl_find_deve() lookup + ->pr_kref get, now that
    __core_scsi3_add_registration() expects to drop the reference.
    
    Finally, since there are cases when se_dev_entry->se_lun_acl can
    still be dereferenced in core_scsi3_lunacl_undepend_item() while
    holding ->pr_kref, go ahead and move explicit rcu_assign_pointer()
    NULL assignments within core_disable_device_list_for_node() until
    after orig->pr_comp finishes.
    Reported-by: default avatarScott L. Lykens <scott@lykens.org>
    Tested-by: default avatarScott L. Lykens <scott@lykens.org>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Hannes Reinecke <hare@suse.de>
    Cc: Lee Duncan <lduncan@suse.com>
    Cc: <stable@vger.kernel.org> # v4.2+
    Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
    3ccd6e83
target_core_pr.c 125 KB