mirror of
git://sourceware.org/git/lvm2.git
synced 2025-02-10 17:57:54 +03:00
Recognise DRBD device part and handle it similar to MD devices.
The DRBD uses underlying device so code should prefer top device if duplicate is found. Patch also introduce dev_subsystem_part_major and dev_subsytem_name functions to easily handle all these replication susbystems and not hardcode md_major call. See https://bugzilla.redhat.com/show_bug.cgi?id=530881 for full problem description.
This commit is contained in:
parent
cf177380b5
commit
4059d2219c
@ -1,5 +1,6 @@
|
||||
Version 2.02.55 -
|
||||
===================================
|
||||
Recognise DRBD device part and handle it similar to MD devices.
|
||||
|
||||
Version 2.02.54 - 26th October 2009
|
||||
===================================
|
||||
|
14
lib/cache/lvmcache.c
vendored
14
lib/cache/lvmcache.c
vendored
@ -1173,11 +1173,12 @@ struct lvmcache_info *lvmcache_add(struct labeller *labeller, const char *pvid,
|
||||
} else {
|
||||
if (existing->dev != dev) {
|
||||
/* Is the existing entry a duplicate pvid e.g. md ? */
|
||||
if (MAJOR(existing->dev->dev) == md_major() &&
|
||||
MAJOR(dev->dev) != md_major()) {
|
||||
if (dev_subsystem_part_major(existing->dev) &&
|
||||
!dev_subsystem_part_major(dev)) {
|
||||
log_very_verbose("Ignoring duplicate PV %s on "
|
||||
"%s - using md %s",
|
||||
"%s - using %s %s",
|
||||
pvid, dev_name(dev),
|
||||
dev_subsystem_name(existing->dev),
|
||||
dev_name(existing->dev));
|
||||
return NULL;
|
||||
} else if (dm_is_dm_major(MAJOR(existing->dev->dev)) &&
|
||||
@ -1187,11 +1188,12 @@ struct lvmcache_info *lvmcache_add(struct labeller *labeller, const char *pvid,
|
||||
pvid, dev_name(dev),
|
||||
dev_name(existing->dev));
|
||||
return NULL;
|
||||
} else if (MAJOR(existing->dev->dev) != md_major() &&
|
||||
MAJOR(dev->dev) == md_major())
|
||||
} else if (!dev_subsystem_part_major(existing->dev) &&
|
||||
dev_subsystem_part_major(dev))
|
||||
log_very_verbose("Duplicate PV %s on %s - "
|
||||
"using md %s", pvid,
|
||||
"using %s %s", pvid,
|
||||
dev_name(existing->dev),
|
||||
dev_subsystem_name(existing->dev),
|
||||
dev_name(dev));
|
||||
else if (!dm_is_dm_major(MAJOR(existing->dev->dev)) &&
|
||||
dm_is_dm_major(MAJOR(dev->dev)))
|
||||
|
@ -39,6 +39,7 @@ typedef struct {
|
||||
|
||||
static int _md_major = -1;
|
||||
static int _blkext_major = -1;
|
||||
static int _drbd_major = -1;
|
||||
static int _device_mapper_major = -1;
|
||||
|
||||
int md_major(void)
|
||||
@ -51,6 +52,31 @@ int blkext_major(void)
|
||||
return _blkext_major;
|
||||
}
|
||||
|
||||
int dev_subsystem_part_major(const struct device *dev)
|
||||
{
|
||||
if (MAJOR(dev->dev) == -1)
|
||||
return 0;
|
||||
|
||||
if (MAJOR(dev->dev) == _md_major)
|
||||
return 1;
|
||||
|
||||
if (MAJOR(dev->dev) == _drbd_major)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *dev_subsystem_name(const struct device *dev)
|
||||
{
|
||||
if (MAJOR(dev->dev) == _md_major)
|
||||
return "MD";
|
||||
|
||||
if (MAJOR(dev->dev) == _drbd_major)
|
||||
return "DRBD";
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
/*
|
||||
* Devices are only checked for partition tables if their minor number
|
||||
* is a multiple of the number corresponding to their type below
|
||||
@ -207,6 +233,10 @@ static int _scan_proc_dev(const char *proc, const struct config_node *cn)
|
||||
if (!strncmp("blkext", line + i, 6) && isspace(*(line + i + 6)))
|
||||
_blkext_major = line_maj;
|
||||
|
||||
/* Look for drbd device */
|
||||
if (!strncmp("drbd", line + i, 4) && isspace(*(line + i + 4)))
|
||||
_drbd_major = line_maj;
|
||||
|
||||
/* Look for device-mapper device */
|
||||
/* FIXME Cope with multiple majors */
|
||||
if (!strncmp("device-mapper", line + i, 13) && isspace(*(line + i + 13)))
|
||||
|
@ -39,4 +39,7 @@ int md_major(void);
|
||||
int blkext_major(void);
|
||||
int max_partitions(int major);
|
||||
|
||||
int dev_subsystem_part_major(const struct device *dev);
|
||||
const char *dev_subsystem_name(const struct device *dev);
|
||||
|
||||
#endif
|
||||
|
@ -435,14 +435,15 @@ static void _add_pv_to_list(struct dm_list *head, struct disk_list *data)
|
||||
pvd = &diskl->pvd;
|
||||
if (!strncmp((char *)data->pvd.pv_uuid, (char *)pvd->pv_uuid,
|
||||
sizeof(pvd->pv_uuid))) {
|
||||
if (MAJOR(data->dev->dev) != md_major()) {
|
||||
if (!dev_subsystem_part_major(data->dev)) {
|
||||
log_very_verbose("Ignoring duplicate PV %s on "
|
||||
"%s", pvd->pv_uuid,
|
||||
dev_name(data->dev));
|
||||
return;
|
||||
}
|
||||
log_very_verbose("Duplicate PV %s - using md %s",
|
||||
pvd->pv_uuid, dev_name(data->dev));
|
||||
log_very_verbose("Duplicate PV %s - using %s %s",
|
||||
pvd->pv_uuid, dev_subsystem_name(data->dev),
|
||||
dev_name(data->dev));
|
||||
dm_list_del(&diskl->list);
|
||||
break;
|
||||
}
|
||||
|
@ -62,14 +62,15 @@ static void _add_pl_to_list(struct dm_list *head, struct pool_list *data)
|
||||
|
||||
id_write_format(&pl->pv_uuid, uuid, ID_LEN + 7);
|
||||
|
||||
if (MAJOR(data->dev->dev) != md_major()) {
|
||||
if (!dev_subsystem_part_major(data->dev)) {
|
||||
log_very_verbose("Ignoring duplicate PV %s on "
|
||||
"%s", uuid,
|
||||
dev_name(data->dev));
|
||||
return;
|
||||
}
|
||||
log_very_verbose("Duplicate PV %s - using md %s",
|
||||
uuid, dev_name(data->dev));
|
||||
log_very_verbose("Duplicate PV %s - using %s %s",
|
||||
uuid, dev_subsystem_name(data->dev),
|
||||
dev_name(data->dev));
|
||||
dm_list_del(&pl->list);
|
||||
break;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user