Commit e77c78c0 authored by Jan Beulich's avatar Jan Beulich Committed by Konrad Rzeszutek Wilk

xen-blkfront: properly name all devices

- devices beyond xvdzz didn't get proper names assigned at all
- extended devices with minors not representable within the kernel's
  major/minor bit split spilled into foreign majors
Signed-off-by: default avatarJan Beulich <jbeulich@suse.com>
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent e816b57a
...@@ -526,6 +526,14 @@ static int xen_translate_vdev(int vdevice, int *minor, unsigned int *offset) ...@@ -526,6 +526,14 @@ static int xen_translate_vdev(int vdevice, int *minor, unsigned int *offset)
return 0; return 0;
} }
static char *encode_disk_name(char *ptr, unsigned int n)
{
if (n >= 26)
ptr = encode_disk_name(ptr, n / 26 - 1);
*ptr = 'a' + n % 26;
return ptr + 1;
}
static int xlvbd_alloc_gendisk(blkif_sector_t capacity, static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
struct blkfront_info *info, struct blkfront_info *info,
u16 vdisk_info, u16 sector_size) u16 vdisk_info, u16 sector_size)
...@@ -536,6 +544,7 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity, ...@@ -536,6 +544,7 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
unsigned int offset; unsigned int offset;
int minor; int minor;
int nr_parts; int nr_parts;
char *ptr;
BUG_ON(info->gd != NULL); BUG_ON(info->gd != NULL);
BUG_ON(info->rq != NULL); BUG_ON(info->rq != NULL);
...@@ -560,7 +569,11 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity, ...@@ -560,7 +569,11 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
"emulated IDE disks,\n\t choose an xvd device name" "emulated IDE disks,\n\t choose an xvd device name"
"from xvde on\n", info->vdevice); "from xvde on\n", info->vdevice);
} }
err = -ENODEV; if (minor >> MINORBITS) {
pr_warn("blkfront: %#x's minor (%#x) out of range; ignoring\n",
info->vdevice, minor);
return -ENODEV;
}
if ((minor % nr_parts) == 0) if ((minor % nr_parts) == 0)
nr_minors = nr_parts; nr_minors = nr_parts;
...@@ -574,23 +587,14 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity, ...@@ -574,23 +587,14 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
if (gd == NULL) if (gd == NULL)
goto release; goto release;
if (nr_minors > 1) { strcpy(gd->disk_name, DEV_NAME);
if (offset < 26) ptr = encode_disk_name(gd->disk_name + sizeof(DEV_NAME) - 1, offset);
sprintf(gd->disk_name, "%s%c", DEV_NAME, 'a' + offset); BUG_ON(ptr >= gd->disk_name + DISK_NAME_LEN);
else if (nr_minors > 1)
sprintf(gd->disk_name, "%s%c%c", DEV_NAME, *ptr = 0;
'a' + ((offset / 26)-1), 'a' + (offset % 26));
} else {
if (offset < 26)
sprintf(gd->disk_name, "%s%c%d", DEV_NAME,
'a' + offset,
minor & (nr_parts - 1));
else else
sprintf(gd->disk_name, "%s%c%c%d", DEV_NAME, snprintf(ptr, gd->disk_name + DISK_NAME_LEN - ptr,
'a' + ((offset / 26) - 1), "%d", minor & (nr_parts - 1));
'a' + (offset % 26),
minor & (nr_parts - 1));
}
gd->major = XENVBD_MAJOR; gd->major = XENVBD_MAJOR;
gd->first_minor = minor; gd->first_minor = minor;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment