|
@@ -374,6 +374,34 @@ static int init_vq(struct virtio_blk *vblk)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Legacy naming scheme used for virtio devices. We are stuck with it for
|
|
|
+ * virtio blk but don't ever use it for any new driver.
|
|
|
+ */
|
|
|
+static int virtblk_name_format(char *prefix, int index, char *buf, int buflen)
|
|
|
+{
|
|
|
+ const int base = 'z' - 'a' + 1;
|
|
|
+ char *begin = buf + strlen(prefix);
|
|
|
+ char *end = buf + buflen;
|
|
|
+ char *p;
|
|
|
+ int unit;
|
|
|
+
|
|
|
+ p = end - 1;
|
|
|
+ *p = '\0';
|
|
|
+ unit = base;
|
|
|
+ do {
|
|
|
+ if (p == begin)
|
|
|
+ return -EINVAL;
|
|
|
+ *--p = 'a' + (index % unit);
|
|
|
+ index = (index / unit) - 1;
|
|
|
+ } while (index >= 0);
|
|
|
+
|
|
|
+ memmove(begin, p, end - p);
|
|
|
+ memcpy(buf, prefix, strlen(prefix));
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int __devinit virtblk_probe(struct virtio_device *vdev)
|
|
|
{
|
|
|
struct virtio_blk *vblk;
|
|
@@ -442,18 +470,7 @@ static int __devinit virtblk_probe(struct virtio_device *vdev)
|
|
|
|
|
|
q->queuedata = vblk;
|
|
|
|
|
|
- if (index < 26) {
|
|
|
- sprintf(vblk->disk->disk_name, "vd%c", 'a' + index % 26);
|
|
|
- } else if (index < (26 + 1) * 26) {
|
|
|
- sprintf(vblk->disk->disk_name, "vd%c%c",
|
|
|
- 'a' + index / 26 - 1, 'a' + index % 26);
|
|
|
- } else {
|
|
|
- const unsigned int m1 = (index / 26 - 1) / 26 - 1;
|
|
|
- const unsigned int m2 = (index / 26 - 1) % 26;
|
|
|
- const unsigned int m3 = index % 26;
|
|
|
- sprintf(vblk->disk->disk_name, "vd%c%c%c",
|
|
|
- 'a' + m1, 'a' + m2, 'a' + m3);
|
|
|
- }
|
|
|
+ virtblk_name_format("vd", index, vblk->disk->disk_name, DISK_NAME_LEN);
|
|
|
|
|
|
vblk->disk->major = major;
|
|
|
vblk->disk->first_minor = index_to_minor(index);
|