mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
Fix pvcreate on a partition (regressed in 2.02.51).
Eliminate busy loop during pvcreate of a "normal" partition. _md_sysfs_attribute_snprintf() would busy loop if the device it was given was not a blkext-based MD partition. Rather than being cute with a busy-loop prone 'goto check_md_major' in _md_sysfs_attribute_snprintf(): explicitly check if the provided device is a blkext-based partition (blkext_major()); and then check that the get_primary_dev() determined parent is an MD device (md_major()).
This commit is contained in:
parent
c7a3cc0a9b
commit
3d37e976bf
@ -1,5 +1,6 @@
|
|||||||
Version 2.02.52 -
|
Version 2.02.52 -
|
||||||
=================================
|
=================================
|
||||||
|
Fix pvcreate on a partition (2.02.51).
|
||||||
Fix vgcfgrestore error paths when locking fails (2.02.49).
|
Fix vgcfgrestore error paths when locking fails (2.02.49).
|
||||||
Added configure --enable-clogd to conditionally build the cluster log daemon.
|
Added configure --enable-clogd to conditionally build the cluster log daemon.
|
||||||
Make lvchange --refresh only take a read lock on volume group.
|
Make lvchange --refresh only take a read lock on volume group.
|
||||||
|
@ -137,13 +137,15 @@ static int _md_sysfs_attribute_snprintf(char *path, size_t size,
|
|||||||
if (!sysfs_dir || !*sysfs_dir)
|
if (!sysfs_dir || !*sysfs_dir)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
check_md_major:
|
if (MAJOR(dev) == blkext_major()) {
|
||||||
if (MAJOR(dev) != md_major()) {
|
/* lookup parent MD device from blkext partition */
|
||||||
if (get_primary_dev(sysfs_dir, blkdev, &dev))
|
if (!get_primary_dev(sysfs_dir, blkdev, &dev))
|
||||||
goto check_md_major;
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MAJOR(dev) != md_major())
|
||||||
|
return ret;
|
||||||
|
|
||||||
ret = dm_snprintf(path, size, "%s/dev/block/%d:%d/md/%s", sysfs_dir,
|
ret = dm_snprintf(path, size, "%s/dev/block/%d:%d/md/%s", sysfs_dir,
|
||||||
(int)MAJOR(dev), (int)MINOR(dev), attribute);
|
(int)MAJOR(dev), (int)MINOR(dev), attribute);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -38,6 +38,7 @@ typedef struct {
|
|||||||
} device_info_t;
|
} device_info_t;
|
||||||
|
|
||||||
static int _md_major = -1;
|
static int _md_major = -1;
|
||||||
|
static int _blkext_major = -1;
|
||||||
static int _device_mapper_major = -1;
|
static int _device_mapper_major = -1;
|
||||||
|
|
||||||
int md_major(void)
|
int md_major(void)
|
||||||
@ -45,6 +46,11 @@ int md_major(void)
|
|||||||
return _md_major;
|
return _md_major;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int blkext_major(void)
|
||||||
|
{
|
||||||
|
return _blkext_major;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Devices are only checked for partition tables if their minor number
|
* Devices are only checked for partition tables if their minor number
|
||||||
* is a multiple of the number corresponding to their type below
|
* is a multiple of the number corresponding to their type below
|
||||||
@ -197,6 +203,10 @@ static int _scan_proc_dev(const char *proc, const struct config_node *cn)
|
|||||||
if (!strncmp("md", line + i, 2) && isspace(*(line + i + 2)))
|
if (!strncmp("md", line + i, 2) && isspace(*(line + i + 2)))
|
||||||
_md_major = line_maj;
|
_md_major = line_maj;
|
||||||
|
|
||||||
|
/* Look for blkext device */
|
||||||
|
if (!strncmp("blkext", line + i, 6) && isspace(*(line + i + 6)))
|
||||||
|
_blkext_major = line_maj;
|
||||||
|
|
||||||
/* Look for device-mapper device */
|
/* Look for device-mapper device */
|
||||||
/* FIXME Cope with multiple majors */
|
/* FIXME Cope with multiple majors */
|
||||||
if (!strncmp("device-mapper", line + i, 13) && isspace(*(line + i + 13)))
|
if (!strncmp("device-mapper", line + i, 13) && isspace(*(line + i + 13)))
|
||||||
|
@ -36,6 +36,7 @@ struct dev_filter *lvm_type_filter_create(const char *proc,
|
|||||||
void lvm_type_filter_destroy(struct dev_filter *f);
|
void lvm_type_filter_destroy(struct dev_filter *f);
|
||||||
|
|
||||||
int md_major(void);
|
int md_major(void);
|
||||||
|
int blkext_major(void);
|
||||||
int max_partitions(int major);
|
int max_partitions(int major);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user