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; ``` _______________________________________________ linux-lvm mailing list linux-lvm@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/linux-lvm read the LVM HOW-TO at http://tldp.org/HOWTO/LVM-HOWTO/