[linux-lvm] [PATCH 1/2] metadata: check pv->dev null when setting PARTIAL_LV
heming.zhao at suse.com
heming.zhao at suse.com
Fri Sep 11 13:59:24 UTC 2020
On 9/11/20 8:17 PM, Zdenek Kabelac wrote:
> Dne 10. 09. 20 v 17:37 Zhao Heming napsal(a):
>> The code in vg_read():
>> ```
>> if (missing_pv_dev || missing_pv_flag)
>> vg_mark_partial_lvs(vg, 1);
>> ```
>> the missing_pv_dev not zero when pv->dev is null.
>> the missing_pv_flag not zero when pv->dev is not null but status MISSING_PV is true.
>> any above condition will trigger code to set PARTIAL_LV.
>> So in _lv_mark_if_partial_single(), there should add '|| (!pv->dev)' case.
>>
>> Below comment by David:
>> And the MISSING_PV flag was not used consistently, so there were cases
>> where pv->dev was null but the flag was not set. So to check for null dev
>> until it's more confidence in how that flag is used.
>
>
> Hi
>
> While the .gitignore patch is no problem, this one is somewhat puzzling.
>
> Do you have an reproducible test case where you can exercise this code path?
>
> It seems more logical if we move flag correctly marked for PV
> so is_missing_pv() works - as if it does not - we would have to spread test for pv->dev!=NULL check everywhere, which is not really wanted.
>
> So what we need to check here is all assings of pv->dev needs to handle
> MISSING_PV flag properly.
>
> Zdenek
>
I don't have test case.
There are some code or comments about not consistent issue.
e.g.
1> in _check_devs_used_correspond_with_vg()
/*
* FIXME: It's not clear if the meaning
* of "missing" should always include the
* !pv->dev case, or if "missing" is the
* more narrow case where VG metadata has
* been written with the MISSING flag.
*/
2> in vg_read()
```
* The PV's device may be present while the PV for the device has the
* MISSING_PV flag set in the metadata. This happened because the VG
* was written while this dev was missing, so the MISSING flag was
* written in the metadata for PV. Now the device has reappeared.
* However, the VG has changed since the device was last present, and
* if the device has outdated data it may not be safe to just start
* using it again.
```
3> in _check_pv_ext(), after calling is_missing_pv(), the function
still access (!pvl->pv->dev).
```
dm_list_iterate_items(pvl, &vg->pvs) {
if (is_missing_pv(pvl->pv))
continue;
/* is_missing_pv doesn't catch NULL dev */
if (!pvl->pv->dev)
continue;
```
More information about the linux-lvm
mailing list