Re: Re: fr1-2.16 patch for 2.6.10 kernel
"Peter T. Breuer" <[email protected]>
| Newsgroups | gmane.linux.enbd.general |
|---|---|
| Message-ID | <[email protected]> |
"Also sprach denis bonnenfant:"
> ITERATE_RDEV(mddev,rdev,rtmp) {
> if (!mddev) {
> printk(KERN_INFO "md: *****BUG***mddev***********!!!\n");
> break;
> }
> printk(KERN_INFO "md: *****mddev=%p rdev=%p *************!!!\n", mddev, rdev);
> if (!rdev) {
> printk(KERN_INFO "md: *****BUG**rdev*************!!!\n");
> break;
> }
>
> and got this :
>
> Mar 22 09:13:18 ldap-fixe kernel: md: 3846
> Mar 22 09:13:18 ldap-fixe kernel: md: *****mddev=f7fc8480 rdev=f7188b40 *************!!!
> Mar 22 09:13:18 ldap-fixe kernel: Unable to handle kernel NULL pointer dereference at virtual address 00000004
OK. And you are sure it does not exit from the ITERATE_RDEV loop? Good.
ITERATE_RDEV(mddev,rdev,rtmp)
is
for (rtmp = mddev->disks.next;
rdev = list_entry(rtmp, mdk_rdev_t, same_set),
rtmp = rtmp->next,
rtmp->prev != &mddev->disks
; )
so please expand the loop as follows:
rtmp = mddev->disks.next;
while (1) {
printk(KERN_INFO "md %d: ** mddev=%p rdev=%p\n", __LINE__, mddev, rdev);
rdev = list_entry(rtmp, mdk_rdev_t, same_set);
rtmp = rtmp->next;
if (rtmp->prev == &mddev->disks)
break;
if (rdev->raid_disk < 0 && !rdev->faulty) {
if (mddev->pers->hot_add_disk(mddev,rdev))
spares++;
else
break;
}
}
Peter