1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

scan: drop bcache and close fd for LV with stacked PV

When a PV is stacked on an LV, the LV will be kept in
bcache, and the open fd on the LV may interfere with
processing the LV.  So, drop/close a bcache fd for
an LV before processing the LV.
This commit is contained in:
David Teigland 2018-02-16 10:37:09 -06:00
parent c2b10daf69
commit 34fd818caf

View File

@ -3009,6 +3009,7 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
log_report_t saved_log_report_state = log_get_report_state(); log_report_t saved_log_report_state = log_get_report_state();
char lv_uuid[64] __attribute__((aligned(8))); char lv_uuid[64] __attribute__((aligned(8)));
char vg_uuid[64] __attribute__((aligned(8))); char vg_uuid[64] __attribute__((aligned(8)));
struct lvinfo lvinfo;
int ret_max = ECMD_PROCESSED; int ret_max = ECMD_PROCESSED;
int ret = 0; int ret = 0;
int whole_selected = 0; int whole_selected = 0;
@ -3025,6 +3026,8 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
struct lv_list *final_lvl; struct lv_list *final_lvl;
struct dm_list found_arg_lvnames; struct dm_list found_arg_lvnames;
struct glv_list *glvl, *tglvl; struct glv_list *glvl, *tglvl;
struct device *dev;
dev_t devt;
int do_report_ret_code = 1; int do_report_ret_code = 1;
log_set_report_object_type(LOG_REPORT_OBJECT_TYPE_LV); log_set_report_object_type(LOG_REPORT_OBJECT_TYPE_LV);
@ -3162,6 +3165,18 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
} }
log_set_report_object_name_and_id(NULL, NULL); log_set_report_object_name_and_id(NULL, NULL);
/*
* If a PV is stacked on an LV, then the LV is kept open
* in bcache, and needs to be closed so the open fd doesn't
* interfere with processing the LV.
*/
dm_list_iterate_items(lvl, &final_lvs) {
lv_info(cmd, lvl->lv, 0, &lvinfo, 0, 0);
devt = MKDEV(lvinfo.major, lvinfo.minor);
if ((dev = dev_cache_get_by_devt(devt, cmd->filter)))
label_scan_invalidate(dev);
}
dm_list_iterate_items(lvl, &final_lvs) { dm_list_iterate_items(lvl, &final_lvs) {
lv_uuid[0] = '\0'; lv_uuid[0] = '\0';
if (!id_write_format(&lvl->lv->lvid.id[1], lv_uuid, sizeof(lv_uuid))) if (!id_write_format(&lvl->lv->lvid.id[1], lv_uuid, sizeof(lv_uuid)))