Print this page
6581 cmd/format should be able label virtio BLKDEV drives
Reviewed by: Hans Rosenfeld <hans.rosenfeld@nexenta.com>
Reviewed by: Toomas Soome <tsoome@me.com>
@@ -22,10 +22,11 @@
* Copyright (c) 2011 Gary Mills
*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright 2015 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>
*/
/*
* This file contains functions to implement automatic configuration
* of scsi disks.
@@ -208,19 +209,15 @@
struct dk_cinfo *dkinfo);
static struct disk_type *new_direct_disk_type(int fd, char *disk_name,
struct dk_label *label);
-static struct disk_info *find_direct_disk_info(struct dk_cinfo *dkinfo);
static int efi_ioctl(int fd, int cmd, dk_efi_t *dk_ioc);
static int auto_label_init(struct dk_label *label);
-static struct ctlr_type *find_direct_ctlr_type(void);
-static struct ctlr_info *find_direct_ctlr_info(struct dk_cinfo *dkinfo);
-static struct disk_info *find_direct_disk_info(struct dk_cinfo *dkinfo);
-static struct ctlr_type *find_vbd_ctlr_type(void);
-static struct ctlr_info *find_vbd_ctlr_info(struct dk_cinfo *dkinfo);
-static struct disk_info *find_vbd_disk_info(struct dk_cinfo *dkinfo);
+static struct ctlr_type *find_ctlr_type(ushort_t);
+static struct ctlr_info *find_ctlr_info(struct dk_cinfo *, ushort_t);
+static struct disk_info *find_disk_info(struct dk_cinfo *, ushort_t);
static char *get_sun_disk_name(
char *disk_name,
struct scsi_inquiry *inquiry);
static char *strcopy(
@@ -262,16 +259,15 @@
if (option_msg && diag_msg) {
err_print("DKIOCINFO failed\n");
}
return (NULL);
}
- if ((cur_ctype != NULL) && (cur_ctype->ctype_ctype == DKC_DIRECT)) {
- ctlr = find_direct_ctlr_info(&dkinfo);
- disk_info = find_direct_disk_info(&dkinfo);
- } else if ((cur_ctype != NULL) && (cur_ctype->ctype_ctype == DKC_VBD)) {
- ctlr = find_vbd_ctlr_info(&dkinfo);
- disk_info = find_vbd_disk_info(&dkinfo);
+ if ((cur_ctype != NULL) && (cur_ctype->ctype_ctype == DKC_DIRECT ||
+ cur_ctype->ctype_ctype == DKC_VBD ||
+ cur_ctype->ctype_ctype == DKC_BLKDEV)) {
+ ctlr = find_ctlr_info(&dkinfo, cur_ctype->ctype_ctype);
+ disk_info = find_disk_info(&dkinfo, cur_ctype->ctype_ctype);
} else {
ctlr = find_scsi_ctlr_info(&dkinfo);
disk_info = find_scsi_disk_info(&dkinfo);
}
@@ -376,131 +372,77 @@
return (error);
}
static struct ctlr_type *
-find_direct_ctlr_type()
+find_ctlr_type(ushort_t type)
{
struct mctlr_list *mlp;
- mlp = controlp;
+ assert(type == DKC_DIRECT ||
+ type == DKC_VBD ||
+ type == DKC_BLKDEV);
- while (mlp != NULL) {
- if (mlp->ctlr_type->ctype_ctype == DKC_DIRECT) {
- return (mlp->ctlr_type);
- }
- mlp = mlp->next;
- }
-
- impossible("no DIRECT controller type");
-
- return ((struct ctlr_type *)NULL);
-}
-
-static struct ctlr_type *
-find_vbd_ctlr_type()
-{
- struct mctlr_list *mlp;
-
mlp = controlp;
while (mlp != NULL) {
- if (mlp->ctlr_type->ctype_ctype == DKC_VBD) {
+ if (mlp->ctlr_type->ctype_ctype == type) {
return (mlp->ctlr_type);
}
mlp = mlp->next;
}
- impossible("no VBD controller type");
+ impossible("no DIRECT/VBD/BLKDEV controller type");
return ((struct ctlr_type *)NULL);
}
static struct ctlr_info *
-find_direct_ctlr_info(
- struct dk_cinfo *dkinfo)
+find_ctlr_info(struct dk_cinfo *dkinfo, ushort_t type)
{
struct ctlr_info *ctlr;
- if (dkinfo->dki_ctype != DKC_DIRECT)
- return (NULL);
+ assert(type == DKC_DIRECT ||
+ type == DKC_VBD ||
+ type == DKC_BLKDEV);
for (ctlr = ctlr_list; ctlr != NULL; ctlr = ctlr->ctlr_next) {
if (ctlr->ctlr_addr == dkinfo->dki_addr &&
ctlr->ctlr_space == dkinfo->dki_space &&
- ctlr->ctlr_ctype->ctype_ctype == DKC_DIRECT) {
+ ctlr->ctlr_ctype->ctype_ctype == dkinfo->dki_ctype) {
return (ctlr);
}
}
- impossible("no DIRECT controller info");
+ impossible("no DIRECT/VBD/BLKDEV controller info");
/*NOTREACHED*/
+ return ((struct ctlr_info *)NULL);
}
-static struct ctlr_info *
-find_vbd_ctlr_info(
- struct dk_cinfo *dkinfo)
-{
- struct ctlr_info *ctlr;
-
- if (dkinfo->dki_ctype != DKC_VBD)
- return (NULL);
-
- for (ctlr = ctlr_list; ctlr != NULL; ctlr = ctlr->ctlr_next) {
- if (ctlr->ctlr_addr == dkinfo->dki_addr &&
- ctlr->ctlr_space == dkinfo->dki_space &&
- ctlr->ctlr_ctype->ctype_ctype == DKC_VBD) {
- return (ctlr);
- }
- }
-
- impossible("no VBD controller info");
- /*NOTREACHED*/
-}
-
static struct disk_info *
-find_direct_disk_info(
- struct dk_cinfo *dkinfo)
+find_disk_info(struct dk_cinfo *dkinfo, ushort_t type)
{
struct disk_info *disk;
struct dk_cinfo *dp;
- for (disk = disk_list; disk != NULL; disk = disk->disk_next) {
- assert(dkinfo->dki_ctype == DKC_DIRECT);
- dp = &disk->disk_dkinfo;
- if (dp->dki_ctype == dkinfo->dki_ctype &&
- dp->dki_cnum == dkinfo->dki_cnum &&
- dp->dki_unit == dkinfo->dki_unit &&
- strcmp(dp->dki_dname, dkinfo->dki_dname) == 0) {
- return (disk);
- }
- }
+ assert(type == DKC_DIRECT ||
+ type == DKC_VBD ||
+ type == DKC_BLKDEV);
- impossible("No DIRECT disk info instance\n");
- /*NOTREACHED*/
-}
-
-static struct disk_info *
-find_vbd_disk_info(
- struct dk_cinfo *dkinfo)
-{
- struct disk_info *disk;
- struct dk_cinfo *dp;
-
for (disk = disk_list; disk != NULL; disk = disk->disk_next) {
- assert(dkinfo->dki_ctype == DKC_VBD);
dp = &disk->disk_dkinfo;
if (dp->dki_ctype == dkinfo->dki_ctype &&
dp->dki_cnum == dkinfo->dki_cnum &&
dp->dki_unit == dkinfo->dki_unit &&
strcmp(dp->dki_dname, dkinfo->dki_dname) == 0) {
return (disk);
}
}
- impossible("No VBD disk info instance\n");
+ impossible("No DIRECT/VBD/BLKDEV disk info instance\n");
/*NOTREACHED*/
+ return ((struct disk_info *)NULL);
}
/*
* To convert EFI to SMI labels, we need to get label geometry.
* Unfortunately at this time there is no good way to do so.
@@ -689,21 +631,21 @@
}
/*
* Find the ctlr_info for this disk.
*/
- ctlr = find_direct_ctlr_info(&dkinfo);
+ ctlr = find_ctlr_info(&dkinfo, dkinfo.dki_ctype);
/*
* Allocate a new disk type for the direct controller.
*/
disk = (struct disk_type *)zalloc(sizeof (struct disk_type));
/*
* Find the disk_info instance for this disk.
*/
- disk_info = find_direct_disk_info(&dkinfo);
+ disk_info = find_disk_info(&dkinfo, dkinfo.dki_ctype);
/*
* The controller and the disk should match.
*/
assert(disk_info->disk_ctlr == ctlr);
@@ -2008,20 +1950,19 @@
/*
* Delete a disk type from disk type list.
*/
int
-delete_disk_type(
- struct disk_type *disk_type)
+delete_disk_type(struct disk_type *disk_type)
{
struct ctlr_type *ctlr;
struct disk_type *dp, *disk;
- if (cur_ctype->ctype_ctype == DKC_DIRECT)
- ctlr = find_direct_ctlr_type();
- else if (cur_ctype->ctype_ctype == DKC_VBD)
- ctlr = find_vbd_ctlr_type();
+ if (cur_ctype->ctype_ctype == DKC_DIRECT ||
+ cur_ctype->ctype_ctype == DKC_VBD ||
+ cur_ctype->ctype_ctype == DKC_BLKDEV)
+ ctlr = find_ctlr_type(cur_ctype->ctype_ctype);
else
ctlr = find_scsi_ctlr_type();
if (ctlr == NULL || ctlr->ctype_dlist == NULL) {
return (-1);
}