* re: md: 'array_size' sysfs attribute
@ 2015-02-05 11:02 Dan Carpenter
2015-02-05 22:34 ` NeilBrown
0 siblings, 1 reply; 2+ messages in thread
From: Dan Carpenter @ 2015-02-05 11:02 UTC (permalink / raw)
To: dan.j.williams; +Cc: linux-raid
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
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: md: 'array_size' sysfs attribute
2015-02-05 11:02 md: 'array_size' sysfs attribute Dan Carpenter
@ 2015-02-05 22:34 ` NeilBrown
0 siblings, 0 replies; 2+ messages in thread
From: NeilBrown @ 2015-02-05 22:34 UTC (permalink / raw)
To: Dan Carpenter; +Cc: dan.j.williams, linux-raid
[-- 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 --]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-02-05 22:34 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-05 11:02 md: 'array_size' sysfs attribute Dan Carpenter
2015-02-05 22:34 ` NeilBrown
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).