All of lore.kernel.org
 help / color / mirror / Atom feed
* [bug report] dm zoned: per-device reclaim
@ 2020-06-05 12:37 Dan Carpenter
  0 siblings, 0 replies; only message in thread
From: Dan Carpenter @ 2020-06-05 12:37 UTC (permalink / raw)
  To: hare; +Cc: dm-devel

Hello Hannes Reinecke,

The patch a99e0ceaa832: "dm zoned: per-device reclaim" from Jun 2,
2020, leads to the following static checker warning:

	drivers/md/dm-zoned-reclaim.c:428 dmz_do_reclaim()
	error: potentially dereferencing uninitialized 'rzone'.

drivers/md/dm-zoned-reclaim.c
   364  static int dmz_do_reclaim(struct dmz_reclaim *zrc)
   365  {
   366          struct dmz_metadata *zmd = zrc->metadata;
   367          struct dm_zone *dzone;
   368          struct dm_zone *rzone;
                                ^^^^^

   369          unsigned long start;
   370          int ret;
   371  
   372          /* Get a data zone */
   373          dzone = dmz_get_zone_for_reclaim(zmd, zrc->dev_idx,
   374                                           dmz_target_idle(zrc));
   375          if (!dzone) {
   376                  DMDEBUG("(%s/%u): No zone found to reclaim",
   377                          dmz_metadata_label(zmd), zrc->dev_idx);
   378                  return -EBUSY;
   379          }
   380  
   381          start = jiffies;
   382          if (dmz_is_cache(dzone) || dmz_is_rnd(dzone)) {
   383                  if (!dmz_weight(dzone)) {
   384                          /* Empty zone */
   385                          dmz_reclaim_empty(zrc, dzone);
   386                          ret = 0;
   387                  } else {
   388                          /*
   389                           * Reclaim the random data zone by moving its
   390                           * valid data blocks to a free sequential zone.
   391                           */
   392                          ret = dmz_reclaim_rnd_data(zrc, dzone);
   393                  }
   394                  rzone = dzone;
   395  
   396          } else {
   397                  struct dm_zone *bzone = dzone->bzone;
   398                  sector_t chunk_block = 0;
   399  
   400                  ret = dmz_first_valid_block(zmd, bzone, &chunk_block);
   401                  if (ret < 0)
   402                          goto out;

"rzone" is uninitialized if "ret < 0".

   403  
   404                  if (ret == 0 || chunk_block >= dzone->wp_block) {
   405                          /*
   406                           * The buffer zone is empty or its valid blocks are
   407                           * after the data zone write pointer.
   408                           */
   409                          ret = dmz_reclaim_buf(zrc, dzone);
   410                          rzone = bzone;
   411                  } else {
   412                          /*
   413                           * Reclaim the data zone by merging it into the
   414                           * buffer zone so that the buffer zone itself can
   415                           * be later reclaimed.
   416                           */
   417                          ret = dmz_reclaim_seq_data(zrc, dzone);
   418                          rzone = dzone;
   419                  }
   420          }
   421  out:
   422          if (ret) {
   423                  if (ret == -EINTR)
   424                          DMDEBUG("(%s/%u): reclaim zone %u interrupted",
   425                                  dmz_metadata_label(zmd), zrc->dev_idx,
   426                                  rzone->id);
   427                  else
   428                          DMDEBUG("(%s/%u): Failed to reclaim zone %u, err %d",
   429                                  dmz_metadata_label(zmd), zrc->dev_idx,
   430                                  rzone->id, ret);
                                        ^^^^^^^^^
Dereference.

   431                  dmz_unlock_zone_reclaim(dzone);
   432                  return ret;
   433          }
   434  
   435          ret = dmz_flush_metadata(zrc->metadata);
   436          if (ret) {
   437                  DMDEBUG("(%s/%u): Metadata flush for zone %u failed, err %d",
   438                          dmz_metadata_label(zmd), zrc->dev_idx, rzone->id, ret);
   439                  return ret;
   440          }
   441  
   442          DMDEBUG("(%s/%u): Reclaimed zone %u in %u ms",
   443                  dmz_metadata_label(zmd), zrc->dev_idx,
   444                  rzone->id, jiffies_to_msecs(jiffies - start));
   445          return 0;
   446  }

regards,
dan carpenter

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-06-05 12:37 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-05 12:37 [bug report] dm zoned: per-device reclaim Dan Carpenter

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.