[lustre-devel] [bug report] staging: lustre: lov: Ensure correct operation for large object sizes

Dan Carpenter dan.carpenter at oracle.com
Tue Aug 15 04:12:14 PDT 2017


On Mon, Aug 14, 2017 at 04:09:34PM +0100, James Simmons wrote:
> 
> > Hello Nathaniel Clark,
> > 
> > The patch 476f575cf070: "staging: lustre: lov: Ensure correct
> > operation for large object sizes" from Jul 26, 2017, leads to the
> > following static checker warning:
> > 
> > 	drivers/staging/lustre/lustre/lov/lov_ea.c:207 lsm_unpackmd_common()
> > 	warn: signed overflow undefined. 'min_stripe_maxbytes * stripe_count < min_stripe_maxbytes'
> > 
> > drivers/staging/lustre/lustre/lov/lov_ea.c
> >    148  static int lsm_unpackmd_common(struct lov_obd *lov,
> >    149                                 struct lov_stripe_md *lsm,
> >    150                                 struct lov_mds_md *lmm,
> >    151                                 struct lov_ost_data_v1 *objects)
> >    152  {
> >    153          loff_t min_stripe_maxbytes = 0;
> >                 ^^^^^^
> > loff_t is long long.
> > 
> >    154          unsigned int stripe_count;
> >    155          struct lov_oinfo *loi;
> >    156          loff_t lov_bytes;
> >    157          unsigned int i;
> >    158  
> >    159          /*
> >    160           * This supposes lov_mds_md_v1/v3 first fields are
> >    161           * are the same
> >    162           */
> >    163          lmm_oi_le_to_cpu(&lsm->lsm_oi, &lmm->lmm_oi);
> >    164          lsm->lsm_stripe_size = le32_to_cpu(lmm->lmm_stripe_size);
> >    165          lsm->lsm_pattern = le32_to_cpu(lmm->lmm_pattern);
> >    166          lsm->lsm_layout_gen = le16_to_cpu(lmm->lmm_layout_gen);
> >    167          lsm->lsm_pool_name[0] = '\0';
> >    168  
> >    169          stripe_count = lsm_is_released(lsm) ? 0 : lsm->lsm_stripe_count;
> >    170  
> >    171          for (i = 0; i < stripe_count; i++) {
> >    172                  loi = lsm->lsm_oinfo[i];
> >    173                  ostid_le_to_cpu(&objects[i].l_ost_oi, &loi->loi_oi);
> >    174                  loi->loi_ost_idx = le32_to_cpu(objects[i].l_ost_idx);
> >    175                  loi->loi_ost_gen = le32_to_cpu(objects[i].l_ost_gen);
> >    176                  if (lov_oinfo_is_dummy(loi))
> >    177                          continue;
> >    178  
> >    179                  if (loi->loi_ost_idx >= lov->desc.ld_tgt_count &&
> >    180                      !lov2obd(lov)->obd_process_conf) {
> >    181                          CERROR("%s: OST index %d more than OST count %d\n",
> >    182                                 (char *)lov->desc.ld_uuid.uuid,
> >    183                                 loi->loi_ost_idx, lov->desc.ld_tgt_count);
> >    184                          lov_dump_lmm_v1(D_WARNING, lmm);
> >    185                          return -EINVAL;
> >    186                  }
> >    187  
> >    188                  if (!lov->lov_tgts[loi->loi_ost_idx]) {
> >    189                          CERROR("%s: OST index %d missing\n",
> >    190                                 (char *)lov->desc.ld_uuid.uuid,
> >    191                                 loi->loi_ost_idx);
> >    192                          lov_dump_lmm_v1(D_WARNING, lmm);
> >    193                          continue;
> >    194                  }
> >    195  
> >    196                  lov_bytes = lov_tgt_maxbytes(lov->lov_tgts[loi->loi_ost_idx]);
> >    197                  if (min_stripe_maxbytes == 0 || lov_bytes < min_stripe_maxbytes)
> >    198                          min_stripe_maxbytes = lov_bytes;
> >    199          }
> >    200  
> >    201          if (min_stripe_maxbytes == 0)
> >    202                  min_stripe_maxbytes = LUSTRE_EXT3_STRIPE_MAXBYTES;
> >    203  
> >    204          stripe_count = lsm->lsm_stripe_count ?: lov->desc.ld_tgt_count;
> >    205          lov_bytes = min_stripe_maxbytes * stripe_count;
> >                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > This is undefined in C.
> > 
> >    206  
> >    207          if (lov_bytes < min_stripe_maxbytes) /* handle overflow */
> >                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > So this might be wrong.
> > 
> >    208                  lsm->lsm_maxbytes = MAX_LFS_FILESIZE;
> >    209          else
> >    210                  lsm->lsm_maxbytes = lov_bytes;
> >    211  
> >    212          return 0;
> >    213  }
> 
> Dan what exact command did you use to find this bug? We do use smatch to 
> find these kinds of issues before patches land but some how we are missing
> this class from time to time.
> 
> Just to let you know the bug is being tracked under 
> 
> https://jira.hpdd.intel.com/browse/LU-9862
> 
> We do have a patch as well under going testing and review.

It's something I hadn't pushed.  I'll push that check right now.  But
it has few warnings and I'm not actually sure it matters with the
kernel.

regards,
dan carpenter


More information about the lustre-devel mailing list