tree: https://github.com/ls-zhu/linux rbd_v2_pr head: a19439e8d575c7232587295a8d6bca7fa94343c9 commit: a19439e8d575c7232587295a8d6bca7fa94343c9 [12/12] pr_register and pr_readkeys can work.
New smatch warnings: drivers/target/target_core_user.c:3841 tcm_rbd_execute_pr_register() error: uninitialized symbol 'pr_info'. Old smatch warnings: drivers/target/target_core_user.c:378 tcmu_genl_cmd_done() warn: inconsistent returns 'spin_lock:&udev->nl_cmd_lock'. Locked on: line 350 Unlocked on: line 318 # https://github.com/ls-zhu/linux/commit/a19439e8d575c7232587295a8d6bca7fa94343c9 git remote add ls-zhu https://github.com/ls-zhu/linux git remote update ls-zhu git checkout a19439e8d575c7232587295a8d6bca7fa94343c9 vim +/pr_info +3841 drivers/target/target_core_user.c a19439e8 Zhu Lingshan 2018-05-28 3686 9b66ab67 Zhu Lingshan 2018-05-20 3687 static sense_reason_t 9b66ab67 Zhu Lingshan 2018-05-20 3688 tcm_rbd_execute_pr_register(struct se_cmd *cmd, u64 old_key, 9b66ab67 Zhu Lingshan 2018-05-20 3689 u64 new_key, bool aptpl, bool all_tg_pt, 9b66ab67 Zhu Lingshan 2018-05-20 3690 bool spec_i_pt, bool ignore_existing) 9b66ab67 Zhu Lingshan 2018-05-20 3691 { 9b66ab67 Zhu Lingshan 2018-05-20 3692 struct se_device *dev = cmd->se_dev; 9b66ab67 Zhu Lingshan 2018-05-20 3693 //struct tcm_rbd_dev *tcm_rbd_dev = TCM_RBD_DEV(dev); 9b66ab67 Zhu Lingshan 2018-05-20 3694 char nexus_buf[TCM_RBD_PR_IT_NEXUS_MAXLEN]; 9b66ab67 Zhu Lingshan 2018-05-20 3695 struct tcm_rbd_pr_info *pr_info; 9b66ab67 Zhu Lingshan 2018-05-20 3696 struct tcm_rbd_pr_reg *reg; 9b66ab67 Zhu Lingshan 2018-05-20 3697 struct tcm_rbd_pr_reg *existing_reg; 9b66ab67 Zhu Lingshan 2018-05-20 3698 char *pr_xattr; 9b66ab67 Zhu Lingshan 2018-05-20 3699 int pr_xattr_len; 9b66ab67 Zhu Lingshan 2018-05-20 3700 int rc; 9b66ab67 Zhu Lingshan 2018-05-20 3701 sense_reason_t ret; 9b66ab67 Zhu Lingshan 2018-05-20 3702 int retries = 0; 9b66ab67 Zhu Lingshan 2018-05-20 3703 9b66ab67 Zhu Lingshan 2018-05-20 3704 printk(KERN_ERR"lszhu, tcm_rbd_execute_pr_register() is called.\n"); 9b66ab67 Zhu Lingshan 2018-05-20 3705 a19439e8 Zhu Lingshan 2018-05-28 3706 a19439e8 Zhu Lingshan 2018-05-28 3707 struct tcmu_dev *udev = TCMU_DEV(dev); a19439e8 Zhu Lingshan 2018-05-28 3708 char *pr_buf_ptr = NULL; a19439e8 Zhu Lingshan 2018-05-28 3709 udev->pr_info.pr_info_buf = kzalloc(TCM_RBD_PR_INFO_XATTR_MAX_SIZE, GFP_KERNEL); a19439e8 Zhu Lingshan 2018-05-28 3710 pr_buf_ptr = udev->pr_info.pr_info_buf; a19439e8 Zhu Lingshan 2018-05-28 3711 memcpy(udev->pr_info.pr_info_buf, "12345abctest", 12); a19439e8 Zhu Lingshan 2018-05-28 3712 if(!pr_buf_ptr) { a19439e8 Zhu Lingshan 2018-05-28 3713 printk(KERN_ERR"lszhu, failed to alloc RAM for PR INFO.\n"); a19439e8 Zhu Lingshan 2018-05-28 3714 ret = TCM_OUT_OF_RESOURCES; a19439e8 Zhu Lingshan 2018-05-28 3715 goto err_out; a19439e8 Zhu Lingshan 2018-05-28 3716 } a19439e8 Zhu Lingshan 2018-05-28 3717 a19439e8 Zhu Lingshan 2018-05-28 3718 a19439e8 Zhu Lingshan 2018-05-28 3719 9b66ab67 Zhu Lingshan 2018-05-20 3720 if (!cmd->se_sess || !cmd->se_lun) { 9b66ab67 Zhu Lingshan 2018-05-20 3721 pr_err("SPC-3 PR: se_sess || struct se_lun is NULL!\n"); 9b66ab67 Zhu Lingshan 2018-05-20 3722 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 9b66ab67 Zhu Lingshan 2018-05-20 3723 } 9b66ab67 Zhu Lingshan 2018-05-20 3724 9b66ab67 Zhu Lingshan 2018-05-20 3725 if (!aptpl) { 9b66ab67 Zhu Lingshan 2018-05-20 3726 /* 9b66ab67 Zhu Lingshan 2018-05-20 3727 * Currently unsupported by block layer API (hch): 9b66ab67 Zhu Lingshan 2018-05-20 3728 * reservations not persistent through a power loss are 9b66ab67 Zhu Lingshan 2018-05-20 3729 * basically useless, so I decided to force them on in the API. 9b66ab67 Zhu Lingshan 2018-05-20 3730 */ 9b66ab67 Zhu Lingshan 2018-05-20 3731 pr_warn("PR register with aptpl unset. Treating as aptpl=1\n"); 9b66ab67 Zhu Lingshan 2018-05-20 3732 aptpl = true; 9b66ab67 Zhu Lingshan 2018-05-20 3733 } 9b66ab67 Zhu Lingshan 2018-05-20 3734 9b66ab67 Zhu Lingshan 2018-05-20 3735 if (all_tg_pt || spec_i_pt) { 9b66ab67 Zhu Lingshan 2018-05-20 3736 /* TODO: Currently unsupported by block layer API. */ 9b66ab67 Zhu Lingshan 2018-05-20 3737 pr_err("failing PR register with all_tg_pt=%d spec_i_pt=%d\n", 9b66ab67 Zhu Lingshan 2018-05-20 3738 all_tg_pt, spec_i_pt); 9b66ab67 Zhu Lingshan 2018-05-20 3739 return TCM_INVALID_CDB_FIELD; This error path leaks. 9b66ab67 Zhu Lingshan 2018-05-20 3740 } 9b66ab67 Zhu Lingshan 2018-05-20 3741 9b66ab67 Zhu Lingshan 2018-05-20 3742 rc = tcm_rbd_gen_it_nexus(cmd->se_sess, nexus_buf, 9b66ab67 Zhu Lingshan 2018-05-20 3743 ARRAY_SIZE(nexus_buf)); 9b66ab67 Zhu Lingshan 2018-05-20 3744 if (rc < 0) 9b66ab67 Zhu Lingshan 2018-05-20 3745 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; Leak 9b66ab67 Zhu Lingshan 2018-05-20 3746 9b66ab67 Zhu Lingshan 2018-05-20 3747 pr_err("generated nexus: %s\n", nexus_buf); 9b66ab67 Zhu Lingshan 2018-05-20 3748 9b66ab67 Zhu Lingshan 2018-05-20 3749 retry: Please don't put any whitespace before labels. 9b66ab67 Zhu Lingshan 2018-05-20 3750 pr_info = NULL; 9b66ab67 Zhu Lingshan 2018-05-20 3751 pr_xattr = NULL; 9b66ab67 Zhu Lingshan 2018-05-20 3752 pr_xattr_len = 0; 9b66ab67 Zhu Lingshan 2018-05-20 3753 rc = tcm_rbd_pr_info_get(//tcm_rbd_dev, a19439e8 Zhu Lingshan 2018-05-28 3754 udev, 9b66ab67 Zhu Lingshan 2018-05-20 3755 &pr_info, &pr_xattr, 9b66ab67 Zhu Lingshan 2018-05-20 3756 &pr_xattr_len); 9b66ab67 Zhu Lingshan 2018-05-20 3757 if ((rc == -ENODATA) && (retries == 0)) { 9b66ab67 Zhu Lingshan 2018-05-20 3758 pr_warn("PR info not present, initializing\n"); a19439e8 Zhu Lingshan 2018-05-28 3759 rc = tcm_rbd_pr_info_init(udev, 9b66ab67 Zhu Lingshan 2018-05-20 3760 &pr_info, &pr_xattr, 9b66ab67 Zhu Lingshan 2018-05-20 3761 &pr_xattr_len); 9b66ab67 Zhu Lingshan 2018-05-20 3762 } 9b66ab67 Zhu Lingshan 2018-05-20 3763 if (rc < 0) { 9b66ab67 Zhu Lingshan 2018-05-20 3764 pr_err("failed to obtain PR info\n"); 9b66ab67 Zhu Lingshan 2018-05-20 3765 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; Leak 9b66ab67 Zhu Lingshan 2018-05-20 3766 } 9b66ab67 Zhu Lingshan 2018-05-20 3767 9b66ab67 Zhu Lingshan 2018-05-20 3768 /* check for an existing registration */ 9b66ab67 Zhu Lingshan 2018-05-20 3769 existing_reg = NULL; 9b66ab67 Zhu Lingshan 2018-05-20 3770 list_for_each_entry(reg, &pr_info->regs, regs_node) { 9b66ab67 Zhu Lingshan 2018-05-20 3771 if (!strncmp(reg->it_nexus, nexus_buf, ARRAY_SIZE(nexus_buf))) { 9b66ab67 Zhu Lingshan 2018-05-20 3772 pr_err("found existing PR reg for %s\n", nexus_buf); 9b66ab67 Zhu Lingshan 2018-05-20 3773 existing_reg = reg; 9b66ab67 Zhu Lingshan 2018-05-20 3774 break; 9b66ab67 Zhu Lingshan 2018-05-20 3775 } 9b66ab67 Zhu Lingshan 2018-05-20 3776 } 9b66ab67 Zhu Lingshan 2018-05-20 3777 9b66ab67 Zhu Lingshan 2018-05-20 3778 if (!existing_reg) { 9b66ab67 Zhu Lingshan 2018-05-20 3779 ret = tcm_rbd_execute_pr_register_new(pr_info, old_key, new_key, 9b66ab67 Zhu Lingshan 2018-05-20 3780 nexus_buf, 9b66ab67 Zhu Lingshan 2018-05-20 3781 ignore_existing); 9b66ab67 Zhu Lingshan 2018-05-20 3782 } else { 9b66ab67 Zhu Lingshan 2018-05-20 3783 ret = tcm_rbd_execute_pr_register_existing(pr_info, old_key, 9b66ab67 Zhu Lingshan 2018-05-20 3784 new_key, nexus_buf, 9b66ab67 Zhu Lingshan 2018-05-20 3785 existing_reg, 9b66ab67 Zhu Lingshan 2018-05-20 3786 ignore_existing); 9b66ab67 Zhu Lingshan 2018-05-20 3787 } 9b66ab67 Zhu Lingshan 2018-05-20 3788 if (ret) { 9b66ab67 Zhu Lingshan 2018-05-20 3789 goto err_out; 9b66ab67 Zhu Lingshan 2018-05-20 3790 } 9b66ab67 Zhu Lingshan 2018-05-20 3791 9b66ab67 Zhu Lingshan 2018-05-20 3792 /* 9b66ab67 Zhu Lingshan 2018-05-20 3793 * The Persistent Reservations Generation (PRGENERATION) field shall 9b66ab67 Zhu Lingshan 2018-05-20 3794 * contain the value of a 32-bit wrapping counter that the device server 9b66ab67 Zhu Lingshan 2018-05-20 3795 * shall update (e.g., increment) during the processing of any 9b66ab67 Zhu Lingshan 2018-05-20 3796 * PERSISTENT RESERVE OUT command as described in table 216 (see 9b66ab67 Zhu Lingshan 2018-05-20 3797 * 6.16.2). The PRgeneration value shall not be updated by a PERSISTENT 9b66ab67 Zhu Lingshan 2018-05-20 3798 * RESERVE IN command or by a PERSISTENT RESERVE OUT command that is 9b66ab67 Zhu Lingshan 2018-05-20 3799 * terminated due to an error or reservation conflict. 9b66ab67 Zhu Lingshan 2018-05-20 3800 */ 9b66ab67 Zhu Lingshan 2018-05-20 3801 pr_info->gen++; 9b66ab67 Zhu Lingshan 2018-05-20 3802 /* 9b66ab67 Zhu Lingshan 2018-05-20 3803 * TODO: 9b66ab67 Zhu Lingshan 2018-05-20 3804 * Regardless of the APTPL bit value the PRgeneration value shall be set 9b66ab67 Zhu Lingshan 2018-05-20 3805 * to zero by a power on. 9b66ab67 Zhu Lingshan 2018-05-20 3806 */ 9b66ab67 Zhu Lingshan 2018-05-20 3807 a19439e8 Zhu Lingshan 2018-05-28 3808 rc = tcm_rbd_pr_info_replace(udev, 9b66ab67 Zhu Lingshan 2018-05-20 3809 pr_xattr, pr_xattr_len, 9b66ab67 Zhu Lingshan 2018-05-20 3810 pr_info); 9b66ab67 Zhu Lingshan 2018-05-20 3811 if (rc == -ECANCELED) { 9b66ab67 Zhu Lingshan 2018-05-20 3812 char *pr_xattr_changed = NULL; 9b66ab67 Zhu Lingshan 2018-05-20 3813 int pr_xattr_changed_len = 0; 9b66ab67 Zhu Lingshan 2018-05-20 3814 /* PR info has changed since we read it */ a19439e8 Zhu Lingshan 2018-05-28 3815 rc = rbd_dev_getxattr(udev, 9b66ab67 Zhu Lingshan 2018-05-20 3816 TCM_RBD_PR_INFO_XATTR_KEY, 9b66ab67 Zhu Lingshan 2018-05-20 3817 TCM_RBD_PR_INFO_XATTR_MAX_SIZE, 9b66ab67 Zhu Lingshan 2018-05-20 3818 (char **)&pr_xattr_changed, a19439e8 Zhu Lingshan 2018-05-28 3819 &pr_xattr_changed_len, pr_buf_ptr); a19439e8 Zhu Lingshan 2018-05-28 3820 pr_xattr_changed = pr_buf_ptr; 9b66ab67 Zhu Lingshan 2018-05-20 3821 pr_warn("atomic PR info update failed due to parallel " 9b66ab67 Zhu Lingshan 2018-05-20 3822 "change, expected(%d) %s, now(%d) %s\n", 9b66ab67 Zhu Lingshan 2018-05-20 3823 pr_xattr_len, pr_xattr, pr_xattr_changed_len, 9b66ab67 Zhu Lingshan 2018-05-20 3824 pr_xattr_changed); 9b66ab67 Zhu Lingshan 2018-05-20 3825 retries++; 9b66ab67 Zhu Lingshan 2018-05-20 3826 if (retries <= TCM_RBD_PR_REG_MAX_RETRIES) { 9b66ab67 Zhu Lingshan 2018-05-20 3827 tcm_rbd_pr_info_free(pr_info); 9b66ab67 Zhu Lingshan 2018-05-20 3828 //TODO: still need this kfree when we use reall pr_xattr buffer than a global array. 9b66ab67 Zhu Lingshan 2018-05-20 3829 //kfree(pr_xattr); 9b66ab67 Zhu Lingshan 2018-05-20 3830 goto retry; 9b66ab67 Zhu Lingshan 2018-05-20 3831 } 9b66ab67 Zhu Lingshan 2018-05-20 3832 } 9b66ab67 Zhu Lingshan 2018-05-20 3833 if (rc < 0) { 9b66ab67 Zhu Lingshan 2018-05-20 3834 pr_err("atomic PR info update failed: %d\n", rc); 9b66ab67 Zhu Lingshan 2018-05-20 3835 ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 9b66ab67 Zhu Lingshan 2018-05-20 3836 goto err_out; 9b66ab67 Zhu Lingshan 2018-05-20 3837 } 9b66ab67 Zhu Lingshan 2018-05-20 3838 9b66ab67 Zhu Lingshan 2018-05-20 3839 ret = TCM_NO_SENSE; 9b66ab67 Zhu Lingshan 2018-05-20 3840 err_out: 9b66ab67 Zhu Lingshan 2018-05-20 @3841 tcm_rbd_pr_info_free(pr_info); 9b66ab67 Zhu Lingshan 2018-05-20 3842 //TODO: still need this kfree when we use reall pr_xattr buffer than a global array. 9b66ab67 Zhu Lingshan 2018-05-20 3843 //kfree(pr_xattr); a19439e8 Zhu Lingshan 2018-05-28 3844 kfree(udev->pr_info.pr_info_buf); 9b66ab67 Zhu Lingshan 2018-05-20 3845 return ret; It's better to write the error handling like this: ret = TCM_NO_SENSE; err_free_pr_info: tcm_rbd_pr_info_free(pr_info); err_free_buf: kfree(udev->pr_info.pr_info_buf); udev->pr_info.pr_info_buf = NULL; // <-- I am uncomfortable leaving a freed pointer around. return ret; 9b66ab67 Zhu Lingshan 2018-05-20 3846 } 9b66ab67 Zhu Lingshan 2018-05-20 3847 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation _______________________________________________ kbuild mailing list kbuild@lists.01.org https://lists.01.org/mailman/listinfo/kbuild