re: md: 'array_size' sysfs attribute

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Dan Williams,

The patch b522adcde9c4: "md: 'array_size' sysfs attribute" from Mar
31, 2009, leads to the following static checker warning:

	drivers/md/md.c:5069 md_run()
	error: we previously assumed 'mddev->pers' could be null (see line 4936)

This code is really old.  I don't know why my stupid scripts are marking
it as a new warning.  We don't set "mddev->pers" to non-NULL until the
end of the function so it looks like a real bug and that "pers->size"
was intended.  When I fix that bug then it un-silences this warning:

	drivers/md/md.c:5080 md_run()
	error: we previously assumed 'mddev->pers' could be null (see line 4936)

And that also is a real bug, but I'm not sure the right fix for that.

Basically, it's bugs all the way down from the code, to the fix, to the
static checker.  *sigh*.

drivers/md/md.c
  5060          err = pers->run(mddev);
  5061          if (err)
  5062                  printk(KERN_ERR "md: pers->run() failed ...\n");
  5063          else if (pers->size(mddev, 0, 0) < mddev->array_sectors) {
  5064                  WARN_ONCE(!mddev->external_size, "%s: default size too small,"
  5065                            " but 'external_size' not in effect?\n", __func__);
  5066                  printk(KERN_ERR
  5067                         "md: invalid array_size %llu > default size %llu\n",
  5068                         (unsigned long long)mddev->array_sectors / 2,
  5069                         (unsigned long long)mddev->pers->size(mddev, 0, 0) / 2);
                                                   ^^^^^^^^^^^^^^^^^^
This should be "pers->size()".

  5070                  err = -EINVAL;
  5071          }
  5072          if (err == 0 && pers->sync_request &&
  5073              (mddev->bitmap_info.file || mddev->bitmap_info.offset)) {
  5074                  err = bitmap_create(mddev);
  5075                  if (err)
  5076                          printk(KERN_ERR "%s: failed to create bitmap (%d)\n",
  5077                                 mdname(mddev), err);
  5078          }
  5079          if (err) {
  5080                  mddev_detach(mddev);
                        ^^^^^^^^^^^^^^^^^^^
mddev_detach() will oops if mddev->pers() is not set.  We could set
mdev->pers earlier, I suppose.

  5081                  pers->free(mddev, mddev->private);
  5082                  module_put(pers->owner);
  5083                  bitmap_destroy(mddev);
  5084                  return err;
  5085          }
  5086          if (mddev->queue) {
  5087                  mddev->queue->backing_dev_info.congested_data = mddev;
  5088                  mddev->queue->backing_dev_info.congested_fn = md_congested;
  5089                  blk_queue_merge_bvec(mddev->queue, md_mergeable_bvec);
  5090          }

regards,
dan carpenter
--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux