Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/bhyve/block_if.c
Show First 20 Lines • Show All 424 Lines • ▼ Show 20 Lines | |||||
static void | static void | ||||
blockif_init(void) | blockif_init(void) | ||||
{ | { | ||||
mevent_add(SIGCONT, EVF_SIGNAL, blockif_sigcont_handler, NULL); | mevent_add(SIGCONT, EVF_SIGNAL, blockif_sigcont_handler, NULL); | ||||
(void) signal(SIGCONT, SIG_IGN); | (void) signal(SIGCONT, SIG_IGN); | ||||
} | } | ||||
int | int | ||||
blockif_legacy_config(nvlist_t *nvl, const char *opts) | blockif_legacy_config(config_node_t *node, const char *opts) | ||||
{ | { | ||||
char *cp, *path; | char *cp, *path; | ||||
if (opts == NULL) | if (opts == NULL) | ||||
return (0); | return (0); | ||||
cp = strchr(opts, ','); | cp = strchr(opts, ','); | ||||
if (cp == NULL) { | if (cp == NULL) { | ||||
set_config_value_node(nvl, "path", opts); | set_config_value_node(node, "path", opts); | ||||
return (0); | return (0); | ||||
} | } | ||||
path = strndup(opts, cp - opts); | path = strndup(opts, cp - opts); | ||||
set_config_value_node(nvl, "path", path); | set_config_value_node(node, "path", path); | ||||
free(path); | free(path); | ||||
return (pci_parse_legacy_config(nvl, cp + 1)); | return (pci_parse_legacy_config(node, cp + 1)); | ||||
} | } | ||||
struct blockif_ctxt * | struct blockif_ctxt * | ||||
blockif_open(nvlist_t *nvl, const char *ident) | blockif_open(config_node_t *node, const char *ident) | ||||
{ | { | ||||
char tname[MAXCOMLEN + 1]; | char tname[MAXCOMLEN + 1]; | ||||
char name[MAXPATHLEN]; | char name[MAXPATHLEN]; | ||||
const char *path, *pssval, *ssval; | const char *path, *pssval, *ssval; | ||||
char *cp; | char *cp; | ||||
struct blockif_ctxt *bc; | struct blockif_ctxt *bc; | ||||
struct stat sbuf; | struct stat sbuf; | ||||
struct diocgattr_arg arg; | struct diocgattr_arg arg; | ||||
Show All 10 Lines | #endif | ||||
pthread_once(&blockif_once, blockif_init); | pthread_once(&blockif_once, blockif_init); | ||||
fd = -1; | fd = -1; | ||||
extra = 0; | extra = 0; | ||||
ssopt = 0; | ssopt = 0; | ||||
ro = 0; | ro = 0; | ||||
nodelete = 0; | nodelete = 0; | ||||
if (get_config_bool_node_default(nvl, "nocache", false)) | if (get_config_bool_node_default(node, "nocache", false)) | ||||
extra |= O_DIRECT; | extra |= O_DIRECT; | ||||
if (get_config_bool_node_default(nvl, "nodelete", false)) | if (get_config_bool_node_default(node, "nodelete", false)) | ||||
nodelete = 1; | nodelete = 1; | ||||
if (get_config_bool_node_default(nvl, "sync", false) || | if (get_config_bool_node_default(node, "sync", false) || | ||||
get_config_bool_node_default(nvl, "direct", false)) | get_config_bool_node_default(node, "direct", false)) | ||||
extra |= O_SYNC; | extra |= O_SYNC; | ||||
if (get_config_bool_node_default(nvl, "ro", false)) | if (get_config_bool_node_default(node, "ro", false)) | ||||
ro = 1; | ro = 1; | ||||
ssval = get_config_value_node(nvl, "sectorsize"); | ssval = get_config_value_node(node, "sectorsize"); | ||||
if (ssval != NULL) { | if (ssval != NULL) { | ||||
ssopt = strtol(ssval, &cp, 10); | ssopt = strtol(ssval, &cp, 10); | ||||
if (cp == ssval) { | if (cp == ssval) { | ||||
EPRINTLN("Invalid sector size \"%s\"", ssval); | EPRINTLN("Invalid sector size \"%s\"", ssval); | ||||
goto err; | goto err; | ||||
} | } | ||||
if (*cp == '\0') { | if (*cp == '\0') { | ||||
pssopt = ssopt; | pssopt = ssopt; | ||||
} else if (*cp == '/') { | } else if (*cp == '/') { | ||||
pssval = cp + 1; | pssval = cp + 1; | ||||
pssopt = strtol(pssval, &cp, 10); | pssopt = strtol(pssval, &cp, 10); | ||||
if (cp == pssval || *cp != '\0') { | if (cp == pssval || *cp != '\0') { | ||||
EPRINTLN("Invalid sector size \"%s\"", ssval); | EPRINTLN("Invalid sector size \"%s\"", ssval); | ||||
goto err; | goto err; | ||||
} | } | ||||
} else { | } else { | ||||
EPRINTLN("Invalid sector size \"%s\"", ssval); | EPRINTLN("Invalid sector size \"%s\"", ssval); | ||||
goto err; | goto err; | ||||
} | } | ||||
} | } | ||||
path = get_config_value_node(nvl, "path"); | path = get_config_value_node(node, "path"); | ||||
if (path == NULL) { | if (path == NULL) { | ||||
EPRINTLN("Missing \"path\" for block device."); | EPRINTLN("Missing \"path\" for block device."); | ||||
goto err; | goto err; | ||||
} | } | ||||
fd = open(path, (ro ? O_RDONLY : O_RDWR) | extra); | fd = open(path, (ro ? O_RDONLY : O_RDWR) | extra); | ||||
if (fd < 0 && !ro) { | if (fd < 0 && !ro) { | ||||
/* Attempt a r/w fail with a r/o open */ | /* Attempt a r/w fail with a r/o open */ | ||||
▲ Show 20 Lines • Show All 494 Lines • Show Last 20 Lines |