linux-raid.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: NeilBrown <neilb@suse.de>
To: Dan Carpenter <dan.carpenter@oracle.com>
Cc: dan.j.williams@intel.com, linux-raid@vger.kernel.org
Subject: Re: md: 'array_size' sysfs attribute
Date: Fri, 6 Feb 2015 09:34:53 +1100	[thread overview]
Message-ID: <20150206093453.5caa1782@notabene.brown> (raw)
In-Reply-To: <20150205110237.GA7933@mwanda>

[-- Attachment #1: Type: text/plain, Size: 4419 bytes --]

On Thu, 5 Feb 2015 14:02:37 +0300 Dan Carpenter <dan.carpenter@oracle.com>
wrote:

> 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. 

Probably because it really is a new warning.  The problem is that your
"stupid scripts" (and we need more like them!!) are identifying the wrong
commit.

commit 516253a32c7abf3bc5754b1210106173ed191f7c
Author: NeilBrown <neilb@suse.de>
Date:   Mon Dec 15 12:56:58 2014 +1100

    md: protect ->pers changes with mddev->lock

is the guilty party (only in -next at present).  It delays the setting of
mddev->pers, but doesn't change all intermediate uses for mddev->pers into
pers.

I've just merged:
-		       (unsigned long long)mddev->pers->size(mddev, 0, 0) / 2);
+		       (unsigned long long)pers->size(mddev, 0, 0) / 2);

into that patch.


>                       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.

mddev_detach doesn't really need ->pers in this case.  I've merged:

@@ -5134,7 +5134,7 @@ static void mddev_detach(struct mddev *mddev)
 		wait_event(bitmap->behind_wait,
 			   atomic_read(&bitmap->behind_writes) == 0);
 	}
-	if (mddev->pers->quiesce) {
+	if (mddev->pers && mddev->pers->quiesce) {
 		mddev->pers->quiesce(mddev, 1);
 		mddev->pers->quiesce(mddev, 0);
 	}


Thanks a lot to you and your static checker!!

NeilBrown

> 
>   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@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 811 bytes --]

      reply	other threads:[~2015-02-05 22:34 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-05 11:02 md: 'array_size' sysfs attribute Dan Carpenter
2015-02-05 22:34 ` NeilBrown [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150206093453.5caa1782@notabene.brown \
    --to=neilb@suse.de \
    --cc=dan.carpenter@oracle.com \
    --cc=dan.j.williams@intel.com \
    --cc=linux-raid@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).