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

Reply via email to